@kaeawc/auto-mobile 0.0.91 → 0.0.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build-info.json +12 -12
- package/dist/schemas/README.md +16 -0
- package/dist/schemas/prototype-icon-names.json +302 -0
- package/dist/schemas/test-plan.schema.json +370 -52
- package/dist/src/chunk-00167wan.js +55 -0
- package/dist/src/chunk-0jrrsnc9.js +6 -0
- package/dist/src/chunk-0n6swkwg.js +5 -0
- package/dist/src/chunk-0qsy1qsx.js +57 -0
- package/dist/src/chunk-11m8wj8j.js +237 -0
- package/dist/src/chunk-1p7xf5kb.js +5 -0
- package/dist/src/chunk-23p5f095.js +4 -0
- package/dist/src/chunk-26k317v5.js +5 -0
- package/dist/src/chunk-284ptqa4.js +7 -0
- package/dist/src/chunk-28re4xrg.js +4 -0
- package/dist/src/chunk-2f9rkmhx.js +5 -0
- package/dist/src/chunk-2fxdh48t.js +4 -0
- package/dist/src/chunk-2tbdrbt6.js +4 -0
- package/dist/src/chunk-2tqzq5qh.js +971 -0
- package/dist/src/chunk-32gvv9b4.js +21 -0
- package/dist/src/chunk-3f3t1x97.js +8 -0
- package/dist/src/chunk-3fspkbc7.js +4 -0
- package/dist/src/chunk-3qwrzxh0.js +11 -0
- package/dist/src/chunk-3sy6ahhz.js +26 -0
- package/dist/src/chunk-3vg455e6.js +4 -0
- package/dist/src/chunk-3xkpk44w.js +5 -0
- package/dist/src/chunk-3y6eykz9.js +4 -0
- package/dist/src/chunk-49bsqdx3.js +4 -0
- package/dist/src/chunk-4hw3665t.js +42 -0
- package/dist/src/chunk-58wzr3mt.js +5 -0
- package/dist/src/chunk-5d2hft6c.js +5 -0
- package/dist/src/chunk-5s645vr4.js +4 -0
- package/dist/src/chunk-5snsn9cf.js +4 -0
- package/dist/src/chunk-5tm9mn47.js +54 -0
- package/dist/src/chunk-5zc77a5t.js +4 -0
- package/dist/src/chunk-64j0majr.js +19 -0
- package/dist/src/chunk-65y8v4td.js +17 -0
- package/dist/src/chunk-6awz7vhq.js +5 -0
- package/dist/src/chunk-6bznss4t.js +8 -0
- package/dist/src/chunk-6ep7f5ge.js +4 -0
- package/dist/src/chunk-6pg7bqck.js +4 -0
- package/dist/src/chunk-6wt9rgjf.js +5 -0
- package/dist/src/chunk-6xmss8er.js +8 -0
- package/dist/src/chunk-710rxz9y.js +5 -0
- package/dist/src/chunk-7cs2da62.js +5 -0
- package/dist/src/chunk-7g103b54.js +4 -0
- package/dist/src/chunk-7j5vj4pa.js +4 -0
- package/dist/src/chunk-7rz9898k.js +5 -0
- package/dist/src/chunk-7tw8x05v.js +4 -0
- package/dist/src/chunk-7zy586cb.js +4 -0
- package/dist/src/chunk-8037tzzj.js +5 -0
- package/dist/src/chunk-84nanf8s.js +5 -0
- package/dist/src/chunk-8g1922rp.js +10 -0
- package/dist/src/chunk-8gvwcv2p.js +4 -0
- package/dist/src/chunk-8ph29g99.js +4 -0
- package/dist/src/chunk-8thrmfat.js +4 -0
- package/dist/src/chunk-8zgzzs7k.js +78 -0
- package/dist/src/chunk-97b1zmaq.js +4 -0
- package/dist/src/chunk-9fth9ayh.js +4 -0
- package/dist/src/chunk-9j6anhjr.js +4 -0
- package/dist/src/chunk-aabchzxk.js +9 -0
- package/dist/src/chunk-ayp07wbb.js +4 -0
- package/dist/src/chunk-bfjwqk8q.js +4 -0
- package/dist/src/chunk-bfw6125s.js +5 -0
- package/dist/src/chunk-bnhscm2n.js +4 -0
- package/dist/src/chunk-bxmsax22.js +5 -0
- package/dist/src/chunk-c1vs4g1n.js +4 -0
- package/dist/src/chunk-ct3e7yng.js +4 -0
- package/dist/src/chunk-cyy71ggq.js +5 -0
- package/dist/src/chunk-ddzkz92z.js +4 -0
- package/dist/src/chunk-dgrbdpb7.js +9 -0
- package/dist/src/chunk-drdz8hee.js +5 -0
- package/dist/src/chunk-e98dqnc9.js +145 -0
- package/dist/src/chunk-eersndy7.js +5 -0
- package/dist/src/chunk-eggq53ks.js +4 -0
- package/dist/src/chunk-f2dya7cs.js +4 -0
- package/dist/src/chunk-fbakd6cw.js +4 -0
- package/dist/src/chunk-fgb98zjj.js +5 -0
- package/dist/src/chunk-fmpad823.js +5 -0
- package/dist/src/chunk-g04bwyj3.js +4 -0
- package/dist/src/chunk-g0xr8zw0.js +4 -0
- package/dist/src/chunk-g3rjs80x.js +4 -0
- package/dist/src/chunk-g78rtrfv.js +4 -0
- package/dist/src/chunk-g7tmjbkt.js +5 -0
- package/dist/src/chunk-gabgv3y5.js +4 -0
- package/dist/src/chunk-gmr45m8f.js +4 -0
- package/dist/src/chunk-gsyfebqj.js +4 -0
- package/dist/src/chunk-h5rpn9wr.js +247 -0
- package/dist/src/chunk-hb1x7v55.js +4 -0
- package/dist/src/chunk-hrfytkxh.js +168 -0
- package/dist/src/chunk-j4yjzbak.js +4 -0
- package/dist/src/chunk-jd6a5v6p.js +5 -0
- package/dist/src/chunk-jh6vhqzx.js +5 -0
- package/dist/src/chunk-kn5spq15.js +4 -0
- package/dist/src/chunk-m94qs0f0.js +4 -0
- package/dist/src/chunk-mjrps0ac.js +7 -0
- package/dist/src/chunk-n03dmn5q.js +5 -0
- package/dist/src/chunk-n72qhwd9.js +4 -0
- package/dist/src/chunk-ndt1ccxm.js +71 -0
- package/dist/src/chunk-nr6y0n4y.js +5 -0
- package/dist/src/chunk-pcsen2vs.js +4 -0
- package/dist/src/chunk-ppfr0b8h.js +4 -0
- package/dist/src/chunk-q10bdnat.js +4 -0
- package/dist/src/chunk-q9xmq595.js +4 -0
- package/dist/src/chunk-qcxzr2my.js +5 -0
- package/dist/src/chunk-qf6nynk6.js +7 -0
- package/dist/src/chunk-qyqypn28.js +5 -0
- package/dist/src/chunk-r2epb56s.js +4 -0
- package/dist/src/chunk-r5bxavdx.js +311 -0
- package/dist/src/chunk-r6z1eztj.js +18 -0
- package/dist/src/chunk-r7bpkgff.js +4 -0
- package/dist/src/chunk-r8jf3d92.js +4 -0
- package/dist/src/chunk-rbpdk7m0.js +5 -0
- package/dist/src/chunk-rc0dbypm.js +4 -0
- package/dist/src/chunk-rhcty4ms.js +4 -0
- package/dist/src/chunk-rpvckv3p.js +4 -0
- package/dist/src/chunk-rqc9ap3x.js +4 -0
- package/dist/src/chunk-rvvy1bte.js +7 -0
- package/dist/src/chunk-ry0mz41y.js +4 -0
- package/dist/src/chunk-s3jc6cwp.js +5 -0
- package/dist/src/chunk-sfv61xjb.js +6 -0
- package/dist/src/chunk-t6bfvfkg.js +4 -0
- package/dist/src/chunk-t6c8akcm.js +5 -0
- package/dist/src/chunk-t7w8rctc.js +4 -0
- package/dist/src/chunk-thbh3jew.js +5 -0
- package/dist/src/chunk-v2wd4n3e.js +5 -0
- package/dist/src/chunk-v6pya0dm.js +5 -0
- package/dist/src/chunk-vy3bwm1d.js +17 -0
- package/dist/src/chunk-w3vs79ex.js +27 -0
- package/dist/src/chunk-w4zga19f.js +4 -0
- package/dist/src/chunk-w5b2jwk3.js +14 -0
- package/dist/src/chunk-w7hkv422.js +5 -0
- package/dist/src/chunk-waqwcjyn.js +4 -0
- package/dist/src/chunk-wbh8spm5.js +20 -0
- package/dist/src/chunk-wyrkw6hw.js +5 -0
- package/dist/src/chunk-xa73x2cx.js +5 -0
- package/dist/src/chunk-xgan0qqp.js +4 -0
- package/dist/src/chunk-y2vs6jwg.js +4 -0
- package/dist/src/chunk-yattm52s.js +4 -0
- package/dist/src/chunk-yb97j25b.js +6 -0
- package/dist/src/chunk-ybbtagbt.js +5 -0
- package/dist/src/chunk-ycaj2sgf.js +9 -0
- package/dist/src/chunk-yf7ympyz.js +325 -0
- package/dist/src/chunk-yjawdzk8.js +4 -0
- package/dist/src/chunk-z637nqg8.js +11 -0
- package/dist/src/chunk-zgja5f3p.js +6 -0
- package/dist/src/chunk-zs1sghs9.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/ios/CameraPosterInjection/Injection/CameraPosterInjection.m +466 -0
- package/package.json +7 -6
- package/schemas/README.md +16 -0
- package/schemas/prototype-icon-names.json +302 -0
- package/schemas/test-plan.schema.json +370 -52
- 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,4 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{UF,su,xa,HF,nl,PV,AV,_ae}from"./chunk-thbh3jew.js";import"./chunk-3xkpk44w.js";import"./chunk-0qsy1qsx.js";import"./chunk-r5bxavdx.js";import"./chunk-yf7ympyz.js";import"./chunk-4hw3665t.js";import"./chunk-5d2hft6c.js";import"./chunk-z637nqg8.js";import"./chunk-58wzr3mt.js";export{_ae as ClearText,UF as DEVICE_TIMESTAMP_SECOND_GRANULARITY_MARGIN_MS,PV as clearTextWithKeyEvents,nl as getFocusedTextField,HF as getFocusedTextFieldIdentity,su as getFocusedTextLength,xa as hasFocusedTextInput,AV as verifyKeyEventClear};
|
|
3
|
+
|
|
4
|
+
//# debugId=6A0D23FD2CC7857E64756E2164756E21
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{B}from"./chunk-yf7ympyz.js";import{Fr,i,l,at,e}from"./chunk-z637nqg8.js";import{QQ,eee,WS,zc,wh,V0,ree,zS,W0,nee}from"./chunk-0n6swkwg.js";import{pn,$b}from"./chunk-5d2hft6c.js";import{dre,rd,rB,ure,Lt,br,oB,lg,UT,zT,$w,ri,ll,ul,Eo,H3,nn,bt,$v,ps,$re,gg,ut,Sl}from"./chunk-r5bxavdx.js";import{uV,iv,iu,Tr,ep,gt,ct,see,vF,cT,ge,hV,SF,cw,wm,Mh,Nh,l5,gV,cee,dee,lee,wF,uee,mee,u5,p5,sC,RF,f5,h5,g5,y5,yee,vee,bee,Fh,PF,wee,v5,Ree}from"./chunk-e98dqnc9.js";import{y,T,ee,j,g,Ct,ne,A,aP}from"./chunk-4hw3665t.js";import{FA,VS,B0,vh}from"./chunk-2f9rkmhx.js";import{r,t}from"./chunk-rbpdk7m0.js";var Q=new Map;function Xq(n,o){if(o===void 0)Q.delete(n);else Q.set(n,o)}function ke(n){return Q.get(n)}function EQ(){Q.clear()}var z4=50;function ae(n){return{...n,...n.processExit?{processExit:{...n.processExit}}:{},...n.session?{session:{...n.session}}:{},recovery:{...n.recovery,policy:{...n.recovery.policy},attempts:n.recovery.attempts.map((o)=>({...o}))}}}class j4{timer;idGenerator;maxRetained;incidents=new Map;constructor(n=i,o=B,s=z4){this.timer=n;this.idGenerator=o;this.maxRetained=s}async open(n){let o=this.timer.now(),s={id:`emulator-loss-${this.idGenerator.next()}`,observedAtMs:o,updatedAtMs:o,deviceId:n.deviceId,...n.avdName?{avdName:n.avdName}:{},detectionPath:n.detectionPath,...n.processExit?{processExit:{...n.processExit}}:{},...n.outputTail?{outputTail:n.outputTail}:{},...n.outputUnavailable==="adopted"?{outputUnavailable:n.outputUnavailable}:{},...n.lastAdbState?{lastAdbState:n.lastAdbState}:{},...n.session?{session:{...n.session}}:{},recovery:{policy:{...n.recoveryPolicy},attempts:[]}};return this.incidents.set(s.id,s),this.prune(),ae(s)}async recordRecoveryAttempt(n,o){let s=this.incidents.get(n);if(!s)return;s.recovery.attempts.push({...o}),s.updatedAtMs=this.timer.now()}async completeRecovery(n,o,s={}){let a=this.incidents.get(n);if(!a)return;if(a.recovery.outcome=o,s.replacementDeviceId)a.replacementDeviceId=s.replacementDeviceId;if(a.session&&s.sessionState)a.session.state=s.sessionState;a.updatedAtMs=this.timer.now()}async get(n){let o=this.incidents.get(n);return o?ae(o):void 0}async list(n=this.maxRetained){let o=Array.from(this.incidents.values());return(n<=0?[]:o.slice(-n)).reverse().map(ae)}prune(){while(this.incidents.size>this.maxRetained){let n=this.incidents.keys().next().value;if(n===void 0)return;this.incidents.delete(n)}}}var et=1000;function Te(n){if(!gg(n))return;let o=n.slice($re.length),s=";incident=",a=o.indexOf(s),c=a===-1?o:o.slice(0,a),d=a===-1?void 0:o.slice(a+s.length)||void 0;return c?new nn(c,n,d):void 0}function l_(n){if(!n)return;let o=ps(n);if(o)throw o}function IQ(n,o){return n===void 0?void 0:Math.max(0,n-Math.max(0,o)-et)}function K4(n,o){if(!bt(n))return;return{code:H3,deviceId:n.deviceId,...o?{sessionUuid:o}:{},...n.incidentId?{incidentId:n.incidentId}:{},reason:"confirmed-unavailable"}}function _Q(n,o){if(!o)return n;let s=o.session?.state;return{...n,detectionPath:o.detectionPath,...o.avdName?{avdName:o.avdName}:{},...o.replacementDeviceId?{replacementDeviceId:o.replacementDeviceId}:{},...s?{sessionState:s}:{},...o.session?{heartbeat:{lastHeartbeatMs:o.session.lastHeartbeatMs,hasReceivedHeartbeat:o.session.hasReceivedHeartbeat,timeoutMs:o.session.heartbeatTimeoutMs}}:{},recovery:{status:o.recovery.outcome??"pending",attempts:o.recovery.attempts.length},retry:{sameSession:s==="active"||s==="awaiting-device",requiresNewSession:s==="released"}}}function xQ(n,o){if(!o||o.assignedDevice===n.deviceId||n.sessionState==="released")return n;return{...n,sessionState:n.sessionState===void 0||n.sessionState==="recovering"?"active":n.sessionState,retry:{sameSession:!0,requiresNewSession:!1},replacementDeviceId:n.replacementDeviceId??o.assignedDevice,recovery:n.recovery??{status:"recovered",attempts:0}}}function G4(n,o,s){let a=()=>n.markRequestCancelled(o);if(s.aborted)a();else s.addEventListener("abort",a,{once:!0});return()=>s.removeEventListener("abort",a)}class OA extends t{failure;constructor(n){super(V0(n));this.failure=n;this.name="DaemonBoundSessionLostError"}}import{createHash as tt}from"crypto";import{readFileSync as nt}from"fs";import{resolve as ot}from"path";var W="unknown";function st(n){let o=nt(n);return tt("sha256").update(o).digest("hex").slice(0,16)}function rt(n,o=st){if(!n)return{entryScript:"",buildId:W};let s=ot(n);try{return{entryScript:s,buildId:o(s)}}catch(a){return e.warn(`Failed to compute build identity: ${r(a)}`,a),{entryScript:s,buildId:W}}}var ce=null;function Ho(){if(!ce)ce=rt(process.argv[1]);return ce}function we(n){return n.length>0&&n!==W}function Qd(n,o){if(we(n.buildId)&&we(o.buildId))return n.buildId===o.buildId;if(n.entryScript.length>0&&o.entryScript.length>0)return n.entryScript===o.entryScript;return!0}function eo(n){return`${n.buildId} (${n.entryScript||"unknown"})`}function Ds(n){return{entryScript:n.entryScript??"",buildId:n.buildId??W}}function Zq(){return{get version(){return ri},build:Ho()}}var dt=g({code:ne("daemon_identity_mismatch"),phase:ne("daemon-preflight"),executionStarted:ne(!1),reason:A(["version","build"]),daemon:g({version:y(),build:g({buildId:y(),entryScript:y()})}),client:g({clientVersion:y().optional(),clientBuildId:y().optional(),clientEntryScript:y().optional()})});function Ae(n){return dt.safeParse(n).success}function de(n){if(typeof n!=="string")return;let o=n.trim();return o.length>0?o:void 0}function Y4(n){return{clientVersion:de(n.clientVersion),clientBuildId:de(n.clientBuildId),clientEntryScript:de(n.clientEntryScript)}}function lt(n){return(n.clientVersion?.length??0)>0||(n.clientBuildId?.length??0)>0}function CQ(n,o){if(!lt(o))return{ok:!0};let s={entryScript:o.clientEntryScript??"",buildId:o.clientBuildId??"unknown"};if(!Qd(n.build,s))return{ok:!1,reason:"build",message:`AutoMobile daemon build mismatch: the shared daemon socket is served by a different build than this client. daemon build=${eo(n.build)}, client build=${eo(s)}. Restart the daemon from this client's checkout to resolve the skew.`};let a=o.clientVersion;if(a){let c=n.version.trim();if(pn(a)!==a?c.length>0&&$b(c)!==$b(a):(()=>{let m=pn(a),p=pn(c);return m.length>0&&p.length>0&&m!==p})())return{ok:!1,reason:"version",message:`AutoMobile daemon version mismatch: the shared daemon socket is served by daemon=${n.version||"unknown"} but this client is ${a}. Restart the daemon from this client's build (e.g. \`auto-mobile --daemon restart\`) so the per-uid socket serves a matching version.`}}return{ok:!0}}class u_ extends t{failure;constructor(n,o){super(`Daemon preflight failed; no device operation started. ${o}`);this.failure=n;this.name="DaemonHandshakeMismatchError"}}function x0(n=!1){return{code:UT,retryable:!0,...n?{requestMayHaveDispatched:!0}:{}}}function C0(n){return{code:n.code,retryable:!0,daemonShuttingDown:n}}function p_(n=!1){return{error:{code:UT,message:lg,retryable:!0,...n?{requestMayHaveDispatched:!0}:{}}}}function le(n){return typeof n==="object"&&n!==null}function ue(n){return le(n)&&n.code===UT&&n.retryable===!0}function mt(n){return le(n)&&ue(n.error)}function J4(n){return le(n)&&mt(n.structuredContent)}function DQ(n){return x0(J4(n)&&Sl(n)?.error.requestMayHaveDispatched===!0)}class he extends Error{constructor(n,o){super(n,o);this.name="DaemonUnavailableError"}}function Y(n){if(n instanceof he)return n;return new he(`Daemon socket connection lost: ${n.message}`,{cause:n})}class el extends he{requestMayHaveDispatched;constructor(n=!1){super(lg);this.requestMayHaveDispatched=n;this.name="DaemonShuttingDownError"}}var Ce="device_control_transport_failure";class uh extends Error{failure;constructor(n,o){super(n);this.failure=o;this.name="DeviceControlTransportError"}}function pt(n){return n.code===Ce&&n.transport==="daemon_loopback_http"&&typeof n.toolName==="string"&&n.toolName.length>0}function ft(n){let o={};if(n.deviceId!==void 0){if(typeof n.deviceId!=="string")return;o.deviceId=n.deviceId}if(n.deviceSessionUuid!==void 0){if(typeof n.deviceSessionUuid!=="string")return;o.deviceSessionUuid=n.deviceSessionUuid}if(n.sessionUuid!==void 0){if(typeof n.sessionUuid!=="string")return;o.sessionUuid=n.sessionUuid}if(n.routingSessionUuid!==void 0){if(typeof n.routingSessionUuid!=="string")return;o.routingSessionUuid=n.routingSessionUuid}return o}function ht(n){return typeof n.sessionValid==="boolean"&&typeof n.deviceSessionValid==="boolean"&&(n.phase==="connect"||n.phase==="response")&&typeof n.retryable==="boolean"&&typeof n.reconnectAttempted==="boolean"&&typeof n.replayAttempted==="boolean"}function Qq(n){if(!n||typeof n!=="object"||Array.isArray(n))return;let o=n,s=ft(o);if(!pt(o)||!s||!ht(o))return;return{code:Ce,transport:"daemon_loopback_http",toolName:o.toolName,...s,sessionValid:o.sessionValid,deviceSessionValid:o.deviceSessionValid,phase:o.phase,retryable:o.retryable,reconnectAttempted:o.reconnectAttempted,replayAttempted:o.replayAttempted}}function OQ(n){return typeof n==="string"&&ke(n)==="replay"}var X="daemon_overloaded";class Xs extends Error{failure;constructor(n,o){super(n);this.failure=o;this.name="McpOverloadError"}}var Xu="daemon_queue_timeout";function eV(n){return n instanceof Error&&"code"in n&&n.code===Xu}class Cr extends Error{toolName;timeoutMs;origin;code;constructor(n){let o=n.detail?` (${n.detail})`:"";super(`MCP timeout: ${n.toolName} exceeded ${n.timeoutMs}ms at ${n.origin}${o}`);if(this.name="McpTimeoutError",this.toolName=n.toolName,this.timeoutMs=n.timeoutMs,this.origin=n.origin,n.code!==void 0)this.code=n.code}}function vt(n){return typeof n==="number"&&Number.isFinite(n)&&n>=0}function Ie(n){if(!n||typeof n!=="object"||Array.isArray(n))return;let o=n;if(o.code!==X||o.retryable!==!0||o.reason!=="insufficient_forward_budget"||![o.retryAfterMs,o.queueWaitMs,o.remainingTimeoutMs].every(vt))return;return{code:X,retryable:!0,retryAfterMs:o.retryAfterMs,reason:"insufficient_forward_budget",queueWaitMs:o.queueWaitMs,remainingTimeoutMs:o.remainingTimeoutMs}}async function Et(n,o,s){let a=new f5({classification:s.classification,...s.responseMode!==void 0&&{responseMode:s.responseMode},...s.keepAliveMs!==void 0&&{keepAliveMs:s.keepAliveMs}});return await n.connect(a),a.handleMessage(o,{...s.request!==void 0&&{request:s.request},...s.authInfo!==void 0&&{authInfo:s.authInfo}})}var fe=4194304,me=100;function Oe(n){return`Payload Too Large: Request body must not exceed ${n} bytes`}function Pe(n){if(n===void 0)return fe;if(typeof n!=="number"||!Number.isFinite(n)||n<=0)throw RangeError(`maxRequestBodySize must be a positive number of bytes, got ${String(n)}`);return n}async function qe(n,o=fe){if(Number(n.headers.get("content-length"))>o)return{tooLarge:!0};if(n.body===null)return{tooLarge:!1,text:""};let s=n.body.getReader(),a=new TextDecoder,c=0,d="";try{for(;;){let{done:u,value:m}=await s.read();if(u)break;if(c+=m.byteLength,c>o)return{tooLarge:!0};d+=a.decode(m,{stream:!0})}}finally{s.releaseLock()}return{tooLarge:!1,text:d+a.decode()}}var X4=class{sessionIdGenerator;_started=!1;_hasHandledRequest=!1;_closed=!1;_streamMapping=new Map;_requestToStreamMapping=new Map;_requestResponseMap=new Map;_initialized=!1;_enableJsonResponse=!1;_standaloneSseStreamId="_GET_stream";_eventStore;_onsessioninitialized;_onsessionclosed;_allowedHosts;_allowedOrigins;_enableDnsRebindingProtection;_retryInterval;_supportedProtocolVersions;_keepAliveMs;_maxRequestBodySize;_scopeChallengeResolver;sessionId;onclose;onerror;onmessage;constructor(n={}){this.sessionIdGenerator=n.sessionIdGenerator,this._enableJsonResponse=n.enableJsonResponse??!1,this._eventStore=n.eventStore,this._onsessioninitialized=n.onsessioninitialized,this._onsessionclosed=n.onsessionclosed,this._allowedHosts=n.allowedHosts,this._allowedOrigins=n.allowedOrigins,this._enableDnsRebindingProtection=n.enableDnsRebindingProtection??!1,this._retryInterval=n.retryInterval,this._supportedProtocolVersions=n.supportedProtocolVersions??iv,this._keepAliveMs=n.keepAliveMs??sC,this._maxRequestBodySize=Pe(n.maxRequestBodySize)}startKeepAlive(n,o){if(this._closed)return;let s=RF(this._keepAliveMs,()=>{try{n.enqueue(o.encode(`: keepalive
|
|
3
|
+
|
|
4
|
+
`))}catch{if(s!==void 0)clearInterval(s)}});return s}setScopeChallengeResolver(n){this._scopeChallengeResolver=n}async start(){if(this._started)throw Error("Transport already started");this._started=!0}setSupportedProtocolVersions(n){this._supportedProtocolVersions=n}createJsonErrorResponse(n,o,s,a){let c={code:o,message:s};if(a?.data!==void 0)c.data=a.data;return Response.json({jsonrpc:"2.0",error:c,id:null},{status:n,headers:{"Content-Type":"application/json",...a?.headers}})}async _checkScopeChallenge(n,o){if(!this._scopeChallengeResolver)return;let s=await h5(n.filter((a)=>wm(a)),o,this._scopeChallengeResolver);return s===void 0?void 0:y5(s,g5(o))}validateRequestHeaders(n){if(!this._enableDnsRebindingProtection)return;if(this._allowedHosts&&this._allowedHosts.length>0){let o=n.headers.get("host");if(!o||!this._allowedHosts.includes(o)){let s=`Invalid Host header: ${o}`;return this.onerror?.(Error(s)),this.createJsonErrorResponse(403,-32000,s)}}if(this._allowedOrigins&&this._allowedOrigins.length>0){let o=n.headers.get("origin");if(o&&!this._allowedOrigins.includes(o)){let s=`Invalid Origin header: ${o}`;return this.onerror?.(Error(s)),this.createJsonErrorResponse(403,-32000,s)}}}async handleRequest(n,o){if(this._closed)return this.createJsonErrorResponse(404,-32001,"Session not found");if(!this.sessionIdGenerator&&this._hasHandledRequest)throw Error("Stateless transport cannot be reused across requests. Create a new transport per request.");this._hasHandledRequest=!0;let s=this.validateRequestHeaders(n);if(s)return s;switch(n.method){case"POST":return this.handlePostRequest(n,o);case"GET":return this.handleGetRequest(n);case"DELETE":return this.handleDeleteRequest(n);default:return this.handleUnsupportedRequest()}}supportsEmptySSEData(n){return this._supportedProtocolVersions.includes(n)&&n>="2025-11-25"}async writePrimingEvent(n,o,s,a){if(!this._eventStore)return;if(!this.supportsEmptySSEData(a))return;let c=await this._eventStore.storeEvent(s,{}),d=`id: ${c}
|
|
5
|
+
data:
|
|
6
|
+
|
|
7
|
+
`;if(this._retryInterval!==void 0)d=`id: ${c}
|
|
8
|
+
retry: ${this._retryInterval}
|
|
9
|
+
data:
|
|
10
|
+
|
|
11
|
+
`;n.enqueue(o.encode(d))}async handleGetRequest(n){if(!n.headers.get("accept")?.includes("text/event-stream"))return this.onerror?.(Error("Not Acceptable: Client must accept text/event-stream")),this.createJsonErrorResponse(406,-32000,"Not Acceptable: Client must accept text/event-stream");let o=this.validateSession(n);if(o)return o;let s=this.validateProtocolVersion(n);if(s)return s;if(this._eventStore){let p=n.headers.get("last-event-id");if(p)return this.replayEvents(p)}if(this._streamMapping.get(this._standaloneSseStreamId)!==void 0)return this.onerror?.(Error("Conflict: Only one SSE stream is allowed per session")),this.createJsonErrorResponse(409,-32000,"Conflict: Only one SSE stream is allowed per session");let a=new TextEncoder,c,d,u=new ReadableStream({start:(p)=>{c=p},cancel:()=>{if(d!==void 0)clearInterval(d);if(this._streamMapping.get(this._standaloneSseStreamId)?.controller===c)this._streamMapping.delete(this._standaloneSseStreamId)}}),m={"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no"};if(this.sessionId!==void 0)m["mcp-session-id"]=this.sessionId;return this._streamMapping.set(this._standaloneSseStreamId,{controller:c,encoder:a,cleanup:()=>{if(d!==void 0)clearInterval(d);this._streamMapping.delete(this._standaloneSseStreamId);try{c.close()}catch{}}}),d=this.startKeepAlive(c,a),new Response(u,{headers:m})}async replayEvents(n){if(!this._eventStore)return this.onerror?.(Error("Event store not configured")),this.createJsonErrorResponse(400,-32000,"Event store not configured");try{let o;if(this._eventStore.getStreamIdForEventId){if(o=await this._eventStore.getStreamIdForEventId(n),!o)return this.onerror?.(Error("Invalid event ID format")),this.createJsonErrorResponse(400,-32000,"Invalid event ID format");if(this._streamMapping.get(o)!==void 0)return this.onerror?.(Error("Conflict: Stream already has an active connection")),this.createJsonErrorResponse(409,-32000,"Conflict: Stream already has an active connection")}let s={"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no"};if(this.sessionId!==void 0)s["mcp-session-id"]=this.sessionId;let a=new TextEncoder,c,d,u=!1,m,p=new ReadableStream({start:(b)=>{c=b},cancel:()=>{if(u=!0,d!==void 0)clearInterval(d);if(m!==void 0&&this._streamMapping.get(m)?.controller===c)this._streamMapping.delete(m)}}),h=new Set;if(m=await this._eventStore.replayEventsAfter(n,{send:async(b,R)=>{if(h.add(b),!this.writeSSEEvent(c,a,R,b))try{c.close()}catch{}}}),this._closed||u){try{c.close()}catch{}return this.createJsonErrorResponse(404,-32001,"Session not found")}if(this._streamMapping.get(m)?.cleanup(),this._streamMapping.set(m,{controller:c,encoder:a,replayedEventIds:h,cleanup:()=>{if(d!==void 0)clearInterval(d);this._streamMapping.delete(m);try{c.close()}catch{}}}),m!==this._standaloneSseStreamId){if(![...this._requestToStreamMapping.values()].includes(m)){this._streamMapping.delete(m);try{c.close()}catch{}}}if(this._streamMapping.get(m)?.controller===c)d=this.startKeepAlive(c,a);return new Response(p,{headers:s})}catch(o){return this.onerror?.(o),this.createJsonErrorResponse(500,-32000,"Error replaying events")}}writeSSEEvent(n,o,s,a){try{let c=`event: message
|
|
12
|
+
`;if(a)c+=`id: ${a}
|
|
13
|
+
`;return c+=`data: ${JSON.stringify(s)}
|
|
14
|
+
|
|
15
|
+
`,n.enqueue(o.encode(c)),!0}catch(c){return this.onerror?.(c),!1}}handleUnsupportedRequest(){return this.onerror?.(Error("Method not allowed.")),Response.json({jsonrpc:"2.0",error:{code:-32000,message:"Method not allowed."},id:null},{status:405,headers:{Allow:"GET, POST, DELETE","Content-Type":"application/json"}})}async handlePostRequest(n,o){try{let s=n.headers.get("accept");if(!s?.includes("application/json")||!s.includes("text/event-stream"))return this.onerror?.(Error("Not Acceptable: Client must accept both application/json and text/event-stream")),this.createJsonErrorResponse(406,-32000,"Not Acceptable: Client must accept both application/json and text/event-stream");if(!p5(n.headers.get("content-type")))return this.onerror?.(Error("Unsupported Media Type: Content-Type must be application/json")),this.createJsonErrorResponse(415,-32000,"Unsupported Media Type: Content-Type must be application/json");let a=n,c;if(o?.parsedBody===void 0)try{let S=await qe(n,this._maxRequestBodySize);if(S.tooLarge){let f=Oe(this._maxRequestBodySize);return this.onerror?.(Error(f)),this.createJsonErrorResponse(413,-32000,f)}c=JSON.parse(S.text)}catch(S){return this.onerror?.(S),this.createJsonErrorResponse(400,-32700,"Parse error: Invalid JSON")}else c=o.parsedBody;if(Array.isArray(c)&&c.length>me)return this.onerror?.(Error(`Invalid Request: Batch must not exceed ${me} messages`)),this.createJsonErrorResponse(400,-32600,`Invalid Request: Batch must not exceed ${me} messages`);let d;try{d=Array.isArray(c)?c.map((S)=>ep.parse(S)):[ep.parse(c)]}catch(S){return this.onerror?.(S),this.createJsonErrorResponse(400,-32700,"Parse error: Invalid JSON-RPC message")}if(this._closed)return this.createJsonErrorResponse(404,-32001,"Session not found");let u=d.some((S)=>l5(S));if(u){if(this._initialized&&this.sessionId!==void 0)return this.onerror?.(Error("Invalid Request: Server already initialized")),this.createJsonErrorResponse(400,-32600,"Invalid Request: Server already initialized");if(d.length>1)return this.onerror?.(Error("Invalid Request: Only one initialization request is allowed")),this.createJsonErrorResponse(400,-32600,"Invalid Request: Only one initialization request is allowed");if(this.sessionId=this.sessionIdGenerator?.(),this._initialized=!0,this.sessionId&&this._onsessioninitialized)await Promise.resolve(this._onsessioninitialized(this.sessionId))}if(!u){let S=this.validateSession(n);if(S)return S;let f=this.validateProtocolVersion(n);if(f)return f}if(this._closed)return this.createJsonErrorResponse(404,-32001,"Session not found");let m;try{m=await this._checkScopeChallenge(d,o?.authInfo)}catch(S){return this.onerror?.(S),this.createJsonErrorResponse(500,-32603,"Internal server error")}if(m)return m;if(!d.some((S)=>wm(S))){for(let S of d)this.onmessage?.(S,{authInfo:o?.authInfo,request:a});return new Response(null,{status:202})}let p=crypto.randomUUID(),h=d.find((S)=>l5(S)),b=h?h.params.protocolVersion:n.headers.get("mcp-protocol-version")??uV;if(this._enableJsonResponse)return new Promise((S)=>{this._streamMapping.set(p,{resolveJson:S,cleanup:()=>{this._streamMapping.delete(p)}});for(let f of d)if(wm(f))this._requestToStreamMapping.set(f.id,p);for(let f of d)this.onmessage?.(f,{authInfo:o?.authInfo,request:a})});let R=new TextEncoder,v,E,O=new ReadableStream({start:(S)=>{v=S},cancel:()=>{if(E!==void 0)clearInterval(E);if(this._streamMapping.get(p)?.controller===v)this._streamMapping.delete(p)}}),w={"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no"};if(this.sessionId!==void 0)w["mcp-session-id"]=this.sessionId;for(let S of d)if(wm(S))this._streamMapping.set(p,{controller:v,encoder:R,cleanup:()=>{if(E!==void 0)clearInterval(E);this._streamMapping.delete(p);try{v.close()}catch{}}}),this._requestToStreamMapping.set(S.id,p);await this.writePrimingEvent(v,R,p,b);for(let S of d){let f,D;if(wm(S)&&this._eventStore&&this.supportsEmptySSEData(b))f=()=>{this.closeSSEStream(S.id)},D=()=>{this.closeStandaloneSSEStream()};this.onmessage?.(S,{authInfo:o?.authInfo,request:a,closeSSEStream:f,closeStandaloneSSEStream:D})}if(this._streamMapping.get(p)?.controller===v)E=this.startKeepAlive(v,R);return new Response(O,{status:200,headers:w})}catch(s){return this.onerror?.(s),this.createJsonErrorResponse(400,-32700,"Parse error",{data:String(s)})}}async handleDeleteRequest(n){let o=this.validateSession(n);if(o)return o;let s=this.validateProtocolVersion(n);if(s)return s;try{return await Promise.resolve(this._onsessionclosed?.(this.sessionId)),new Response(null,{status:200})}finally{await this.close()}}validateSession(n){if(this.sessionIdGenerator===void 0)return;if(!this._initialized)return this.onerror?.(Error("Bad Request: Server not initialized")),this.createJsonErrorResponse(400,-32000,"Bad Request: Server not initialized");let o=n.headers.get("mcp-session-id");if(!o)return this.onerror?.(Error("Bad Request: Mcp-Session-Id header is required")),this.createJsonErrorResponse(400,-32000,"Bad Request: Mcp-Session-Id header is required");if(o!==this.sessionId)return this.onerror?.(Error("Session not found")),this.createJsonErrorResponse(404,-32001,"Session not found")}validateProtocolVersion(n){let o=n.headers.get("mcp-protocol-version");if(o!==null&&!this._supportedProtocolVersions.includes(o)){let s=`Bad Request: Unsupported protocol version: ${o} (supported versions: ${this._supportedProtocolVersions.join(", ")})`;return this.onerror?.(Error(s)),this.createJsonErrorResponse(400,-32000,s)}}async close(){if(this._closed)return;this._closed=!0;for(let{cleanup:n}of this._streamMapping.values())n();this._streamMapping.clear(),this._requestResponseMap.clear(),this.onclose?.()}closeSSEStream(n){let o=this._requestToStreamMapping.get(n);if(!o)return;let s=this._streamMapping.get(o);if(s)s.cleanup()}closeStandaloneSSEStream(){let n=this._streamMapping.get(this._standaloneSseStreamId);if(n)n.cleanup()}async send(n,o){let s=o?.relatedRequestId;if(Mh(n)||Nh(n))s=n.id;if(s===void 0){if(Mh(n)||Nh(n))throw Error("Cannot send a response on a standalone SSE stream unless resuming a previous client request");let d;if(this._eventStore)d=await this._eventStore.storeEvent(this._standaloneSseStreamId,n);let u=this._streamMapping.get(this._standaloneSseStreamId);if(u===void 0)return;if(u.controller&&u.encoder&&(d===void 0||!u.replayedEventIds?.has(d)))this.writeSSEEvent(u.controller,u.encoder,n,d);return}let a=this._requestToStreamMapping.get(s);if(!a)throw Error(`No connection established for request ID: ${String(s)}`);let c=this._streamMapping.get(a);if(!this._enableJsonResponse){let d;if(this._eventStore)d=await this._eventStore.storeEvent(a,n),c=this._streamMapping.get(a);if(c?.controller&&c?.encoder&&(d===void 0||!c.replayedEventIds?.has(d)))this.writeSSEEvent(c.controller,c.encoder,n,d)}if(Mh(n)||Nh(n)){this._requestResponseMap.set(s,n);let d=[...this._requestToStreamMapping.entries()].filter(([u,m])=>m===a).map(([u])=>u);if(d.every((u)=>this._requestResponseMap.has(u))){if(!c){if(this._enableJsonResponse)throw Error(`No connection established for request ID: ${String(s)}`);if(!this._eventStore){this.onerror?.(Error(`Response for request ID ${String(s)} is undeliverable: per-request stream is disconnected and no eventStore is configured`));for(let u of d)this._requestResponseMap.delete(u),this._requestToStreamMapping.delete(u);return}for(let u of d)this._requestResponseMap.delete(u),this._requestToStreamMapping.delete(u);return}if(this._enableJsonResponse&&c.resolveJson){let u={"Content-Type":"application/json"};if(this.sessionId!==void 0)u["mcp-session-id"]=this.sessionId;let m=d.map((p)=>this._requestResponseMap.get(p));if(m.length===1)c.resolveJson(Response.json(m[0],{status:200,headers:u}));else c.resolveJson(Response.json(m,{status:200,headers:u}));c.cleanup()}else c.cleanup();for(let u of d)this._requestResponseMap.delete(u),this._requestToStreamMapping.delete(u)}}}};function L(n){if(n===null||typeof n!=="object"||Array.isArray(n))return null;let{method:o,id:s}=n;if(typeof o!=="string")return null;return typeof s==="string"||typeof s==="number"?s:null}function q(n,o,s,a,c=null){return Response.json({jsonrpc:"2.0",error:{code:o,message:s,...a!==void 0&&{data:a}},id:c},{status:n,...n===405&&{headers:{Allow:"POST"}}})}function Z(n,o=null){return q(n.httpStatus,n.code,n.message,n.data,o)}function H(n){return n instanceof Error?n:Error(String(n))}function J(n=null){return q(500,-32603,"Internal server error",void 0,n)}function _e(n){if(n.transport!==void 0)throw Error("The factory returned an instance that is still serving another request. Return a new instance for each request.")}function yt(n,o,s,a){return async(c,d)=>{if(c.method.toUpperCase()!=="POST")return q(405,-32000,"Method not allowed.");try{let u=await n({era:"legacy",...d?.authInfo!==void 0&&{authInfo:d.authInfo},requestInfo:c}),m=new X4({sessionIdGenerator:void 0,...s!==void 0&&{keepAliveMs:s},...a!==void 0&&{maxRequestBodySize:a}});await u.connect(m);let p=()=>{m.close().catch(()=>{}),u.close().catch(()=>{})};c.signal?.addEventListener("abort",p,{once:!0});let h=await m.handleRequest(c,{...d?.authInfo!==void 0&&{authInfo:d.authInfo},...d?.parsedBody!==void 0&&{parsedBody:d.parsedBody}});if(h.body===null||u5(h.headers.get("content-type"))!=="text/event-stream")return p(),h;let b=h.body.getReader(),R=!1,v=()=>{if(!R)R=!0,p()},E=new ReadableStream({pull:async(O)=>{try{let{done:w,value:S}=await b.read();if(w){v(),O.close();return}if(S!==void 0)O.enqueue(S)}catch(w){v(),O.error(w)}},cancel:(O)=>(v(),b.cancel(O).catch(()=>{}))});return new Response(E,{status:h.status,statusText:h.statusText,headers:h.headers})}catch(u){try{o?.(H(u))}catch{}return J(L(d?.parsedBody))}}}function Ne(n){return{protocolVersionHeader:n.headers.get("mcp-protocol-version")??void 0,mcpMethodHeader:n.headers.get("mcp-method")??void 0,mcpNameHeader:n.headers.get("mcp-name")??void 0}}async function St(n,o,s=!0,a=fe){let c=n.method.toUpperCase(),d,u=o,m=n,p=!1;if(c==="POST"){if(u===void 0){if(s)m=n.clone();let h;try{let b=await qe(n,a);if(b.tooLarge)return{step:"body-too-large"};h=b.text}catch{return{step:"unreadable-body"}}try{d=h.length===0?void 0:JSON.parse(h)}catch{p=!0}if(!p&&d!==void 0)u=d}else d=u;if(p||d===void 0)return{step:"no-json-body",forwardRequest:m}}return{step:"classified",outcome:wF({httpMethod:c,...Ne(n),...d!==void 0&&{body:d}}),body:d,parsedBody:u,forwardRequest:m}}function MQ(n,o={}){let{legacy:s,onerror:a,responseMode:c}=o,d=Pe(o.maxRequestBodySize);if(typeof s==="function")throw TypeError("The 'legacy' option only accepts 'stateless' or 'reject', not a handler function. To serve 2025-era traffic with your own handler, route in user land with the exported isLegacyRequest(request) predicate in front of a strict (legacy: 'reject') handler.");let u=new Set,m=!1,p=(f)=>{try{a?.(f)}catch{}},h=o.bus??new PF(p),b=wee(h),R=Ree({bus:h,maxSubscriptions:o.maxSubscriptions??v5,keepAliveMs:o.keepAliveMs??sC,onerror:p});if(c==="json")console.warn("responseMode: 'json' drops mid-call notifications. subscriptions/listen streams are always served over SSE regardless; other notifications emitted before a result are dropped.");let v=s==="reject"?void 0:yt(n,p,o.keepAliveMs,d);async function E(f,D,C){let _=f.classification.revision;if(_===void 0||!cT.includes(_)){let x=new hV({supported:[...cT],requested:_??"unknown"});return p(x),q(400,x.code,x.message,x.data,L(f.message))}let I=lee({httpMethod:D.method,...Ne(D)},f);if(I!==void 0)return p(Error(`Rejected inbound request (${I.cell}): ${I.message}`)),Z(I,L(f.message));let F=f.messageKind==="request"?cw(f.message.params):void 0,z=F?.[Tr];if(f.messageKind==="request"){let x=see(f.message.method);if(x!==void 0){let P=vF(x,z);if(P!==void 0){let N=new SF({requiredCapabilities:P});return p(N),q(dee(N.code,"ladder"),N.code,N.message,N.data,f.message.id)}}}let M=await n({era:"modern",...C!==void 0&&{authInfo:C},requestInfo:D}),k=M instanceof Fh?M.server:M;if(_e(k),f.messageKind==="request"&&f.message.method==="subscriptions/listen"){let x=k.getCapabilities(),P=bee(k);return M.close().catch(p),R.serve(f.message,D.signal,x,P)}if(f.messageKind==="request"&&f.message.method==="tools/call"&&M instanceof Fh){let x=f.message.params,P=typeof x?.name==="string"?x.name:void 0,N=P===void 0?void 0:M.toolInputSchemaJson(P);if(N!==void 0){let ie=gV(N);if(ie.declarations!==void 0&&ie.declarations.length>0){let K=cee(ie.declarations,x?.arguments,D.headers);if(K!==void 0)return M.close().catch(p),p(Error(`Rejected inbound request (${K.cell}): ${K.message}`)),Z(K,f.message.id)}}}if(f.messageKind==="request"&&M instanceof Fh)try{let x=await h5([f.message],C,(P)=>M.resolveScopeChallenge(P));if(x!==void 0)return M.close().catch(p),y5(x,g5(C))}catch(x){return M.close().catch(p),p(H(x)),J(f.message.id)}if(_e(k),mee(k,_),vee(k,cT),F!==void 0)yee(k,{clientInfo:F[iu],clientCapabilities:z});let xe=k.onclose;u.add(k);let De=()=>{if(u.delete(k),k.onclose===De)k.onclose=xe;xe?.()};k.onclose=De;try{let x=await Et(M,f.message,{classification:f.classification,request:D,...C!==void 0&&{authInfo:C},...c!==void 0&&{responseMode:c},...o.keepAliveMs!==void 0&&{keepAliveMs:o.keepAliveMs}});if(f.messageKind==="notification")queueMicrotask(()=>void k.close().catch(()=>{}));return x}catch(x){if(x instanceof ct&&x.code===gt.ConnectionClosed)return new Response(null,{status:499});return await k.close().catch(()=>{}),u.delete(k),p(H(x)),J(L(f.message))}}async function O(f,D,C,_){if(v!==void 0)return v(D,{...C!==void 0&&{authInfo:C},..._!==void 0&&{parsedBody:_}});let I=uee(f,cT);if(I===void 0)return new Response(null,{status:202});return p(Error(`Rejected 2025-era request on a modern-only endpoint (${I.cell}): ${I.message}`)),Z(I,L(_))}async function w(f,D){let C=D?.authInfo;if(f.method.toUpperCase()==="POST"&&!p5(f.headers.get("content-type")))return p(Error("Unsupported Media Type: Content-Type must be application/json")),q(415,-32000,"Unsupported Media Type: Content-Type must be application/json");let _=await St(f,D?.parsedBody,!0,d);if(_.step==="unreadable-body")return q(400,-32700,"Parse error: the request body could not be read");if(_.step==="body-too-large")return q(413,-32000,Oe(d));if(_.step==="no-json-body"){if(v!==void 0)return v(_.forwardRequest,{...C!==void 0&&{authInfo:C}});return q(400,-32700,"Parse error: the request body is not valid JSON")}let{outcome:I,body:F,parsedBody:z,forwardRequest:M}=_;try{switch(I.kind){case"reject":return p(Error(`Rejected inbound request (${I.cell}): ${I.message}`)),Z(I,L(F));case"modern":return await E(I,f,C);case"legacy":return await O(I,M,C,z)}}catch(k){return p(H(k)),J(L(F))}}return{fetch:async(f,D)=>{if(m)throw Error("This MCP handler has been closed");try{return await w(f,D)}catch(C){return p(H(C)),J(L(D?.parsedBody))}},notify:b,bus:h,close:async()=>{m=!0,R.closeAll();let f=[...u].map((D)=>D.close().catch(()=>{}));u.clear(),await Promise.all(f)}}}var te="v1.";function pe(n){let o="";for(let s of n)o+=String.fromCodePoint(s);return btoa(o).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function Rt(n,o){if(n.length!==o.length)return!1;let s=0;for(let a=0;a<n.length;a++)s|=n.codePointAt(a)^o.codePointAt(a);return s===0}function Me(n){let o=n.replaceAll("-","+").replaceAll("_","/"),s=atob(o),a=new Uint8Array(s.length);for(let c=0;c<s.length;c++)a[c]=s.codePointAt(c);return a}function NQ(n){let o=globalThis.crypto?.subtle;if(o===void 0)throw TypeError("createRequestStateCodec requires the Web Crypto API (globalThis.crypto.subtle); see https://ts.sdk.modelcontextprotocol.io/v2/troubleshooting for the Node.js polyfill instructions");let s=typeof n.key==="string"?new TextEncoder().encode(n.key):Uint8Array.from(n.key);if(s.byteLength<32)throw RangeError(`createRequestStateCodec: key must be at least 32 bytes (got ${s.byteLength})`);let a=n.ttlSeconds??600;if(!Number.isFinite(a))throw RangeError("createRequestStateCodec: ttlSeconds must be a finite number");let c=n.bind,d,u=()=>d??=o.importKey("raw",s,{name:"HMAC",hash:"SHA-256"},!1,["sign","verify"]),m=new TextEncoder,p="mcp.requestState.bind:",h=async(b)=>pe(new Uint8Array(await o.sign("HMAC",await u(),m.encode(p+b))).slice(0,16));return{async mint(b,R){let v={p:b,exp:Math.floor(Date.now()/1000)+a};if(c!==void 0){if(R===void 0)throw TypeError("createRequestStateCodec: mint() requires ctx when a bind callback is configured");v.b=await h(c(R))}let E=pe(m.encode(JSON.stringify(v)));return`${te}${E}.${pe(new Uint8Array(await o.sign("HMAC",await u(),m.encode(te+E))))}`},async verify(b,R){let v=b.lastIndexOf(".");if(!b.startsWith(te)||v<=3)throw Error("malformed");let E=b.slice(3,v),O;try{O=Me(b.slice(v+1))}catch{throw Error("malformed")}if(!await o.verify("HMAC",await u(),O,m.encode(te+E)))throw Error("mac");let w;try{w=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(Me(E)))}catch{throw Error("malformed")}if(typeof w.exp!=="number"||w.exp<Math.floor(Date.now()/1000))throw Error("expired");if(c!==void 0){let S=await h(c(R));if(w.b===void 0||!Rt(w.b,S))throw Error("bind")}else if(w.b!==void 0)throw Error("bind");return w.p}}}var Xy="io.modelcontextprotocol/tasks",xt=-32021,Dt=-32602,Z4={resultType:"complete"};function V(n){return typeof n==="object"&&n!==null&&!Array.isArray(n)}function Le(n){return V(n)&&Q4(n[Tr])}function Zy(n){return Le(n.envelope)||Le(n.meta)}function Q4(n){if(!V(n)||!V(n.extensions))return!1;return V(n.extensions[Xy])}function ph(n){return V(n)&&n.resultType==="task"&&typeof n.taskId==="string"}function D0(){return new ge(xt,"Missing required client capability",{requiredCapabilities:{extensions:{[Xy]:{}}}})}function m_(n){return new ge(Dt,n==="expired"?"Failed to retrieve task: Task has expired":"Failed to retrieve task: Task not found")}function Fe(n){return new Date(n).toISOString()}function Ue(n){return{taskId:n.taskId,status:n.status,...n.statusMessage!==null&&{statusMessage:n.statusMessage},createdAt:Fe(n.createdAtMs),lastUpdatedAt:Fe(n.lastUpdatedAtMs),ttlMs:n.expiresAtMs===null?null:n.expiresAtMs-n.createdAtMs,pollIntervalMs:n.pollIntervalMs}}function FQ(n){return{resultType:"task",...Ue(n)}}function LQ(n){let o=Ue(n);switch(n.status){case"input_required":return{resultType:"complete",...o,inputRequests:n.inputRequests??{}};case"completed":return{resultType:"complete",...o,result:n.result??{content:[]}};case"failed":return{resultType:"complete",...o,error:n.error??{code:-32603,message:"Internal error"}};default:return{resultType:"complete",...o}}}var kt=["tasks/get","tasks/update","tasks/cancel"];function tV(n){return kt.includes(n)}function O0(n){if(!oe(n)||typeof n.ownerKey!=="string"||n.ownerKey.trim().length===0||typeof n.declared!=="boolean")return;return{ownerKey:n.ownerKey,declared:n.declared}}function e5(){return{[Tr]:{extensions:{[Xy]:{}}}}}function oe(n){return typeof n==="object"&&n!==null&&!Array.isArray(n)}var BQ=aP({});function $Q(n){return{resultType:"complete",...oe(n)?n:{}}}function UQ(n){if(!oe(n)||typeof n.taskId!=="string"||typeof n.status!=="string"||typeof n.createdAt!=="string"||"isError"in n||"structuredContent"in n||n.content!==void 0&&!(Array.isArray(n.content)&&n.content.length===0))return;let o={resultType:"task",...n};return delete o.content,o}function HQ(n){if(!(n instanceof ge)||typeof n.code!=="number")return;let o=`MCP error ${n.code}: `,s=n.message.startsWith(o)?n.message.slice(o.length):n.message;return{code:n.code,message:s,...n.data!==void 0&&{data:n.data}}}function rV(n){return oe(n)&&typeof n.code==="number"&&typeof n.message==="string"}function qQ(n){return new ge(n.code,n.message,n.data)}var f_=g({port:T().finite().optional(),host:y().optional(),strictPort:ee().optional(),debug:ee().optional(),debugPerf:ee().optional(),planExecutionLockScope:A(["session","global"]).optional(),runnerReadinessTimeoutMs:T().finite().optional(),videoQualityPreset:y().optional(),videoTargetBitrateKbps:T().finite().optional(),videoMaxThroughputMbps:T().finite().optional(),videoFps:T().finite().optional(),videoFormat:y().optional(),videoMaxArchiveSizeMb:T().finite().optional(),toolOutputsDir:y().optional(),networkMockable:ee().optional(),embeddedSdk:ee().optional(),enabledTools:j(y()).optional(),disabledTools:j(y()).optional(),dismissKeyboardAfterInput:ee().optional(),eventAllMarkers:j(y()).optional(),eventAllMarkersCliOverride:ee().optional(),noUiPerfMode:ee().optional(),memPerfAudit:ee().optional(),accessibilityAudit:ee().optional(),accessibilityLevel:y().optional(),accessibilityFailureMode:y().optional(),accessibilityMinSeverity:y().optional(),accessibilityUseBaseline:ee().optional(),predictiveUi:ee().optional(),rawElementSearch:ee().optional(),skipCtrlProxyDownload:ee().optional(),toolCallRecording:ee().optional(),noNavigationScreenshots:ee().optional(),noWaitForPollingOverhead:ee().optional(),noA11yIncludeNotImportantViews:ee().optional(),noA11yReportViewIds:ee().optional(),noA11yRetrieveInteractiveWindows:ee().optional(),noOcclusion:ee().optional(),observeResultIncludeElements:ee().optional(),toolResultsNoStructuredContent:ee().optional(),actionsDiffObserve:ee().optional(),actionsNoObserve:ee().optional(),actionsCompactMetadata:ee().optional()});var Be=256,U=2000,Tt=g({unavailableSockets:j(g({code:ne("AUXILIARY_SOCKET_UNAVAILABLE"),holderPid:T().int().positive().optional(),holderVersion:y().optional(),holderVerified:ee().optional(),name:y(),socketPath:y().min(1)})).optional(),reportedPidFilePath:y().min(1).optional(),reportedSocketPath:y().min(1).optional(),reportedSockets:Ct(y(),y().min(1)).optional(),launchNonce:y().optional(),processStartedAt:T().finite().optional(),dbPath:y().min(1).optional(),pid:T().int().positive().optional(),version:y().trim().min(1),buildId:y().optional(),entryScript:y().optional(),releaseVersion:y().optional(),startedAt:T().finite().optional(),processGenerationToken:y().optional(),processGenerationTokenUtc:y().optional(),activeProvisioning:ee().optional(),structuredSessionNotFound:ee().optional(),structuredToolErrorCodes:ee().optional(),acceptanceCapabilityFingerprint:y().nullable().optional()}),wt=g({options:f_.optional(),effectiveDebug:ee().optional()});function At(n){if(Ae(n.handshakeFailure))return new u_(n.handshakeFailure,n.error||"Daemon identity mismatch");if(ue(n.daemonShuttingDown))return new el(n.daemonShuttingDown.requestMayHaveDispatched===!0);let o=Ie(n.overloadFailure);if(o)return new Xs(n.error||"Daemon rejected overloaded MCP work",o);return}function It(n){let o=ree(n.boundSessionLoss);if(o)return new OA(o);let s=Qq(n.transportFailure);if(s)return new uh(n.error||"Device-control transport failure",s);return}function _t(n){let o=eee(n.requestFailureCause),s=o?Error(o.message):void 0;if(s&&o)s.name=o.name;return new t(n.error||"Unknown error from daemon",{cause:s})}var Mt=g({state:A(["live","suspect","lapsed"]),remainingMs:T().finite().nonnegative(),holdRemainingMs:T().finite().nonnegative()});function Ot(n){let o=Mt.safeParse(n.result?.liveness);return o.success?o.data:void 0}function Pt(n){if(typeof n.releaseReason!=="string"||n.releaseReason.length===0)return{};return wh(n.releaseReason,typeof n.idleTimeoutMs==="number"?n.idleTimeoutMs:void 0)}function qt(n){return{...typeof n.retryable==="boolean"?{retryable:n.retryable}:{},...typeof n.retryAfterMs==="number"?{retryAfterMs:n.retryAfterMs}:{},...typeof n.nextAction==="string"?{nextAction:n.nextAction}:{},...n.details&&typeof n.details==="object"?{details:n.details}:{}}}function He(n){return n===void 0?{}:{tasks:n}}function Nt(n){return rV(n.jsonRpcError)?{jsonRpcError:n.jsonRpcError}:{}}function ve(n){let o=At(n)??It(n)??_t(n),s=[n.code,n.handshakeFailure?.code,n.daemonShuttingDown?.code,n.overloadFailure?.code,n.boundSessionLoss?.code,n.transportFailure?.code].find((d)=>d!==void 0),a=zc(n);if(a!==void 0)Object.assign(o,{daemonInstance:a});if(s===void 0)return o;let c=s===WS?Ot(n):void 0;return Object.assign(o,{code:s,...Nt(n),...qt(n),...c?{livenessOwnerHold:c}:{},...Pt(n)})}function nV(n,o){let s=Tt.safeParse(n);if(!s.success)throw new t("Daemon preflight failed: the socket owner returned no version identity; no device operation started. Restart the daemon from this client installation.");let a=wt.safeParse(n);if(!a.success)throw new t("Daemon preflight failed: the socket owner returned a valid identity but malformed startup options; no device operation started. Restart the daemon from this client installation.");let{releaseVersion:c,...d}=s.data;return{running:!0,...d,socketPath:o,...a.data.options?{options:a.data.options}:{},...a.data.effectiveDebug!==void 0?{effectiveDebug:a.data.effectiveDebug}:{},...c?{assetVersion:c}:{}}}function $e(n,o){if(!o.trim()||n.inboundClosed)return;let s;try{s=JSON.parse(o)}catch(d){e.error(`Error parsing daemon response: ${d}`);return}let a=nee.safeParse(s);if(a.success){Ft(n,a.data);return}let c=QQ.safeParse(s);if(c.success){n.handleResponse(c.data);return}e.warn("Dropped daemon frame: invalid response or notification envelope")}function Ft(n,o){if(o.method===W0&&o.requestId!==void 0&&typeof o.timeoutMs==="number"){n.adoptPendingRequestBudget(o.requestId,o.timeoutMs);return}if(o.method===zS&&o.progressToken!==void 0){if(o.requestId!==void 0)n.extendPendingRequestOnProgress(o.requestId,o.progressToken)}for(let s of n.notificationHandlers)try{s(o)}catch(a){e.warn(`Daemon notification handler failed for ${o.method}: ${a}`)}}function Je(n,o){if(o.id===null){if(n.pendingRequests.size!==1){e.warn(`Received uncorrelatable daemon response with ${n.pendingRequests.size} pending requests; dropping response`);return}let a=new t(o.error??"Daemon could not parse a socket request"),c=n.pendingRequests.values().next().value;if(!c)return;n.timer.clearTimeout(c.timeout),c.removeAbortListener?.(),c.reject(a),n.pendingRequests.clear();return}let s=n.pendingRequests.get(o.id);if(!s&&n.cancelledRequestIds.delete(o.id)){e.debug(`Dropped daemon response for cancelled request ID: ${o.id}`);return}if(!s){e.warn(`Received response for unknown request ID: ${o.id}`);return}if(n.timer.clearTimeout(s.timeout),s.removeAbortListener?.(),n.pendingRequests.delete(o.id),o.success)s.resolve(o);else s.reject(ve(o))}function je(n,o,s,a){let{signal:c}=a,d=()=>{},u=()=>{d(),n.timedOutRequestAbortCleanups.delete(o)};return new Promise((m,p)=>{let h=a.armTimeout(p,u);n.pendingRequests.set(o,{...a.entry,resolve:(E)=>{m(E.result)},reject:p,timeout:h,removeAbortListener:u}),a.onRegistered?.();let b=(E)=>{n.timer.clearTimeout(h),u(),n.pendingRequests.delete(o),p(E)},R=n.socket();if(!R||c?.aborted){b(c?.aborted?a.abortError():a.socketLostError());return}try{R.write(s)}catch(E){b(a.writeError(E));return}if(!c)return;let v=()=>{let E=n.pendingRequests.get(o);if(!E&&!n.timedOutRequestAbortCleanups.has(o))return;if(n.timer.clearTimeout(E?.timeout??h),n.pendingRequests.delete(o),u(),n.sendCancelFrame(o),a.destroyOnAbort)n.socket()?.destroy();if(E)p(a.abortError())};if(c.addEventListener("abort",v,{once:!0}),d=()=>c.removeEventListener("abort",v),c.aborted)v()})}import{existsSync as Jt}from"fs";import{platform as jt}from"os";function se(n){let{value:o,encoded:s}=ure(n);if(s&&n.type==="mcp_request"&&n.method==="tools/call"){let a=o.params;if(a&&typeof a==="object"){let c=a.arguments&&typeof a.arguments==="object"&&!Array.isArray(a.arguments)?a.arguments:{};a.arguments={...c,[rB]:!0}}}return JSON.stringify(o)+`
|
|
16
|
+
`}function Ve(n,o){for(let s=o+1;s<n.length;s++)if(n[s]==="\\")s++;else if(n[s]==='"')return s;return-1}function ze(n,o){let s=n?.toString("utf8");if(!s?.startsWith('{"'))return;try{let a=Ve(s,1);if(JSON.parse(s.slice(1,a+1))!=="id")return null;if(!s.slice(a+1).startsWith(':"'))return;let d=a+2,u=Ve(s,d),m=JSON.parse(s.slice(d,u+1));return o(m)?m:null}catch{e.debug("Oversized daemon frame head contained no complete response id");return}}import{createConnection as Ut}from"net";function Ge(n,o,s){return new Promise((a,c)=>{let d=!1,u=void 0,m=()=>{},p=()=>n.getSocket()!==null&&n.getSocket()!==u,h=(v)=>{if(p())return;n.timer.clearTimeout(b),m(),n.setConnected(!1),n.setSocket(null),u?.destroy();let E=Y(v);if(n.rejectPendingRequests(E,!0),!d)d=!0,c(E)},b=n.timer.setTimeout(()=>{h(new he(`Failed to connect to daemon within ${o}ms`))},o);if(s){let v=()=>h(new he("Daemon connection attempt aborted",{cause:s.reason}));s.addEventListener("abort",v,{once:!0}),m=()=>s.removeEventListener("abort",v)}let R=Ut(n.socketPath,()=>{if(d||!u||u.destroyed||p())return;if(n.timer.clearTimeout(b),m(),n.resetInbound(),n.setConnected(!0),e.info(`Connected to daemon at ${n.socketPath}`),!d)d=!0,a()});if(u=R,d){u.on("error",()=>{}),u.destroy();return}n.setSocket(u),u.on("data",(v)=>{if(p())return;n.handleData(typeof v==="string"?Buffer.from(v):v)}),u.on("error",(v)=>{if(p())return;e.error(`Daemon socket error: ${v.message}`),h(v)}),u.once("close",()=>Ee(n,R))})}function Ee(n,o){let s=n.getSocket();if(s!==null&&s!==o||n.hasClosedSocket(o))return;if(n.handleSocketClosed(o),n.hasPendingRequests())n.rejectPendingRequests(new he("Daemon socket connection lost: connection closed"),!0)}import{createConnection as Bt}from"net";import{statSync as Ht}from"fs";import{platform as $t}from"os";async function Ke(n,o={}){let s=o.timer??i;if($t()!=="win32")try{if(!Ht(n).isSocket())return!1}catch(a){return e.debug(`src/daemon/client/client.ts fallback failed: ${a}`,a),!1}return new Promise((a)=>{let c=!1,d=(h)=>{if(!c)c=!0,o.signal?.removeEventListener("abort",u),a(h)},u=()=>{s.clearTimeout(p),m.destroy(),d(!1)},m=Bt(n,()=>{s.clearTimeout(p),m.destroy(),d(!0)});m.on("error",()=>{s.clearTimeout(p),m.destroy(),d(!1)});let p=s.setTimeout(()=>{m.destroy(),d(!1)},o.timeoutMs??1000);if(o.signal?.aborted)u();else o.signal?.addEventListener("abort",u,{once:!0})})}function Qe(n,o){let s=n instanceof Error?n:new he(String(n)),a=o.pidFilePath??br,c=Eo(a);if(!c||typeof c.pid!=="number")return s;if((o.isProcessRunning??((u)=>at(u,{debugLog:e.debug})))(c.pid))return s;return new he(`${s.message} \u2014 the recorded daemon PID ${c.pid} is not running; the socket may be stale and will be reclaimed automatically the next time the daemon starts (run \`--daemon restart\` if this persists)`)}class Qy extends Error{toolName;origin;constructor(n){let o=n.detail?` (${n.detail})`:"";super(`Daemon disconnected before ${n.toolName} responded at ${n.origin}${o}`);this.name="DaemonDisconnectError",this.toolName=n.toolName,this.origin=n.origin}}class ev extends he{constructor(n,o){super(n,o);this.name="DaemonRequestNotDeliveredError"}}function We(n,o,s=process.env){let a=B0(n,s);return FA(n,s)!==void 0?a:Math.max(a,VS(o)??0)}class ye extends t{limitBytes;constructor(n){super(`Daemon response frame exceeded ${n} bytes; the daemon connection was closed.`);this.limitBytes=n;this.name="DaemonFrameTooLargeError"}}class Ia{socket=null;socketPath;connectionTimeout;timer;pendingRequests=new Map;cancelledRequestIds=new Set;timedOutRequestAbortCleanups=new Map;framer;inboundClosed=!1;closedSockets=new WeakSet;connected=!1;connectInFlight=null;notificationHandlers=new Set;connectionClosedHandlers=new Set;recoveryOptions;clientIdentity;idGenerator;platform;maxInboundFrameBytes;env;constructor(n=Lt,o=oB,s=i,{recoveryOptions:a={},clientIdentity:c,idGenerator:d=B,platformOverride:u=jt(),maxInboundFrameBytes:m=dre,env:p=process.env}={}){this.socketPath=n,this.connectionTimeout=o,this.timer=s,this.recoveryOptions=a,this.clientIdentity=c===void 0?Zq():c,this.idGenerator=d,this.platform=u,this.maxInboundFrameBytes=m,this.env=p,this.framer=this.createInboundFramer()}get testHooks(){return{attachSocket:(n)=>{this.socket=n,this.connected=!0,this.inboundClosed=!1,this.framer=this.createInboundFramer()},simulateIncomingData:(n)=>this.handleData(n),findPendingRequestIdByProgressToken:(n)=>[...this.pendingRequests].find(([,o])=>o.progressToken===n)?.[0],hasPendingRequest:(n)=>this.pendingRequests.has(n),connection:()=>({connected:this.connected,socket:this.socket}),socketClosed:(n)=>Ee(this.connectorHost(),n),declaredIdentity:()=>this.clientIdentity,socketPathObservable:()=>this.socketPathObservable()}}handshakeFields(){if(!this.clientIdentity)return{};return{clientVersion:this.clientIdentity.version,clientBuildId:this.clientIdentity.build.buildId,clientEntryScript:this.clientIdentity.build.entryScript}}static async isAvailable(n=Lt,o={}){return Ke(n,o)}async connect(n=this.connectionTimeout,o){if(this.connected)return;if(this.connectInFlight)try{await l(this.connectInFlight,{timer:this.timer,timeoutMs:n,signal:o,label:"Daemon connection attempt",timeoutError:()=>this.annotateStaleSocketHint(new he(`Failed to connect to daemon within ${n}ms`))});return}catch(a){if(o?.aborted&&a===o.reason)throw this.annotateStaleSocketHint(new he("Daemon connection attempt aborted",{cause:o.reason}));throw a}let s=(async()=>{let a=this.timer.now()+n;try{if(this.clientIdentity!==null&&!ul())await ll();await this.connectOnce(this.remainingConnectTimeout(a,n),o)}catch(c){throw this.annotateStaleSocketHint(c)}})();this.connectInFlight=s;try{await s}finally{this.connectInFlight=null}}annotateStaleSocketHint(n){return Qe(n,this.recoveryOptions)}remainingConnectTimeout(n,o){let s=n-this.timer.now();if(s<=0)throw new he(`Failed to connect to daemon within ${o}ms`);return s}socketPathObservable(){return this.platform==="win32"||Jt(this.socketPath)}async connectOnce(n,o){if(this.connected)return;if(o?.aborted)throw new he("Daemon connection attempt aborted",{cause:o.reason});if(!this.socketPathObservable())throw new he(`Daemon socket not found: ${this.socketPath}`);return Ge(this.connectorHost(),n,o)}connectorHost(){return{timer:this.timer,socketPath:this.socketPath,getSocket:()=>this.socket,setSocket:(n)=>{this.socket=n},setConnected:(n)=>{this.connected=n},resetInbound:()=>{this.framer=this.createInboundFramer(),this.inboundClosed=!1},handleData:(n)=>this.handleData(n),handleSocketClosed:(n)=>this.handleSocketClosed(n),hasClosedSocket:(n)=>this.closedSockets.has(n),hasPendingRequests:()=>this.pendingRequests.size>0,rejectPendingRequests:(n,o)=>this.rejectPendingRequests(n,o)}}rejectPendingRequests(n,o){for(let s of this.timedOutRequestAbortCleanups.values())s();for(let[,{reject:s,timeout:a,removeAbortListener:c,disconnectCause:d}]of this.pendingRequests)this.timer.clearTimeout(a),c?.(),s(o?new he(n.message,{cause:d}):n);this.pendingRequests.clear()}handleData(n){if(!this.inboundClosed)this.framer.push(n)}createInboundFramer(){return new rd(this.maxInboundFrameBytes,{onLine:(n)=>this.handleInboundLine(n),onOverflow:(n)=>this.handleInboundOverflow(n)})}handleInboundLine(n){return $e({inboundClosed:this.inboundClosed,handleResponse:this.handleResponse.bind(this),extendPendingRequestOnProgress:this.extendPendingRequestOnProgress.bind(this),adoptPendingRequestBudget:this.adoptPendingRequestBudget.bind(this),notificationHandlers:this.notificationHandlers,pendingRequests:this.pendingRequests,timer:this.timer,cancelledRequestIds:this.cancelledRequestIds},n)}handleResponse(n){if(n.id!==null)this.timedOutRequestAbortCleanups.get(n.id)?.();Je({pendingRequests:this.pendingRequests,timer:this.timer,cancelledRequestIds:this.cancelledRequestIds},n)}handleInboundOverflow(n){let o=new ye(this.maxInboundFrameBytes);e.warn(o.message);let s=ze(n,(d)=>this.pendingRequests.has(d)),a=s===void 0&&this.pendingRequests.size===1?this.pendingRequests.keys().next().value:s,c=this.socket;for(let[d,u]of this.pendingRequests)this.timer.clearTimeout(u.timeout),u.removeAbortListener?.(),u.reject(d===a?o:new he(`Daemon socket connection lost: another frame on the connection exceeded ${this.maxInboundFrameBytes} bytes`,{cause:o}));this.pendingRequests.clear();try{this.handleSocketClosed(c)}finally{c?.destroy()}}handleSocketClosed(n){for(let o of this.timedOutRequestAbortCleanups.values())o();if(n)this.closedSockets.add(n);this.connected=!1,this.socket=null,this.inboundClosed=!0,this.framer=this.createInboundFramer(),e.info("Daemon socket connection closed");for(let o of this.connectionClosedHandlers)o()}extendPendingRequestOnProgress(n,o){let s=this.pendingRequests.get(n);if(s?.progressToken!==o||!s.deadline||s.requestTimeoutMs===void 0)return;let a=this.timer.now();s.deadline.extendOnProgress(a,s.requestTimeoutMs);let c=s.deadline.value-a;if(c<=0)return;this.timer.clearTimeout(s.timeout),s.timeout=this.scheduleRequestTimeout(n,s.toolName,c,s.reject)}adoptPendingRequestBudget(n,o){let s=this.pendingRequests.get(n);if(!s||s.requestTimeoutMs===void 0||!Number.isFinite(o)||o<=0||o===s.requestTimeoutMs)return;let a=this.timer.now();if(s.deadline)s.deadline=new vh(a,o);s.requestTimeoutMs=o,this.timer.clearTimeout(s.timeout),s.timeout=this.scheduleRequestTimeout(n,s.toolName,o,s.reject)}scheduleResponseBackstop(n,o,s){let a=Math.min(s,Fr);return this.timer.setTimeout(()=>{if(s>a){let c=this.pendingRequests.get(n);if(c)c.timeout=this.scheduleResponseBackstop(n,o,s-a)}else o()},a)}scheduleRequestTimeout(n,o,s,a){return this.scheduleResponseBackstop(n,()=>{this.pendingRequests.get(n)?.removeAbortListener?.(),this.pendingRequests.delete(n),this.sendCancelFrame(n),a(new Cr({toolName:o,timeoutMs:s,origin:"DaemonClient.sendRequest",detail:`no response from the daemon within budget + grace (${s}ms + ${U}ms)`}))},s+U)}sendCancelFrame(n){let o=this.socket;if(!o||o.destroyed)return;let s=this.idGenerator.next();this.rememberCancelledRequestId(n),this.rememberCancelledRequestId(s);let a={id:s,type:"daemon_request",method:$w,params:{requestId:n},...this.handshakeFields()};try{o.write(se(a))}catch(c){e.debug(`Daemon cancel frame for ${n} not sent: ${c}`)}}rememberCancelledRequestId(n){if(this.cancelledRequestIds.add(n),this.cancelledRequestIds.size>Be){let o=this.cancelledRequestIds.values().next().value;if(o!==void 0)this.timedOutRequestAbortCleanups.get(o)?.(),this.cancelledRequestIds.delete(o)}}onNotification(n){return this.notificationHandlers.add(n),()=>{this.notificationHandlers.delete(n)}}onConnectionClosed(n){return this.connectionClosedHandlers.add(n),()=>{this.connectionClosedHandlers.delete(n)}}async subscribeToNotifications(n){await this.callDaemonMethod(zT,{},{...n,abortMode:"request"})}async getDaemonStatus(n){let o=new Ia(this.socketPath,this.connectionTimeout,this.timer,{recoveryOptions:{},clientIdentity:null});try{let s=await o.callDaemonMethod("ide/status",{},{timeoutMs:n});return nV(s,this.socketPath)}finally{await o.close()}}async callTool(n,o,s,a={}){return this.sendRequest("tools/call",{name:n,arguments:o},s,a)}async relayTaskMethod(n,o,s,{signal:a}={}){return this.sendRequest(n,o,void 0,{signal:a,tasks:s})}async readResource(n,o={},{signal:s}={}){return this.sendRequest("resources/read",{uri:n,...o},void 0,{signal:s})}async sendRequest(n,o,s,{onRequestId:a,signal:c,tasks:d}={}){if(c?.throwIfAborted(),!this.connected)try{await l(()=>this.connect(),{timer:this.timer,signal:c,label:`Daemon request ${n} connection`})}catch(E){if(E instanceof he)throw new ev(E.message,{cause:E});throw E}c?.throwIfAborted();let u=this.idGenerator.next(),m={id:u,type:"mcp_request",method:n,params:o,...s!==void 0?{progressToken:s}:{},acceptsRequestBudget:!0,...He(d),...this.handshakeFields()},p=We(m,this.connectionTimeout,this.env);m.timeoutMs=p,m.requestedTimeoutMs=VS(FA(m,this.env));let h=se(m),b=n==="tools/call"?o?.name??n:n,R=new Qy({toolName:b,origin:"DaemonClient.sendRequest"}),v=s!==void 0?new vh(this.timer.now(),p):void 0;return this.send(u,h,{entry:{toolName:b,progressToken:s,deadline:v,requestTimeoutMs:p,disconnectCause:R},signal:c,armTimeout:(E)=>this.scheduleRequestTimeout(u,b,p,E),onRegistered:()=>a?.(u),socketLostError:()=>new ev("Socket connection lost"),writeError:(E)=>new ev(`Daemon socket write failed: ${r(E)}`,{cause:E}),abortError:()=>c?.reason,destroyOnAbort:!1})}async callDaemonMethod(n,o={},s={}){let a=s.timeoutMs??this.connectionTimeout;if(!Number.isFinite(a)||a<=0)throw new he(`Daemon request ${n} has no remaining timeout`);if(s.signal?.aborted)throw new he(`Daemon request ${n} aborted`,{cause:s.signal.reason});let c=this.timer.now()+a;if(!this.connected)await this.connect(this.remainingConnectTimeout(c,a),s.signal);if(s.signal?.aborted)throw new he(`Daemon request ${n} aborted`,{cause:s.signal.reason});let d=c-this.timer.now();if(d<=0)throw new Cr({toolName:n,timeoutMs:a,origin:"DaemonClient.callDaemonMethod"});let u=this.idGenerator.next(),m=new Qy({toolName:n,origin:"DaemonClient.callDaemonMethod"}),p={id:u,type:"daemon_request",method:n,params:o,timeoutMs:d,...this.handshakeFields()};return this.send(u,se(p),{entry:{toolName:n,disconnectCause:m},signal:s.signal,armTimeout:(h,b)=>this.scheduleResponseBackstop(u,()=>{if(this.pendingRequests.delete(u),s.cancelOnTimeout!==!1)b(),this.sendCancelFrame(u);else{if(s.signal)this.timedOutRequestAbortCleanups.set(u,b);this.rememberCancelledRequestId(u)}h(new Cr({toolName:n,timeoutMs:a,origin:"DaemonClient.callDaemonMethod",detail:`no response from the daemon within budget + grace (${d}ms + ${U}ms)`}))},d+U),socketLostError:()=>new he("Socket connection lost"),writeError:(h)=>Y(h instanceof Error?h:Error(String(h))),abortError:()=>new he(`Daemon request ${n} aborted`,{cause:s.signal?.reason}),destroyOnAbort:s.abortMode!=="request"})}send(n,o,s){let a={socket:()=>this.socket,pendingRequests:this.pendingRequests,timedOutRequestAbortCleanups:this.timedOutRequestAbortCleanups,timer:this.timer,sendCancelFrame:(c)=>this.sendCancelFrame(c)};return je(a,n,o,s)}async close(){this.connected=!1,this.rejectPendingRequests(new he("Socket connection closed"),!0);let n=this.socket;if(n)await new Promise((o)=>{let s=(d)=>{if(n.off("close",a),this.timer.clearTimeout(c),d)e.warn("Daemon socket close did not complete before the bounded teardown timeout; proceeding safely");o()},a=()=>s(!1),c=this.timer.setTimeout(()=>s(!0),1000);n.once("close",a),n.destroy()}),this.socket=null;this.notificationHandlers.clear(),this.connectionClosedHandlers.clear()}}class $S extends he{code="daemon_restart_pending";retryable=!0;constructor(){super("Daemon restart is pending; retry provisionDevice after the replacement becomes ready.");this.name="DaemonRestartPendingError"}}function t5(n){return{error:{code:n.code,message:n.message,retryable:n.retryable}}}function VQ(n){let o=t5(n);return{content:[{type:"text",text:JSON.stringify(o)}],structuredContent:o,isError:!0}}var Ye="another session acquired it while this call was in flight, so the call was cancelled. Acquire the device (setActiveDevice) and retry with that session's sessionUuid, or wait for the holder to release it.";function ru(n){return{executionId:n.id,startTime:n.startTime,sessionClockStartTime:n.sessionClockStartTime}}function re(n,o){return o?.sessionPreserving===!0&&n?.survivesSessionPreservingRecovery===!0}function Se(n){return n.deviceControlCall!==!0&&(n.readOnlySessionAccess===!0||n.deviceReadCall===!0)}function be(n,o){let s=n.readDeadlineMs?.()??Number.POSITIVE_INFINITY;return o?s+(n.sessionClockOffsetMs??0):s}function Vt(n,o){if(n===void 0||n.requestCancelled===!0||n.abortController.signal.aborted)return!1;let s=be(n,!0),a=Number.isFinite(s)?s:n.sessionClockStartTime+o.undatedForMs;return o.at<=a}function Re(n,o,s){if(s===void 0)return!1;if(n===s.excludeExecutionId||re(o,s))return!0;if(s.sessionClockStartedAtOrBefore!==void 0&&(o===void 0||o.sessionClockStartTime>s.sessionClockStartedAtOrBefore))return!0;if(s.liveOnSessionClock&&!Vt(o,s.liveOnSessionClock))return!0;return s.excludeReads===!0&&o!==void 0&&Se(o)}function Xe(n){if(n===void 0)return!0;return n.startedAtOrBefore===void 0&&n.sessionClockStartedAtOrBefore===void 0&&n.liveOnSessionClock===void 0&&n.excludeExecutionId===void 0&&n.onlyToolName===void 0&&n.onlySessionUuid===void 0&&!n.excludeReads&&!n.sessionPreserving}class Ze{executions=new Map;sessionExecutions=new Map;deviceExecutions=new Map;deviceLastActivityAt=new Map;sessionUuidExecutions=new Map;autolockSessionExecutions=new Map;executionEndListeners=new Set;sessionExecutionEndListeners=new Set;timer;idGenerator;daemonRestartPrepared=!1;daemonMaintenancePrepared=!1;activeProvisionDeviceQuery;autolockSessionResolver;sessionClockOffsetProvider=()=>0;constructor(n=i,o=B){this.timer=n,this.idGenerator=o}setSessionClockOffsetProvider(n){this.sessionClockOffsetProvider=n}setActiveProvisionDeviceQuery(n){this.activeProvisionDeviceQuery=n}setAutolockSessionResolver(n){this.autolockSessionResolver=n}startExecution(n,o,s,{transportSessionId:a,unresolvedAutolockMcpSessionId:c}={}){if(this.isDaemonRestartPrepared()||this.isDaemonMaintenancePrepared())throw new $S;let d=this.idGenerator.next(),u=this.timer.now(),m={id:d,toolName:n,sessionId:o,transportSessionId:a,sessionUuid:s,provisionalAutolockSessionUuid:c?this.autolockSessionResolver?.autolockSessionForMcpSession(c):void 0,startTime:u,sessionClockStartTime:u+this.sessionClockOffsetProvider(u),abortController:new AbortController};if(this.executions.set(d,m),o)this.registerSessionExecution(o,d);if(a&&a!==o)this.registerSessionExecution(a,d);if(s){let p=this.sessionUuidExecutions.get(s)??new Set;p.add(d),this.sessionUuidExecutions.set(s,p)}return m}prepareForDaemonRestart(){return this.prepareForDaemonRestartAdmission(!1)}prepareForAdmittedDaemonRestart(){if(!this.daemonMaintenancePrepared)return"restart_pending";return this.prepareForDaemonRestartAdmission(!0)}prepareForDaemonRestartAdmission(n){if(this.daemonRestartPrepared)return"restart_pending";if(this.daemonMaintenancePrepared&&!n)return"restart_pending";if(this.executions.size>0||this.activeProvisionDeviceQuery?.hasActiveProvisionDeviceOperation())return"active_operations";return this.daemonRestartPrepared=!0,"accepted"}clearDaemonRestartPreparation(){this.daemonRestartPrepared=!1}prepareForDaemonMaintenance(n){if(this.daemonMaintenancePrepared)return"maintenance_pending";if(n>0)return"active_sessions";if(this.executions.size>0||this.daemonRestartPrepared)return"active_operations";return this.daemonMaintenancePrepared=!0,"accepted"}clearDaemonMaintenancePreparation(){this.daemonMaintenancePrepared=!1}isDaemonRestartPrepared(){return this.daemonRestartPrepared}isDaemonMaintenancePrepared(){return this.daemonMaintenancePrepared}endExecution(n){let o=this.executions.get(n);if(!o)return;if(this.executions.delete(n),o.unsubscribeDeadlineExtensions?.(),this.unregisterDeviceExecutions(n,o.deviceIds),o.sessionId)this.unregisterSessionExecution(o.sessionId,n);if(o.transportSessionId&&o.transportSessionId!==o.sessionId)this.unregisterSessionExecution(o.transportSessionId,n);if(o.sessionUuid){let s=this.sessionUuidExecutions.get(o.sessionUuid);if(s?.delete(n),s?.size===0)this.sessionUuidExecutions.delete(o.sessionUuid)}if(o.resolvedAutolockSessionUuid)this.unregisterAutolockSessionExecution(o.resolvedAutolockSessionUuid,n);this.notifySessionExecutionEnded(o);for(let s of this.executionEndListeners)s()}onSessionExecutionEnded(n){return this.sessionExecutionEndListeners.add(n),()=>{this.sessionExecutionEndListeners.delete(n)}}getSessionClockStartTime(n){return this.executions.get(n)?.sessionClockStartTime}setExecutionDeadline(n,o,s){let a=this.executions.get(n);if(a)a.readDeadlineMs=o,a.sessionClockOffsetMs=this.sessionClockOffsetProvider(),a.unsubscribeDeadlineExtensions?.(),a.unsubscribeDeadlineExtensions=s?.(()=>{a.sessionClockOffsetMs=this.sessionClockOffsetProvider()})}getLatestSessionExecutionDeadlineMs(n,o={}){let s=this.sessionUuidExecutions.get(n),a=this.autolockSessionExecutions.get(n),c;for(let d of this.executions.values())if((d.provisionalAutolockSessionUuid===n||s?.has(d.id)||a?.has(d.id))&&!(o.excludeReads&&Se(d))){let m=be(d,o.onSessionClock);c=c===void 0?m:Math.max(c,m)}return c}markSessionAdmitted(n){let o=this.executions.get(n);if(o)o.sessionAdmitted=!0}unmarkSessionAdmitted(n){let o=this.executions.get(n);if(o)o.sessionAdmitted=!1}markSessionlessDeviceUse(n,o){let s=this.executions.get(n);if(s)s.sessionlessDeviceUse??=new Set,s.sessionlessDeviceUse.add(o),s.sessionlessControlUse??=new Set,s.sessionlessControlUse.add(o)}unmarkSessionlessDeviceUse(n,o){let s=this.executions.get(n);if(s?.sessionlessControlUse?.delete(o),!s?.sessionlessReadReadiness?.has(o))s?.sessionlessDeviceUse?.delete(o)}markSessionlessReadReadiness(n,o,s){let a=this.executions.get(n);if(!a)return;a.sessionlessDeviceUse??=new Set,a.sessionlessDeviceUse.add(o),a.sessionlessReadReadiness??=new Map;let c=a.sessionlessReadReadiness.get(o)??new Set;c.add(s),a.sessionlessReadReadiness.set(o,c)}unmarkSessionlessReadReadiness(n,o,s){let a=this.executions.get(n);if(!a)return;let c=a.sessionlessReadReadiness?.get(o);if(c?.delete(s),!c?.size){if(a.sessionlessReadReadiness?.delete(o),!a.sessionlessControlUse?.has(o))a.sessionlessDeviceUse?.delete(o)}}cancelSessionlessDeviceUse(n,o={}){let s=0;for(let a of this.executions.values()){if(a.id===o.excludeExecutionId||!a.sessionlessDeviceUse?.has(n)||a.abortController.signal.aborted)continue;let c=new ut(a.toolName,n,void 0,{remedy:Ye});if(a.sessionlessControlUse?.has(n))this.abortExecution(a,c);else if(!this.cancelReadReadiness(a,n,c))continue;s++,e.info(`[ExecutionTracker] Cancelled sessionless execution ${a.id} on ${n}: a session acquired the device (tool=${a.toolName})`)}return s}cancelReadReadiness(n,o,s){let a=[...n.sessionlessReadReadiness?.get(o)??[]].filter((c)=>!c.signal.aborted);for(let c of a)c.abort(s);return a.length>0}markDeviceReadCall(n,o){let s=this.executions.get(n);if(s&&s.toolName===o&&!s.deviceControlCall)s.deviceReadCall=!0}markDeviceControlCall(n){let o=this.executions.get(n);if(o)o.deviceControlCall=!0,o.deviceReadCall=!1}getAdmittedSessionUse(n){let o=this.executions.get(n);if(!o?.sessionAdmitted||o.deviceReadCall||o.readOnlySessionAccess)return;return o.sessionUuid??o.resolvedAutolockSessionUuid}markReadOnlySessionAccess(n){let o=this.executions.get(n);if(o)o.readOnlySessionAccess=!0}markRequestCancelled(n){let o=this.executions.get(n);if(o)o.requestCancelled=!0}notifySessionExecutionEnded(n){let o=[...new Set([n.sessionUuid,n.resolvedAutolockSessionUuid,n.provisionalAutolockSessionUuid].filter((a)=>typeof a==="string"&&a.length>0))];if(o.length===0)return;let s=n.sessionAdmitted===!0&&!n.readOnlySessionAccess;for(let a of this.sessionExecutionEndListeners)try{a(o,{admitted:s,toolName:n.toolName})}catch(c){e.warn(`[ExecutionTracker] Session execution-end listener failed: ${r(c)}`)}}getActiveExecutionCount(){return this.executions.size}getActiveDeviceSessionExecutionCount(n){return new Set([...this.sessionUuidExecutions.get(n)??[],...this.autolockSessionExecutions.get(n)??[],...this.unresolvedAutolockExecutionIds(n)]).size}async cancelSessionExecutions(n,o="unspecified"){return this.cancelExecutionsForKey(n,this.sessionExecutions,"sessionId",{cancelReason:o})}async cancelToolExecutions(n,o="unspecified"){let s=Array.from(this.executions.values()).filter((a)=>a.toolName===n).map((a)=>a.id);return this.cancelExecutionIds(s,"toolName",n,{cancelReason:o})}async waitForToolExecutionsToEnd(n,o){return await this.waitUntilNoneActive(()=>this.hasActiveToolExecutionGlobal(n),o)}async waitForSessionExecutionsToEnd(n,o){return await this.waitUntilNoneActive(()=>this.hasActiveSessionExecutions(n),o)}async waitUntilNoneActive(n,o){if(!n())return!0;return await new Promise((s)=>{let a=!1,c={},d=(m)=>{if(a)return;if(a=!0,this.executionEndListeners.delete(u),c.handle!==void 0)this.timer.clearTimeout(c.handle);s(m)},u=()=>{if(!n())d(!0)};this.executionEndListeners.add(u),c.handle=this.timer.setTimeout(()=>d(!1),o),u()})}async cancelSessionUuidExecutions(n,o="unspecified",s={}){return this.cancelExecutionsForKey(n,this.sessionUuidExecutions,"sessionUuid",{cancelReason:o,...s})}bindDeviceExecution(n,o,s={}){let a=this.executions.get(n);if(!a)return;let c=a.revokedDeviceBindings?.get(o);if(c){if(s.skipRevoked)return;throw new t(c.message,{cause:c})}a.deviceIds??=new Set,a.deviceIds.add(o);let d=this.deviceExecutions.get(o)??new Set;d.add(n),this.deviceExecutions.set(o,d),this.deviceLastActivityAt.set(o,this.timer.now())}getActiveDeviceExecutionCount(n){return this.deviceExecutions.get(n)?.size??0}getDeviceIdleForMs(n){let o=this.deviceLastActivityAt.get(n);return o===void 0?null:Math.max(0,this.timer.now()-o)}async cancelDeviceExecutions(n,o="unspecified",s={}){if(s.onlySessionUuid!==void 0)this.revokeSessionDeviceBindings(n,o,s);return this.cancelExecutionIds(this.deviceExecutions.get(n),"deviceId",n,{cancelReason:o,...s})}revokeSessionDeviceBindings(n,o,s){let a=o instanceof Error?o:new t(o);for(let c of this.executions.values())if(c.id!==s.excludeExecutionId&&!re(c,s)&&(s.onlyToolName===void 0||c.toolName===s.onlyToolName)&&(s.onlyToolName===void 0||c.deviceIds?.has(n))&&this.isInCancellationScope(c,s))c.revokedDeviceBindings??=new Map,c.revokedDeviceBindings.set(n,a)}hasActiveDeviceExecutions(n,o){return this.hasActiveExecutionsForKey(this.deviceExecutions,n,o)}async waitForDeviceExecutionsToEnd(n,o,s){return this.waitForExecutionsToEnd(()=>this.hasActiveDeviceExecutions(n,s),o)}async cancelDeviceSessionExecutions(n,o="unspecified",s={}){let a=new Set([...this.sessionUuidExecutions.get(n)??[],...this.autolockSessionExecutions.get(n)??[],...this.unresolvedAutolockExecutionIds(n)]);return this.cancelExecutionIds(a,"deviceSessionUuid",n,{cancelReason:o,...s})}async waitForDeviceSessionExecutionsToEnd(n,o,s){return this.waitForExecutionsToEnd(()=>this.hasActiveDeviceSessionExecutions(n,s),o)}async waitForExecutionsToEnd(n,o){if(!n())return!0;return await new Promise((s)=>{let a=!1,c={},d=(m)=>{if(a)return;if(a=!0,this.executionEndListeners.delete(u),c.handle!==void 0)this.timer.clearTimeout(c.handle);s(m)},u=()=>{if(!n())d(!0)};this.executionEndListeners.add(u),c.handle=this.timer.setTimeout(()=>d(!1),o),u()})}hasActiveDeviceSessionExecutions(n,o){return this.hasActiveSessionUuidExecutions(n,o)||this.hasActiveAutolockSessionExecutions(n,o)}hasActiveSessionUuidExecutions(n,o){return this.hasActiveExecutionsForKey(this.sessionUuidExecutions,n,o)}hasActiveSessionExecutions(n,o){return this.hasActiveExecutionsForKey(this.sessionExecutions,n,o)}setResolvedAutolockSessionUuid(n,o){let s=this.executions.get(n);if(!s)return;let a=s.provisionalAutolockSessionUuid;if(s.provisionalAutolockSessionUuid=void 0,s.resolvedAutolockSessionUuid===o){if(a&&a!==o)for(let c of this.executionEndListeners)c();return}if(s.resolvedAutolockSessionUuid)this.unregisterAutolockSessionExecution(s.resolvedAutolockSessionUuid,n);if(s.resolvedAutolockSessionUuid=o,o){let c=this.autolockSessionExecutions.get(o)??new Set;c.add(n),this.autolockSessionExecutions.set(o,c)}for(let c of this.executionEndListeners)c()}hasActiveAutolockSessionExecutions(n,o){return this.hasActiveExecutionsForKey(this.autolockSessionExecutions,n,o)||this.unresolvedAutolockExecutionIds(n).some((s)=>{let a=this.executions.get(s);return!Re(s,a,o)&&(o?.onlyToolName===void 0||a?.toolName===o.onlyToolName)&&(o?.startedAtOrBefore===void 0||a!==void 0&&a.startTime<=o.startedAtOrBefore)})}unresolvedAutolockExecutionIds(n){let o=[];for(let s of this.executions.values())if(s.provisionalAutolockSessionUuid===n)o.push(s.id);return o}hasActiveToolExecution(n,o){if(o.scope==="global")return this.hasActiveToolExecutionGlobal(n);if(o.sessionUuid)return this.hasActiveToolExecutionForKey(n,this.sessionUuidExecutions,o.sessionUuid);if(o.sessionId)return this.hasActiveToolExecutionForKey(n,this.sessionExecutions,o.sessionId);return this.hasActiveToolExecutionGlobal(n)}hasActiveToolExecutionGlobal(n){for(let o of this.executions.values())if(o.toolName===n)return!0;return!1}unregisterDeviceExecutions(n,o){for(let s of o??[]){this.deviceLastActivityAt.set(s,this.timer.now());let a=this.deviceExecutions.get(s);if(a?.delete(n),a?.size===0)this.deviceExecutions.delete(s)}}registerSessionExecution(n,o){let s=this.sessionExecutions.get(n)??new Set;s.add(o),this.sessionExecutions.set(n,s)}unregisterSessionExecution(n,o){let s=this.sessionExecutions.get(n);if(s?.delete(o),s?.size===0)this.sessionExecutions.delete(n)}unregisterAutolockSessionExecution(n,o){let s=this.autolockSessionExecutions.get(n);if(s?.delete(o),s?.size===0)this.autolockSessionExecutions.delete(n)}hasActiveExecutionsForKey(n,o,s){let a=n.get(o);if(!a||a.size===0)return!1;if(Xe(s))return!0;return Array.from(a).some((c)=>{let d=this.executions.get(c);return d!==void 0&&!Re(c,d,s)&&(s?.onlyToolName===void 0||d.toolName===s.onlyToolName)&&this.belongsToSessionFilter(d,s?.onlySessionUuid)&&(s?.startedAtOrBefore===void 0||d.startTime<=s.startedAtOrBefore)})}isInCancellationScope(n,o){return this.belongsToSessionFilter(n,o.onlySessionUuid)||o.includeExecutionIds?.includes(n.id)===!0}belongsToSessionFilter(n,o){return o===void 0||n.sessionUuid===o||n.resolvedAutolockSessionUuid===o||n.provisionalAutolockSessionUuid===o}hasActiveToolExecutionForKey(n,o,s){let a=o.get(s);if(!a||a.size===0)return!1;for(let c of a)if(this.executions.get(c)?.toolName===n)return!0;return!1}async cancelExecutionsForKey(n,o,s,{cancelReason:a="unspecified",...c}={}){return this.cancelExecutionIds(o.get(n),s,n,{cancelReason:a,...c})}async cancelExecutionIds(n,o,s,{cancelReason:a="unspecified",...c}={}){if(!n)return 0;let d=0;for(let u of n){let m=this.executions.get(u);if(!m)continue;if(m.id===c.excludeExecutionId||re(m,c)||c.onlyToolName!==void 0&&m.toolName!==c.onlyToolName||!this.isInCancellationScope(m,c))continue;this.abortExecution(m,a),d++,e.info(`[ExecutionTracker] Cancelled execution ${u} for ${o}=${s} (tool=${m.toolName}, reason=${r(a)})`)}return d}abortExecution(n,o){if(gg(o)){let s=Te(o)??Error(o);if(n.cancelReason=s,bt(s))$v(n.abortController.signal,s);n.abortController.abort(s)}else if(o instanceof Error)n.cancelReason=o,n.abortController.abort(o);else n.abortController.abort()}}var G=new Ze;
|
|
17
|
+
export{Xq,EQ,z4,j4,l_,IQ,K4,_Q,xQ,G4,OA,Ho,Qd,eo,Ds,Zq,Y4,CQ,u_,x0,C0,p_,J4,DQ,he,el,uh,Qq,OQ,Xs,Xu,eV,Cr,X4,MQ,NQ,Xy,Z4,Zy,Q4,ph,D0,m_,FQ,LQ,tV,O0,e5,BQ,$Q,UQ,HQ,rV,qQ,f_,nV,Qy,ev,Ia,$S,t5,VQ,ru,G};
|
|
18
|
+
|
|
19
|
+
//# debugId=5590663F89FB9D4764756E2164756E21
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{SP,i,Qt,Li,_d,Q,l,at,e}from"./chunk-z637nqg8.js";import{f}from"./chunk-58wzr3mt.js";import{xl}from"./chunk-yf7ympyz.js";import{Zr,mi,rr,UI,fi,Ql,$o,ac,v7,b7,cc,p4,Mn,JN,Kd,RS,PS,ka,AS,Gd,vq,ZN,g4,Sq,D7,y4,O7,Ku,zI,Rq,b4,M7,Pq,sm,N7,F7,L7,_i,S4,QN,Wy,dc,am,Aq,B7,i_,o_,v0,N4,uQ,P0,a_,Vc,A0,T0,Yu,k0}from"./chunk-hrfytkxh.js";import{fc,bh,Sh,$A,U0,WS,H0,Os,wh,o5}from"./chunk-0n6swkwg.js";import{Rc,xv,_w,ti,xw,ze,ls,cg,Lt,br,QW,Bw,Lv,sB,us,rD,aB,ug,nD,iD,up,kre,tz,dB,Hw,jT,lB,_re,KT,uB,Je,Ko,lD,Vv,zv,xo,ut,$s,st,vl,Ki,bl,Et,ii,XB,Pi,sf,_R,Hs,af,kk,MY,ZB,kj,Ij,Sb,_j,gie,qk,XD,wb,Wk,O,E}from"./chunk-r5bxavdx.js";import{Ho,Qd,eo,Ds,he,Cr,Ia,G}from"./chunk-64j0majr.js";import{y,T,ee,gr,g,ne,A,O9}from"./chunk-4hw3665t.js";import{um,F0}from"./chunk-2f9rkmhx.js";import{ww}from"./chunk-0qsy1qsx.js";import{Xn,Vd,Kl,DI,OI,oq,Sr,oc,Qf,WN}from"./chunk-0jrrsnc9.js";import{Jy,d_,lm}from"./chunk-26k317v5.js";import{Nc}from"./chunk-6wt9rgjf.js";import{r,t,u}from"./chunk-rbpdk7m0.js";async function n7(s,n,o,a=G){let c=await a.cancelSessionUuidExecutions(s,n);return o(c)}function EI(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 uA(s,n,o,a=G){zs(a,o).catch((c)=>{e.warn(`Failed to cancel executions of plan-released session ${o.sessionId}: ${r(c)}`,c)}),await xs({manager:s,pool:n},o.deviceId,o.sessionId,{reason:ce})}function My(s,n,o){return s.releaseDevice(n,o)}function PN(s){return{releaseDevice:(n,o)=>s().releaseDevice(n,o)}}async function xs({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 YH(s,n,o){let a=s.forceStuckRelease(o);if(a)await n.releaseDevice(a.deviceId,o)}function em(s,n){return s?.resolveAndroidCanonicalId?.(n)??n}async function AN(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:em(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)&&Ko(c.deviceId)&&!a.has(c.deviceId))}function et(s,n,o){return s?.androidTransportMayAliasDevice?.(n,o)!==!1}function pA(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 Y6(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 TN(s,n,o,a){let c=await Y6(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)=>vl(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 mi(s,n,a.entry);return new ut(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 kN=2,EN=["focused_trace","vendor_documented","cdd_derived","inferred","experimental"],i7=["keyboard","kill","display"],J6={keyboard:"functionalityBreak",kill:"functionalityBreak",display:"functionalityBreak"};function de(s){return F0.find((n)=>n.id===s)?.note??s}var II={"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 Xf=ZN,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 I(s){return{status:"inferred",note:`${s} global builds ship Gboard as the default keyboard. ${tt}`}}function P(s){let n=um[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."},tm={"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:P("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:I("Xiaomi"),kill:P("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:I("OnePlus"),kill:P("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:I("OPPO"),kill:{...P("recents-swipe-force-stop"),note:`ColorOS is reported to force-stop apps swiped from recents. ${um["recents-swipe-force-stop"].evidenceNote}`,source:Qs},display:ue}},motorola:{id:"motorola",version:1,displayName:"Motorola",keyboardProfileId:"gboard",killProfile:"motorola-adaptive",nonEmulatable:[],evidence:{keyboard:I("Motorola"),kill:P("motorola-adaptive")}},"huawei-emui":{id:"huawei-emui",version:1,displayName:"Huawei EMUI",keyboardProfileId:"gboard",killProfile:"huawei-powergenie",nonEmulatable:["oem-systemui"],evidence:{keyboard:I("Huawei"),kill:P("huawei-powergenie")}},"vivo-funtouch":{id:"vivo-funtouch",version:1,displayName:"Vivo Funtouch OS",keyboardProfileId:"gboard",killProfile:"vivo-autostart",nonEmulatable:["oem-systemui"],evidence:{keyboard:I("Vivo"),kill:P("vivo-autostart")}},"realme-ui":{id:"realme-ui",version:1,displayName:"realme UI",keyboardProfileId:"gboard",killProfile:"realme-power-saver",nonEmulatable:["oem-systemui"],evidence:{keyboard:I("realme"),kill:P("realme-power-saver")}},"meizu-flyme":{id:"meizu-flyme",version:1,displayName:"Meizu Flyme",keyboardProfileId:"gboard",killProfile:"meizu-flyme-background",nonEmulatable:["oem-systemui"],evidence:{keyboard:I("Meizu"),kill:P("meizu-flyme-background")}},"asus-zenui":{id:"asus-zenui",version:1,displayName:"Asus ZenUI",keyboardProfileId:"gboard",killProfile:"asus-power-master",nonEmulatable:["oem-systemui"],evidence:{keyboard:I("Asus"),kill:P("asus-power-master")}},"sony-xperia":{id:"sony-xperia",version:1,displayName:"Sony Xperia",keyboardProfileId:"gboard",killProfile:"sony-stamina",nonEmulatable:["oem-systemui"],evidence:{keyboard:I("Sony"),kill:P("sony-stamina")}},"tecno-hios":{id:"tecno-hios",version:1,displayName:"Tecno HiOS",keyboardProfileId:"gboard",killProfile:"tecno-app-halt",nonEmulatable:["oem-systemui"],evidence:{keyboard:I("Tecno"),kill:P("tecno-app-halt")}}};function mA(s){return["keyboard",...s.killProfile?["kill"]:[],...s.displayProfile?["display"]:[]]}function X6(s,n,o={}){let a={name:n.deviceId,platform:"android",deviceId:n.deviceId},c=Je(async()=>gie(n,(o.clientFactory??Ij())(a),{timer:o.timer??i,forgetRememberedUnlock:o.forgetRememberedUnlock??_j})).catch((d)=>{let m=kj(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??Sb).noteRestore(n.sessionId,c),s.registerPendingDeviceCleanup(n.deviceId,c,{name:"clear session screen lock",leftover:"the released session's lock-screen credential"}),c}function o7(s,n={}){let o=n.registry??Sb,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}X6(s,p,n)};s.onSessionRelease((c,d,m,p)=>{if(p?.upgradeOnly)return;a(c,d,p)}),s.onSessionDeviceUnbound(a)}var nt=Symbol("screen lock report wait");async function IN(s,n={}){let o=(n.registry??Sb).restoreReport(s);if(!o)return{};return{screenLockRestore:await l(o,{timer:n.timer??i,timeoutMs:Sr,unref:!0,label:"screen lock restore report",timeoutError:()=>nt}).catch((c)=>{if(c!==nt)throw c;return{status:"pending"}})}}var rt=2,Xs=1000,Zs=3000;function ot(s){return XD.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 JH(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 JH(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 Wk(n,a,{timer:o.timer,budgetMs:Zs,backoff:o.dozeBackoff??Q({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])=>!ot(d)),c=o.filter((d)=>ot(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:()=>JH(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<=rt;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<rt)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 it(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 Z6(s,n,o={}){let a={name:n.deviceId,platform:"android",deviceId:n.deviceId},c=Je(async()=>it(n,(o.clientFactory??qk())(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??wb).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 s7(s,n={}){let o=n.registry??wb,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}Z6(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 _N(s,n={}){let o=(n.registry??wb).restoreReport(s);if(!o)return{};return{powerRestore:await l(o,{timer:n.timer??i,timeoutMs:Sr,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(Vd(s.livenessPolicy,n))return null;return Qf(s)}function j(s,n,o){let a=gn(s,o);if(a===null||n===void 0)return a;return Math.max(a,oq({vetoedSince:a,latestDeadlineMs:n.latestDeadlineMs}))}function me(s,n,o,{toWall:a=(d)=>d,leasePhase:c}={}){let d=j(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 ct(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 dt,basename as vn,dirname as wn}from"path";var a7={listNames:Qt,lstat:hn,realpath:Sn,removeDirectory:(s)=>yn(s,{recursive:!0})};function gt(s){if(!cc(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()===lm||d_(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){Jy("AVD name",s);let o=await n.filesystem.realpath(n.resolver.getAvdHome()),a=await n.resolver.resolveAvdDirectory(s),c=dt(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=dt(c,xw);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{Jy("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");Jy("snapshot name",v);let k=ft(p,v);if(!Nc(p,k,{allowEqual:!1}))throw Error("Snapshot path escapes the snapshots root");await pe(k,a.filesystem),await a.filesystem.listNames(k),await a.filesystem.removeDirectory(k),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=Kd;constructor(){super("Session broker snapshot maintenance is running; retry shortly");this.name="SessionBrokerMaintenanceError"}}function fe(s,n){let o=Promise.resolve().then(n).finally(()=>s.delete(o));return s.add(o),o}class ge{broker;running=!1;activeRun;constructor(s){this.broker=s}get inProgress(){return this.running}async run(s){if(this.broker.isStopping())throw new Gd;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 Gd;return await s()}finally{this.running=!1,this.activeRun=void 0}}}function St(s,n){if(s.platform!=="android"||n.platform!=="android")return(d)=>vq(s,JN(d)).kind==="match";let o=s.effective.hardware;if(o.kind==="archetype"&&o.archetype==="foldable")AS(Sq(s,n));let a=D7(s,n),c=a.ok?a.value:void 0;return(d)=>{let m=JN(d);return vq(s,m).kind==="match"&&m.platform==="android"&&m.memoryMb===c}}function Z(s){return s.device.platform==="android"?s.device.deviceProfile:void 0}function yt(s){if(!s?.requires?.length)return;let n=tm[s.manufacturerProfile],o=s.requires.filter((a)=>n.nonEmulatable.includes(a));if(o.length===0)return;throw new ka({code:"requires_real_device",message:`Manufacturer profile ${n.id} cannot emulate ${o.join(", ")} (${o.map((a)=>II[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 O7(s,n,{fingerprint:o,signal:a,exportIdentity:c});let d=await s.catalog(n.device.platform,a),m=s.defaults(n.device.platform),p=AS(g4(n.device,m,d));return yt(Z(n)),{requestId:n.requestId,fingerprint:o,parameters:n,owner:s.owner,export:c,limits:s.limits,matches:St(p,m),resolveCreation:()=>AS(y4(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 te 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(dc(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(dc(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=Mn(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 se(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,k)=>{if(k!==void 0&&Number.isFinite(k)&&k>=0)(v[b]??=[]).push(k)};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,k]of Object.entries(v.phases))w(S,b,k);w(S,"totalMs",v.totalMs)}let R=(v)=>Object.fromEntries(Object.entries(v).map(([b,k])=>(k.sort((Ws,Ks)=>Ws-Ks),[b,{count:k.length,p50:ii(k,50),p90:ii(k,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(Mn(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(),N7(p instanceof _i?p.cause:p,o,c)}}needsResetBootSlot(s){return Mn(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)&&Mn(d).platform!=="android");if(n.length===0)return;let o=await se({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(Mn(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??xo),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 ka({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 W=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,W)):n??W}async function Rt(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 Q6=500;class e4{options;releases=new Map;preparations=new Map;preparationOwners=new Map;stopping=!1;poolOperations=new Set;snapshotCleanup=new ge({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 S4(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 se(this.options.store,()=>this.now(),s,n)}async drainIdlePool(){if(this.stopping)throw new Gd;if(this.snapshotCleanup.inProgress)throw new B;return fe(this.poolOperations,()=>this.destructions.drainIdlePool())}async cleanupAvdSnapshots(s){return this.snapshotCleanup.run(s)}async expireIdlePool(){if(this.stopping||this.snapshotCleanup.inProgress)return{resources:[]};return fe(this.poolOperations,()=>this.idleExpiry.sweep())}prepare(s,n,o,a){if(this.stopping)return Promise.reject(new Gd);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=zI(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 Wy)throw p;if(p instanceof te)throw e.warn(p.message,p.cause),p;if(!c&&b4(o))throw e.debug(`Session request ${s.requestId} refused while stopping`,p),new Gd;return e.warn(`Session request ${s.requestId} preparation failed: ${r(p)}`,p),this.handlePreparationFailure(s,n,m,{admitted:c,error:M7(p,o),exportIdentity:a})}finally{this.finishPreparation(s.requestId)}}async handlePreparationFailure(s,n,o,{admitted:a,error:c,exportIdentity:d}){let m=Rq(c);if(a)return this.failAdmittedPreparation(s,m);if(c instanceof Zr)return Pq(s,m);let p=await this.options.store.getRequest(s.requestId);if(p?.errorCode===Ku&&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),Pq(s,Rq(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 L7(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===Ku&&this.consumerOwns(s,c);if(s.fingerprint!==a&&!p)return Pq(o,Rq(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(PS(R)!=="retryable")throw R;return e.warn(`Device eviction remains pending: ${r(R)}`,R),!1}))throw new ka({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:Z(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 te(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 Gd;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"&&sm(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 Wy;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===zI(s.parameters,n)}release(s,n,o={}){if(n===am&&!this.releases.has(s))return this.releaseAfterOwnerExit(s);return Rt(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,Aq,{errorCode:am});return e.info(`Session ${s} lost its execution owner; request ${n.requestId} is terminal (${am})`),{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)=>sm(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 Gd);let s=await this.options.store.listRecoverableRequests();await Promise.allSettled(s.filter((n)=>sm(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)=>sm(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===Ku&&n.sessionId)await this.drainAbandonedSession(n.sessionId);o.throwIfAborted(),await this.tryCleanup(dc(s),o)}async recoverOneRequest(s){if(sm(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,Q6,this.options.exportRetentionMs??QN)}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(dc(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 F7(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),bt=g({prepareId:y().min(1).max(256),requestDigest:y().min(1).max(256)}).strict(),In=bt.extend({livenessOwnerToken:re}).strict(),Tn=g({config:gr(),livenessOwnerToken:re,export:bt.optional()}).strict(),kt=g({requestId:y().min(1),livenessOwnerToken:re}).strict(),Cn=kt,xn=g({sessionId:y().uuid(),livenessOwnerToken:re,reason:ne(am).optional(),replyBudgetMs:O9((s)=>typeof s==="number"&&!Number.isFinite(s)?void 0:s,T().transform((s)=>Math.max(0,Math.min(s,W))).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=N4(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 Dt(s,n,!1)}async function Nn(s,n){return Dt(s,n,!0)}async function Dt(s,n,o){let a=n.getSessionBrokerService?.();if(!a)return x(n);let c=In.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 RS||s instanceof Gd||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 Wy))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=kt.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 Pt(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:Kd}:{}}}var At=[["daemon/sessionBrokerStats",async(s,n)=>{let o=n.getSessionBrokerService?.();if(!o)return x(n);let a=g({windowMs:T().finite().min(0).max(N).optional(),limit:T().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=_w({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(!g({}).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=_w({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(!g({}).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 xN(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 c7(s){return s.sessionId!==null||s.activeExecutions>0||s.inFlightRequests>0||s.streaming}function XH(s){return{sessionForDevice:s,activeExecutionCount:(n)=>G.getActiveDeviceExecutionCount(n),toolIdleForMs:(n)=>G.getDeviceIdleForMs(n),hasStreamSubscriber:(n)=>Et()?.hasSubscriberForDevice(n)??!1,clientActivity:(n)=>E.getForwardLeaseActivity(n)}}function Ot(){return{idleMs:lB(),release:async(s)=>{if(!E.getForwardLeaseHeldDeviceIds().includes(s))return;await E.releaseIdleForwardLease(s)}}}function M(s,n){return s.sessionClockToReportedWall?.(n)??s.sessionClockToWall?.(n)??n}async function oe(s,n,o){return De(n,await z(s,n),o)}function De(s,n,o){return{success:!1,error:`Session not found: ${s}`,code:fc,...wh(n.releaseReason,n.idleTimeoutMs),...o!==void 0?{daemonInstance:o}:{}}}async function z(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 t4{timer;heartbeatTimeoutMs;onObserverGone;sessions=new Map;disposed=!1;sweepHandle=null;sweepAtMs=Number.POSITIVE_INFINITY;clock;stallProbe;constructor(s=i,n=oc()+ls,o){this.timer=s;this.heartbeatTimeoutMs=n;this.onObserverGone=o;this.clock=new SP(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&&!DI(d.lastHeartbeat,this.heartbeatTimeoutMs,a-o))continue;let m=d.expiresAtMs-this.heartbeatTimeoutMs;d.expiresAtMs=OI(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=g({sessionId:y().max(Tt).uuid(),clientName:y().max(Mt).trim().min(1),sessionBroker:g({requestId:y().min(1),livenessOwnerToken:y().min(1)}).strict().optional()});function Kn(s,n){if(s&&!s.sessionUuids.has(n)){let o=new Rc(Bw,"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,Lv)===!1?{success:!1,error:`Session ${n} release is still in progress after ${Lv}ms; retry registration`}:void 0}async function Gn(s,n){let o=_t(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 Yn(s,n);return Bt(n,c,a!==void 0)}function _t(s,n){return s.getTerminalReleaseSnapshot?.(n)??s.peekTerminalAnswerForEndedSession?.(n)?.release}function Bt(s,n,o=!1){if(!n?.terminal||!o&&!UI(n.releaseReason))return;let{releaseReason:a,ownerPid:c,cliIdleTimeoutMs:d}=n;return{success:!1,code:$o,retryable:!1,nextAction:ti,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,...fi(a),...Ql(a,d),...c===void 0?{}:{ownerPid:c}},...wh(a,d)}}async function Yn(s,n){let{releaseReason:o,idleTimeoutMs:a}=await z(s,n);return o===void 0?void 0:{releaseReason:o,terminal:rr(o),...a===void 0?{}:{cliIdleTimeoutMs:a}}}function Ct(s,n,o){let a=bl(s,n);if(!a)return;return s.recordSessionClientName?.(n,o),{success:!0,result:{accepted:!0,heartbeatTimeoutMs:a.heartbeatTimeoutMs,expiresAtMs:M(s,a.lastHeartbeat+a.heartbeatTimeoutMs)}}}function xt(s,n,o){return s.terminalAnswerForEndedSession?.(n),o}async function Nt(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 Qn(n,c.data,o);if(p)return p;let h=n.getSessionManager(),S=await zn(h,d);if(S)return S;let w=Ct(h,d,m);if(w)return w;let R=await Gn(h,d);if(R)return xt(h,d,R);let v=Ct(h,d,m);if(v)return v;let b=Bt(d,_t(h,d));if(b)return xt(h,d,b);return Jn(n.getObserverSessionRegistry?.(),d,m)}function Jn(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 Qn(s,n,o){let{sessionId:a,sessionBroker:c}=n;if(c){let m=await Pt(s,a,c,o.socketSessionId);if(m)return m}let d=Kn(s.getBrokerConnectionScopes?.().get(o.socketSessionId),a);if(d)return d;return}var Zn=`${process.pid}:${performance.timeOrigin}`;async function Ft(s,n){let o=g({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:fc,error:`Session not found: ${a}`};if(d==="not-owner"||d===void 0)return{success:!1,code:$A,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=g({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&&!Ki(c,m.sessionId,m)).map((m)=>({sessionId:m.sessionId,deviceId:m.assignedDevice,platform:m.platform,lastUsedAt:M(c,m.lastUsedAt)}))}}}function ZH(s){return s.livenessOwnerToken!==void 0||!!s.livenessOwnershipClaims?.size}async function QH(s,n,o,a){if(a!==void 0)s.creditOwnerHeartbeatDuringRelease?.(o,a);if(n?.heartbeat(o))return{kind:"observer"};return{kind:"notFound",recorded:await z(s,o)}}async function $t(s,n){let o=er(s),a=o?.sessionId;if(!a)return{success:!1,error:"sessionId parameter required"};let c=n.getDaemonInstance?.()??Zn,d=ar(o?.expectedDaemonInstance,c,a);if(d)return d;let m=mr(o,c),p=n.getSessionManager(),h=bl(p,a);if(!h||Ki(p,a,h))return tr(n,p,a,{params:o,report:m});return nr({manager:p,session:h,sessionId:a,params:o,report:m})}function er(s){return s.params}async function tr(s,n,o,{params:a,report:c}){let d=await QH(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 sr(s){return ie(s.params?.livenessOwnerKind,s.session)??(Ht(s.params?.livenessOwnerKind,s.session)?Ut(s.sessionId):void 0)}async function nr(s){let{manager:n,sessionId:o,report:a}=s,c=sr(s);if(c)return c;let d=pr(s.params),m=s.params?.claimLivenessOwnership===!0;if(!d&&ZH(s.session))return{success:!0,result:{sessionId:o}};if(d){if(n.hasLivenessOwnership?.(o,d))n.recordHeartbeat?.(o);let p=await dr(n,o,d,m),h=or(s,d,p);if(h)return h;if(!m)return n.recordHeartbeat?.(o),Y(n,o,a)}return ir(s)}function or(s,n,o){let{manager:a,sessionId:c,report:d}=s,m=cr(a,s.session,c,{livenessOwnerToken:n,outcome:o});if(m?.code===fc)return oe(a,c,d.daemonInstance);if(m){let p=bl(a,c);return m.code===bh&&p&&Ht(s.params?.livenessOwnerKind,p)?Ut(c):m}return}function ir(s){let{manager:n,sessionId:o,report:a}=s,c=fr(s);if(c)return c;if(s.params?.livenessPolicy===nD||s.params?.livenessPolicy===void 0){if(n.restoreHeartbeatLivenessPolicy?.(o))return Y(n,o,a,{livenessPolicy:nD})}return n.recordHeartbeat?.(o),Y(n,o,a)}function ar(s,n,o){if(typeof s!=="string"||s===n)return;return{success:!1,code:U0,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=bl(s,n),d=o.daemonInstance===void 0?{}:{daemonInstance:o.daemonInstance},m=o.idleRelease&&c?j(c,s.getIdleReleaseExecutionVeto?.(n),s.getSessionLeaseState?.(n)?.phase):null,p=o.idleRelease&&c?{idleReleaseAt:m===null?null:M(s,m)}:{};return{success:!0,result:{sessionId:n,...a,...p,...d}}}function lr(s){return Kl(s.livenessPolicy)&&s.livenessOwnerToken!==void 0}function ie(s,n){if(s!==iD||!lr(n))return;return{success:!1,code:H0,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===iD&&n.livenessPolicy==="cli-idle"}function Ut(s){return{success:!0,result:{sessionId:s,livenessPolicy:"cli-idle",livenessUnchanged:!0}}}function cr(s,n,o,{livenessOwnerToken:a,outcome:c}){let d=bl(s,o);if(c==="not-found"||!d||d!==n||Ki(s,o,d))return{success:!1,error:`Session not found: ${o}`,code:fc};let m=s.hasLivenessOwnership?.(o,a)??d.livenessOwnerToken===a;return ur(c==="claimed"&&!m?"superseded":c,o,d.livenessOwnerToken!==void 0,()=>s.getOwnerLeaseHold?.(o))}async function dr(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 ur(s,n,o,a){if(s==="conflict"){let c=a();return{success:!1,code:WS,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:Sh,error:`Session ${n}'s liveness is unowned. Explicitly claim ownership before sending keeper ticks; nothing changed.`};if(s==="superseded")return{success:!1,code:bh,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 mr(s,n){return{idleRelease:s?.reportIdleRelease===!0,...s?.reportDaemonInstance===!0?{daemonInstance:n}:{}}}function pr(s){return typeof s?.livenessOwnerToken==="string"&&s.livenessOwnerToken.length>0?s.livenessOwnerToken:void 0}function fr(s){if(s.params?.livenessPolicy===ug&&bl(s.manager,s.sessionId)?.livenessPolicy===Xn)return s.manager.recordHeartbeat?.(s.sessionId),Y(s.manager,s.sessionId,s.report,{livenessPolicy:Xn,livenessUnchanged:!0});if(s.params?.livenessPolicy===ug)return s.manager.adoptCliLivenessPolicy?.(s.sessionId,s.params.idleTimeoutMs),Y(s.manager,s.sessionId,s.report,{livenessPolicy:"cli-idle",idleTimeoutMs:bl(s.manager,s.sessionId)?.heartbeatTimeoutMs});return}var Ee="daemon/capabilities",hr="input/typeText.mode:append",yr="input/gestureStream";async function CN(s,n,o={}){if(!s.method.startsWith("daemon/"))return{success:!1,error:`Unsupported daemon method: ${s.method}`};if(s.method===Ee)return vr(n);if(!n.isInitialized())return{success:!1,error:"Daemon not initialized"};return kr(s,n,o)}async function vr(s){let n=await wr(s);return{success:!0,result:{...n?{bindingRegistry:n}:{},capabilities:[hr,yr,Bw,...s.isSessionBrokerMode?.()?[b7,v7]:[]]}}}async function wr(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:p4,supported:!1,writerVersion:null};return}}var Rr=new Map([...At,[Bw,Nt],[sB,Ft],[us,$t],[aB,qt],["daemon/refreshDevices",(s,n,{context:o})=>Dr(s,n,o)],["daemon/availableDevices",Pr],["daemon/sessionInfo",(s,n)=>Er(s,n)],["daemon/activeSessions",(s,n)=>Or(s,n)],[rD,(s,n,{executions:o,context:a})=>Ir(s,n,o,a)],[kre,Br],[tz,Nr],[dB,Fr]]);async function kr(s,n,o){let a=Rr.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 ze?{code:n.code,retryable:n.retryable}:{}}}}}async function Dr(s,n,o){let a=_w({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 Pr(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 Er(s,n,o=G){let a=s.params?.sessionId;if(!a)return{success:!1,error:"sessionId parameter required"};let c=n.getSessionManager(),d=bl(c,a);if(!d)return oe(c,a);return{success:!0,result:{sessionId:d.sessionId,assignedDevice:d.assignedDevice,...WN(d),platform:d.platform,createdAt:M(c,d.createdAt),lastUsedAt:M(c,d.lastUsedAt),expiresAt:M(c,d.expiresAt),cacheSize:JSON.stringify(d.cacheData).length,...me(d,o.getActiveDeviceSessionExecutionCount(a),c.getIdleReleaseExecutionVeto?.(a),{toWall:(m)=>M(c,m),leasePhase:c.getSessionLeaseState?.(a)?.phase}),...Ar(c.getSessionLeaseState?.(a)),...Ki(c,a,d)?{releasing:!0}:{}}}}function Ar(s){return s?{liveness:{state:s.phase,remainingMs:s.remainingMs}}:{}}async function Or(s,n,o=G){let a=n.getSessionManager(),c=a.getAllSessions?.()??[],d=c.filter((p)=>Ki(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,...WN(p),platform:p.platform,...me(p,o.getActiveDeviceSessionExecutionCount(p.sessionId),a.getIdleReleaseExecutionVeto?.(p.sessionId),{toWall:(h)=>M(a,h),leasePhase:a.getSessionLeaseState?.(p.sessionId)?.phase}),...Ki(a,p.sessionId,p)?{releasing:!0}:{}}))}:{}}}}function Wt(s,n,o,a){let c=s.getSessionManager(),d=xv({binding:s.getBrokerConnectionScopes?.().get(n.socketSessionId),action:o,deviceId:a.deviceId===void 0?void 0:em(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 Ir(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,rD,{sessionUuid:d});if(m)return m;let p=n.getSessionManager(),h=Mr(p,d,c?.livenessOwnerToken);if(h)return h;let S=p.getSession(d)??p.getReleasingSession?.(d);if(!S&&!p.hasSession(d))return await Tr(n,d,c?.requireKnown===!0,o);return zt(n,p,d,{session:S,executions:o})}function Mr(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:$A,error:`Session ${n} can only be released by its current liveness owner; nothing changed.`}}async function Tr(s,n,o,a){if(typeof n==="string"&&s.getObserverSessionRegistry?.()?.release(n))return{success:!0,result:{message:`Session ${n} released`,alreadyReleased:!1}};return await xr(s,s.getSessionManager(),n,{requireKnown:o,executions:a})}async function Kt(s,n,o){let a=n.getKeepAwakeRestoreReport?.(o),c={...a?{keepAwakeRestore:a}:{},...await IN(o,{registry:s.getScreenLockRegistry?.()}),...await _N(o,{registry:s.getPowerRegistry?.()})},d=ct(c);return{...c,...d?{cleanup:d}:{}}}async function xr(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 My(p,d,o),{success:!0,result:{message:`Session ${o} released`,device:d,alreadyReleased:!1}}}}return _r(s,n,o,a)}async function _r(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:fc};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=G}){let d=s.getDevicePool(),m=a?.assignedDevice??n.getTerminalReleaseSnapshot?.(o)?.deviceId??null;return EI(c,{sessionId:o,baseSessionId:st(o,n),deviceId:m},new ac(o,"explicit-release")).catch((p)=>{e.warn(`Failed to cancel executions of explicitly released session ${o}: ${r(p)}`,p)}),await xs({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 Br(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(XH((c)=>a.getSessionForDevice?.(c)??O(n.getDevice?.(c))??null),n)}function Vt(s,n){return{...s,activeExecutionCount:(o)=>s.activeExecutionCount(o)+(n.isUnderShutdownReservation?.(o)?1:0)}}async function Nr(s,n){let o=g({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,...xN(c,a)}}}async function Fr(s,n,{context:o}){let a=g({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,dB,{deviceId:c});if(d)return d;let m=Gt(n),p=n.getDeviceLeaseRelinquishPort?.()??Ot(),h={pid:process.pid,deviceId:c,...xN(m,c)},S=_re(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 Lr}from"fs/promises";async function _I(s=i,n={}){let o=n.socketPath??Lt,a=n.pidFilePath??br,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 qr(d,a,s);if(c||d.socketExists)await $r(d,o,c,{timer:s,...n});return Hr(d),d}async function qr(s,n,o){try{let a=await Lr(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 $r(s,n,o,{timer:a,...c}){try{let d=await Ia.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 Hr(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 ${$s()} --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: ${Lt}`),n.push(` PID: ${br}`),n.push("",`=== End Report ===
|
|
4
|
+
`),n.join(`
|
|
5
|
+
`)}async function Ur(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 Vr(s,n,o,a){try{let c=n.now(),d=await Ia.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 Jt(s=i,n={}){let o=n.socketPath??Lt,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 Ur(o,c))return c;return await Vr(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:",` ${Lt}`),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 jr(s){return s!==void 0&&!s.startsWith("--")}function Wr(s,n){if(!n)return!1;return s.host=n,!0}function Kr(s,n){if(n!=="global"&&n!=="session")return!1;return s.planExecutionLockScope=n,!0}function zr(s,n){let o=zv(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":Wr,"--plan-execution-lock-scope":Kr,[Vv]:zr,[i_]:Zt,[o_]: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||jr(s))}function Gr(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]=a_(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=P0(c,a),d;return}function Yr(s,n,o,a){let c=Gr(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 Jr(s,n,o,a){let c=Yr(s,n,o,a);if(c!==void 0)return c;let d=Object.hasOwn(Te,s)?Te[s]:void 0;if(d){let m=Hs(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 Qr(s,n,o){for(let a=0;a<s.length&&s[a]!==XB;a++){let c=sf(s,a);if(Jr(c.flag,c,n,o))a=c.last}}function ss(s,n=process.env,o=e){let a=ZB(s,n)?{skipCtrlProxyDownload:!0}:{},c=k0(s,n).actionsCompactMetadata;if(c!==void 0)a.actionsCompactMetadata=c;a.toolOutputsDir=v0([],n,_d());let d=T0(s,n),m=A0(s);if(d.length>0||m)a.eventAllMarkers=d,a.eventAllMarkersCliOverride=m;let p=zv(n[lD]??n.AUTO_MOBILE_RUNNER_READINESS_TIMEOUT_MS);if(p!==void 0)a.runnerReadinessTimeoutMs=p;return Qr(s,a,o),a}var Xr=[Vc,"--daemon-socket-path"],to=[kk,MY,"--headless",...Yu.flatMap((s)=>s.disableCli?[s.cli,s.disableCli]:[s.cli])],so=new Set(["--port",...Object.keys(Ie),...Object.keys(Me),...Object.keys(Ce),...Xr]),no=new Set([...Object.keys(Te),...to]);function ro(s,n){let{flag:o,inlineValue:a}=Pi(s);if(!n(o))return{kind:"option",argument:s};return Hs(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===XB&&!m)m=!0;else if(m||!h.startsWith("-")){if(d++,d>c)return{kind:"positional",argument:h}}else if(o(Pi(h).flag))p=sf(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 ww.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=ww.map((d)=>d.key).join(", ");throw new t(`Unknown feature flag: ${n}. Known flags: ${c}`)}let a=Hs(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 os(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:KT,listFiles:(s)=>Li(s),readLock:xl,isProcessRunning:(s)=>at(s)};function r4(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=uB(a),d=c===void 0?void 0:s.readLock(lo(n,a));if(c===void 0||!d||Number.isNaN(d.pid))return[];let m=jT(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 is(s,n=r4(),o=new Hw,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",cs=f.ALLOW_SHARED_DAEMON_NAMESPACE.name,as="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 n4(s){return cg("sock",s)!==cg("sock",{})}class ds extends t{code=as;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 ${cs}=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} [${as}]`);this.nextAction=a}}function eq(s,n,o=!1){if(o||n[cs]?.trim()==="1")return;let a=po(n);if(a.length===0||n4(n))return;throw new ds(s,a,cg("sock",n))}class fA extends he{attemptTimeoutMs;constructor(s){super(`Daemon connection attempt did not settle within ${s}ms`);this.attemptTimeoutMs=s;this.name="DaemonConnectAttemptStalledError"}}class rm extends he{cause;constructor(s){super(s.message);this.cause=s;this.name="DaemonPreflightConnectionError"}}var fo="daemon/prepareSession",Fe="daemon/sessionRequestStatus",fs="daemon/abandonSessionRequest",tq="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 he&&(s.constructor===he||s instanceof fA||s instanceof rm)}async function Ss(s,n,o,a){let c=Math.min(n,s.timer.now()+QW);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<QW)return;return s.last??ae(o,`The daemon stayed unreachable for ${QW}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 Po(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)Po(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 Eo(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 Ao(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 Eo(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 Oo(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 uQ(c)}function Io(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):Kd}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 Mo(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(B7)):F(s,_("session_broker_stopping","The session broker kept stopping until no preparation budget remained.",!0))}async function To(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 Mo(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=Io(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 Co(s,n,o){if(n instanceof Cr)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 d7(s,n,o){let a=s.preparationTimeoutMs??xo,c=n.timer.now()+a,d=()=>c-n.timer.now();try{if(await Ss(n,c,o,"session broker daemon connection"),!await Oo(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 To(s,n,m,{deadlineMs:c,signal:o});return await Ao(p,n,c,o)}catch(m){let p=Co(s,m,o);return e.warn(`[SessionBroker] Acquisition failed (${p.failure?.code})`,m),p}}var _o=5000,ws=240000,Bo=y().uuid();function le(s){return`Usage: ${s} ${s==="release-broker-session"?"<session-uuid>":"<request-id>"} --liveness-owner-token <token> --json`}function No(s,n,o){let a=s[n];if(!a||a==="--")return;let{flag:c,inlineValue:d}=Pi(a);if(c==="--json"){if(o.json||Hs(d)!==!0)return;return o.json=!0,n}if(c==="--liveness-owner-token"){let p=sf(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=No(n,a,o);if(c===void 0)return;a=c}if(!o.identity||!o.livenessOwnerToken||!o.json||s==="release-broker-session"&&!Bo.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 Fo(s){return s===void 0||V(s)&&typeof s.code==="string"&&s.code.length>0&&typeof s.message==="string"&&typeof s.retryable==="boolean"}function ks(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",Fo(s.failure)].every(Boolean))return!1;return o!=="ready"||typeof a==="string"&&V(c)}function Lo(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},_o);if(!ks(a,o.identity))throw new t("Invalid daemon session-request-status result");return a}catch(a){throw $e(a,o.livenessOwnerToken)}}async function Es(s,n){let o=qe("abandon-session-request",s);try{let a=await He(n,fs,{requestId:o.identity,livenessOwnerToken:o.livenessOwnerToken},ws);if(!ks(a,o.identity))throw new t("Invalid daemon abandon-session-request result");return a}catch(a){throw $e(a,o.livenessOwnerToken)}}async function As(s,n){let o=qe("release-broker-session",s);try{let a=await He(n,tq,{sessionId:o.identity,livenessOwnerToken:o.livenessOwnerToken},ws);if(!Lo(a,o.identity))throw new t("Invalid daemon release-broker-session result");return a}catch(a){throw $e(a,o.livenessOwnerToken)}}var qo=5000,Ue="Usage: capabilities --json";function Ve(s){if(s.length!==1)return!1;let{flag:n,inlineValue:o}=Pi(s[0]);return n==="--json"&&Hs(o)===!0}function Uo(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 Is(s,n){if(!Ve(s))throw new t(Ue);let o=n();try{await o.connect();let a=await o.callDaemonMethod(Ee,{},{timeoutMs:qo});if(!Uo(a))throw new t("Invalid daemon capabilities result");return a}finally{await o.close()}}var D="--json";function je(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}=Pi(s[c]);switch(d){case"--liveness-owner-token":{let p=sf(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=Hs(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 Cs(s){let n=_R(s,["--maintenance-token"])?.value;if(!n)throw new t("--maintenance-token requires a non-empty value");return n}function _s(s){let n=(c)=>{let d=_R(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 We(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 i4(s){Ge(s===void 0?"Missing daemon command.":`Unknown daemon command: ${s}`)}var Vo=["--session-uuid","--platform","--stable-device-id","--android-sibling-avd-name","--android-duplicate-serial","--ios-same-name-sibling-uuid","--expires-at"],Ms={start:{launchFlags:!0},stop:{launchFlags:!0},restart:{launchFlags:!0},"restart-admitted":{launchFlags:!0,valueFlags:["--maintenance-token"]},"restart-acceptance-session":{launchFlags:!1,valueFlags:Vo},status:{launchFlags:!0,booleanFlags:[D]},capabilities:{launchFlags:!1,booleanFlags:[D]},health:{launchFlags:!0},diagnose:{launchFlags:!0},"available-devices":{launchFlags:!0,booleanFlags:[D]},"active-sessions":{launchFlags:!0,booleanFlags:[D]},"session-info":{launchFlags:!1,booleanFlags:[D],positionals:1},"release-session":{launchFlags:!1,booleanFlags:[D],positionals:1},"set-feature-flag":{launchFlags:!1,booleanFlags:[D],positionals:2},"session-request-status":{launchFlags:!1,valueFlags:["--liveness-owner-token"],booleanFlags:[D],positionals:1},"abandon-session-request":{launchFlags:!1,valueFlags:["--liveness-owner-token"],booleanFlags:[D],positionals:1},"release-broker-session":{launchFlags:!1,valueFlags:["--liveness-owner-token"],booleanFlags:[D],positionals:1}};function Ts(s){return["session-request-status","abandon-session-request","release-broker-session"].includes(s)}function Ke(s,n){let o=Object.hasOwn(Ms,s)?Ms[s]:void 0;if(!o)return;let a=ns(n,o);if(!a){if(s==="capabilities"&&!Ve(n))return Ue;if(Ts(s)&&!bs(s,n))return le(s);return}if(Ts(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 jo(s,n){let o=Ds(s),a=[` Build ID: ${o.buildId||"unknown"}`,` Entry Script: ${o.entryScript||"unknown"}`];if(!Qd(n,o))a.push(`
|
|
11
|
+
\u26A0\uFE0F WARNING: the running daemon is a different build than this checkout:`,` daemon build=${eo(o)}`,` client build=${eo(n)}`,"\nRestart the daemon from this checkout (run `--daemon restart` with this same CLI) to align them.");return a}var Ls=(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 Bs(s){return Object.assign(new t(s),{code:"discovery_incomplete",retryable:!0})}function Wo(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 Bs("The booted-devices resource carried no pool status, so the device count is unknown (discovery_incomplete); retry once the daemon finishes discovery.");let o=Wo(n);if(o)throw Bs(`${o} (discovery_incomplete); retry once the daemon finishes discovery.`);console.log(Ls(n.poolStatus,n.poolStatus.recoveryPolicy,n.devices?.map((a)=>({deviceId:a.runtime?.deviceId??"unknown",platform:a.platform,recoveryEligibility:a.recoveryEligibility}))))}function Ns(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 jo(s,Ho()))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 ${$s()} --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 qs(s,n){let o=s.getSession(n);if(!o)throw new t(`Session not found: ${n}`);return o}function Fs(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||Ki(o,n,a))throw new t(`Session not found: ${n}`);let c=ie(iD,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),Cs(n));break}case"restart-acceptance-session":{await a.restartAcceptanceSession(_s(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(af(s,[D])===!0)return console.log(JSON.stringify(o)),Ns(o);Go(o,n);for(let a of await is(o.running?o.pid:void 0))console.log(a);return Ns(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 _I();if(console.log(Oe(c)),!c.daemonRunning||!c.socketConnectable)process.exit(1);break}case"diagnose":{console.log(`Running daemon diagnostics...
|
|
14
|
+
`);let c=await _I();console.log(Oe(c));let d=await Jt();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=Os(n),h=o("idle")===!0,S=o5(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 X(s){let n=s.indexOf("--"),o=n===-1?s:s.slice(0,n),a=n===-1?[]:s.slice(n+1);return{json:af(o,[D])===!0,rest:[...o.filter((c)=>Pi(c).flag!==D),...a]}}async function Xo(s,n){let{json:o}=X(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(Ls(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}=X(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=qs(m,c),h=j(p,m.getIdleReleaseExecutionVeto(c),m.getSessionLeaseState(c)?.phase);console.log(JSON.stringify({sessionId:p.sessionId,assignedDevice:p.assignedDevice,...WN(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}=X(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 si(s,n){let{json:o,rest:a}=X(s);try{let c=rs(a.filter((m)=>m!=="")),d;try{d=await os(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 ni(s,n){try{let o=await Is(s,()=>n.createClient());console.log(JSON.stringify(o))}catch(o){L(new C("Failed to query daemon capabilities",o),!0)}}var ri=g({message:y(),alreadyReleased:ee(),device:y().optional(),known:ee().optional(),cleanup:A(["pending","failed"]).optional()});async function oi(s,n){let{json:o,rest:a}=X(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=qs(p,d).assignedDevice;await xs({manager:p,pool:h},w,d,{deferFailureFallback:!0}),c(!1,`Session ${d} released`,{device:w});return}{let p=n.createClient(),h=(S)=>ri.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 Es(n,a):await As(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===bh)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===Sh)return`Session ${s}'s liveness is unowned. Explicitly claim with --claim-liveness-ownership before sending keeper ticks, or stop the keeper. [${Sh}]`;if(o===H0)return`${r(n)} [${H0}] Stop this keeper; heartbeat only works for one-shot CLI sessions.`;return`Failed to record session heartbeat: ${r(n)}${ai(n)}`}function ai(s){let n=Os(s),o=Vs(s)?.idle===!0;return n?Us(n,o,o5(s)):""}async function li(s,n){try{let{sessionId:o,livenessOwnerToken:a,claimLivenessOwnership:c}=je(s),d=n.getDaemonState();if(d.isInitialized()){let m=Yo(d,o);console.log(m?`Session ${o} heartbeat recorded`:Fs(o));return}{let m=n.createClient();try{if(await m.connect(),(await m.callDaemonMethod("daemon/heartbeat",{sessionId:o,livenessPolicy:ug,livenessOwnerKind:iD,idleTimeoutMs:up(),...a?{livenessOwnerToken:a}:{},...c?{claimLivenessOwnership:!0}:{}}))?.livenessUnchanged===!0){console.log(Fs(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=We(s),a=n.getDaemonState();if(a.isInitialized()){let d=await CN({id:"release-liveness-ownership",type:"daemon_request",method:sB,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(sB,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 ui(s,n,o){if(!di.has(s))return!1;try{return eq(`run daemon ${s}`,n,o),!1}catch(a){return console.error(`Error: ${r(a)}`),process.exit(1),!0}}async function o4(s,n,o,a){let c=af(n,[U])===!0,d=n.filter((w)=>Pi(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:()=>ni(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":()=>si(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:()=>li(d,m),"release-liveness-ownership":()=>ci(d,m)},h=Object.hasOwn(p,s)?p[s]:void 0;if(!h)return i4(s);let S=Ke(s,d);if(S!==void 0)return Ge(S);if(o.namespaceEnv&&ui(s,o.namespaceEnv,c))return;return h()}
|
|
15
|
+
export{n7,EI,uA,My,PN,xs,YH,em,AN,pA,Y6,TN,kN,EN,i7,J6,II,Xf,tm,mA,X6,o7,IN,JH,Z6,s7,_N,a7,Q6,e4,xN,c7,XH,t4,ZH,QH,CN,_I,r4,n4,eq,fA,rm,tq,d7,i4,o4};
|
|
16
|
+
|
|
17
|
+
//# debugId=C60F4D90C35F869564756E2164756E21
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{B}from"./chunk-yf7ympyz.js";import{i,_d,Se,l,e}from"./chunk-z637nqg8.js";import{f,lt}from"./chunk-58wzr3mt.js";import{je,H,rt,Do,ke,jn}from"./chunk-r5bxavdx.js";import{f3,Po,Oa}from"./chunk-0qsy1qsx.js";import{r,t,u}from"./chunk-rbpdk7m0.js";import{access as O}from"fs/promises";import{existsSync as k}from"fs";import{access as T}from"fs/promises";import{dirname as P,join as y}from"path";import{fileURLToPath as D}from"url";var w=y("ios","control-proxy","CtrlProxy.xcodeproj");async function E(n,o={}){let s=o.access??T,c=[Se(n),(o.launchDirectory??(()=>_d()))(),(o.packageRoot??_)()].filter((d)=>typeof d==="string"&&d.length>0),a=[...new Set(c.map((d)=>y(d,w)))];for(let d of a)try{return await s(d),{found:!0,projectPath:d,checked:a}}catch(h){e.debug(`CtrlProxy project not at ${d}: ${r(h)}`)}return{found:!1,checked:a}}var S;function _(){if(S===void 0){let n=P(D(import.meta.url));while(!k(y(n,"package.json"))&&P(n)!==n)n=P(n);S=k(y(n,"package.json"))?n:null}return S??void 0}var v="CtrlProxyWatch";class W{dependencies;builds=new rt;constructor(n){this.dependencies=n}async resolve(n){n?.throwIfAborted();let o=(this.dependencies.override??(()=>lt(f.WATCH_RUNNER_XCTESTRUN)))();if(o){let d=Se(o);return await(this.dependencies.access??O)(d),d}let s=this.dependencies.builder,c=await s.getXctestrunPath("watchSimulator");if(c)return c;let a=s.getConfig();return await this.builds.run(a.derivedDataPath,async(d)=>await H(d,async()=>{let h=async()=>{d?.throwIfAborted();let p=await E(a.projectRoot,{...this.dependencies.projectLocator,access:this.dependencies.access});if(!p.found)throw j(p.checked,a.derivedDataPath);let R=p.projectPath;await(this.dependencies.xcodebuild??new jn).executeCommand(["build-for-testing","-project",R,"-scheme",v,"-destination","generic/platform=watchOS Simulator","-derivedDataPath",a.derivedDataPath,"CODE_SIGNING_ALLOWED=NO"],{signal:d,timeoutMs:120000});let g=await s.getXctestrunPath("watchSimulator");if(!g)throw new t(`No watchsimulator xctestrun found in ${a.derivedDataPath}/Build/Products after building ${v}; set ${f.WATCH_RUNNER_XCTESTRUN.name} to a prebuilt watch runner.`);return g};return s.runExclusiveOnDerivedData?await s.runExclusiveOnDerivedData(h):await h()}),n,{cancelWhenAllWaitersAbort:!0})}}function L(n,o){return`xcodebuild build-for-testing -project ${n} -scheme ${v} -destination 'generic/platform=watchOS Simulator' -derivedDataPath ${o} CODE_SIGNING_ALLOWED=NO`}function j(n,o){return new t([`The ${v} watch runner is not built in ${o} and ${w} was not found at: ${n.join(", ")}.`,`From an AutoMobile checkout, set ${f.PROJECT_ROOT.name} to the checkout root and retry startDevice to build it automatically,`,`or build it yourself: ${L(`<checkout>/${w}`,o)}.`,`The published package does not include the watch project; there, set ${f.WATCH_RUNNER_XCTESTRUN.name} to a prebuilt watch runner xctestrun.`].join(" "))}import M from"ws";var N=(n)=>{let o=new M(n);return{send:(s)=>o.send(s),close:()=>o.close(),onMessage:(s)=>{o.on("message",(c)=>s(c.toString()))},onFailure:(s)=>{o.on("error",s),o.on("close",()=>s(Error("Watch runner disconnected; reconnect it.")))}}};class x{options;socket;pending=new Map;sequence=0;supported=new Set;ready;resolveReady;rejectReady;failure;constructor(n,o={}){this.options=o;this.ready=new Promise((s,c)=>{this.resolveReady=s,this.rejectReady=c}),this.ready.then(void 0,()=>{}),this.socket=(o.factory??N)(n),this.socket.onMessage((s)=>this.receive(s)),this.socket.onFailure((s)=>this.fail(u(s,"Watch runner connection failed")))}isUsable(){return this.failure===void 0}fail(n){this.failure=n,this.rejectReady(n);for(let o of this.pending.values())o.reject(n);this.pending.clear()}receive(n){try{let o=JSON.parse(n);if(!o||typeof o!=="object"||!("type"in o))throw new t("Invalid watch runner response; reconnect it.");let s=o;if(s.type==="connected")this.connected(s);else this.reply(s)}catch(o){this.fail(u(o,"Invalid watch runner response")),this.socket.close()}}connected(n){if(n.platform!=="watchos"){this.fail(new Oa("Refusing runner: connected platform must be watchos.","invalid_runner_platform")),this.socket.close();return}this.supported=new Set(Array.isArray(n.supportedCommands)?n.supportedCommands.filter((o)=>typeof o==="string"):[]),this.resolveReady();return}reply(n){let o=typeof n.requestId==="string"?this.pending.get(n.requestId):void 0;if(!o)return;if(n.type==="error"||n.success===!1)o.reject(new Oa(String(n.error??"Watch command failed"),String(n.errorCode??"command_failed")));else if(n.type===(o.type==="hierarchy"?"hierarchy_update":`${o.type}_result`)&&n.success===!0)o.resolve(n.type==="face_result"?n.text??n.data:n.data)}async request(n,o,s){let c=this.options.timer??i,a=s?.timeoutMs??this.options.timeoutMs??5000,d=String(++this.sequence),h=new AbortController,p=o?AbortSignal.any([o,h.signal]):h.signal;try{return await l(async()=>{if(await this.ready,p.throwIfAborted(),this.failure)throw this.failure;if(!this.supported.has(n.type))throw new Oa(`The watch runner does not support ${n.type}.`,"unsupported_on_watchos");return new Promise((R,g)=>{this.pending.set(d,{type:n.type,resolve:R,reject:g}),this.socket.send(JSON.stringify({...n,requestId:d}))})},{timer:c,timeoutMs:a,signal:p,label:`Watch runner ${n.type}`})}finally{h.abort(),this.pending.delete(d)}}async hierarchy(n){let o=await this.request({type:"hierarchy"},n);if(!f3(o))throw new t("Invalid watch hierarchy; reconnect the runner.");return o}close(){this.fail(new t("Watch runner closed; reconnect it.")),this.socket.close()}}import{rm as U}from"fs/promises";class C{dependencies;constructor(n){this.dependencies=n}async launch(n){if(!Number.isInteger(n.port)||n.port<1||n.port>65535)throw new t("Watch runner port must be an integer from 1 to 65535.");if(Po.get(n.deviceId))throw new t("Watch runner is already connected.");n.signal?.throwIfAborted();let o=await this.dependencies.writeRunnerEnvironment(n.xctestrun,{AM_PORT:String(n.port)},`watch-${n.deviceId}`),s=!1,c=()=>{if(!s&&o!==n.xctestrun)s=!0,U(o,{force:!0}).catch((a)=>{e.warn("Failed to remove watch runner xctestrun copy",a)})};try{return await this.launchPrepared({...n,xctestrun:o},c)}catch(a){throw c(),u(a,"Failed to launch watch runner")}}async launchPrepared(n,o){let s=this.dependencies.timer??i;n.signal?.throwIfAborted();let c=await(this.dependencies.xcodebuild??new jn).startStreaming(["test-without-building","-xctestrun",n.xctestrun,"-destination",`platform=watchOS Simulator,id=${n.deviceId}`,"-only-testing:CtrlProxyWatchUITests/CtrlProxyWatchUITests/testRunService"],{env:{...globalThis.process.env,TEST_RUNNER_AM_PORT:String(n.port),...n.bundleId!==void 0?{TEST_RUNNER_AM_BUNDLE_ID:n.bundleId}:{}},stdio:"ignore",startupSignal:n.signal}),a={exited:!1,unregister:()=>{}},d=()=>{a.exited=!0,a.unregister(),a.client?.close(),o()},h=()=>{let p=!a.exited;if(d(),p)c.kill("SIGTERM")};c.once("exit",d),c.once("error",d);try{return await l(()=>this.waitForRunner(n,a),{timer:s,timeoutMs:60000,label:"Watch runner startup",onTimeout:h,signal:n.signal}),{stop:h}}catch(p){throw h(),u(p,"Failed to launch watch runner")}}async waitForRunner(n,o){let s=this.dependencies.timer??i;while(!o.exited){let c=(this.dependencies.connect??((a)=>new x(a,{timer:s})))(`ws://127.0.0.1:${n.port}/ws`);o.client=c;try{await c.hierarchy(n.signal)}catch(a){if(c.close(),o.exited||n.signal?.aborted||a instanceof Oa)throw u(a,"Watch runner exited during startup");e.debug("Watch runner not ready during startup",a),await s.sleep(100);continue}if(o.exited)break;n.signal?.throwIfAborted(),o.unregister=Po.register(n.deviceId,c);return}throw new t("Watch runner exited before becoming ready; check the prebuilt test bundle.")}}class A{dependencies;runners=new Map;observedSessions=new WeakSet;constructor(n){this.dependencies=n}async ensure(n){let o=await this.start(n);return this.attach(n)??o.runnerUnavailable}async start(n){let{deviceId:o,bundleId:s,sessions:c,signal:a}=n;return this.launchEntry({deviceId:o,bundleId:s,sessions:c,signal:a})}async launchEntry(n){let{deviceId:o,sessions:s}=n;if(s)this.observeSessions(s);if(Po.get(o)?.isUsable())return{};if(this.stop(o),Po.get(o))return{runnerUnavailable:`The watch runner for ${o} is disconnected and was not started by AutoMobile; restart it before trying again.`};let a={controller:new AbortController,bundleId:n.bundleId,ownerSession:n.ownerSession},d=je(n.signal,a.controller.signal);this.runners.set(o,a);try{let h=await this.dependencies.artifacts.resolve(d);d.throwIfAborted(),a.port=this.dependencies.ports.allocate(o);let p=await this.dependencies.launcher.launch({deviceId:o,bundleId:n.bundleId,xctestrun:h,port:a.port,signal:d});if(a.stop=p.stop,d.aborted||this.runners.get(o)!==a){if(this.runners.get(o)!==a)p.stop();throw new t("the watch session ended during runner startup")}return{stop:()=>{if(this.runners.get(o)===a)this.stop(o)}}}catch(h){if(this.runners.get(o)===a)this.stop(o);let p=r(h);return e.warn(`[WatchRunner] Runner unavailable for ${o}: ${p}`,h),{runnerUnavailable:p}}}async retarget(n){let o=this.runners.get(n.deviceId);if(!o)return;if(o.bundleId===n.bundleId&&Po.get(n.deviceId)?.isUsable()===!0)return;let s=o.ownerSession;try{return this.stop(n.deviceId),(await this.launchEntry({...n,ownerSession:s})).runnerUnavailable}catch(c){let a=r(c);return e.warn(`[WatchRunner] Failed to retarget runner for ${n.deviceId}: ${a}`,c),a}}attach({deviceId:n,ownerSession:o,sessions:s}){if(this.observeSessions(s),!s.hasSession(o))return this.stop(n),"the watch session ended before runner startup";let c=this.runners.get(n);if(c)c.ownerSession=o;return}stop(n){let o=this.runners.get(n);if(!o)return;this.runners.delete(n),o.controller.abort(new t("Watch runner lifecycle ended"));try{o.stop?.()}catch(s){e.warn(`[WatchRunner] Failed to stop runner for ${n}`,s)}finally{if(o.port!==void 0)this.dependencies.ports.release(n,o.port)}}stopSession(n){for(let[o,s]of this.runners)if(s.ownerSession===n)this.stop(o)}stopAll(){for(let n of this.runners.keys())this.stop(n)}observeSessions(n){if(this.observedSessions.has(n))return;this.observedSessions.add(n),n.onSessionRelease((o)=>this.stopSession(o)),n.onSessionDeviceUnbound((o,s)=>{if(this.runners.get(s)?.ownerSession===o)this.stop(s)})}}var I;function j8(n){I=n}function b(){if(!I)throw new t("Watch runner builder has not been registered by the server.");return I()}var m;function Ff(){if(!m)m=new A({artifacts:new W({builder:{getXctestrunPath:(n)=>b().getXctestrunPath(n),getConfig:()=>b().getConfig(),runExclusiveOnDerivedData:(n)=>{let o=b();return o.runExclusiveOnDerivedData?o.runExclusiveOnDerivedData(n):n()}}}),launcher:new C({writeRunnerEnvironment:(n,o,s)=>b().writeRunnerEnvironment(n,o,`${s}-${B.next()}`)}),ports:{allocate:(n)=>ke.allocate(`watch:${n}`,{reservedPorts:Do}),release:(n,o)=>ke.releaseIfAllocated(`watch:${n}`,o)}}),process.once("exit",()=>m?.stopAll());return m}function K8(){m?.stopAll()}
|
|
3
|
+
export{j8,Ff,K8};
|
|
4
|
+
|
|
5
|
+
//# debugId=BC4CD877545A6C0B64756E2164756E21
|