@kaeawc/auto-mobile 0.0.90 → 0.0.92
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/README.md.backup +7 -0
- package/dist/build-info.json +12 -11
- package/dist/schemas/README.md +16 -0
- package/dist/schemas/prototype-icon-names.json +302 -0
- package/dist/schemas/prototype-platform-permissions.json +75 -0
- package/dist/schemas/test-plan.schema.json +2 -2
- package/dist/src/chunk-09442h7v.js +4 -0
- package/dist/src/chunk-0dfnyfkh.js +5 -0
- package/dist/src/chunk-0e4gm1kj.js +5 -0
- package/dist/src/chunk-0eb8576f.js +4 -0
- package/dist/src/chunk-0rjm4nx7.js +5 -0
- package/dist/src/chunk-0w1spptt.js +6 -0
- package/dist/src/chunk-1zmh2eak.js +4 -0
- package/dist/src/chunk-28k63ha3.js +5 -0
- package/dist/src/chunk-2d4wmp8b.js +4 -0
- package/dist/src/chunk-2e6s75qv.js +78 -0
- package/dist/src/chunk-2v7tw1nj.js +5 -0
- package/dist/src/chunk-32jpxz2y.js +323 -0
- package/dist/src/chunk-34zxqcmq.js +5 -0
- package/dist/src/chunk-3jmvqygr.js +238 -0
- package/dist/src/chunk-3swvfhqt.js +5 -0
- package/dist/src/chunk-44bt78m9.js +5 -0
- package/dist/src/chunk-488vt2bp.js +4 -0
- package/dist/src/chunk-4fgdhcwx.js +5 -0
- package/dist/src/chunk-4jp2se4w.js +4 -0
- package/dist/src/chunk-4pfftt07.js +5 -0
- package/dist/src/chunk-4vhr9e4t.js +4 -0
- package/dist/src/chunk-4xd6zs3y.js +15 -0
- package/dist/src/chunk-51567pg8.js +4 -0
- package/dist/src/chunk-5agqsfev.js +4 -0
- package/dist/src/chunk-5d706gmr.js +4 -0
- package/dist/src/chunk-5kd4rqk7.js +5 -0
- package/dist/src/chunk-5s645vr4.js +4 -0
- package/dist/src/chunk-61t538bm.js +4 -0
- package/dist/src/chunk-6d3mmqxt.js +54 -0
- package/dist/src/chunk-6hyt398x.js +5 -0
- package/dist/src/chunk-6mnr8kpm.js +4 -0
- package/dist/src/chunk-6pg7bqck.js +4 -0
- package/dist/src/chunk-79q5xsdc.js +42 -0
- package/dist/src/chunk-7bdgand3.js +4 -0
- package/dist/src/chunk-84cp9dw5.js +4 -0
- package/dist/src/chunk-86f2h5ww.js +5 -0
- package/dist/src/chunk-8cghfzb2.js +19 -0
- package/dist/src/chunk-8en08r7q.js +5 -0
- package/dist/src/chunk-950qcq1e.js +10 -0
- package/dist/src/chunk-9rkfyt6q.js +5 -0
- package/dist/src/chunk-9tf2p9y9.js +5 -0
- package/dist/src/chunk-9y5bcy28.js +6 -0
- package/dist/src/chunk-a2sc4jm0.js +5 -0
- package/dist/src/chunk-a4k9rt7z.js +5 -0
- package/dist/src/chunk-aa5ng3d1.js +4 -0
- package/dist/src/chunk-ajsrz473.js +5 -0
- package/dist/src/chunk-b3h0a6ca.js +4 -0
- package/dist/src/chunk-b4cxdzwy.js +20 -0
- package/dist/src/chunk-b6a737qt.js +4 -0
- package/dist/src/chunk-bn64x5z5.js +5 -0
- package/dist/src/chunk-bvh649za.js +12 -0
- package/dist/src/chunk-c9nk1r78.js +5 -0
- package/dist/src/chunk-c9tyfg4j.js +26 -0
- package/dist/src/chunk-cfsdfqnm.js +4 -0
- package/dist/src/chunk-cxyf04jc.js +7 -0
- package/dist/src/chunk-d57432wq.js +4 -0
- package/dist/src/chunk-da08tx5v.js +4 -0
- package/dist/src/chunk-eka89q3k.js +4 -0
- package/dist/src/chunk-f2tc08m2.js +4 -0
- package/dist/src/chunk-f8tnk179.js +5 -0
- package/dist/src/chunk-f9s1kkhx.js +5 -0
- package/dist/src/chunk-fbp8a4rx.js +4 -0
- package/dist/src/chunk-fd2z0sze.js +4 -0
- package/dist/src/chunk-fk927f4q.js +54 -0
- package/dist/src/chunk-fxmr3a0f.js +4 -0
- package/dist/src/chunk-gaqwhd44.js +4 -0
- package/dist/src/chunk-ggtd5x5a.js +5 -0
- package/dist/src/chunk-gndcfrm7.js +4 -0
- package/dist/src/chunk-h3n4adc6.js +310 -0
- package/dist/src/chunk-h5pjbb83.js +4 -0
- package/dist/src/chunk-hgnnh302.js +4 -0
- package/dist/src/chunk-hmke8nhx.js +5 -0
- package/dist/src/chunk-j2bx12hn.js +4 -0
- package/dist/src/chunk-j70y1a2g.js +4 -0
- package/dist/src/chunk-jdqvcq0a.js +5 -0
- package/dist/src/chunk-jhnbfj19.js +55 -0
- package/dist/src/chunk-js1jpyxp.js +6 -0
- package/dist/src/chunk-kbjq0qvb.js +4 -0
- package/dist/src/chunk-kfwx57xd.js +4 -0
- package/dist/src/chunk-km0dy5vc.js +71 -0
- package/dist/src/chunk-kzwctna2.js +4 -0
- package/dist/src/chunk-m9ehyehy.js +4 -0
- package/dist/src/chunk-mct91p1f.js +4 -0
- package/dist/src/chunk-mf9spd4g.js +5 -0
- package/dist/src/chunk-mgrcansb.js +4 -0
- package/dist/src/chunk-mqc1d0eb.js +6 -0
- package/dist/src/chunk-n1zmpk0z.js +4 -0
- package/dist/src/chunk-ncyjf63g.js +4 -0
- package/dist/src/chunk-nr64d21q.js +973 -0
- package/dist/src/chunk-nwm2pq5v.js +168 -0
- package/dist/src/chunk-pm06b05d.js +9 -0
- package/dist/src/chunk-q50s00ry.js +4 -0
- package/dist/src/chunk-qv2918jt.js +4 -0
- package/dist/src/chunk-qwye1958.js +14 -0
- package/dist/src/chunk-r0f1q783.js +5 -0
- package/dist/src/chunk-r14wwk37.js +18 -0
- package/dist/src/chunk-r20pe1nv.js +5 -0
- package/dist/src/chunk-r8z9pfve.js +5 -0
- package/dist/src/chunk-rdpgkjf6.js +4 -0
- package/dist/src/chunk-rkr0dks9.js +5 -0
- package/dist/src/chunk-rn84t3sf.js +11 -0
- package/dist/src/chunk-s123kn7n.js +4 -0
- package/dist/src/chunk-s1zq65ny.js +4 -0
- package/dist/src/chunk-s73qn3fx.js +4 -0
- package/dist/src/chunk-sjn0nj4p.js +5 -0
- package/dist/src/chunk-sns0c35v.js +7 -0
- package/dist/src/chunk-stfzjr9y.js +8 -0
- package/dist/src/chunk-sz1a7p43.js +4 -0
- package/dist/src/chunk-t4dr5c8v.js +8 -0
- package/dist/src/chunk-tc8k9c1j.js +4 -0
- package/dist/src/chunk-teznhase.js +4 -0
- package/dist/src/chunk-ty9xgmz4.js +4 -0
- package/dist/src/chunk-tyazf3sk.js +145 -0
- package/dist/src/chunk-v6npjrjm.js +5 -0
- package/dist/src/chunk-v90es00d.js +4 -0
- package/dist/src/chunk-vbvtzkwz.js +5 -0
- package/dist/src/chunk-vefd8qee.js +8 -0
- package/dist/src/chunk-vs9r72ta.js +17 -0
- package/dist/src/chunk-w2mwa0jk.js +4 -0
- package/dist/src/chunk-w7zsh13a.js +9 -0
- package/dist/src/chunk-w88k0bgr.js +4 -0
- package/dist/src/chunk-wry6skrm.js +4 -0
- package/dist/src/chunk-wzdt0enk.js +4 -0
- package/dist/src/chunk-xhhv854c.js +4 -0
- package/dist/src/chunk-y58270hd.js +4 -0
- package/dist/src/chunk-yk0hmbex.js +4 -0
- package/dist/src/chunk-ympy4fdz.js +28 -0
- package/dist/src/chunk-yw436axy.js +4 -0
- package/dist/src/chunk-z04jrpjy.js +5 -0
- package/dist/src/chunk-z2xznczw.js +4 -0
- package/dist/src/chunk-z4xnrgps.js +4 -0
- package/dist/src/chunk-z7csyszv.js +4 -0
- package/dist/src/chunk-z8t0v07j.js +11 -0
- package/dist/src/chunk-z916af47.js +228 -0
- package/dist/src/chunk-zcr8he8q.js +5 -0
- package/dist/src/chunk-zd9vmkzn.js +9 -0
- package/dist/src/chunk-zg67wjkh.js +5 -0
- package/dist/src/chunk-zj939v0h.js +5 -0
- package/dist/src/chunk-zkdjwtc1.js +4 -0
- package/dist/src/chunk-zkv5kzt6.js +4 -0
- package/dist/src/daemon/processEntry.js +4 -0
- package/dist/src/index.js +4 -2797
- package/dist/src/runtime/bunRuntimeGuard.js +4 -0
- package/dist/src/utils/workers/iosBundleExtractWorker.js +2 -3
- package/node_modules/strtok3/lib/BufferSizeError.js +1 -1
- package/node_modules/strtok3/lib/TokenWriter.js +151 -0
- package/node_modules/strtok3/lib/core.js +1 -0
- package/node_modules/strtok3/package.json +2 -2
- package/node_modules/token-types/LICENSE.txt +9 -9
- package/node_modules/token-types/{lib → dist/lib}/index.js +21 -3
- package/node_modules/token-types/package.json +81 -81
- package/package.json +10 -10
- package/schemas/README.md +16 -0
- package/schemas/prototype-icon-names.json +302 -0
- package/schemas/prototype-platform-permissions.json +75 -0
- package/schemas/test-plan.schema.json +2 -2
- 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 -736
- 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 -120
- 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{_d,qM,fa,Dl,VM,WM,Ol,oH,LP,zM,br,Ts,jM,KM,Ml,GM,iI,$G,YM,Ya,Mp,zb,hy,zt,Nl,gy,aI}from"./chunk-mqc1d0eb.js";import"./chunk-nwm2pq5v.js";import"./chunk-44bt78m9.js";import"./chunk-a2sc4jm0.js";import"./chunk-jhnbfj19.js";import"./chunk-sjn0nj4p.js";import"./chunk-bn64x5z5.js";import"./chunk-0e4gm1kj.js";import"./chunk-4fgdhcwx.js";import"./chunk-6d3mmqxt.js";import"./chunk-sns0c35v.js";import"./chunk-h3n4adc6.js";import"./chunk-32jpxz2y.js";import"./chunk-79q5xsdc.js";import"./chunk-ggtd5x5a.js";import"./chunk-z8t0v07j.js";import"./chunk-mf9spd4g.js";export{qM as ANONYMOUS_ACQUISITION_SESSION_SOURCE,WM as BIOMETRIC_ENROLLMENT_RESTORE_TIMEOUT_MS,oH as CLOCK_RESTORE_TIMEOUT_MS,Mp as DEVICE_RESTART_RECOVERY_WINDOW_MS,hy as DaemonSessionCreationRejectedError,VM as KEEP_SCREEN_AWAKE_RESTORE_TIMEOUT_MS,LP as NETWORK_CONDITION_RESTORE_RETRY_DELAY_MS,Ol as NETWORK_CONDITION_RESTORE_TIMEOUT_MS,YM as PLAN_AUTO_RELEASE_REASON,fa as PLAN_LABEL_SESSION_SOURCE,Ml as SESSION_CREATE_WAIT_TIMEOUT_MS,GM as SESSION_CREATION_TIMEOUT_REASON,$G as SESSION_REHYDRATION_CONCURRENCY,iI as SESSION_REHYDRATION_DEADLINE_MS,Ts as SESSION_RELEASE_PERSIST_TIMEOUT_MS,jM as SESSION_RELEASE_STUCK_DEADLINE_MS,br as SESSION_RELEASE_TEARDOWN_CAP_MS,zM as SESSION_SETUP_DRAIN_TIMEOUT_MS,aI as SessionManager,Nl as SessionRecoveryIdentityLossError,zt as TerminalSessionError,gy as UnissuedSessionError,zb as getDefaultPreFirstHeartbeatGraceMs,Ya as getDefaultSessionHeartbeatTimeoutMs,KM as getSessionReleaseStuckDeadlineMs,Dl as isAnonymousAcquisitionSession,_d as releaseWasForced};
|
|
3
|
+
|
|
4
|
+
//# debugId=8F2B71F8B3E337F764756E2164756E21
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{i,KR,Se,e}from"./chunk-z8t0v07j.js";import{w,o,M,Zt,du,we,og,YT,Vn,sn,pu,_e,Lm,yz,fr,Rn,qi,da,od,ar,xe}from"./chunk-h3n4adc6.js";import{Ln,_Q}from"./chunk-6d3mmqxt.js";import{ac}from"./chunk-4fgdhcwx.js";import{r,t,u}from"./chunk-9rkfyt6q.js";function $q(n,s){return s==="unique"?{...n,selectionStrategy:"unique"}:n}var x={"nested-container":(n)=>n.selectionStrategy==="unique"||!!n.container?.container,"nested-container-defined":(n)=>n.selectionStrategy==="unique"||n.container?.container!==void 0,"any-container":(n)=>!!n.container||n.selectionStrategy==="unique","swipe-container-options":(n)=>n.container!==void 0||n.selectionStrategy!==void 0||n.index!==void 0,"swipe-look-for-options":(n)=>n.container!==void 0||n.selectionStrategy!==void 0};function es(n,s="nested-container"){return!!n&&x[s](n)}var ba="AutoMobile could not determine the current TalkBack state; using the last known state when available, otherwise the default gesture. TalkBack may have changed.";async function gh(n,s,a,l){if(n.resolveTalkBackStateWithConfirmation)return n.resolveTalkBackStateWithConfirmation(s,a,l);let c=await n.resolveTalkBackState(s,a,l);return{talkBack:c,unconfirmed:c===null}}function k(n){return n.text!==void 0||n.sibling?.text!==void 0}function O(n,s,a){return{viewport:a,action:s.intentAction??(s.selectionIntent==="focus-input"?"focus-input":"tap"),allowHintFallback:s.allowHintFallback,preferToggle:s.selectionIntent==="toggle",preferTap:s.intentAction==="inspect"&&(s.selectionIntent==="tap"||s.selectionIntent==="toggle"),requireBounds:s.intentAction==="inspect",excludeImeKeys:k(n)}}function I(n,s){if(n.match!==void 0)return n;let a=n.sibling;if(a){let l=a.text!==void 0?s.fuzzyMatch===!0:s.partialMatch===!0;return{...n,sibling:a.match||!l?a:{...a,match:"contains"}}}if(n.text!==void 0)return s.partialMatch===!1?{...n,match:"exact"}:n;return n.elementId!==void 0&&s.partialMatch===!0?{...n,match:"contains"}:n}class gr{resolver;projection;options;constructor(n=new ar,s=new we,a={}){this.resolver=n;this.projection=s;this.options=a}selectByText(n,s,a={}){return this.select(n,{text:s},a)}selectByResourceId(n,s,a={}){return this.select(n,{elementId:s},a)}selectByTestTag(n,s,a={}){return this.select(n,{testTag:s},a)}selectClickable(n,s={}){return this.select(n,{},{...s,intentAction:s.intentAction??"tap"})}selectClickableSiblingOfText(n,s,a={}){return this.select(n,{sibling:{text:s}},a)}selectClickableSiblingOfResourceId(n,s,a={}){return this.select(n,{sibling:{elementId:s}},a)}hasContainer(n,s){return this.containerResolution(n,s).scope!==void 0}resolveContainer(n,s,a){return this.resolveContainerMatch(n,s,a)?.element}resolveContainerMatch(n,s,a){let l=this.containerResolution(n,s,a).scope;if(!l)return;let c=Se(l.source)["visible-to-user"];return{element:l.element,...typeof c==="boolean"?{visibleToUser:c}:{}}}containerResolution(n,s,a){let l=this.resolver.resolve({id:"container",nodes:this.selectionNodes(n,{})},{container:$q(s,a)},{action:"inspect"});if(l.error&&!od(l.error))throw new t(l.error,{containerFailure:l.containerFailure});return l}viewport(n,s={}){let a=Rn(n);if(a?.searchRaw||a?.platform!=="ios"&&Zt(n)!==n)return;return qi(n,{...this.options,...s})}select(n,s,a={}){let l=I(s,a),c={id:this.snapshotId(n),nodes:this.selectionNodes(n,a)},p={...l,index:a.index,selectionStrategy:a.strategy,caseSensitive:a.caseSensitive,container:a.container??void 0},m=O(l,a,this.viewport(n,a.screenSizeOptions)),y=this.resolver.resolve(c,p,m);if(this.checkResolutionError(y,a),!y.error&&!y.chosen&&a.intentAction==="long-press")return this.select(n,s,{...a,intentAction:"tap"});let d=this.selectionResult(y,n,a.strategy??"first",l);return m.excludeImeKeys&&!y.error&&!y.chosen?this.flagKeyboardOnlyMatch(d,c,p,m):d}flagKeyboardOnlyMatch(n,s,a,l){let c=this.resolver.resolve(s,a,{...l,excludeImeKeys:!1});return c.chosen&&du(c.chosen)?{...n,onlyKeyboardKeyMatch:!0}:n}checkResolutionError(n,s){let{error:a,containerFailure:l}=n;if(!a)return;if(es({container:s.container,selectionStrategy:s.strategy},"nested-container-defined")||!od(a))throw new t(a,{containerFailure:l})}snapshotId(n){return Rn(n)?.captureId??n.frameContext??String(n.updatedAt??"capture")}selectionNodes(n,s){let a=Rn(n),l=a?.platform==="ios"?n:Zt(n),c=l&&l!==n?this.projection.project(l):a?.nodes??this.projection.project(n);if(!s.scrollableContainer)return c;let p=s.container?this.resolver.resolve({id:"scroll-scope",nodes:c},s.container,{action:"inspect"}).chosen:void 0,m=(y)=>{let d=y;while(d){if(d.affordances.includes("scroll"))return!0;if(d===p)break;d=d.parentIndex===void 0?void 0:c[d.parentIndex]}return!1};return c.map((y)=>m(y)?y:{...y,affordances:[]})}selectionResult(n,s,a,l){let c=da(n,l);return{element:n.chosen?.element??null,...c?.element?{matchedElement:c.element}:{},...Rn(s)?{captureId:Rn(s).captureId}:{},indexInMatches:n.indexInMatches??-1,totalMatches:n.candidates.length,strategy:a}}}async function D(n,s,a){o(a);try{let l=await yz(n,s,a);if(o(a),!l.length)e.debug("Android action display list is empty; retaining prior-observation guidance.");return l}catch(l){if(o(a),l instanceof Error&&l.name==="AbortError")throw l;return e.warn(`Unable to read Android action displays: ${r(l)}`,l),[]}}function P(n,s){return n.map((a)=>{let l=a.uniqueId&&og(a.uniqueId)||a.logicalId,c=s.displays?.panels.find((p)=>p.key===l)?.role;return{key:l,role:c}})}async function T(n,s,a,l){if(n.platform!=="android"||!n.displays?.panels.length)return;let c=await D(a,n.displays.panels,l);if(!c.length||YT(c,s.key)!==void 0)return;let p=P(c,n),m=n.displays.postures.length>0;throw new Vn(KR(s.key,s.role,p,{hasPostures:m,pinned:pu()!==void 0}),{disconnectedPanel:{panel:s,connectedPanels:p.map(({key:y,role:d})=>({key:y,role:d??"unknown"})),hasPostures:m}})}function Uq(n,s=w){let a=s.renderedDisplaySessions();if(!a)return;let l=a.getSessionForDevice(n);if(!l)return;let c=a.getLastRenderedDisplayKey(l);return c===void 0?void 0:{display:{key:c,generation:a.getLastRenderedDisplayGeneration(l)},displayRevision:a.getLastRenderedDisplayRevision(l)}}function F(n,s,a){return a(n)?.displayRevision??s.displayRevision}function B(n,s,a,l){let c=a?.display.generation??l.identityRevision(n),p=()=>Lm(c,l.identityRevision(n),l.currentObservedPanel(n)?.key);return{stale:p,assertCurrent:()=>{if(l.revision(n)!==s)throw p()},assertCallerCurrent:(d)=>{if(d!==void 0&&d!==s)throw p()}}}async function Q7(n,s,a){return s===void 0?void 0:(await K(n,s,a)).displayId}async function K(n,s,a){let l=(a.lastRenderedObservation??Uq)(n.deviceId),c=sn(n.displays,s,{focusedPanelKey:l?.display.key,activePanelKey:l?.display.key,posture:l?.display.posture}),p=await new fr(i).logicalIdForPanel(n,a.adb,c.key,a.signal);return{key:c.key,displayId:p}}async function H(n,s,a,l){if(n.platform==="ios")return;if(n.platform!=="android")throw new t(`Unsupported platform: ${n.platform}`);return new fr(i).logicalIdForPanel(n,s,a,l)}function v(n,s){return{...ac,display:n,freshness:"cached-ok",signal:s}}async function Ni(n,s,a,{adb:l,...c}){let{lastRenderedObservation:p=Uq,signal:m,transitions:y=xe}=c,d=p(n.deviceId),h=y.revision(n.deviceId),{stale:g,assertCurrent:f,assertCallerCurrent:R}=B(n.deviceId,h,d,y),S=sn(n.displays,s,{focusedPanelKey:d?.display.key,activePanelKey:d?.display.key,posture:d?.display.posture}),E=n.platform==="ios"?await a.execute(v(s,m)):void 0;if(d?.display.key!==S.key)throw await T(n,S,l,m),new t(`Coordinates for display "${S.key}" require a prior observation of that panel. Re-observe display "${S.key}" and retry.`);let A=F(n.deviceId,d,p);R(A);let b=E??await a.execute(v(s,m));if(f(),b.display.key!==S.key)throw g();let C=await H(n,l,S.key,m);return f(),{observation:b,displayId:C,assertCurrent:f}}async function pF(n,s,a,{stale:l,signal:c}){o(c),n.assertCurrent();try{let{hierarchy:p}=await s.capture({freshness:"fresh",searchRaw:M.isRawElementSearchEnabled(),timeoutMs:a,signal:c,displayId:n.displayId??0});if(n.assertCurrent(),p.displayId!==(n.displayId??0))throw l();return p}catch(p){if(n.assertCurrent(),p instanceof _e)throw p;return o(c),e.warn(`Fresh display capture failed: ${r(p)}`,p),null}}function Hq(n){throw new t(`${n} is not supported on tvOS; use focus navigation via pressButton (up/down/left/right/select).`)}function ts(n,s){if(n==="tvos")Hq(s)}async function qq(n,s,a){let l=_Q.find((c)=>c===s);if(!l)Hq(`press ${s}`);return a?.throwIfAborted(),await Ln.require(n).request({type:"request_press_button",action:l},a),{success:!0,button:s,keyCode:0}}async function eQ(n,s,a,l={}){let{signal:c}=l,p=()=>{throw new t("tvOS sendKeys supports only type commands into the already focused field; focus it with pressButton select first.")};if(a!==void 0||l.container!==void 0||l.selectionStrategy!==void 0||l.layer!==void 0||l.display!==void 0)p();let m=s.map((d)=>{if(d.action!=="type"||d.text.length===0)return p();if(d.operation==="replace")throw new t("Text replacement is unsupported on tvOS; only appending type commands are supported. Clear/select the existing text via the on-screen keyboard with pressButton, then type.");return d}),y=[];for(let[d,h]of m.entries()){c?.throwIfAborted();try{await Ln.require(n).request({type:"request_append_text",text:h.text},c)}catch(g){c?.throwIfAborted();let f=u(g,"tvOS text entry failed; focus the field with pressButton select first");return e.warn("tvOS sendKeys failed",f),y.push({index:d,action:"type",success:!1,error:f.message}),{success:!1,completedCommands:d,failedIndex:d,commands:y,error:f.message}}y.push({index:d,action:"type",success:!0,textLength:[...h.text].length})}return{success:!0,completedCommands:y.length,commands:y}}
|
|
3
|
+
export{$q,es,ba,gh,gr,Uq,Q7,Ni,pF,Hq,ts,qq,eQ};
|
|
4
|
+
|
|
5
|
+
//# debugId=B298D3D463F421A464756E2164756E21
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{w,ea,pe,v,F,S,pt,Ke,ko,qr,Nw,hi,Ye,T,W,eo,Wo,_v,B5,Vw,WC,Ww,$W,UW,U5,H5,q5,V5,W5,Cte,ra,Jw,Mz,TR,xD,Nz,Fz,CD,Nre,Lz,L3,B3,Fre,U3,H3,Lre,WB,k}from"./chunk-h3n4adc6.js";import{n,a,h,Oe,b,s,Me,p,pp,V,c,Jm,ZB,ud,ib,xR,CR,$D,fp,Tg,ob,sb,DR,Ig,_g,Pt,bne,Nk,Ane,bY,Hj,qj,Ene,Ine,bl,qD,rie,yu,md,AY,ab,jj,TY,i$,Ha,Dg,kY,BR,fie,Gj,a$,hp,UR,Re,cb,qie,Yj,ua}from"./chunk-79q5xsdc.js";import{i,Xe,l,e}from"./chunk-z8t0v07j.js";import"./chunk-mf9spd4g.js";import{QY,$2,rE,K$,A9,TO,V2,kO,G$,W2,EO,z2,T9,j2,k9,J$,X$,Z$,E9,Pu,I9,IO,aE,G2,Q$,Y2,Lg,eU,x9,C9,D9,O9,tU,M9,N9,_O,F9,J2,X2,rU,L9,cE,B9,$9,U9,nU,iU,H9,q9,V9,W9,z9,j9,K9,G9,bb,Y9,J9,X9,Q2,xO,eK,tK,oU,CO,yU,Q9}from"./chunk-z916af47.js";import{L,hl,ke}from"./chunk-32jpxz2y.js";import"./chunk-ggtd5x5a.js";import"./chunk-z04jrpjy.js";import{Be,bh,pn,At,HF,Zn,Xs}from"./chunk-6d3mmqxt.js";import"./chunk-w7zsh13a.js";import{ZI}from"./chunk-v6npjrjm.js";import{k7}from"./chunk-stfzjr9y.js";import"./chunk-tyazf3sk.js";import"./chunk-4fgdhcwx.js";import{QI,A7,T7}from"./chunk-86f2h5ww.js";import"./chunk-0rjm4nx7.js";import{lS,Dy,nq,Xo,iq,qN,UI}from"./chunk-44bt78m9.js";import"./chunk-0e4gm1kj.js";import"./chunk-zg67wjkh.js";import{r,t,u}from"./chunk-9rkfyt6q.js";var $t=new WeakMap;function se(o){let d=$t.get(o);if(d===void 0)d={onPrototypeEvent:(f)=>o.onEvent(f)},$t.set(o,d);return d}function $e(o){return{requestPutPrototypeAsset:(d,f)=>o.putAsset(d,f)}}var wr=s({id:n().min(1),persistent:h(),state:tK,data:eK.optional(),pages:Me(n(),a().int().nonnegative()).default({}),stacks:Oe().optional().transform(Ww),lastSequence:a().int().nonnegative(),hiddenReason:p(["app_layer_window_hidden","device_blocked"]).optional().catch(void 0).describe("Android: the prototype exists but is not visible, and why; absent when visible, when suspended, or with an older CtrlProxy"),suspended:h().optional(),orientation:p(["portrait","landscape","unlocked"]).optional().catch(void 0),statusBar:p(["unsupported"]).optional().catch(void 0),appearance:Oe().optional().transform(CD),storage:Oe().optional().transform(jj),timers:Oe().optional(),feedbackLog:Oe().optional().transform(Q2),shaderFailures:Me(n(),n()).optional().catch(void 0),degradedEffects:Oe().optional().transform(Mz)});function Sr(o){return(o??[]).flatMap((d)=>{let f=wr.safeParse(d);if(!f.success)return e.warn("[prototype] Ignoring malformed prototype in inspect reply",f.error),[];return[f.data]})}function br(o){let d=new Map;for(let f of o)d.set(f.id,[...d.get(f.id)??[],f]);return d}function Rr(o,d,f,m){for(let y of o.shownIds(f.deviceId))if(!m.has(y))d.dismiss(f.deviceId,y),o.dismissed(f,y)}function Ut(o,d,f,{scope:m,report:y}){let{prototypes:P,replayed:g,timersSupported:R}=y,E=Sr(P),A=new Set(E.map((C)=>C.id)),I=br(g);for(let[C,O]of I)if(A.has(C)||O.some((M)=>M.kind==="dismissed")){let M=E.find((N)=>N.id===C);d.adopt(m,C,f,{replayed:O,lastSequence:M?.lastSequence??0})}Rr(o,d,m,A);for(let C of E){if(!I.has(C.id))d.adopt(m,C.id,f,{replayed:[],lastSequence:C.lastSequence});if(!d.isDismissed(m,C.id))o.adopt(m,{...C,storage:jj(C.storage),timers:R?C.timers===void 0?[]:qie(C.timers):void 0})}}async function kr(o,d,f,{timeoutMs:m,signal:y}={}){let{store:P,events:g}=o,R=d.android;if(!R){if(d.ios)return Tr({store:P,events:g},d,d.ios,f);throw new t("inspect needs an Android device or an iOS simulator agent.")}let E=[],A=R.onEvent((C)=>E.push(C)),I;try{let C=await R.supportsCommand(fp);if(y?.throwIfAborted(),!C)return{success:!1,error:new t(W5()).message};I=await R.inspect(m)}catch(C){return y?.throwIfAborted(),e.warn("[prototype] Inspect request failed",C),{success:!1,error:u(C,"Prototype inspect failed").message}}finally{A()}if(!I.success)return{success:!1,error:I.error??"Prototype inspect failed"};return Ut(P,g,se(d.transport),{scope:f,report:{prototypes:I.prototypes,replayed:E,timersSupported:await R.supportsCommand(ud)}}),{success:!0,...ve(P,g,f,{deviceDark:"fresh"}),deviceDroppedEvents:I.droppedEvents??0}}function Wt(o){return o==="inspect"||o==="clearStorage"||o==="simulate"}async function Yt(o,d,f,{target:m,scope:y,signal:P}){if(o.action==="simulate")return k9(m,o);if(o.action==="clearStorage")return X9(m,o,d.store,f.deviceId);return kr(d,m,y,{timeoutMs:o.timeoutMs,signal:P})}var Er=s({shown:h(),id:n().min(1).nullable(),pages:Me(n(),a().int().nonnegative()).default({}),stacks:Oe().optional().transform(Ww),state:tK,data:eK.optional(),lastSequence:a().int().nonnegative(),appearance:Oe().optional().transform(CD),storage:Oe().optional().transform(jj),timers:Oe().optional(),feedbackLog:Oe().optional().transform(Q2),degradedEffects:Oe().optional().transform(Mz)});async function Tr(o,d,f,m){let{store:y,events:P}=o;if(!f.supportsCapability(U3))return{success:!1,error:new t(`inspect: the connected prototype agent does not advertise ${U3}; relaunch the app with launchApp prototype: true to load the agent built for this AutoMobile version.`).message};let g;try{g=await f.status()}catch(G){return e.warn("[prototype] iOS inspect request failed",G),{success:!1,error:u(G,"Prototype inspect failed").message}}if(!g.success)return{success:!1,error:g.error??"Prototype inspect failed"};let R=Er.safeParse(g.status);if(!R.success)return e.warn("[prototype] Malformed iOS agent status in inspect reply",R.error),{success:!1,error:"Prototype inspect failed: the agent returned a malformed status."};let{shown:E,id:A,pages:I,stacks:C,state:O,data:M,lastSequence:N,appearance:_,storage:D,timers:x,feedbackLog:H,degradedEffects:Y}=R.data,he=E&&A!==null?[{id:A,persistent:!1,state:O,data:M,pages:I,stacks:C,lastSequence:N,appearance:_,storage:D,timers:x,feedbackLog:H,degradedEffects:Y}]:[];return Ut(y,P,se(d.transport),{scope:m,report:{prototypes:he,replayed:[],timersSupported:f.supportsCapability(ud)}}),{success:!0,...ve(y,P,m,{deviceDark:"fresh"})}}function ve(o,d,f,m){let y=o.status(f);return{...y,prototypes:y.prototypes.map((P)=>{let g=m.deviceDark==="fresh"?P:B3(P),R={...g,...xD(g.degradedEffects)},E=R.id?d.counts(f,R.id):void 0;return E?.lastSequence===void 0?R:{...R,...E}}),...y.lastResult?{lastResult:B3(y.lastResult)}:{}}}function jt(o,d,f,m){return o.status(d).prototypes.some((P)=>P.id===f&&P.suspended===!0)&&m.timedOut?{warning:Cte}:{}}function Ht(o,d){if(!o)return;Promise.resolve().then(()=>o(d?1:0,1,d?"Prototype event wait finished":"Waiting for a prototype event")).catch((f)=>{e.warn("[prototype] Wait progress notification failed",f)})}async function Jt(o,d,f,{query:m,context:y}){let P=o.awaitEvent(d,m.id,f,{eventName:m.eventName,kind:m.kind,afterSequence:m.afterSequence,timeoutMs:m.timeoutMs,signal:pe(y.signal)});Ht(y.progress,!1);try{return await P}finally{Ht(y.progress,!0)}}var Ar=s({stack:n().nullable(),screen:n().nullable(),x:a().finite(),y:a().finite()}).strict(),zt=s({changes:b(s({key:n(),valueLength:a().optional(),valueType:n().optional(),valid:h().optional()})).optional(),keys:b(n()).optional(),path:n().nullable().optional(),op:n().optional(),stack:n().nullable().optional(),screen:n().nullable().optional(),depth:a().optional(),pager:n().nullable().optional(),page:a().optional(),reason:n().optional(),x:a().optional(),y:a().optional()});function He(o){let d=Object.entries(o??{}).filter(([,f])=>f.path.length>0).sort(([f,m],[y,P])=>P.path.length-m.path.length||(f<y?-1:f>y?1:0))[0];return d?`${d[0]}/${d[1].path.at(-1)}`:"(root)"}function we(o){return o!==null&&typeof o==="object"&&!Array.isArray(o)?o:{}}function Cr(o,d){let f=we(o.payload),m=typeof f.key==="string"?[f.key]:Array.isArray(f.keys)?f.keys.filter((g)=>typeof g==="string"):[],y=we(f.values),P=m.filter((g)=>!d.has("*")&&!d.has(g)).map((g)=>{let R=typeof f.key==="string"?f.value:y[g];return{key:g,...typeof R==="string"?{valueLength:R.length}:{valueType:typeof R},...typeof o.validity?.[g]==="boolean"?{valid:o.validity[g]}:{}}});return P.length?{changes:P}:void 0}function Ir(o,d){if(o.name==="change")return Cr(o,d);if(o.name==="prototype_dead_tap"){let f=Ar.safeParse(o.payload);return f.success?f.data:void 0}return{}}function Or(o){let d=we(o.payload);return{stack:o.name,...typeof d.screen==="string"?{screen:d.screen}:{},...typeof d.depth==="number"?{depth:d.depth}:{}}}function _r(o,d){return{keys:(o.keys??[]).filter((f)=>!d.has("*")&&!d.has(f))}}function Mr(o,d){let f=we(o.payload);switch(o.kind){case"appearance_changed":case"unknown":return;case"emit":return Ir(o,d);case"change":return{path:o.name,...typeof f.op==="string"?{op:f.op}:{}};case"validation_failed":return _r(o,d);case"screen_changed":return Or(o);case"page_changed":return{pager:o.name,...typeof o.payload==="number"?{page:o.payload}:{}};case"dismissed":return typeof f.reason==="string"?{reason:f.reason}:{};default:return}}function Gt(o,d){let f=Mr(o,d);return f===void 0?void 0:{event_sequence:o.sequence,at_ms:o.timestamp,kind:o.kind,name:o.name,screen:He(o.stacks),detail_json:JSON.stringify(f)}}var xr="No text values are recorded. Secure fields are excluded; other fields retain only keys, lengths/types and validity.";function Dr(o){return zt.parse(JSON.parse(o.detail_json))}function Lr(o,d,f){if(f.x===void 0||f.y===void 0)return;let m=o.get(d)??{screen:d,count:0,points:[],grid:[]};if(o.set(d,m),m.count++,m.points.length<200)m.points.push({x:f.x,y:f.y});let y=Math.floor(f.x/48),P=Math.floor(f.y/48),g=m.grid.find((R)=>R.col===y&&R.row===P);if(g)g.count++;else m.grid.push({col:y,row:P,count:1})}function Fr(o,d,f){let m=Dr(o);if(o.kind==="emit"&&o.name==="prototype_dead_tap")d.deadTaps++,Lr(f.taps,d.screen,m);if(o.kind==="validation_failed"){d.validationFailures++;for(let y of m.keys??[])f.fields.set(y,(f.fields.get(y)??0)+1)}if(o.kind==="page_changed"&&o.name!==null)f.pagers.set(o.name,(f.pagers.get(o.name)??0)+1)}function Kt(o,d){let f=o.get(d)??{screen:d,reached:0,left:0,abandoned:0,totalMs:0,averageMs:0,deadTaps:0,validationFailures:0};return o.set(d,f),f.reached++,f}function Xt(o,d,f){let m=new Map,y={taps:new Map,fields:new Map,pagers:new Map},P=Kt(m,o.start_screen),g=o.started_at_ms,R=o.goal===null?null:o.goal===P.screen,E=Math.max(o.started_at_ms,o.ended_at_ms??f);for(let C of d){let O=Math.min(E,Math.max(g,C.at_ms));if(P.totalMs+=O-g,g=O,C.screen!==P.screen)P.left++,P=Kt(m,C.screen);if(o.goal===P.screen)R=!0;Fr(C,P,y)}P.totalMs+=E-g;let A=o.status==="ended"&&o.ended_reason!=="released"&&R!==!0;if(A)P.abandoned=1;let I=[...m.values()].map((C)=>({...C,averageMs:C.totalMs/C.reached}));return{id:o.test_session_id,prototypeId:o.prototype_id,deviceId:o.device_id,sessionUuid:o.session_uuid,cohort:o.cohort,goal:o.goal,startedAt:o.started_at_ms,endedAt:o.ended_at_ms,durationMs:E-o.started_at_ms,status:o.status,endedReason:o.ended_reason,eventCount:d.length,droppedCount:o.dropped_count,truncated:o.dropped_count>0,privacy:xr,funnel:I,completed:R,lastScreenBeforeAbandonment:A?P.screen:null,timePerScreen:I.map(({screen:C,totalMs:O,averageMs:M})=>({screen:C,totalMs:O,averageMs:M})).sort((C,O)=>O.totalMs-C.totalMs),deadTaps:[...y.taps.values()],validationFailures:[...y.fields].map(([C,O])=>({key:C,count:O})),pageChanges:[...y.pagers].map(([C,O])=>({pager:C,count:O}))}}var K=(o)=>o.replaceAll("|","\\|").replaceAll(`
|
|
3
|
+
`," ").replaceAll("\r"," ");function Qt(o){return[`# Prototype test session ${K(o.id)}`,`Prototype: ${K(o.prototypeId)} \xB7 Device: ${K(o.deviceId)} \xB7 Status: ${o.status}`,`Cohort: ${K(o.cohort??"\u2014")} \xB7 Goal: ${K(o.goal??"\u2014")}`,`Completed: ${o.completed===null?"no goal set":o.completed} \xB7 Duration: ${o.durationMs} ms`,`Last screen before abandonment: ${K(o.lastScreenBeforeAbandonment??"\u2014")}`,`Events: ${o.eventCount} \xB7 Dropped: ${o.droppedCount} \xB7 Truncated: ${o.truncated}`,"",o.privacy,"","| Screen | Reached | Left | Abandoned | Total ms | Average ms | Dead taps | Validation failures |","| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |",...o.funnel.map((d)=>`| ${K(d.screen)} | ${d.reached} | ${d.left} | ${d.abandoned} | ${d.totalMs} | ${d.averageMs} | ${d.deadTaps} | ${d.validationFailures} |`),"","Dead taps use window-local dp (points on iOS), with a 48-unit grid. No screenshot overlay is available yet.",...o.validationFailures.map(({key:d,count:f})=>`Validation failures: ${K(d)} = ${f}`),...o.pageChanges.map(({pager:d,count:f})=>`Page changes: ${K(d)} = ${f}`)].join(`
|
|
4
|
+
`)}class Ue{deps;recording=new Map;key(o,d){return JSON.stringify([o.sessionUuid??null,o.deviceId,d])}chain=Promise.resolve();constructor(o){this.deps=o}enqueue(o){let d=this.chain.then(o);return this.chain=d.then(()=>{},(f)=>{e.warn("Prototype test session persistence failed",f)}),d}flush(){return this.chain}begin(o,d,f={}){let m=this.deps.timer.now(),y=this.deps.startScreen(o,d),P=this.deps.deadTapsEnabled(o,d)?"enabled":"off",g=this.deps.ids.next(),R=this.key(o,d),E=[...this.recording.values()].some((A)=>A.scope.deviceId===o.deviceId&&A.id===d);if(!E)this.recording.set(R,{scope:{...o},id:d,testSessionId:g});return this.enqueue(async()=>{let A=await this.deps.store.findActive(o,d);if(A&&E)throw new t("A test session is already active for this device and prototype. End it with testSessionEnd before beginning another.");if(A)await this.deps.store.endSession(A.test_session_id,Math.max(A.started_at_ms,m),"released");let I={test_session_id:g,prototype_id:d,device_id:o.deviceId,session_uuid:o.sessionUuid??null,cohort:f.cohort??null,goal:f.goal??null,start_screen:y,status:"active",started_at_ms:m,ended_at_ms:null,ended_reason:null,dropped_count:0};return await this.deps.store.insertSession(I),this.recording.set(this.key(o,d),{scope:{...o},id:d,testSessionId:I.test_session_id}),{session:I,eventCount:0,deadTaps:P,...P==="off"?{warning:"Add window.deadTaps: true via show to record dead taps (requires prototype_dead_tap_v1)."}:{}}}).catch((A)=>{if(this.recording.get(R)?.testSessionId===g)this.recording.delete(R);throw u(A,"Failed to begin prototype test session")})}recordEvent(o,d){let f=this.recording.get(this.key(o,d.id));if(!f)return;let m=this.deps.timer.now(),y=Gt(d,this.deps.secureKeys(o,d.id)),P=y&&{...y,at_ms:m},g=d.kind==="dismissed";this.enqueue(async()=>{let R=await this.deps.store.findById(f.testSessionId);if(R?.status!=="active")return;if(P)try{await this.deps.store.appendEvents(R.test_session_id,[P])}catch(E){e.warn("Prototype test event append failed",E)}if(g)await this.finish(R,m,"dismissed"),await this.deps.store.pruneEnded()}).catch((R)=>{e.warn("Prototype test event was not persisted",R)})}async active(o,d){let f=await this.deps.store.findActive(o,d);return f?.session_uuid===(o.sessionUuid??null)?f:void 0}async finish(o,d,f){await this.deps.store.endSession(o.test_session_id,Math.max(o.started_at_ms,d),f),this.recording.delete(this.key({deviceId:o.device_id,sessionUuid:o.session_uuid??void 0},o.prototype_id))}endForDismiss(o,d,f){let m=this.recording.get(this.key(o,d));if(!m)return;let y=this.deps.timer.now();this.enqueue(async()=>{let P=await this.deps.store.findById(m.testSessionId);if(P?.status==="active")await this.finish(P,y,f),await this.deps.store.pruneEnded()}).catch((P)=>{e.warn("Prototype test session cleanup failed",P)})}endSessionRecordings(o){for(let{scope:d,id:f}of this.recording.values())if(d.sessionUuid===o)this.endForDismiss(d,f,"released")}endDeviceRecordings(o){for(let{scope:d,id:f}of this.recording.values())if(d.deviceId===o)this.endForDismiss(d,f,"released")}end(o,d){let f=this.deps.timer.now();return this.enqueue(async()=>{let m=await this.active(o,d);if(!m)throw new t("No active test session for this scope and prototype. Use testSessionBegin first, or testSessionReport for a stored session.");await this.finish(m,f,"end");let y=await this.result({...m,status:"ended",ended_at_ms:Math.max(m.started_at_ms,f),ended_reason:"end"},o);return await this.deps.store.pruneEnded(),y})}report(o,d){return this.enqueue(async()=>{let f=d.testSessionId?await this.deps.store.findById(d.testSessionId):await this.deps.store.findLatest(o,d.id);if(!f||d.id!==void 0&&d.id!==f.prototype_id)throw new t("No stored test session for this id. Check testSessionId or begin a test session for this prototype.");return this.result(f,{deviceId:f.device_id,sessionUuid:f.session_uuid??void 0})})}async result(o,d){let f=await this.deps.store.listEvents(o.test_session_id),m=Xt(o,f,this.deps.timer.now());return{session:o,eventCount:f.length,deadTaps:this.deps.deadTapsEnabled(d,o.prototype_id)?"enabled":"off",report:m,markdown:Qt(m)}}}function Zt(o){let d=new Set,f=(m)=>{if(Array.isArray(m)){m.forEach(f);return}if(m===null||typeof m!=="object")return;let y=m;if((y.type==="textField"||y.type==="searchBar")&&typeof y.stateKey==="string"&&y.secure!==!1)d.add(y.stateKey.includes("{")?"*":y.stateKey);Object.values(y).forEach(f)};return f(o),d}var Nr=5000;class We{db;constructor({db:o}={}){this.db=o}getDb(){return this.db??ke()}async insertSession(o){await this.getDb().insertInto("prototype_test_sessions").values(o).execute()}findActive(o,d){return this.getDb().selectFrom("prototype_test_sessions").selectAll().where("device_id","=",o.deviceId).where("prototype_id","=",d).where("status","=","active").executeTakeFirst()}findById(o){return this.getDb().selectFrom("prototype_test_sessions").selectAll().where("test_session_id","=",o).executeTakeFirst()}findLatest(o,d){return this.getDb().selectFrom("prototype_test_sessions").selectAll().where("device_id","=",o.deviceId).where("prototype_id","=",d).where("session_uuid",o.sessionUuid===void 0?"is":"=",o.sessionUuid??null).orderBy("started_at_ms","desc").orderBy("test_session_id","desc").executeTakeFirst()}async appendEvents(o,d){await this.getDb().transaction().execute(async(f)=>{if((await f.selectFrom("prototype_test_sessions").select("status").where("test_session_id","=",o).executeTakeFirstOrThrow()).status!=="active")return;let y=await f.selectFrom("prototype_test_session_steps").select((g)=>g.fn.countAll().as("count")).where("test_session_id","=",o).executeTakeFirstOrThrow(),P=d.slice(0,Math.max(0,Nr-Number(y.count)));for(let g=0;g<P.length;g+=100)await f.insertInto("prototype_test_session_steps").values(P.slice(g,g+100).map((R,E)=>({...R,test_session_id:o,seq:Number(y.count)+g+E+1}))).execute();if(P.length<d.length)await f.updateTable("prototype_test_sessions").set((g)=>({dropped_count:g("dropped_count","+",d.length-P.length)})).where("test_session_id","=",o).execute()})}async endSession(o,d,f){await this.getDb().updateTable("prototype_test_sessions").set({status:"ended",ended_at_ms:d,ended_reason:f}).where("test_session_id","=",o).where("status","=","active").execute()}listEvents(o){return this.getDb().selectFrom("prototype_test_session_steps").selectAll().where("test_session_id","=",o).orderBy("seq").execute()}async pruneEnded(o=50){await this.getDb().transaction().execute(async(d)=>{let f=await d.selectFrom("prototype_test_sessions").selectAll().where("status","=","ended").orderBy("ended_at_ms","desc").orderBy("test_session_id","desc").execute(),m=new Map;for(let y of f){let P=JSON.stringify([y.device_id,y.prototype_id]),g=(m.get(P)??0)+1;if(m.set(P,g),g>Math.max(0,o))await d.deleteFrom("prototype_test_session_steps").where("test_session_id","=",y.test_session_id).execute(),await d.deleteFrom("prototype_test_sessions").where("test_session_id","=",y.test_session_id).execute()}})}}var Vr=pp();function to(o,d){let f=(m,y)=>d.shownSpecs.read(m.deviceId,y);return new Ue({store:o.testSessionStore??new We,timer:o.clock??o.timer??i,ids:o.idGenerator??L,secureKeys:(m,y)=>{let P=f(m,y);return P.kind==="known"?Zt(P.spec):new Set(["*"])},startScreen:(m,y)=>He(d.status(m).prototypes.find((P)=>P.id===y)?.stacks),deadTapsEnabled:(m,y)=>{let P=f(m,y);if(P.kind!=="known")return!1;let g=P.spec.window;return g!==null&&typeof g==="object"&&"deadTaps"in g&&g.deadTaps===!0}})}var $r=(o)=>["testSessionBegin","testSessionEnd","testSessionReport"].includes(o);async function Hr(o,d,f){try{let m=f.action==="testSessionBegin"?await o.begin(d,f.id,f):f.action==="testSessionEnd"?await o.end(d,f.id):await o.report(d,f),y=m.session;return{success:!0,testSession:{id:y.test_session_id,prototypeId:y.prototype_id,deviceId:y.device_id,status:y.status,...y.cohort===null?{}:{cohort:y.cohort},...y.goal===null?{}:{goal:y.goal},startedAt:y.started_at_ms,...y.ended_at_ms===null?{}:{endedAt:y.ended_at_ms},eventCount:m.eventCount,droppedCount:y.dropped_count,deadTaps:m.deadTaps},..."report"in m?{report:Vr.parse(m.report),markdown:m.markdown}:{},..."warning"in m?{warning:m.warning}:{}}}catch(m){return e.warn("Prototype test session action failed",m),{success:!1,error:u(m,"Prototype test session failed").message}}}function oo(o){return o==="status"||$r(o)}function ro(o,d,f){return f.action==="status"?{success:!0,...ve(o.store,o.events,d,{deviceDark:"cached"})}:Hr(o.recorder,d,f)}import{join as ie}from"path";async function Se(o,d,f,{signal:m,timeoutGuidance:y="It may still have saved the prototype: check ProtoViewer before retrying, and unlock the device if it is locked."}={}){let P=d.now()+f;do{m?.throwIfAborted();let g=(await o()).trim();if(g.length>0)return Br(g);await d.sleep(Math.min(iq,Math.max(0,P-d.now())))}while(d.now()<P);throw new t(`ProtoViewer did not answer within ${f} ms. ${y}`)}function Br(o){let d;try{d=JSON.parse(o)}catch(m){throw new t(`ProtoViewer wrote an unreadable result: ${r(m)}`,{cause:m})}let f=V9.safeParse(d);if(!f.success)throw new t(`ProtoViewer wrote an unexpected result: ${f.error.message}`);return f.data}var Ur=1000;class je{deps;constructor(o){this.deps=o}async installed(o){return W(this.deps)==="simulator"&&await this.deps.simctl.installed(this.deps.deviceId,o)}async capabilities(){return}importBundle(o,d,f,m){return this.exchange(f,m,{bytes:o,label:d})}open(o,d,f){return this.exchange(d,f,{libraryId:o})}async exchange(o,d,f){d?.throwIfAborted();let m=this.deps.timer.now(),y=`mcp-${this.deps.ids.next().replace(/[^A-Za-z0-9_-]/g,"")}`.slice(0,64);if(!_O.test(y))throw new t("Generated an unusable ProtoViewer request id.");let P=await this.deps.simctl.dataContainer(this.deps.deviceId,d);if(!P.trim())throw new Xo("Could not resolve ProtoViewer's data container.");let g=ie(P,W9),R=ie(g,z9),E=ie(g,j9),A=ie(R,`${y}.automobile-proto`),I=`${A}.tmp`,C=ie(E,`${y}.json`),O=ie(R,`${y}.request`),M=`${O}.tmp`;try{await this.prepare({inboxDir:R,resultsDir:E,temporary:I,inbox:A},f,d),d?.throwIfAborted(),await this.foreground(o,d),await this.requireFileDelivery(g,Math.max(0,o-(this.deps.timer.now()-m)),d),await this.deliverRequest(M,O,f,d);let N=Math.max(o-(this.deps.timer.now()-m),Math.min(o,Ur)),_=await Se(()=>this.deps.files.read(C),this.deps.timer,N,{signal:d,timeoutGuidance:"Retrying the same spec is safe: imports are idempotent. Open ProtoViewer and unlock the simulator if it is locked."});if(_.request!==y)throw new t(`ProtoViewer answered request ${_.request}, not ${y}; retry the call.`);if(_.status==="prepared")throw new t("ProtoViewer answered a request with a prepare result; retry.");if(_.status==="rejected"&&_.path==="inbox")throw new Xo(`ProtoViewer cannot read the prototype pushed into its inbox: ${_.reason}.`);return _}finally{await this.cleanup([O,M,C,A,I])}}async prepare({inboxDir:o,resultsDir:d,temporary:f,inbox:m},y,P){try{if(await this.deps.files.mkdir(o),await this.deps.files.mkdir(d),"bytes"in y)await this.deps.files.write(f,y.bytes),await this.deps.files.rename(f,m)}catch(g){if(P?.aborted)throw g;throw new Xo(`Could not prepare ProtoViewer's inbox: ${r(g)}`,{cause:g})}}async deliverRequest(o,d,f,m){let y="bytes"in f?{action:"import",...f.label===void 0?{}:{label:f.label}}:{action:"open",libraryId:f.libraryId};try{m?.throwIfAborted(),await this.deps.files.write(o,new TextEncoder().encode(JSON.stringify(y))),await this.deps.files.rename(o,d)}catch(P){if(m?.aborted)throw P;throw new Xo(`Could not publish ProtoViewer's request: ${r(P)}`,{cause:P})}}async foreground(o,d){try{await this.deps.simctl.launch(this.deps.deviceId,o,d)}catch(f){if(d?.aborted)throw f;throw new nq({cause:f})}}async requireFileDelivery(o,d,f){let m=this.deps.timer.now()+d;do{if(f?.throwIfAborted(),(await this.deps.files.read(ie(o,"delivery"))).trim()===K9)return;await this.deps.timer.sleep(Math.min(iq,Math.max(0,m-this.deps.timer.now())))}while(this.deps.timer.now()<m);throw new UI}async cleanup(o){for(let d of o)try{await l(()=>this.deps.files.remove(d),{timer:this.deps.timer,timeoutMs:qN,label:"ProtoViewer cleanup"})}catch(f){e.warn(`[protoviewer] cleanup failed: ${r(f)}`)}}}class Je{client;bundleIdCandidates;bundleIds=new Map;constructor(o,d){this.client=o;this.bundleIdCandidates=d}async installed(o,d){let f=await this.client.listAppsOrThrow(o,{signal:d}),m=eU((y)=>f.some((P)=>P.bundleId===y),this.bundleIdCandidates);if(m===void 0)return this.bundleIds.delete(o),!1;return this.bundleIds.set(o,m),!0}async dataContainer(o,d){try{return await Wo({deviceId:o,bundleId:this.bundleId(o),run:(f)=>this.client.executeCommandArgs(f,void 0,d)})}catch(f){if(f instanceof eo)return e.debug("ProtoViewer data container unresolved"),"";throw f}}async launch(o,d,f){await this.client.executeCommandArgs(["launch",o,this.bundleId(o)],d,f)}bundleId(o){return this.bundleIds.get(o)??Lg}}import{mkdir as Wr,writeFile as Yr,rename as jr,readFile as Jr,rm as zr}from"fs/promises";class ze{async mkdir(o){await Wr(o,{recursive:!0})}async write(o,d){await Yr(o,d)}async rename(o,d){await jr(o,d)}async read(o){try{return await Jr(o,"utf8")}catch(d){if(d instanceof Error&&"code"in d&&d.code==="ENOENT")return e.debug("ProtoViewer result pending"),"";throw d}}async remove(o){await zr(o,{force:!0})}}var be=".mock.automobile.invalid";function Ee(o){let d;try{d=new URL(o)}catch(y){e.debug("[PrototypeMock] URL parse failed.");return}let f=d.hostname.toLowerCase();if(d.protocol!=="https:"&&d.protocol!=="http:"||!f.endsWith(be))return;return{backendId:f.slice(0,-be.length),path:d.pathname,query:Object.fromEntries(d.searchParams)}}var no=(o)=>["defineBackend","clearBackend","backendLog","publish"].includes(o),Ge=(o)=>`https://${o}${be}`;function so(o,d){let f=d.backendId;try{if(d.action==="clearBackend")return{success:!0,backend:{id:f,origin:Ge(f),cleared:o.clear(f)}};if(d.action==="backendLog"||d.action==="publish"){let P=o.get(f);if(P===void 0)return{success:!1,error:`No mock backend "${f}" is defined.`};if(d.action==="backendLog")return{success:!0,backendLog:P.requestLog(d.since)};return{success:!0,backend:{id:f,origin:Ge(f),delivered:P.publish(d.room,d.frame)}}}o.define(f,d.backend);let m=o.get(f),y=Object.fromEntries(Object.entries(m.snapshot()).map(([P,g])=>[P,g.length]));return{success:!0,backend:{id:f,origin:Ge(f),collections:y,routes:m.routeCount,faults:m.faultCount,rooms:m.roomCount,actors:m.actorCount}}}catch(m){return e.warn("Prototype mock backend action failed",m),{success:!1,error:u(m,"Mock backend action failed").message}}}class Qe{state;constructor(o=1){this.state=io(o)}reseed(o){this.state=io(o)}next(){this.state=this.state+1831565813>>>0;let o=this.state;return o=Math.imul(o^o>>>15,o|1),o^=o+Math.imul(o^o>>>7,o|61),((o^o>>>14)>>>0)/4294967296}pick(o){if(o.length===0)throw Error("Random.pick cannot pick from an empty array");return o[Math.floor(this.next()*o.length)]}}var io=(o)=>Math.floor(o)>>>0||1;var{MAX_PROTOTYPE_UPLOAD_BYTES:Yp,MAX_PROTOTYPE_UPLOAD_PARTS:jp,DEFAULT_PROTOTYPE_REQUEST_TIMEOUT_MS:X,MAX_PROTOTYPE_REQUEST_TIMEOUT_MS:Te,MAX_PROTOTYPE_RESPONSE_BYTES:ae,MAX_PROTOTYPE_REQUESTS_IN_FLIGHT:ao}=V.limits;var po=String.raw`params\.[A-Za-z][A-Za-z0-9_]*|query\.[^{}\s]+|body:\/[^{}\s]*`,Gr=[po,String.raw`${po}|item(?::\/[^{}\s]*)?`].map((o)=>({placeholder:new RegExp(String.raw`\{(${o})\}`,"g"),exact:new RegExp(String.raw`^\{(${o})\}$`)}));function co(o,d){if(o.startsWith("params."))return uo(d.params,o.slice(7));if(o.startsWith("query."))return uo(d.query,o.slice(6));if(o==="item")return d.item;if(o.startsWith("item:"))return Pt(d.item,o.slice(5));return Pt(d.body,o.slice(5))}function uo(o,d){return Object.hasOwn(o,d)?o[d]:void 0}function Kr(o){if(o===void 0||o===null)return"";return typeof o==="string"?o:JSON.stringify(o)}class Ae extends Error{}function Q(o,d,f=ae){let{placeholder:m,exact:y}=Gr["item"in d?1:0],P=f,g=(I)=>{if(P-=I,P<0)throw new Ae(`Response body exceeds ${f} bytes.`)},R=new Map,E=(I,C)=>{let O=R.get(I);if(O===void 0)O=JSON.stringify(C).length,R.set(I,O);return O},A=(I)=>{if(typeof I==="string"){let C=y.exec(I);if(C){let O=co(C[1],d)??null;return g(E(C[1],O)),O}return g(I.replace(m,"").length),I.replace(m,(O,M)=>{let N=Kr(co(M,d));return g(N.length),N})}if(Array.isArray(I))return g(2+Math.max(0,I.length-1)),I.map(A);if(typeof I==="object"&&I!==null)return g(2+Math.max(0,Object.keys(I).length-1)),Object.fromEntries(Object.entries(I).map(([C,O])=>(g(C.length+3),[C,A(O)])));return g(JSON.stringify(I).length),I};return A(o)}function de(o,d){let f=o.split("/"),m=d.split("/");if(f.length!==m.length)return;let y={};for(let[P,g]of f.entries()){let R=m[P];if(g.startsWith(":"))y[g.slice(1)]=Ce(R);else if(g!==R)return}return y}function Ce(o){try{return decodeURIComponent(o)}catch(d){return e.debug("[PrototypeMock] path segment is not valid percent-encoding."),o}}var lo=256,Xr={params:{},query:{},body:void 0};class Ze{actors;timer;apply;pending=new Set;disposed=!1;constructor(o,d,f){this.actors=o;this.timer=d;this.apply=f}start(){for(let o of this.actors)if(o.every!==void 0)this.tick(o,1,(o.afterMs??0)+o.every)}onRequest(o,d,f,m){if(f>=400)return;for(let y of this.actors){let[P,g]=y.on?.route.split(" ")??[],R=P===o&&g!==void 0?de(g,d):void 0;if(R!==void 0)this.run(y.do,0,y.afterMs??0,{...m,params:R})}}dispose(){this.disposed=!0;for(let o of this.pending)this.timer.clearTimeout(o);this.pending.clear(),this.steps=0}get pendingCount(){return this.pending.size}tick(o,d,f){this.schedule(f,()=>{if(d<o.maxRuns)this.tick(o,d+1,o.every);this.run(o.do,0,0,Xr)},!1)}run(o,d,f,m){let y=o[d];if(y===void 0||this.disposed)return;let P=f+(y.afterMs??0),g=()=>{this.applyStep(y,m),this.run(o,d+1,0,m)};if(P===0)g();else this.schedule(P,g)}steps=0;schedule(o,d,f=!0){if(this.disposed)return;if(f&&this.steps>=lo){e.warn(`[PrototypeMock] actor step dropped: ${lo} steps already scheduled.`);return}let m=this.timer.setTimeout(()=>{if(this.pending.delete(m),f)this.steps--;if(!this.disposed)d()},o);if(this.pending.add(m),f)this.steps++}applyStep(o,d){let f=Qr(o,d);if(f===void 0)return;let m=this.apply(f);if(m>=400)e.warn(`[PrototypeMock] actor ${f.method} ${f.collection}${f.id===void 0?"":`/${f.id}`} answered ${m}.`)}}function Qr(o,d){try{let f=o.value===void 0?void 0:Q(o.value,d),m=o.id===void 0?void 0:Q(o.id,d),y=m===void 0||m===null?void 0:String(m);if(o.append!==void 0)return{method:"POST",collection:o.append,body:f};if(o.update!==void 0)return{method:"PATCH",collection:o.update,id:y,body:f};if(o.remove!==void 0)return{method:"DELETE",collection:o.remove,id:y};return}catch(f){e.warn(`[PrototypeMock] actor step skipped: ${r(f)}`,f);return}}var fo=10,mo=100,Zr=new Set(["q","_sort","_page","_limit","after","size"]),yo=V.limits.MAX_PROTOTYPE_DATA_ARRAY_ITEMS,oe=(o,d,f={})=>({status:o,headers:f,body:d}),U=(o,d)=>oe(o,{error:d});function en(o){return typeof o==="object"&&o!==null&&!Array.isArray(o)}function tn(o,d){if(typeof o==="number"&&typeof d==="number")return o-d;let f=String(o??""),m=String(d??"");return f<m?-1:f>m?1:0}function on(o,d){if(d===void 0||d==="")return o;let f=d.startsWith("-"),m=f?d.slice(1):d;return[...o].sort((y,P)=>(f?-1:1)*tn(y[m],P[m]))}function rn(o,d){let f=Object.entries(d).filter(([y])=>!Zr.has(y)),m=d.q?.toLowerCase();return o.filter((y)=>f.every(([P,g])=>String(y[P])===g)&&(m===void 0||Object.values(y).some((P)=>(typeof P==="string"||typeof P==="number")&&String(P).toLowerCase().includes(m))))}function et(o,d,f){if(o===void 0)return d;return/^[1-9][0-9]*$/.test(o)&&Number(o)<=f?Number(o):void 0}function nn(o,d){let f=on(rn(o,d),d._sort);if(d.after!==void 0||d.size!==void 0)return sn(f,d);if(d._page===void 0&&d._limit===void 0)return oe(200,f);let m=et(d._limit,fo,mo),y=et(d._page,1,yo);if(m===void 0||y===void 0)return U(400,"_page and _limit must be positive integers (_limit at most 100)");return oe(200,f.slice((y-1)*m,y*m),{"x-total-count":String(f.length)})}function sn(o,d){let f=et(d.size,fo,mo);if(f===void 0)return U(400,"size must be a positive integer of at most 100");let m=0;if(d.after!==void 0&&d.after!==""){let g=o.findIndex((R)=>String(R.id)===d.after);if(g===-1)return U(400,"after names no item in this result");m=g+1}let y=o.slice(m,m+f),P=m+f<o.length;return oe(200,{items:y,next:P?y[y.length-1]?.id??null:null})}function ho(o){return en(o)?o:void 0}function Po(o,d){return o.length<=yo&&d.fits(o)}function tt(o,d,f){let[m,...y]=d.rest;if(y.length>0)return U(404,"No such route");if(m===void 0)return an(o,d,f);let P=o.findIndex((g)=>String(g.id)===m);switch(d.method){case"GET":return P===-1?U(404,"Not found"):oe(200,o[P]);case"PATCH":case"PUT":return dn(o,P,d,f);case"DELETE":return cn(o,P);default:return U(405,`${d.method} is not allowed here`)}}function an(o,d,f){if(d.method==="GET")return nn(o,d.query);if(d.method!=="POST")return U(405,`${d.method} is not allowed here`);let m=ho(d.body);if(m===void 0)return U(400,"Expected a JSON object body");if(m.id!==void 0&&!z2(m.id))return U(400,"id must be a number or a non-empty string other than . and ..");let y=m.id===void 0?{...m,id:f.ids.next()}:m;if(o.some((g)=>String(g.id)===String(y.id)))return U(409,"An item with that id already exists");let P=[...o,y];if(!Po(P,f))return U(413,"The collection is full");return o.push(y),oe(201,y)}function dn(o,d,f,m){let y=ho(f.body);if(y===void 0)return U(400,"Expected a JSON object body");if(d===-1)return U(404,"Not found");let P=o[d];if(y.id!==void 0&&String(y.id)!==String(P.id))return U(400,"The id of an item cannot change");let g=f.method==="PATCH"?{...P,...y,id:P.id}:{...y,id:P.id},R=o.map((E,A)=>A===d?g:E);if(!Po(R,m))return U(413,"The collection is full");return o[d]=g,oe(200,g)}function cn(o,d){if(d===-1)return U(404,"Not found");return o.splice(d,1),oe(200,{})}function go(o){return typeof o==="string"?o:JSON.stringify(o)}function ot(o){let d=new URL("https://room.invalid");return d.pathname=o,d.pathname}var rt=(o)=>Buffer.byteLength(o)<=bl;class nt{rooms;deps;members=new Set;constructor(o,d){this.rooms=o;this.deps=d}memberCount(o){return this.membersOf(o===void 0?void 0:ot(o)).length}join(o,d,f){let m=ot(o),y=this.match(m);if(y===void 0)return{ok:!1,status:404,message:`No mock room matches ${m}.`};if(this.membersOf(m).length>=W2)return{ok:!1,status:503,message:`Mock room ${m} already has ${W2} connections.`};let P={room:y.room,path:m,target:f,timers:[],left:!1};this.members.add(P);let g={params:y.params,query:d,body:void 0};for(let R of y.room.onConnect??[])this.deliverBound(P,R,g);for(let R of y.room.timeline??[])P.timers.push(this.deps.timer.setTimeout(()=>this.deliverBound(P,R.frame,g),R.afterMs));return{ok:!0,connection:{send:(R)=>this.send(P,R),leave:()=>this.leave(P)}}}publish(o,d,f){let m=ot(o),y=go(d);if(!rt(y))return e.warn(`[PrototypeMock] dropped a ${f} frame to ${m}: over ${bl} bytes`),0;this.deps.record(m,f,y);let P=this.membersOf(m);return P.forEach((g)=>g.target.deliver(y)),P.length}closeAll(o){for(let d of[...this.members])this.leave(d),d.target.close(1001,o)}send(o,d){if(o.left)return{ok:!1,reason:"not_open"};if(!rt(d))return{ok:!1,reason:"too_large"};if(this.deps.record(o.path,"client",d),o.room.echo===!0)o.target.deliver(d);if(o.room.relay===!0)this.membersOf(o.path).filter((f)=>f!==o).forEach((f)=>f.target.deliver(d));return{ok:!0}}leave(o){if(o.left)return;o.left=!0,o.timers.forEach((d)=>this.deps.timer.clearTimeout(d)),this.members.delete(o)}deliverBound(o,d,f){if(o.left)return;let m;try{m=go(Q(d,f,bl))}catch(y){e.warn(`[PrototypeMock] dropped a scripted frame to ${o.path}: ${r(y)}`);return}if(rt(m))o.target.deliver(m);else e.warn(`[PrototypeMock] dropped a scripted frame to ${o.path}: too large`)}match(o){for(let d of this.rooms){let f=de(d.path,o);if(f!==void 0)return{room:d,params:f}}return}membersOf(o){return[...this.members].filter((d)=>o===void 0||d.path===o)}}var un=200;class st{definition;deps;collections=new Map;faultHits=new Map;log=[];rooms;seq=0;actors;constructor(o,d){this.definition=o;this.deps=d;for(let[f,m]of Object.entries(o.collections??{}))this.collections.set(f,structuredClone(m));this.rooms=new nt(o.rooms??[],{timer:d.timer,record:(f,m,y)=>this.append({seq:0,room:f,from:m,data:y})}),this.actors=new Ze(o.actors??[],d.timer,(f)=>this.applyActorWrite(f)),this.actors.start()}get actorCount(){return this.definition.actors?.length??0}get roomCount(){return this.definition.rooms?.length??0}join(o,d,f){return this.rooms.join(o,d,f)}publish(o,d){return this.rooms.publish(o,d,"publish")}dispose(o="Mock backend was disposed."){this.actors.dispose(),this.rooms.closeAll(o)}get routeCount(){return this.definition.routes?.length??0}get faultCount(){return this.definition.faults?.length??0}requestLog(o=0){return this.log.filter((d)=>d.seq>o)}snapshot(){return Object.fromEntries([...this.collections].map(([o,d])=>[o,structuredClone(d)]))}async answer(o,d){let f=o.method.toUpperCase();await this.waitLatency(),d?.throwIfAborted();let m=this.faultFor(f,o.path)??await this.cannedRoute(f,o,d),y=m===void 0?this.collectionResponse(f,o):void 0,P=m??y??{status:404,headers:{},body:{error:"No such route"}};if(this.record(f,o,P),y!==void 0)this.broadcastWrite(f,o,y);return this.actors.onRequest(f,o.path,P.status,{query:o.query,body:o.body}),P}applyActorWrite(o){let d=this.collections.get(o.collection);if(d===void 0)return 404;return tt(d,{method:o.method,rest:o.id===void 0?[]:[o.id],query:{},body:o.body},{ids:this.deps.ids,fits:(f)=>this.fitsWith(d,f)}).status}broadcastWrite(o,d,f){let m=Ce(d.path.split("/")[1]??""),y=this.broadcastFor(m,o,f.status);if(y===void 0)return;let P={params:{},query:d.query,body:d.body,item:f.body??null};try{let g=Q(y.room,P);if(typeof g!=="string"||!g.startsWith("/")){e.warn(`[PrototypeMock] broadcast for ${m} dropped: room is not a path`);return}let R=Q(y.frame,P,bl);this.rooms.publish(g,R,"broadcast")}catch(g){e.warn(`[PrototypeMock] broadcast for ${m} dropped: ${r(g)}`)}}broadcastFor(o,d,f){let m=this.definition.broadcasts??{};if(f<200||f>299||!this.collections.has(o)||!Object.hasOwn(m,o))return;let y=m[o];return(y.on??["POST"]).some((P)=>P===d)?y:void 0}async waitLatency(){let o=this.definition.latencyMs;if(o===void 0)return;let d=o.min+Math.floor(this.deps.random.next()*(o.max-o.min+1));if(d>0)await this.deps.timer.sleep(d)}faultFor(o,d){for(let f of this.definition.faults??[]){if(f.method!==void 0&&f.method!==o||!de(f.path,d))continue;let m=(this.faultHits.get(f)??0)+1;if(this.faultHits.set(f,m),f.every!==void 0?m%f.every===0:this.deps.random.next()<f.rate)return{status:f.status,headers:{},body:{error:"mock fault"}}}return}async cannedRoute(o,d,f){for(let m of this.definition.routes??[]){let y=m.method===o?de(m.path,d.path):void 0;if(y!==void 0)return this.routeResponse(m,{params:y,query:d.query,body:d.body},f)}return}async routeResponse(o,d,f){if(o.delayMs!==void 0&&o.delayMs>0)await this.deps.timer.sleep(o.delayMs),f?.throwIfAborted();return{status:o.status??200,headers:o.headers??{},body:o.body===void 0?null:Q(o.body,d)}}collectionResponse(o,d){let[,f,...m]=d.path.split("/").map(Ce),y=f===void 0?void 0:this.collections.get(f);if(y===void 0)return;return tt(y,{method:o,rest:m,query:d.query,body:d.body},{ids:this.deps.ids,fits:(P)=>this.fitsWith(y,P)})}fitsWith(o,d){let f=Object.fromEntries([...this.collections].map(([m,y])=>[m,y===o?d:y]));return j2(this.definition,f)<=kO}record(o,d,f){this.append({seq:0,method:o,path:d.path,query:d.query,status:f.status,...d.body===void 0?{}:{body:d.body}})}append(o){if(o.seq=++this.seq,this.log.push(o),this.log.length>un)this.log.shift()}}var ln=(o)=>o===void 0?hl:new Qe(o);class it{deps;backends=new Map;constructor(o){this.deps=o}define(o,d){this.defineAll({[o]:d})}defineAll(o){let d=Object.entries(o).map(([y,P])=>{if(!EO.test(y))throw new t(`Mock backend id "${y}" must match ${EO.source}.`);let g=T9.safeParse(P);if(!g.success){let R=g.error.issues[0],E=[y,...R?.path??[]].join(".");throw new t(`Invalid mock backend definition at ${E}: ${R?.message??"invalid"}`)}return[y,g.data]}),f=d.filter(([y])=>!this.backends.has(y)).length;if(this.backends.size+f>V2)throw new t(`At most ${V2} mock backends may be defined; clear one first.`);let m=this.deps.createRandom??ln;for(let[y,P]of d)this.backends.get(y)?.dispose(`Mock backend "${y}" was replaced.`),this.backends.set(y,new st(P,{random:m(P.seed),ids:this.deps.ids,timer:this.deps.timer}))}get(o){return this.backends.get(o)}clear(o){return this.backends.get(o)?.dispose(`Mock backend "${o}" was cleared.`),this.backends.delete(o)}clearAll(){for(let o of this.ids())this.clear(o)}ids(){return[...this.backends.keys()]}}class at{states=new Map;begin(o,d){let f=JSON.stringify([o,d]),m=this.states.get(f)??{issued:0,settledValid:0,latestValid:0,inFlight:new Map};return m.issued+=1,m.latestValid=m.issued,m.inFlight.set(m.issued,!1),this.states.set(f,m),m.issued}isLatest(o,d,f){let m=this.states.get(JSON.stringify([o,d]));if(!m)return!0;return m.inFlight.get(f)===!0?f===m.issued:f===m.latestValid}withdraw(o,d,f){let m=this.states.get(JSON.stringify([o,d]));if(!m||m.inFlight.get(f)!==!1)return;if(m.inFlight.set(f,!0),m.latestValid===f)m.latestValid=this.newestValidBelow(m,f)}settle(o,d,f){let m=JSON.stringify([o,d]),y=this.states.get(m);if(!y)return;if(y.inFlight.get(f)===!1)y.settledValid=Math.max(y.settledValid,f);if(y.inFlight.delete(f),y.inFlight.size===0)this.states.delete(m)}trackedIds(){return this.states.size}newestValidBelow(o,d){let f=o.settledValid;for(let[m,y]of o.inFlight)if(!y&&m<d&&m>f)f=m;return f}}var fn=64;function mn(o){return o.kind!==ZB}class dt{events=[];lastSequence;droppedCount=0;push(o){if(this.lastSequence!==void 0&&o.sequence<=this.lastSequence)return!1;if(this.lastSequence=o.sequence,!mn(o))return!1;if(this.events.push(structuredClone(o)),this.events.length>fn)this.events.shift(),this.droppedCount++;return!0}advanceTo(o){if(this.lastSequence===void 0||o>this.lastSequence)this.lastSequence=o}take(o){let d=this.events.findIndex((f)=>f.sequence>(o.afterSequence??-1)&&(o.eventName===void 0||f.name===o.eventName)&&(o.kind===void 0||f.kind===o.kind));return d<0?void 0:this.events.splice(d,1)[0]}status(){return{pendingCount:this.events.length,...this.lastSequence===void 0?{}:{lastSequence:this.lastSequence},droppedCount:this.droppedCount}}startEpoch(){this.events=[],this.lastSequence=void 0}clear(){this.events=[]}}var z=(o,d)=>JSON.stringify([o.sessionUuid??null,o.deviceId,d]);class ct{timer;store;entries=new Map;sources=new Map;telemetry;requests;recorder;constructor(o,d,{telemetry:f,requests:m,recorder:y}={}){this.timer=o;this.store=d;this.telemetry=f,this.requests=m,this.recorder=y}show(o,d,f){for(let y of this.entries.values())if(y.scope.deviceId===o.deviceId&&y.id===d&&z(y.scope,d)!==z(o,d))this.remove(y);let m=this.watch(o,d,f);this.store.startShow(o,d),m.buffer.startEpoch(),m.shown=!0,m.terminal=!1,this.subscribe(o.deviceId,f)}adopt(o,d,f,{replayed:m,lastSequence:y}){let P=this.entries.get(z(o,d)),g=P?.terminal===!0&&P.buffer.status().pendingCount>0;if(P?.shown&&!P.terminal||g)this.watch(o,d,f);else this.show(o,d,f);for(let R of m)this.receive(o.deviceId,R);this.entries.get(z(o,d))?.buffer.advanceTo(y)}isDismissed(o,d){return this.entries.get(z(o,d))?.terminal??!1}counts(o,d){return this.entries.get(z(o,d))?.buffer.status()}async awaitEvent(o,d,f,m){m.signal?.throwIfAborted();let y=this.watch(o,d,f),P=this.take(y,m);if(P)return this.dropConsumedTerminal(y),this.pruneSources(),P;return this.wait(y,m)}replaceShown(o,d){for(let f of this.entries.values())if(f.scope.deviceId===o&&f.id!==d&&f.shown)this.remove(f);this.pruneSources()}dismiss(o,d){for(let f of this.entries.values())if(f.scope.deviceId===o&&(d===void 0||f.id===d))this.remove(f);this.pruneSources()}releaseSession(o){this.recorder?.endSessionRecordings?.(o);let d=new Set(this.store.clearSession(o));for(let f of d)this.recorder?.endDeviceRecordings?.(f);for(let f of this.entries.values())if(f.scope.sessionUuid===o||d.has(f.scope.deviceId))this.remove(f,"released");this.pruneSources()}releaseDevice(o){this.recorder?.endDeviceRecordings?.(o),this.store.clearDevice(o);for(let d of this.entries.values())if(d.scope.deviceId===o)this.remove(d,"released");this.pruneSources()}dispose(){for(let o of this.entries.values())this.remove(o,"released");this.pruneSources()}watch(o,d,f){let m=z(o,d),y=this.entries.get(m);if(!y){if(Array.from(this.entries.values()).some((g)=>g.scope.deviceId===o.deviceId&&g.id===d))throw new t("Prototype events belong to another session; show this id in the current session first.");y={scope:{...o},id:d,buffer:new dt,shown:!1,terminal:!1,waiters:new Set},this.entries.set(m,y)}if(!y.terminal)this.subscribe(o.deviceId,f);return y}subscribe(o,d){let f=this.sources.get(o);if(f?.client===d)return;f?.unsubscribe(),this.sources.set(o,{client:d,unsubscribe:d.onPrototypeEvent((m)=>this.receive(o,m))})}receive(o,d){let f=Array.from(this.entries.values()).find((m)=>m.scope.deviceId===o&&m.id===d.id);if(!f||f.terminal||!f.buffer.push(d))return;try{this.recorder?.recordEvent(f.scope,d)}catch(m){e.warn("Prototype test event recording failed",m)}if(this.store.recordEvent(f.scope,d),d.kind==="dismissed")f.shown=!1,f.terminal=!0,this.requests?.cancelPrototype(f.scope.deviceId,f.id),this.store.dismissed(f.scope,f.id);for(let m of[...f.waiters])m();this.pruneSources();try{this.telemetry?.recordPrototypeEvent(f.scope,d)}catch(m){e.warn(`[PrototypeEventCoordinator] Telemetry recording failed: ${r(m)}`)}}take(o,d){let f=o.buffer.take(d);if(!f)return o.terminal?{...o.buffer.status(),reason:"dismissed"}:void 0;if(f.kind==="dismissed")o.buffer.clear();return{event:{id:f.id,sequence:f.sequence,kind:f.kind,name:f.name,payload:f.payload,...f.context===void 0?{}:{context:f.context},...f.contextTruncated===!0?{contextTruncated:!0}:{},state:f.state,pages:f.pages,...f.stacks?{stacks:structuredClone(f.stacks)}:{},timestamp:f.timestamp,...f.validity===void 0?{}:{validity:f.validity},...f.keys===void 0?{}:{keys:f.keys}},...o.buffer.status()}}async wait(o,d){let f=()=>{},m=new Promise((g)=>{f=()=>{if(d.signal?.aborted)return;let R=this.take(o,d);if(R)o.waiters.delete(f),g(R)},o.waiters.add(f)}),y,P=new Promise((g)=>{y=this.timer.setTimeout(()=>{o.waiters.delete(f),g({...o.buffer.status(),timedOut:!0})},d.timeoutMs??lS)});try{return await l([m,P],{timer:this.timer,signal:d.signal,label:"Await prototype event"})}finally{if(y!==void 0)this.timer.clearTimeout(y);if(o.waiters.delete(f),this.dropConsumedTerminal(o),!o.shown&&!o.terminal&&o.buffer.status().lastSequence===void 0&&o.waiters.size===0)this.entries.delete(z(o.scope,o.id));this.pruneSources()}}dropConsumedTerminal(o){if(o.terminal&&o.waiters.size===0&&o.buffer.status().pendingCount===0&&this.entries.get(z(o.scope,o.id))===o)this.entries.delete(z(o.scope,o.id))}remove(o,d="dismissed"){try{this.recorder?.endForDismiss(o.scope,o.id,d)}catch(f){e.warn("Prototype test session cleanup failed",f)}o.buffer.clear(),o.shown=!1,o.terminal=!0,this.requests?.cancelPrototype(o.scope.deviceId,o.id);for(let f of[...o.waiters])f();this.entries.delete(z(o.scope,o.id))}pruneSources(){for(let[o,d]of this.sources)if(!Array.from(this.entries.values()).some((m)=>m.scope.deviceId===o&&!m.terminal))d.unsubscribe(),this.sources.delete(o)}}var yn=64;function vo(o){return o==="/data"?[]:_g(o.slice(5))}function hn(o,d){let f=vo(o),m=vo(d),y=Math.min(f.length,m.length);return f.slice(0,y).every((P,g)=>P===m[g])}class ut{revisions;sequence=0;devices=new Map;constructor(o){this.revisions=o}beginShow(o,d,f=!0,m){let y=this.devices.get(o)??{entries:new Map,dataWrites:new Map,epoch:0,issued:0,open:new Map,poisonedThrough:0};y.platform=m??y.platform;let P=++this.sequence;y.issued=P;for(let g of y.open.values())if(f||g.replaceOthers||g.id===d)g.superseded=!0;return y.open.set(P,{id:d,replaceOthers:f,superseded:!1}),y.epoch=++this.sequence,this.devices.set(o,y),P}endShow(o,d,f,m){let y=this.devices.get(o),P=y?.open.get(d);if(!y||!P)return;if(y.open.delete(d),y.epoch=++this.sequence,P.superseded)return;if(m){if(m==="indeterminate"&&P.id!==void 0)y.entries.delete(P.id),y.dataWrites.delete(P.id);return}if(f&&d>y.poisonedThrough)this.storeShown(y,f);else y.entries.clear(),y.dataWrites.clear()}storeShown(o,d){if(d.replaceOthers!==!1)o.entries.clear(),o.dataWrites.clear();if(d.spec)o.entries.set(d.id,structuredClone(d.spec)),this.revisions?.recordShow(d.id,{spec:d.spec,platform:o.platform,variant:d.variant,mcpSessionId:d.mcpSessionId});else o.entries.delete(d.id);o.dataWrites.delete(d.id)}read(o,d){let f=this.devices.get(o);if(f&&f.open.size>0)return{kind:"busy"};let m=f?.entries.get(d);return m&&f?{kind:"known",spec:m,version:f.epoch}:{kind:"unknown"}}platformOf(o){return this.devices.get(o)?.platform}devicesShowing(o){return[...this.devices.entries()].filter(([,d])=>d.entries.has(o)).map(([d])=>d).sort()}showStartedSince(o,d){return(this.devices.get(o)?.issued??0)>d}commitPatch(o,d,f,m){let y=this.devices.get(o);if(!y)return!1;let P=y.open.size===0&&y.epoch===f&&y.entries.has(d);if(P)y.entries.set(d,structuredClone(m.spec)),y.epoch=++this.sequence,this.revisions?.recordPatch(d,{spec:m.spec,platform:y.platform,deviceRevision:m.deviceRevision,mcpSessionId:m.mcpSessionId});else this.abandon(o);return P}recordDeviceDataWrite(o,d,f){let m=this.devices.get(o);if(!m)return{kind:"untracked"};if(m.open.size>0)return this.abandon(o),{kind:"dropped"};let y=m.entries.get(d);if(!y)return{kind:"untracked"};let P=f.op==="remove"?UR(y.data,{op:"remove",path:f.path}):f.value===void 0?void 0:f.op==="extend"||f.op==="prepend"?UR(y.data,{...f,value:f.value}):UR(y.data,{...f,value:f.value});if(!P?.success)return this.forget(o,d),{kind:"dropped"};m.entries.set(d,{...y,data:P.data}),m.epoch=++this.sequence;let g=m.dataWrites.get(d)??{floor:0,writes:[]};g.writes.push({path:f.path,revision:f.revision});while(g.writes.length>yn)g.floor=Math.max(g.floor,g.writes.shift().revision);return m.dataWrites.set(d,g),{kind:"mirrored",data:P.data}}dataPatchGuard(o,d,f,m){let y=this.devices.get(o)?.dataWrites.get(d);if(!y||f.length===0)return{kind:"ok"};if(m===void 0)return{kind:"baseRevisionRequired"};let P=m<y.floor,g=y.writes.filter((R)=>R.revision>m&&f.some((E)=>hn(E,R.path)));if(!P&&g.length===0)return{kind:"ok"};return{kind:"conflict",revision:Math.max(m,y.floor,...y.writes.map((R)=>R.revision)),paths:P?[...f]:[...new Set(g.map((R)=>R.path))]}}abandon(o){let d=this.devices.get(o);if(!d)return;d.entries.clear(),d.dataWrites.clear(),d.poisonedThrough=d.issued,d.epoch=++this.sequence}forget(o,d){let f=this.devices.get(o);if(f&&(d===void 0||f.entries.has(d))){if(d===void 0)f.entries.clear(),f.dataWrites.clear();else f.entries.delete(d),f.dataWrites.delete(d);f.epoch=++this.sequence}}retainOnly(o,d){let f=this.devices.get(o);for(let m of f?.entries.keys()??[])if(m!==d)this.forget(o,m)}clearDevice(o){this.devices.delete(o)}}var Pn=["battery","power","audio"];function gn(o){return Pn.find((d)=>d===o)}function vn(o,d){switch(d.kind){case"number":return cb(o,d);case"boolean":return typeof o==="boolean";case"enum":return(d.values??[]).some((f)=>f===o);default:return!1}}function wn(o){let d=o?.event.indexOf(".")??-1;return o&&!o.truncated&&o.event.slice(d+1)==="changed"?gn(o.event.slice(0,d)):void 0}function Sn(o,d){return Object.entries(o).every(([f,m])=>Object.hasOwn(d,f)&&vn(m,d[f].value))}function wo(o){let d=UW(o),f=wn(d),m=Re(d?.data),y=f?yu[f]?.state:void 0;if(!f||!m||!y||!Sn(m,y))return;return{module:f,values:{...m},...d?.simulated?{simulated:!0}:{}}}function bn(o){return o.feedbackLog?{feedbackLog:structuredClone(o.feedbackLog)}:{}}function Rn(o){return{...o.orientation?{orientation:o.orientation}:{},...o.statusBar?{statusBar:o.statusBar}:{}}}function kn(o,d){if(d===void 0)delete o.data;else o.data=structuredClone(d)}function So(o,d){return d===void 0||(o.revision??-1)>d?{}:{revision:d}}function bo(o,d,f){return o==="show"&&d.success?{...f===void 0?{}:{data:structuredClone(f)},...d.stacks?{stacks:structuredClone(d.stacks)}:{}}:{}}var En=128;function Tn(o){return{pages:{...o.pages},...o.stacks?{stacks:structuredClone(o.stacks)}:{},state:{...o.state},...o.context===void 0?{}:{context:structuredClone(o.context)},...o.contextTruncated===!0?{contextTruncated:!0}:{},lastKnown:!0}}function An(o){if(!o)return{};return{pages:{...o.pages},...o.stacks?{stacks:structuredClone(o.stacks)}:{},state:{...o.state},...o.context===void 0?{}:{context:structuredClone(o.context)},...o.contextTruncated===!0?{contextTruncated:!0}:{},lastKnown:!0}}function Cn(o,d){let{stacks:f,...m}=o;return{...m,...!d&&f?{stacks:structuredClone(f)}:{},...o.data===void 0?{}:{data:structuredClone(o.data)},...An(d)}}class lt{clock;maxScopes;scopes=new Map;showDispatches=new Map;shownSpecs;constructor(o=i,d=En,f=new CO(o)){this.clock=o;this.maxScopes=d;this.shownSpecs=new ut(f)}status(o){let d=this.scopes.get(JSON.stringify([o.sessionUuid??null,o.deviceId]));return{prototypes:Array.from(d?.shown.values()??[],(f)=>Cn(f,f.id?d?.snapshots?.get(f.id):void 0)),...d?.lastResult?{lastResult:{...d.lastResult}}:{},...d?.platformStatus?{platformStatus:structuredClone(d.platformStatus)}:{}}}shownOnDevice(o,d){for(let f of this.scopes.values()){let m=f.deviceId===o?f.shown.get(d):void 0;if(m)return structuredClone(m)}return}startShow(o,d){let f=this.scopes.get(JSON.stringify([o.sessionUuid??null,o.deviceId]));if(f)if(d===void 0)f.pendingSnapshots?.clear();else f.pendingSnapshots?.delete(d)}beginShowDispatch(o,d){let f=this.showDispatches.get(o)??new Map;f.set(d,!1),this.showDispatches.set(o,f)}adopt(o,d){let f=JSON.stringify([o.sessionUuid??null,o.deviceId]),m=this.scopes.get(f)??{...o,shown:new Map},y=this.patchedFields(o.deviceId,d.id);this.clearShown(o.deviceId,d.id);let P={id:d.id,lastAction:"show",adopted:!0,...d.persistent===void 0?{}:{persistent:d.persistent},...d.suspended===!0?{suspended:!0}:{},...d.hiddenReason?{hiddenReason:d.hiddenReason}:{},...Rn(d),...d.appearance?{appearance:{...d.appearance}}:{},...d.storage?{storage:structuredClone(d.storage)}:{},...TR(d.degradedEffects),...d.timers?{timers:structuredClone(d.timers)}:{},...bn(d),shaderFailures:structuredClone(d.shaderFailures),success:!0,timestamp:this.clock.now()};m.lastResult=P,m.shown.set(d.id,{...P,...y,...bo("show",{success:!0},d.data)}),m.pendingSnapshots?.delete(d.id),m.snapshots??=new Map,m.snapshots.set(d.id,{pages:{...d.pages},...d.stacks?{stacks:structuredClone(d.stacks)}:{},state:{...d.state},lastKnown:!0}),this.remember(f,m)}recordEvent(o,d){this.applyDeviceDataWrite(o.deviceId,d);let f=this.showDispatches.get(o.deviceId);if(f?.has(d.id)&&d.kind==="appearance_changed"&&L3(void 0,d.payload))f.set(d.id,!0);let m=JSON.stringify([o.sessionUuid??null,o.deviceId]),y=this.scopes.get(m)??{...o,shown:new Map};this.recordDeviceStatus(y,d),y.pendingSnapshots??=new Map;let P=Tn(d);y.pendingSnapshots.set(d.id,P);let g=y.shown.get(d.id);if(g){if(y.snapshots??=new Map,y.snapshots.set(d.id,P),d.kind==="appearance_changed")this.recordAppearanceChange(y,g,d)}this.remember(m,y)}recordDeviceStatus(o,d){let f=wo(d),m=f?o.platformStatus?.[f.module]:void 0;if(f&&!(m&&m.timestamp>d.timestamp))o.platformStatus={...o.platformStatus,[f.module]:{values:f.values,timestamp:d.timestamp,receivedAt:this.clock.now(),...f.simulated?{simulated:!0}:{}}}}recordAppearanceChange(o,d,f){let m=L3(d.appearance,f.payload);if(m)o.shown.set(f.id,{...d,appearance:m})}record(o,d,f,{result:m,details:y={}}){let{displayId:P}=y,g=JSON.stringify([o.sessionUuid??null,o.deviceId]),R=this.scopes.get(g),E=d!=="show"&&f.id!==void 0?R?.shown.get(f.id)?.displayId:void 0,A=this.createResult(d,f,m,{displayId:P??E,chrome:y.chrome}),I=this.consumeShowDispatch(o.deviceId,A);if(!R&&!m.success)return structuredClone(A);let C=R??{...o,shown:new Map,lastResult:A};return C.lastResult=A,this.updatePresence(C,{...I,...bo(d,m,y.data)},y.replaceOthers),this.remember(g,C),structuredClone(A)}applyDeviceDataWrite(o,d){let f=$W(d);if(!f)return;this.shownSpecs.recordDeviceDataWrite(o,d.id,f);for(let m of this.scopes.values()){let y=m.deviceId===o?m.shown.get(d.id):void 0;if(!y)continue;let P=f.op==="remove"?UR(y.data,{op:"remove",path:f.path}):f.value===void 0?void 0:f.op==="extend"||f.op==="prepend"?UR(y.data,{...f,value:f.value}):UR(y.data,{...f,value:f.value}),g={...y,...So(y,f.revision)};if(P?.success)g.data=P.data;else delete g.data;m.shown.set(d.id,g)}}recordPatch(o,d,f){let{data:m,revision:y}=f;for(let P of this.scopes.values()){let g=P.deviceId===o?P.shown.get(d):void 0;if(g){let R={...g,lastAction:"patch",...So(g,y)};if(Object.hasOwn(f,"data"))kn(R,m);P.shown.set(d,R)}}}forgetStorage(o,d){for(let f of this.scopes.values()){if(f.deviceId!==o)continue;let m=f.shown.get(d);if(m?.storage)f.shown.set(d,{...m,storage:void 0});if(f.lastResult?.id===d&&f.lastResult.storage)f.lastResult={...f.lastResult,storage:void 0}}}consumeShowDispatch(o,d){if(d.lastAction!=="show"||!d.success||!d.id)return d;let f=this.showDispatches.get(o),m=f?.get(d.id);if(f?.delete(d.id),f?.size===0)this.showDispatches.delete(o);if(!m)return d;let y={...d};return delete y.appearance,y}remember(o,d){this.scopes.delete(o),this.scopes.set(o,d);for(let f of this.scopes.keys()){if(this.scopes.size<=this.maxScopes)break;this.scopes.delete(f)}}updatePresence(o,d,f){if(d.lastAction==="show"&&d.success&&d.id)this.showPresence(o,d,f);else if(d.lastAction==="dismiss"&&d.success){if(this.shownSpecs.forget(o.deviceId,d.all?void 0:d.id),d.all)this.clearShown(o.deviceId);else if(d.id)this.clearShown(o.deviceId,d.id)}}showPresence(o,d,f){if(!d.id)return;let m=o.pendingSnapshots?.get(d.id);if(this.clearShown(o.deviceId,f===!1?d.id:void 0),o.snapshots??=new Map,m)o.snapshots.set(d.id,m);o.shown.set(d.id,d)}clearDevice(o){this.shownSpecs.clearDevice(o),this.showDispatches.delete(o);for(let[d,f]of this.scopes)if(f.deviceId===o)this.scopes.delete(d)}clearSession(o){let d=new Set(Array.from(this.scopes.values()).filter((f)=>f.sessionUuid===o&&f.lastResult!==void 0).map((f)=>f.deviceId));for(let f of d)this.clearDevice(f);for(let[f,m]of this.scopes)if(m.sessionUuid===o)this.scopes.delete(f);return Array.from(d)}dismissed(o,d){this.shownSpecs.forget(o.deviceId,d),this.clearShown(o.deviceId,d)}patchedFields(o,d){for(let f of this.scopes.values()){let m=f.deviceId===o?f.shown.get(d):void 0;if(m?.lastAction==="patch"||m?.revision!==void 0)return{...m.lastAction==="patch"?{lastAction:"patch"}:{},...m.revision===void 0?{}:{revision:m.revision}}}return{}}shownIds(o){let d=new Set;for(let f of this.scopes.values())if(f.deviceId===o)for(let m of f.shown.keys())d.add(m);return Array.from(d)}createResult(o,d,f,{displayId:m,chrome:y}={}){return{...d,lastAction:o,...m===void 0?{}:{displayId:m},...o==="show"&&f.success&&y!==void 0?{chrome:y}:{},...Lz(o,f),...Yj(o,f),success:f.success,...f.error?{error:f.error}:{},...f.totalTimeMs===void 0?{}:{totalTimeMs:f.totalTimeMs},timestamp:this.clock.now()}}clearShown(o,d){for(let f of this.scopes.values()){if(f.deviceId!==o)continue;if(d===void 0)f.pendingSnapshots?.clear(),f.snapshots?.clear();else f.pendingSnapshots?.delete(d),f.snapshots?.delete(d);if(d===void 0)f.shown.clear();else f.shown.delete(d)}}}class ft{client;constructor(o){this.client=o}async show(o,d={}){return Nre(await this.client.requestShowPrototype(o,d.timeoutMs,void 0,{displayId:d.displayId,reset:d.reset,appearance:d.appearance,replaceOthers:d.replaceOthers,locale:o.strings?d.locale:void 0}))}patch(o,d){return this.client.requestPatchPrototype(o,d)}inspect(o){return this.client.requestInspectPrototypes(o)}save(o,d){return this.client.requestSavePrototype(o,d)}listSaved(o){return this.client.requestListSavedPrototypes(o)}pinSaved(o,d,f){return this.client.requestPinSavedPrototype(o,d,f)}deleteSaved(o,d){return this.client.requestDeleteSavedPrototype(o,d)}dismiss(o,d){return this.client.requestDismissPrototype(o,d)}advanceClock(o,d,f){if(!this.client.requestAdvancePrototypeClock)throw new t("Update the connected CtrlProxy to simulate prototype timers");return this.client.requestAdvancePrototypeClock(o,d,f)}clearStorage(o,d){if(!this.client.requestClearPrototypeStorage)throw new t(ab("android"));return this.client.requestClearPrototypeStorage(o,d)}putAsset(o,d){return this.client.requestPutPrototypeAsset(o,d)}removeAsset(o,d){return this.client.requestRemovePrototypeAsset(o,d)}async status(){return{success:!1,error:"CtrlProxy has no prototype status request; use the host-local status action."}}onEvent(o){return this.client.onPrototypeEvent(o)}supportsCommand(o){return this.client.supportsCommand(o)}}import{Agent as In,request as On}from"http";import{Agent as _n,request as Mn}from"https";import{isIP as xn}from"net";import{checkServerIdentity as Dn}from"tls";import{createBrotliDecompress as Ln,createGunzip as Fn,createInflate as qn}from"zlib";class re extends Error{}function Nn(o){let d=o.headers["content-encoding"]?.toLowerCase(),f=d==="gzip"?Fn():d==="deflate"?qn():d==="br"?Ln():void 0;if(!f)return o;return o.once("error",(m)=>f.destroy(m)),f.once("close",()=>o.destroy()),o.pipe(f)}function Vn(o,d,f){let m=new Headers;for(let A=0;A<o.rawHeaders.length;A+=2)m.append(o.rawHeaders[A],o.rawHeaders[A+1]);let y=o.statusCode??502;if(d==="HEAD"||[204,205,304].includes(y))return o.destroy(),new Response(null,{status:y,headers:m});let P=Nn(o);if(P!==o)m.delete("content-encoding"),m.delete("content-length");let g=P[Symbol.asyncIterator](),R=0,E=new ReadableStream({async pull(A){let{done:I,value:C}=await g.next();if(I)A.close();else if(C instanceof Uint8Array)if(R+=C.byteLength,R>f)P.destroy(),o.destroy(),A.error(new re);else A.enqueue(C);else A.error(Error("Unexpected response chunk type.")),P.destroy(),o.destroy()},async cancel(){o.destroy(),P.destroy(),await g.return?.()}});return new Response(E,{status:y,headers:m})}function $n(o=(m,y)=>(m.protocol==="https:"?Mn:On)(m,y),d=process.env,f=process.versions.bun?"bun":"node"){return(m,y,P,g)=>{if(y.signal?.throwIfAborted(),f==="bun"&&(["HTTP_PROXY","http_proxy","HTTPS_PROXY","https_proxy","ALL_PROXY","all_proxy"].some((I)=>Boolean(d[I]))||Object.entries(d).some(([I,C])=>/^(http|https|all)_proxy$/i.test(I)&&Boolean(C))))return Promise.reject(Error("Pinned transport requires a direct connection."));let R=new URL(m),E=R.hostname.replace(/^\[|\]$/g,""),A=new Headers(y.headers);if(A.set("Host",R.host),!A.has("accept-encoding"))A.set("Accept-Encoding","gzip, deflate, br");return new Promise((I,C)=>{let O=R.protocol==="https:"?new _n({proxyEnv:{}}):new In({proxyEnv:{}}),M,N=()=>{y.signal?.removeEventListener("abort",D),O.destroy()},_=o({protocol:R.protocol,host:P.address,family:P.family,port:R.port||(R.protocol==="https:"?443:80),path:R.pathname+R.search,method:y.method,headers:Object.fromEntries(A),servername:xn(E)?void 0:E,checkServerIdentity:(x,H)=>Dn(E,H),agent:O},(x)=>{if(M=x,x.once("close",N),x.statusCode===void 0||x.statusCode<200||x.statusCode>599){x.destroy(),C(Error("Invalid HTTP response status."));return}I(Vn(x,y.method,g))}),D=()=>{let x=Error("Request cancelled.");N(),M?.destroy(x),_.destroy(x),C(x)};if(y.signal?.addEventListener("abort",D,{once:!0}),_.on("error",(x)=>{N(),C(x)}),_.on("upgrade",(x,H)=>{H.destroy(),N(),C(Error("Protocol upgrades are not supported."))}),y.signal?.aborted)D();else _.end(y.body)})}}var Ie=$n();import{lookup as Hn}from"dns/promises";import{isIP as mt}from"net";var ue=(o)=>Hn(o,{all:!0,verbatim:!0});async function le(o,d,f){if(o.username||o.password)return{code:"invalid_request",message:"URL credentials are not permitted."};let m=Ane(o,d.policy);if(m!==void 0)return{code:"blocked_destination",message:m};let y=o.hostname.replace(/^\[|\]$/g,""),P=mt(y),g=P?[{address:y,family:P}]:await l(()=>d.resolver(y),{timer:d.timer,signal:f,label:"Prototype destination resolution"});if(f.throwIfAborted(),g.length===0)return{code:"network",message:"The destination did not resolve to an address."};if(g.some(({address:R,family:E})=>!mt(R)||mt(R)!==E||!d.policy.permitsAddress(R,bY(o))))return{code:"blocked_destination",message:"The destination is not permitted."};return g[0]}var Bn=new Set([301,302,303,307,308]),Un=5,Eo=new Set(["GET","HEAD"]),Wn=new Set(["content-type","content-encoding","content-language","content-location"]);function gt(o){if(Array.isArray(o))return`[${o.map(gt).join(",")}]`;if(typeof o==="object"&&o!==null)return`{${Object.keys(o).sort().map((f)=>`${JSON.stringify(f)}:${gt(o[f])}`).join(",")}}`;return JSON.stringify(o)}function Yn(o,d){return Object.keys(o).some((f)=>f.toLowerCase()===d)}function jn(o){let d=o,f=d?.code??d?.cause?.code;return f==="ECONNREFUSED"||f==="ConnectionRefused"}var yt=Symbol("too_large"),To=Symbol("literal_null");function vt(o){if(typeof o==="number")return!Number.isFinite(o);if(Array.isArray(o))return o.some(vt);return typeof o==="object"&&o!==null&&Object.values(o).some(vt)}function Jn(o){if(o.length===0)return null;try{let d=JSON.parse(o);if(vt(d))return o;return d===null?To:d}catch(d){return e.debug("[PrototypeHttpExecutor] body is not JSON."),o}}var zn=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,Gn=/[\0\r\n]/;function wt(o){if(Hj(o)!==void 0)return"A request header is not permitted.";for(let[d,f]of Object.entries(o??{})){if(!zn.test(d))return"Header name is not an HTTP token.";if(Gn.test(f))return"A header value contains a CR, LF or NUL character."}return}function Ro(o){let d=Kn(o.url);if(d!==void 0)return{code:"invalid_url",message:d};let f=wt(o.headers);return f===void 0?void 0:{code:"invalid_request",message:f}}function Kn(o){try{let d=new URL(o);return d.protocol==="http:"||d.protocol==="https:"?void 0:`Only http and https URLs are supported, got ${d.protocol}`}catch(d){return e.debug("[PrototypeHttpExecutor] URL parse failed."),"Not an absolute HTTP URL."}}function Xn(o,d,f,m){let y={...o,headers:f.origin===m.origin?o.headers:void 0};if(!((d===301||d===302)&&o.method==="POST"||d===303&&!Eo.has(o.method)))return y;let g=y.headers===void 0?void 0:Object.fromEntries(Object.entries(y.headers).filter(([R])=>!Wn.has(R.toLowerCase())));return{...y,method:"GET",body:void 0,headers:g}}function Qn(o,d){try{return new URL(o,d)}catch(f){e.debug("[PrototypeHttpExecutor] redirect URL parse failed.");return}}function ht(o,d,f){return{ok:!1,error:{code:o,message:d},durationMs:f}}function es(o,d){let f=new Uint8Array(d),m=0;for(let y of o)f.set(y,m),m+=y.byteLength;return f}class St{options;fetchImpl;maxBytes;policy;resolver;constructor(o){this.options=o;this.fetchImpl=o.fetch??Ie,this.maxBytes=o.maxResponseBytes??ae,this.policy=o.policy??new Nk(ZI),this.resolver=o.resolver??ue}async execute(o,d){let{timer:f}=this.options,m=f.now(),y=(C,O)=>({ok:!1,error:{code:C,message:O},durationMs:f.now()-m}),P=Ro(o);if(P!==void 0)return y(P.code,P.message);if(d.aborted)return y("cancelled","Request was cancelled before it started.");let g=Math.min(o.timeoutMs??X,Te),R=new AbortController,E=!1,A=f.setTimeout(()=>{E=!0,R.abort()},g),I=AbortSignal.any([d,R.signal]);try{let C=await this.fetchResponse(o,I,m);if(!("response"in C))return C;return await this.outcomeOf(C.response,C.method,I,m)}catch(C){let O=jn(C);if(e.warn("[PrototypeHttpExecutor] request could not complete.",{connectionRefused:O,aborted:I.aborted,timedOut:E}),I.aborted)return E?y("timeout",`Request timed out after ${g}ms.`):y("cancelled","Request was cancelled.");if(O)return y("connection_refused","Connection refused.");if(C instanceof re)return y("too_large",`Response body exceeds ${this.maxBytes} bytes.`);return y("network","The request could not complete.")}finally{f.clearTimeout(A)}}async fetchResponse(o,d,f){let m=o,y=new URL(m.url),P=(g,R)=>ht(g,R,this.options.timer.now()-f);for(let g=0;;g++){d.throwIfAborted();let R=Ro({...m,url:y.href});if(R!==void 0)return P(R.code,R.message);let E=await this.pinDestination(y,d);if("code"in E)return P(E.code,E.message);d.throwIfAborted();let A=await this.fetchImpl(y.href,this.requestInit(m,d),E,this.maxBytes);if(!Bn.has(A.status))return{response:A,method:m.method};if(await A.body?.cancel(),g===Un)return P("network","Too many redirects.");let I=A.headers.get("location");if(!I)return P("invalid_response","Redirect response has no Location header.");let C=Qn(I,y);if(C===void 0)return P("invalid_response","Redirect Location is not a valid URL.");if(y.protocol==="https:"&&C.protocol==="http:")return P("blocked_destination","The destination is not permitted: scheme downgrade.");m=Xn(m,A.status,y,C),y=C}}pinDestination(o,d){return le(o,{policy:this.policy,resolver:this.resolver,timer:this.options.timer},d)}async outcomeOf(o,d,f,m){let y=()=>this.options.timer.now()-m,P=Object.fromEntries(o.headers.entries());if(o.status<200||o.status>299)return await o.body?.cancel(),{ok:!0,status:o.status,headers:P,body:null,durationMs:y()};let g=await this.readBody(o,d,f);if(g===yt)return ht("too_large",`Response body exceeds ${this.maxBytes} bytes.`,y());if(g===To)return ht("invalid_response","A response body of JSON null cannot be stored in /data.",y());return{ok:!0,status:o.status,headers:P,body:g,durationMs:y()}}requestInit(o,d){let f={...o.headers},m;if(o.body!==void 0&&!Eo.has(o.method)){if(typeof o.body==="string")m=o.body;else if(m=gt(o.body),!Yn(f,"content-type"))f["Content-Type"]="application/json"}return{method:o.method,headers:f,body:m,signal:d,redirect:"manual"}}async readBody(o,d,f){let m=Number(o.headers.get("content-length"));if(Number.isFinite(m)&&m>this.maxBytes)return await o.body?.cancel(),yt;if(d==="HEAD"||o.body===null)return null;let y=o.body.getReader(),P=[],g=0;for(;;){f.throwIfAborted();let{done:R,value:E}=await l(()=>y.read(),{timer:this.options.timer,signal:f,label:"Prototype response body"});if(R)break;if(g+=E.byteLength,g>this.maxBytes)return await y.cancel(),yt;P.push(E)}return Jn(new TextDecoder().decode(es(P,g)))}}function ts(o){if(typeof o!=="string")return o;try{return JSON.parse(o)}catch(d){return e.debug("[PrototypeMock] request body is not JSON."),o}}var Ao=Symbol("mock request timed out");class bt{inner;registry;timer;constructor(o,d,f){this.inner=o;this.registry=d;this.timer=f}async execute(o,d){let f=Ee(o.url);if(f===void 0)return this.inner.execute(o,d);let m=this.timer.now(),y=()=>this.timer.now()-m,P=this.registry.get(f.backendId);if(P===void 0)return{ok:!1,error:{code:"network",message:`No mock backend "${f.backendId}" is defined.`},durationMs:y()};if(d.aborted)return{ok:!1,error:{code:"cancelled",message:"Request was cancelled before it started."},durationMs:y()};let g=Math.min(o.timeoutMs??X,Te),R=new AbortController,E=AbortSignal.any([d,R.signal]),A;try{A=await l(()=>P.answer({method:o.method,path:f.path,query:f.query,body:ts(o.body)},E),{timer:this.timer,timeoutMs:g,signal:d,label:"Mock request",timeoutError:()=>Ao,onTimeout:()=>R.abort()})}catch(I){return this.failure(I,d,g,y())}if(Buffer.byteLength(JSON.stringify(A.body))>ae)return{ok:!1,error:{code:"too_large",message:`Response body exceeds ${ae} bytes.`},durationMs:y()};return{ok:!0,status:A.status,headers:A.headers,body:o.method==="HEAD"?null:A.body,durationMs:y()}}failure(o,d,f,m){if(o instanceof Ae)return{ok:!1,error:{code:"too_large",message:o.message},durationMs:m};if(o===Ao)return{ok:!1,error:{code:"timeout",message:`Request timed out after ${f}ms.`},durationMs:m};if(d.aborted)return{ok:!1,error:{code:"cancelled",message:"Request was cancelled."},durationMs:m};return e.warn(`[PrototypeMock] backend failed: ${r(o)}`,o),{ok:!1,error:{code:"network",message:"The mock backend failed."},durationMs:m}}}class Rt{executor;maxInFlight;inFlight=new Set;constructor(o,d=ao){this.executor=o;this.maxInFlight=d}inFlightCount(o){return[...this.inFlight].filter((d)=>o===void 0||d.deviceId===o).length}async run(o,d){if(this.inFlightCount(o.deviceId)>=this.maxInFlight)return{ok:!1,error:{code:"too_many_in_flight",message:`At most ${this.maxInFlight} requests may be in flight per device.`},durationMs:0};let f={...o,controller:new AbortController};this.inFlight.add(f);try{return await this.executor.execute(d,f.controller.signal)}finally{this.inFlight.delete(f)}}cancelPrototype(o,d){this.cancelWhere((f)=>f.deviceId===o&&f.prototypeId===d)}cancelDevice(o){this.cancelWhere((d)=>d.deviceId===o)}cancelRequest(o,d){let f=(y)=>y.connection===o&&y.requestId===d,m=[...this.inFlight].some(f);return this.cancelWhere(f),m}cancelConnection(o){this.cancelWhere((d)=>d.connection===o)}cancelWhere(o){for(let d of[...this.inFlight].filter(o))e.debug(`[PrototypeRequest] cancelling ${d.deviceId}/${d.prototypeId}`),this.inFlight.delete(d),d.controller.abort()}}function Co(o,d){return new Rt(new bt(new St({timer:o}),d,o))}function Io(o,d,f){if(f!==void 0)o.attachRequestHost?.(H5(d,f))}function Oo(o,d,f){if(f!==void 0)o.attachPrototypeRequestHost?.(H5(d,f))}var rs=/^(sec-websocket-|last-event-id$)/i,_o={websocket:["ws:","wss:"],sse:["http:","https:"]};function fe(o){let d;try{d=new URL(o.url)}catch(m){return e.debug("[PrototypeChannel] URL parse failed."),{code:"invalid_url",message:"Not an absolute URL."}}if(!_o[o.kind].includes(d.protocol))return{code:"invalid_url",message:`A ${o.kind} channel needs a ${_o[o.kind].join(" or ")} URL, got ${d.protocol}`};let f=wt(o.headers);if(f!==void 0)return{code:"invalid_request",message:f};if(Object.keys(o.headers??{}).some((m)=>rs.test(m)))return{code:"invalid_request",message:"A request header is not permitted."};return}class kt{webSocket;sse;constructor(o,d){this.webSocket=o;this.sse=d}open(o,d,f){return(o.kind==="websocket"?this.webSocket:this.sse).open(o,d,f)}}function me(o){let d=!1;return{isClosed:()=>d,silence:()=>{d=!0},sink:{opened:(f)=>{if(!d)o.opened(f)},frame:(f)=>{if(!d)o.frame(f)},closed:(f)=>{if(!d)d=!0,o.closed(f)}}}}var _e={send:()=>({ok:!1,reason:"not_open"}),close:()=>{}};class Et{inner;registry;constructor(o,d){this.inner=o;this.registry=d}open(o,d,f){if(f.aborted)return _e;let m=ns(o.url);if(m===void 0)return this.inner.open(o,d,f);let y=fe(o);if(y!==void 0)return d.closed({error:y}),_e;let P=this.registry.get(m.backendId);if(P===void 0)return d.closed({error:{code:"network",message:`No mock backend "${m.backendId}" is defined.`}}),_e;return ss({backend:P,request:o,target:m},d,f)}}function ns(o){let d=URL.canParse(o)?new URL(o):void 0;if(d?.protocol==="ws:"||d?.protocol==="wss:")d.protocol=d.protocol==="ws:"?"http:":"https:";return Ee(d?.href??o)}function ss({backend:o,request:d,target:f},m,y){let{sink:P,silence:g}=me(m),R=[],E=o.join(f.path,f.query,{deliver:(C)=>R===void 0?P.frame({data:C}):R.push(C),close:(C,O)=>P.closed(d.kind==="websocket"?{code:C,reason:O}:{})});if(!E.ok)return P.closed({error:{code:"handshake_failed",message:E.message,status:E.status}}),_e;let{connection:A}=E;P.opened(d.kind==="websocket"?d.protocols?.[0]:void 0);let I=R;return R=void 0,I.forEach((C)=>P.frame({data:C})),y.addEventListener("abort",()=>{A.leave(),g()},{once:!0}),{send:(C)=>{if(d.kind!=="websocket")return{ok:!1,reason:"unsupported"};if(Buffer.byteLength(C)>qD)return{ok:!1,reason:"too_large"};return A.send(C)},close:(C,O)=>{A.leave(),P.closed({code:C??1000,...O===void 0?{}:{reason:O}})}}}class Tt{executor;maxOpen;open_=new Set;constructor(o,d=rie){this.executor=o;this.maxOpen=d}openCount(o){return[...this.open_].filter((d)=>o===void 0||d.deviceId===o).length}open(o,d,f){if(this.find(o.connection,o.connectionId)!==void 0)return{ok:!1,error:{code:"invalid_request",message:"That connection id is already open."}};if(this.openCount(o.deviceId)>=this.maxOpen)return{ok:!1,error:{code:"too_many_in_flight",message:`At most ${this.maxOpen} channels may be open per device.`}};let m=new AbortController,y={...o,controller:m};return this.open_.add(y),y.handle=this.executor.open(d,{opened:(P)=>f.opened(P),frame:(P)=>f.frame(P),closed:(P)=>{this.open_.delete(y),f.closed(P)}},m.signal),{ok:!0}}send(o,d,f){return this.find(o,d)?.handle.send(f)}close(o,d,f,m){let y=this.find(o,d);return y?.handle.close(f,m),y!==void 0}cancelPrototype(o,d){this.cancelWhere((f)=>f.deviceId===o&&f.prototypeId===d)}cancelDevice(o){this.cancelWhere((d)=>d.deviceId===o)}cancelConnection(o){this.cancelWhere((d)=>d.connection===o)}find(o,d){return[...this.open_].find((f)=>f.connection===o&&f.connectionId===d)}cancelWhere(o){for(let d of[...this.open_].filter(o))e.debug(`[PrototypeChannel] cancelling ${d.deviceId}/${d.prototypeId}`),this.open_.delete(d),d.controller.abort()}}class Ct{handlers;buffer="";pendingCr=!1;atStart=!0;eventName="";dataLines=[];hasData=!1;lastEventId="";constructor(o){this.handlers=o}get pendingChars(){let o=this.dataLines.reduce((d,f)=>d+f.length,0);return this.buffer.length+o+Math.max(0,this.dataLines.length-1)+this.eventName.length+this.lastEventId.length}seedLastEventId(o){this.lastEventId=o}push(o){let d=o;if(this.atStart&&d.length>0)this.atStart=!1,d=d.startsWith("\uFEFF")?d.slice(1):d;for(let f of d){if(this.pendingCr){if(this.pendingCr=!1,f===`
|
|
5
|
+
`)continue}if(f==="\r")this.pendingCr=!0,this.endLine();else if(f===`
|
|
6
|
+
`)this.endLine();else this.buffer+=f}}endLine(){let o=this.buffer;if(this.buffer="",o===""){this.dispatch();return}if(o.startsWith(":"))return;let d=o.indexOf(":"),f=d===-1?o:o.slice(0,d),m=d===-1?"":o.slice(d+1);if(m.startsWith(" "))m=m.slice(1);this.applyField(f,m)}applyField(o,d){if(o==="event")this.eventName=d;else if(o==="data")this.dataLines.push(d),this.hasData=!0;else if(o==="id"){if(!d.includes("\x00"))this.lastEventId=d}else if(o==="retry"&&/^[0-9]+$/.test(d))this.handlers.onRetry?.(Number(d))}dispatch(){let o=this.eventName,d=this.hasData,f=this.dataLines.join(`
|
|
7
|
+
`);if(this.eventName="",this.dataLines=[],this.hasData=!1,!d)return;this.handlers.onEvent({...o===""?{}:{event:o},data:f,...this.lastEventId===""?{}:{id:this.lastEventId}})}}var is=new Set([301,302,303,307,308]),as=5,ps=Number.MAX_SAFE_INTEGER,ds=6;class It{options;pinning;fetchImpl;constructor(o){this.options=o;this.fetchImpl=o.fetch??Ie,this.pinning={policy:o.policy??new Nk(ZI),resolver:o.resolver??ue,timer:o.timer}}open(o,d,f){let m=me(d),y=new AbortController,P=AbortSignal.any([f,y.signal]);return f.addEventListener("abort",()=>m.silence(),{once:!0}),this.run(o,m.sink,P,y),{send:()=>({ok:!1,reason:"unsupported"}),close:(g,R)=>{m.sink.closed({...g===void 0?{}:{code:g},...R===void 0?{}:{reason:R}}),y.abort()}}}async run(o,d,f,m){let y=fe(o);if(y!==void 0){d.closed({error:y});return}let P=!1,g=this.options.timer.setTimeout(()=>{P=!0,m.abort()},X);try{let R=await this.connect(o,f);if(this.options.timer.clearTimeout(g),"code"in R){d.closed({error:R});return}d.opened(),await this.pump(R,o,d,f),d.closed({})}catch(R){if(this.options.timer.clearTimeout(g),f.aborted&&!P)return;d.closed({error:this.failureOf(R,P)})}}failureOf(o,d){if(d)return{code:"timeout",message:"The event stream handshake timed out."};if(o instanceof re)return{code:"too_large",message:`An event exceeded ${bl} bytes.`};e.warn(`[PrototypeChannel] event stream failed: ${r(o)}`);let f=o;return(f?.code??f?.cause?.code)==="ECONNREFUSED"?{code:"connection_refused",message:"Connection refused."}:{code:"network",message:"The event stream failed."}}async connect(o,d){let f=new URL(o.url),m=this.requestHeaders(o,o.headers);for(let y=0;;y++){d.throwIfAborted();let P=await le(f,this.pinning,d);if("code"in P)return P;let g=await this.fetchImpl(f.href,{method:"GET",headers:m,signal:d,redirect:"manual"},P,ps);if(!is.has(g.status))return this.acceptStream(g);await g.body?.cancel();let R=cs(g,f);if(y===as||R===void 0)return{code:"network",message:"Too many redirects or an invalid redirect."};if(f.protocol==="https:"&&R.protocol==="http:")return{code:"blocked_destination",message:"The destination is not permitted: scheme downgrade."};if(f.origin!==R.origin)m=this.requestHeaders(o,void 0);f=R}}requestHeaders(o,d){return{...d,Accept:"text/event-stream","Cache-Control":"no-cache",...o.lastEventId===void 0?{}:{"Last-Event-ID":o.lastEventId}}}async acceptStream(o){let d=o.headers.get("content-type")??"";if(o.status===200&&d.toLowerCase().startsWith("text/event-stream"))return o;return await o.body?.cancel(),{code:"handshake_failed",message:o.status===200?"The server did not answer with text/event-stream.":`The server answered the event stream with HTTP ${o.status}.`,status:o.status}}async pump(o,d,f,m){if(o.body===null)return;let y=new Ct({onEvent:(E)=>{if(Buffer.byteLength(E.data)+Buffer.byteLength(E.event??"")+Buffer.byteLength(E.id??"")>bl)throw new re;f.frame(E)}});if(d.lastEventId!==void 0)y.seedLastEventId(d.lastEventId);let P=new TextDecoder,g=o.body.getReader(),R=()=>void g.cancel().catch(()=>{return});m.addEventListener("abort",R,{once:!0});try{for(;;){m.throwIfAborted();let{done:E,value:A}=await g.read();if(E)return;if(y.push(P.decode(A,{stream:!0})),y.pendingChars>bl+ds)throw new re}}finally{m.removeEventListener("abort",R),await g.cancel().catch((E)=>{e.debug(`[PrototypeChannel] event stream cancel failed: ${r(E)}`)})}}}function cs(o,d){let f=o.headers.get("location");if(!f)return;try{return new URL(f,d)}catch(m){e.debug("[PrototypeChannel] redirect URL parse failed.");return}}import us from"ws";var ls=25000,fs=1000,ms=1001,Mo=(o,d)=>{let f=new us(o.url,o.protocols,{headers:o.headers,followRedirects:!1,handshakeTimeout:o.handshakeTimeoutMs,maxPayload:o.maxPayload,lookup:(m,y,P)=>{let g={address:o.pinned.address,family:o.pinned.family};if(y.all)P(null,[g]);else P(null,g.address,g.family)}});return f.on("open",()=>d.open(f.protocol)),f.on("message",(m,y)=>{if(!y)d.message(m.toString())}),f.on("pong",()=>d.pong()),f.on("close",(m,y)=>d.close(m,y.toString())),f.on("unexpected-response",(m,y)=>{y.resume(),d.unexpectedResponse(y.statusCode??0)}),f.on("error",(m)=>{if(m.code==="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH")d.tooLarge();else d.error(m)}),f};class Ot{request;guarded;signal;socket;isOpen=!1;awaitingPong=!1;handshakeTimer;deadline=new AbortController;pingTimer;sink;timer;socketFactory;pinning;constructor(o,d,f,{timer:m,socketFactory:y,pinning:P}){this.request=o;this.guarded=d;this.signal=f;this.timer=m,this.socketFactory=y,this.pinning=P,this.sink=d.sink,f.addEventListener("abort",()=>this.abort(),{once:!0})}async start(){let o=fe(this.request);if(o!==void 0){this.fail(o);return}this.handshakeTimer=this.timer.setTimeout(()=>{this.deadline.abort(),this.fail({code:"timeout",message:"The WebSocket handshake timed out."})},X);try{let d=await le(new URL(this.request.url),this.pinning,AbortSignal.any([this.signal,this.deadline.signal]));if(this.signal.aborted||this.guarded.isClosed())return;if("code"in d){this.fail(d);return}this.connect(d)}catch(d){if(!this.signal.aborted&&!this.deadline.signal.aborted)e.warn(`[PrototypeChannel] websocket could not start: ${r(d)}`,d),this.fail({code:"network",message:"The connection could not be started."})}}send(o){if(!this.isOpen||this.socket===void 0)return{ok:!1,reason:"not_open"};if(Buffer.byteLength(o)>qD)return{ok:!1,reason:"too_large"};return this.socket.send(o),{ok:!0}}close(o=fs,d){if(this.socket===void 0){this.deadline.abort(),this.cleanup(),this.sink.closed({code:o,...d===void 0?{}:{reason:d}});return}this.socket.close(o,d)}connect(o){this.socket=this.socketFactory({url:this.request.url,protocols:this.request.protocols??[],headers:this.request.headers??{},pinned:o,handshakeTimeoutMs:X,maxPayload:bl},this.events())}events(){return{open:(o)=>{this.clearHandshakeTimer(),this.isOpen=!0,this.pingTimer=this.timer.setInterval(()=>this.ping(),ls),this.sink.opened(o===""?void 0:o)},message:(o)=>{if(Buffer.byteLength(o)>bl)this.tooLarge();else this.sink.frame({data:o})},pong:()=>{this.awaitingPong=!1},close:(o,d)=>{this.cleanup(),this.sink.closed({code:o,...d===""?{}:{reason:d}})},tooLarge:()=>this.tooLarge(),unexpectedResponse:(o)=>this.fail({code:"handshake_failed",message:`The server answered the WebSocket upgrade with HTTP ${o}.`,status:o}),error:(o)=>{e.warn("[PrototypeChannel] websocket error.",{name:o.name}),this.fail(o.code==="ECONNREFUSED"?{code:"connection_refused",message:"Connection refused."}:{code:"network",message:"The connection failed."})}}}ping(){if(this.awaitingPong){this.fail({code:"network",message:"The server stopped answering pings."});return}this.awaitingPong=!0,this.socket?.ping()}tooLarge(){this.fail({code:"too_large",message:`A frame exceeded ${bl} bytes.`})}abort(){this.guarded.silence(),this.cleanup(),this.socket?.close(ms,"Cancelled"),this.socket?.terminate()}fail(o){this.cleanup(),this.sink.closed({error:o}),this.socket?.terminate()}clearHandshakeTimer(){if(this.handshakeTimer!==void 0)this.timer.clearTimeout(this.handshakeTimer),this.handshakeTimer=void 0}cleanup(){if(this.clearHandshakeTimer(),this.pingTimer!==void 0)this.timer.clearInterval(this.pingTimer),this.pingTimer=void 0;this.isOpen=!1}}class _t{options;policy;resolver;socketFactory;constructor(o){this.options=o;this.policy=o.policy??new Nk(ZI),this.resolver=o.resolver??ue,this.socketFactory=o.socketFactory??Mo}open(o,d,f){let m=new Ot(o,me(d),f,{timer:this.options.timer,socketFactory:this.socketFactory,pinning:{policy:this.policy,resolver:this.resolver,timer:this.options.timer}});return m.start(),m}}function xo(o,d,f=new kt(new _t({timer:o}),new It({timer:o}))){return new Tt(new Et(f,d))}function Do(...o){return{cancelPrototype:(d,f)=>o.forEach((m)=>m.cancelPrototype(d,f)),cancelDevice:(d)=>o.forEach((f)=>f.cancelDevice(d))}}function Lo(o,d,f){if(f!==void 0)o.attachChannelHost?.(U5(d,f))}function Fo(o,d,f){if(f!==void 0)o.attachPrototypeChannelHost?.(U5(d,f))}import{mkdir as hs,writeFile as Ps}from"fs/promises";import{dirname as gs}from"path";class Mt{outputDir(){return Xe("prototype-shares")}async write(o,d){await hs(gs(o),{recursive:!0,mode:448}),await Ps(o,d,{mode:420})}}function ce(o){return{appLayer:o.window.layer==="app",devicePersistence:o.window.persistence==="device"}}function qo(o){let d=[...o.appLayer?['window.layer "app"']:[],...o.devicePersistence?['window.persistence "device"']:[]].join(" and ");return`The connected CtrlProxy does not advertise ${xR}, so it would ignore ${d} and show a session-scoped system-layer prototype; update the connected CtrlProxy or omit ${d}.`}var vs=`shell appops set ${pt} SYSTEM_ALERT_WINDOW allow`;async function No(o,d){try{let f=await o.executeCommand(vs,{noRetry:!0,signal:d});if(Ke(f.stdout,f.stderr??""))e.warn(`[prototype] SYSTEM_ALERT_WINDOW appop grant reported a failure: ${`${f.stdout}
|
|
8
|
+
${f.stderr??""}`.trim()}`)}catch(f){if(d?.aborted)throw f;e.warn(`[prototype] SYSTEM_ALERT_WINDOW appop grant failed: ${r(f)}`,f)}}var ws=new Set(["app","notifications"]);function xe(o,d){if(d==="android")return;for(let f of md(o)){if(f.kind!=="call"||f.action.call!=="settings.open")continue;let m=c(c(f.action.args)?.page)?.value;if(typeof m==="string"&&!ws.has(m))return{path:f.path,message:`settings.open page "${m}" is Android only; on iOS use "app" or "notifications"`}}return}var Ss=8000,bs=1000;class xt{deps;target;constructor(o){this.deps=o}async installed(o){let{userId:d}=await new At(this.deps.adb).resolve({currentUser:!0,signal:o}),f=await this.deps.adb.executeCommand(`shell pm list packages --user ${d}`,{noRetry:!0,signal:o}),m=eU((y)=>ko(f.stdout,y),this.deps.appIds);return this.target=m===void 0?void 0:{userId:d,appId:m},this.target!==void 0}async capabilities({timeoutMs:o,refresh:d,signal:f}){let m=await this.requireTarget(f);if(m.userId!==0)return;await this.ensureStorage(m,o,f);let y=await this.installedVersionCode(m,f),P=await this.readCapabilities(m,f),g=P!==void 0&&y!==void 0&&P.versionCode!==y;if(d||g)await this.prepare(m,o,f),P=await this.readCapabilities(m,f);if(P===void 0||y!==void 0&&P.versionCode!==y)return;return{...P.versionName?{version:P.versionName}:{},capabilities:new Set(P.capabilities),updateUrl:U9}}async installedVersionCode(o,d){let f=await Jw(this.deps.adb,o.appId,{signal:d,optional:!0}),m=f?.buildNumber?Number(f.buildNumber):Number.NaN;return Number.isSafeInteger(m)?m:void 0}async readCapabilities(o,d){let f=S(B9(o.userId,o.appId)),m=(await this.shell(`if [ -f ${f} ]; then cat ${f}; fi`,d)).trim();if(m==="")return;let y;try{y=$9.safeParse(JSON.parse(m))}catch(P){e.warn(`[protoviewer] unreadable capabilities report: ${r(P)}`);return}if(!y.success){e.warn(`[protoviewer] capabilities report has an unexpected shape: ${y.error.message}`);return}return y.data}async importBundle(o,d,f,m){let y=await this.requireTarget(m),P=this.deps.timer.now(),g=this.requestId(),R=y.userId===0?H9(y.userId,y.appId,g):J2(y.appId,"inbox",g);if(y.userId===0)await this.ensureStorage(y,f,m);let E=await this.deps.tempFiles.write(o);try{let O=y.userId===0?R:X2(g),M=await this.push(E.path,O,m);if(Ke(M.stdout,M.stderr??""))throw new Xo(`Could not copy the prototype into ProtoViewer's inbox (${R}): ${Rs(M)}.`);if(y.userId!==0)await this.providerShell(L9(y.userId,R,O),m)}catch(O){if(y.userId!==0)await this.removeStagingQuietly(X2(g));throw O}finally{await E.dispose()}let A=[`--es ${tU} ${g}`];if(d!==void 0)A.push(`--es ${M9} ${S(d)}`);let I=Math.max(f-(this.deps.timer.now()-P),Math.min(f,bs)),C=await this.work(y,g,C9,{extras:A,timeoutMs:I,signal:m,cleanup:[R]});if(C.status==="rejected"&&C.path===F9)throw new Xo(`ProtoViewer cannot read the prototype pushed into its inbox: ${C.reason}.`);return C}async open(o,d,f){let m=await this.requireTarget(f),y=this.requestId(),P=[`--es ${tU} ${y}`,`--es ${N9} ${S(o)}`];return await this.work(m,y,D9,{extras:P,timeoutMs:d,signal:f,cleanup:[]})}async requireTarget(o){if(this.target===void 0&&!await this.installed(o))throw new t("ProtoViewer is not installed for the current Android user.");return this.target}async push(o,d,f){try{return await this.deps.adb.execute(["push",o,d],{noRetry:!0,signal:f})}catch(m){if(f?.aborted)throw m;throw new Xo(`Could not copy the prototype into ProtoViewer's inbox (${d}): ${r(m)}.`,{cause:m})}}async ensureStorage(o,d,f){if(await this.storageReady(o,f))return;if(await this.removeShellOwnedFolders(o,f),await this.prepare(o,d,f),!await this.storageReady(o,f))throw new Xo("ProtoViewer reported its inbox ready, but the folders are not there.")}async prepare(o,d,f){let m=this.requestId();try{let y=await this.exchange(o,m,O9,{extras:[`--es ${tU} ${m}`],timeoutMs:Math.min(d,Ss),signal:f,cleanup:[]});if(y.status!=="prepared")throw new t(`ProtoViewer answered a prepare request with ${y.status}.`)}catch(y){if(f?.aborted||y instanceof Dy)throw y;throw new Xo(`ProtoViewer could not prepare its inbox (${r(y)}).`,{cause:y})}}async storageReady(o,d){let f=S(cE(o.userId,o.appId)),m=S(nU(o.userId,o.appId)),y=S(iU(o.userId,o.appId));return(await this.shell(`if [ -d ${m} ] && [ -d ${y} ] && [ ! -O ${f} ] && [ ! -O ${m} ] && [ ! -O ${y} ]; then echo ready; fi`,d)).includes("ready")}async removeShellOwnedFolders(o,d){let f=[cE(o.userId,o.appId),nU(o.userId,o.appId),iU(o.userId,o.appId)].map(S);await this.shell(`for d in ${f.join(" ")}; do if [ -O "$d" ]; then rm -rf "$d"; fi; done`,d)}async work(o,d,f,m){let y=await this.exchange(o,d,f,m);if(y.status==="prepared")throw new t("ProtoViewer answered a request with a prepare result; retry.");return y}requestId(){let o=`mcp-${this.deps.ids.next().replace(/[^A-Za-z0-9_-]/g,"")}`.slice(0,64);if(!_O.test(o))throw new t(`Generated an unusable ProtoViewer request id: ${o}`);return o}async exchange(o,d,f,{extras:m,...y}){let P=o.userId===0?q9(o.userId,o.appId,d):J2(o.appId,"results",d);try{let g=await this.shell(`am start -W --activity-multiple-task --user ${o.userId} -n ${x9(o.appId)} -a ${f} ${m.join(" ")}`,y.signal);ks(g);let R=await Se(()=>o.userId===0?this.shell(`if [ -f ${S(P)} ]; then cat ${S(P)}; fi`,y.signal):this.providerShell(rU("read",o.userId,P),y.signal),this.deps.timer,y.timeoutMs,{signal:y.signal});if(R.request!==d)throw new t(`ProtoViewer answered request ${R.request}, not ${d}; retry the call.`);return R}finally{await this.removeQuietly(o,[P,...y.cleanup])}}async removeQuietly(o,d){try{let f=o.userId===0?`rm -f ${d.map(S).join(" ")}`:d.map((m)=>rU("delete",o.userId,m)).join("; ");await this.shell(f,void 0,{timeoutMs:qN})}catch(f){e.warn(`[protoviewer] cleanup of ${d.join(", ")} failed: ${r(f)}`)}}async removeStagingQuietly(o){try{await this.shell(`rm -f ${S(o)}`,void 0,{timeoutMs:qN})}catch(d){e.warn(`[protoviewer] cleanup of ${o} failed: ${r(d)}`)}}async providerShell(o,d){try{let f=await this.shell(o,d);if(!f.trimStart().startsWith("{")&&Ke(f,""))throw new Xo(`Could not access ProtoViewer's MCP storage: ${f.trim()}.`);return f}catch(f){if(d?.aborted||f instanceof Xo)throw f;throw new Xo(`Could not access ProtoViewer's MCP storage: ${r(f)}.`,{cause:f})}}async shell(o,d,f={}){let m=await this.deps.adb.executeCommand(`shell ${o}`,{noRetry:!0,signal:d,...f});return`${m.stdout}${m.stderr?`
|
|
9
|
+
${m.stderr}`:""}`}}function Rs(o){return`${o.stdout}
|
|
10
|
+
${o.stderr??""}`.trim()}function ks(o){if(/does not exist|Unable to resolve Intent/.test(o))throw new Dy;if(/(^|\n)\s*Error( type \d+)?:|Exception|Permission Denial|Activity not started/.test(o))throw new t(`Could not start ProtoViewer: ${o.trim()}`)}import{mkdtemp as Es,rm as Ts,writeFile as As}from"fs/promises";import{tmpdir as Cs}from"os";import{join as Vo}from"path";class Dt{async write(o){let d=await Es(Vo(Cs(),"automobile-protoviewer-")),f=Vo(d,"bundle.automobile-proto");return await As(f,o,{mode:420}),{path:f,dispose:()=>Ts(d,{recursive:!0,force:!0})}}}function $o(o,d){let f=(E)=>d.releaseDevice(E),m=[o.subscribeSessionRelease((E,A)=>{if(d.releaseSession(E),A)f(A)}),o.subscribeDeviceRemoval(f)],y={},P,g=!1,R=()=>{if(g)return;let E=o.deviceUnboundSource?o.deviceUnboundSource():y;if(P!==void 0&&P.source===E)return;if(P?.unsubscribe(),P=void 0,E===void 0)return;let A=o.subscribeDeviceUnbound(f);if(A)P={source:E,unsubscribe:A}};return R(),{ensureSubscribed:R,unsubscribe:()=>{g=!0,P?.unsubscribe(),P=void 0;for(let E of m)E()}}}function Ho(){let o=new Map;return{run(d,f){let m=(o.get(d)??Promise.resolve()).then(f),y=m.then(()=>{},()=>{});return o.set(d,y),y.then(()=>{if(o.get(d)===y)o.delete(d)}),m}}}var J=(o)=>({success:!1,error:o});function Is(o,d){try{let f=qj(o,d,{stateTests:"skip"});if(!f.success)return J(`Invalid patch at ${f.error.path}: ${f.error.message}`);let m=hp(f.spec);return m.success?{spec:f.spec,validated:m.data}:J(`Invalid patch result at spec.${m.error.path}: ${m.error.message}`)}catch(f){if(e.warn("[prototype] Patch application failed",f),!(f instanceof RangeError))throw f;return J("Invalid patch at ops: Patch is nested too deeply")}}async function Os(o,d){try{return await o.transport.patch({id:d.id,...d.baseRevision===void 0?{}:{baseRevision:d.baseRevision},ops:d.ops},d.timeoutMs)}catch(f){return e.warn("[prototype] Patch request failed",f),{success:!1,delivery:"indeterminate",error:u(f,"Prototype patch failed").message}}}async function _s(o,d,f,m){let y=o.store.shownSpecs.read(d,f.id);if(y.kind==="busy")return J(`Prototype ${f.id} was not patched: a show is in flight on this device. Patch after it returns.`);if(y.kind==="unknown")return J(`Prototype ${f.id} was not patched: this host is not tracking its spec on this device (it was not shown by this host, or a dismiss, a failed show or an overlapping show ended the tracking). Show it, then patch.`);let P=xs(o,d,f,y.spec);if(!("spec"in P))return P;let g=xe(P.spec,o.platform);if(g)return J(`Invalid patch result at spec.${g.path}: ${g.message}`);let R=await o.specRefusal?.(P.spec);if(R!==void 0)return J(R);m?.throwIfAborted();let E=await Os(o,f);return Ms(o,d,f,{read:y,applied:P,result:E})}async function Ms(o,d,f,m){let{read:y,applied:P,result:g}=m;if(g.delivery==="indeterminate")return o.store.shownSpecs.abandon(d),J(`${g.error??"Prototype patch failed"} The device may or may not have applied the patch: show the prototype again before the next patch.`);let R=Vw(g);if(!g.success)return{success:!1,error:g.error??"The device refused the patch.",...R};let E=o.store.shownSpecs.commitPatch(d,f.id,y.version,{spec:P.spec,deviceRevision:R.revision,...o.mcpSessionId===void 0?{}:{mcpSessionId:o.mcpSessionId}});if(E)o.store.recordPatch(d,f.id,{data:P.validated.data,revision:R.revision});else if(!o.store.shownSpecs.showStartedSince(d,y.version))o.store.recordPatch(d,f.id,{revision:R.revision});o.retire(g);let A=Ls(R.revision,E,f.id),I=xD(g.degradedEffects),C=[A.warning,I.warning,...Gj(P.spec)].filter(Boolean).join(" ");return{...A,...I,...C?{warning:C}:{},...J$(P.spec),...X$(P.spec)}}function xs(o,d,f,m){let y=Is(m,f.ops);return"spec"in y?Ds(o,d,f)??y:y}function Ds(o,d,f){let m=o.store.shownSpecs.dataPatchGuard(d,f.id,Ine(f.ops),f.baseRevision);if(m.kind==="baseRevisionRequired")return J("Invalid patch at baseRevision: required for /data ops once the device has written this prototype's data (setData, appendData, prependData, removeData); use the revision from the latest change event or patch result");return m.kind==="conflict"?{success:!1,error:`The patch was refused: the device wrote ${m.paths.join(", ")} after revision ${f.baseRevision}. Re-read the prototype's data and patch again from revision ${m.revision}.`,conflict:{revision:m.revision,state:{},data:m.paths}}:void 0}function Ls(o,d,f){return{success:!0,...o===void 0?{}:{revision:o},...d?{}:{warning:`A show on this device overlapped this patch, so the host no longer tracks prototype ${f}'s spec: show it again before the next patch.`}}}async function Bo(o,d,f,m){let y=await o.supportsPatch();if(m?.throwIfAborted(),!y)return J(new t(WC(o.platform)).message);if(f.baseRevision===void 0&&Ene(f.ops))return J("Invalid patch at baseRevision: required when a patch has /state ops");try{if(Buffer.byteLength(JSON.stringify({id:f.id,baseRevision:f.baseRevision,ops:f.ops}),"utf8")>ua)return J("Invalid patch at ops: Patch byte limit exceeded")}catch(P){if(e.warn("[prototype] Patch serialization failed",P),!(P instanceof RangeError))throw P;return J("Invalid patch at ops: Patch is nested too deeply")}return o.queue.run(d,()=>_s(o,d,f,m))}function Uo(o){return o.map((d)=>`'${d}'`).join(", ")}function Yo(o){let d=o.missing.filter((y)=>!o.supplied.has(y)),f=o.missing.filter((y)=>o.supplied.has(y)),m=[];if(d.length>0)m.push(`The device has no copy of prototype asset(s) ${Uo(d)}, so those images show placeholders. Upload them with assets: [{id, path}] on a show.`);if(f.length>0){let y=o.repair?.kind==="retry-failed"?`the automatic re-upload did not complete: ${o.repair.reason}`:"they were re-uploaded and the prototype re-sent once, and the device still reports them missing";m.push(`Asset(s) ${Uo(f)} were supplied on this call but the device reports them missing; ${y}. Repeat the call to try again.`)}return m.join(" ")}var jo=new WeakSet;function Jo(o){return jo.add(o),o}function Fs(o){return jo.has(o)}function zo(o){if(o.action!=="show")return{};if(o.result.errorCode==="render_failed")return{refusal:"typed"};if(o.success&&o.id){let d=AY(o.spec)?.keys.some((f)=>f.startsWith("data:"));return{shown:{id:o.id,spec:d?void 0:o.spec,replaceOthers:o.replaceOthers,...o.variant?{variant:o.variant}:{}}}}if(o.replaceOthers===!1&&!o.success)return{refusal:Fs(o.result)?"indeterminate":"typed"};return{}}async function qs(o,d,f){if(d.action==="show")return o.transport.show(d.spec,{timeoutMs:d.timeoutMs,displayId:f,reset:d.reset,...d.spec?.strings&&d.locale!==void 0?{locale:d.locale}:{},replaceOthers:d.replaceOthers,appearance:Nz(d.appearance)});let m=d.all?{all:!0}:{id:d.id};return o.transport.dismiss(m,d.timeoutMs)}async function De(o,d,f,{signal:m,cached:y}={}){let P=Dg(d.spec,f.env);if(P)return{uploaded:[],prepared:[],failure:{success:!1,error:P}};if(d.assets===void 0){let A=y?await BR(d.spec,y.serial,y.cache):void 0;return{uploaded:[],prepared:[],...A?{failure:{success:!1,error:A}}:{}}}let g=await aE(d.assets,f.assetFileReader,f.observationScreenshotReader,f.env);if("error"in g)return{uploaded:[],prepared:[],failure:{success:!1,error:g.error}};let R=y?await BR(d.spec,y.serial,y.cache,g.assets):kY(d.spec,g.assets);if(R)return{uploaded:[],prepared:[],failure:{success:!1,error:R}};let E=await G2($e(o.transport),g.assets,{signal:m,action:d.action==="save"?"save":"show",env:f.env});return{uploaded:E.uploaded,prepared:g.assets,...E.success?{}:{failure:{success:!1,error:E.error}}}}async function Go(o,d,f){try{return await qs(o,d,f)}catch(m){return e.warn("[prototype] Request failed",m),Jo({success:!1,error:u(m,"Prototype request failed").message})}}async function Ns(o,d,f,m){try{return await G2($e(o.transport),d,{signal:f,action:"resend",env:m})}catch(y){return e.warn("[prototype] Asset re-upload failed after the show was sent",y),{success:!1,uploaded:[],error:f?.aborted?"the request was cancelled":r(y)}}}async function Vs(o,d,f,{first:m,signal:y,displayId:P,env:g}){let R=new Set(m.missingAssets),E=f.prepared.filter((O)=>R.has(O.id));if(E.length===0)return;let A=(O)=>({result:m,repair:{kind:"retry-failed",reason:O}});if(y?.aborted)return A("the request was cancelled");let I=await Ns(o,E,y,g);if(!I.success)return A(I.error??"upload failed");if(y?.aborted)return A("the request was cancelled before the prototype was re-sent");let C=await Go(o,d,P);return C.success?{result:C,repair:{kind:"still-missing"}}:A(C.error??"re-sending the prototype failed")}function $s(o){return{success:!1,error:`Prototype ${o.spec?.id??""} was not sent: a newer show of the same id on this device started first and is the one on screen.`}}function Hs(o,d){return o.success&&(o.missingAssets?.length??0)>0&&!d()}async function Ko(o,d,f,m){let y=m.superseded??(()=>!1),{signal:P,displayId:g,beforeSend:R}=m;if(f.failure)return{result:f.failure};if(y())return{result:$s(d)};await R?.();let E=await Go(o,d,g);if(!Hs(E,y))return{result:E};let A=await Vs(o,d,f,{first:E,signal:P,displayId:g,env:m.env}),I=A?.result??E;if(!I.missingAssets?.length)return{result:I};return{result:I,warning:Yo({missing:I.missingAssets,supplied:new Set(f.prepared.map((C)=>C.id)),repair:A?.repair})}}var Qo=new Set(V.stringFields),Bs=new Set(V.stringOpaqueFields),Zo=0.4,er="~",Us={a:"\xE1",b:"\u0180",c:"\xE7",d:"\u010F",e:"\xE9",f:"\u0192",g:"\u011F",h:"\u0125",i:"\xED",j:"\u0135",k:"\u0137",l:"\u013C",m:"\u0271",n:"\xF1",o:"\xF3",p:"\xFE",q:"\u01A3",r:"\u0155",s:"\u0161",t:"\u0165",u:"\xFA",v:"\u1E7D",w:"\u0175",x:"\u1E8B",y:"\xFD",z:"\u017E",A:"\xC1",B:"\u0181",C:"\xC7",D:"\u010E",E:"\xC9",F:"\u0191",G:"\u011E",H:"\u0124",I:"\xCD",J:"\u0134",K:"\u0136",L:"\u013B",M:"\u1E40",N:"\xD1",O:"\xD3",P:"\xDE",Q:"\u01EA",R:"\u0154",S:"\u0160",T:"\u0164",U:"\xDA",V:"\u1E7C",W:"\u0174",X:"\u1E8A",Y:"\xDD",Z:"\u017D"},Ws=/\{[^{}]*\}/g;function tr(o){let d=[...bne(o),...[...o.matchAll(/\{t:[^{}]*(?:\{data:[^{}]*\}[^{}]*)?\}/g)].map((m)=>({start:m.index,end:m.index+m[0].length}))],f=[...o.matchAll(Ws)].map((m)=>({start:m.index,end:m.index+m[0].length})).filter((m)=>d.every((y)=>m.end<=y.start||m.start>=y.end));return[...d,...f].sort((m,y)=>m.start-y.start).reduce((m,y)=>{let P=m.at(-1);if(P&&y.start<P.end)P.end=Math.max(P.end,y.end);else m.push({...y});return m},[])}function Lt(o){let d=(y)=>[...y].map((P)=>Us[P]??P).join(""),f=[],m=0;for(let{start:y,end:P}of tr(o))f.push(d(o.slice(m,y)),o.slice(y,P)),m=P;return f.join("")+d(o.slice(m))}function Ft(o){if(o.trim()===""||/^\{t:[^{}]*(?:\{data:[^{}]*\}[^{}]*)?\}$/.test(o))return o;let d=er.repeat(Math.ceil([...o].length*Zo));return`[${Lt(o)}${d}]`}var Ys=new Set(["mention","hashtag","url"]),js=new Set(["screens","components"]);function Js(o,d){let f=tr(o);return a$(o,d).filter((m)=>f.every(({start:y,end:P})=>m.start<=y||m.start>=P)).map((m)=>{let y=f.find(({start:P,end:g})=>m.end>P&&m.end<g);return y?{...m,end:y.end,text:o.slice(m.start,y.end)}:m})}function zs(o,d){if(o.trim()===""||/^\{t:[^{}]*(?:\{data:[^{}]*\}[^{}]*)?\}$/.test(o))return o;let f=Js(o,d),m=f.flatMap((g,R)=>[Lt(o.slice(R===0?0:f[R-1].end,g.start)),g.text]),y=o.slice(f.at(-1)?.end??0),P=er.repeat(Math.ceil([...o].length*Zo));return`${m.join("")}${Lt(y)} ${P}`}function Gs(o){let d=c(o.linkify)?.kinds;return Array.isArray(d)&&d.every((f)=>Ys.has(f))?d:void 0}function Ks(o,d,f,m){if(Bs.has(d))return[d,f];if(js.has(d)&&c(f)){let y=Object.entries(c(f)).map(([P,g])=>[P,Le(g)]);return[d,Object.fromEntries(y)]}if((Qo.has(d)||Qo.has(`${m}.${d}`))&&typeof f==="string"){let y=d==="text"?Gs(o):void 0;return[d,y?zs(f,y):Ft(f)]}return[d,Le(f,d)]}function Le(o,d=""){if(Array.isArray(o))return o.map((m)=>Le(m,d));let f=c(o);if(!f)return o;return Object.fromEntries(Object.entries(f).map(([m,y])=>Ks(f,m,y,d)))}function or(o){let d=Le(o),f=c(d),m=c(c(o)?.strings);if(f&&m)f.strings=Object.fromEntries(Object.entries(m).map(([y,P])=>[y,Object.fromEntries(Object.entries(c(P)??{}).map(([g,R])=>[g,typeof R==="string"?Ft(R):Object.fromEntries(Object.entries(c(R)??{}).map(([E,A])=>[E,typeof A==="string"?Ft(A):A]))]))]));return d}var rr=3,Qs=250,Zs=1000;async function ei(o,d,f,{signal:m,hiddenReason:y}={}){try{for(let P=0;P<rr;P++){m?.throwIfAborted();let g=await o.capture({freshness:"fresh",displayId:f,timeoutMs:Zs,signal:m});if(m?.throwIfAborted(),ra(g.hierarchy))return;if(P<rr-1){await d.sleep(Qs);continue}return ti(g.hierarchy,y)}}catch(P){if(m?.aborted){e.debug("App-layer visibility confirmation cancelled; the dispatched show is retained");return}e.warn("Could not confirm Android app-layer prototype visibility",P);return}return}function ti(o,d){if(!o.prototypeHiddenReason&&oi(o))return;let f=o.prototypeHiddenReason??d;if(f)return{visible:!1,notVisibleReason:f,warning:B5(f,o.packageName)};return ri(o)}function oi(o){return o.prototypeSuspended===!0||!o.windows?.length||o.ctrlProxyIncomplete===!0||o.hierarchy.error!==void 0}function ri(o){return{visible:!1,notVisibleReason:"no_prototype_window_on_screen",warning:`The prototype was shown with window.layer "app" but no prototype window is on screen. The app in front${o.packageName?` (${o.packageName})`:""} most likely hides app-layer windows drawn over it (system apps such as Settings do); a locked device hides it too. Until it is visible, layer "prototype" calls will report that no prototype is showing. Show it again without window.layer (the default layer draws over every app) or over a different app, or dismiss it.`}}async function nr(o){if(!o.android||o.action!=="show"||!o.success||o.superseded())return{};if(o.hiddenReason==="device_blocked")return{visible:!1,notVisibleReason:"device_blocked",warning:B5("device_blocked")};if(!ce(o.spec).appLayer)return{};let d=await ei(o.capture(),o.timer??i,o.displayId,{signal:o.signal,hiddenReason:o.hiddenReason});return o.superseded()?{}:d??{}}function sr(o){return`The connected ${o==="android"?"CtrlProxy":"iOS prototype agent"} does not advertise prototype_dead_tap_v1, so it would ignore window.deadTaps and report no dead taps. Nothing was shown. ${o==="android"?"Update the connected CtrlProxy":"Update the iOS prototype agent by relaunching the app with launchApp prototype: true"}, or omit window.deadTaps.`}var qt={prototype_platform_namespace_v1:17,prototype_icon_effects_v1:17,prototype_glass_v1:26,prototype_keyframes_v1:17,prototype_motion_tokens_v1:17,prototype_zoom_transition_v1:18};function ir(o,d=qt){let f=d[o];return f===void 0?"":` It needs iOS ${f} or later.`}function ni(o){return`The ${o==="ios"?"connected iOS prototype agent":"connected CtrlProxy"} does not advertise ${CR}, so it would ignore window.chrome "none" and keep the host dismiss bar. Nothing was shown. ${o==="ios"?"Relaunch the app with launchApp prototype: true to load the agent built for this AutoMobile version":"Update the connected CtrlProxy"}, or omit window.chrome (the bar is then kept and reported).`}function ar(o,{supported:d,platform:f}){let m=o.window.chrome,y=m===void 0?{}:{requested:m};if(o.window.placement.type!=="fullscreen")return{...y,...m===void 0?{}:{refusal:"window.chrome applies to a fullscreen placement only; omit it for a sheet or floating window. Nothing was shown."}};if(!d&&m==="none")return{...y,refusal:ni(f)};return{...y,effective:d?m??(o.window.persistence==="device"?"bar":"none"):"bar"}}async function si(o,d,f,{dependencies:m,signal:y}){if(f.action!=="show"||f.display===void 0||!o.android)return;let P=await rE(d,f.display,{adb:(m.adbFactory??v).create(d),lastRenderedObservation:m.lastRenderedObservation});if(y?.throwIfAborted(),!P)return;let g=await o.android.supportsCommand(ib);if(y?.throwIfAborted(),!g)throw new t(q5(P));return P}async function ii(o,d,f){if(d.action!=="show"||d.spec===void 0)return;let m=pr(d)?await ai(o,d,f):void 0;if(m)return m;let y=ce(d.spec);if(!y.appLayer&&!y.devicePersistence)return;if(!o.android)return;let P=await o.android.supportsCommand(xR);if(f?.throwIfAborted(),!P)return{success:!1,error:new t(qo(y)).message};return}function pr(o){return o.action==="show"&&o.spec?.window.deadTaps===!0}async function ai(o,d,f){if(!pr(d))return;let m=o.android?await o.android.supportsCommand($D):o.ios?.supportsCapability($D)===!0;return f?.throwIfAborted(),m?void 0:{success:!1,error:new t(sr(o.android?"android":"ios")).message}}function dr(o,d,f,{dependencies:m,signal:y}){if(f.action!=="show"||f.spec===void 0||!o.android)return;if(!ce(f.spec).appLayer)return;return async()=>{await No((m.adbFactory??v).create(d),y),y?.throwIfAborted()}}function pi(o,d,f){if(!o.android&&Ha(d).length)return{success:!1,error:TY};let m=Dg(d,f);return m?{success:!1,error:m}:void 0}async function Nt(o,d,f,{iosMinimumOs:m=qt,env:y}={}){let P=pi(o,d,y);if(P)return P;for(let g of Y2(d,o.android?"android":"ios")){let R=o.android?await o.android.supportsCommand(g.capability):o.ios?.supportsCapability(g.capability)===!0;if(f?.throwIfAborted(),!R){let E=o.android?"android":"ios",A=E==="ios"?ir(g.capability,m):"",I=g.unsupportedMessage(g.fields,E)+A;return{success:!1,error:new t(I).message}}}return}async function di(o,d,f){let m=d.action==="show"?Nz(d.appearance):void 0;if(m===void 0)return;let y=o.android?await o.android.supportsCommand(DR):o.ios?.supportsCapability(DR)===!0;if(f?.throwIfAborted(),y)return;let P=Fz(m,o.android?"android":"ios");return{success:!1,error:new t(P).message}}async function ci(o,d,f){if(d.action!=="show"||d.replaceOthers!==!1)return;let m=o.android?await o.android.supportsCommand(ob):!1;if(f?.throwIfAborted(),m)return;let y=o.android?V5():H3;return{success:!1,error:new t(y).message}}async function ui(o,d,f){if(d.action!=="show"||!d.spec)return{};let m=d.spec,P=m.window.placement.type==="fullscreen"?o.android?await o.android.supportsCommand(CR):o.ios?.supportsCapability(CR)===!0:!1;f?.throwIfAborted();let g=ar(m,{supported:P,platform:o.android?"android":"ios"});if(g.refusal)return{failure:{success:!1,error:new t(g.refusal).message}};return g.effective===void 0?{}:{chrome:g.effective}}var li=`The connected iOS prototype agent does not advertise ${Tg}, so it does not support reset: it would keep the pager pages instead of starting fresh. Nothing was shown. Relaunch the app with launchApp prototype: true to load the agent built for this AutoMobile version, or omit reset.`;function fi(o,d){if(d.action!=="show"||d.reset!==!0||!o.ios||o.ios.supportsCapability(Tg))return;return{success:!1,error:new t(li).message}}var mi=`The connected CtrlProxy does not advertise ${sb}, so it would ignore anchor and draw the node at its normal position. Nothing was shown. Update the connected CtrlProxy, or remove anchor.`,yi=`The connected iOS prototype agent does not advertise ${sb}, so it would ignore anchor and draw the node at its normal position. Nothing was shown. Relaunch the app with launchApp prototype: true to load the agent built for this AutoMobile version, or remove anchor.`,Pi="Element anchors resolve against the default display's app hierarchy, so they cannot be shown on another display. Nothing was shown. Omit display, or use a bounds anchor in dp.";async function gi(o){if(o.android){if(!await o.android.supportsCommand(sb))throw new t(mi);return}if(!o.ios?.supportsCapability(sb))throw new t(yi)}async function vi(o,d,f,m){await gi(o),m?.throwIfAborted();let y=E9(d);if(y)throw new t(y);if(f&&Pu(d))throw new t(Pi)}async function wi(o,d,f,m){if(!Pu(d))return{};let P=await(m.anchorHierarchyCaptureFactory??pn)(o).capture({freshness:"fresh",...f}),g=I9(d,{...P,boundsUnit:o.platform==="ios"?"points":"px"});return{spec:g.spec,anchors:g.anchors,...g.hierarchyUpdatedAt===void 0?{}:{hierarchyUpdatedAt:g.hierarchyUpdatedAt}}}async function Si(o,d,f,{context:m,dependencies:y}){let{displayId:P,signal:g}=m,R=f.action==="show"?f.spec:void 0;if(!R||!Z$(R))return{};try{return await vi(o,R,P,g),await wi(d,R,{timeoutMs:f.timeoutMs,signal:g},y)}catch(E){return g?.throwIfAborted(),e.warn(`[prototype] anchor resolution refused the show: ${r(E)}`),{failure:{success:!1,error:u(E,"Prototype anchor failed").message}}}}async function bi(o,d,f,{dependencies:m,signal:y}){try{return{displayId:await si(o,d,f,{dependencies:m,signal:y})}}catch(P){return y?.throwIfAborted(),e.warn("[prototype] Request failed",P),{failure:{success:!1,error:u(P,"Prototype request failed").message}}}}async function cr(o,d,f,{args:m,dependencies:y}){let{signal:P}=o,g=await ci(d,m,P);if(g)return{failure:g};let R=await ui(d,m,P);if(R.failure)return{failure:R.failure};let E=await Ri(o,d,f,{args:m,dependencies:y});if(E.failure)return E;let A=fi(d,m)??(m.action==="show"&&m.spec!==void 0?await Nt(d,m.spec,P,{env:y.env}):void 0)??await di(d,m,P)??await ii(d,m,P);if(A)return{displayId:E.displayId,failure:A};let I=o.inPlace?o.shownDisplayId:E.displayId,C=await Si(d,f,m,{context:{displayId:I,signal:P},dependencies:y});return{...E,...C,...R}}async function Ri({inPlace:o,signal:d},f,m,{args:y,dependencies:P}){return o?{}:bi(f,m,y,{dependencies:P,signal:d})}async function ur(o,d){let{action:f,success:m,device:y,deviceScreenRound:P,signal:g}=o;if(f!=="show"||!m||y.platform!=="android")return{};if(y.formFactor!=="watch")return{};if(typeof P==="boolean")return{screenRound:P};let E=await(d.screenRoundFactory?.(y)??new HF((d.adbFactory??v).create(y))).isScreenRound(g);return E===void 0?{}:{screenRound:E}}function lr(o){let{action:d,success:f,device:m}=o;return d==="show"&&f&&m.platform==="android"&&m.formFactor==="automotive"?{formFactor:"automotive"}:{}}function ki(o,d,f,{action:m,success:y,clearFailedShow:P}){if(m==="dismiss"&&y||m==="show"&&!y&&P)o.dismiss(d.deviceId,f.id)}function Ei(o,d,f,m){if(m.args.action==="show"&&!m.inPlace)o.show(d,m.target.id,f)}function Ti(o,d,f,m){if(m.inPlace&&m.success)o.show(d,m.target.id,f)}function Ai(o){if(o.all)return{all:!0};return{id:o.action==="show"?o.spec.id:o.id}}function Ci(o,d,f){return f.id?o.shownOnDevice(d.deviceId,f.id):void 0}async function Ii(o,d,f,{device:m,signal:y}){return o?{uploaded:[],prepared:[],failure:o}:De(f.target,d,f.assetReaders,{signal:y,cached:Ji(f,m.deviceId)})}async function mr(o,d,f,{scope:m,queue:y,signal:P,mcpSessionId:g}){if(f.action==="patch"){let{store:R,target:E,cacheInvalidator:A}=o;return Bo({store:R,transport:E.transport,supportsPatch:async()=>E.android?E.android.supportsCommand(Jm):E.ios?.supportsCapability(Jm)===!0,specRefusal:async(I)=>(await Nt(E,I,P,{env:o.env}))?.error??await BR(I,d.deviceId,o.shaderAssetCache??Nw()),platform:d.platform==="android"?"android":"ios",queue:y,retire:(I)=>yr(A,d,I),mcpSessionId:g},d.deviceId,{id:f.id,ops:f.ops,baseRevision:f.baseRevision,timeoutMs:f.timeoutMs},P)}return Oi(o,d,{...f,action:f.action},{scope:m,signal:P,mcpSessionId:g})}async function Oi(o,d,f,{scope:m,signal:y,mcpSessionId:P}){let{store:g,events:R,target:E,commits:A}=o,I=Ai(f),C=se(E.transport),O=Ci(g,m,I),M=f.action==="show"&&O!==void 0&&f.reset!==!0,N=await Fi(E,I,M,y),_=Vi(A,m,f.action,I),D={commits:A,scope:m,target:I,generation:_,sent:!1,startedFreshEvents:!1,mcpSessionId:P};try{let x=await Ni(D,()=>cr({inPlace:M,shownDisplayId:O?.displayId,signal:y},E,d,{args:f,dependencies:o})),H=x.spec?{...f,spec:x.spec}:f,Y=_i(H),he=await qe(D,y,$i(x,M,d,{args:f,dependencies:o})),G=M?O?.displayId:x.displayId,q=await qe(D,y,Ii(x.failure,Y,o,{device:d,signal:y}));if(q.failure)Vt(D);let{result:j,warning:ne,mutationReply:ee}=await qe(D,void 0,Ko(E,Y,q,{signal:y,displayId:G,env:o.env,superseded:()=>Fe(A,m,I,_),beforeSend:async()=>{if(y?.throwIfAborted(),await dr(E,d,f,{dependencies:o,signal:y})?.(),Ei(R,m,C,{target:I,args:f,inPlace:M}),D.startedFreshEvents=f.action==="show"&&!M,f.action==="show"&&I.id)o.store.beginShowDispatch(m.deviceId,I.id);if(D.sent=!0,f.action==="show")D.specTicket=g.shownSpecs.beginShow(m.deviceId,I.id,f.replaceOthers,d.platform==="android"?"android":"ios")}})).then(Mi);fr(g,D,{action:f.action,success:j.success,id:I.id,spec:H.spec,replaceOthers:f.replaceOthers,variant:f.variant,result:j}),yr(o.cacheInvalidator,d,j),$2(d.deviceId,Y.action,Y.spec,{accepted:j.success&&!Fe(A,m,I,_),sent:D.sent,id:Y.id,all:Y.all});let te={...Wi(f,O,he,j.success),chrome:x.chrome},Ne=Fe(A,m,I,_)?Bi(o,{args:f,target:I,result:j,placed:te}):Hi(o,m,C,{args:f,target:I,result:j,placed:te,inPlace:M,previouslyShown:O!==void 0,startedFreshEvents:D.startedFreshEvents}),{warning:Ve,...B}=await nr({android:E.android!==void 0,action:f.action,success:j.success,hiddenReason:_v(j.hiddenReason),spec:Y.spec,superseded:()=>Fe(A,m,I,_),capture:()=>(o.anchorHierarchyCaptureFactory??pn)(d),timer:o.timer,displayId:G,signal:y}),ge=H.spec;return{...ee,lastResult:Ne,...q.uploaded.length>0?{uploadedAssets:q.uploaded}:{},...Yi(x),...await xi(H,d,o,{result:j,signal:y}),...B,...ji(j,[ne,te.warning,Ve],N,ge)}}catch(x){throw $2(d.deviceId,f.action,void 0,{accepted:!1,sent:D.sent}),x}finally{fr(g,D),qi(D)}}function _i(o){return o.action==="show"&&o.pseudoLocale===!0&&o.spec?{...o,spec:or(o.spec)}:o}function Mi(o){let d=o.result.errorCode==="render_failed"?bb(o.result):void 0;return{...o,result:d?{...o.result,success:!1,error:d.error}:o.result,mutationReply:d??{success:o.result.success,error:o.result.error??void 0}}}async function xi(o,d,f,{result:m,signal:y}){let{success:P,screenRound:g}=m;return{...await Li(o,d,f.target,P),...o.action==="show"&&P?J$(o.spec):{},...o.action==="show"&&P?X$(o.spec):{},...await ur({action:o.action,success:P,device:d,deviceScreenRound:g,signal:y},f),...lr({action:o.action,success:P,device:d})}}function Di(o){return Number.parseInt(o.iosVersion??o.osVersion??"",10)||void 0}async function Li(o,d,f,m){if(o.action!=="show"||!m)return{};let y=QI.fields(o.spec).length>0?await f.android?.supportsCommand(QI.capability):!1,P=A7(o.spec,d.platform==="ios"?"ios":"android",(R)=>d.platform==="android"?R===QI.capability&&y===!0:f.ios?.supportsCapability(R)===!0,Di(d));P.push(...T7(o.spec,o.locale));let g=d.platform==="ios"?Q$(o.spec):[];if(g.length>0)P.push({platform:"ios",construct:"node.gestures",effect:"substituted",paths:g.slice(0,20),...g.length>20?{total:g.length}:{},detail:[...g.some((R)=>R.endsWith(".onLongPress"))?["Long-press uses the platform default threshold (about 0.5 s on iOS versus the Android long-press timeout, about 0.4 s)."]:[],...g.some((R)=>R.endsWith(".onDoubleTap"))?["The double-tap window is the system's. With onDoubleTap, onTap fires only after that window elapses."]:[]].join(" ")});return P.length>0?{platformNotes:P}:{}}async function Fi(o,d,f,m){if(!f||!o.android)return;let y=await o.android.supportsCommand(Tg);if(m?.throwIfAborted(),y)return;return`the connected CtrlProxy does not advertise ${Tg}, so prototype ${d.id} was re-shown fresh on its display: pager pages restarted. Update the connected CtrlProxy to keep pages.`}function yr(o,d,f){if(f.success)o.invalidate(d,!0)}function Vt(o){let{commits:d,scope:f,target:m,generation:y,sent:P}=o;if(!P&&y!==void 0&&m.id!==void 0)d.withdraw(f.deviceId,m.id,y)}function fr(o,d,f){if(d.specTicket!==void 0){let{shown:m,refusal:y}=f?zo(f):{},{mcpSessionId:P}=d,g=m&&P!==void 0?{...m,mcpSessionId:P}:m;o.shownSpecs.endShow(d.scope.deviceId,d.specTicket,g,y)}}function qi(o){let{commits:d,scope:f,target:m,generation:y}=o;if(y!==void 0&&m.id!==void 0)d.settle(f.deviceId,m.id,y)}async function qe(o,d,f){try{let m=await f;return d?.throwIfAborted(),m}catch(m){throw Vt(o),m}}async function Ni(o,d){let f=await qe(o,void 0,d());if(f.failure)Vt(o);return f}function Vi(o,d,f,m){return f==="show"&&m.id?o.begin(d.deviceId,m.id):void 0}function Fe(o,d,f,m){return m!==void 0&&f.id!==void 0&&!o.isLatest(d.deviceId,f.id,m)}async function $i(o,d,f,{args:m,dependencies:y}){return o.failure?void 0:Ui(d,o.displayId,f,{args:m,dependencies:y})}function Hi(o,d,f,m){let{store:y,events:P}=o,{args:g,target:R,result:E,placed:A,inPlace:I,previouslyShown:C}=m;if(Ti(P,d,f,{target:R,inPlace:I,success:E.success}),ki(P,d,R,{action:g.action,success:E.success,clearFailedShow:m.startedFreshEvents&&!C}),g.action==="show"&&E.success&&R.id&&g.replaceOthers!==!1)P.replaceShown(d.deviceId,R.id);let O=y.record(d,g.action,R,{result:E,details:{displayId:A.displayId,data:g.action==="show"?g.spec?.data:void 0,chrome:A.chrome,replaceOthers:g.replaceOthers}});if(R.id&&P.isDismissed(d,R.id))y.dismissed(d,R.id);return O}function Bi(o,d){let{args:f,target:m,result:y,placed:P}=d;return{...m,lastAction:f.action,...P.displayId===void 0?{}:{displayId:P.displayId},...f.action==="show"&&y.success&&P.chrome!==void 0?{chrome:P.chrome}:{},...Lz(f.action,y),...Yj(f.action,y),success:y.success,...y.error?{error:y.error}:{},...y.totalTimeMs===void 0?{}:{totalTimeMs:y.totalTimeMs},timestamp:o.now()}}async function Ui(o,d,f,{args:m,dependencies:y}){if(!o)return d;if(m.display===void 0)return;try{return await rE(f,m.display,{adb:(y.adbFactory??v).create(f),lastRenderedObservation:y.lastRenderedObservation})||void 0}catch(P){return e.debug(`[prototype] ignored display selector did not resolve: ${r(P)}`),null}}function Wi(o,d,f,m){if(o.action!=="show"||d?.id===void 0)return{displayId:f??void 0};if(!m)return{displayId:d.displayId};if(o.reset===!0)return{displayId:f??void 0};if(o.display===void 0||f===d.displayId)return{displayId:d.displayId};let y=d.displayId===void 0?"the default display":`logical display ${d.displayId}`;return{displayId:d.displayId,warning:`display was ignored: prototype ${d.id} is already shown on ${y}, and a show with the same id replaces it in place there. Pass reset: true to show it fresh on the requested display.`}}function Yi(o){return o.anchors?.length?{anchors:o.anchors,...o.hierarchyUpdatedAt===void 0?{}:{hierarchyUpdatedAt:o.hierarchyUpdatedAt}}:{}}function ji(o,d,f,m){let y=o.success?xD(o.degradedEffects):{},P=[...d,y.warning,o.success?f:void 0,...o.success?Gj(m):[],...o.success?fie(m):[]].filter((g)=>g!==void 0).join(" ");return{...o.success&&o.missingAssets?.length?{missingAssets:o.missingAssets}:{},...y,...P?{warning:P}:{}}}function Ji(o,d){return{serial:d,cache:o.shaderAssetCache??Nw()}}function zi(o,d){let f=Be();return{sessionUuid:d.sessionUuid??f?.routingSessionUuid??f?.toolSelectionProfileUuid,deviceId:o.deviceId}}function Pr(){let o=bh();return o&&o.trim().length>0?o:void 0}function Gi(o,d,f=Pr()){return(d==="show"||d==="patch")&&o.success&&f?{...o,mcpSessionId:f}:o}function Ki(o,d,f){return{scope:o,queue:d,signal:pe(f),mcpSessionId:Pr()}}var Z=(o)=>Ye(T(o),o.success);function Xi(){return w.sessionManager()}function Qi(o){let d=w.sessionManager();if(!d)return;return d.onDeviceOwnershipChange((f,m)=>{if(m==="full"||d.getSessionForDevice(f)===null)o(f)})}function Zi(o,d){if(o.platform==="android")return;if(o.platform!=="ios")return new t("Prototypes need an Android device or an iOS simulator. Target one with deviceId or sessionUuid.");let f=i$(d.spec,d.assets);if(f)return new t(f);if(d.display!==void 0)return new t("display is Android only; omit display on iOS.");if(d.spec!==void 0){if(ce(d.spec).devicePersistence)return new t('window.persistence "device" is Android only; omit it on iOS.');let y=d.action==="show"||d.action==="save"?xe(d.spec,"ios"):void 0;if(y)return new t(`Invalid prototype at spec.${y.path}: ${y.message}. Nothing was shown.`)}return}function ta(o){return o.spec===void 0?o:{...o,spec:Ig(o.spec)}}function oa(o){return(d)=>d.platform==="ios"?new je({deviceId:d.deviceId,simctl:new Je(new F),files:new ze,timer:o.timer??i,ids:L}):new xt({adb:(o.adbFactory??v).create(d),timer:o.timer??i,ids:L,tempFiles:new Dt})}function na(){return{subscribeSessionRelease:(o)=>hi.subscribe((d,f,m,y)=>o(d,y?.upgradeOnly?void 0:m?.deviceId)),subscribeDeviceRemoval:(o)=>Xs().onDeviceRemoved(o),subscribeDeviceUnbound:Qi,deviceUnboundSource:Xi}}function sa(o,d,f){return{androidTarget:(P)=>{let g=o(P),R=f.android.get(g);if(R===void 0)R=new ft(g),f.android.set(g,R),Oo(g,P.deviceId,f.requests),Fo(g,P.deviceId,f.channels);return{transport:R,android:R}},iosTarget:(P)=>{let g=d.get(P.deviceId);if(g===void 0)return;let R=f.ios.get(g);if(R===void 0)R=new WB(g),f.ios.set(g,R),Io(g,P.deviceId,f.requests),Lo(g,P.deviceId,f.channels);return{transport:R,ios:R}}}}function gr(o){return o.clock??o.timer??i}function hr(o,d){let f=o.store??new lt(gr(o),void 0,d),m=o.timer??i,y=new it({ids:o.idGenerator??L,timer:m}),P=Co(m,y),g=xo(m,y,o.channelExecutor),R=to(o,f),E=new ct(m,f,{telemetry:qr.getInstance(),requests:Do(P,g),recorder:R}),A=$o(o.lifecycle??na(),E),I=!1;return{store:f,events:E,recorder:R,commits:new at,patchQueue:Ho(),transports:{android:new WeakMap,ios:new WeakMap,requests:P,channels:g},mocks:y,ensureLifecycle:A.ensureSubscribed,dispose:()=>{if(!I)I=!0,A.unsubscribe(),E.dispose(),y.clearAll()}}}var Pe,ye;function ia(o){let{store:d,clock:f,timer:m,lifecycle:y}=o;if(d||f||m||y||o.testSessionStore||o.idGenerator||o.channelExecutor)return hr(o);return Pe??=hr(o,yU()),Pe}function aa(){return Pe?.store.shownSpecs}Q9(aa);function pa(o){let d=()=>{let f=ye?.dispose===d;if(f)ye=void 0;if(o!==Pe)o.dispose();else if(f)o.dispose(),Pe=void 0};return d}function da(o){let d=o&&typeof o==="object"&&!Array.isArray(o)?{...o}:{};return ea(d),oU.safeParse(d)}async function ca(o,d,f){let m=await la(o,d,f);return"error"in m?m:fa(m.args,d,f)}async function la(o,d,f){if(o.specPath===void 0||!vr(o.action))return{args:o};let{specPath:m,...y}=o,P=await TO(m,d);if(f?.throwIfAborted(),"error"in P)return P;let g=xO(P.json);if(g)return{error:`specPath ${m}: ${g.path}: ${g.text}`};return{args:{...y,spec:P.json}}}var vr=(o)=>o==="show"||o==="screenMap"||o==="share";async function fa(o,d,f){if(o.mockPath===void 0)return{args:o};let{mockPath:m,...y}=o,P=await TO(m,d,{label:"mockPath",maxBytes:G$});if(f?.throwIfAborted(),"error"in P)return P;let g=P.json;if(typeof g!=="object"||g===null||Array.isArray(g))return{error:`mockPath ${m}: expected an object of {backendId: definition}`};return{args:{...y,mock:{...g}}}}function ma(o,d,f,m){if("error"in o)return o;let y=ta(o.args),P=d.platform==="ios"?void 0:Dg(y.spec,f);return P?{error:P}:ya(y,m)}function ya(o,d){if(o.mock===void 0)return{args:o};try{d.defineAll(o.mock)}catch(f){return e.warn("Prototype show mock definition failed",f),{error:u(f,"Mock backend definition failed").message}}return{args:o}}function ha(o){return vr(o.action)&&o.specPath!==void 0||o.action==="show"&&o.mockPath!==void 0}var Pa=(o)=>o==="screenMap"||o==="share"||no(o);async function ga(o,d,f,m){if(d.action==="share")return await va(d,f,m);return d.action==="screenMap"?wa(d.spec):so(o,d)}async function va(o,d,f=new Mt){return await k7({spec:o.spec,assets:o.assets,url:o.url},{assetFileReader:d.assetFileReader,observationScreenshotReader:d.observationScreenshotReader,files:f})}function wa(o){let d=K$(o);return{success:!0,screenMap:d,mermaid:A9(d)}}function Um(o={}){let d=ia(o);if(ye&&ye.host!==d)ye.dispose();d.ensureLifecycle();let{store:f,events:m,commits:y}=d,P=o.clientFactory??((_)=>k.getInstance(_)),g=o.agentConnections??Fre,{androidTarget:R,iosTarget:E}=sa(P,g,d.transports),A=o.cacheInvalidator??new Zn,I=gr(o),C={env:o.env,assetFileReader:o.assetFileReader??IO,observationScreenshotReader:o.observationScreenshotReader??QY},O=Y9({...C,installer:o.iosSavedPrototypeInstaller,protoViewer:o.protoViewerFactory??oa(o)}),M=async(_,D,x,H)=>{d.ensureLifecycle();let Y=da(D);if(!Y.success)return Z({success:!1,error:`Invalid prototype input: ${Y.error.message}`});let he=ha(Y.data)?await ca(Y.data,C.assetFileReader,H):{args:Y.data},G=ma(he,_,o.env,d.mocks);if("error"in G)return Z({success:!1,error:G.error});let q=G.args,j=O(_,{...q,spec:q.spec},pe(H),()=>Zi(_,q));if(j){let B=await j;if(B)return Z(B)}if(Pa(q.action)){let B=o.protoViewerShareFiles;return Z(await ga(d.mocks,q,C,B))}let ne=zi(_,q);if(oo(q.action))return Z(await ro(d,ne,q));let ee=_.platform==="android"?R(_):E(_);if(!ee){let B=new t(Lre(_.deviceId));return Z({success:!1,error:B.message})}let{action:te}=q;if(Wt(te))return Z(await Yt(q,{store:f,events:m},_,{target:ee,scope:ne,signal:H}));if(te==="awaitEvent"){let B=se(ee.transport),ge=await Jt(m,ne,B,{query:q,context:{progress:x,signal:H}});return Z({success:!0,...ge,...jt(f,ne,q.id,ge)})}let Ne={store:f,events:m,target:ee,assetReaders:C,commits:y,cacheInvalidator:A,now:()=>I.now(),timer:o.timer,adbFactory:o.adbFactory,lastRenderedObservation:o.lastRenderedObservation,anchorHierarchyCaptureFactory:o.anchorHierarchyCaptureFactory,screenRoundFactory:o.screenRoundFactory,shaderAssetCache:o.shaderAssetCache,env:o.env},Ve=await J9({...q,action:te,spec:q.spec},()=>{let B=pe(H);return{client:ee.android,...G9(_,o),signal:B,stageAssets:()=>De(ee,q,C,{signal:B})}},(B)=>mr(Ne,_,{...q,action:B},Ki(ne,d.patchQueue,H)));return Z(Gi(Ve,te))},N=pa(d);return ye={host:d,dispose:N},{handler:M,dispose:N}}export{Gi as attributeRevision,Um as createPrototypeToolRuntime,aa as daemonPrototypeShownSpecs};
|
|
11
|
+
|
|
12
|
+
//# debugId=20F0EEEB7A71ADAD64756E2164756E21
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{Xt}from"./chunk-h3n4adc6.js";var t;function aX(n){t=n}function a(n){let r=(e)=>(n??t)?.stopStreamsForDevice({deviceId:e,reason:"device_restored",cause:"incarnation change"})??Promise.resolve();return{name:"webrtc-streams",prepareForIncarnationChange:(e)=>r(e),onDeviceIncarnationChanged:(e)=>r(e)}}Xt(a());
|
|
3
|
+
export{aX};
|
|
4
|
+
|
|
5
|
+
//# debugId=5C59CC24335D43A664756E2164756E21
|