@kaeawc/auto-mobile 0.0.93 → 0.0.94

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/dist/build-info.json +12 -12
  2. package/dist/src/ble-peripheral.py +153 -0
  3. package/dist/src/{chunk-r6z1eztj.js → chunk-026y62r9.js} +11 -11
  4. package/dist/src/chunk-0jyfg947.js +4 -0
  5. package/dist/src/{chunk-8g1922rp.js → chunk-0zfpp1wh.js} +4 -4
  6. package/dist/src/{chunk-qf6nynk6.js → chunk-13qxf7ym.js} +5 -5
  7. package/dist/src/chunk-1scenrk7.js +4 -0
  8. package/dist/src/chunk-1vb5ph1k.js +4 -0
  9. package/dist/src/{chunk-710rxz9y.js → chunk-20g565q7.js} +3 -3
  10. package/dist/src/chunk-21h6dhdm.js +5 -0
  11. package/dist/src/chunk-25mfpthk.js +78 -0
  12. package/dist/src/{chunk-rbpdk7m0.js → chunk-2b39zyxc.js} +3 -3
  13. package/dist/src/chunk-2gzd6wbd.js +4 -0
  14. package/dist/src/{chunk-xgan0qqp.js → chunk-3dntffy9.js} +1 -1
  15. package/dist/src/chunk-3gfczcsn.js +4 -0
  16. package/dist/src/{chunk-dgrbdpb7.js → chunk-3h5jz1vb.js} +6 -6
  17. package/dist/src/{chunk-t6c8akcm.js → chunk-41zcy6b3.js} +3 -3
  18. package/dist/src/chunk-47n9m2de.js +4 -0
  19. package/dist/src/chunk-4vxeq0vd.js +58 -0
  20. package/dist/src/chunk-59dx6qaf.js +4 -0
  21. package/dist/src/chunk-5sdf9y92.js +4 -0
  22. package/dist/src/{chunk-58wzr3mt.js → chunk-5wk1t46v.js} +3 -3
  23. package/dist/src/{chunk-vy3bwm1d.js → chunk-661c50hh.js} +5 -5
  24. package/dist/src/chunk-68n6bjjd.js +21 -0
  25. package/dist/src/{chunk-v6pya0dm.js → chunk-69pmjdf2.js} +3 -3
  26. package/dist/src/{chunk-e98dqnc9.js → chunk-6hrj3jt6.js} +20 -20
  27. package/dist/src/{chunk-wbh8spm5.js → chunk-6myr26wx.js} +8 -8
  28. package/dist/src/chunk-6n96k09n.js +4 -0
  29. package/dist/src/chunk-6vwrbkre.js +4 -0
  30. package/dist/src/chunk-6wk0yrab.js +4 -0
  31. package/dist/src/chunk-6yhm9een.js +4 -0
  32. package/dist/src/{chunk-mjrps0ac.js → chunk-7k7gjg2t.js} +5 -5
  33. package/dist/src/chunk-7n5fz68h.js +4 -0
  34. package/dist/src/chunk-8cvnpnbp.js +4 -0
  35. package/dist/src/chunk-8kzv7rk7.js +4 -0
  36. package/dist/src/chunk-8nj68t1v.js +167 -0
  37. package/dist/src/{chunk-g7tmjbkt.js → chunk-96r3bpg7.js} +3 -3
  38. package/dist/src/chunk-97x887te.js +4 -0
  39. package/dist/src/{chunk-8ph29g99.js → chunk-99a6tbvd.js} +1 -1
  40. package/dist/src/chunk-9p5d2994.js +5 -0
  41. package/dist/src/{chunk-aabchzxk.js → chunk-9q265er0.js} +4 -4
  42. package/dist/src/{chunk-jh6vhqzx.js → chunk-9xgnrv5w.js} +3 -3
  43. package/dist/src/chunk-9xgsmshb.js +5 -0
  44. package/dist/src/chunk-a02d1wgv.js +4 -0
  45. package/dist/src/{chunk-ndt1ccxm.js → chunk-a9ps00a1.js} +10 -10
  46. package/dist/src/{chunk-5d2hft6c.js → chunk-aewdveet.js} +3 -3
  47. package/dist/src/{chunk-ycaj2sgf.js → chunk-b3tdtq7r.js} +6 -6
  48. package/dist/src/chunk-bn7jx7a2.js +4 -0
  49. package/dist/src/{chunk-3y6eykz9.js → chunk-bnyw27ja.js} +2 -2
  50. package/dist/src/{chunk-rqc9ap3x.js → chunk-bpwsg76p.js} +2 -2
  51. package/dist/src/chunk-bvranw3g.js +4 -0
  52. package/dist/src/chunk-c25a84zb.js +4 -0
  53. package/dist/src/chunk-c27yv1dx.js +5 -0
  54. package/dist/src/chunk-c3ewxm4x.js +5 -0
  55. package/dist/src/{chunk-rvvy1bte.js → chunk-cb1ga9rd.js} +5 -5
  56. package/dist/src/chunk-cn7fwy7k.js +4 -0
  57. package/dist/src/chunk-cnvy4a64.js +4 -0
  58. package/dist/src/{chunk-7rz9898k.js → chunk-cqhw4yr6.js} +3 -3
  59. package/dist/src/{chunk-g04bwyj3.js → chunk-ctmfshjc.js} +2 -2
  60. package/dist/src/chunk-ctwmhz13.js +4 -0
  61. package/dist/src/{chunk-waqwcjyn.js → chunk-d3jx9bz5.js} +2 -2
  62. package/dist/src/{chunk-ayp07wbb.js → chunk-d6rb08ga.js} +1 -1
  63. package/dist/src/chunk-ddqhj4eg.js +5 -0
  64. package/dist/src/{chunk-r7bpkgff.js → chunk-ddrhs1c3.js} +2 -2
  65. package/dist/src/chunk-dnjnh9p6.js +4 -0
  66. package/dist/src/{chunk-wyrkw6hw.js → chunk-dw5rwgya.js} +3 -3
  67. package/dist/src/{chunk-3xkpk44w.js → chunk-e0870khr.js} +3 -3
  68. package/dist/src/chunk-ea3k10kj.js +4 -0
  69. package/dist/src/chunk-emv82m1w.js +7 -0
  70. package/dist/src/chunk-f3m6pdnx.js +4 -0
  71. package/dist/src/chunk-f84z32cb.js +4 -0
  72. package/dist/src/chunk-fpczgf0z.js +4 -0
  73. package/dist/src/{chunk-2tqzq5qh.js → chunk-g2js4c2v.js} +18 -18
  74. package/dist/src/chunk-g3af2qbk.js +5 -0
  75. package/dist/src/{chunk-3qwrzxh0.js → chunk-gadtna7s.js} +6 -6
  76. package/dist/src/{chunk-ybbtagbt.js → chunk-gcyx407v.js} +3 -3
  77. package/dist/src/{chunk-bfw6125s.js → chunk-gfpntwc1.js} +3 -3
  78. package/dist/src/chunk-gmnm5e3e.js +4 -0
  79. package/dist/src/chunk-gp6vb5gf.js +4 -0
  80. package/dist/src/chunk-gppgy7pa.js +4 -0
  81. package/dist/src/chunk-hegfz0ae.js +5 -0
  82. package/dist/src/chunk-hpzxdp1k.js +17 -0
  83. package/dist/src/{chunk-qcxzr2my.js → chunk-j69g8b50.js} +3 -3
  84. package/dist/src/chunk-jvstjnqm.js +19 -0
  85. package/dist/src/chunk-jzqrv78s.js +4 -0
  86. package/dist/src/chunk-k2948b8d.js +4 -0
  87. package/dist/src/chunk-k4ftd40d.js +4 -0
  88. package/dist/src/{chunk-bxmsax22.js → chunk-kd9vfaxh.js} +3 -3
  89. package/dist/src/{chunk-s3jc6cwp.js → chunk-kdczmgwk.js} +3 -3
  90. package/dist/src/{chunk-t6bfvfkg.js → chunk-ke3wn14v.js} +1 -1
  91. package/dist/src/chunk-kh5n7m6w.js +4 -0
  92. package/dist/src/{chunk-6wt9rgjf.js → chunk-khejfph4.js} +3 -3
  93. package/dist/src/chunk-kny2xemh.js +4 -0
  94. package/dist/src/chunk-knyzw9md.js +4 -0
  95. package/dist/src/chunk-mbzpt2hp.js +4 -0
  96. package/dist/src/chunk-mm8rcxad.js +4 -0
  97. package/dist/src/chunk-nc4516tx.js +4 -0
  98. package/dist/src/{chunk-6bznss4t.js → chunk-ntfrqrqn.js} +5 -5
  99. package/dist/src/chunk-nz5h2j52.js +4 -0
  100. package/dist/src/chunk-p22s97qy.js +4 -0
  101. package/dist/src/chunk-p9kt1sgr.js +6 -0
  102. package/dist/src/{chunk-yb97j25b.js → chunk-pf282r5g.js} +4 -4
  103. package/dist/src/chunk-pnd4mrxy.js +4 -0
  104. package/dist/src/chunk-pqqteyj6.js +4 -0
  105. package/dist/src/{chunk-6xmss8er.js → chunk-qj1tbnv2.js} +6 -6
  106. package/dist/src/chunk-qnh9egwr.js +4 -0
  107. package/dist/src/chunk-qy3khhf8.js +8 -0
  108. package/dist/src/{chunk-z637nqg8.js → chunk-r0vp315h.js} +6 -6
  109. package/dist/src/chunk-r4j43b9s.js +237 -0
  110. package/dist/src/{chunk-1p7xf5kb.js → chunk-r54cxxze.js} +3 -3
  111. package/dist/src/{chunk-yf7ympyz.js → chunk-r6pvhj33.js} +92 -92
  112. package/dist/src/chunk-rb7aa5gr.js +54 -0
  113. package/dist/src/chunk-rdj50kb4.js +4 -0
  114. package/dist/src/chunk-rnd4vcas.js +4 -0
  115. package/dist/src/{chunk-w5b2jwk3.js → chunk-s3y3zfcx.js} +8 -8
  116. package/dist/src/chunk-s4g43k75.js +5 -0
  117. package/dist/src/chunk-sfqe223f.js +311 -0
  118. package/dist/src/{chunk-284ptqa4.js → chunk-sqdrxjw5.js} +5 -5
  119. package/dist/src/{chunk-zgja5f3p.js → chunk-t54k47em.js} +4 -4
  120. package/dist/src/{chunk-3sy6ahhz.js → chunk-tek4pnvv.js} +10 -10
  121. package/dist/src/chunk-tn74y7af.js +4 -0
  122. package/dist/src/{chunk-thbh3jew.js → chunk-tvq0nzam.js} +3 -3
  123. package/dist/src/{chunk-0jrrsnc9.js → chunk-tx4f0h9c.js} +4 -4
  124. package/dist/src/chunk-vdqag3fj.js +5 -0
  125. package/dist/src/chunk-vz5zzs57.js +4 -0
  126. package/dist/src/chunk-w4s2vfpj.js +4 -0
  127. package/dist/src/{chunk-4hw3665t.js → chunk-w5yypt53.js} +11 -11
  128. package/dist/src/{chunk-8037tzzj.js → chunk-w68v64vh.js} +3 -3
  129. package/dist/src/chunk-whwj0pdk.js +5 -0
  130. package/dist/src/chunk-wnmqt1dc.js +4 -0
  131. package/dist/src/{chunk-cyy71ggq.js → chunk-wpe46vsa.js} +3 -3
  132. package/dist/src/{chunk-w3vs79ex.js → chunk-wxdjeb4k.js} +19 -19
  133. package/dist/src/chunk-xcqzwf9j.js +247 -0
  134. package/dist/src/chunk-xezekwwn.js +5 -0
  135. package/dist/src/chunk-xf19m15s.js +4 -0
  136. package/dist/src/chunk-xghbxha4.js +4 -0
  137. package/dist/src/{chunk-00167wan.js → chunk-xn9m3xc2.js} +5 -5
  138. package/dist/src/{chunk-26k317v5.js → chunk-yqfz4vts.js} +3 -3
  139. package/dist/src/chunk-z8tvs8nk.js +5 -0
  140. package/dist/src/chunk-zm2rehqb.js +5 -0
  141. package/dist/src/chunk-zs6dqm35.js +4 -0
  142. package/dist/src/daemon/processEntry.js +2 -2
  143. package/dist/src/index.js +4 -4
  144. package/dist/src/runtime/bunRuntimeGuard.js +2 -2
  145. package/dist/src/utils/workers/iosBundleExtractWorker.js +2 -2
  146. package/package.json +2 -2
  147. package/dist/src/chunk-0n6swkwg.js +0 -5
  148. package/dist/src/chunk-0qsy1qsx.js +0 -57
  149. package/dist/src/chunk-11m8wj8j.js +0 -237
  150. package/dist/src/chunk-23p5f095.js +0 -4
  151. package/dist/src/chunk-28re4xrg.js +0 -4
  152. package/dist/src/chunk-2f9rkmhx.js +0 -5
  153. package/dist/src/chunk-2fxdh48t.js +0 -4
  154. package/dist/src/chunk-2tbdrbt6.js +0 -4
  155. package/dist/src/chunk-32gvv9b4.js +0 -21
  156. package/dist/src/chunk-3f3t1x97.js +0 -8
  157. package/dist/src/chunk-3fspkbc7.js +0 -4
  158. package/dist/src/chunk-3vg455e6.js +0 -4
  159. package/dist/src/chunk-49bsqdx3.js +0 -4
  160. package/dist/src/chunk-5snsn9cf.js +0 -4
  161. package/dist/src/chunk-5tm9mn47.js +0 -54
  162. package/dist/src/chunk-5zc77a5t.js +0 -4
  163. package/dist/src/chunk-64j0majr.js +0 -19
  164. package/dist/src/chunk-65y8v4td.js +0 -17
  165. package/dist/src/chunk-6awz7vhq.js +0 -5
  166. package/dist/src/chunk-6ep7f5ge.js +0 -4
  167. package/dist/src/chunk-7cs2da62.js +0 -5
  168. package/dist/src/chunk-7g103b54.js +0 -4
  169. package/dist/src/chunk-7j5vj4pa.js +0 -4
  170. package/dist/src/chunk-7tw8x05v.js +0 -4
  171. package/dist/src/chunk-7zy586cb.js +0 -4
  172. package/dist/src/chunk-84nanf8s.js +0 -5
  173. package/dist/src/chunk-8gvwcv2p.js +0 -4
  174. package/dist/src/chunk-8thrmfat.js +0 -4
  175. package/dist/src/chunk-8zgzzs7k.js +0 -78
  176. package/dist/src/chunk-97b1zmaq.js +0 -4
  177. package/dist/src/chunk-9fth9ayh.js +0 -4
  178. package/dist/src/chunk-9j6anhjr.js +0 -4
  179. package/dist/src/chunk-bfjwqk8q.js +0 -4
  180. package/dist/src/chunk-bnhscm2n.js +0 -4
  181. package/dist/src/chunk-c1vs4g1n.js +0 -4
  182. package/dist/src/chunk-ct3e7yng.js +0 -4
  183. package/dist/src/chunk-ddzkz92z.js +0 -4
  184. package/dist/src/chunk-drdz8hee.js +0 -5
  185. package/dist/src/chunk-eersndy7.js +0 -5
  186. package/dist/src/chunk-eggq53ks.js +0 -4
  187. package/dist/src/chunk-f2dya7cs.js +0 -4
  188. package/dist/src/chunk-fbakd6cw.js +0 -4
  189. package/dist/src/chunk-fgb98zjj.js +0 -5
  190. package/dist/src/chunk-fmpad823.js +0 -5
  191. package/dist/src/chunk-g0xr8zw0.js +0 -4
  192. package/dist/src/chunk-g3rjs80x.js +0 -4
  193. package/dist/src/chunk-g78rtrfv.js +0 -4
  194. package/dist/src/chunk-gabgv3y5.js +0 -4
  195. package/dist/src/chunk-gmr45m8f.js +0 -4
  196. package/dist/src/chunk-gsyfebqj.js +0 -4
  197. package/dist/src/chunk-h5rpn9wr.js +0 -247
  198. package/dist/src/chunk-hb1x7v55.js +0 -4
  199. package/dist/src/chunk-hrfytkxh.js +0 -168
  200. package/dist/src/chunk-j4yjzbak.js +0 -4
  201. package/dist/src/chunk-jd6a5v6p.js +0 -5
  202. package/dist/src/chunk-kn5spq15.js +0 -4
  203. package/dist/src/chunk-m94qs0f0.js +0 -4
  204. package/dist/src/chunk-n03dmn5q.js +0 -5
  205. package/dist/src/chunk-n72qhwd9.js +0 -4
  206. package/dist/src/chunk-nr6y0n4y.js +0 -5
  207. package/dist/src/chunk-pcsen2vs.js +0 -4
  208. package/dist/src/chunk-ppfr0b8h.js +0 -4
  209. package/dist/src/chunk-q10bdnat.js +0 -4
  210. package/dist/src/chunk-q9xmq595.js +0 -4
  211. package/dist/src/chunk-qyqypn28.js +0 -5
  212. package/dist/src/chunk-r2epb56s.js +0 -4
  213. package/dist/src/chunk-r5bxavdx.js +0 -311
  214. package/dist/src/chunk-r8jf3d92.js +0 -4
  215. package/dist/src/chunk-rc0dbypm.js +0 -4
  216. package/dist/src/chunk-rhcty4ms.js +0 -4
  217. package/dist/src/chunk-rpvckv3p.js +0 -4
  218. package/dist/src/chunk-ry0mz41y.js +0 -4
  219. package/dist/src/chunk-sfv61xjb.js +0 -6
  220. package/dist/src/chunk-t7w8rctc.js +0 -4
  221. package/dist/src/chunk-v2wd4n3e.js +0 -5
  222. package/dist/src/chunk-w4zga19f.js +0 -4
  223. package/dist/src/chunk-w7hkv422.js +0 -5
  224. package/dist/src/chunk-xa73x2cx.js +0 -5
  225. package/dist/src/chunk-y2vs6jwg.js +0 -4
  226. package/dist/src/chunk-yattm52s.js +0 -4
  227. package/dist/src/chunk-yjawdzk8.js +0 -4
  228. package/dist/src/chunk-zs1sghs9.js +0 -4
@@ -1,6 +1,6 @@
1
1
  // @bun
2
- import{$I,jN,vA,d4,im,rr,UI,HI,Ys,u4,h7,mq,GN,Hy,fq,hq,g7,y7,ac,$q}from"./chunk-hrfytkxh.js";import{f}from"./chunk-58wzr3mt.js";import{nr,ti,ag,ls,QC,LT,GW,nB,Lv,Uw,up,Tre,H,Je,V,re,J,rt,zr,ce,Ko,ie,gg,v,Vn,z,Ve,Bs,Wn,L,sd,nk,Su,Gt,wg,cd,Sp,Rg,yD,ni,We,_B,o,P,Og,rf,nf,Yr,UR,bb,hie,HR,Ug,xp,uf,YD,za,x,Vs,E}from"./chunk-r5bxavdx.js";import{SP,i,Q,l,e}from"./chunk-z637nqg8.js";import{m,Yn,Yt,_e,Vr}from"./chunk-yf7ympyz.js";import{yh}from"./chunk-2f9rkmhx.js";import{Er,bc,al,_L,Ao}from"./chunk-0qsy1qsx.js";import{Oe,Kt,At}from"./chunk-3xkpk44w.js";import{nu,mm}from"./chunk-0n6swkwg.js";import{gn,Ci,jc}from"./chunk-284ptqa4.js";import{r,t,u,St}from"./chunk-rbpdk7m0.js";var Xn="managed-execution";function Vd(s,n){return s==="managed-execution"&&n!=="lapsed"}class W extends t{sessionUuid;constructor(s){super(`Device session ${s} has no active row to record activity or ownership on.`);this.sessionUuid=s;this.name="DeviceSessionNotActiveError"}}class ne extends t{sessionUuid;constructor(s){super(`Device session ${s} changed while it was being recovered; the recovery did not persist it.`);this.sessionUuid=s;this.name="DeviceSessionRowChangedError"}}class _ extends t{sessionUuid;constructor(s){super(`Device session ${s} was not released: its row is terminal or owned by a live peer.`);this.sessionUuid=s;this.name="DeviceSessionRowNotReleasableError"}}class U extends t{sessionUuid;constructor(s){super(`Device session ${s} was not rewritten: its row holds another terminal release or a live peer daemon owns it.`);this.sessionUuid=s;this.name="DeviceSessionRowNotRewritableError"}}class oe extends t{sessionUuid;constructor(s){super(`Device session ${s} was terminally released; its row was not made active again.`);this.sessionUuid=s;this.name="DeviceSessionTerminallyReleasedError"}}var ss=604800000,kn=new Set(fq("recoverable")),ae="device-restart:";function xI(s){return`${ae}${s}`}function yo(s){return vA(s)===ae}function DN(s,n){let a=n-ss;return(Vd(s.liveness_policy)||s.expires_at_ms>n)&&(s.released_at_ms===null||s.released_at_ms>=a)}function Ny(s,n){if(s.release_reason&&yo(s.release_reason)&&s.released_at_ms!==null){let a=s.released_at_ms+Ve;if((Vd(s.liveness_policy)||a<s.expires_at_ms)&&n>=a)return"restart-recovery-timeout"}return!Vd(s.liveness_policy)&&s.expires_at_ms<=n||s.release_reason==="expired"?"expired":void 0}function Xe(s){return s.or([s("liveness_policy","is",null),s("liveness_policy","!=",Xn)])}function Ze(s){return s.or([s("release_reason","in",Array.from(kn)),...hq("recoverable").map((n)=>s("release_reason","like",`${n}_%`))])}function Pn(s,n){let a=GN(n),d=g7(a);return s.or([...d.length>0?[s("release_reason","in",d)]:[],...y7(a).map((c)=>s("release_reason","like",`${c}_%`))])}function es(s){return s.or([s("release_reason","in",fq("reissuableByName")),...hq("reissuableByName").map((n)=>s("release_reason","like",`${n}_%`))])}function Nt(s){return s.or([s("release_reason","in",fq("terminal")),...hq("terminal").map((n)=>s("release_reason","like",`${n}_%`))])}function An(s,n){return n.length>0?[s.or([s("device_sessions.daemon_session_id","is",null),s("device_sessions.daemon_session_id","not in",n)])]:[]}function Mt(s,n,a,d){return s.and([s.or([s("device_sessions.release_reason","is",null),s.not(Nt(s)),...n.length>0?[s("device_sessions.release_reason","in",n)]:[]]),...An(s,a),...d===void 0?[]:[s.or([s("device_sessions.daemon_session_id","is",null),s("device_sessions.daemon_session_id","=",d)])]])}function Lt(s){return Ys(s)}function Ft(s){return{heartbeat_timeout_source:s.heartbeatTimeoutSource??null,has_received_heartbeat:s.hasReceivedHeartbeat?1:0,liveness_policy:s.livenessPolicy??null,pre_cli_heartbeat_timeout_ms:s.preCliHeartbeatTimeoutMs??null,pre_cli_heartbeat_timeout_source:s.preCliHeartbeatTimeoutSource??null,pre_cli_session_timeout_ms:s.preCliSessionTimeoutMs??null}}function Tn(s){return{heartbeat_timeout_source:s.heartbeat_timeout_source,has_received_heartbeat:s.has_received_heartbeat,liveness_policy:s.liveness_policy,pre_cli_heartbeat_timeout_ms:s.pre_cli_heartbeat_timeout_ms,pre_cli_heartbeat_timeout_source:s.pre_cli_heartbeat_timeout_source,pre_cli_session_timeout_ms:s.pre_cli_session_timeout_ms}}function En(s){let n=s.activitySeq??s.lastUsedAtMs,a=Ft(s);return{activity_seq:m`max(activity_seq, ${n})`,last_used_at_ms:B("last_used_at_ms",n,s.lastUsedAtMs),expires_at_ms:B("expires_at_ms",n,s.expiresAtMs),session_timeout_ms:B("session_timeout_ms",n,s.sessionTimeoutMs),heartbeat_timeout_ms:B("heartbeat_timeout_ms",n,s.heartbeatTimeoutMs),heartbeat_timeout_source:B("heartbeat_timeout_source",n,a.heartbeat_timeout_source),has_received_heartbeat:B("has_received_heartbeat",n,a.has_received_heartbeat),liveness_policy:B("liveness_policy",n,a.liveness_policy),pre_cli_heartbeat_timeout_ms:B("pre_cli_heartbeat_timeout_ms",n,a.pre_cli_heartbeat_timeout_ms),pre_cli_heartbeat_timeout_source:B("pre_cli_heartbeat_timeout_source",n,a.pre_cli_heartbeat_timeout_source),pre_cli_session_timeout_ms:B("pre_cli_session_timeout_ms",n,a.pre_cli_session_timeout_ms)}}function B(s,n,a){return m`CASE WHEN activity_seq > ${n} THEN ${m.ref(s)} ELSE ${a} END`}function Cn(s,n){return{session_uuid:s.sessionUuid,device_id:s.deviceId,stable_device_id:s.stableDeviceId??null,stable_identity_generation:0,platform:s.platform,status:s.status??"active",source:s.source??null,autolock_enabled:s.autolockEnabled?1:0,mcp_session_id:s.mcpSessionId??null,daemon_session_id:s.daemonSessionId??null,created_at_ms:s.createdAtMs,last_used_at_ms:s.lastUsedAtMs,activity_seq:s.activitySeq??s.lastUsedAtMs,expires_at_ms:s.expiresAtMs,released_at_ms:null,release_reason:null,session_timeout_ms:s.sessionTimeoutMs,heartbeat_timeout_ms:s.heartbeatTimeoutMs,...Ft(s),created_at:n,updated_at:n}}class vS{db;timer;constructor({db:s,timer:n=i}={}){this.timer=n,this.db=s??null}getDb(){return this.db??_e()}async upsertActiveSession(s,n=this.timer.now(),a={}){let{claimedRow:d,unlessTerminal:c,rewriteOverSupersededRelease:h}=a;await this.pruneExpiredSessions(n);let p;try{let S=await this.getDb(),R=Vr(this.timer),g=Cn(s,R);p=await S.insertInto("device_sessions").values(g).onConflict((w)=>{let y=w.column("session_uuid").doUpdateSet({device_id:g.device_id,stable_device_id:g.stable_device_id,stable_identity_generation:m`stable_identity_generation + 1`,platform:g.platform,status:g.status,source:g.source,autolock_enabled:g.autolock_enabled,mcp_session_id:g.mcp_session_id,daemon_session_id:g.daemon_session_id,last_used_at_ms:g.last_used_at_ms,activity_seq:g.activity_seq,expires_at_ms:g.expires_at_ms,released_at_ms:null,release_reason:null,session_timeout_ms:g.session_timeout_ms,heartbeat_timeout_ms:g.heartbeat_timeout_ms,...Tn(g),liveness_contract_generation:m`liveness_contract_generation + 1`,updated_at:R});if(!d){if(h){let{livePeerDaemonSessionIds:b,expectedRowGeneration:A}=h;return y.where((k)=>k.and([Mt(k,[],b,h.ownDaemonSessionId),...h.unlessReleased?[k("device_sessions.status","!=","released")]:[],...A===void 0?[]:[k("device_sessions.stable_identity_generation","=",A)]]))}return c?y.where((b)=>b.or([b("device_sessions.release_reason","is",null),b.not(Nt(b))])):y}return y.where("device_sessions.status","!=","active").where("device_sessions.stable_identity_generation","=",d.rowGeneration).where((b)=>d.daemonSessionId===null?b("device_sessions.daemon_session_id","is",null):b("device_sessions.daemon_session_id","=",d.daemonSessionId)).where((b)=>es(b))}).returning("stable_identity_generation").executeTakeFirst()}catch(S){throw e.warn(`[DeviceSessionRepository] Failed to upsert device session ${s.sessionUuid}: ${S}`),S}if(!p){if(d)throw new ne(s.sessionUuid);throw h?new U(s.sessionUuid):new oe(s.sessionUuid)}return p.stable_identity_generation??0}async recordActivity(s,n){let a;try{let c=await(await this.getDb()).updateTable("device_sessions").set({...En(n),liveness_contract_generation:m`liveness_contract_generation + 1`,updated_at:Vr(this.timer)}).where("session_uuid","=",s).where("status","=","active").executeTakeFirst();a=Number(c.numUpdatedRows)}catch(d){throw e.warn(`[DeviceSessionRepository] Failed to record activity for ${s}: ${d}`),u(d,`Failed to record activity for session ${s}`)}if(a===0)throw new W(s)}async recordRestartRecoveryActivity(s,n){try{await(await this.getDb()).updateTable("device_sessions").set({expires_at_ms:m`max(expires_at_ms, ${n} + session_timeout_ms)`,updated_at:Vr(this.timer)}).where("session_uuid","=",s).where("release_reason","like",`${ae}%`).where("released_at_ms","is not",null).execute()}catch(a){throw u(a,`Failed to record restart-recovery activity for session ${s}`)}}async claimRecoverableSession(s,n,a){try{return(await this.getDb().updateTable("device_sessions").set({daemon_session_id:a,stable_identity_generation:m`stable_identity_generation + 1`,updated_at:Vr(this.timer)}).where("session_uuid","=",s).where("status","!=","active").where("stable_identity_generation","=",n.rowGeneration).where((c)=>n.daemonSessionId===null?c("daemon_session_id","is",null):c("daemon_session_id","=",n.daemonSessionId)).where((c)=>es(c)).returning("stable_identity_generation").executeTakeFirst())?.stable_identity_generation??void 0}catch(d){throw u(d,`Failed to claim recoverable session ${s}`)}}async releaseRecoverableSessionClaim(s,n,a){try{let d=await this.getDb().updateTable("device_sessions").set({daemon_session_id:a,stable_identity_generation:m`stable_identity_generation + 1`,updated_at:Vr(this.timer)}).where("session_uuid","=",s).where("status","!=","active").where("stable_identity_generation","=",n.rowGeneration).where((c)=>n.daemonSessionId===null?c("daemon_session_id","is",null):c("daemon_session_id","=",n.daemonSessionId)).where((c)=>es(c)).executeTakeFirst();return Number(d.numUpdatedRows)===1}catch(d){throw u(d,`Failed to release the claim on session ${s}`)}}async recordLivenessOwnership(s,n){await this.replaceLivenessOwnership(s,n)}async replaceLivenessOwnership(s,n){try{let a=await this.getDb().updateTable("device_sessions").set({liveness_owner_token:n,updated_at:Vr(this.timer)}).where("session_uuid","=",s).where("status","=","active").executeTakeFirst();if(Number(a.numUpdatedRows)!==1)throw new W(s)}catch(a){throw e.warn(`[DeviceSessionRepository] Failed to persist liveness ownership for ${s}: ${a}`),a}}async markAutolockSession(s,n){try{await(await this.getDb()).updateTable("device_sessions").set({status:"active",source:"autolock",autolock_enabled:1,mcp_session_id:n.mcpSessionId??null,daemon_session_id:n.daemonSessionId??null,activity_seq:m`max(activity_seq, ${n.activitySeq??n.lastUsedAtMs})`,last_used_at_ms:B("last_used_at_ms",n.activitySeq??n.lastUsedAtMs,n.lastUsedAtMs),expires_at_ms:B("expires_at_ms",n.activitySeq??n.lastUsedAtMs,n.expiresAtMs),released_at_ms:null,release_reason:null,updated_at:Vr(this.timer)}).where("session_uuid","=",s).where("status","=","active").execute()}catch(a){throw e.warn(`[DeviceSessionRepository] Failed to mark autolock session ${s}: ${a}`),u(a,`Failed to persist autolock session ${s}`)}}async markReleased(s,n,a,{reason:d,...c}){let{expectedRowGeneration:h,onlyIfRecoverable:p,onlyIfExpiredAtMs:S,onlyIfOwnedByDaemon:R}=c;try{let w=(await this.getDb()).updateTable("device_sessions").set({status:n,released_at_ms:a,release_reason:d,...Lt(d)?{}:{liveness_owner_token:null},updated_at:Vr(this.timer)}).where("session_uuid","=",s).where((k)=>GN(d)===2?k.val(!0):k.or([k("release_reason","is",null),k.not(Pn(k,d))])).where((k)=>c.unlessDaemonShutdown?k.or([k("release_reason","is",null),k("release_reason","!=","daemon-shutdown")]):k.val(!0));if(h!==void 0)w=w.where("stable_identity_generation","=",h);if(p)w=w.where((k)=>Ze(k));let y=c.onlyIfRestartRecoveryHandoff;if(y)w=w.where("release_reason","like",`${ae}_%`).where("released_at_ms","<=",y.releasedAtOrBeforeMs).where((k)=>k.or([k("liveness_policy","=",Xn),k("expires_at_ms",">",m`released_at_ms + ${y.recoveryWindowMs}`)]));if(S!==void 0)w=w.where((k)=>Xe(k)).where("expires_at_ms","<=",S);if(R!==void 0)w=w.where("daemon_session_id","=",R);let b=c.unlessTerminalOrOwnedByLivePeer;if(b)w=w.where((k)=>Mt(k,b.supersededReasons??[],b.livePeerDaemonSessionIds,b.ownDaemonSessionId));let A=await w.executeTakeFirst();if(Number(A.numUpdatedRows)===0)this.reportReleaseStatementMiss(s,d,c)}catch(g){if(g instanceof _)throw e.debug(`[DeviceSessionRepository] Release row refused for ${s}`),g;throw e.warn(`[DeviceSessionRepository] Failed to mark session ${s} ${n}: ${g}`),g}}reportReleaseStatementMiss(s,n,a){let d=a.unlessTerminalOrOwnedByLivePeer;if(a.unlessDaemonShutdown)throw new _(s);if(d&&(d.reportRefusal||d.ownDaemonSessionId!==void 0))throw new _(s);if(a.expectedRowGeneration!==void 0)e.info(`[DeviceSessionRepository] Skipped ${n} release of ${s}: the row is no longer generation ${a.expectedRowGeneration}`);else if(d)throw new _(s)}async markStaleActiveSessionsExpired(s,n,a="daemon-restart",d=new Set){let c=await this.getDb(),h=Array.from(d),p=h.some((S)=>S!==s);await c.updateTable("device_sessions").set({status:"expired",released_at_ms:n,release_reason:a,...Lt(a)?{}:{liveness_owner_token:null},updated_at:Vr(this.timer)}).where("status","=","active").where((S)=>{let R=S("daemon_session_id","!=",s),g=h.length===0?R:S.and([R,S("daemon_session_id","not in",h)]),w=S("daemon_session_id","is",null),y=p?S.and([w,Xe(S),S("expires_at_ms","<=",n)]):w;return S.or([y,g])}).execute()}async getSession(s){return await(await this.getDb()).selectFrom("device_sessions").selectAll().where("session_uuid","=",s).executeTakeFirst()}async listRecoverableSessions(s=this.timer.now(),n=()=>[]){let a=await this.getDb();await this.pruneExpiredSessions(s);let d=await a.selectFrom("device_sessions").selectAll().where((c)=>Ze(c)).where((c)=>c.or([c.and([Xe(c),c("expires_at_ms","<=",s)]),c.and([c("release_reason","like",`${ae}_%`),c("released_at_ms","<=",s-Ve)])])).execute();for(let c of d)try{let h=Ny(c,s);await this.markReleased(c.session_uuid,"expired",s,{reason:h,expectedRowGeneration:c.stable_identity_generation??0,onlyIfRecoverable:!0,...h==="restart-recovery-timeout"?{onlyIfRestartRecoveryHandoff:{releasedAtOrBeforeMs:s-Ve,recoveryWindowMs:Ve}}:{onlyIfExpiredAtMs:s},unlessTerminalOrOwnedByLivePeer:{livePeerDaemonSessionIds:yo(c.release_reason)&&c.released_at_ms!==null&&s>=c.released_at_ms+Ve?n():[]}})}catch(h){e.warn(`[DeviceSessionRepository] Failed to terminalize expired recoverable session ${c.session_uuid}: ${r(h)}`,h);continue}return await a.selectFrom("device_sessions").selectAll().where((c)=>Ze(c)).where((c)=>c.or([c("released_at_ms","is",null),c("released_at_ms",">=",s-ss)])).where((c)=>c.or([c("liveness_policy","=",Xn),c("expires_at_ms",">",s)])).where((c)=>c.or([c("release_reason","not like",`${ae}_%`),c("released_at_ms","is",null),c("released_at_ms",">",s-Ve)])).orderBy("last_used_at_ms","desc").execute()}async pruneExpiredSessions(s){try{let n=await this.getDb(),a=s-ss;await n.deleteFrom("device_sessions").where("released_at_ms","is not",null).where("released_at_ms","<",a).execute()}catch(n){e.warn(`[DeviceSessionRepository] Failed to prune expired sessions: ${n}`,n)}}}var Ee=GW,Ce=3600000;class ts extends t{code;constructor(s,n,a){super(`${s}: ${n}`,a);this.code=s;this.name="BindingConfigError"}}var CI=1500;function Kl(s){return s==="heartbeat"||s===Xn}function On(s){return Number.isSafeInteger(s)&&s>=Ee&&s<=Ce}function rq(s){if(s===void 0)return LT;if(!On(s))throw new ts("binding_config_invalid",`managed execution idleTimeoutMs ${String(s)} must be an integer between ${Ee} and ${Ce}`);return s}function Bt(s){if(!Number.isFinite(s))return LT;return Math.min(Ce,Math.max(Ee,Math.trunc(s)))}function DI(s,n,a){return a-s<=n}function OI(s,n,a){return Math.max(s,Math.min(n,s+a))}function nq(s,n,a,d){return s-n>a+d}function G(s){let n=s.now-s.lastHeartbeat;if(n<=s.heartbeatTimeoutMs)return{phase:"live",remainingMs:s.heartbeatTimeoutMs-n};let a=s.heartbeatTimeoutMs+(s.graceMs??0);if(n<=a)return{phase:"suspect",remainingMs:a-n};return{phase:"lapsed",remainingMs:0}}function Ht(s){let{phase:n,remainingMs:a}=G(s),d=s.heartbeatTimeoutMs+(s.graceMs??0);return{state:n,remainingMs:a,holdRemainingMs:Math.max(0,d-(s.now-s.lastHeartbeat))}}function $t(s){return Math.max(s.lastHeartbeat,s.stallForgivenAt??Number.NEGATIVE_INFINITY)}function iq(s){return Math.max(s.lastOwnerHeartbeat??s.lastHeartbeat,s.stallForgivenAt??Number.NEGATIVE_INFINITY)}function Y(s){return s.livenessOwnerToken!==void 0&&s.lastOwnerHeartbeat===void 0&&s.livenessOwnerBoundAt!==void 0}function le(s){return s.livenessOwnerToken!==void 0&&s.hasReceivedHeartbeat}function Fy(s){return le(s)?iq(s):$t(s)}function Wt(s,n){if(n===void 0||s.ownership!=="owned")return!0;let a=le(s)?s.lastOwnerHeartbeat??s.lastHeartbeat:s.lastHeartbeat;return DI(a,s.heartbeatTimeoutMs,n)}function Ly(s){return Kl(s.livenessPolicy)&&s.hasReceivedHeartbeat&&s.ownership==="owned"?ls:0}function Ut(s,n){return{now:n,lastHeartbeat:$t(s),heartbeatTimeoutMs:s.heartbeatTimeoutMs,livenessPolicy:s.livenessPolicy,graceMs:Ly(s)}}function is(s,n,a=!1){let d=Y(s);return{...Ut(s,n),lastHeartbeat:d?a?n:s.livenessOwnerBoundAt:iq(s),graceMs:d&&Kl(s.livenessPolicy)&&s.ownership==="owned"?ls:Ly(s)}}function de(s,n){return{...Ut(s,n),lastHeartbeat:Fy(s)}}var By=yh,Dn=1e4;function In(s){return typeof s==="function"?{hasActiveExecutions:s}:s}function oq(s){let{latestDeadlineMs:n}=s;if(Vt(n))return n+(s.deadlineGraceMs??Dn);return s.vetoedSince+(s.ceilingMs??By)}function qt(s){return s.hasActiveExecutions&&s.now<oq(s)}function Vt(s){return s!==void 0&&Number.isFinite(s)}class MI{ceilingMs;vetoedSince=new WeakMap;probe;now;constructor(s,n,a=By,d){this.ceilingMs=a;this.probe=In(s),this.now=d??(()=>n.now())}judge(s){if(!this.probe.hasActiveExecutions(s.sessionId))return this.vetoedSince.delete(s),{kind:"clear"};let n=this.now(),a=this.vetoedSince.get(s),d=a??n;if(a===void 0)this.vetoedSince.set(s,d);let c=this.probe.latestExecutionDeadlineMs?.(s.sessionId),h=oq({vetoedSince:d,latestDeadlineMs:c,ceilingMs:this.ceilingMs});if(n<h)return{kind:"kept",until:h,firstKept:a===void 0};return{kind:"expired",vetoedMs:n-d,bound:Vt(c)?"request-deadline":"ceiling"}}forget(s){this.vetoedSince.delete(s)}}function Gl(s){return s?.forced===!0}var zt=new Set(["com.google.android.permissioncontroller","com.android.permissioncontroller"]),jt=new Set(["com.android.systemui","android"]);function ns(s){return zt.has(s.packageName)&&s.activityName?.split(".").at(-1)==="GrantPermissionsActivity"}function Qt(s){let n=s.activityName;if(!n)return;if(ns(s))return{kind:"runtime-permission",package:s.packageName,activity:n};return jt.has(s.packageName)?{kind:"system-dialog",package:s.packageName,activity:n}:void 0}function _n(s){let a=s?.find((d)=>d.isFocused===!0)?.packageName;if(!a)return;if(zt.has(a))return{kind:"runtime-permission",package:a};return jt.has(a)?{kind:"system-dialog",package:a}:void 0}function l7(s){let n=_n(s?.viewHierarchy?.windows),a=s?.activeWindow;if(n)return a?.appId===n.package&&a.activityName?{...n,activity:a.activityName}:n;if(!a)return;if(ns({packageName:a.appId,activityName:a.activityName}))return{kind:"runtime-permission",package:a.appId,activity:a.activityName};return a.systemOverlay===!0?{kind:"system-dialog",package:a.appId,activity:a.activityName}:void 0}function u7(s){let n=s.kind==="runtime-permission"?`A system runtime permission prompt (${s.package}) is covering the app`:`A system window from ${s.package} is covering the app`,a=s.kind==="runtime-permission"?"answer it with tapOn on its permission_allow_button or permission_deny_button":"dismiss it (tapOn its button, or pressButton back)";return`${n}; scrolling will not reveal the field. Use observe to inspect it, ${a}, then retry.`}class rs{device;constructor(s){this.device=s}async put(s,n,a){return{success:(await E.getInstance(this.device).requestSettingsPut("secure",s,n,{valueType:a})).success}}async get(s){let a=await E.getInstance(this.device).requestSettingsGet("secure",s);return{success:a.success,found:a.found,value:a.value}}}var xn=3000,Mn="android:id/button1";function Xt(s){if(!s.node)return[];return Array.isArray(s.node)?s.node:[s.node]}function Ln(s){let n=[],a=[s];for(let d=a.pop();d!==void 0;d=a.pop())n.push(d),a.push(...Xt(d));return n}function Nn(s){let n=[],a=[s];for(let d=a.pop();d!==void 0;d=a.pop())if(d.windowId!==void 0)n.push(d);else a.push(...Xt(d));return n.length>0?n:[s]}function Fn(s){let n=Ln(s);return n.some((d)=>d.text?.includes("TalkBack")||d["content-desc"]?.includes("TalkBack"))?n.find((d)=>d["resource-id"]===Mn):void 0}function Bn(s){let n=Nn(s).map(Fn).find((d)=>d!==void 0);if(!n)return{kind:"none"};let a=n.bounds;return{kind:"dialog",tap:a?{x:Math.round((a.left+a.right)/2),y:Math.round((a.top+a.bottom)/2)}:null}}class os{device;clientProvider;constructor(s,n=()=>E.getInstance(this.device)){this.device=s;this.clientProvider=n}async probe(){try{let n=(await this.clientProvider().requestHierarchySyncWithoutObservationStreamPush(void 0,!0,void 0,xn))?.hierarchy.hierarchy;return n?Bn(n):{kind:"unavailable"}}catch(s){return e.warn(`[TalkBackDialogProbe] CtrlProxy hierarchy unavailable: ${r(s)}`),{kind:"unavailable"}}}}var X="com.google.android.marvin.talkback",Hn=`${X}/${X}.TalkBackService`,Zt=4,ei=500,cs=4,us=500,si=30000,ii=si+(Zt-1)*ei+(cs-1)*us,$n="A system runtime permission prompt is covering the screen after enabling TalkBack. On API 36 this was observed as the Android Accessibility Suite (TalkBack) notifications permission. The foreground activity does not identify the requested permission. Nothing was tapped. You must answer it: use observe to inspect the prompt, then tapOn its permission_allow_button or permission_deny_button.",Un="A system runtime permission prompt is covering the screen after enabling TalkBack. TalkBack has no runtime permission left to request, so another app raised it. Nothing was tapped. You must answer it: use observe to inspect the prompt, then tapOn its permission_allow_button or permission_deny_button.";function as(s,n){if(s.kind==="system-dialog")return`A system window (${s.package}/${s.activity}) is covering the screen after enabling TalkBack. Nothing was tapped. Use observe to inspect it, then dismiss it (tapOn its button, or pressButton back).`;return n?$n:Un}var p7=4000,ds=500,qn=2,Gn=["USER_FIXED","POLICY_FIXED","SYSTEM_FIXED"];async function Kn(s,n){await s?.beforeChange?.(n)}class bS{device;detector;adb;secureSettings;dialogProbe;timer;promptSettleMs;signal;constructor(s,n=null,a=ni,{timer:d=i,promptSettleMs:c=0,signal:h,secureSettings:p,dialogProbe:S}={}){this.device=s;this.detector=a;this.timer=d,this.promptSettleMs=c,this.signal=h,this.adb=n??v.create(s),this.secureSettings=p??new rs(s),this.dialogProbe=S??new os(s)}async toggle(s,n){let a=null;if(s){if(a=await this.detectInstalledService(),!a)return{supported:!1,applied:!1,reason:"TalkBack service not installed on this device"}}let d=await this.detectTalkBackEnabled();if(d===null)return{supported:!0,applied:!1,reason:"could not determine TalkBack state: device accessibility settings read unavailable"};if(d===s)return{supported:!0,applied:!1,currentState:s};await Kn(n,d),this.detector.invalidateCache(this.device.deviceId);let c;try{if(s){await this.enableTalkBack(a);let h=await this.dismissPermissionDialog();if(h==="could-not-confirm")return e.warn("[TalkBackToggle] TalkBack permission dialog dismissal could not be confirmed"),await this.failedToggleResult("TalkBack permission dialog dismissal could not be confirmed");if(c=await this.readBlockingPrompt(),c)e.warn(`[TalkBackToggle] ${as(c,!0)}`);else if(h==="not-found")e.warn("[TalkBackToggle] TalkBack permission dialog not found \u2014 continuing")}else await this.disableTalkBack()}catch(h){let p=r(h);return e.warn(`[TalkBackToggle] Failed to ${s?"enable":"disable"} TalkBack: ${p}`),await this.failedToggleResult(p)}finally{this.detector.invalidateCache(this.device.deviceId)}return await this.confirmWithBlockingPrompt(s,c)}async confirmWithBlockingPrompt(s,n){let a=await this.confirmTalkBackState(s);if(n)return{...a,blockingPrompt:n,warning:as(n,!0)};if(!s||!a.applied)return a;let d=await this.awaitLateBlockingPrompt();if(!d)return a;let c=as(d.prompt,d.talkBackMayPrompt);return e.warn(`[TalkBackToggle] ${c}`),{...a,blockingPrompt:d.prompt,warning:c}}async awaitLateBlockingPrompt(){let s=Math.floor(this.promptSettleMs/ds);if(s===0)return;o(this.signal);let n=await this.talkBackMayStillPrompt(),a,d=0;for(let c=0;c<s;c++){await P(this.timer.sleep(ds),this.signal);let h=await this.readSettleForeground();if(o(this.signal),h.kind==="prompt")return{prompt:h.prompt,talkBackMayPrompt:n};let p=h.kind==="screen"?h.signature:void 0;if(d=p!==void 0&&p===a?d+1:1,a=p,!n&&p!==void 0&&d>=qn){e.debug(`[TalkBackToggle] Screen stable with no pending TalkBack permission after ${(c+1)*ds}ms; ending settle window`);return}}return}async talkBackMayStillPrompt(){try{let s=await this.adb.executeCommand(`shell dumpsys package ${X}`,{maxBuffer:ie,noRetry:!0});if(We(s.stdout,s.stderr??""))return!0;let n=gn(s.stdout,X)?.runtimePermissions;if(!n||n.size===0)return!0;return[...n.values()].some(({state:a,raw:d})=>{let c=typeof d?.flags==="string"?d.flags:"";return a!=="granted"&&!Gn.some((h)=>c.includes(h))})}catch(s){return e.debug("[TalkBackToggle] TalkBack permission read failed:",r(s)),!0}}async readSettleForeground(){try{let s=await this.adb.getForegroundApp(this.signal);if(!s)return e.debug("[TalkBackToggle] Foreground app unavailable; no prompt reported"),{kind:"unknown"};let n=Qt(s);if(n)return{kind:"prompt",prompt:n};return{kind:"screen",signature:`${s.packageName}/${s.activityName??""}`}}catch(s){return e.debug("[TalkBackToggle] Foreground prompt read failed:",r(s)),{kind:"unknown"}}}async failedToggleResult(s){let n=await this.detectTalkBackEnabled();return{supported:!0,applied:!1,...n!==null?{currentState:n}:{},reason:s}}async confirmTalkBackState(s){let n=await this.detectTalkBackEnabled();for(let d=1;n!==s&&d<cs;d++)await this.timer.sleep(us),n=await this.detectTalkBackEnabled();let a;if(n!==s){let d=(cs-1)*us;a=`TalkBack requested ${s?"enabled":"disabled"} but observed ${n===null?"unknown (could not determine)":n?"enabled":"disabled"} after ${d}ms of confirmation waits`,e.warn(`[TalkBackToggle] ${a}`)}return{supported:!0,applied:n===s,...n!==null?{currentState:n}:{},...a?{reason:a}:{}}}async readBlockingPrompt(){let s=await this.readSettleForeground();return s.kind==="prompt"?s.prompt:void 0}async detectTalkBackEnabled(){this.detector.invalidateCache(this.device.deviceId);let s=await this.detector.resolveState(this.device.deviceId,this.adb);return s===null?null:s.service==="talkback"}async writeSecureSetting(s,n,a="string"){try{if((await this.secureSettings.put(s,n,a)).success)return}catch(d){e.debug(`[TalkBackToggle] a11y settings put failed for secure/${s}: ${d}`)}await this.adb.executeCommand(`shell settings put secure ${s} ${n}`)}async deleteSecureSetting(s){try{if((await this.secureSettings.put(s,null)).success)return}catch(n){e.debug(`[TalkBackToggle] a11y settings delete failed for secure/${s}: ${n}`)}await this.adb.executeCommand(`shell settings delete secure ${s}`)}async readSecureSetting(s){try{let a=await this.secureSettings.get(s);if(a.success)return a.found?a.value??"":""}catch(a){e.debug(`[TalkBackToggle] a11y settings get failed for secure/${s}: ${a}`)}return(await this.adb.executeCommand(`shell settings get secure ${s}`)).stdout.trim()}async enableTalkBack(s){let a=[...await this.getOtherServices(),s].join(":");await this.writeSecureSetting("enabled_accessibility_services",a),await this.writeSecureSetting("accessibility_enabled","1","int")}async disableTalkBack(){let s=await this.getOtherServices();if(s.length===0)await this.deleteSecureSetting("enabled_accessibility_services"),await this.writeSecureSetting("accessibility_enabled","0","int");else await this.writeSecureSetting("enabled_accessibility_services",s.join(":"))}async getOtherServices(){let s=await this.readSecureSetting("enabled_accessibility_services"),n=[];if(s&&s!=="null")for(let a of s.split(":")){let d=a.trim();if(d&&!d.includes(X)&&!d.includes("TalkBackService"))n.push(d)}return n}async detectInstalledService(){try{if(!(await this.adb.executeCommand(`shell pm list packages ${X}`)).stdout.split(`
3
- `).some((a)=>a.trim()===`package:${X}`))return e.debug("[TalkBackToggle] TalkBack package not found"),null;return e.debug("[TalkBackToggle] TalkBack package found; using known service component"),Hn}catch(s){return e.error("[TalkBackToggle] Failed to detect TalkBack package:",s),null}}async dismissPermissionDialog(){let s={dialogSeen:!1,observed:!1,dumpUsed:!1};for(let n=0;n<Zt;n++){if(n>0)await this.timer.sleep(ei);let a=await this.dismissAttempt(s);if(a)return a}return s.dialogSeen||!s.observed?"could-not-confirm":"not-found"}async dismissAttempt(s){if(await this.detectTalkBackEnabled()===!0)return e.debug("[TalkBackToggle] TalkBack reads enabled; no consent dialog to dismiss"),s.dialogSeen?"dismissed":"not-found";let n=await this.lookForDialog(s);if(n.kind==="unavailable")return;if(s.observed=!0,n.kind==="none")return s.dialogSeen?"dismissed":void 0;if(s.dialogSeen=!0,!n.tap)return;if(await this.adb.executeCommand(`shell input tap ${n.tap.x} ${n.tap.y}`),(await this.lookForDialog(s)).kind==="none")return e.debug("[TalkBackToggle] TalkBack permission dialog dismissed"),"dismissed";return}async lookForDialog(s){let n=await this.dialogProbe.probe();if(n.kind!=="unavailable"||s.dumpUsed)return n;s.dumpUsed=!0;try{return this.classifyDump(await this.dumpWindowHierarchy())}catch(a){return e.warn("[TalkBackToggle] Dialog fallback hierarchy dump failed:",a),{kind:"unavailable"}}}classifyDump(s){let n=this.findTalkBackPermissionButton(s);if(!n)return{kind:"none"};let a=/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/.exec(n[0]);if(!a)return{kind:"dialog",tap:null};return{kind:"dialog",tap:{x:Math.round((parseInt(a[1],10)+parseInt(a[3],10))/2),y:Math.round((parseInt(a[2],10)+parseInt(a[4],10))/2)}}}findTalkBackPermissionButton(s){if(!s.includes("TalkBack"))return null;return/<node[^>]*resource-id="android:id\/button1"[^>]*\/?>/.exec(s)}async dumpWindowHierarchy(){return await this.adb.executeCommand("shell uiautomator dump /sdcard/window_dump.xml",{timeoutMs:si}),(await this.adb.executeCommand("shell cat /sdcard/window_dump.xml")).stdout}}var ri=1e4,zn=500;class SS{device;detector;processExecutor;timer;clientProvider;constructor(s,{detector:n=Ao,processExecutor:a=new re,timer:d=i,clientProvider:c=()=>x.getInstance(this.device)}={}){this.device=s;this.detector=n,this.processExecutor=a,this.timer=d,this.clientProvider=c}async toggle(s,n){if(await this.reportPreviousState(s,n),!this.isSimulator())return this.toggleViaSettings(s);return this.toggleViaSimctl(s)}async getEnabled(){return this.detector.invalidateCache(this.device.deviceId),this.detector.resolveState(this.device.deviceId,this.clientProvider())}async reportPreviousState(s,n){if(!n?.beforeChange)return;let a=null;try{a=await this.getEnabled()}catch(d){e.warn(`[VoiceOverToggle] Could not read VoiceOver state: ${r(d)}`)}if(a===null){e.warn(`[VoiceOverToggle] VoiceOver state on ${this.device.deviceId} was unreadable before the toggle; it will not be restored on session release`);return}if(a!==s)await n.beforeChange(a)}async toggleViaSettings(s){let a=await this.clientProvider().requestSetVoiceOverEnabled(s);if(!a.success){let d=a.error??"Failed to toggle VoiceOver via Settings";return e.warn(`[VoiceOverToggle] Failed to ${s?"enable":"disable"} VoiceOver via Settings: ${d}`),{supported:!1,applied:!1,reason:d}}return this.detector.invalidateCache(this.device.deviceId),{supported:!0,applied:!0,currentState:s}}async toggleViaSimctl(s){let n=s?"YES":"NO";try{await this.processExecutor.executeCommand("xcrun",Vn(["spawn",this.device.deviceId,"defaults","write","com.apple.Accessibility","VoiceOverTouchEnabled","-bool",n])),await this.processExecutor.executeCommand("xcrun",Vn(["spawn",this.device.deviceId,"notifyutil","-p","com.apple.accessibility.VoiceOverStatusDidChange"]));let c=s?"launchctl kickstart -p system/com.apple.VoiceOverTouch":"launchctl kill SIGTERM system/com.apple.VoiceOverTouch";try{await this.processExecutor.executeCommand("xcrun",Vn(["spawn",this.device.deviceId,...c.split(" ")]))}catch(h){if(s||!this.isServiceAlreadyStopped(h))throw h;e.debug("[VoiceOverToggle] VoiceOver service was already stopped")}}catch(c){let h=r(c);return e.warn(`[VoiceOverToggle] Failed to ${s?"enable":"disable"} VoiceOver: ${h}`),{supported:!0,applied:!1,reason:h}}let a=this.clientProvider(),d=await this.waitForState(s,a);if(d===null){let c=`VoiceOver state could not be confirmed within ${ri}ms`;return e.warn(`[VoiceOverToggle] ${c}`),{supported:!0,applied:!1,reason:c}}return{supported:!0,applied:d===s,currentState:d}}isSimulator(){return z({deviceId:this.device.deviceId})==="simulator"}async waitForState(s,n){let a=this.timer.now()+ri,d=null;while(!0){let c=a-this.timer.now();if(c<=0)return d;if(this.detector.invalidateCache(this.device.deviceId),d=await this.detector.resolveState(this.device.deviceId,n,{timeoutMs:c}),d===s||this.timer.now()>=a)return d;await this.timer.sleep(Math.min(zn,a-this.timer.now()))}}isServiceAlreadyStopped(s){return s instanceof Error&&s.message.includes("No process to signal.")}}var fe=ii+2000,jn={talkBack:(s)=>new bS(s),voiceOver:(s)=>new SS(s)};async function oi(s,n,a,d=jn){a?.throwIfAborted();let c=n.platform==="android"?await d.talkBack(s).toggle(n.previousEnabled):await d.voiceOver(s).toggle(n.previousEnabled);if(a?.throwIfAborted(),c.currentState===n.previousEnabled)return;let h=n.platform==="android"?"TalkBack":"VoiceOver",p=n.previousEnabled?"enabled":"disabled";throw Error(c.reason??`${h} was not confirmed ${p} while restoring ${s.deviceId}`)}var ON="anonymous-acquisition",Ta="plan-label";function Yl(s){return s.persistenceMetadata?.source===ON}var MN=1000,NN=1000,Jl=1000,sq=15000,hA=250,FN=1000,Sr=1e4,Cs=Lv+1000,ai=2000,LN=FN+MN+NN+Jl+2*Cs+ai;function BN(s){return LN+(s?.clock?sq:0)+(s?.rotation?Jl:0)+(s?.screenReader?fe:0)}var Xl=Sr+2*Cs+1e4,$N="session-creation-timeout",li=Q({initialDelayMs:1000,maxDelayMs:30000}),NI=15000,s4=4,UN="plan-auto-release";function oc(){return Yn(f.SESSION_HEARTBEAT_TIMEOUT_MS.name,f.SESSION_HEARTBEAT_TIMEOUT_MS.legacyName,{fallback:ag})}var di=5000,nm=Ve;function wS(){return Yn(f.SESSION_PRE_FIRST_HEARTBEAT_GRACE_MS.name,f.SESSION_PRE_FIRST_HEARTBEAT_GRACE_MS.legacyName,{fallback:di})}var De="release-persist-timeout";class F extends t{sessionId;releaseReason;timeoutMs;reason=De;constructor(s,n,a){super(`Persisting the ${n} release of session ${s} did not finish within ${a}ms (reason=${De}).`);this.sessionId=s;this.releaseReason=n;this.timeoutMs=a;this.name="SessionReleasePersistTimeoutError"}}class Ie extends t{constructor(s,n){super(`Failed to persist liveness activity for session ${s}.`,{cause:n});this.name="SessionActivityPersistenceError"}}class $y extends t{sessionUuid;release;constructor(s,n){super(`Cannot create device session ${s}: the daemon is shutting down.`);this.sessionUuid=s;this.release=n;this.name="DaemonSessionCreationRejectedError"}}class ge extends t{sessionUuid;deviceId;code=yD;retryable=!0;retryAfterMs=sd;constructor(s,n){super(`Session ${s} is past its idle deadline and its device ${n} is being recovered (code ${yD}); retry after the recovery settles to receive either the live session or the terminal idle answer.`);this.sessionUuid=s;this.deviceId=n;this.name="SessionHeldByRecoveryError"}}class ve extends t{sessionUuid;code=Rg;retryable=!0;retryAfterMs=sd;constructor(s){super(`Session ${s} is rebinding devices (code ${Rg}); retry shutdown after it settles.`);this.sessionUuid=s;this.name="SessionRebindingError"}}class Z extends t{sessionUuid;remainingMs;code=nu;constructor(s,n){super(`Session ${s} missed a liveness heartbeat and is being restored; its device stays reserved for ${Math.ceil(n/1000)}s. Retry this call now, without waiting. If the retry says the session was released, acquire a device again with getAndroid or getApple.`);this.sessionUuid=s;this.remainingMs=n;this.name="SessionSuspectError"}}class ee extends t{sessionUuid;deviceId;code=Sp;retryable=!1;nextAction=ti;constructor(s,n,a){super(`Session ${s} ${a} (code ${Sp}, device '${n}').`);this.sessionUuid=s;this.deviceId=n;this.name="SessionTerminalReleaseInProgressError"}}var xe="is being terminally released from its device; use a new session UUID";class Jt extends Error{sessionUuid;release;constructor(s,n){super((n.releaseReason==="explicit-release"?`Session ${s} was released and cannot be reused. `:`Session ${s} is terminal after ${n.releaseReason} and cannot be reused. `)+"Acquire a new device with getAndroid or getApple.");this.sessionUuid=s;this.release=n;this.name="TerminalSessionError"}}class Zl extends t{sessionUuid;target;reason;terminalReleaseReason;code;deviceId;ownerPid;constructor(s,n,a,d){super(`Cannot safely recover session ${s}: ${n.platform} device '${n.stableDeviceId}' ${Qn(a,d)} (recovery reason: ${a}). The persisted session is terminal; acquire a new device with getAndroid or getApple.`);this.sessionUuid=s;this.target=n;this.reason=a;this.name="SessionRecoveryIdentityLossError",this.terminalReleaseReason=`identity-recovery-${a}`,this.code=a==="owned-by-other-daemon"?Su:void 0,this.deviceId=d?.deviceId,this.ownerPid=d?.ownerPid}}function Qn(s,n){switch(s){case"target-busy":return"is already in use";case"identity-continuity-lost":return"lost identity continuity";case"owned-by-other-daemon":return"is claimed by another AutoMobile daemon"+(n?.ownerPid===void 0?"":` (PID ${n.ownerPid})`)+` (code ${Su})`;case"target-absent":return"is unavailable"}}class Uy extends t{data={code:mm}}var ci=5,Zn=Q({initialDelayMs:250,maxDelayMs:5000});class hs{collaborators;reasonPredecessors=new WeakMap;pendingReasserts=new Map;owedReasserts=new Map;backoff=Zn;constructor(s){this.collaborators=s}setBackoff(s){this.backoff=s}notePredecessors(s,n){this.reasonPredecessors.set(s,[...this.reasonPredecessors.get(n)??[],n.releaseReason])}predecessors(s){return this.reasonPredecessors.get(s)??[]}expectReassert(s){let n=this.pendingReasserts;n.set(s,(n.get(s)??0)+1);let a=!1;return()=>{if(a)return;a=!0;let d=(n.get(s)??1)-1;if(d>0)n.set(s,d);else n.delete(s)}}isReassertPending(s){return this.pendingReasserts.has(s)}owed(s){return this.owedReasserts.get(s)}owe(s,n){let a=s.sessionId,d=this.owedReasserts.get(a),c=d?.session===s?d:void 0;if(d?.handle!==void 0)this.collaborators.timer.clearTimeout(d.handle);let h={session:s,attempt:(c?.attempt??0)+1,drainAttempted:c?.drainAttempted,callbacks:n};this.owedReasserts.set(a,h),this.arm(h)}arm(s){let n=this.collaborators.draining();if(n&&!s.drainAttempted){this.collaborators.trackDrainWrite(this.retryDuringDrain(s));return}if(s.attempt>ci||n){this.collaborators.logger.warn(`[SessionManager] The live row of session ${s.session.sessionId} is still not re-persisted after ${s.attempt} attempt(s); its next activity write retries it`);return}s.handle=this.collaborators.timer.setTimeout(()=>{s.handle=void 0,this.collaborators.trackDrainWrite(s.callbacks.retry(s).then(()=>{}))},this.backoff.delayForAttempt(s.attempt)),s.handle.unref?.()}defer(s){if(this.owedReasserts.get(s.session.sessionId)!==s||s.handle!==void 0)return;s.attempt++,this.arm(s)}drop(s){if(s.handle!==void 0)this.collaborators.timer.clearTimeout(s.handle),s.handle=void 0;if(this.owedReasserts.get(s.session.sessionId)===s)this.owedReasserts.delete(s.session.sessionId)}settle(s){let n=this.owedReasserts.get(s.sessionId);if(n?.session===s)this.drop(n)}retryAllNow(){return Array.from(this.owedReasserts.values(),(s)=>{if(s.handle!==void 0)this.collaborators.timer.clearTimeout(s.handle),s.handle=void 0;return this.retryDuringDrain(s)})}retryDuringDrain(s){return s.drainAttempted=!0,s.callbacks.retryDuringDrain(s)}stopTimers(){for(let s of this.owedReasserts.values())if(s.handle!==void 0)this.collaborators.timer.clearTimeout(s.handle),s.handle=void 0}}class ps{loadUnconfirmed(){return[]}record(){return"volatile"}resolve(){}}function ms(s,n,a){return n==="cli-idle-timeout"&&a!==void 0?{baseSessionId:s,releaseReason:n,cliIdleTimeoutMs:a}:{baseSessionId:s,releaseReason:n}}class Ss{host;derivedLabelSessionsByBase=new Map;endedLabelBases=new Map;planLabelMints=new Map;runningPlanLabelSessions=new Set;constructor(s){this.host=s}indexDerivedLabels(s,n){let a=Object.values(n).filter((d)=>d!==s);if(a.length>0){let d=this.derivedLabelSessionsByBase.get(s)??[];this.derivedLabelSessionsByBase.set(s,new Set([...d,...a]))}}openPlanLabelMints(s,n){let a=[...new Set(Object.values(n))].filter((c)=>c!==s);for(let c of a)this.planLabelMints.set(c,(this.planLabelMints.get(c)??0)+1);let d=!0;return()=>{if(!d)return;d=!1;for(let c of a){let h=(this.planLabelMints.get(c)??1)-1;if(h>0)this.planLabelMints.set(c,h);else this.planLabelMints.delete(c)}}}isMinting(s){return this.planLabelMints.has(s)}isMintableAndNotLive(s){return this.planLabelMints.has(s)&&!this.host.hasSession(s)}creatorSource(s,n,a){return this.planLabelMints.has(s)?a:n}getBaseSessionOfDerivedLabel(s){for(let[n,a]of this.derivedLabelSessionsByBase)if(a.has(s))return n;return}liveBaseOfDerivedId(s,n){for(let a=s.lastIndexOf(":");a>0;a=s.lastIndexOf(":",a-1)){let d=s.slice(0,a);if(n(d))return d}return}markRunning(s){this.runningPlanLabelSessions.add(s)}isRunning(s){return this.runningPlanLabelSessions.has(s)}takeDerivedLabelSessions(s,n,a,d){let c=this.derivedLabelSessionsByBase.get(s);if(n!==void 0&&a(n)){let h=ms(s,n,d);for(let p of c??[])if(this.host.hasSession(p))this.endedLabelBases.set(p,h)}return this.derivedLabelSessionsByBase.delete(s),c?.forEach((h)=>this.runningPlanLabelSessions.delete(h)),c?[...c]:[]}retainedEndedBase(s){return this.endedLabelBases.get(s)}clearEndedBase(s){this.endedLabelBases.delete(s)}}class Rs{bySession=new Map;remember(s,n,a){let d=this.bySession.get(s)??{};if(n==="lastUsed"&&d.lastUsed&&a.sessionClockMs<d.lastUsed.sessionClockMs)return;if(this.bySession.delete(s),this.bySession.set(s,{...d,[n]:a}),this.bySession.size>512){let c=this.bySession.keys().next();if(!c.done)this.bySession.delete(c.value)}}recall(s,n,a){let d=this.bySession.get(s)?.[n];return d?.wallMs===a?d.sessionClockMs:void 0}wallStamp(s,n,a){let d=this.bySession.get(s)?.[n];return d?.sessionClockMs===a?d.wallMs:void 0}}function ui(s,n,a){let d=(c,h)=>a?.recall(s.session_uuid,c,h)??n.toSessionClock(h);return{...s,created_at_ms:d("created",s.created_at_ms),last_used_at_ms:d("lastUsed",s.last_used_at_ms),expires_at_ms:d("expires",s.expires_at_ms),released_at_ms:typeof s.released_at_ms==="number"?d("released",s.released_at_ms):s.released_at_ms}}var hi=(s,n)=>n===void 0?void 0:s.toWall(n);class pi{inner;frame;written=new Rs;constructor(s,n){this.inner=s;this.frame=n}store(s,n,a){let d=this.written.wallStamp(s,n,a)??this.frame.toWall(a);return this.written.remember(s,n,{wallMs:d,sessionClockMs:a}),d}upsertActiveSession(s,n,a){return this.inner.upsertActiveSession({...s,activitySeq:s.activitySeq??s.lastUsedAtMs,createdAtMs:this.store(s.sessionUuid,"created",s.createdAtMs),lastUsedAtMs:this.store(s.sessionUuid,"lastUsed",s.lastUsedAtMs),expiresAtMs:this.store(s.sessionUuid,"expires",s.expiresAtMs)},hi(this.frame,n),a)}getSession(s){return this.inner.getSession(s).then((n)=>n&&ui(n,this.frame,this.written))}listRecoverableSessions(s,n){return this.inner.listRecoverableSessions(hi(this.frame,s),n).then((a)=>a.map((d)=>ui(d,this.frame,this.written)))}recordActivity(s,n){return this.inner.recordActivity(s,{...n,activitySeq:n.activitySeq??n.lastUsedAtMs,lastUsedAtMs:this.store(s,"lastUsed",n.lastUsedAtMs),expiresAtMs:this.store(s,"expires",n.expiresAtMs)})}recordRestartRecoveryActivity(s,n){return this.inner.recordRestartRecoveryActivity(s,this.frame.toWall(n))}recordLivenessOwnership(...s){return this.inner.recordLivenessOwnership(...s)}claimRecoverableSession(...s){return this.inner.claimRecoverableSession(...s)}releaseRecoverableSessionClaim(...s){return this.inner.releaseRecoverableSessionClaim(...s)}replaceLivenessOwnership(...s){return this.inner.replaceLivenessOwnership(...s)}markReleased(s,n,a,{reason:d,...c}){return this.inner.markReleased(s,n,this.store(s,"released",a),{reason:d,...c})}}function mi(s,n){return new pi(s,n)}class fs{host;lifecycle;cleanupTimer=null;constructor(s,n){this.host=s;this.lifecycle=n}startCleanupTimer(){if(this.cleanupTimer=this.host.timer.setInterval(()=>{this.lifecycle.cleanupExpiredSessions()},this.lifecycle.CLEANUP_INTERVAL_MS),this.cleanupTimer&&typeof this.cleanupTimer.unref==="function")this.cleanupTimer.unref()}stopCleanupTimer(){if(this.cleanupTimer)this.host.timer.clearInterval(this.cleanupTimer),this.cleanupTimer=null;if(this.lifecycle.rehydrationFollowUpTimer)this.host.timer.clearTimeout(this.lifecycle.rehydrationFollowUpTimer),this.lifecycle.rehydrationFollowUpTimer=null;this.host.rowWriter.stopRetryTimers(),this.host.superseded.stopTimers(),this.host.stateRestore.stopAll(),this.host.rowWriter.clearPendingNonTerminalReleases()}}var ue={activeSessionExecutionChecker:()=>!1,sessionExecutionDeadlineLookup:()=>{return},expiryReleaseExecutionCanceller:()=>{return},deviceAcquisitionExecutionCanceller:()=>{return}};function Si(s,n){let a=Object.entries(n).filter(([d,c])=>c===void 0||c===ue[d]).map(([d])=>d);if(a.length>0)throw new t(`${s} is missing daemon-attached collaborators: ${a.join(", ")}.`)}class gs{stallProbe;daemonSessionId;liveDaemonSessionIds;acceptingSessionCreations=!0;observerSessions;assertDaemonCollaboratorsAttached(){Si("SessionManager",{daemonSessionId:this.daemonSessionId,activeSessionExecutionChecker:this.activeSessionExecutionChecker,sessionExecutionDeadlineLookup:this.sessionExecutionDeadlineLookup,expiryReleaseExecutionCanceller:this.expiryReleaseExecutionCanceller,deviceAcquisitionExecutionCanceller:this.deviceAcquisitionExecutionCanceller})}attachDaemonSessionId(s){this.daemonSessionId=s}attachLiveDaemonSessionIds(s){this.liveDaemonSessionIds=s}recoveredRowOwner(){return this.daemonSessionId??null}setObserverSessionRegistry(s){this.observerSessions=s,s.setStallProbe?.(this.stallProbe)}activeSessionExecutionChecker=ue.activeSessionExecutionChecker;livenessOwnerCallInFlightReader;ownerConnectedAtReader;sessionExecutionDeadlineLookup=ue.sessionExecutionDeadlineLookup;expiryReleaseExecutionCanceller=ue.expiryReleaseExecutionCanceller;deviceAcquisitionExecutionCanceller=ue.deviceAcquisitionExecutionCanceller;recoveryExpiryReleaseHandler;setRecoveryExpiryReleaseHandler(s){this.recoveryExpiryReleaseHandler=s}setActiveSessionExecutionChecker(s){this.activeSessionExecutionChecker=s}setLivenessOwnerCallInFlightReader(s){this.livenessOwnerCallInFlightReader=s}setOwnerConnectedAtReader(s){this.ownerConnectedAtReader=s}setSessionExecutionDeadlineLookup(s){this.sessionExecutionDeadlineLookup=s}setExpiryReleaseExecutionCanceller(s){this.expiryReleaseExecutionCanceller=s}setDeviceAcquisitionExecutionCanceller(s){this.deviceAcquisitionExecutionCanceller=s}managedExecutionRecoveryListener;setManagedExecutionRecoveryListener(s){this.managedExecutionRecoveryListener=s}stopAcceptingSessionCreations(){this.acceptingSessionCreations=!1}isAcceptingSessionCreations(){return this.acceptingSessionCreations}lateRehydrationListener;setLateRehydrationListener(s){this.lateRehydrationListener=s}releaseDeviceHold;setReleaseDeviceHold(s){this.releaseDeviceHold=s}setStallProbe(s){this.stallProbe=s,this.observerSessions?.setStallProbe?.(s)}}class vs{host;pending=new Map;work=new Map;bounds=new Map;teardownBounds=new WeakMap;acquisition=new Map;acquisitionBounds=new Map;constructor(s){this.host=s}get(s,n){if(n){let a=Array.from(this.work.get(s)??[]).filter((d)=>d!==n);return a.length>0?Promise.allSettled(a).then(()=>{return}):null}return this.pending.get(s)??null}hasAcquisitionWork(s){return this.acquisition.has(s)}async drain(s){let n=[...this.pending.values(),...this.acquisition.values()];if(n.length===0)return!0;let a=Symbol("device cleanup drain timeout");try{return await l(Promise.allSettled(n),{timer:this.host.timer,timeoutMs:s,label:"Device cleanup drain",timeoutError:()=>a}),!0}catch(d){if(d!==a)throw u(d,"Failed to drain pending device cleanups");return e.warn(`Timed out after ${s}ms draining pending device cleanups`),!1}}register(s,n,a){if(a===void 0){this.track(s,[n]);return}let d={};if(typeof a==="number")d.settlesBy=this.host.now()+a;else n=this.cap(s,n,d,a);this.trackBound(this.bounds,s,n,d),this.track(s,[n]),this.armCaps(s)}registerAcquisition(s,n,a){if(a!==void 0)this.trackBound(this.acquisitionBounds,s,n,{settlesBy:this.host.now()+a});let d=Promise.allSettled([n]).then(()=>{return}),c=this.acquisition.get(s),h=c?Promise.allSettled([c,d]).then(()=>{return}):d;this.acquisition.set(s,h),h.then(()=>{if(this.acquisition.get(s)===h)this.acquisition.delete(s)})}noteTeardownBound(s,n){this.teardownBounds.set(s,n)}trackTeardown(s,n){for(let a of n){let d=this.teardownBounds.get(a);if(d!==void 0)this.trackBound(this.bounds,s,a,{settlesBy:d})}this.track(s,n)}track(s,n){let a=this.work.get(s)??new Set;this.work.set(s,a);for(let h of n){a.add(h);let p=()=>{if(a.delete(h),a.size===0&&this.work.get(s)===a)this.work.delete(s)};h.then(p,p)}let d=this.pending.get(s),c=Promise.allSettled(d?[d,...n]:n).then(()=>{return});this.pending.set(s,c),c.then(()=>{if(this.pending.get(s)===c)this.pending.delete(s)})}armCaps(s){if(this.host.hasOwner(s))return;for(let n of this.bounds.get(s)??[])n.start?.()}retryAfterMs(s,n){let a=this.host.now(),d=[...n];for(let h of this.bounds.get(s)??[])if(h.start)d.push(a+this.host.teardownCapMs);else if(h.settlesBy!==void 0)d.push(h.settlesBy);if(!this.host.hasOwner(s)){for(let h of this.acquisitionBounds.get(s)??[])if(h.settlesBy!==void 0)d.push(h.settlesBy)}let c=Math.max(0,...d.map((h)=>h-a));return c>0?c:this.host.defaultRetryAfterMs}workCount(s){return this.work.get(s)?.size??0}boundCount(s){return this.bounds.get(s)?.size??0}trackBound(s,n,a,d){let c=s.get(n)??new Set;s.set(n,c),c.add(d);let h=()=>{if(c.delete(d),c.size===0&&s.get(n)===c)s.delete(n)};a.then(h,h)}cap(s,n,a,d){let c=this.host.teardownCapMs,h=Promise.withResolvers(),p=!1,S=()=>{p=!0,a.start=void 0,h.resolve()};return n.then(S,S),a.start=()=>{if(a.start=void 0,p)return;a.settlesBy=this.host.now()+c,l(n,{timer:this.host.timer,timeoutMs:c,unref:!0,label:d.name,onTimeout:()=>{try{d.abandon?.()}catch(R){e.warn(`Failed to abandon ${d.name} for ${s}: ${r(R)}`,R)}e.warn(`Abandoned ${d.name} for ${s} after ${c}ms; the device is no longer held for it and may still carry ${d.leftover}`)}}).then(S,(R)=>{e.debug(`Device cleanup wait ended for ${s}: ${r(R)}`),S()})},h.promise}}var fi="Rotation is not supported on this display (the screen size did not change)",gi="Rotation is not supported on the cover panel (the screen size did not change). Open the device to its inner panel (unfold the hinge) and retry there, or keep the current orientation.";function vi(s){return s?.display.role==="inner"?"the inner panel":"this display"}function ws(s){return`Rotation is not supported on ${vi(s)} (the screen size did not change)`}function er(s){return s?.display.role==="cover"?gi:`${ws(s)}. The runner reported a rotation but the screen size is unchanged.`}function sr(s,n){return s?.display.role==="cover"&&n===fi?gi:void 0}function tr(s,n,a){return n?.display.role==="inner"&&a===fi?{...s,error:`${ws(n)}. Keep the current orientation.`}:s}function ir(s,n,a){let{requested:d,previous:c,current:h,previousObservation:p}=a,S=sr(p,n.error);if(S)return{...s,success:!1,rotationPerformed:!1,error:S};if(h===d&&c!=="unknown"&&c!==d)return{...s,success:!0,rotationPerformed:!0,error:void 0,warning:`The runner reported "${n.error??"Failed to rotate iOS device"}" although the observed display changed from ${c} to ${h}.`,message:`Successfully rotated from ${c} to ${h}`};return tr(s,p,n.error)}function Me(s){switch(s){case"portrait":case"portrait_upside_down":return"portrait";case"landscape":case"landscape_left":case"landscape_right":return"landscape";default:return"unknown"}}function Le(s){if(!s)return"unknown";let n=s.rotation;if(n===0||n===2)return"portrait";if(n===1||n===3)return"landscape";let a=bc(void 0,s.screenSize);return a===void 0?"unknown":a===0?"portrait":"landscape"}function or(s,n,a,d){let c=s.rotationPerformed?`a completed rotation to ${n}`:`the device was already in ${n} orientation`,h=wi(d,s);return`${s.rotationPerformed&&Me(s.previousOrientation)==="unknown"&&h?`${ws(d)}. `:""}The display is still ${a} after the runner reported ${c} (currentOrientation: ${s.currentOrientation??"unknown"}).`}function wi(s,n){let a=s?.screenSize,d=n.observation?.screenSize;return Boolean(dr(s,n.observation)&&a&&d&&a.width===d.width&&a.height===d.height)===!0}function Ri(s){return(s?.screenSize.width??0)>0&&(s?.screenSize.height??0)>0}function ar(s,n,a,d){let{previous:c,current:h}=a;return((s.success&&s.rotationPerformed||!s.success&&c!=="unknown"&&h===n)&&c!==n&&(h===n||h==="unknown")&&Ri(d)&&Ri(s.observation)&&wi(d,s))===!0}function lr(s,n,a){return s.success&&a!=="unknown"&&a!==n}function dr(s,n){let a=s?.display?.key,d=n?.display?.key;return a===void 0||d===void 0||a===d}function cr(s,n,a){let d=Le(a),c=Le(s.observation),h={...s,previousOrientation:d==="unknown"?Me(s.previousOrientation):d,currentOrientation:c==="unknown"?Me(s.currentOrientation):c};if(ar(s,n,{previous:d,current:c},a)){let p=er(a),S=d!=="unknown";return{...h,currentOrientation:S?d:h.currentOrientation,...s.observation&&S?{observation:{...s.observation,rotation:a?.rotation}}:{},success:!1,rotationPerformed:!1,error:p,message:`Failed to rotate to ${n}; the screen size did not change.`}}if(lr(s,n,c)){let p=or(s,n,c,a);return{...h,success:!1,rotationPerformed:!1,error:p,message:`Failed to rotate to ${n}; the display is still ${c}.`}}if(!s.success)return ir(h,s,{requested:n,previous:d,current:c,previousObservation:a});return{...h,message:s.rotationPerformed?`Successfully rotated from ${h.previousOrientation} to ${h.currentOrientation}`:`Device is already in ${h.currentOrientation} orientation`}}function yi(s){let{width:n,height:a}=s?.screenSize??{width:0,height:0};if(n>0&&a>0&&n!==a)return n>a?"landscape":"portrait";return Le(s)}function ys(s){if(!s||!Number.isFinite(s.width)||!Number.isFinite(s.height)||s.width<=0||s.height<=0||s.width===s.height)return;return s.width>s.height?"landscape":"portrait"}function bi(s,n,a,d){let c=ys(d);if(!s.success||c===void 0||c===n)return s;let h=s.rotationPerformed?`a completed rotation to ${n}`:`the device was already in ${n} orientation`,p={...s};return delete p.observation,{...p,success:!1,rotationPerformed:!1,currentOrientation:c,error:`Rotation is not supported on ${vi(a)} (the display is still ${c} after the runner reported ${h}). Keep the current orientation.`,message:`Failed to rotate to ${n}; the display is still ${c}.`}}function ki(s,n,a,d=!1){if(!d)return cr(s,n,a);let c=Le(a);return{...s,success:!1,rotationPerformed:!1,previousOrientation:c==="unknown"?Me(s.previousOrientation):c,currentOrientation:"unknown",error:`${s.error??"Rotate timed out"}; the orientation could not be confirmed.`,message:`Failed to rotate to ${n}; the orientation could not be confirmed.`}}class Pi{device;screenshotClient;constructor(s,n){this.device=s;this.screenshotClient=n}async readPixelSize(s,n,a){if(!Yr(this.device))return;try{let d=await(this.screenshotClient??new L(this.device)).screenshot(s,n,a),c=Bs(d);if(!c)e.warn("iOS rotate display probe could not read screenshot dimensions");return c??void 0}catch(d){o(a),e.warn(`iOS rotate display probe failed: ${r(d)}`,d);return}}}async function Ai(s,n){let{requested:a,previousObservation:d,device:c,probe:h,timer:p,signal:S}=n;if(!s.success)return s;let R=h??new Pi(c),g=s.observation?.display.key??d?.display.key,w=(A)=>bi(s,a,d,A),y=w(await R.readPixelSize(c.deviceId,g,S));if(y.success)return y;await P(p.sleep(200),S);let b=await R.readPixelSize(c.deviceId,g,S);return ys(b)===void 0?y:w(b)}var bs=(s)=>`The device orientation could not be restored to ${s} after the failed rotate; the next app may open rotated.`;async function ks(s,n,a){let d;try{let c=await s.awaitRecovery(x.OBSERVE_RECOVERY_WAIT_MS,a);d=`iOS runner recovery after ${n} timeout: ${c}${c==="recovered"?" (runner restarted)":""}.`}catch(c){o(a),e.warn(`iOS ${n} timeout recovery failed: ${r(c)}`,c),d=`iOS runner recovery after ${n} timeout: failed; ${r(c)}`}return o(a),d}function he(s,n){if(![0,1,2,3].includes(s))return null;return(n??!1)===(s===1||s===3)?"portrait":"landscape"}function Ps(s,n){return s==="landscape"===(n??!1)?0:1}async function we(s,n,a){try{let{stdout:d}=await s.executeCommand(a===void 0||a===0?"shell wm size":`shell wm size -d ${a}`,{signal:n}),c=d.match(/Override size:\s*(\d+)x(\d+)/)??d.match(/Physical size:\s*(\d+)x(\d+)/);return c?Number(c[1])>Number(c[2]):null}catch(d){return e.debug(`[OrientationReader] Failed to read natural display size: ${d}`),null}}class a4{adb;constructor(s){this.adb=s}async readOrientation(s,n){try{let a=await al(this.adb,{signal:n});if(a===null)return null;let d=await we(this.adb,n);return he(a,d)}catch(a){return e.debug(`[OrientationReader] Failed to read Android orientation: ${a}`),null}}}class ye extends t{details;constructor(s){super(`Restoration of ${s.key}=${s.expected} read back ${s.actual??"unset"}: this device's window manager manages rotation per device state (fold posture), so the setting cannot be restored by writing it. Not retrying.`);this.name="RotationSettingManagedError",this.details={...s,retryable:!1}}}var K="device_state_rotation_lock";function As(s,n){let a=s.split(":");if(a.length<2||a.length%2!==0)return null;let d=a.findIndex((c,h)=>h%2===0&&c===String(n));if(d<0||a[d+1]!=="1")return null;return a[d+1]="2",a.join(":")}var se=1000,Ne=1000;class Ts{ctx;constructor(s){this.ctx=s}async readSystemSetting(s,n){return this.readSetting("system",s,n)}async readSetting(s,n,a){o(a);try{let d=E.getInstance(this.ctx().device),c=await P(d.requestSettingsGet(s,n),a);if(c.success)return c.found?c.value??null:null}catch(d){o(a),e.debug(`[Rotate] a11y settings get failed for ${n}: ${d}`)}o(a);try{let c=(await P(this.ctx().adb.executeCommand(`shell settings get ${s} ${n}`),a)).stdout.trim();return!c||c==="null"?null:c}catch(d){return o(a),e.warn(`Failed to read ${s} setting ${n}: ${d}`),null}}async writeRotationSettings(s){let{state:n,signal:a,assertCurrentDevice:d,skipIfCurrent:c}=s,h={needed:!1,assertCurrentDevice:d},p=[];if(n.userRotation!==null)p.push(["user_rotation",n.userRotation]);if(n.accelerometerRotation!==null)p.push(["accelerometer_rotation",n.accelerometerRotation]);let S=n.deviceStateRotationLock;await H(a,async()=>{if(c&&await this.settingsAlreadyMatch(p,a)&&(S===void 0||await this.readSetting("secure",K,a)===S))return;if(S!==void 0)try{await this.writeSetting({namespace:"secure",key:K,value:S,valueType:"string"},a,h)}catch(R){o(a),e.warn(`[Rotate] Failed to restore device_state_rotation_lock=${S}; restoring the rotation settings anyway: ${r(R)}`,R)}if(n.userRotation!==null)await this.writeSystemSetting("user_rotation",String(n.userRotation),a,h);if(n.accelerometerRotation!==null)await this.writeSystemSetting("accelerometer_rotation",String(n.accelerometerRotation),a,h);for(let[R,g]of p){let w=await this.readSystemSetting(R,a);if(w!==String(g))throw await this.readBackMismatch(R,g,w,a)}})}async settingsAlreadyMatch(s,n){for(let[a,d]of s)if(await this.readSystemSetting(a,n)!==String(d))return!1;return s.length>0}async readBackMismatch(s,n,a,d){let c=!1;try{let{stdout:h}=await P(this.ctx().adb.executeCommand("shell cmd device_state print-states"),d);c=rf(h).length>1}catch(h){o(d),e.warn(`[Rotate] Could not read device states after ${s} read-back mismatch: ${r(h)}`,h)}return c?new ye({key:s,expected:n,actual:a}):new t(`Restoration of ${s}=${n} did not verify by read-back (read ${a??"unset"}).`)}async readUserRotation(s){let n=await this.readSystemSetting("user_rotation",s);if(n===null||n.trim()==="")return null;let a=Number(n);return Number.isSafeInteger(a)?a:null}async rollbackUserRotation(s){let{previous:n,written:a,signal:d,slot:c}=s;if(a===null||d?.aborted||n===null)return;try{c?.get();let h=await this.readUserRotation(d);if(h!==a)return"Skipped user_rotation rollback: its current value no longer matches this call's write (another actor may have changed it).";if(h===n)return;await l(()=>this.writeRotationSettings({state:{userRotation:n,accelerometerRotation:null},signal:d,assertCurrentDevice:()=>{c?.get()}}),{timer:this.ctx().timer,timeoutMs:se,signal:d,label:"Rollback user_rotation"})}catch(h){return e.warn(`Failed to roll back user_rotation after rotation failure: ${r(h)}`,h),`Failed to roll back user_rotation: ${h}`}}async completeSessionRestore(s,n,a,d){if(n!==!1||s.orientationLockState!=="unlocked"||!a)return s;let c=a.get();if(!c)return s;try{await l(()=>this.writeRotationSettings({state:{userRotation:c.userRotation,accelerometerRotation:null},signal:d,assertCurrentDevice:()=>{a.get()}}),{timer:this.ctx().timer,timeoutMs:se,signal:d,label:"Restore original user_rotation"})}catch(h){e.warn(`Failed to restore original user_rotation after explicit automatic rotation: ${r(h)}`,h),s.warning=[s.warning,`Failed to restore original user_rotation: ${h}`].filter(Boolean).join(" ")}return s}async restoreAutoRotateSetting(s){await l(()=>H(void 0,async()=>{if(s.pendingWrite)try{await s.pendingWrite}catch(a){e.warn(`[Rotate] Pending setting write failed before cleanup: ${r(a)}`,a)}let n=await this.prepareDeviceStateLockForAutoRotate(s);if(await this.writeSystemSetting("accelerometer_rotation","1",void 0,s),n){let a=await this.readSystemSetting("accelerometer_rotation");if(a!=="1")throw new t(`accelerometer_rotation=1 read back ${a??"unset"} after restoring device_state_rotation_lock.`)}s.needed=!1}),{timer:this.ctx().timer,timeoutMs:se,label:"Restore accelerometer_rotation=1"})}async prepareDeviceStateLockForAutoRotate(s){let n=s.deviceStateLock;if(n===void 0)return!1;let a;if(n.kind==="restore")a=n.value;else{let d=await this.readSetting("secure",K);if(d===null)return!1;a=As(d,await this.readCommittedDeviceState())}if(a!==null)try{await this.writeSetting({namespace:"secure",key:K,value:a,valueType:"string"},void 0,s)}catch(d){e.warn(`[Rotate] Failed to write device_state_rotation_lock before restoring auto-rotate: ${r(d)}`,d)}return!0}async readCommittedDeviceState(){try{let{stdout:s}=await this.ctx().adb.executeCommand("shell cmd device_state state",{timeoutMs:se}),n=nf(s);if(n!==void 0)return n;e.warn(`[Rotate] Could not parse the committed device state from: ${s.trim()}`)}catch(s){e.warn(`[Rotate] Could not read the committed device state: ${r(s)}`,s)}return-1}async writeSystemSetting(s,n,a,d){await this.writeSetting({namespace:"system",key:s,value:n,valueType:"int"},a,d)}async writeSetting(s,n,a){let{namespace:d,key:c,value:h,valueType:p}=s;o(n),a?.assertCurrentDevice?.();try{let R=E.getInstance(this.ctx().device);a?.assertCurrentDevice?.();let g=R.requestSettingsPut(d,c,h,{valueType:p});if(a)a.pendingWrite=g;let w=await P(g,n);if(w.success)return;e.debug(`[Rotate] a11y settings put failed for ${c}: ${w.error}`)}catch(R){o(n),e.debug(`[Rotate] a11y settings put threw for ${c}: ${R}`)}o(n),a?.assertCurrentDevice?.();let S=this.ctx().adb.executeCommand(`shell settings put ${d} ${c} ${h}`);if(a)a.pendingWrite=S;await P(S,n)}}var Fe=150,ur=1000,Ti=3000,Ei=2,Es={maxAttempts:3,holdMs:0,windowMs:1/0},Oi={maxAttempts:Math.ceil(Ti/Fe)+2,holdMs:ur,windowMs:Ti};class Os{ctx;store;callNaturalLandscape;callScoped=!1;constructor(s,n){this.ctx=s;this.store=n}beginCall(){this.callScoped=!0,this.callNaturalLandscape=void 0}endCall(){this.callScoped=!1,this.callNaturalLandscape=void 0}async readNaturalAxes(s){if(this.callNaturalLandscape)return this.callNaturalLandscape.value;o(s);let n=await P(we(this.ctx().adb,s),s);if(o(s),this.callScoped)this.callNaturalLandscape={value:n};return n}async orientationOfRotation(s,n){return he(s,await this.readNaturalAxes(n))??"landscape"}async readLiveRotation(s){o(s);try{let n=this.ctx().deadlineMs,a=n===void 0?{signal:s}:{signal:s,timeoutMs:Math.max(n-this.ctx().timer.now(),_L)};return await P(al(this.ctx().adb,a),s)}catch(n){return o(s),e.warn("[Rotate] Failed to read live rotation via dumpsys window",n),null}}updateSettleStreak(s,n,a,d){if(n!==null&&n===s.orientation)s.count++;else s.orientation=n,s.count=n===null?0:1,s.startedAt=a;return s.count>=Ei&&a-s.startedAt>=d}async readLiveRotationWithSettleWait(s,n,a=Es){o(n);let d=this.ctx().timer,c=d.now(),h={orientation:null,count:0,startedAt:c},p=null;for(let S=0;S<a.maxAttempts;S++){if(d.now()-c>=a.windowMs)break;let R=await this.readLiveRotation(n),g=R===null?null:await this.orientationOfRotation(R,n),w=d.now(),y=this.updateSettleStreak(h,g,w,a.holdMs);if(g!==null)p=g!==s&&h.count>=Ei?R:null;if(g===s&&y)return R;let b=a.windowMs-(w-c);if(b<=0||S+1>=a.maxAttempts)break;await P(d.sleep(Math.min(Fe,b)),n)}return p}async getCurrentOrientation(s){o(s);let n=await this.readLiveRotation(s);if(n!==null)return this.orientationOfRotation(n,s);let a=await this.store.readSystemSetting("user_rotation",s);if(!a||!/^\d+$/.test(a))return e.warn(`Invalid user_rotation value: ${a}, defaulting to portrait`),"portrait";let d=parseInt(a,10);return this.orientationOfRotation(d,s)}async getAutoRotateState(s){o(s);let n=await this.store.readSystemSetting("accelerometer_rotation",s);if(n===null||!/^\d+$/.test(n))return"unknown";return parseInt(n,10)===0?"locked":"enabled"}async getOrientationLockState(s){o(s);let n=await this.getAutoRotateState(s);if(n==="unknown")return"unknown";return n==="locked"?"locked":"unlocked"}}class Ds{ctx;reader;store;constructor(s,n,a){this.ctx=s;this.reader=n;this.store=a}async lockAlreadyAppliedOrientation(s,n,a,{options:d,signal:c}){o(c);let{beforeWrite:h,cleanup:p}=d,S=await this.reader.readLiveRotation(c);if(S===null)return{kind:"requires-rotation",reason:"live-rotation-unavailable"};if(await this.reader.orientationOfRotation(S,c)!==s)return{kind:"requires-rotation",reason:"live-orientation-changed"};await h({accelerometerRotation:!0,captureUserRotation:!0});try{await h({userRotation:S}),await this.store.writeSystemSetting("user_rotation",String(S),c,p),await h(),await this.store.writeSystemSetting("accelerometer_rotation","0",c,p),await this.ctx().awaitIdle.waitForRotation(S,void 0,c)}catch(y){return o(c),e.warn(`Failed to lock the current ${s} orientation: ${y}`,y),{kind:"handled",result:{success:!1,orientation:s,value:n,currentOrientation:a,previousOrientation:a,rotationPerformed:!1,orientationLockHandled:!1,orientationLockState:await this.reader.getOrientationLockState(c),error:`Failed to lock the device in its current ${s} orientation: ${y}`}}}let g=await this.reader.getOrientationLockState(c),w=await this.reader.readLiveRotation(c);if(g!=="locked"||w!==S){let y=w===null?"unknown":await this.reader.orientationOfRotation(w,c);return{kind:"handled",result:{success:!1,orientation:s,value:n,currentOrientation:y,previousOrientation:a,rotationPerformed:!1,orientationLockHandled:!1,orientationLockState:g,error:`Device was already in ${s} orientation, but its exact locked rotation could not be confirmed (auto-rotate is ${g}).`}}}return{kind:"handled",result:{success:!0,orientation:s,value:n,currentOrientation:a,previousOrientation:a,rotationPerformed:!1,orientationLockHandled:!0,orientationLockState:g,message:`Locked device orientation to ${s}.`}}}shouldReturnAlreadyAppliedOrientation(s,n,a){return s&&a==="locked"||n&&a==="unlocked"||!s&&!n}async handleAlreadyAppliedOrientation(s,n,a,{autoRotateState:d,plan:c}){let{preserveLock:h,restoreAutomaticRotation:p,beforeWrite:S,cleanup:R,signal:g}=c;if(o(g),a!==s)return{kind:"requires-rotation",reason:"orientation-differs"};let w=d==="locked"?"locked":d==="enabled"?"unlocked":"unknown";if(this.shouldReturnAlreadyAppliedOrientation(h,p,w))return{kind:"handled",result:{success:!0,orientation:s,value:n,currentOrientation:a,previousOrientation:a,rotationPerformed:!1,orientationLockHandled:!1,orientationLockState:w,message:`Device is already in ${s} orientation`}};if(h)return this.lockAlreadyAppliedOrientation(s,n,a,{options:{beforeWrite:S,cleanup:R},signal:g});if(!p)return{kind:"requires-rotation",reason:"orientation-differs"};await S({accelerometerRotation:!0}),R.deviceStateLock={kind:"clear"};let{achievedOrientation:y,warning:b}=await this.restoreAutoRotateAndConfirmOrientation(s,g,R),A=await this.reader.getOrientationLockState(g);if(A!=="unlocked"&&y!=="unknown")return{kind:"handled",result:{success:!1,orientation:s,value:n,currentOrientation:y,previousOrientation:a,rotationPerformed:!1,orientationLockHandled:!0,orientationLockState:A,error:`Automatic rotation could not be confirmed as restored (orientation lock is ${A}).`}};let k=y==="unknown"?"The end orientation could not be confirmed after restoring automatic rotation.":void 0;return{kind:"handled",result:{success:k===void 0,error:k,orientation:s,value:n,currentOrientation:y,previousOrientation:a,rotationPerformed:!1,orientationLockHandled:!0,orientationLockState:A,warning:b,message:k??`Restored automatic rotation; device is currently ${y}.`}}}resolveAutoRotatePlan(s,n,a=!1){let d=n===!0,c=n===!1,h=s==="enabled",p=a&&n===void 0&&h;return{preserveLock:d,restoreAutomaticRotation:c,wasAutoRotateEnabled:h,shouldRestoreAutoRotate:c||h&&!d&&!p,restoreAfterConfirmation:p,canForceAutoRotateOff:n!==void 0||s!=="unknown"}}logAutoRotatePlan(s,n,a){if(n)e.info("Keeping the requested orientation locked after rotation");else if(a)e.info("Rotating before explicitly restoring automatic rotation");else if(s==="locked")e.info("Orientation is locked; forcing the requested rotation");else if(s==="enabled")e.info("Auto-rotate is on; temporarily disabling it to force rotation");else e.info("accelerometer_rotation is unreadable; setting user_rotation only, without forcing accelerometer_rotation (no confirmed prior state to restore)")}async restoreAutoRotateAfterFailedLock(s,n,a,{cleanup:d,sessionMode:c}){if(s.success||c||!a.started||!n.preserveLock||!n.wasAutoRotateEnabled)return s;try{await this.store.restoreAutoRotateSetting(d)}catch(h){e.warn("Failed to restore auto-rotate after failed lock",h),s.warning=[s.warning,`Failed to restore auto-rotate: ${h}`].filter(Boolean).join(" ")}return s}async finalizeAndroidRotation(s){let{orientation:n,value:a,currentOrientation:d,achievedOrientation:c,warning:h,restoreConfirmed:p,preserveLock:S,restoreAutomaticRotation:R,wasAutoRotateEnabled:g,signal:w}=s;o(w);let y=await this.reader.getOrientationLockState(w),b=d!==n;if(c==="unknown")return{success:!1,orientation:n,value:a,currentOrientation:"unknown",previousOrientation:d,rotationPerformed:b,orientationLockHandled:g,orientationLockState:y,warning:h??"The end orientation could not be confirmed after restoring auto-rotate.",error:"The end orientation could not be confirmed after restoring auto-rotate.",message:"The end orientation could not be confirmed after restoring auto-rotate."};if(S&&y!=="locked"){let A=await this.confirmOrientationAfterAutoRotateRestore(n,!1,w);return{success:!1,orientation:n,value:a,currentOrientation:A.achievedOrientation,previousOrientation:d,rotationPerformed:b,orientationLockHandled:!1,orientationLockState:y,error:`${b?`Rotated to ${n}`:`Device is already in ${n} orientation`}, but the persistent orientation lock could not be confirmed (auto-rotate is ${y}).`}}if(R&&y!=="unlocked")return{success:!1,orientation:n,value:a,currentOrientation:c,previousOrientation:d,rotationPerformed:b,orientationLockHandled:!0,orientationLockState:y,error:`Rotated to ${n}, but automatic rotation could not be confirmed as restored (orientation lock is ${y}).`};if(c!==n){let A=p?"auto-rotate reverted it":`after attempting to restore auto-rotate, it was confirmed ${c}; auto-rotate may have reverted it`,k=`Requested ${n}, but the device is actually in ${c}; ${A}. Pass lockOrientation: true to keep the requested ${n} orientation.`;return{success:!1,orientation:n,value:a,currentOrientation:c,previousOrientation:d,rotationPerformed:c!==d,orientationLockHandled:g,orientationLockState:y,warning:h,error:k,message:k}}return{success:!0,orientation:n,value:a,currentOrientation:c,previousOrientation:d,rotationPerformed:b,orientationLockHandled:g,orientationLockState:y,warning:h,message:b?this.buildRotationMessage(n,d,c,{warning:h,restoreConfirmed:p}):`Locked device orientation to ${n}.`}}buildConfirmationWarning(s,n,a){if(a===s)return;if(a===null)return n?`Auto-rotate is enabled and the device's orientation after restoring it could not be confirmed (live rotation read failed); the requested ${s} orientation may not be held.`:`The device's orientation after attempting to restore auto-rotate could not be confirmed (live rotation read failed); the requested ${s} orientation may not be held.`;return n?`Auto-rotate is enabled and immediately reverted the device to ${a} based on the physical sensor; the requested ${s} orientation is not held.`:`The device reverted to ${a} after attempting to restore auto-rotate; the requested ${s} orientation is not held.`}async confirmOrientationAfterAutoRotateRestore(s,n,a){o(a);let d=await this.reader.readLiveRotationWithSettleWait(s,a,Oi);if(d===null)return{achievedOrientation:"unknown",warning:this.buildConfirmationWarning(s,n,null)};let c=await this.reader.orientationOfRotation(d,a);return{achievedOrientation:c,warning:this.buildConfirmationWarning(s,n,c)}}async restoreAutoRotateAndConfirmOrientation(s,n,a={needed:!1}){let d;try{await this.store.restoreAutoRotateSetting(a)}catch(g){e.debug(`[Rotate] accelerometer_rotation restore write failed on first attempt, retrying once: ${g}`);try{await this.store.restoreAutoRotateSetting(a)}catch(w){d=w,e.warn(`[Rotate] accelerometer_rotation restore write failed after retry (ambiguous outcome) after confirming rotation to ${s}: ${w}`)}}if(n?.aborted&&d!==void 0)throw new t("Rotation cancelled; accelerometer_rotation may be left changed (auto-rotate may remain disabled)",{cause:d});let c=d===void 0,{achievedOrientation:h,warning:p}=await this.confirmOrientationAfterAutoRotateRestore(s,c,n);if(c)return{achievedOrientation:h,warning:p,restoreConfirmed:c};let S=`the accelerometer_rotation restore write failed after a retry (ambiguous outcome \u2014 could not confirm whether auto-rotate was actually re-enabled): ${d}`,R=p?`${p} Additionally, ${S}`:`Rotated to ${s}, but ${S}`;return{achievedOrientation:h,warning:R,restoreConfirmed:c}}buildRotationMessage(s,n,a,{warning:d,restoreConfirmed:c}){if(!d)return`Successfully rotated from ${n} to ${s}`;if(!c){if(a==="unknown")return`Rotated to ${s}, but after attempting to restore auto-rotate, the device's current orientation could not be confirmed`;if(a===s)return`Rotated to ${s}; after attempting to restore auto-rotate, the device was confirmed to remain ${a}`;return`Rotated to ${s}; after attempting to restore auto-rotate, the device was confirmed ${a}`}if(a==="unknown")return`Rotated to ${s}, but the device's orientation after auto-rotate restore could not be confirmed`;if(a!==s)return`Rotated to ${s}, but auto-rotate reverted the device to ${a}`;return`Successfully rotated from ${n} to ${s}`}}class Is{ctx;reader;store;readLiveRotation;constructor(s,n,a,d){this.ctx=s;this.reader=n;this.store=a;this.readLiveRotation=d}async readRotationAtReturn(s){let{signal:n}=s;try{let a=await l(()=>this.readLiveRotation(n),{timer:this.ctx().timer,timeoutMs:Ne,signal:n,label:"Confirm end-of-call rotation"});return o(n),a}catch(a){return o(n),e.warn("[Rotate] Failed to confirm end-of-call orientation",a),null}}async confirmAndroidOrientationAtReturn(s){let{result:n,orientation:a,signal:d,settings:c,restoreOnFailure:h}=s;if(!n.success||n.currentOrientation!==a)return n;let p=await this.readRotationAtReturn({signal:d});if(p===null){let k=`The end-of-call orientation could not be confirmed (live rotation read failed); the requested ${a} orientation may not be held.`,T={...n,success:!1,error:k,currentOrientation:"unknown",warning:[n.warning,k].filter(Boolean).join(" "),message:k};return h(T)}let S=await this.reader.orientationOfRotation(p,d);if(S===a)return n;let R=n.rotationPerformed===!1?`was already in ${a}`:`rotated to ${a}`,w=`${n.orientationLockState==="unlocked"?`The device ${R} and then returned to ${S} because automatic rotation is on.`:`The device left the requested ${a} orientation after the call confirmed it.`} The device is in ${S} at the time the call returned. Pass lockOrientation: true to keep the requested orientation.`,y=c?.started?await this.store.rollbackUserRotation({previous:c.previousUserRotation,written:c.writtenUserRotation,signal:d}):void 0,b=[n.warning,y].filter(Boolean).join(" ")||void 0,A={...n,success:!1,currentOrientation:S,error:w,message:w,...b?{warning:b}:{}};return h(A)}}var hr=2000,Di=5;class Zf extends Oe{static rotationLocks=new Map;store;reader;outcomes;endConfirmation;options;constructor(s,{adb:n=null,timer:a=i,options:d={},collaborators:c={}}={}){super(s,{adb:n,timer:a,displayFence:c});this.options=d;let h=()=>({device:this.device,adb:this.adb,timer:this.timer,awaitIdle:this.awaitIdle,deadlineMs:this.options.deadlineMs});this.store=new Ts(h),this.reader=new Os(h,this.store),this.outcomes=new Ds(h,this.reader,this.store),this.endConfirmation=new Is(h,this.reader,this.store,(p)=>this.readLiveRotation(p))}readLiveRotation(s){return this.reader.readLiveRotation(s)}readLiveRotationWithSettleWait(s,n){return this.reader.readLiveRotationWithSettleWait(s,n,Es)}getCurrentOrientation(s){return this.reader.getCurrentOrientation(s)}async getRestoreState(s){if(o(s),this.device.platform==="ios")throw new t("iOS rotation restore state is unobservable");let n={accelerometerRotation:null,userRotation:null};return await this.captureSessionRotationOriginals({state:n,captureAccelerometer:!0,captureUser:!0,signal:s}),await this.captureDeviceStateRotationLock(n,s),n}async isOrientationLocked(s){return o(s),await this.reader.getAutoRotateState(s)==="locked"}getRotationLock(){let s=Zf.rotationLocks.get(this.device.deviceId);if(!s)s=new Wn,Zf.rotationLocks.set(this.device.deviceId,s);return s}async restoreRotationSettings(s,n){o(n),await this.getRotationLock().runExclusive(()=>this.store.writeRotationSettings({state:s,signal:n,skipIfCurrent:!0}))}async execute(s,{progress:n,lockOrientation:a,signal:d,display:c=0}={}){o(d);let h=J();h.serial("rotate");try{switch(this.device.platform){case"ios":if(c!==0)throw new t("Selecting a non-default display for rotate is supported only on Android devices.");return await this.executeIosRotation(s,n,h,d);case"android":if(c!==0)return await this.rotateNonDefaultDisplay(s,c,a,d);return await this.executeAndroidRotation({orientation:s,perf:h,lockOrientation:a,signal:d},n);default:throw St(this.device.platform,"rotate the device")}}catch(p){throw u(p,d?.aborted?"Rotation cancelled; device may still complete the change":"Failed to rotate device")}}async rotateNonDefaultDisplay(s,n,a,d){await this.assertDisplayExists(n,d);let c=await we(this.adb,d,n),h=Ps(s,c),p=a===!1?"free":"lock";await this.adb.executeCommand(`shell cmd window user-rotation -d ${n} ${p} ${h}`);let S=await this.readDisplayRotationUntil(n,(y)=>he(y,c)===s,d),R={orientation:s,value:h,rotationPerformed:!0};if(S===null){let y=`Display ${n}'s orientation after rotation could not be confirmed (live rotation read failed); the requested ${s} orientation may not be held.`;return{...R,success:!0,currentOrientation:"unknown",warning:y,message:y}}let g=he(S,c)??"unknown";if(g===s)return{...R,success:!0,currentOrientation:s,message:`Rotated display ${n} to ${s}`};let w=`Requested ${s} on display ${n}, but the display is actually in ${g} (rotation ${S}) after the rotation settled.`;return{...R,success:!1,currentOrientation:g,rotationPerformed:!1,error:w,message:w}}async readDisplayRotationUntil(s,n,a){let d=this.timer.now(),c=null;for(let h=1;h<=Di;h++){o(a);try{let p=await al(this.adb,{displayId:s,signal:a,timeoutMs:_L});if(c=p??c,p!==null&&n(p))return p}catch(p){o(a),e.warn(`[Rotate] Failed to read display ${s} rotation: ${r(p)}`,p)}if(h===Di||this.timer.now()-d>=Ne)break;await P(this.timer.sleep(Fe),a)}return c}async assertDisplayExists(s,n){let a=[];try{let d=await this.adb.executeCommand("shell cmd display get-displays",{timeoutMs:hr,noRetry:!0,signal:n});o(n),a=Og(d.stdout).map(({logicalId:c})=>c)}catch(d){if(o(n),d instanceof Error&&d.name==="AbortError")throw d;e.debug(`[Rotate] Could not read Android displays: ${d}`)}if(a.length===0){e.debug("[Rotate] Android display list is empty; skipping display existence check");return}if(!a.includes(String(s)))throw new t(`display ${s} not found; available: ${a.join(", ")}`)}async executeIosRotation(s,n,a,d){o(d);let c,h,p=!1,S=await this.observedInteraction(async(g)=>{c=g;try{o(d);let w=x.getInstance(this.device);h=w;let y=await a.track("iOSRotation",()=>P(w.requestRotate(s,5000,a),d));if(p=y.timedOut===!0,p)w.ensureRecoveryStarted();if(!y.success)return{success:!1,orientation:s,value:s==="portrait"?0:1,error:y.error??"Failed to rotate iOS device",currentOrientation:y.currentOrientation,previousOrientation:y.previousOrientation,rotationPerformed:y.rotationPerformed};return{success:!0,orientation:s,value:y.value,currentOrientation:y.currentOrientation,previousOrientation:y.previousOrientation,rotationPerformed:y.rotationPerformed,orientationLockHandled:!1,message:y.rotationPerformed?`Successfully rotated from ${y.previousOrientation} to ${y.currentOrientation}`:`Device is already in ${s} orientation`}}catch(w){throw o(d),u(w,"Failed to rotate iOS device")}},{...Kt.noTreeResolution,timeoutMs:At.lifecycle,progress:n,perf:a,signal:d,skipUiStability:!0}),R=ki(S,s,c,p);if(p&&h){let g=await ks(h,"rotate",d);return{...R,warning:[R.warning,g].filter(Boolean).join(" ")}}return R=await Ai(R,{requested:s,previousObservation:c,device:this.device,probe:this.options.iosDisplayPixelProbe,timer:this.timer,signal:d}),R.success?R:await this.restoreIosOrientationAfterFailure(R,h,c,{perf:a,signal:d})}async restoreIosOrientationAfterFailure(s,n,a,d){let{perf:c,signal:h}=d,p=yi(a);if(!n||p==="unknown"||p===s.orientation)return s;try{o(h);let S=await c.track("iOSRotationRestore",()=>P(n.requestRotate(p,5000,c),h));if(S.timedOut){n.ensureRecoveryStarted();let R=await ks(n,"rotate restore",h);return{...s,warning:`${bs(p)} ${R}`}}if(!S.success)throw Error(S.error??"runner reported failure");return s}catch(S){return o(h),e.warn(`iOS rotation restore to ${p} failed: ${r(S)}`,S),{...s,warning:bs(p)}}}async executeAndroidRotation(s,n){o(s.signal),this.reader.beginCall();try{return await this.runAndroidRotation(s,n)}finally{this.reader.endCall()}}async runAndroidRotation(s,n){let{orientation:a,perf:d,signal:c}=s,h={usesObservationForResolution:!1,changeExpected:!0,timeoutMs:At.lifecycle,progress:n,perf:d,signal:c,skipUiStability:!0},p={restoreOnFailure:async(R)=>R},S=await this.observedInteraction(async()=>{let R=this.getRotationLock().acquire(),g;try{g=await P(R,c)}catch(w){throw R.then((y)=>y()),u(w,"Could not acquire the device rotation lock")}try{let w=(b)=>this.performAndroidRotation(s,b,p),y=this.options.sessionRotation?await this.options.sessionRotation(w):await w();if(y.success&&y.rotationPerformed===!1)h.changeExpected=!1;return y}finally{g()}},h);return this.endConfirmation.confirmAndroidOrientationAtReturn({result:S,orientation:a,signal:c,settings:p.settings,restoreOnFailure:p.restoreOnFailure})}async captureSessionRotationOriginals(s){let{state:n,captureAccelerometer:a,captureUser:d,signal:c}=s;if(a&&n.accelerometerRotation===null){let h=await this.reader.getAutoRotateState(c);if(h==="unknown")throw new t("The current rotation setting accelerometer_rotation could not be read; retry rotation when settings are readable.");n.accelerometerRotation=h==="locked"?0:1}if(d&&n.userRotation===null){let h=await this.store.readUserRotation(c);if(h===null)throw new t("The current rotation setting user_rotation could not be read; retry rotation when settings are readable.");n.userRotation=h}}async captureDeviceStateRotationLock(s,n){let a=await this.store.readSetting("secure",K,n);if(a!==null)s.deviceStateRotationLock=a}rotationCallSettings(s,n,a){let d=s==="locked"?0:s==="enabled"?1:null,c={previousUserRotation:null,started:!1,writtenUserRotation:null,beforeWrite:async(h={})=>{let p=n?.get();if(!c.started)c.previousUserRotation=await this.store.readUserRotation(a);let S=p??{accelerometerRotation:d,userRotation:c.previousUserRotation};if(n){if(await this.captureSessionRotationOriginals({state:S,captureAccelerometer:h.accelerometerRotation===!0,captureUser:h.captureUserRotation===!0||h.userRotation!==void 0,signal:a}),!c.started&&c.previousUserRotation===null)c.previousUserRotation=S.userRotation;if(!p)await this.captureDeviceStateRotationLock(S,a);if(o(a),n.get(),!p)n.record(S)}if(c.started=!0,h.userRotation!==void 0)c.writtenUserRotation=h.userRotation}};return c}async finishAndroidRotation(s,n,a,d){let{lockOrientation:c,signal:h}=a;if(n.started&&!s.success&&s.currentOrientation!=="unknown"&&s.currentOrientation!==s.orientation){let p=await this.store.rollbackUserRotation({previous:n.previousUserRotation,written:n.writtenUserRotation,signal:h,slot:d});s.warning=[s.warning,p].filter(Boolean).join(" ")||void 0}return this.store.completeSessionRestore(s,c,d,h)}async performAndroidRotation(s,n,a){let{orientation:d,perf:c,lockOrientation:h,signal:p}=s;o(p);let S=Ps(d,await this.reader.readNaturalAxes(p)),[R,g]=await c.track("getOrientationState",()=>Promise.all([this.getCurrentOrientation(p),this.reader.getAutoRotateState(p)])),w=this.rotationCallSettings(g,n,p);if(a)a.settings=w;let y=this.outcomes.resolveAutoRotatePlan(g,h,n!==void 0),{preserveLock:b,restoreAutomaticRotation:A,wasAutoRotateEnabled:k,shouldRestoreAutoRotate:T,canForceAutoRotateOff:I}=y,O={needed:!1,assertCurrentDevice:()=>{n?.get()}};if(a)a.restoreOnFailure=(C)=>this.outcomes.restoreAutoRotateAfterFailedLock(C,y,w,{cleanup:O,sessionMode:n!==void 0});await this.planDeviceStateLock(O,{shouldRestoreAutoRotate:!n&&b&&k,autoRotateState:g,signal:p});let D=await this.outcomes.handleAlreadyAppliedOrientation(d,S,R,{autoRotateState:g,plan:{preserveLock:b,restoreAutomaticRotation:A,beforeWrite:w.beforeWrite,cleanup:O,signal:p}});if(D.kind==="handled")return await this.outcomes.restoreAutoRotateAfterFailedLock(D.result,y,w,{cleanup:O,sessionMode:n!==void 0}),this.finishAndroidRotation(D.result,w,{lockOrientation:h,signal:p},n);e.debug(`[Rotate] Continuing with requested rotation: ${D.reason.replaceAll("-"," ")}`);try{this.outcomes.logAutoRotatePlan(g,b,A),await c.track("setRotation",async()=>{if(await w.beforeWrite({accelerometerRotation:I,captureUserRotation:!0}),I)o(p),O.needed=T&&g!=="locked",await this.planDeviceStateLock(O,{shouldRestoreAutoRotate:T||y.restoreAfterConfirmation,autoRotateState:g,signal:p}),await this.store.writeSystemSetting("accelerometer_rotation","0",p,O);else e.debug("[Rotate] accelerometer_rotation is unconfirmed; writing user_rotation without changing the lock state");await w.beforeWrite({userRotation:S}),await this.store.writeSystemSetting("user_rotation",String(S),p,O)}),await c.track("waitForRotation",()=>this.awaitIdle.waitForRotation(S,void 0,p));let C=d,N,M=!0;if(T||y.restoreAfterConfirmation)({achievedOrientation:C,warning:N,restoreConfirmed:M}=await this.outcomes.restoreAutoRotateAndConfirmOrientation(d,p,O));let xt=await this.outcomes.finalizeAndroidRotation({orientation:d,value:S,currentOrientation:R,achievedOrientation:C,warning:N,restoreConfirmed:M,preserveLock:b,restoreAutomaticRotation:A,wasAutoRotateEnabled:k,signal:p});return await this.outcomes.restoreAutoRotateAfterFailedLock(xt,y,w,{cleanup:O,sessionMode:n!==void 0}),this.finishAndroidRotation(xt,w,{lockOrientation:h,signal:p},n)}catch(C){return this.recoverAndroidRotation({error:C,orientation:d,value:S,currentOrientation:R,settings:w,cleanup:O,plan:y,lockOrientation:h,slot:n,signal:p})}}async planDeviceStateLock(s,n){let{shouldRestoreAutoRotate:a,autoRotateState:d,signal:c}=n;if(!a)return;if(d!=="enabled"){s.deviceStateLock={kind:"clear"};return}let h=await this.store.readSetting("secure",K,c);if(h!==null)s.deviceStateLock={kind:"restore",value:h}}async confirmAndroidRotationAfterError(s){let{orientation:n,settings:a,slot:d,signal:c}=s;if(a.writtenUserRotation===null)return{achievedOrientation:"unknown"};try{d?.get();let h=await l(()=>this.readLiveRotationWithSettleWait(n,c),{timer:this.timer,timeoutMs:se,signal:c,label:"Confirm rotation after error"});if(h!==null)return{achievedOrientation:await this.reader.orientationOfRotation(h,c)};return{achievedOrientation:"unknown",warning:"Orientation is unconfirmed; user_rotation was left unchanged because the rotation outcome is unknown."}}catch(h){return e.warn("Failed to confirm orientation after rotation error",h),{achievedOrientation:"unknown",warning:`Orientation is unconfirmed: ${h}`}}}async restoreAutoRotateAfterError(s){let{settings:n,cleanup:a,shouldRestoreAutoRotate:d,signal:c}=s,h;if(c?.aborted?a.needed:n.started&&d)try{await this.store.restoreAutoRotateSetting(a),e.info("Restored auto-rotate after error")}catch(p){e.warn(`Failed to restore auto-rotate: ${r(p)}`,p),h=u(p,"Failed to restore auto-rotate")}if(c?.aborted&&h)throw new t("Rotation cancelled; accelerometer_rotation may be left changed (auto-rotate may remain disabled)",{cause:h});return o(c),h}async recoverAndroidRotation(s){let{error:n,orientation:a,value:d,currentOrientation:c,settings:h,cleanup:p,plan:S,lockOrientation:R,slot:g,signal:w}=s,{shouldRestoreAutoRotate:y,preserveLock:b,restoreAutomaticRotation:A,wasAutoRotateEnabled:k}=S;if(e.warn("Failed to change device orientation",n),!h.started&&n instanceof t)throw n;let T=await this.restoreAutoRotateAfterError({settings:h,cleanup:p,shouldRestoreAutoRotate:y,signal:w}),I=await this.confirmAndroidRotationAfterError({orientation:a,settings:h,slot:g,signal:w}),{achievedOrientation:O,warning:D}=I;if(O===a){let C=!T;if(S.restoreAfterConfirmation){let M=await this.outcomes.restoreAutoRotateAndConfirmOrientation(a,w,p);O=M.achievedOrientation,D=[D,M.warning].filter(Boolean).join(" ")||void 0,C=M.restoreConfirmed}let N=await this.outcomes.finalizeAndroidRotation({orientation:a,value:d,currentOrientation:c,achievedOrientation:O,warning:[T?.message,D,`Rotation was confirmed after an earlier error: ${n}`].filter(Boolean).join(" "),restoreConfirmed:C,preserveLock:b,restoreAutomaticRotation:A,wasAutoRotateEnabled:k,signal:w});return await this.outcomes.restoreAutoRotateAfterFailedLock(N,S,h,{cleanup:p,sessionMode:g!==void 0}),this.finishAndroidRotation(N,h,{lockOrientation:R,signal:w},g)}if(O!=="unknown"){let C=await this.store.rollbackUserRotation({previous:h.previousUserRotation,written:h.writtenUserRotation,signal:w,slot:g});D=[D,C].filter(Boolean).join(" ")||void 0}return D=[D,T?.message].filter(Boolean).join(" ")||void 0,this.outcomes.restoreAutoRotateAfterFailedLock({success:!1,warning:D,orientation:a,value:d,currentOrientation:O,previousOrientation:c,rotationPerformed:!1,orientationLockHandled:k,orientationLockState:await this.reader.getOrientationLockState(w),error:`Failed to change device orientation: ${n}`},S,h,{cleanup:p,sessionMode:g!==void 0})}}var pr="7",mr="2147483647",Rr="0",fr="60000";class HN{settingsClientProvider;deviceTraits;device;adb;constructor(s,n=v,a,d=zr){this.settingsClientProvider=a;this.deviceTraits=d;this.device=s,this.adb=n.create(s)}async apply(s){if(!s)return{applied:!1,skipReason:"disabled"};if(this.device.platform!=="android")return{applied:!1,skipReason:"unsupported"};let n=await this.detectDeviceType();if(n==="emulator")return{applied:!1,skipReason:"emulator"};if(n==="unknown")return e.warn(`[KeepScreenAwake] Unable to detect device type for ${this.device.deviceId}; skipping keep-awake`),{applied:!1,skipReason:"detection_failed"};await this.wakeDevice();let a=await this.readSvcStayonState();if(await this.tryEnableSvcStayon()){let c=await this.readSvcStayonState();if(c.enabled===!0)return{applied:!0,method:"svc",svcWasEnabled:a.enabled,originalStayOnWhilePluggedIn:a.value};if(c.value===void 0)e.warn(`[KeepScreenAwake] Unable to verify svc stayon on ${this.device.deviceId}; falling back to settings`);else e.warn(`[KeepScreenAwake] svc stayon did not enable stay_on_while_plugged_in on ${this.device.deviceId}; falling back to settings`)}let d=await this.applySettingsFallback();if(!d.applied)return e.warn(`[KeepScreenAwake] Failed to keep screen awake on ${this.device.deviceId}`),{applied:!1,skipReason:"failed"};return{applied:!0,method:"settings",originalStayOnWhilePluggedIn:d.originalStayOnWhilePluggedIn,originalScreenOffTimeout:d.originalScreenOffTimeout,appliedSettings:d.appliedSettings}}async restore(s){if(!s.applied||this.device.platform!=="android")return{status:"skipped",reason:"not_applied"};if(s.method==="svc")return this.restoreSvcStayon(s);if(s.method!=="settings"||!s.appliedSettings)return{status:"skipped",reason:"not_applied"};let n=[],a=[];for(let[d,c,h,p,S]of[[s.appliedSettings.stayOnWhilePluggedIn,"global","stay_on_while_plugged_in",s.originalStayOnWhilePluggedIn,"int"],[s.appliedSettings.screenOffTimeout,"system","screen_off_timeout",s.originalScreenOffTimeout,"long"]]){if(!d)continue;let R=await this.restoreSetting(c,h,p,S);if(R.status==="failed")n.push(...R.failures);else if(R.status==="restored_to_baseline")a.push(...R.settings)}return this.restoreOutcome(n,a)}async restoreSvcStayon(s){let n;if(s.originalStayOnWhilePluggedIn!==void 0){let a=this.parseStayOnWhilePluggedIn(s.originalStayOnWhilePluggedIn),d=await this.restoreSetting("global","stay_on_while_plugged_in",s.originalStayOnWhilePluggedIn,"int");if(d.status==="restored")return d;if(a!==!1){if(a===void 0)e.warn(`[KeepScreenAwake] Failed svc stayon restore on ${this.device.deviceId}: original value unparseable`);return d}n=d}else{if(s.svcWasEnabled===void 0)return this.restoreUnknownSvcStayon();if(s.svcWasEnabled)return{status:"restored"}}try{return await this.adb.executeCommand("shell svc power stayon false"),{status:"restored"}}catch(a){return e.warn(`[KeepScreenAwake] Failed to disable svc stayon on ${this.device.deviceId}: ${a}`),{status:"failed",failures:[...n?.status==="failed"?n.failures:[],{setting:"svc_stayon",error:r(a)}]}}}async restoreUnknownSvcStayon(){let s=await this.restoreSetting("global","stay_on_while_plugged_in",void 0,"int"),n=s.status==="restored_to_baseline"?[...s.settings]:[],a=s.status==="failed"?[...s.failures]:[];try{await this.adb.executeCommand("shell svc power stayon false"),n.push({setting:"svc_stayon",value:"svc stayon false"})}catch(d){e.warn(`[KeepScreenAwake] Failed to disable svc stayon on ${this.device.deviceId}: ${d}`,d),a.push({setting:"svc_stayon",error:r(d)})}return this.restoreOutcome(a,n)}restoreOutcome(s,n){if(s.length)return{status:"failed",failures:s,...n.length?{baselineSettings:n}:{}};return n.length?{status:"restored_to_baseline",settings:n}:{status:"restored"}}async detectDeviceType(){if(this.device.deviceId.startsWith("emulator-"))return"emulator";try{let{isEmulator:s}=await this.deviceTraits.read(this.adb,this.device.deviceId);if(s===!0)return"emulator";if(s===!1)return"physical";return e.warn(`[KeepScreenAwake] Unexpected emulator flag on ${this.device.deviceId}; device type unknown`),"unknown"}catch(s){return e.warn(`[KeepScreenAwake] Failed to read device traits on ${this.device.deviceId}: ${r(s)}`,s),"unknown"}}async wakeDevice(){try{await this.adb.executeCommand("shell input keyevent KEYCODE_WAKEUP")}catch(s){e.warn(`[KeepScreenAwake] Failed to wake ${this.device.deviceId}: ${s}`)}}async tryEnableSvcStayon(){try{return await this.adb.executeCommand("shell svc power stayon true"),!0}catch(s){return e.info(`[KeepScreenAwake] svc power stayon failed on ${this.device.deviceId}, falling back: ${s}`),!1}}async applySettingsFallback(){let s=await this.readSetting("global","stay_on_while_plugged_in"),n=await this.readSetting("system","screen_off_timeout"),a={stayOnWhilePluggedIn:!1,screenOffTimeout:!1};try{await this.putSetting("global","stay_on_while_plugged_in",pr,"int"),a.stayOnWhilePluggedIn=!0}catch(d){e.warn(`[KeepScreenAwake] Failed to set stay_on_while_plugged_in on ${this.device.deviceId}: ${d}`)}try{await this.putSetting("system","screen_off_timeout",mr,"long"),a.screenOffTimeout=!0}catch(d){e.warn(`[KeepScreenAwake] Failed to set screen_off_timeout on ${this.device.deviceId}: ${d}`)}return{applied:a.stayOnWhilePluggedIn||a.screenOffTimeout,originalStayOnWhilePluggedIn:s,originalScreenOffTimeout:n,appliedSettings:a}}async readSvcStayonState(){let s=await this.readSetting("global","stay_on_while_plugged_in");return{value:s,enabled:this.parseStayOnWhilePluggedIn(s)}}parseStayOnWhilePluggedIn(s){if(s===void 0)return;if(s===null)return!1;let n=s.trim().toLowerCase();if(n==="true")return!0;if(n==="false")return!1;let a=Number.parseInt(n,10);if(Number.isNaN(a))return;return a!==0}async readSetting(s,n){try{let d=await this.settingsClientProvider(this.device).requestSettingsGet(s,n);if(d.success){let c=d.found?d.value??null:null;if(c===null)return null;let h=c.trim();return!h||h==="null"?null:h}}catch(a){e.debug(`[KeepScreenAwake] a11y settings get failed for ${s}/${n}: ${a}`)}try{let d=(await this.adb.executeCommand(`shell settings get ${s} ${n}`,{noRetry:!0})).stdout.trim();if(!d||d==="null")return null;return d}catch(a){e.warn(`[KeepScreenAwake] Failed to read ${s} ${n} on ${this.device.deviceId}: ${a}`);return}}async putSetting(s,n,a,d="string"){try{if((await this.settingsClientProvider(this.device).requestSettingsPut(s,n,a,{valueType:d})).success)return}catch(c){e.debug(`[KeepScreenAwake] a11y settings put failed for ${s}/${n}: ${c}`)}await this.adb.executeCommand(`shell settings put ${s} ${n} ${a}`)}async deleteSetting(s,n){try{if((await this.settingsClientProvider(this.device).requestSettingsPut(s,n,null)).success)return}catch(a){e.debug(`[KeepScreenAwake] a11y settings delete failed for ${s}/${n}: ${a}`)}await this.adb.executeCommand(`shell settings delete ${s} ${n}`)}async restoreSetting(s,n,a,d="int"){let c=n==="stay_on_while_plugged_in"?Rr:fr;try{if(a===null)await this.deleteSetting(s,n);else await this.putSetting(s,n,a??c,d);return a===void 0?{status:"restored_to_baseline",settings:[{setting:n,value:c}]}:{status:"restored"}}catch(h){return e.warn(`[KeepScreenAwake] Failed to restore ${s} ${n} on ${this.device.deviceId}: ${h}`),{status:"failed",failures:[{setting:n,error:r(h)}]}}}}function Ii(s){return new HN(s,v,(n)=>E.getInstance(n))}function _i(s){return{restore:async(n)=>{let a=await new za(s).setBiometricEnrollmentState(n);if(!a.supported||a.error||a.verified===!1)throw Error(a.error??"Failed to restore iOS Simulator biometric enrollment")}}}function xi(s){return{restore:async(n)=>{let a=await new za(s).setState({networkCondition:{profile:n}});if(!a.success)throw Error(a.networkCondition?.error??a.error??"Failed to restore network condition")}}}function Mi(s){return(n)=>({restore:async(a,d)=>{let c=new xp(v.create(n),d),h=await c.ensureRoot();if(!h.success)throw Error(h.error);a.rootedByUs||=h.rootedByUs;let p=await YD(n,c,a,{hostClock:s,mutationSignal:d,invalidate:(S)=>{if(!d?.aborted)Vs(S,"Device clock restored")}});if(!p.verified)throw Error(p.error??"Clock restoration did not verify")}})}function Li(s){return(n)=>({restore:(a,d)=>new Zf(n,{adb:null,timer:s}).restoreRotationSettings(a,d)})}function Ni(s){return{restore:(n,a)=>oi(s,n,a)}}class _s extends Error{report;constructor(s,n){super(s);this.report=n;this.name="KeepAwakeRestoreError"}}class be{policy;onRetire;targets=new Map;generations=new Map;constructor(s,n=()=>{}){this.policy=s;this.onRetire=n}generation(s){return this.generations.get(s)??0}join(s,n,a,d){let c=this.targets.get(s),h=c?.get(n);if(h)return h.result;if(!c)c=new Map,this.targets.set(s,c);let p=Promise.withResolvers(),S={state:n,removed:!1,controller:new AbortController,result:p.promise,clear:a};return c.set(n,S),d(S).then(p.resolve,p.reject),S.result}retire(s){this.onRetire(s);let n=this.targets.get(s);this.generations.set(s,this.generation(s)+1);for(let a of n?.values()??[])a.removed=!0,a.controller.abort(),a.clear();this.targets.delete(s)}}var xs=2,Fi=5;function Bi(s){if(s instanceof ye)return!0;let n=typeof s==="object"&&s!==null&&"details"in s?s.details:void 0;return typeof n==="object"&&n!==null&&"retryable"in n&&n.retryable===!1}var gr={kind:"rotation",retiredOnIncarnationBump:!1,setupHandoff:"track-eagerly",removedDuringSetupMessage:"Cannot change rotation: device was removed during session setup."},vr={kind:"clock",retiredOnIncarnationBump:!0,setupHandoff:"await-then-track",removedDuringSetupMessage:"Cannot change the clock: device was removed during session setup."},wr={kind:"screen-reader",retiredOnIncarnationBump:!1,setupHandoff:"track-eagerly",removedDuringSetupMessage:"Cannot change the screen reader: device was removed during session setup."};class Ms{host;screenReaderRestores=new be(wr,(s)=>{this.abandonedScreenReaders.delete(s)});abandonedScreenReaders=new Map;abandonedScreenReaderRetries=new Map;screenReaderMutationQueues=new Map;screenReaderRestorer;screenReaderRestoreBackoff;clockMutationQueues=new Map;clockRestores=new be(vr,(s)=>{let n=this.host.healthIncarnation(s);if(n!==void 0)this.host.clearHealthMarker(s,n,"clock");this.clockRegistry.retire(s)});clockRestorer;clockRegistry;rotationMutationQueues=new Map;abandonedRotations=new Map;abandonedRotationRetries=new Map;rotationRestores=new be(gr,(s)=>{this.abandonedRotations.delete(s)});rotationRestoreBackoff;rotationRestorer;screenReaderKind={queue:this.screenReaderRestores,name:"Screen reader",timeoutMs:fe,mapStartError:(s)=>u(s,"Screen reader restoration failed"),prepare:(s,n)=>this.prepareScreenReaderRestore(s,n)};screenReaderRetry={attempts:xs,delayForAttempt:(s)=>this.screenReaderRestoreBackoff.delayForAttempt(s),isNonRetryable:()=>!1,logFirstFailure:(s,n)=>e.warn(`Failed to restore screen reader on ${s}`,n),logRetryFailure:(s,n,a)=>e.warn(`Screen reader restore retry ${n}/${xs} failed on ${s}`,a),abandon:(s,n)=>this.abandonScreenReaderRestore(s,n)};abandonedScreenReaderRestore={memory:this.abandonedScreenReaders,inFlight:this.abandonedScreenReaderRetries,timeoutMs:fe,label:"Screen reader restoration",restore:(s,n,a)=>this.screenReaderRestorer({name:s,deviceId:s,platform:n.platform}).restore(n,a),restored:(s,n)=>{this.forgetAbandonedRestore(this.abandonedScreenReaders,s,n),e.info(`Restored the screen reader on ${s} on its next natural attempt`)},failed:(s,n,a)=>e.warn(`Screen reader on ${s} is still not restored to ${n.previousEnabled?"enabled":"disabled"}`,a)};rotationKind={queue:this.rotationRestores,name:"Rotation",timeoutMs:Jl,mapStartError:(s)=>u(s,"Rotation restoration failed"),prepare:(s,n)=>this.prepareRotationRestore(s,n)};rotationRetry={attempts:Fi,delayForAttempt:(s)=>this.rotationRestoreBackoff.delayForAttempt(s),isNonRetryable:Bi,logFirstFailure:(s,n)=>e.warn(`Failed to restore rotation on ${s}: ${r(n)}`),logRetryFailure:(s,n,a)=>e.warn(`Rotation restore retry ${n}/${Fi} failed on ${s}; device remains quarantined: ${r(a)}`),abandon:(s,n,a,d)=>this.abandonRotationRestore(s,n,a,d)};abandonedRotationRestore={memory:this.abandonedRotations,inFlight:this.abandonedRotationRetries,timeoutMs:Jl,label:"Abandoned rotation restoration",restore:(s,n,a)=>this.rotationRestorer({name:s,deviceId:s,platform:"android"}).restore(n,a),restored:(s,n)=>{this.forgetAbandonedRestore(this.abandonedRotations,s,n),e.info(`Restored rotation settings on ${s} on its next natural attempt`)},failed:(s,n,a)=>{if(Bi(a)){this.forgetAbandonedRestore(this.abandonedRotations,s,n),e.warn(`Rotation settings on ${s} cannot be restored (window manager owns rotation); dropping the abandoned restore: ${r(a)}`);return}e.warn(`Rotation settings on ${s} are still not restored; will try again at the next session start or release: ${r(a)}`)}};clockKind={queue:this.clockRestores,name:"Clock",timeoutMs:sq,mapStartError:(s)=>s,prepare:(s,n)=>this.prepareClockRestore(s,n)};constructor(s,n){this.host=s;this.screenReaderRestorer=n.screenReader,this.screenReaderRestoreBackoff=n.screenReaderBackoff,this.rotationRestorer=n.rotation,this.rotationRestoreBackoff=n.rotationBackoff,this.clockRestorer=n.clock,this.clockRegistry=n.clockRegistry??uf}runClockMutationExclusive(s,n){return ke(this.clockMutationQueues,s,n)}runRotationMutationExclusive(s,n){return ke(this.rotationMutationQueues,s,n)}runScreenReaderMutationExclusive(s,n){return ke(this.screenReaderMutationQueues,s,n)}forgetFencedRestore(s,n,a){let d=s.get(n);if(d?.get(a.state)!==a)return;if(d.delete(a.state),d.size===0)s.delete(n)}getPendingRestoration(s,n,a,{pendingSetups:d,start:c,again:h}){let p=a.assignedDevice;if(d){let R=s.generation(p);return{pending:d.then(async()=>{if(s.generation(p)!==R){delete a.cacheData[n];return}await(await h(a,null)).pending})}}let S=a.cacheData[n];if(!S)return{pending:null};return s.join(p,S,()=>{if(a.cacheData[n]===S)delete a.cacheData[n]},(R)=>c(p,R))}async startRestoration(s,n,a){let d=s.prepare(n,a),c=d.restore().then(()=>({outcome:"restored"}),(g)=>({outcome:"failed",error:g})),h=Error(`${s.name} restoration timed out`),p=await l(c,{timer:this.host.timer,timeoutMs:s.timeoutMs,label:`${s.name} restoration`,timeoutError:()=>h}).catch((g)=>{if(g===h)return{outcome:"timed-out"};throw s.mapStartError(g)});if(p.outcome==="restored")return{pending:null};if(this.host.hasIdentityReplacementFence(n))return this.forgetFencedRestore(s.queue.targets,n,a),{pending:null};d.quarantined(p.outcome,p.outcome==="failed"?p.error:h);let S=s.name.toLowerCase();return{pending:l(d.retry(c),{timer:this.host.timer,signal:a.controller.signal,label:`Pending ${S} restoration`}).catch((g)=>{if(!a.removed)throw u(g,`${s.name} restoration failed`);e.debug(`Retired ${S} restoration on removed device ${n}`)})}}async retryRestoreBounded(s,n,a,{restoration:d,restore:c}){let h=await d;if(h.outcome==="restored")return;if(s.logFirstFailure(n,h.error),s.isNonRetryable(h.error)){s.abandon(n,a,h.error,"without retrying");return}let p=h.error;for(let S=1;S<=s.attempts;S++){if(await this.host.timer.sleep(s.delayForAttempt(S)),a.removed)return;try{await c();return}catch(R){if(s.isNonRetryable(R)){s.abandon(n,a,R,`after ${S} retries`);return}p=R,s.logRetryFailure(n,S,R)}}s.abandon(n,a,p,`after ${s.attempts} retries`)}forgetAbandonedRestore(s,n,a){if(s.get(n)===a)s.delete(n)}async retryAbandonedAfter(s,n){try{await s}finally{await n()}}retryAbandonedRestore(s,n){let a=s.memory.get(n);if(!a)return Promise.resolve();let d=s.inFlight.get(n);if(d)return d;let c=new AbortController,h=this.host.restoreGeneration(n),p=(async()=>{try{await l(this.host.dispatchDeviceRestore(n,(S)=>s.restore(n,a,AbortSignal.any([S,c.signal])),h),{timer:this.host.timer,timeoutMs:s.timeoutMs,label:s.label}),s.restored(n,a)}catch(S){c.abort(),s.failed(n,a,S)}})().finally(()=>{if(s.inFlight.get(n)===p)s.inFlight.delete(n)});return s.inFlight.set(n,p),p}trackRestoreSetup(s,n,a,{createSetup:d,startRestore:c}){let h=a.assignedDevice,p=s.generation(h),S=()=>!this.host.isPublished(a)&&Boolean(a.cacheData[n]);return this.host.trackSessionSetup(a,async()=>{try{await d(()=>{if(s.generation(h)!==p)throw new t(s.policy.removedDuringSetupMessage)})}finally{if(s.generation(h)!==p)delete a.cacheData[n];else if(S()&&s.policy.setupHandoff==="await-then-track"){let R=await c();if(R.pending)this.host.trackPendingDeviceCleanup(h,[R.pending])}else if(S()){let R=c().then(async({pending:g})=>{await g});this.host.trackPendingDeviceCleanup(h,[R])}}})}async getPendingScreenReaderRestoration(s,n){return this.getPendingRestoration(this.screenReaderRestores,"screenReader",s,{pendingSetups:n,start:(a,d)=>this.startScreenReaderRestoration(a,d),again:(a,d)=>this.getPendingScreenReaderRestoration(a,d)})}startScreenReaderRestoration(s,n){return this.startRestoration(this.screenReaderKind,s,n)}prepareScreenReaderRestore(s,n){let a={name:s,deviceId:s,platform:n.state.platform},d=this.host.restoreGeneration(s),c=()=>this.host.dispatchDeviceRestore(s,async(h,p,S)=>{let R=AbortSignal.any([n.controller.signal,h]);n.controller.signal.throwIfAborted(),p.throwIfAborted(),await this.screenReaderRestorer(a).restore(n.state,R),S(),n.controller.signal.throwIfAborted(),n.clear(),this.forgetFencedRestore(this.screenReaderRestores.targets,s,n)},d,6);return{restore:c,quarantined:(h,p)=>e.warn(`Screen reader restore ${h}; quarantining ${a.deviceId}`,p),retry:(h)=>this.retryRestoreBounded(this.screenReaderRetry,a.deviceId,n,{restoration:h,restore:c})}}abandonScreenReaderRestore(s,n){if(n.removed)return;let{platform:a,previousEnabled:d}=n.state;e.warn(`Gave up restoring the screen reader on ${s} after ${xs} retries; ${a==="ios"?"VoiceOver":"TalkBack"} should be ${d?"enabled":"disabled"} but was not confirmed. Will try once more at the next session start or release on this device.`),this.abandonedScreenReaders.set(s,n.state),n.clear(),this.forgetFencedRestore(this.screenReaderRestores.targets,s,n)}retryAbandonedScreenReaderAfter(s,n){return this.retryAbandonedAfter(n,()=>this.retryAbandonedScreenReaderRestore(s))}retryAbandonedScreenReaderRestore(s){return this.retryAbandonedRestore(this.abandonedScreenReaderRestore,s)}trackScreenReaderSessionSetup(s,n){return this.trackRestoreSetup(this.screenReaderRestores,"screenReader",s,{createSetup:n,startRestore:()=>this.getPendingScreenReaderRestoration(s,null)})}async getPendingRotationRestoration(s,n){return this.getPendingRestoration(this.rotationRestores,"rotation",s,{pendingSetups:n,start:(a,d)=>this.startRotationRestoration(a,d),again:(a,d)=>this.getPendingRotationRestoration(a,d)})}startRotationRestoration(s,n){return this.startRestoration(this.rotationKind,s,n)}prepareRotationRestore(s,n){let a={name:s,deviceId:s,platform:"android"},d=this.host.restoreGeneration(s),c=()=>this.host.dispatchDeviceRestore(s,async(h,p,S)=>{let R=AbortSignal.any([n.controller.signal,h]);n.controller.signal.throwIfAborted(),p.throwIfAborted(),await this.rotationRestorer(a).restore(n.state,R),S(),n.controller.signal.throwIfAborted(),n.clear(),this.forgetFencedRestore(this.rotationRestores.targets,s,n)},d,5);return{restore:c,quarantined:(h,p)=>e.warn(`Rotation restore ${h}; quarantining ${a.deviceId}: ${r(p)}`),retry:(h)=>this.retryRestoreBounded(this.rotationRetry,a.deviceId,n,{restoration:h,restore:c})}}abandonRotationRestore(s,n,a,d){if(n.removed)return;let{userRotation:c,accelerometerRotation:h,deviceStateRotationLock:p}=n.state,S=p===void 0?"":`, device_state_rotation_lock=${p}`;if(e.warn(`Gave up restoring rotation settings on ${s} ${d} (user_rotation=${c??"unchanged"}, accelerometer_rotation=${h??"unchanged"}${S} not confirmed: ${r(a)}); releasing the device from cleanup. A fold or display change during the session can make the recorded settings unverifiable. Will try once more at the next session start or release on this device.`),!this.abandonedRotations.has(s))this.abandonedRotations.set(s,n.state);n.clear(),this.forgetFencedRestore(this.rotationRestores.targets,s,n)}retryAbandonedRotationAfter(s,n){return this.retryAbandonedAfter(n,()=>this.retryAbandonedRotationRestore(s))}retryAbandonedRotationRestore(s){return this.retryAbandonedRestore(this.abandonedRotationRestore,s)}trackRotationSessionSetup(s,n){return this.trackRestoreSetup(this.rotationRestores,"rotation",s,{createSetup:n,startRestore:()=>this.getPendingRotationRestoration(s,null)})}async getPendingClockRestoration(s,n){return this.getPendingRestoration(this.clockRestores,"clock",s,{pendingSetups:n,start:(a,d)=>this.startClockRestoration(a,d),again:(a,d)=>this.getPendingClockRestoration(a,d)})}startClockRestoration(s,n){return this.startRestoration(this.clockKind,s,n)}prepareClockRestore(s,n){let a={deviceId:s,incarnation:this.host.healthIncarnation(s)},d={name:s,deviceId:s,platform:"android"},c=this.clockRegistry.signal(s),h=this.host.restoreGeneration(s),p=()=>this.host.dispatchDeviceRestore(s,(S,R,g)=>this.clockRegistry.runExclusive(s,async()=>{if(n.controller.signal.throwIfAborted(),!this.host.restoreIncarnationIsCurrent(a))return;let w=AbortSignal.any([n.controller.signal,S]);if(R.throwIfAborted(),await this.clockRestorer(d).restore(n.state,w),g(),n.controller.signal.throwIfAborted(),this.clockRegistry.restored(s,n.state),n.clear(),this.forgetFencedRestore(this.clockRestores.targets,s,n),!this.clockRestores.targets.has(s))this.host.clearRestoreHealth(a,"clock")},void 0,c),h,4);return{restore:p,quarantined:(S)=>{if(e.warn(`Clock restore ${S}; quarantining ${d.deviceId}`),a.incarnation===void 0)e.warn(`Failed to restore state on ${s} (clock); no health marker could be keyed because the device has no pool incarnation`);if(a.incarnation!==void 0&&this.host.restoreIncarnationIsCurrent(a)&&!n.removed&&this.clockRestores.targets.get(s)?.has(n.state))this.host.markHealth(s,a.incarnation,"clock")},retry:(S)=>this.retryClockRestore(d.deviceId,n,S,p)}}async retryClockRestore(s,n,a,d){let c=await a;if(c.outcome==="restored")return;e.warn(`Failed to restore clock on ${s}`,c.error);while(!n.removed){if(await this.host.timer.sleep(hA),n.removed)return;try{await d();return}catch(h){e.warn(`Clock restore retry failed on ${s}; device remains quarantined`,h)}}}trackClockSessionSetup(s,n){return this.trackRestoreSetup(this.clockRestores,"clock",s,{createSetup:()=>n(),startRestore:()=>this.getPendingClockRestoration(s,null)})}}function ke(s,n,a){let c=(s.get(n)??Promise.resolve()).catch(()=>{return}).then(a);return s.set(n,c),c.finally(()=>{if(s.get(n)===c)s.delete(n)})}class Ls{timer;restorer;options;entries=new Map;constructor(s,n,a){this.timer=s;this.restorer=n;this.options=a}start(s,n,a){this.stop(s);let d={rule:n,confirmedAtMs:this.timer.now(),isCurrent:a};this.entries.set(s,d),this.schedule(s,d)}stop(s){let n=this.entries.get(s);if(n?.handle!==void 0)this.timer.clearTimeout(n.handle);this.entries.delete(s)}active(s){return this.entries.get(s)?.rule}stopAll(){for(let s of[...this.entries.keys()])this.stop(s)}schedule(s,n){n.handle=this.timer.setTimeout(()=>{this.tick(s,n)},this.options.renewIntervalMs)}live(s,n){return this.entries.get(s)===n&&n.isCurrent()}async tick(s,n){if(!this.live(s,n)){this.stopIfSame(s,n);return}let a;try{a=await this.restorer().renew(n.rule,this.options.leaseMs)}catch(d){e.warn(`[IosAppNetworkLeases] renewing ${n.rule.bundleId} on ${n.rule.udid} failed: ${r(d)}`,d),a="retry"}if(!this.live(s,n)){this.stopIfSame(s,n);return}if(a==="renewed"){n.confirmedAtMs=this.timer.now(),this.schedule(s,n);return}if(a==="retry"&&this.timer.now()-n.confirmedAtMs<this.options.leaseMs){this.schedule(s,n);return}e.warn(`[IosAppNetworkLeases] lease for ${n.rule.bundleId} on ${n.rule.udid} (revision ${n.rule.revision}) ended: ${a==="lost"?"the provider no longer holds it":"no renew was confirmed within the lease"}`),this.stopIfSame(s,n)}stopIfSame(s,n){if(this.entries.get(s)===n)this.stop(s)}}class Ns{host;callbacks;injectedIosAppNetworkRuleRestorer;defaultIosAppNetworkRuleRestorer;networkConditionExpiryTimers=new Map;networkConditionGeneration=new Map;networkConditionMutationQueues=new Map;iosAppNetworkLeases;lastIosOwnerGeneration=0;constructor(s,n,a){this.host=s;this.callbacks=a;this.injectedIosAppNetworkRuleRestorer=n.iosAppNetworkRuleRestorer,this.defaultIosAppNetworkRuleRestorer=n.defaultIosAppNetworkRuleRestorer,this.iosAppNetworkLeases=new Ls(this.host.timer,()=>this.iosAppNetworkRuleRestorer,n.iosLease)}get iosAppNetworkRuleRestorer(){return this.injectedIosAppNetworkRuleRestorer??=this.defaultIosAppNetworkRuleRestorer(),this.injectedIosAppNetworkRuleRestorer}allocateIosOwnerGeneration(){return this.lastIosOwnerGeneration=Math.max(this.lastIosOwnerGeneration+1,Math.floor(this.host.sessionNow())),this.lastIosOwnerGeneration}beginIosAppNetworkRule(s,n,a={}){let c=s.cacheData.networkCondition?.iosAppRule;if(c&&(c.udid!==n.udid||c.bundleId!==n.bundleId))throw new t(`Session ${s.sessionId} already holds an offline rule for ${c.bundleId}; reset it with networkCondition { profile: "none", appId: "${c.bundleId}" } first.`);let h=c??{udid:n.udid,bundleId:n.bundleId,ownerGeneration:this.allocateIosOwnerGeneration(),lastRevision:0};if(!c)s.cacheData.networkCondition={initialProfile:"none",iosAppRule:h};if(a.watch)h.watch=!0;else delete h.watch;return this.iosRuleContext(s,h,++h.lastRevision)}async releaseIosAppWatchFor(s,n){let a=s.cacheData.networkCondition?.iosAppRule;if(!a?.watch||a.udid===n.udid&&a.bundleId===n.bundleId)return;let d=this.prepareIosAppNetworkReset(s,a);try{await this.iosAppNetworkRuleRestorer.reset(d.rule)}catch(c){throw u(c,`Failed to release the launch watch for ${a.bundleId} before applying a rule for ${n.bundleId}`)}this.finishIosAppNetworkReset(s,d.rule)}prepareIosAppNetworkReset(s,n){let a=s.cacheData.networkCondition?.iosAppRule;if(a&&a.udid===n.udid&&a.bundleId===n.bundleId)return this.iosRuleContext(s,a,++a.lastRevision);let d={udid:n.udid,bundleId:n.bundleId,ownerGeneration:this.allocateIosOwnerGeneration(),lastRevision:1};return this.iosRuleContext(s,d,d.lastRevision)}iosRuleContext(s,n,a){return{rule:{udid:n.udid,bundleId:n.bundleId,owner:s.sessionId,ownerGeneration:n.ownerGeneration,revision:a},nextRevision:()=>++n.lastRevision}}confirmIosAppNetworkRule(s,n){let a=s.cacheData.networkCondition?.iosAppRule;if(!this.host.isPublished(s)||!a||a.ownerGeneration!==n.ownerGeneration)return;a.installedRevision=n.revision,this.iosAppNetworkLeases.start(s.sessionId,n,()=>{let d=s.cacheData.networkCondition?.iosAppRule;return this.host.isAdmittedForAutomation(s)&&d===a&&d.installedRevision===n.revision})}finishIosAppNetworkReset(s,n){if(!this.host.isPublished(s))return;let a=s.cacheData.networkCondition?.iosAppRule;if(!a||a.ownerGeneration!==n.ownerGeneration)return;this.iosAppNetworkLeases.stop(s.sessionId),delete s.cacheData.networkCondition}activeIosAppNetworkLease(s){return this.iosAppNetworkLeases.active(s)}stopIosAppNetworkLease(s){this.iosAppNetworkLeases.stop(s)}startIosAppNetworkLease(s,n,a){this.iosAppNetworkLeases.start(s,n,a)}scheduleNetworkConditionExpiry(s,n,a){let d=s.sessionId;if(this.cancelNetworkConditionExpiry(d),!(n>0))return;if(!this.host.isPublished(s))return;let c=Math.min(n,Ug);if(c<n)e.warn(`networkCondition TTL of ${n}s exceeds the ${Ug}s setTimeout limit for session ${d}; clamping to ${c}s`);let h=a??this.currentNetworkConditionGeneration(d);this.armNetworkConditionExpiryAt(s,this.host.sessionNow()+c*1000,h)}armNetworkConditionExpiryAt(s,n,a){let d=s.sessionId;if(!this.host.isPublished(s))return;let c=Math.max(0,n-this.host.sessionNow()),h=this.host.timer.setTimeout(()=>{this.handleNetworkConditionExpiry(s,a)},c);this.networkConditionExpiryTimers.set(d,{handle:h,session:s,deadlineMs:n,generation:a})}peekNetworkConditionExpiry(s){let n=this.networkConditionExpiryTimers.get(s);return n?{deadlineMs:n.deadlineMs,generation:n.generation}:void 0}rearmNetworkConditionExpiry(s,n){let a=s.sessionId;if(this.currentNetworkConditionGeneration(a)!==n.generation){e.debug(`Skipping network-condition TTL re-arm for session ${a}: generation ${n.generation} has been superseded by a later mutation`);return}if(!this.host.isAdmittedForAutomation(s)){e.debug(`Skipping network-condition TTL re-arm for session ${a}: session is releasing or no longer live`);return}this.armNetworkConditionExpiryAt(s,n.deadlineMs,n.generation)}cancelNetworkConditionExpiry(s){let n=this.networkConditionExpiryTimers.get(s);if(n!==void 0)this.host.timer.clearTimeout(n.handle),this.networkConditionExpiryTimers.delete(s)}handleNetworkConditionExpiry(s,n){let a=s.sessionId,d=this.networkConditionExpiryTimers.get(a);if(d&&d.session===s)this.networkConditionExpiryTimers.delete(a);if(!this.host.isPublished(s))return;this.callbacks.onExpiry(s,()=>this.clearNetworkConditionIfOwned(s,n))}clearNetworkConditionIfOwned(s,n){if(!this.host.isPublished(s))return;if(this.currentNetworkConditionGeneration(s.sessionId)!==n){e.debug(`Network condition TTL expiry for session ${s.sessionId} settled after a newer condition superseded it; leaving that condition's restore binding in place`);return}if(s.cacheData.networkCondition)delete s.cacheData.networkCondition,this.iosAppNetworkLeases.stop(s.sessionId)}bumpNetworkConditionGeneration(s){let n=(this.networkConditionGeneration.get(s)??0)+1;return this.networkConditionGeneration.set(s,n),n}runNetworkConditionMutationExclusive(s,n){return ke(this.networkConditionMutationQueues,s,n)}currentNetworkConditionGeneration(s){return this.networkConditionGeneration.get(s)??0}forgetSession(s){this.networkConditionGeneration.delete(s),this.networkConditionMutationQueues.delete(s)}stopAll(){for(let s of this.networkConditionExpiryTimers.values())this.host.timer.clearTimeout(s.handle);this.networkConditionExpiryTimers.clear(),this.iosAppNetworkLeases.stopAll()}}var Hi=new Map,Pe=new Map;function FI(s,n){Pe.set(s,n)}function aq(s){Pe.delete(s)}nr({name:"android-ime-quarantine",onDeviceIdentityReplaced:aq,onDeviceIncarnationChanged:()=>{}});async function yr(s,n){if(n?.throwIfAborted(),!n)return s.acquire();return new Promise((a,d)=>{let c=()=>d(n.reason);n.addEventListener("abort",c,{once:!0}),s.acquire().then((h)=>{if(n.removeEventListener("abort",c),n.aborted){h();return}a(h)},(h)=>{n.removeEventListener("abort",c),d(h)})})}async function Wd(s,n,a,d={}){let c=Hi.get(s);if(!c)c=new Wn,Hi.set(s,c);let h=await yr(c,a);try{if(Pe.has(s)&&!d.allowQuarantined){let p=Pe.get(s);if(p&&await d.recoverQuarantined?.(p))aq(s)}if(Pe.has(s)&&!d.allowQuarantined)throw Error('IME state is unknown after an unacknowledged cancellation; run "keyboard setIme <imeId>" with an enabled IME, or restart AutoMobile before other IME operations.');return a?.throwIfAborted(),await n()}finally{h()}}class $i{entries=new Map;inFlight=new Set;hasPending(s){return this.entries.has(s)||this.inFlight.has(s)}pendingDeviceIds(){return[...new Set([...this.entries.keys(),...this.inFlight])]}take(s){let n=this.entries.get(s);return this.entries.delete(s),n}store(s,n){this.entries.set(s,n)}discard(s){this.take(s)}async flush(s,n={}){if(!this.hasPending(s))return;await Wd(s,async()=>{if(n.isForced?.()||n.signal?.aborted){this.discard(s);return}let a=this.take(s);if(!a)return;this.inFlight.add(s);try{await a.restore(n.signal)}finally{this.inFlight.delete(s)}},n.signal,{allowQuarantined:!0})}}var sc=new $i;nr({name:"pending-ime-restore",onDeviceIdentityReplaced:(s)=>sc.discard(s),onDeviceIncarnationChanged:()=>{}});class Fs{host;restores;pendingIme;constructor(s,n,a=sc){this.host=s;this.restores=n;this.pendingIme=a}async drainReleaseTeardown(s,n,a,d={}){let c=n.assignedDevice;if(d.deviceIdentityReplaced||Gl(a))this.pendingIme.discard(c);let h=!d.deviceIdentityReplaced&&!Gl(a)&&this.pendingIme.hasPending(c),p=d.deviceIdentityReplaced||this.releaseNeedsTeardown(n);if(!h&&!p)return[];let S=a?.forcedAbort?.signal;return this.runUnderTeardownShield(async(R)=>{if(h)await this.flushPendingIme(c,()=>Gl(a),R);if(!p)return[];let g=await this.startReleaseTeardown(s,n,a,d);return d.deviceIdentityReplaced?g.filter((w)=>w.setup):g},S)}async flushPendingIme(s,n,a){try{await this.pendingIme.flush(s,{signal:a,isForced:n})}catch(d){if(e.warn(`[SendKeys] Session-end IME restoration failed on ${s}`,d),n()||a.aborted)this.pendingIme.discard(s)}}async restorePendingImeForRebind(s,n){let a=await this.runUnderTeardownShield(async(d)=>(await this.flushPendingIme(s,()=>!n(),d),[]));return await Promise.all(a),{pending:null}}hasPendingIme(s){return this.pendingIme.hasPending(s)}async runUnderTeardownShield(s,n){let a=new AbortController;if(n)if(n.aborted)a.abort(n.reason);else n.addEventListener("abort",()=>a.abort(n.reason),{once:!0});let d=this.host.sessionNow(),c=this.host.timer.setTimeout(()=>{a.abort(new t("Session release teardown exceeded its budget"))},Sr);try{let p=(await H(a.signal,()=>s(a.signal))).flatMap((S)=>{let R=this.boundTeardownStage(S,d);return R?[R]:[]});return Promise.allSettled(p).then(()=>this.host.timer.clearTimeout(c)),p}catch(h){throw this.host.timer.clearTimeout(c),h}}releaseNeedsTeardown(s){let{keepScreenAwake:n,biometricEnrollment:a,networkCondition:d,clock:c,rotation:h,screenReader:p}=s.cacheData;return n?.applied===!0||Boolean(a||d||c||h||p)||this.restores.abandonedScreenReaders.has(s.assignedDevice)||this.restores.abandonedRotations.has(s.assignedDevice)||this.host.sessionSetupsOf(s).length>0}boundTeardownStage(s,n){let{pending:a,abandon:d}=s;if(!a||!d)return a;let c=!1,h=a.finally(()=>{c=!0}),p=Error("Session release teardown cap reached"),S=l(h,{timer:this.host.timer,timeoutMs:Math.max(0,Sr-(this.host.sessionNow()-n)),label:"Session release teardown",timeoutError:()=>p,onTimeout:()=>{if(!c)d()}}).catch((R)=>{if(R!==p)throw R});return this.host.noteTeardownBound(S,n+Sr),S}async startReleaseTeardown(s,n,a,d={}){let c=n.assignedDevice,h=this.restores.keepScreenAwakeRestoreTarget(n),p=this.restores.biometricRestoreTarget(n),S=this.restores.networkConditionRestoreTarget(n),R=this.host.sessionSetupsOf(n);if(d.deviceIdentityReplaced)return await this.startReplacedDeviceTeardown(s,R);let g=()=>Gl(a)||d.deviceIdentityReplaced===!0,w=a?.forcedAbort?.signal,y=(k)=>H(w,k),b=null,A=[async()=>{if(b=R.length>0?(await this.host.waitForSessionSetup(s,R)).pending:null,a)a.stuckDeadlineMs=Math.max(a.stuckDeadlineMs,BN(n.cacheData));return{pending:b,setup:!0}},async()=>({pending:(await this.restores.restoreKeepScreenAwakeBestEffort(n,g)).pending,abandon:()=>g()?e.warn(`Gave up restoring keep-awake state on ${c} after a forced release; the screen may stay awake`):this.abandonCappedRestore(h,"keep-screen-awake")}),async()=>({pending:n.cacheData.biometricEnrollment?(await this.restores.getPendingBiometricRestoration(n,b)).pending:null,abandon:()=>this.abandonCappedRestore(p,"biometric-enrollment")}),async()=>({pending:n.cacheData.networkCondition?(await this.restores.getPendingNetworkRestoration(n,b)).pending:null,abandon:()=>this.abandonCappedRestore(S,"network-condition")}),async()=>({pending:n.cacheData.clock?(await y(()=>this.restores.getPendingClockRestoration(n,b))).pending:null}),async()=>{let k=this.restores.abandonedRotations.has(n.assignedDevice),T=n.cacheData.rotation?(await y(()=>this.restores.getPendingRotationRestoration(n,b))).pending:null;return{pending:k&&!g()?y(()=>this.restores.retryAbandonedRotationAfter(n.assignedDevice,T)):T}},async()=>{let k=n.cacheData.screenReader?(await y(()=>this.restores.getPendingScreenReaderRestoration(n,b))).pending:null;return{pending:this.restores.abandonedScreenReaders.has(n.assignedDevice)&&!g()?y(()=>this.restores.retryAbandonedScreenReaderAfter(n.assignedDevice,k)):k}}];return await this.runReleaseTeardownSteps(A,a,g)}async runReleaseTeardownSteps(s,n,a){let d=n?.teardownResumeStep??0,c=n?.teardownStages?.slice(1,d)??[];for(let[h,p]of s.entries()){if(h>0&&h<d)continue;if(n)n.teardownStep=h;let S=await p();if(c.push(S),this.recordReleaseTeardownStage(n,h,S),a())break}return c}recordReleaseTeardownStage(s,n,a){if(s)(s.teardownStages??=[])[n]=a}async startReplacedDeviceTeardown(s,n){let a=n.length>0?(await this.host.waitForSessionSetup(s,n)).pending:null;return a?[{pending:a,setup:!0}]:[]}abandonCappedRestore(s,n){if(!s)return;e.warn(`Session release teardown exceeded ${Sr}ms before the ${n} restore finished on ${s.deviceId}; the device may hold session-modified state`),this.host.abandonRestore(s,n,()=>("state"in s)?this.restores.restoreKeepScreenAwakeTarget(s):("enrollment"in s)?this.restores.restoreBiometricEnrollment(s):this.restores.restoreNetworkCondition(s))}}var Wi=2,br=250,Ui=2,kr=250,qi=2;class Hs{host;queued;teardown;network;screenReaderRestorer;screenReaderRestoreBackoff;rotationRestoreBackoff;screenReaderRestores;abandonedScreenReaders;clockRestores;abandonedRotations;rotationRestores;networkConditionRestorer;biometricEnrollmentRestorer;keepAwakeRestoreReports=new Map;keepScreenAwakeRestorer;constructor(s,n){this.host=s;this.queued=new Ms(s,n),this.screenReaderRestorer=n.screenReader,this.screenReaderRestoreBackoff=n.screenReaderBackoff,this.rotationRestoreBackoff=n.rotationBackoff,this.keepScreenAwakeRestorer=n.keepScreenAwake,this.biometricEnrollmentRestorer=n.biometricEnrollment,this.networkConditionRestorer=n.networkCondition,this.teardown=new Fs(s,this),this.network=new Ns(s,n,{onExpiry:(a,d)=>this.restoreNetworkConditionOnExpiryFor(a,d)}),this.screenReaderRestores=this.queued.screenReaderRestores,this.abandonedScreenReaders=this.queued.abandonedScreenReaders,this.clockRestores=this.queued.clockRestores,this.abandonedRotations=this.queued.abandonedRotations,this.rotationRestores=this.queued.rotationRestores}runClockMutationExclusive(s,n){return this.queued.runClockMutationExclusive(s,n)}runRotationMutationExclusive(s,n){return this.queued.runRotationMutationExclusive(s,n)}runScreenReaderMutationExclusive(s,n){return this.queued.runScreenReaderMutationExclusive(s,n)}forgetFencedRestore(s,n,a){return this.queued.forgetFencedRestore(s,n,a)}getPendingRestoration(s,n,a,{pendingSetups:d,steps:c}){return this.queued.getPendingRestoration(s,n,a,{pendingSetups:d,...c})}startRestoration(s,n,a){return this.queued.startRestoration(s,n,a)}retryRestoreBounded(s,n,a,{restoration:d,restore:c}){return this.queued.retryRestoreBounded(s,n,a,{restoration:d,restore:c})}forgetAbandonedRestore(s,n,a){return this.queued.forgetAbandonedRestore(s,n,a)}retryAbandonedAfter(s,n){return this.queued.retryAbandonedAfter(s,n)}retryAbandonedRestore(s,n){return this.queued.retryAbandonedRestore(s,n)}trackRestoreSetup(s,n,a,{createSetup:d,startRestore:c}){return this.queued.trackRestoreSetup(s,n,a,{createSetup:d,startRestore:c})}getPendingScreenReaderRestoration(s,n){return this.queued.getPendingScreenReaderRestoration(s,n)}retryAbandonedScreenReaderAfter(s,n){return this.queued.retryAbandonedScreenReaderAfter(s,n)}retryAbandonedScreenReaderRestore(s){return this.queued.retryAbandonedScreenReaderRestore(s)}abandonScreenReaderRestore(s,n){this.queued.abandonScreenReaderRestore(s,n)}trackScreenReaderSessionSetup(s,n){return this.queued.trackScreenReaderSessionSetup(s,n)}getPendingRotationRestoration(s,n){return this.queued.getPendingRotationRestoration(s,n)}retryAbandonedRotationAfter(s,n){return this.queued.retryAbandonedRotationAfter(s,n)}retryAbandonedRotationRestore(s){return this.queued.retryAbandonedRotationRestore(s)}abandonRotationRestore(s,n,a,d){this.queued.abandonRotationRestore(s,n,a,d)}trackRotationSessionSetup(s,n){return this.queued.trackRotationSessionSetup(s,n)}getPendingClockRestoration(s,n){return this.queued.getPendingClockRestoration(s,n)}trackClockSessionSetup(s,n){return this.queued.trackClockSessionSetup(s,n)}drainReleaseTeardown(s,n,a,d={}){return this.teardown.drainReleaseTeardown(s,n,a,d)}hasPendingIme(s){return this.teardown.hasPendingIme(s)}restorePendingImeForRebind(s,n){return this.teardown.restorePendingImeForRebind(s,n)}runUnderTeardownShield(s,n){return this.teardown.runUnderTeardownShield(s,n)}abandonCappedRestore(s,n){return this.teardown.abandonCappedRestore(s,n)}get iosAppNetworkRuleRestorer(){return this.network.iosAppNetworkRuleRestorer}beginIosAppNetworkRule(s,n,a){return this.network.beginIosAppNetworkRule(s,n,a)}releaseIosAppWatchFor(s,n){return this.network.releaseIosAppWatchFor(s,n)}prepareIosAppNetworkReset(s,n){return this.network.prepareIosAppNetworkReset(s,n)}confirmIosAppNetworkRule(s,n){return this.network.confirmIosAppNetworkRule(s,n)}finishIosAppNetworkReset(s,n){return this.network.finishIosAppNetworkReset(s,n)}activeIosAppNetworkLease(s){return this.network.activeIosAppNetworkLease(s)}stopIosAppNetworkLease(s){return this.network.stopIosAppNetworkLease(s)}startIosAppNetworkLease(s,n,a){return this.network.startIosAppNetworkLease(s,n,a)}scheduleNetworkConditionExpiry(s,n,a){return this.network.scheduleNetworkConditionExpiry(s,n,a)}peekNetworkConditionExpiry(s){return this.network.peekNetworkConditionExpiry(s)}rearmNetworkConditionExpiry(s,n){return this.network.rearmNetworkConditionExpiry(s,n)}cancelNetworkConditionExpiry(s){return this.network.cancelNetworkConditionExpiry(s)}bumpNetworkConditionGeneration(s){return this.network.bumpNetworkConditionGeneration(s)}runNetworkConditionMutationExclusive(s,n){return this.network.runNetworkConditionMutationExclusive(s,n)}forgetSession(s){return this.network.forgetSession(s)}stopAll(){return this.network.stopAll()}async restoreKeepScreenAwakeBestEffort(s,n=()=>!1){let a=this.keepScreenAwakeRestoreTarget(s);if(!a)return{pending:null};let d=this.restoreKeepScreenAwakeTarget(a).then(()=>({outcome:"restored"}),(p)=>({outcome:"failed",error:p})),c=Error("Keep-awake restore timed out"),h=await l(d,{timer:this.host.timer,timeoutMs:MN,label:"Keep-awake restore",timeoutError:()=>c}).catch((p)=>{if(p===c)return{outcome:"timed-out"};throw p});if(this.host.hasIdentityReplacementFence(a.deviceId))return{pending:null};if(h.outcome==="failed")return e.warn(`Failed to restore keep-awake state for session ${s.sessionId}: ${h.error}`),{pending:this.retryKeepScreenAwakeRestore(a,h.error,n)};if(h.outcome==="timed-out")return e.warn(`Timed out after ${MN}ms restoring keep-awake state for session ${s.sessionId}`),{pending:d.then((p)=>p.outcome==="failed"?this.retryKeepScreenAwakeRestore(a,p.error,n):void 0)};return{pending:null}}keepScreenAwakeRestoreTarget(s){let n=s.cacheData.keepScreenAwake;if(s.platform!=="android"||!n?.applied)return null;return{sessionId:s.sessionId,deviceId:s.assignedDevice,incarnation:this.host.healthIncarnation(s.assignedDevice),restoreGeneration:this.host.restoreGeneration(s.assignedDevice),state:n}}forgetKeepAwakeRestoreReport(s){this.keepAwakeRestoreReports.delete(s)}getKeepAwakeRestoreReport(s){return this.keepAwakeRestoreReports.get(s)}recordKeepAwakeRestoreReport(s,n){if(this.keepAwakeRestoreReports.delete(s),this.keepAwakeRestoreReports.set(s,n),this.keepAwakeRestoreReports.size>64){let a=this.keepAwakeRestoreReports.keys().next().value;if(a!==void 0)this.keepAwakeRestoreReports.delete(a)}}async restoreKeepScreenAwakeTarget(s){if(!this.host.restoreIncarnationIsCurrent(s))return;let n={name:s.deviceId,platform:"android",deviceId:s.deviceId};await this.host.dispatchDeviceRestore(s.deviceId,(a,d,c)=>this.keepScreenAwakeRestorer(n).restore(s.state).then((h)=>{if(c(),h.status==="failed"){let p=new _s(h.failures.map(({setting:S,error:R})=>`${S}: ${R}`).join("; ")+(h.baselineSettings?.length?`; baseline applied: ${h.baselineSettings.map(({setting:S,value:R})=>`${S}=${R}`).join(", ")}`:""),{status:"failed",settings:[...h.failures,...h.baselineSettings??[]]});throw this.recordKeepAwakeRestoreReport(s.sessionId,p.report),p}if(this.keepAwakeRestoreReports.delete(s.sessionId),h.status==="restored_to_baseline")this.recordKeepAwakeRestoreReport(s.sessionId,{status:h.status,settings:[...h.settings]}),e.warn(`Keep-awake baseline applied for session ${s.sessionId}, device ${s.deviceId}: ${h.settings.map(({setting:p,value:S})=>`${p}=${S}`).join(", ")}`)}),s.restoreGeneration,1),this.host.clearRestoreHealth(s,"keep-screen-awake")}async retryKeepScreenAwakeRestore(s,n,a){let d=n;for(let c=1;c<=Wi;c++){if(!await this.host.waitForIdentityReplacement(s.deviceId,s.restoreGeneration??0))return;if(a()){e.warn(`Not retrying the keep-awake restore for session ${s.sessionId} after a forced release: ${d}`);return}if(await this.host.timer.sleep(br),!await this.host.waitForIdentityReplacement(s.deviceId,s.restoreGeneration??0))return;if(a()||!this.host.restoreIncarnationIsCurrent(s))return;try{await this.restoreKeepScreenAwakeTarget(s);return}catch(h){d=h,e.debug(`Retry ${c} restoring keep-awake state for session ${s.sessionId} failed: ${h}`)}}e.warn(`Gave up restoring keep-awake state for session ${s.sessionId} after ${Wi} retries; device ${s.deviceId} may stay awake: ${d}`),this.host.abandonRestore(s,"keep-screen-awake",()=>this.restoreKeepScreenAwakeTarget(s))}biometricRestoreTarget(s){let n=s.cacheData.biometricEnrollment;if(!n)return null;return{sessionId:s.sessionId,deviceId:s.assignedDevice,incarnation:this.host.healthIncarnation(s.assignedDevice),restoreGeneration:this.host.restoreGeneration(s.assignedDevice),enrollment:n.initialEnrollment}}async restoreBiometricEnrollment(s){let n={name:s.deviceId,platform:"ios",deviceId:s.deviceId};if(!this.host.restoreIncarnationIsCurrent(s))return;await this.host.dispatchDeviceRestore(s.deviceId,(a,d,c)=>this.biometricEnrollmentRestorer(n).restore(s.enrollment).then(c),s.restoreGeneration,2),this.host.clearRestoreHealth(s,"biometric-enrollment")}async restoreBiometricEnrollmentBestEffort(s){let n=this.biometricRestoreTarget(s);if(!n)return{pending:null};let a=this.restoreBiometricEnrollment(n).then(()=>({outcome:"restored"}),(h)=>({outcome:"failed",error:h})),d=Error("Biometric restore timed out"),c=await l(a,{timer:this.host.timer,timeoutMs:NN,label:"Biometric restore",timeoutError:()=>d}).catch((h)=>{if(h===d)return{outcome:"timed-out"};throw h});if(this.host.hasIdentityReplacementFence(n.deviceId))return{pending:null};if(c.outcome==="failed")return e.warn(`Failed to restore biometric enrollment for session ${s.sessionId}: ${c.error}`),{pending:this.retryBiometricEnrollmentRestore(n,c.error)};if(c.outcome==="timed-out")return e.warn(`Timed out after ${NN}ms restoring biometric enrollment for session ${s.sessionId}`),{pending:this.settleBiometricEnrollmentRestore(n,a)};return{pending:null}}async settleBiometricEnrollmentRestore(s,n){let a=await n;if(a.outcome==="restored")return;e.warn(`Failed to restore biometric enrollment for session ${s.sessionId}: ${a.error}`),await this.retryBiometricEnrollmentRestore(s,a.error)}async retryBiometricEnrollmentRestore(s,n){let a=n;for(let d=1;d<=Ui;d++){if(await this.host.timer.sleep(kr),!this.host.restoreIncarnationIsCurrent(s))return;try{await this.restoreBiometricEnrollment(s),e.info(`Restored biometric enrollment for session ${s.sessionId} on retry ${d}`);return}catch(c){a=c,e.debug(`Retry ${d} restoring biometric enrollment for session ${s.sessionId} failed: ${c}`)}}e.warn(`Gave up restoring biometric enrollment for session ${s.sessionId} after ${Ui} retries; device ${s.deviceId} may hold session-modified enrollment: ${a}`),this.host.abandonRestore(s,"biometric-enrollment",()=>this.restoreBiometricEnrollment(s))}restoreBiometricEnrollmentAfterSetups(s,n){return n.then(async()=>{await(await this.restoreBiometricEnrollmentBestEffort(s)).pending})}async getPendingBiometricRestoration(s,n){if(n&&s.cacheData.biometricEnrollment)return{pending:this.restoreBiometricEnrollmentAfterSetups(s,n)};return{pending:(await this.restoreBiometricEnrollmentBestEffort(s)).pending}}restoreNetworkConditionAfterSetups(s,n){return n.then(async()=>{await(await this.restoreNetworkConditionBestEffort(s)).pending})}async getPendingNetworkRestoration(s,n){if(n&&s.cacheData.networkCondition)return{pending:this.restoreNetworkConditionAfterSetups(s,n)};return{pending:(await this.restoreNetworkConditionBestEffort(s)).pending}}networkConditionRestoreTarget(s){let n=s.cacheData.networkCondition;if(!n)return null;let a=n.iosAppRule;return{sessionId:s.sessionId,deviceId:s.assignedDevice,incarnation:this.host.healthIncarnation(s.assignedDevice),restoreGeneration:this.host.restoreGeneration(s.assignedDevice),profile:n.initialProfile,...a?{iosAppRule:{udid:a.udid,bundleId:a.bundleId,owner:s.sessionId,ownerGeneration:a.ownerGeneration,revision:++a.lastRevision}}:{}}}async restoreNetworkCondition(s){if(s.iosAppRule){if(!this.host.restoreIncarnationIsCurrent(s))return;await this.iosAppNetworkRuleRestorer.reset(s.iosAppRule),this.host.clearRestoreHealth(s,"network-condition");return}let n={name:s.deviceId,platform:"android",deviceId:s.deviceId};if(!this.host.restoreIncarnationIsCurrent(s))return;await this.host.dispatchDeviceRestore(s.deviceId,(a,d,c)=>this.networkConditionRestorer(n).restore(s.profile).then(c),s.restoreGeneration,3),this.host.clearRestoreHealth(s,"network-condition")}async restoreNetworkConditionBestEffort(s){let n=this.networkConditionRestoreTarget(s);if(!n)return{pending:null};let a=this.restoreNetworkCondition(n).then(()=>({outcome:"restored"}),(h)=>({outcome:"failed",error:h})),d=Error("Network condition restore timed out"),c=await l(a,{timer:this.host.timer,timeoutMs:Jl,label:"Network condition restore",timeoutError:()=>d}).catch((h)=>{if(h===d)return{outcome:"timed-out"};throw h});if(this.host.hasIdentityReplacementFence(n.deviceId))return{pending:null};if(c.outcome==="failed")return e.warn(`Failed to restore network condition for session ${s.sessionId}; device ${n.deviceId} may hold session-modified shaping: ${c.error}`),{pending:this.retryNetworkConditionRestore(n,c.error)};if(c.outcome==="timed-out")return e.warn(`Timed out after ${Jl}ms restoring network condition for session ${s.sessionId}`),{pending:this.settleNetworkConditionRestore(n,a)};return{pending:null}}async settleNetworkConditionRestore(s,n){let a=await n;if(a.outcome==="restored")return;e.warn(`Failed to restore network condition for session ${s.sessionId}: ${a.error}`),await this.retryNetworkConditionRestore(s,a.error)}async retryNetworkConditionRestore(s,n){await this.retryNetworkConditionRestoreUntilSuccess(s,n)}async retryNetworkConditionRestoreUntilSuccess(s,n){let a=n;for(let d=1;d<=qi;d++){if(await this.host.timer.sleep(hA),!this.host.restoreIncarnationIsCurrent(s))return!1;try{return await this.restoreNetworkCondition(s),e.info(`Restored network condition for session ${s.sessionId} on retry ${d}`),!0}catch(c){a=c,e.debug(`Retry ${d} restoring network condition for session ${s.sessionId} failed: ${c}`)}}return e.warn(`Gave up restoring network condition for session ${s.sessionId} after ${qi} retries; device ${s.deviceId} may hold session-modified shaping: ${a}`),this.host.abandonRestore(s,"network-condition",()=>this.restoreNetworkCondition(s)),!1}restoreNetworkConditionOnExpiryFor(s,n){let a=s.sessionId,d=this.networkConditionRestoreTarget(s);if(!d)return;e.info(`Network condition TTL elapsed for session ${a}; resetting device ${d.deviceId} to none`),this.host.registerPendingDeviceCleanup(d.deviceId,this.runUnderTeardownShield(async()=>[{pending:this.restoreNetworkConditionOnExpiry(s,d,n),abandon:()=>this.abandonCappedRestore(d,"network-condition")}]).then(async(c)=>{await Promise.all(c)}),Sr)}async restoreNetworkConditionOnExpiry(s,n,a){try{await this.restoreNetworkCondition(n),a();return}catch(d){if(e.warn(`Failed to reset network condition on TTL expiry for session ${s.sessionId}; device ${n.deviceId} may hold session-modified shaping, retrying: ${d}`),await this.retryNetworkConditionRestoreUntilSuccess(n,d))a()}}}function pe(s){return s!==void 0&&s.ownerToken!==void 0&&(s.hold==="live"||s.hold==="suspect")}function Gi(s){let{claimantToken:n,session:a,base:d}=s;if(a.ownerToken===n)return{outcome:"claimed"};if(pe(d)&&d.ownerToken===n)return{outcome:"claimed"};if(a.ownerToken!==void 0&&s.claimAlreadyProcessed)return{outcome:"superseded"};if(pe(a))return{outcome:"conflict",holdOf:"session"};if(pe(d))return{outcome:"conflict",holdOf:"base"};return{outcome:"claimed"}}function Ki(s,n){return!pe(s)&&pe(n)?"base":"session"}function Vi(s){if(s.session.ownerToken!==void 0||s.sessionHasClaimHistory)return!1;return!(pe(s.base)&&s.base.ownerToken!==s.claimantToken)}function Pr(s){s.expiresAt=Math.max(s.expiresAt,s.lastUsedAt+s.sessionTimeoutMs)}function zi(s){s.expiresAt=s.lastUsedAt+s.sessionTimeoutMs}class $s{port;livenessOwnershipClaimMutexes=new WeakMap;constructor(s){this.port=s}restartPreFirstHeartbeatGrace(s){let n=this.port.unlessBaseEnded(this.port.getSession(s));if(!n||n.hasReceivedHeartbeat)return;n.lastHeartbeat=Math.max(n.lastHeartbeat,this.port.sessionNow())}recordHeartbeat(s){let n=this.port.unlessBaseEnded(this.port.getSession(s));if(!n){e.warn(`Cannot record heartbeat for session ${s}: not found`);return}if(!this.port.isAdmittedForAutomation(n))return;let a=this.port.sessionNow(),d=n.lastHeartbeat;if(n.lastHeartbeat=a,e.debug(`Heartbeat accepted for session ${s}; previous heartbeat age=${Math.max(0,a-d)}ms`),n.lastOwnerHeartbeat=a,n.activityGeneration++,n.hasReceivedHeartbeat=!0,n.ownership==="awaiting-owner")n.ownership="owned",n.awaitingOwnerSince=void 0;if(!this.port.hasUnissuedActivity(n))return;this.port.getBarrier().track(()=>this.port.recordSessionActivity(n)).catch((c)=>{e.warn(`[SessionManager] Failed to record heartbeat activity for ${s}: ${r(c)}`,c)})}async claimLivenessOwnership(s,n){let a=this.port.unlessBaseEnded(this.port.getSession(s));if(!a)return e.warn(`Cannot claim liveness ownership for session ${s}: not found`),"not-found";return await this.livenessOwnershipClaimMutexFor(a).runExclusive(async()=>{if(this.port.unlessBaseEnded(this.port.getSession(s))!==a)return"not-found";let c=a.livenessOwnershipClaims??new Set;a.livenessOwnershipClaims=c;let h=this.livenessBaseSession(a),p=Gi({claimantToken:n,session:this.port.livenessOwnerView(a),claimAlreadyProcessed:c.has(n),base:h?this.port.livenessOwnerView(h):void 0});if(p.outcome==="superseded")return"superseded";if(p.outcome==="conflict"){let S=p.holdOf==="base"?`its base session ${h?.sessionId}`:"it";return e.warn(`Rejected liveness ownership claim for session ${s}: another owner holds a live lease on ${S}`),"conflict"}if(a.livenessOwnerToken===n&&c.has(n))return"claimed";return await this.takeLivenessOwnership(a,n,c)})}livenessBaseSession(s){let n=this.port.ownershipSessionUuid(s.sessionId);return n===s.sessionId?void 0:this.port.peekSession(n)??void 0}async releaseLivenessOwnership(s,n){let a=this.port.unlessBaseEnded(this.port.getSession(s));if(!a||!this.port.isAdmittedForAutomation(a))return"not-found";return await this.livenessOwnershipClaimMutexFor(a).runExclusive(async()=>{if(this.port.unlessBaseEnded(this.port.getSession(s))!==a||!this.port.isAdmittedForAutomation(a))return"not-found";if(a.livenessOwnerToken===void 0)return"already-unowned";if(a.livenessOwnerToken!==n)return"not-owner";a.livenessOwnershipClaims??=new Set,a.livenessOwnershipClaims.add(n);let d=a.livenessOwnerBoundAt;a.livenessOwnerToken=void 0,a.livenessOwnerBoundAt=void 0,a.activityGeneration++;try{await this.port.recordLivenessOwnership(s,null)}catch(c){if(a.livenessOwnerToken=n,a.livenessOwnerBoundAt=d,!this.port.isAdmittedForAutomation(a))return"not-found";throw c}return"released"})}livenessOwnershipClaimMutexFor(s){let n=this.livenessOwnershipClaimMutexes.get(s);if(n)return n;let a=new Wn;return this.livenessOwnershipClaimMutexes.set(s,a),a}async takeLivenessOwnership(s,n,a){let{livenessOwnerToken:d,lastOwnerHeartbeat:c,livenessOwnerBoundAt:h}=s,p=a.has(n);a.add(n),s.livenessOwnerToken=n,s.livenessOwnerBoundAt=void 0,s.lastOwnerHeartbeat=this.port.sessionNow();try{await this.persistNewLivenessOwnershipClaim(s,n,{previousOwnerToken:d,previousOwnerHeartbeat:c,previousOwnerBoundAt:h},a)}catch(S){if(p)a.add(n);if(!this.port.isAdmittedForAutomation(s))return e.info(`Liveness ownership claim for session ${s.sessionId} lost to its release: `+r(S)),"not-found";throw S}return"claimed"}async persistNewLivenessOwnershipClaim(s,n,a,d){let c=this.markAcceptedClaimantHeartbeating(s);try{await this.port.recordLivenessOwnership(s.sessionId,n)}catch(h){throw d.delete(n),s.livenessOwnerToken=a.previousOwnerToken,s.lastOwnerHeartbeat=a.previousOwnerHeartbeat,s.livenessOwnerBoundAt=a.previousOwnerBoundAt,c("undo"),h}c("keep")}markAcceptedClaimantHeartbeating(s){let{hasReceivedHeartbeat:n,ownership:a,activityGeneration:d}=s;if(s.hasReceivedHeartbeat=!0,a==="awaiting-owner")s.ownership="owned";return(c)=>{if(c==="undo"&&s.activityGeneration===d){s.hasReceivedHeartbeat=n,s.ownership=a;return}if(a==="awaiting-owner"&&s.ownership==="owned")s.awaitingOwnerSince=void 0}}hasLivenessOwnership(s,n){return this.port.unlessBaseEnded(this.port.getSession(s))?.livenessOwnerToken===n}claimUnownedLivenessOwnership(s,n){let a=this.port.unlessBaseEnded(this.port.getSession(s));if(!a||!this.adoptUnownedLivenessOwnerToken(a,n))return!1;return a.lastOwnerHeartbeat=this.port.sessionNow(),!0}bindAcquiredLivenessOwnerToken(s,n){let a=this.port.peekSession(s);if(!a||!this.adoptUnownedLivenessOwnerToken(a,n))return!1;return a.livenessOwnerBoundAt=this.port.sessionNow(),!0}adoptUnownedLivenessOwnerToken(s,n){let a=this.livenessBaseSession(s);if(!Vi({claimantToken:n,session:this.port.livenessOwnerView(s),sessionHasClaimHistory:Boolean(s.livenessOwnershipClaims?.size),base:a?this.port.livenessOwnerView(a):void 0}))return!1;return s.livenessOwnerToken=n,s.livenessOwnerBoundAt=void 0,this.persistAdoptedLivenessOwnerToken(s),!0}persistAdoptedLivenessOwnerToken(s){this.port.getBarrier().track(()=>this.livenessOwnershipClaimMutexFor(s).runExclusive(async()=>{if(this.port.peekSession(s.sessionId)!==s||!this.port.isAdmittedForAutomation(s)||!s.livenessOwnerToken)return;await this.port.replaceLivenessOwnership(s.sessionId,s.livenessOwnerToken)})).catch((n)=>{if(n instanceof W){e.debug("[SessionManager] Adopted liveness owner row is no longer active");return}e.warn("[SessionManager] Failed to persist adopted liveness ownership")})}adoptCliLivenessPolicy(s,n){let a=this.port.unlessBaseEnded(this.port.getSession(s));if(!a)return e.warn(`Cannot adopt CLI liveness policy for session ${s}: not found`),!1;if(a.livenessPolicy===Xn)return e.warn(`Refusing the CLI liveness policy for managed-execution session ${s}; it stays on its owner lease`),!1;let d=Tre(n)??Math.min(up(),Uw);if(a.livenessPolicy==="heartbeat")a.preCliLiveness={heartbeatTimeoutMs:a.heartbeatTimeoutMs,heartbeatTimeoutSource:a.heartbeatTimeoutSource,sessionTimeoutMs:a.sessionTimeoutMs};return a.livenessPolicy="cli-idle",a.heartbeatTimeoutMs=d,a.sessionTimeoutMs=Math.max(a.sessionTimeoutMs,d),Pr(a),this.recordHeartbeat(s),e.debug(`Session ${s} adopted the CLI liveness policy (idle timeout ${a.heartbeatTimeoutMs}ms)`),!0}async adoptManagedExecutionLivenessPolicy(s,n={}){let a=rq(n.idleTimeoutMs),d=this.port.getSession(s);if(!d)throw new t(`Cannot hold session ${s} for a managed execution: the session is not active.`);if(d.livenessPolicy==="cli-idle")throw new t(`Cannot hold session ${s} for a managed execution: it is owned by a one-shot CLI.`);let c={livenessPolicy:d.livenessPolicy,sessionTimeoutMs:d.sessionTimeoutMs,expiresAt:d.expiresAt};d.livenessPolicy=Xn,d.sessionTimeoutMs=a,zi(d),d.activityGeneration++;let h=d.activityGeneration;try{await this.port.recordSessionActivity(d)}catch(p){if(d.activityGeneration===h)Object.assign(d,c);throw p}return e.info(`Session ${s} is held for a managed execution (idle window ${a}ms)`),d}restoreHeartbeatLivenessPolicy(s){let n=this.port.unlessBaseEnded(this.port.getSession(s));if(!n||n.livenessPolicy!=="cli-idle")return!1;let a=n.preCliLiveness??{heartbeatTimeoutMs:this.port.defaultHeartbeatTimeoutMs(),heartbeatTimeoutSource:"default",sessionTimeoutMs:n.sessionTimeoutMs};return n.livenessPolicy="heartbeat",n.heartbeatTimeoutMs=a.heartbeatTimeoutMs,n.heartbeatTimeoutSource=a.heartbeatTimeoutSource,n.sessionTimeoutMs=a.sessionTimeoutMs,delete n.preCliLiveness,zi(n),this.recordHeartbeat(s),e.debug(`Session ${s} restored the heartbeat liveness policy (timeout ${n.heartbeatTimeoutMs}ms)`),!0}}function Ae(s){return s!==void 0&&s()===!1}function j(s){return Boolean(s.release_reason&&yo(s.release_reason)&&s.released_at_ms!==null)}function q(s,n=!1){if(!j(s))return;let a=s.released_at_ms+nm;return n||Vd(s.liveness_policy)?a:Math.min(s.expires_at_ms,a)}function Be(s,n){let a=q(s,!0);return a!==void 0&&n>=a}function ji(s){if(!(s instanceof Error)||s.name!=="SessionRecoveryIdentityLossError")return!1;let n=s;return typeof n.sessionUuid==="string"&&typeof n.terminalReleaseReason==="string"&&Ar(n.reason)&&n.terminalReleaseReason===`identity-recovery-${n.reason}`&&Tr(n.target)}function He(s){return(s.stable_device_id??(s.platform==="ios"||s.platform==="android"&&!ce(s.device_id)&&!Ko(s.device_id)?s.device_id:void 0))||void 0}function Ws(s){return s==="custom"?"custom":"default"}function Us(s){if(s==="cli-idle"||s===Xn)return s;return"heartbeat"}function Ji(s){if(typeof s.pre_cli_heartbeat_timeout_ms!=="number"||typeof s.pre_cli_session_timeout_ms!=="number")return;return{heartbeatTimeoutMs:s.pre_cli_heartbeat_timeout_ms,heartbeatTimeoutSource:Ws(s.pre_cli_heartbeat_timeout_source),sessionTimeoutMs:s.pre_cli_session_timeout_ms}}var Qi=600000,Yi=1800000;function qs(s){return{lastUsedAtMs:s.lastUsedAt,expiresAtMs:s.expiresAt,sessionTimeoutMs:s.sessionTimeoutMs,heartbeatTimeoutMs:s.heartbeatTimeoutMs,hasReceivedHeartbeat:s.hasReceivedHeartbeat,heartbeatTimeoutSource:s.heartbeatTimeoutSource,livenessPolicy:s.livenessPolicy,preCliHeartbeatTimeoutMs:s.preCliLiveness?.heartbeatTimeoutMs,preCliHeartbeatTimeoutSource:s.preCliLiveness?.heartbeatTimeoutSource,preCliSessionTimeoutMs:s.preCliLiveness?.sessionTimeoutMs}}function Ks(s){return JSON.stringify(s)}function Xi(s){return rr(s)}function Ar(s){return s==="target-absent"||s==="target-busy"||s==="identity-continuity-lost"||s==="owned-by-other-daemon"}function Tr(s){if(!s||typeof s!=="object")return!1;let n=s;if(n.platform!=="android"&&n.platform!=="ios")return!1;return typeof n.stableDeviceId==="string"&&typeof n.deviceId==="string"}function Zi(s,n){if(s)s.stage=n}function en(s){return{...s,initialOwnership:s.initialOwnership??"owned"}}function sn(s,n,a,d){if(a)return{sessionTimeoutMs:a.sessionTimeoutMs,heartbeatTimeoutMs:a.heartbeatTimeoutMs,heartbeatTimeoutSource:a.heartbeatTimeoutSource,hasReceivedHeartbeat:a.hasReceivedHeartbeat,livenessPolicy:a.livenessPolicy,preCliLiveness:a.preCliLiveness};return{sessionTimeoutMs:s??d,heartbeatTimeoutMs:n??oc(),heartbeatTimeoutSource:n===void 0?"default":"custom",hasReceivedHeartbeat:!1,livenessPolicy:"heartbeat"}}function $e(s){return s.livenessPolicy===Xn?{livenessPolicy:Xn}:{}}function me(s){return s.livenessPolicy==="cli-idle"?s.heartbeatTimeoutMs:void 0}function zs(s){return te(me(s))}function Ue(s,n,a){return a?.releaseReason===n?te(a.cliIdleTimeoutMs):zs(s)}async function qe(s,n,a){if(n.source!==Ta||n.release_reason!=="cli-idle-timeout")return;for(let d=s.lastIndexOf(":");d>0;d=s.lastIndexOf(":",d-1)){let c=await a(s.slice(0,d)),h=c?.release_reason==="cli-idle-timeout"?Se(c):void 0;if(h!==void 0)return h}return}function te(s){return s===void 0?{}:{cliIdleTimeoutMs:s}}function Se(s){return Us(s.liveness_policy)==="cli-idle"?s.heartbeat_timeout_ms:void 0}function tn(s){return te(Se(s))}class js{port;constructor(s){this.port=s}forceStuckRelease(s){let n=this.port.sessionSlots().getReleaseOp(s);if(!n||n.forced||n.commitDeclined||!this.port.sessionSlots().hasActiveRelease(n))return;let{session:a}=n,d=a.assignedDevice;n.forced=!0,n.forcedAbort?.abort(new t(`Release of session ${s} was forced; its teardown is abandoned`));let c=this.forcedReleaseSnapshot(s,a,n.reason.value);if(this.port.removeSession(s,a)){let S={...c,...this.port.managedExecutionReleaseMarker(a)};if(yo(c.releaseReason)){let R=this.port.restartReleasePersistence().get(c)??Promise.withResolvers();this.port.restartReleasePersistence().set(c,R),this.port.restartReleasePersistence().set(S,R)}this.port.notifySessionRelease(S,{deviceIdentityReplaced:n.stage==="awaiting-ownership"||n.options.deviceIdentityReplaced})}this.persistForcedReleaseFence(c);let h=n.promise.then(()=>{return},()=>{return}),p=l(h,{timer:this.port.timer,timeoutMs:Sr,unref:!0,label:"Forced stuck release"}).catch((S)=>{e.debug(`[SessionManager] Forced release of ${s}: ${r(S)}`)});return this.port.registerPendingDeviceCleanup(d,p,Sr),e.warn(`[SessionManager] Forcing the stuck release of session ${s} (stage=${n.stage??"unknown"}, reason=${c.releaseReason}): the session ${c.terminal?"stays fenced":"is released"} and device ${d} returns to the pool after at most ${Sr}ms`),{deviceId:d,stage:n.stage}}forcedReleaseSnapshot(s,n,a){let d=this.port.sessionSlots().getTerminalSnapshot(s);if(d)return d;let c=this.port.sessionNow(),h={sessionId:s,deviceId:n.assignedDevice,releaseReason:a,releasedAtMs:c,terminal:rr(a),...Ue(n,a,this.port.retainedEndedBase(s)),heartbeat:{lastHeartbeatMs:n.lastHeartbeat,hasReceivedHeartbeat:n.hasReceivedHeartbeat,timeoutMs:n.heartbeatTimeoutMs,ageMs:Math.max(0,c-n.lastHeartbeat)}};if(this.port.releaseRowSessions().set(h,new WeakRef(n)),this.port.captureReleaseRowGeneration(h,this.port.persistedRowGenerations().get(n)),h.terminal)this.port.sessionSlots().setTerminalSnapshot(s,h);else this.port.sessionSlots().setForcedNonTerminal(n,h);return h}inFlightReleaseStillOwning(s){let n=this.port.sessionSlots().getReleaseOp(s);return n?.forced&&!this.port.sessionSlots().hasTerminalSnapshot(s)?void 0:n}persistForcedReleaseFence(s){let n=this.port.persistSessionRelease(s).then(()=>{return},(a)=>{if(e.warn(`[SessionManager] Failed to persist the forced release of ${s.sessionId}: `+r(a)),s.terminal&&!(a instanceof F))this.port.scheduleTerminalReleaseRetry(s);else if(!s.terminal&&!(a instanceof F))this.port.trackReleaseDrainWrite(this.port.retryNonTerminalRowAfterRelease(s))});this.port.trackReleaseDrainWrite(n)}liftTerminalFenceIfPresent(s){if(this.port.sessionSlots().hasTerminalSnapshot(s))this.liftTerminalFence(s)}liftTerminalFence(s,n,a=!1,d){if(!a){let c=this.port.sessionSlots().deleteTerminalSnapshot(s);if(d&&!c)return;d?.()}if(!n||this.port.volatileTerminalReleaseIntents().get(s)===n.releaseReason)this.port.volatileTerminalReleaseIntents().delete(s);if(this.port.terminalReleaseJournal().resolve(s,n?.releaseReason),n&&"sessionId"in n)this.port.rowWriter().cancel(s,n);else if(!a)this.port.rowWriter().liftTerminal(s)}}class Js{port;constructor(s){this.port=s}attachTerminalReleaseJournal(s){this.port.setJournal(s);for(let n of s.loadUnconfirmed())this.port.sessionSlots().setRecoveredTerminalIntent(n.sessionId,{...n,at:this.port.wallToSessionClock(n.at)})}async applyRecoveredTerminalReleaseIntents(s){let n=[];for(let a of Array.from(this.port.sessionSlots().recoveredTerminalIntents.values())){if(s!==void 0&&this.port.sessionNow()>=s)break;try{let d=await this.port.deviceSessionRepository().getSession(a.sessionId);if(d&&!(d.release_reason&&rr(d.release_reason))&&this.adoptedTerminalReleaseApplies(d))await l(this.port.deviceSessionRepository().markReleased(a.sessionId,Hy(a.reason),a.at,{reason:a.reason,...this.adoptedTerminalReleaseFence(a.sessionId)}),{timer:this.port.timer,timeoutMs:Cs,unref:!0,label:"Recovered terminal session release",timeoutError:()=>new F(a.sessionId,a.reason,Cs)}),n.push(a.sessionId)}catch(d){e.warn(`[SessionManager] Failed to apply the unconfirmed terminal release of session ${a.sessionId} (${a.reason}); it stays fenced: ${r(d)}`,d);continue}this.port.sessionSlots().deleteRecoveredTerminalIntent(a.sessionId),this.port.checkSlotShadow(a.sessionId,"recovered-terminal-intent-deleted"),this.port.sessionSlots().deleteAdoptedTerminalOwner(a.sessionId),this.port.liftTerminalFence(a.sessionId,{releaseReason:a.reason},!0)}if(n.length>0)e.warn(`[SessionManager] Terminalized ${n.length} session(s) whose terminal release a previous daemon never persisted: ${n.join(", ")}`);return n}withRecoveredTerminalRelease(s){let n=this.port.sessionSlots().getRecoveredTerminalIntent(s.session_uuid);if(!n||s.release_reason!==null&&rr(s.release_reason)||!this.adoptedTerminalReleaseApplies(s))return s;return{...s,status:Hy(n.reason),released_at_ms:n.at,release_reason:n.reason}}adoptedTerminalReleaseApplies(s){let n=this.port.sessionSlots().getAdoptedTerminalOwner(s.session_uuid);return n===void 0||(s.daemon_session_id??null)===n}adoptedTerminalReleaseFence(s){let n=this.port.sessionSlots().getAdoptedTerminalOwner(s);return n===void 0?{}:{onlyIfOwnedByDaemon:n}}async adoptDeadOwnerTerminalReleases(s){let n=this.confirmedDeadOwner(s);if(n===void 0)return!1;let a=!this.port.sessionSlots().hasAdoptedDeadJournal(n);if(a&&!this.fenceDeadDaemonIntents(n))return!1;let d=this.hasUnsettledAdoptedIntent(n);if(!a&&!d)return!1;if(d)await this.applyRecoveredTerminalReleaseIntents();if(!this.hasUnsettledAdoptedIntent(n))this.port.terminalReleaseJournal().discardDeadDaemon?.(n);return!0}fenceDeadDaemonIntents(s){let n=this.port.terminalReleaseJournal().readDeadDaemon?.(s);if(n===void 0)return!1;this.port.sessionSlots().addAdoptedDeadJournal(s);for(let a of n)this.port.sessionSlots().setRecoveredTerminalIntent(a.sessionId,{...a,at:this.port.wallToSessionClock(a.at)}),this.port.sessionSlots().setAdoptedTerminalOwner(a.sessionId,s);if(n.length>0)e.warn(`[SessionManager] Adopted ${n.length} unconfirmed terminal release(s) of dead daemon ${s}: ${n.map((a)=>a.sessionId).join(", ")}`);return!0}hasUnsettledAdoptedIntent(s){for(let n of this.port.sessionSlots().adoptedTerminalOwners.values())if(n===s)return!0;return!1}confirmedDeadOwner(s){let n=s.daemon_session_id??null;if(n===null||this.port.daemonSessionId()===void 0||n===this.port.daemonSessionId())return;if(!this.port.terminalReleaseJournal().readDeadDaemon||s.release_reason!==null&&rr(s.release_reason))return;return this.isConfirmedDeadDaemonSession(n)?n:void 0}isConfirmedDeadDaemonSession(s){let n=this.port.liveDaemonSessionIds();if(!n)return!1;try{return!n().has(s)}catch(a){return e.warn(`[SessionManager] Cannot list live daemons to check journal owner ${s}; its journal is not adopted yet: ${r(a)}`,a),!1}}}function Cr(s,n){return nn??=Q({initialDelayMs:hA,maxDelayMs:2000}),{networkCondition:n.networkCondition??xi,clock:n.clock??Mi(s),rotation:n.rotation??Li(s),rotationBackoff:n.rotationBackoff??nn,screenReader:n.screenReader??Ni,screenReaderBackoff:n.screenReaderBackoff??Dr,iosAppNetworkRule:n.iosAppNetworkRule}}function Or(){let s=new HR(new UR);return{reset:async(n)=>{let a=await s.reset(n);if(a.kind==="reset"||a.kind==="refused"&&a.outcome==="owned_by_another_session")return;throw Error(`Failed to remove the offline rule for ${n.bundleId} on ${n.udid}: ${a.detail}`)},renew:(n,a)=>s.renew(n,a)}}class Qs{host;seams;constructor(s,n){this.host=s;this.seams=n}createDeviceCleanupQuarantine(s){return new vs({timer:s,now:()=>this.host.sessionNow(),hasOwner:(n)=>this.host.getSessionForDevice(n)!==null,teardownCapMs:Sr,defaultRetryAfterMs:sd})}createStateRestore(s,n){let a=n.restorers??{},d=n.keepScreenAwakeRestorer??Ii,c=n.biometricEnrollmentRestorer??_i,h=Cr(s,a);return new Hs({timer:s,dispatchDeviceRestore:(p,S,R,g)=>this.host.dispatchDeviceRestore(p,S,R,g),restoreGeneration:(p)=>this.host.replacedRestoreGenerations.get(p)??0,hasIdentityReplacementFence:(p)=>this.host.identityReplacementFences.has(p),trackSessionSetup:(p,S)=>this.seams.trackSessionSetup(p,S),isPublished:(p)=>this.host.sessions.get(p.sessionId)===p,healthIncarnation:(p)=>this.host.deviceHealth?.incarnation(p),restoreIncarnationIsCurrent:(p)=>this.host.restoreIncarnationIsCurrent(p),clearRestoreHealth:(p,S)=>this.seams.clearRestoreHealth(p,S),markHealth:(p,S,R)=>this.host.deviceHealth?.markers.mark(p,S,R),clearHealthMarker:(p,S,R)=>this.host.deviceHealth?.markers.clear(p,S,R),waitForIdentityReplacement:(p,S)=>this.host.waitForIdentityReplacement(p,S),abandonRestore:(p,S,R,g)=>this.seams.abandonRestore(p,S,R,g),sessionSetupsOf:(p)=>Array.from(this.host.sessionSetupPromises,(S)=>S.session===p?S.promise:null).filter((S)=>S!==null),waitForSessionSetup:(p,S,R)=>this.host.waitForSessionSetup(p,S,R),noteTeardownBound:(p,S)=>this.host.deviceCleanupQuarantine.noteTeardownBound(p,S),trackPendingDeviceCleanup:(p,S)=>this.seams.trackPendingDeviceCleanup(p,S),isAdmittedForAutomation:(p)=>this.host.isAdmittedForAutomation(p),sessionNow:()=>this.host.sessionNow(),registerPendingDeviceCleanup:(p,S,R)=>this.host.registerPendingDeviceCleanup(p,S,R)},{keepScreenAwake:d,biometricEnrollment:c,networkCondition:h.networkCondition,screenReader:h.screenReader,screenReaderBackoff:h.screenReaderBackoff,rotation:h.rotation,rotationBackoff:h.rotationBackoff,clock:h.clock,iosAppNetworkRuleRestorer:h.iosAppNetworkRule,defaultIosAppNetworkRuleRestorer:Or,iosLease:{leaseMs:bb,renewIntervalMs:hie}})}createRecoveredIntents(s){return new Js({terminalReleaseJournal:()=>this.host.terminalReleaseJournal,setJournal:(n)=>{this.seams.setJournal(n)},daemonSessionId:()=>this.host.daemonSessionId,liveDaemonSessionIds:()=>this.host.liveDaemonSessionIds?.bind(this),sessionSlots:()=>this.host.sessionSlots,deviceSessionRepository:()=>this.host.deviceSessionRepository,timer:s,sessionNow:()=>this.host.sessionNow(),wallToSessionClock:(n)=>this.host.wallToSessionClock(n),checkSlotShadow:(n,a)=>this.host.slotShadowProbe.check(n,a),liftTerminalFence:(n,a,d)=>this.host.liftTerminalFence(n,a,d)})}createForcedStuckRelease(s){return new js({sessionSlots:()=>this.host.sessionSlots,removeSession:(n,a)=>this.host.removeSession(n,a),notifySessionRelease:(n,a)=>this.host.notifySessionRelease(n,a),managedExecutionReleaseMarker:$e,restartReleasePersistence:()=>this.host.restartReleasePersistence,registerPendingDeviceCleanup:(n,a,d)=>this.host.registerPendingDeviceCleanup(n,a,d),persistSessionRelease:(n)=>this.host.persistSessionRelease(n),scheduleTerminalReleaseRetry:(n)=>this.host.scheduleTerminalReleaseRetry(n),trackReleaseDrainWrite:(n)=>this.host.trackReleaseDrainWrite(n),retryNonTerminalRowAfterRelease:(n)=>this.host.retryNonTerminalRowAfterRelease(n),releaseRowSessions:()=>this.host.releaseRowSessions,captureReleaseRowGeneration:(n,a)=>this.host.captureReleaseRowGeneration(n,a),persistedRowGenerations:()=>this.host.persistedRowGenerations,volatileTerminalReleaseIntents:()=>this.host.volatileTerminalReleaseIntents,terminalReleaseJournal:()=>this.host.terminalReleaseJournal,rowWriter:()=>this.host.rowWriter,retainedEndedBase:(n)=>this.host.planLabels.retainedEndedBase(n),timer:s,sessionNow:()=>this.host.sessionNow()})}createLiveness(){return new $s({getSession:(s)=>this.host.getSession(s),peekSession:(s)=>this.host.peekSession(s),unlessBaseEnded:(s)=>this.host.unlessBaseEnded(s),isAdmittedForAutomation:(s)=>this.host.isAdmittedForAutomation(s),sessionNow:()=>this.host.sessionNow(),ownershipSessionUuid:(s)=>this.host.ownershipSessionUuid(s),livenessOwnerView:(s)=>this.seams.livenessOwnerView(s),hasUnissuedActivity:(s)=>this.seams.hasUnissuedActivity(s),recordSessionActivity:(s)=>this.host.recordSessionActivity(s),getBarrier:()=>this.seams.getBarrier(),recordLivenessOwnership:(s,n)=>this.host.deviceSessionRepository.recordLivenessOwnership(s,n),replaceLivenessOwnership:(s,n)=>this.host.deviceSessionRepository.replaceLivenessOwnership(s,n),defaultHeartbeatTimeoutMs:()=>oc()})}}var Dr=Q({initialDelayMs:250,maxDelayMs:2000}),nn;class Xs{setTerminalReleaseRetryBackoff(s){this.forwardersHost.rowWriter.setRetryBackoff(s)}assertDaemonCollaboratorsAttached(){this.forwardersHost.configuration.assertDaemonCollaboratorsAttached()}attachDaemonSessionId(s){this.forwardersHost.configuration.attachDaemonSessionId(s)}attachLiveDaemonSessionIds(s){this.forwardersHost.configuration.attachLiveDaemonSessionIds(s)}attachTerminalReleaseJournal(s){this.forwardersHost.recoveredIntents.attachTerminalReleaseJournal(s)}applyRecoveredTerminalReleaseIntents(s){return this.forwardersHost.recoveredIntents.applyRecoveredTerminalReleaseIntents(s)}setObserverSessionRegistry(s){this.forwardersHost.configuration.setObserverSessionRegistry(s)}getDeviceHealthRecovery(s,n,a){return this.forwardersHost.restoreHealth.getDeviceHealthRecovery(s,n,a)}setDeviceHealthMarkers(s,n,a,d=Q({initialDelayMs:1000})){return this.forwardersHost.restoreHealth.setDeviceHealthMarkers(s,n,a,d)}markDeviceNeedsAppCleanup(s,n,a,d){return this.forwardersHost.restoreHealth.markDeviceNeedsAppCleanup(s,n,a,d)}markDeviceNeedsRecorderTeardown(s,n,a,d){return this.forwardersHost.restoreHealth.markDeviceNeedsRecorderTeardown(s,n,a,d)}setRecoveryExpiryReleaseHandler(s){this.forwardersHost.configuration.setRecoveryExpiryReleaseHandler(s)}sessionNow(){return this.forwardersHost.sessionClock.now()}sessionClockToReportedWall(s){return this.forwardersHost.sessionClock.toWall(s)}onSessionRelease(s){return this.forwardersHost.callbacks.onSessionRelease(s)}onDeviceOwnershipChange(s){return this.forwardersHost.callbacks.onDeviceOwnershipChange(s)}onSessionCreated(s){return this.forwardersHost.callbacks.onSessionCreated(s)}getPendingDeviceCleanup(s,n){return this.forwardersHost.deviceCleanupQuarantine.get(s,n)}registerPendingDeviceCleanup(s,n,a){this.forwardersHost.deviceCleanupQuarantine.register(s,n,a)}getDeviceCleanupRetryAfterMs(s){return this.forwardersHost.bookkeeping.getDeviceCleanupRetryAfterMs(s)}registerAcquisitionDeviceCleanup(s,n,a){this.forwardersHost.deviceCleanupQuarantine.registerAcquisition(s,n,a)}hasDeviceCleanupInProgress(s){return this.forwardersHost.bookkeeping.hasDeviceCleanupInProgress(s)}getIdleReleasesInProgress(){return this.forwardersHost.bookkeeping.getIdleReleasesInProgress()}getNonTerminalReleasesInProgress(){return this.forwardersHost.bookkeeping.getNonTerminalReleasesInProgress()}getTerminalReleasesInProgress(){return this.forwardersHost.bookkeeping.getTerminalReleasesInProgress()}isReleaseInProgress(s,n){return this.forwardersHost.bookkeeping.isReleaseInProgress(s,n)}getReleaseStuckAtMs(s){return this.forwardersHost.bookkeeping.getReleaseStuckAtMs(s)}forceStuckRelease(s){return this.forwardersHost.forcedStuckRelease.forceStuckRelease(s)}setActiveSessionExecutionChecker(s){this.forwardersHost.configuration.setActiveSessionExecutionChecker(s)}setLivenessOwnerCallInFlightReader(s){this.forwardersHost.configuration.setLivenessOwnerCallInFlightReader(s)}setOwnerConnectedAtReader(s){this.forwardersHost.configuration.setOwnerConnectedAtReader(s)}restartMintBoundClaimLeases(s){return this.forwardersHost.activityClocks.restartMintBoundClaimLeases(s)}setSessionExecutionDeadlineLookup(s){this.forwardersHost.configuration.setSessionExecutionDeadlineLookup(s)}setExpiryReleaseExecutionCanceller(s){this.forwardersHost.configuration.setExpiryReleaseExecutionCanceller(s)}setDeviceAcquisitionExecutionCanceller(s){this.forwardersHost.configuration.setDeviceAcquisitionExecutionCanceller(s)}deferDeviceAcquisitionCancellation(s){return this.forwardersHost.callbacks.deferDeviceAcquisitionCancellation(s)}settleDeviceAcquisitionCancellation(s,n){return this.forwardersHost.callbacks.settleDeviceAcquisitionCancellation(s,n)}onSessionDeviceUnbound(s){return this.forwardersHost.callbacks.onSessionDeviceUnbound(s)}setManagedExecutionRecoveryListener(s){this.forwardersHost.configuration.setManagedExecutionRecoveryListener(s)}createSession(s,n,a,d={}){return this.forwardersHost.creationGuard.createSession(s,n,a,d)}stopAcceptingSessionCreations(){this.forwardersHost.configuration.stopAcceptingSessionCreations()}isAcceptingSessionCreations(){return this.forwardersHost.configuration.isAcceptingSessionCreations()}onRestartRecoveryActivity(s){return this.forwardersHost.persistedAdmission.onRestartRecoveryActivity(s)}isReleasedSessionInRestartRecoveryWindow(s){return this.forwardersHost.persistedAdmission.isReleasedSessionInRestartRecoveryWindow(s)}expireRestartRecoveryReservation(s){return this.forwardersHost.persistedAdmission.expireRestartRecoveryReservation(s)}terminalizeDeviceRestartHandoffForStop(s){return this.forwardersHost.persistedAdmission.terminalizeDeviceRestartHandoffForStop(s)}findSession(s){return this.forwardersHost.admission.findSession(s)}getSessionForNewExecution(s,n){return this.forwardersHost.admission.getSessionForNewExecution(s,n)}deviceHeldForLateRead(s,n){return this.forwardersHost.leaseExpiry.deviceHeldForLateRead(s,n)}getOrCreateSession(s,n,a,d={}){return this.forwardersHost.admission.getOrCreateSession(s,n,a,d)}admitIssuedSessionForAutomation(s,n,a={}){return this.forwardersHost.acquisition.admitIssuedSessionForAutomation(s,n,a)}rehydratePersistedSessions(s,n={}){return this.forwardersHost.rehydration.rehydratePersistedSessions(s,n)}setLateRehydrationListener(s){this.forwardersHost.configuration.setLateRehydrationListener(s)}rebindSession(s,n,a,d={}){return this.forwardersHost.rebinding.rebindSession(s,n,a,d)}rebindSessionForTerminalReleaseRecovery(s,n,a){return this.forwardersHost.rebinding.rebindSessionForTerminalReleaseRecovery(s,n,a)}flushDeferredRebindCleanups(s={}){return this.forwardersHost.rebinding.flushDeferredRebindCleanups(s)}getDeviceForSession(s){return this.forwardersHost.queries.getDeviceForSession(s)}getFinalizedReleaseReason(s){return this.forwardersHost.queries.getFinalizedReleaseReason(s)}getReleasedSessionReason(s){return this.forwardersHost.admission.getReleasedSessionReason(s)}getReleasedSessionIdleTimeoutMs(s){return this.forwardersHost.admission.getReleasedSessionIdleTimeoutMs(s)}getExpiredReleaseSnapshot(s){return this.forwardersHost.admission.getExpiredReleaseSnapshot(s)}getTerminalReleaseSnapshot(s){return this.forwardersHost.queries.getTerminalReleaseSnapshot(s)}reserveSessionForTerminalRelease(s,n){return this.forwardersHost.admission.reserveSessionForTerminalRelease(s,n)}getSessionForDevice(s){return this.forwardersHost.queries.getSessionForDevice(s)}getHeldDeviceSessions(){return this.forwardersHost.queries.getHeldDeviceSessions()}hasSession(s){return this.forwardersHost.queries.hasSession(s)}isLiveManagedExecutionSession(s){return this.forwardersHost.queries.isLiveManagedExecutionSession(s)}getLegacyLifecycleView(){return this.forwardersHost.queries.getLegacyLifecycleView()}checkSlotShadowAgreement(s,n,a=[]){this.forwardersHost.slotShadowProbe.check(s,n,a)}isCurrentSession(s){return this.forwardersHost.queries.isCurrentSession(s)}isAdmittedForAutomation(s){return this.forwardersHost.queries.isAdmittedForAutomation(s)}getSessionLivenessOwnerToken(s){return this.forwardersHost.queries.getSessionLivenessOwnerToken(s)}getReleasingSession(s){return this.forwardersHost.queries.getReleasingSession(s)}isLatestSessionIdentity(s,n={}){return this.forwardersHost.queries.isLatestSessionIdentity(s,n)}releaseSession(s,n="explicit-release",a={}){return this.forwardersHost.releaseRequests.releaseSession(s,n,a)}setReleaseDeviceHold(s){this.forwardersHost.configuration.setReleaseDeviceHold(s)}releaseSessionUnlessSuperseded(s,n,a={}){return this.forwardersHost.releaseRequests.releaseSessionUnlessSuperseded(s,n,a)}trackSessionSetup(s,n){return this.forwardersHost.bookkeeping.trackSessionSetup(s,n)}drainReleasePromises(s,n=[]){return this.forwardersHost.bookkeeping.drainReleasePromises(s,n)}waitForSessionRelease(s){return this.forwardersHost.bookkeeping.waitForSessionRelease(s)}waitForSessionReleaseWithin(s,n){return this.forwardersHost.bookkeeping.waitForSessionReleaseWithin(s,n)}beginIosAppNetworkRule(s,n,a){return this.forwardersHost.stateRestore.beginIosAppNetworkRule(s,n,a)}releaseIosAppWatchFor(s,n){return this.forwardersHost.stateRestore.releaseIosAppWatchFor(s,n)}prepareIosAppNetworkReset(s,n){return this.forwardersHost.stateRestore.prepareIosAppNetworkReset(s,n)}confirmIosAppNetworkRule(s,n){this.forwardersHost.stateRestore.confirmIosAppNetworkRule(s,n)}finishIosAppNetworkReset(s,n){this.forwardersHost.stateRestore.finishIosAppNetworkReset(s,n)}activeIosAppNetworkLease(s){return this.forwardersHost.stateRestore.activeIosAppNetworkLease(s)}scheduleNetworkConditionExpiry(s,n,a){this.forwardersHost.stateRestore.scheduleNetworkConditionExpiry(s,n,a)}peekNetworkConditionExpiry(s){return this.forwardersHost.stateRestore.peekNetworkConditionExpiry(s)}rearmNetworkConditionExpiry(s,n){this.forwardersHost.stateRestore.rearmNetworkConditionExpiry(s,n)}cancelNetworkConditionExpiry(s){this.forwardersHost.stateRestore.cancelNetworkConditionExpiry(s)}setLastRenderedObservation(s,n,a){return this.forwardersHost.cache.setLastRenderedObservation(s,n,a)}getLastActionMetadata(s,n){return this.forwardersHost.cache.getLastActionMetadata(s,n)}setLastActionMetadata(s,n,a){return this.forwardersHost.cache.setLastActionMetadata(s,n,a)}getLastRenderedObservation(s){return this.forwardersHost.cache.getLastRenderedObservation(s)}setLastRenderedDisplayRevision(s,n,a,d){return this.forwardersHost.cache.setLastRenderedDisplayRevision(s,n,a,d)}getLastRenderedDisplayGeneration(s){return this.forwardersHost.cache.getLastRenderedDisplayGeneration(s)}setDisplayPin(s,n){return this.forwardersHost.cache.setDisplayPin(s,n)}getDisplayPin(s){return this.forwardersHost.cache.getDisplayPin(s)}getLastRenderedDisplayKey(s){return this.forwardersHost.cache.getLastRenderedDisplayKey(s)}getLastRenderedDisplayRevision(s){return this.forwardersHost.cache.getLastRenderedDisplayRevision(s)}getKeepScreenAwake(s){return this.forwardersHost.cache.getKeepScreenAwake(s)}setDeviceReadiness(s,n){return this.forwardersHost.cache.setDeviceReadiness(s,n)}getDeviceReadiness(s){return this.forwardersHost.cache.getDeviceReadiness(s)}invalidateAutomationReadiness(s,n){return this.forwardersHost.cache.invalidateAutomationReadiness(s,n)}setClock(s,n){return this.forwardersHost.cache.setClock(s,n)}getClock(s){return this.forwardersHost.cache.getClock(s)}getKeepAwakeRestoreReport(s){return this.forwardersHost.cache.getKeepAwakeRestoreReport(s)}trackClockSessionSetup(s,n){return this.forwardersHost.cache.trackClockSessionSetup(s,n)}runClockMutationExclusive(s,n){return this.forwardersHost.cache.runClockMutationExclusive(s,n)}setRotation(s,n){return this.forwardersHost.cache.setRotation(s,n)}getRotation(s){return this.forwardersHost.cache.getRotation(s)}trackRotationSessionSetup(s,n){return this.forwardersHost.cache.trackRotationSessionSetup(s,n)}runRotationMutationExclusive(s,n){return this.forwardersHost.cache.runRotationMutationExclusive(s,n)}trackScreenReaderSessionSetup(s,n){return this.forwardersHost.cache.trackScreenReaderSessionSetup(s,n)}setScreenReader(s,n){return this.forwardersHost.cache.setScreenReader(s,n)}getScreenReader(s){return this.forwardersHost.cache.getScreenReader(s)}runScreenReaderMutationExclusive(s,n){return this.forwardersHost.cache.runScreenReaderMutationExclusive(s,n)}setBiometricEnrollment(s,n){return this.forwardersHost.cache.setBiometricEnrollment(s,n)}getBiometricEnrollment(s){return this.forwardersHost.cache.getBiometricEnrollment(s)}setNetworkCondition(s,n){return this.forwardersHost.cache.setNetworkCondition(s,n)}bumpNetworkConditionGeneration(s){return this.forwardersHost.cache.bumpNetworkConditionGeneration(s)}runNetworkConditionMutationExclusive(s,n){return this.forwardersHost.cache.runNetworkConditionMutationExclusive(s,n)}getNetworkCondition(s){return this.forwardersHost.cache.getNetworkCondition(s)}openPlanLabelMints(s,n){return this.forwardersHost.planLabelsLifecycle.openPlanLabelMints(s,n)}getBaseSessionOfDerivedLabel(s){return this.forwardersHost.planLabelsLifecycle.getBaseSessionOfDerivedLabel(s)}isLiveSessionOfSamePlan(s,n){return this.forwardersHost.planLabelsLifecycle.isLiveSessionOfSamePlan(s,n)}takeDerivedLabelSessions(s,n){return this.forwardersHost.planLabelsLifecycle.takeDerivedLabelSessions(s,n)}getDeviceLabels(s){return this.forwardersHost.cache.getDeviceLabels(s)}recordToolCallEnded(s,n={admitted:!0}){return this.forwardersHost.activityClocks.recordToolCallEnded(s,n)}terminalAnswerForEndedSession(s,n){return this.forwardersHost.admission.terminalAnswerForEndedSession(s,n)}peekTerminalAnswerForEndedSession(s){return this.forwardersHost.admission.peekTerminalAnswerForEndedSession(s)}ownershipSessionUuid(s){return this.forwardersHost.leaseExpiry.ownershipSessionUuid(s)}getOwnerLeaseHold(s){return this.forwardersHost.leaseExpiry.getOwnerLeaseHold(s)}getSessionLeaseState(s){return this.forwardersHost.leaseExpiry.getSessionLeaseState(s)}ownerLeaseAwaitsReap(s){return this.forwardersHost.leaseExpiry.ownerLeaseAwaitsReap(s)}judgedLeaseHeartbeat(s){return this.forwardersHost.leaseExpiry.judgedLeaseHeartbeat(s)}creditOwnerHeartbeatDuringRelease(s,n){return this.forwardersHost.leaseExpiry.creditOwnerHeartbeatDuringRelease(s,n)}setStallProbe(s){this.forwardersHost.configuration.setStallProbe(s)}startRehydratedOwnerWindows(){return this.forwardersHost.activityClocks.startRehydratedOwnerWindows()}forgiveDaemonStall(s,n,a=0,d){return this.forwardersHost.activityClocks.forgiveDaemonStall(s,n,a,d)}clearSessionCache(s,n){return this.forwardersHost.cache.clearSessionCache(s,n)}getActiveSessionCount(){return this.forwardersHost.queries.getActiveSessionCount()}getAllSessions(){return this.forwardersHost.queries.getAllSessions()}getAllSessionIds(){return this.forwardersHost.queries.getAllSessionIds()}getAllKnownSessionIds(){return this.forwardersHost.queries.getAllKnownSessionIds()}getAssignedDevices(){return this.forwardersHost.queries.getAssignedDevices()}getIdleReleaseExecutionVeto(s){return this.forwardersHost.leaseExpiry.getIdleReleaseExecutionVeto(s)}cancelExecutionsCutByRelease(s,n,a){return this.forwardersHost.leaseExpiry.cancelExecutionsCutByRelease(s,n,a)}cleanupExpiredSessions(){return this.forwardersHost.activityClocks.cleanupExpiredSessions()}stopCleanupTimer(){this.forwardersHost.cleanup.stopCleanupTimer()}getStats(){return this.forwardersHost.queries.getStats()}}function rn(s,n){return{...s,isReleasing:(a)=>n.has(a)}}class Ge extends Error{from;to;constructor(s,n,a){super(a);this.from=s;this.to=n;this.name="SlotTransitionError"}}class Zs{pendingSessionAssignments=new Map;sharedSessionAssignments=new Map;pendingSessionCreations=new Map;pendingPersistedRecoveries=new Map;claimedRecoverableRows=new WeakSet;pendingSessionReleases=new Map;pendingRebinds=new Map;deferredCleanupOwners=new Map;releasePromises=new Map;activeReleasePromises=new Set;forcedNonTerminalReleases=new WeakMap;releasingSessions=new WeakSet;terminalReleaseSnapshots=new Map;terminalReleaseReasonStates=new Map;terminalReleaseReservations=new Map;latestFinalizedSessionIdentities=new Map;finalizedSessionIdentityRegistry;recoveredTerminalReleaseIntents=new Map;adoptedDeadDaemonJournals=new Set;adoptedTerminalReleaseOwners=new Map;rowPendingSignal;tagWaiters=new Map;settled(s,n){let a=this.tagWaiters.get(s);if(a)return a.promise;let{promise:d,resolve:c}=Promise.withResolvers();return this.tagWaiters.set(s,{view:n,tag:Re(n,s),promise:d,resolve:c}),d}notifySettled(s){let n=this.tagWaiters.get(s);if(n&&Re(n.view,s)!==n.tag)this.tagWaiters.delete(s),n.resolve()}notifyReleasingChanged(){for(let s of this.tagWaiters.keys())this.notifySettled(s)}constructor(s={}){this.rowPendingSignal=s.rowPending??{pending:()=>!1};let n=({sessionId:a,identity:d})=>{if(this.latestFinalizedSessionIdentities.get(a)===d)this.latestFinalizedSessionIdentities.delete(a),this.notifySettled(a),s.onFinalizedIdentityCollected?.(a)};this.finalizedSessionIdentityRegistry=s.createFinalizationRegistry?s.createFinalizationRegistry(n):new FinalizationRegistry(n)}rowPending(s){return this.rowPendingSignal.pending(s)}recordFinalizedIdentity(s){if(this.latestFinalizedSessionIdentities.get(s.sessionId)?.deref()===s)return;let a=new WeakRef(s);this.latestFinalizedSessionIdentities.set(s.sessionId,a),this.notifySettled(s.sessionId),this.finalizedSessionIdentityRegistry.register(s,{sessionId:s.sessionId,identity:a})}get terminalSnapshots(){return this.terminalReleaseSnapshots}getTerminalSnapshot(s){return this.terminalReleaseSnapshots.get(s)}hasTerminalSnapshot(s){return this.terminalReleaseSnapshots.has(s)}setTerminalSnapshot(s,n){this.terminalReleaseSnapshots.set(s,n),this.notifySettled(s)}deleteTerminalSnapshot(s){let n=this.terminalReleaseSnapshots.delete(s);return this.notifySettled(s),n}get terminalReasonStates(){return this.terminalReleaseReasonStates}getTerminalReasonState(s){return this.terminalReleaseReasonStates.get(s)}hasTerminalReasonState(s){return this.terminalReleaseReasonStates.has(s)}setTerminalReasonState(s,n){this.terminalReleaseReasonStates.set(s,n)}deleteTerminalReasonState(s){return this.terminalReleaseReasonStates.delete(s)}get terminalReservations(){return this.terminalReleaseReservations}getTerminalReservation(s){return this.terminalReleaseReservations.get(s)}hasTerminalReservation(s){return this.terminalReleaseReservations.has(s)}setTerminalReservation(s,n){this.terminalReleaseReservations.set(s,n)}deleteTerminalReservation(s){return this.terminalReleaseReservations.delete(s)}get latestFinalizedIdentities(){return this.latestFinalizedSessionIdentities}getFinalizedIdentity(s){return this.latestFinalizedSessionIdentities.get(s)}hasFinalizedIdentity(s){return this.latestFinalizedSessionIdentities.has(s)}deleteFinalizedIdentity(s){let n=this.latestFinalizedSessionIdentities.delete(s);return this.notifySettled(s),n}get recoveredTerminalIntents(){return this.recoveredTerminalReleaseIntents}getRecoveredTerminalIntent(s){return this.recoveredTerminalReleaseIntents.get(s)}hasRecoveredTerminalIntent(s){return this.recoveredTerminalReleaseIntents.has(s)}setRecoveredTerminalIntent(s,n){this.recoveredTerminalReleaseIntents.set(s,n),this.notifySettled(s)}deleteRecoveredTerminalIntent(s){let n=this.recoveredTerminalReleaseIntents.delete(s);return this.notifySettled(s),n}get adoptedTerminalOwners(){return this.adoptedTerminalReleaseOwners}getAdoptedTerminalOwner(s){return this.adoptedTerminalReleaseOwners.get(s)}hasAdoptedTerminalOwner(s){return this.adoptedTerminalReleaseOwners.has(s)}setAdoptedTerminalOwner(s,n){this.adoptedTerminalReleaseOwners.set(s,n)}deleteAdoptedTerminalOwner(s){return this.adoptedTerminalReleaseOwners.delete(s)}get adoptedDeadJournals(){return this.adoptedDeadDaemonJournals}hasAdoptedDeadJournal(s){return this.adoptedDeadDaemonJournals.has(s)}addAdoptedDeadJournal(s){this.adoptedDeadDaemonJournals.add(s)}deleteAdoptedDeadJournal(s){return this.adoptedDeadDaemonJournals.delete(s)}get releaseOps(){return this.releasePromises}getReleaseOp(s){return this.releasePromises.get(s)}hasReleaseOp(s){return this.releasePromises.has(s)}setReleaseOp(s,n){this.releasePromises.set(s,n),this.notifySettled(s)}deleteReleaseOp(s){let n=this.releasePromises.delete(s);return this.notifySettled(s),n}get activeReleases(){return this.activeReleasePromises}addActiveRelease(s){this.activeReleasePromises.add(s)}hasActiveRelease(s){return this.activeReleasePromises.has(s)}deleteActiveRelease(s){return this.activeReleasePromises.delete(s)}markReleasing(s){this.releasingSessions.add(s),this.notifyReleasingChanged()}unmarkReleasing(s){let n=this.releasingSessions.delete(s);return this.notifyReleasingChanged(),n}isReleasing(s){return this.releasingSessions.has(s)}getForcedNonTerminal(s){return this.forcedNonTerminalReleases.get(s)}setForcedNonTerminal(s,n){this.forcedNonTerminalReleases.set(s,n)}hasForcedNonTerminal(s){return this.forcedNonTerminalReleases.has(s)}deleteForcedNonTerminal(s){return this.forcedNonTerminalReleases.delete(s)}get assignments(){return this.pendingSessionAssignments}getAssignment(s){return this.pendingSessionAssignments.get(s)}hasAssignment(s){return this.pendingSessionAssignments.has(s)}setAssignment(s,n){this.pendingSessionAssignments.set(s,n),this.notifySettled(s)}deleteAssignment(s){let n=this.pendingSessionAssignments.delete(s);return this.notifySettled(s),n}get sharedAssignments(){return this.sharedSessionAssignments}getShared(s){return this.sharedSessionAssignments.get(s)}setShared(s,n){this.sharedSessionAssignments.set(s,n)}deleteShared(s){return this.sharedSessionAssignments.delete(s)}get creations(){return this.pendingSessionCreations}getCreation(s){return this.pendingSessionCreations.get(s)}hasCreation(s){return this.pendingSessionCreations.has(s)}setCreation(s,n){this.pendingSessionCreations.set(s,n),this.notifySettled(s)}deleteCreation(s){let n=this.pendingSessionCreations.delete(s);return this.notifySettled(s),n}get recoveries(){return this.pendingPersistedRecoveries}getRecovery(s){return this.pendingPersistedRecoveries.get(s)}hasRecovery(s){return this.pendingPersistedRecoveries.has(s)}setRecovery(s,n){this.pendingPersistedRecoveries.set(s,n)}deleteRecovery(s){return this.pendingPersistedRecoveries.delete(s)}get releaseRequests(){return this.pendingSessionReleases}getReleaseRequest(s){return this.pendingSessionReleases.get(s)}setReleaseRequest(s,n){this.pendingSessionReleases.set(s,n),this.notifySettled(s)}deleteReleaseRequest(s){let n=this.pendingSessionReleases.delete(s);return this.notifySettled(s),n}get rebinds(){return this.pendingRebinds}getRebind(s){return this.pendingRebinds.get(s)}hasRebind(s){return this.pendingRebinds.has(s)}setRebind(s,n){this.pendingRebinds.set(s,n),this.notifySettled(s)}deleteRebind(s){let n=this.pendingRebinds.delete(s);return this.notifySettled(s),n}get deferredCleanups(){return this.deferredCleanupOwners}setDeferredCleanup(s,n){this.deferredCleanupOwners.set(s,n)}deleteDeferredCleanup(s){return this.deferredCleanupOwners.delete(s)}markRowClaimed(s){this.claimedRecoverableRows.add(s)}isRowClaimed(s){return this.claimedRecoverableRows.has(s)}}var Ir=new Map([["absent",new Set(["assigning","creating","fenced"])],["assigning",new Set(["creating","absent"])],["creating",new Set(["absent","live","releasing"])],["live",new Set(["rebinding","releasing"])],["rebinding",new Set(["live","releasing"])],["releasing",new Set(["ended","fenced","live"])],["ended",new Set(["creating","absent"])],["fenced",new Set(["creating"])]]);function Ke(s,n){let a=`${s.tag} -> ${n.tag}`;if(s.fence!==void 0&&s.tag!=="releasing"||n.fence!==void 0&&n.tag!=="releasing")return{ok:!1,reason:`${a}: fence is only meaningful for releasing`};if(s.tag===n.tag){if(s.tag==="releasing"&&s.fence==="none"&&n.fence==="terminal")return{ok:!0};return{ok:!1,reason:`${a}: only the releasing fence upgrade from none to terminal may keep its tag`}}if(!Ir.get(s.tag)?.has(n.tag))return{ok:!1,reason:`${a}: not a legal slot transition`};return{ok:!0}}var on=[{event:"published",from:"absent",via:"creating",to:"live"},{event:"assignment-end",from:"assigning",via:"absent",to:"fenced"},{event:"creation-end",from:"creating",via:"absent",to:"fenced"},{event:"unpublished",from:"releasing",via:"ended",to:"creating"}],an=new Set(["assignment-start:ended:assigning","assignment-end:assigning:ended","creation-end:creating:assigning","creation-end:creating:ended","unpublished:releasing:assigning","release-end:ended:fenced","release-end:ended:live"]);function ze(s,n){let a=Re(s,n),d={tag:a,releaseRequested:(a==="creating"||a==="assigning")&&s.pendingReleases.has(n)};if(a==="releasing")d.fence=s.terminalSnapshots.has(n)?"terminal":"none";if(!Te(a)&&(s.pendingReleases.has(n)||s.pendingRebinds.has(n)||s.releaseOps.has(n)))d.residue=!0;return d}function Re(s,n){let a=s.sessions.get(n);if(a!==void 0)return _r(s,n,a);if(s.pendingCreations.has(n))return"creating";if(s.pendingAssignments.has(n))return"assigning";if(s.terminalSnapshots.has(n)||s.recoveredTerminalIntents.has(n))return"fenced";if(s.releaseOps.has(n)||s.latestFinalizedIdentities.get(n)?.deref()!==void 0)return"ended";return"absent"}function _r(s,n,a){let d=s.releaseOps.get(n);if(s.terminalSnapshots.has(n)||s.isReleasing(a)||d?.session===a&&!d.forced&&!d.commitDeclined)return"releasing";return s.pendingRebinds.has(n)?"rebinding":"live"}function Te(s){return s==="assigning"||s==="creating"||s==="live"||s==="rebinding"||s==="releasing"}function xr(s){return s!=="absent"&&s!=="ended"&&s!=="fenced"}function et(s){return xr(s.tag)||s.residue===!0}function je(s,n,a=!1){let d=s.sessions.get(n);if(d!==void 0)return d;if(s.pendingCreations.has(n)||!a&&s.pendingAssignments.has(n))return;return s.releaseOps.get(n)?.session??s.latestFinalizedIdentities.get(n)?.deref()}function ln(s,n,a){if(s.sessions.get(n)!==a)return!1;let d=Re(s,n);return d==="live"||d==="rebinding"||d==="releasing"&&!s.terminalSnapshots.has(n)}function dn(s,n){return s.sessions.get(n)??s.releaseOps.get(n)?.session}function cn(s){return[...new Set([...s.sessions.keys(),...s.pendingCreations.keys(),...s.pendingAssignments.keys(),...s.pendingRebinds.keys(),...s.pendingReleases.keys(),...s.releaseOps.keys()])].filter((n)=>et(ze(s,n)))}class st{host;facade;lifecycleView;constructor(s,n){this.host=s;this.facade=n}getDeviceForSession(s){let n=this.host.findSession(s);if(!n)return null;return n.assignedDevice}getFinalizedReleaseReason(s){return this.host.finalizedSessionReleases.get(s)?.finalizedSnapshot?.releaseReason}getTerminalReleaseSnapshot(s){let n=this.host.sessionSlots.getTerminalSnapshot(s);return n?{...n,heartbeat:{...n.heartbeat}}:void 0}getSessionForDevice(s){return this.host.deviceSessionMap.get(s)??null}getHeldDeviceSessions(){return[...this.host.deviceSessionMap].flatMap(([s,n])=>{let a=dn(this.host.getLegacyLifecycleView(),n);return a?[{deviceId:s,sessionId:n,platform:a.platform,stableDeviceId:a.stableDeviceId}]:[]})}hasSession(s){return this.host.sessions.has(s)}isLiveManagedExecutionSession(s){let n=this.host.expireIfDue(s,!1,void 0,!1);return n!==null&&n.livenessPolicy===Xn&&!this.host.sessionSlots.isReleasing(n)}getLegacyLifecycleView(){return this.lifecycleView??=rn({sessions:this.host.sessions,pendingAssignments:this.host.sessionSlots.assignments,pendingCreations:this.host.sessionSlots.creations,pendingReleases:this.host.sessionSlots.releaseRequests,pendingRebinds:this.host.sessionSlots.rebinds,releaseOps:this.host.sessionSlots.releaseOps,terminalSnapshots:this.host.sessionSlots.terminalSnapshots,recoveredTerminalIntents:this.host.sessionSlots.recoveredTerminalIntents,latestFinalizedIdentities:this.host.sessionSlots.latestFinalizedIdentities},{has:(s)=>this.host.sessionSlots.isReleasing(s)})}isCurrentSession(s){return ln(this.host.getLegacyLifecycleView(),s.sessionId,s)}isAdmittedForAutomation(s){return this.host.isCurrentSession(s)&&!this.host.sessionSlots.isReleasing(s)}getSessionLivenessOwnerToken(s){return(this.host.sessions.get(s)??this.host.sessionSlots.getReleaseOp(s)?.session)?.livenessOwnerToken}getReleasingSession(s){return this.host.sessionSlots.getReleaseOp(s)?.session??null}isLatestSessionIdentity(s,n={}){return je(this.host.getLegacyLifecycleView(),s.sessionId,n.ignorePendingAssignment)===s}getActiveSessionCount(){return this.host.sessions.size}getAllSessions(){return Array.from(this.host.sessions.values()).filter((s)=>!this.host.isSessionExpired(s))}getAllSessionIds(){return Array.from(this.host.sessions.keys())}getAllKnownSessionIds(){return cn(this.host.getLegacyLifecycleView())}getAssignedDevices(){return new Set(Array.from(this.host.sessions.values()).filter((s)=>!this.host.isSessionExpired(s)).map((s)=>s.assignedDevice))}getStats(){let s=this.facade.getAllSessions().length,n=this.host.sessions.size-s;return{totalSessions:this.host.sessions.size,activeSessions:s,expiredSessions:n,assignedDevices:this.facade.getAssignedDevices().size}}}function un(s,n){let a=Object.fromEntries(Object.entries(n).map(([d,c])=>[d,{get:c,enumerable:!0,configurable:!0}]));return Object.defineProperties({...s},a)}var cq=5000,tt=Ci*1000+cq;class it{reason;entries=new Map;revision=0;recheckUsed=!1;constructor(s="recording-teardown"){this.reason=s}add(s,n,a){let d=a??Symbol(),c={retry:s,retryTimeoutMs:n};return this.entries.set(d,c),this.revision++,this.recheckUsed=!1,()=>{if(this.entries.get(d)===c)this.entries.delete(d)}}get empty(){return this.entries.size===0}get timeoutMs(){return Math.max(0,...Array.from(this.entries.values(),(s)=>s.retryTimeoutMs))}async dispatch(){let s=[...this.entries],n=[];if(await Promise.all(s.map(async([a,d])=>{try{if(await d.retry(),this.entries.get(a)===d)this.entries.delete(a)}catch(c){n.push(c),e.warn(`${this.reason==="recording-teardown"?"Recorder teardown":"App cleanup"} retry remains unconfirmed`,c)}})),!this.empty)throw new(this.reason==="recording-teardown"&&n.length>0&&n.every((d)=>d instanceof jc)?jc:Error)(`${this.reason==="recording-teardown"?"Recorder teardown":"App cleanup"} retries remain unconfirmed`)}}function hn(s,n,a,d){return n.slice(a-1).reduce((c,h,p)=>c+s.timeoutMs*(a+p)+(p>0||d?h:0),0)}async function Mr(s,n,a){let d=a.reason==="app-cleanup"?"App cleanup":"Recorder teardown",c=Error(`${d} recovery timed out`);try{await l(s,{timer:a.timer,timeoutMs:n,label:`${d} recovery`,timeoutError:()=>c})}catch(h){if(e.warn(`${d} recovery dispatch failed`,h),h===c){a.publishDeadline(void 0);try{await s}catch(p){return e.warn(`Timed-out ${d.toLowerCase()} recovery failed late`,p),p instanceof jc}}else return h instanceof jc}return!1}async function pn(s,n){let a=s.revision;for(let d=1;d<=3;){if(a!==s.revision)d=1,a=s.revision;if(n.publishDeadline(n.timer.now()+hn(s,n.delays,d,!0)),await n.timer.sleep(n.delays[d-1]),!await n.isCurrent())return n.drop(),s.revision;if(!n.canRecover()){if(!n.acceptingSessions())return s.revision;continue}if(a!==s.revision)d=1;a=s.revision;let c=s.timeoutMs*d;n.publishDeadline(n.timer.now()+hn(s,n.delays,d,!1));let h=n.dispatch(()=>s.dispatch()),p=await Mr(h,c,n);if(!await n.isCurrent())return n.drop(),s.revision;if(s.empty)return n.clear(),n.drop(),s.revision;if(p){if(!n.acceptingSessions())return s.revision;continue}d=a!==s.revision?1:d+1,a=s.revision}return a}class nt{host;constructor(s){this.host=s}deviceHealth;identityReplacementFences=new Map;replacedRestoreGenerations=new Map;activeRestoreControllers=new Map;markIdentityReplacedRelease(s,n=s.options,a){if(!n.deviceIdentityReplaced)return;s.options.deviceIdentityReplaced=!0;let d=s.identityReplacement??={deviceId:s.session.assignedDevice,final:!1,commitFences:[],resumeStep:s.teardownStep??0};if(a)d.commitFences.push(a);else d.final=!0;let{deviceId:c}=d,h=this.identityReplacementFences.get(c);if(!h){let p=Promise.withResolvers();h={releases:new Set,settled:p.promise,resume:p.resolve},this.identityReplacementFences.set(c,h)}h.releases.add(s);for(let p of this.activeRestoreControllers.get(c)??[])p.abort(Error("Device identity replaced during restoration"))}finishIdentityReplacedRelease(s){let n=s.identityReplacement?.deviceId;if(n===void 0)return;let a=this.identityReplacementFences.get(n);if(!a||!a.releases.delete(s)||a.releases.size>0)return;this.identityReplacementFences.delete(n),a.resume()}revokeSupersededIdentityReplacement(s){let n=s?.identityReplacement;if(!s||Gl(s)||!n||n.final||!n.commitFences.every(Ae))return!1;return this.finishIdentityReplacedRelease(s),delete s.options.deviceIdentityReplaced,s.teardownResumeStep=n.resumeStep,delete s.identityReplacement,!0}async waitForIdentityReplacement(s,n){let a=this.identityReplacementFences.get(s);while(a)await a.settled,a=this.identityReplacementFences.get(s);return(this.replacedRestoreGenerations.get(s)??0)===n}recorderTeardownRetries=new Map;recorderTeardownRechecks=new Map;healthRecoveries=new Map;healthRecoveryDeadlines=new Map;getDeviceHealthRecovery(s,n,a){if(this.pruneRecorderTeardownRetries(),this.deviceHealth?.incarnation(s)!==n)return{recovering:!1};if(a==="clock")return{recovering:[...this.host.stateRestore.clockRestores.targets.get(s)?.values()??[]].some((h)=>!h.removed)};let d=`${s}#${n}:${a}`;if(!this.healthRecoveries.has(d)&&!this.recorderTeardownRechecks.has(d))return{recovering:!1};let c=this.healthRecoveryDeadlines.get(d);return{recovering:!0,...c!==void 0&&(this.recorderTeardownRechecks.has(d)||!this.identityReplacementFences.has(s)&&this.deviceHealth.canRecover(s))?{retryAfterMs:Math.max(1,Math.ceil(c-this.host.timer.now()))}:{}}}setDeviceHealthMarkers(s,n,a,d=Q({initialDelayMs:1000})){this.deviceHealth={markers:s,incarnation:n,canRecover:a,backoff:d}}markDeviceNeedsAppCleanup(s,n,a,d){this.markDeviceNeedsKeyedRecovery(s,n,a,{retryKey:d,reason:"app-cleanup"})}markDeviceNeedsRecorderTeardown(s,n,a,d){return this.markDeviceNeedsKeyedRecovery(s,n,a,{retryKey:d,reason:"recording-teardown"})}markDeviceNeedsKeyedRecovery(s,n,a,{retryKey:d,reason:c}){this.pruneRecorderTeardownRetries();let h=this.deviceHealth,p=h?.incarnation(s);if(!h||p===void 0)return e.warn(`${c==="recording-teardown"?"Recorder teardown":"App cleanup"} on ${s} has no pool incarnation; cannot key health marker`),()=>{};let S={deviceId:s,incarnation:p},R=`${s}#${p}:${c}`,g=this.recorderTeardownRetries.get(R)?.retries??new it(c);this.recorderTeardownRetries.set(R,{...S,reason:c,retries:g});let w=g.add(n,a,d),y=this.recorderTeardownRechecks.get(R);if(y!==void 0)this.host.timer.clearTimeout(y),this.recorderTeardownRechecks.delete(R);if(h.markers.mark(s,p,c),this.healthRecoveryDeadlines.set(R,void 0),!this.healthRecoveries.has(R))this.startRecorderTeardownRecovery(S,g,c);return()=>{if(w(),g.empty&&this.recorderTeardownRetries.get(R)?.retries===g)this.clearRestoreHealth(S,c),this.pruneRecorderTeardownRetries(),this.healthRecoveries.delete(R),this.healthRecoveryDeadlines.delete(R)}}startRecorderTeardownRecovery(s,n,a){let{deviceId:d,incarnation:c}=s,h=this.deviceHealth,p=`${d}#${c}:${a}`,S,R=this.replacedRestoreGenerations.get(d)??0,g=H(void 0,()=>pn(n,{reason:a,timer:this.host.timer,delays:[1,2,3].map((w)=>h.backoff.delayForAttempt(w)),isCurrent:async()=>await this.waitForIdentityReplacement(d,R)&&this.restoreIncarnationIsCurrent(s)&&this.recorderTeardownRetries.get(p)?.retries===n&&!!h.markers.get(d,c,a),canRecover:()=>h.canRecover(d),acceptingSessions:()=>this.host.acceptingSessionCreations,dispatch:(w)=>this.host.dispatchDeviceRestore(d,w,R),publishDeadline:(w)=>this.healthRecoveryDeadlines.set(p,w),clear:()=>this.clearRestoreHealth(s,a),drop:()=>{if(this.recorderTeardownRetries.get(p)?.retries===n)this.recorderTeardownRetries.delete(p)}})).then((w)=>{S=w});this.healthRecoveries.set(p,g),g.catch((w)=>{e.warn(`${a==="recording-teardown"?"Recorder teardown":"App cleanup"} recovery failed on ${d}`,w)}).finally(()=>{if(this.healthRecoveries.get(p)===g){this.healthRecoveries.delete(p),this.healthRecoveryDeadlines.delete(p),this.pruneRecorderTeardownRetries();let w=this.recorderTeardownRetries.get(p);if(S!==void 0&&w&&(w.retries!==n||w.retries.revision!==S))this.startRecorderTeardownRecovery(s,w.retries,a);else if(w&&a==="recording-teardown"&&!n.empty&&!n.recheckUsed&&this.host.acceptingSessionCreations){n.recheckUsed=!0,this.healthRecoveryDeadlines.set(p,this.host.timer.now()+tt);let y=this.host.timer.setTimeout(()=>{if(this.recorderTeardownRechecks.delete(p),this.healthRecoveryDeadlines.delete(p),this.pruneRecorderTeardownRetries(),this.host.acceptingSessionCreations&&this.recorderTeardownRetries.get(p)?.retries===n&&!n.empty)this.startRecorderTeardownRecovery(s,n,a)},tt);y.unref?.(),this.recorderTeardownRechecks.set(p,y)}}})}pruneRecorderTeardownRetries(){for(let[s,n]of this.recorderTeardownRetries)if(!this.restoreIncarnationIsCurrent(n)||!this.deviceHealth?.markers.get(n.deviceId,n.incarnation,n.reason)){this.recorderTeardownRetries.delete(s);let a=this.recorderTeardownRechecks.get(s);if(a!==void 0)this.host.timer.clearTimeout(a),this.recorderTeardownRechecks.delete(s),this.healthRecoveryDeadlines.delete(s)}}restoreIncarnationIsCurrent(s){return(s.restoreGeneration===void 0||(this.replacedRestoreGenerations.get(s.deviceId)??0)===s.restoreGeneration)&&(s.incarnation===void 0||this.deviceHealth?.incarnation(s.deviceId)===s.incarnation)}clearRestoreHealth(s,n){if(s.incarnation!==void 0&&this.restoreIncarnationIsCurrent(s))this.deviceHealth?.markers.clear(s.deviceId,s.incarnation,n)}abandonRestore(s,n,a,d=Jl){let c=this.deviceHealth;if(s.incarnation===void 0){e.warn(`Gave up restoring state on ${s.deviceId} (${n}); no health marker could be keyed because the device has no pool incarnation`);return}if(!c||!this.restoreIncarnationIsCurrent(s))return;let h=c.markers.mark(s.deviceId,s.incarnation,n),p=`${s.deviceId}#${s.incarnation}:${n}`;if(this.healthRecoveries.has(p))return;let S=this.replacedRestoreGenerations.get(s.deviceId)??0,R=[1,2,3].map((y)=>c.backoff.delayForAttempt(y)),g=(y,b)=>R.slice(y-1).reduce((A,k,T)=>A+d*(y+T)+(T>0||b?k:0),0),w=H(void 0,async()=>{for(let y=1;y<=3;){if(this.healthRecoveryDeadlines.set(p,this.host.timer.now()+g(y,!0)),await this.host.timer.sleep(R[y-1]),!await this.waitForIdentityReplacement(s.deviceId,S)||!this.restoreIncarnationIsCurrent(s))return;if(!c.markers.get(s.deviceId,s.incarnation,n))return;if(!c.canRecover(s.deviceId)){if(!this.host.acceptingSessionCreations)return;continue}let b=Error("Device health recovery timed out"),A=this.host.dispatchDeviceRestore(s.deviceId,a,S);this.healthRecoveryDeadlines.set(p,this.host.timer.now()+g(y,!1));try{await l(A,{timer:this.host.timer,timeoutMs:d*y,label:"Device health recovery",timeoutError:()=>b}),this.clearRestoreHealth(s,n);return}catch(k){if(e.warn(`Device health recovery ${y} failed on ${s.deviceId} (${h.reason})`,k),k===b)this.healthRecoveryDeadlines.set(p,void 0);if(k===b&&await this.inFlightRestoreSucceeded(A,s)){this.clearRestoreHealth(s,n);return}}y++}});this.healthRecoveries.set(p,w),w.catch((y)=>{e.warn(`Device health recovery failed on ${s.deviceId}`,y)}).finally(()=>{if(this.healthRecoveries.get(p)===w)this.healthRecoveries.delete(p),this.healthRecoveryDeadlines.delete(p)})}async inFlightRestoreSucceeded(s,n){try{return await s,!0}catch(a){return e.warn(`Timed-out device health recovery failed late on ${n.deviceId}`,a),!1}}}class ot{host;constructor(s){this.host=s}restartRecoveryActivityAt=new Map;restartRecoveryActivityCallbacks=[];async readPersistedSession(s){let n=await this.host.readSessionRow(s);if(n&&await this.host.recoveredIntents.adoptDeadOwnerTerminalReleases(n))n=await this.host.readSessionRow(s);let a=n&&this.host.recoveredIntents.withRecoveredTerminalRelease(n),d=this.restartRecoveryActivityAt.get(s);if(!a||d===void 0||!j(a))return a;return{...a,expires_at_ms:Math.max(a.expires_at_ms,d+a.session_timeout_ms)}}onRestartRecoveryActivity(s){this.restartRecoveryActivityCallbacks.push(s)}recordRestartRecoveryActivity(s){let n=Math.max(this.restartRecoveryActivityAt.get(s)??0,this.host.sessionNow());this.restartRecoveryActivityAt.set(s,n);for(let a of this.restartRecoveryActivityCallbacks)try{a(s,n)}catch(d){e.warn(`[SessionManager] Restart activity callback failed for ${s}: ${d}`)}this.host.getBarrier().track(async()=>{await this.host.deviceSessionRepository.recordRestartRecoveryActivity(s,n)}).catch((a)=>{e.warn(`[SessionManager] Failed to persist restart-recovery activity for ${s}: `+r(a))})}async isReleasedSessionInRestartRecoveryWindow(s){if(this.host.sessionSlots.hasTerminalSnapshot(s))return!1;let n=await this.readPersistedSession(s);if(!n||this.host.sessionSlots.hasTerminalSnapshot(s)||!this.isReissuablePersistedSession(n))return!1;let a=q(n);return a!==void 0&&this.host.sessionNow()<a}async expireRestartRecoveryReservation(s){let n=await this.readPersistedSession(s);if(!n||!j(n))return;let a=(p)=>this.host.daemonSessionId!==void 0&&(p.daemon_session_id??this.host.daemonSessionId)!==this.host.daemonSessionId,d=(p)=>{let S=q(p,!0);return this.host.isRowOwnedByLivePeer(p)&&this.host.sessionNow()<S?S:void 0};if(a(n))return d(n);let c=this.host.isSessionBeingRecreated(s)||this.host.activeSessionExecutionChecker(s),h=q(n,c);if(this.host.sessionNow()<h)return h;if(!c){let p=await this.terminalizeExpiredPersistedSession(n,n.daemon_session_id===this.host.daemonSessionId?this.host.daemonSessionId:void 0);if(p&&j(p)){if(a(p))return d(p);let S=q(p);if(this.host.sessionNow()<S)return S}}return}async getPersistedTerminalRelease(s){let n=await this.readPersistedSession(s);return n?this.terminalReleaseFromPersisted(s,n):void 0}isReissuablePersistedSession(s){return Boolean(s&&(!s.release_reason||mq(s.release_reason))&&DN(s,this.host.sessionNow())&&(this.host.sessionSlots.isRowClaimed(s)||this.host.isRowOwnedByLivePeer(s)||!Be(s,this.host.sessionNow())))}isRecoverablePersistedSession(s){return Boolean(s&&s.source!==Ta&&(!s.release_reason||Ys(s.release_reason))&&DN(s,this.host.sessionNow())&&!Be(s,this.host.sessionNow()))}isNameReissueOnlyRow(s){return Boolean(s?.release_reason&&!Ys(s.release_reason)&&this.isReissuablePersistedSession(s))}async terminalizeExpiredPersistedSession(s,n){let a=this.host.sessionNow();if(!s)return s;if(Be(s,a)&&this.host.isRowOwnedByLivePeer(s))return s;if(Ny(s,a)==="restart-recovery-timeout")return this.terminalizeRestartRecoveryHandoff(s,n);if(Ny(s,a)===void 0||s.release_reason&&(rr(s.release_reason)||im(s.release_reason).releasedBeforeHandout))return s;await this.host.deviceSessionRepository.markReleased(s.session_uuid,"expired",a,{reason:"expired",...s.stable_identity_generation===void 0?{}:{expectedRowGeneration:s.stable_identity_generation},onlyIfExpiredAtMs:this.host.sessionClockToWall(a),onlyIfOwnedByDaemon:n});let d=await this.readPersistedSession(s.session_uuid);if(this.confirmPersistedExpiry(s,d,"expired"),!this.isReissuablePersistedSession(d))this.restartRecoveryActivityAt.delete(s.session_uuid);return d}async terminalizeDeviceRestartHandoffForStop(s){let n=await this.readPersistedSession(s);if(!n||!j(n)||this.host.sessions.has(s)||this.host.isSessionBeingRecreated(s)||this.host.daemonSessionId===void 0||n.daemon_session_id!==this.host.daemonSessionId)return e.warn(`[SessionManager] Cannot terminalize stopped restart holder ${s}: row is no longer this daemon's handoff`),!1;let a=await this.terminalizeRestartRecoveryHandoff({...n},this.host.daemonSessionId,"device-killed"),d=a?.release_reason==="device-killed"&&a.stable_identity_generation===n.stable_identity_generation;if(!d)e.warn(`[SessionManager] Stopped restart holder ${s} terminal row write was not confirmed`);return d}async terminalizeRestartRecoveryHandoff(s,n,a="restart-recovery-timeout"){let d;try{d=this.host.rowWriteLivePeerDaemonSessionIds()}catch(S){return e.warn(`[SessionManager] Cannot prove ownership to expire restart recovery for ${s.session_uuid}: ${r(S)}`,S),s}let c=this.host.releaseSnapshotFromPersisted(s.session_uuid,s,a);c.releasedAtMs=this.host.sessionNow();let h=a==="device-killed"?0:nm;await this.host.persistSessionRelease(c,!1,{expectedRowGeneration:s.stable_identity_generation??0,onlyIfRecoverable:!0,onlyIfOwnedByDaemon:n??s.daemon_session_id??void 0,unlessTerminalOrOwnedByLivePeer:{livePeerDaemonSessionIds:d,reportRefusal:!0},onlyIfRestartRecoveryHandoff:{releasedAtOrBeforeMs:this.host.sessionClockToWall(c.releasedAtMs-h),recoveryWindowMs:h}});let p=await this.readPersistedSession(s.session_uuid);return this.confirmPersistedExpiry(s,p,a),p}confirmPersistedExpiry(s,n,a){if(this.host.sessionSlots.hasTerminalSnapshot(s.session_uuid)||n?.release_reason!==a||n.stable_identity_generation!==s.stable_identity_generation)return;let d=a==="expired"?this.expiredReleaseFromPersisted(s.session_uuid,n):this.terminalReleaseFromPersisted(s.session_uuid,n);if(d)this.host.sessionSlots.setTerminalSnapshot(s.session_uuid,d),this.restartRecoveryActivityAt.delete(s.session_uuid),this.host.notifySessionRelease(d,{upgradeOnly:!0})}terminalReleaseFromPersisted(s,n){if(!n.release_reason||!rr(n.release_reason))return;return this.host.releaseSnapshotFromPersisted(s,n,n.release_reason)}expiredReleaseFromPersisted(s,n){if(n.release_reason&&(rr(n.release_reason)||im(n.release_reason).releasedBeforeHandout))return;let a=this.host.isRowOwnedByLivePeer(n)?!Vd(n.liveness_policy)&&n.expires_at_ms<=this.host.sessionNow()?"expired":void 0:Ny(n,this.host.sessionNow());if(!a)return;return{...this.host.releaseSnapshotFromPersisted(s,n,a),terminal:!0}}unadmittedSessionError(s,n,a,d){if(d==="read-only")return a;let c=n&&this.expiredReleaseFromPersisted(s,n);return c?new Jt(s,c):a}}class at{host;constructor(s){this.host=s}async recoverPersistedSession(s,n,a,{listed:d,...c}){if(this.host.isLapsedUnownedRestartRecovery(d))d=await this.host.admitPersistedSession(s,d);let h=d&&this.host.isReissuablePersistedSession(d)?await this.claimRecoverableRow(s,d):void 0;try{return await this.host.recoverPersistedRow(s,n,a,{persisted:h?.row??d,...c})}catch(p){if(h)await this.releaseFailedRecoveryClaim(s,h);throw p}}async claimRecoverableRow(s,n){let a=this.host.daemonSessionId,d=this.host.deviceSessionRepository.claimRecoverableSession.bind(this.host.deviceSessionRepository);if(a===void 0)return;let c=await this.tryClaimRecoverableRow(s,n,d,a);if(c)return c;let h=await this.host.readPersistedSession(s);if(this.host.isLapsedUnownedRestartRecovery(h))h=await this.host.admitPersistedSession(s,h);let p=h&&this.host.terminalReleaseFromPersisted(s,h);if(p)throw this.host.sessionSlots.setTerminalSnapshot(s,p),new Jt(s,p);if(h&&this.host.isReissuablePersistedSession(h)){let S=await this.tryClaimRecoverableRow(s,h,d,a);if(S)return S}throw this.recoverableRowClaimRefusal(s,h??n)}async tryClaimRecoverableRow(s,n,a,d){let c=n.daemon_session_id??null;if(c!==null&&c!==d&&this.isLiveDaemonSession(c))throw this.recoverableRowClaimRefusal(s,n);let h=await a(s,{rowGeneration:n.stable_identity_generation??0,daemonSessionId:c},d);if(h===void 0)return;let p={...n,stable_identity_generation:h,daemon_session_id:d};return this.host.sessionSlots.markRowClaimed(p),{row:p,previousOwner:c===d?null:c}}recoverableRowClaimRefusal(s,n){let a=n.daemon_session_id??null;if(a!==null&&a!==this.host.daemonSessionId)return e.info(`[SessionManager] Not recovering session ${s}: another AutoMobile daemon (${a}) took its row first`),new Gt(n.device_id,void 0);return e.info(`[SessionManager] Not recovering session ${s}: its row changed during recovery (now ${n.status}, ${n.release_reason??"no release reason"})`),new t(`Session ${s} is no longer recoverable: its persisted row changed during recovery. Retry, or acquire a new device with getAndroid or getApple.`)}async releaseFailedRecoveryClaim(s,n){let a=this.host.deviceSessionRepository.releaseRecoverableSessionClaim.bind(this.host.deviceSessionRepository);if(this.host.sessions.has(s)||this.host.sessionSlots.hasTerminalSnapshot(s))return;try{if(await a(s,{rowGeneration:n.row.stable_identity_generation??0,daemonSessionId:n.row.daemon_session_id??null},n.previousOwner))e.info(`[SessionManager] Recovery of session ${s} failed; handed its row back to ${n.previousOwner??"no owner"} so another recovery can take it`)}catch(d){e.warn(`[SessionManager] Failed to hand back the claim on session ${s}: `+r(d),d)}}isLiveDaemonSession(s){if(!this.host.liveDaemonSessionIds)return!1;try{return this.host.liveDaemonSessionIds().has(s)}catch(n){return e.warn(`[SessionManager] Cannot list live daemons to check row owner ${s}: `+r(n),n),!1}}recoverySessionFields(s){if(!s)return{};return{persistenceMetadata:{source:s.source,autolockEnabled:s.autolock_enabled===1,mcpSessionId:s.mcp_session_id,daemonSessionId:this.host.recoveredRowOwner()},...s.release_reason===$I?{recoveredFromUncleanDaemonExit:!0}:{},...s.liveness_owner_token?{livenessOwnerToken:s.liveness_owner_token,livenessOwnershipClaims:new Set([s.liveness_owner_token]),lastOwnerHeartbeat:this.host.sessionNow()}:{}}}async assignUnseenSessionToDevicePool(s,n,a,{recoveryTarget:d,persisted:c}={}){try{await n.assignDeviceToSession(s,a,d)}catch(h){e.debug(`[SessionManager] Recovery assignment refused for ${s}: ${r(h)}`);let p=h instanceof Gt&&d?new Zl(s,d,"owned-by-other-daemon",{deviceId:h.deviceId,ownerPid:h.ownerPid}):h;if(!c||!ji(p)||p.sessionUuid!==s)throw h;if(!this.host.isNameReissueOnlyRow(c))throw await this.host.terminalizePersistedRecoveryFailure(s,c,p),h;e.info(`[SessionManager] Re-issuing session ${s} on another device: its previous device ${c.device_id} cannot be reused (${p.reason})`),await n.assignDeviceToSession(s,a??c.platform)}}async recoveryTargetFromPersisted(s,n,a,d){if(!n||!this.host.isReissuablePersistedSession(n))return;let c=He(n);if(!c&&this.host.isNameReissueOnlyRow(n))return;if(!c)throw await this.host.terminalizePersistedRecoveryFailure(s,n,{terminalReleaseReason:"identity-recovery-identity-continuity-lost"}),new t(`Cannot safely recover session ${s}: its persisted device identity is unavailable. Acquire a new device with getAndroid or getApple.`);if(a&&a!==n.platform)throw new t(`Cannot safely recover session ${s}: requested platform ${a} does not match persisted platform ${n.platform}. Acquire a new device with getAndroid or getApple.`);return{platform:n.platform,stableDeviceId:c,deviceId:n.device_id,restartRecoveryDeadlineMs:q(n,d),liveness:this.host.recoveryLivenessFromPersisted(n),persistenceMetadata:{source:n.source,autolockEnabled:n.autolock_enabled===1,mcpSessionId:n.mcp_session_id,daemonSessionId:this.host.recoveredRowOwner()},...n.release_reason===$I?{recoveredFromUncleanDaemonExit:!0}:{},...n.platform==="android"?{androidEmulator:ce(n.device_id)}:{}}}recoveryLivenessFromPersisted(s){let n=Ws(s.heartbeat_timeout_source),a=Us(s.liveness_policy),d=Ji(s),c=d&&{...d,heartbeatTimeoutMs:this.currentDefaultLease(d.heartbeatTimeoutMs,d.heartbeatTimeoutSource),sessionTimeoutMs:this.currentDefaultIdleWindow(d.sessionTimeoutMs)};if(a===Xn)return{sessionTimeoutMs:Bt(s.session_timeout_ms),heartbeatTimeoutMs:this.currentDefaultLease(s.heartbeat_timeout_ms,n),heartbeatTimeoutSource:n,hasReceivedHeartbeat:s.has_received_heartbeat===1,livenessPolicy:a};let h=this.currentDefaultIdleWindow(s.session_timeout_ms);if(a==="cli-idle"){let p=s.heartbeat_timeout_ms===Qi?Math.min(up(),Uw):s.heartbeat_timeout_ms;return{sessionTimeoutMs:Math.max(h,p),heartbeatTimeoutMs:p,heartbeatTimeoutSource:n,hasReceivedHeartbeat:s.has_received_heartbeat===1,livenessPolicy:a,...c?{preCliLiveness:c}:{}}}return{sessionTimeoutMs:h,heartbeatTimeoutMs:this.currentDefaultLease(s.heartbeat_timeout_ms,n),heartbeatTimeoutSource:n,hasReceivedHeartbeat:s.has_received_heartbeat===1,livenessPolicy:a,...c?{preCliLiveness:c}:{}}}currentDefaultLease(s,n){return n==="default"?oc():s}currentDefaultIdleWindow(s){return s===Yi?this.host.SESSION_TIMEOUT_MS:s}}class lt{host;constructor(s){this.host=s}rehydrationFollowUpTimer=null;rehydrationSkipReason(s){if(this.host.sessions.has(s))return"already-live";if(this.host.sessionSlots.hasAssignment(s))return"already-pending";return}registerRehydrationRecovery(s,n,a,d){let c=this.host.newSharedAssignment(s),h=this.host.recoverPersistedSession(s,n,a.platform,{listed:a,initialOwnership:"awaiting-owner",shared:c}).finally(()=>{if(c.recoveryWait.resolve(void 0),this.host.sessionSlots.getAssignment(s)===h)this.host.sessionSlots.deleteAssignment(s),this.host.sessionSlots.deleteShared(s)});return this.host.sessionSlots.setAssignment(s,h),this.host.waitForSharedAssignment(s,h,void 0,d)}async rehydratePersistedSessions(s,n={}){let a=n.deadlineMs??NI,d=Math.max(1,n.concurrency??s4),c=this.host.sessionNow()+a,h={rehydrated:[],terminalized:[],skipped:[],timedOut:!1};await this.host.applyRecoveredTerminalReleaseIntents(c);let p=(await this.host.listRecoverableSessionsBeforeDeadline(c,h)).map((b)=>this.host.recoveredIntents.withRecoveredTerminalRelease(b));await this.reserveDevicesForRehydration(p,s,c);let S=[],R=0,g=!1,w=async()=>{while(!g&&R<p.length){let b=R++,A=await this.host.rehydratePersistedRow(p[b],s,n.signal);if(this.releaseRehydrationReservation(p[b].session_uuid,s),g)this.logLateRehydrationOutcome(p[b].session_uuid,A);else S[b]=A}};if(this.host.sessionNow()<c&&p.length>0){let b=Symbol("startup-deadline"),A=Promise.all(Array.from({length:Math.min(d,p.length)},w));g=await l(A,{timer:this.host.timer,timeoutMs:Math.max(0,c-this.host.sessionNow()),label:"Session rehydration",timeoutError:()=>b}).catch((T)=>{if(T!==b)throw T;return b})===b}else g=p.length>0;let y=p.slice(R);R=p.length;for(let b of y)this.releaseRehydrationReservation(b.session_uuid,s);for(let[b,A]of p.entries())this.recordRehydrationOutcome(h,A,S[b]);if(g&&!h.timedOut){h.timedOut=!0;let b=h.skipped.filter(({reason:A})=>A==="startup-deadline").length;e.warn(`[SessionManager] Startup rehydration deadline reached; skipped ${b} rows due to startup-deadline`)}return this.scheduleRehydrationFollowUp(y,s,d),e.info(`[SessionManager] Rehydration: ${h.rehydrated.length} rehydrated, ${h.terminalized.length} terminalized, ${h.skipped.length} skipped`),h}async reserveDevicesForRehydration(s,n,a){let d=n.reserveDevicesForRehydration?.bind(n),c=s.flatMap((p)=>{let S=He(p);if(S===void 0||!this.host.isRecoverablePersistedSession(p)||this.rehydrationSkipReason(p.session_uuid)!==void 0)return[];return[{sessionId:p.session_uuid,target:{platform:p.platform,stableDeviceId:S,deviceId:p.device_id,...p.platform==="android"?{androidEmulator:ce(p.device_id)}:{}}}]});if(!d||c.length===0||this.host.sessionNow()>=a)return;let h=d(c);try{await l(h,{timer:this.host.timer,timeoutMs:Math.max(0,a-this.host.sessionNow()),label:"Session rehydration device reservation"})}catch(p){e.warn(`[SessionManager] Could not reserve devices for rehydration: ${r(p)}`,p);let S=()=>{for(let R of c)n.releaseRehydrationReservation?.(R.sessionId)};S(),h.then(S,()=>{return})}}releaseRehydrationReservation(s,n){let a=()=>n.releaseRehydrationReservation?.(s),d=this.host.sessionSlots.getAssignment(s);if(d)d.then(a,a);else a()}recordRehydrationOutcome(s,n,a){let d=n.session_uuid;if(a?.kind==="rehydrated")s.rehydrated.push(d);else if(a?.kind==="terminalized")s.terminalized.push({sessionUuid:d,reason:a.reason});else if(a)s.skipped.push({sessionUuid:d,reason:a.reason});else if(!this.host.isRecoverablePersistedSession(n))s.skipped.push({sessionUuid:d,reason:"not-recoverable"});else if(this.host.sessions.has(d))s.skipped.push({sessionUuid:d,reason:"already-live"});else s.skipped.push({sessionUuid:d,reason:"startup-deadline"})}logLateRehydrationOutcome(s,n){if(e.info(`[SessionManager] Rehydration of ${s} finished after the startup deadline: ${n.kind}${n.kind==="rehydrated"?"":` (${n.reason})`}`),n.kind!=="rehydrated"||!this.host.lateRehydrationListener)return;this.host.lateRehydrationListener([s]).catch((a)=>{e.warn(`[SessionManager] Late rehydration hook failed for ${s}: ${r(a)}`,a)})}scheduleRehydrationFollowUp(s,n,a){let d=s.filter((c)=>this.host.isRecoverablePersistedSession(c)&&!this.host.sessions.has(c.session_uuid));if(d.length===0)return;if(this.rehydrationFollowUpTimer)this.host.timer.clearTimeout(this.rehydrationFollowUpTimer);this.rehydrationFollowUpTimer=this.host.timer.setTimeout(()=>{this.rehydrationFollowUpTimer=null,this.runRehydrationFollowUp(d,n,a)},0)}async runRehydrationFollowUp(s,n,a){e.info(`[SessionManager] Follow-up rehydration of ${s.length} deadline-skipped rows`);let d=0,c=async()=>{while(d<s.length){let h=s[d++];this.logLateRehydrationOutcome(h.session_uuid,await this.host.rehydratePersistedRow(h,n))}};await Promise.all(Array.from({length:Math.min(a,s.length)},c))}}class dt{host;constructor(s){this.host=s}async rebindSession(s,n,a,d={}){let c=this.host.sessions.get(s);if(this.host.assertTerminalRebindAdmission(s,d.terminalReleaseReservationOwner),!c)return await this.host.createSession(s,n,a,{stableDeviceId:d.stableDeviceId,signal:d.signal});if(c.assignedDevice===n&&!d.force)return this.host.notifyDeviceOwnershipChange(n),c;let h=this.host.sessionSlots.getRebind(s);if(h)return await h.promise,await this.host.rebindSession(s,n,a,d);let p=this.host.sessionSlots.getReleaseOp(s);if(p?.session===c)throw await p.promise,Error(`Cannot rebind released session ${s}.`);this.host.flushDeferredRebindCleanups({sessionId:s});let S=this.host.persistAndPublishRebind(c,n,a,{stableDeviceId:d.stableDeviceId??c.stableDeviceId,deferCleanup:d.deferCleanup,recovery:d.recovery===!0}),R={session:c,promise:S};this.host.sessionSlots.setRebind(s,R),this.host.slotShadowProbe.check(s,"rebind-start");try{return await S}catch(g){if(!(g instanceof U))throw g;return await this.host.rejectRefusedRebind(c,R,g)}finally{if(this.host.sessionSlots.getRebind(s)===R)this.host.sessionSlots.deleteRebind(s),this.host.slotShadowProbe.check(s,"rebind-end")}}async rebindSessionForTerminalReleaseRecovery(s,n,a){let d=this.host.sessionSlots.getTerminalReservation(s.sessionId);if(d?.session!==s)throw Error(`Session ${s.sessionId} has no matching terminal release reservation.`);return await this.host.rebindSession(s.sessionId,n,a,{force:!0,recovery:!0,terminalReleaseReservationOwner:d.owner})}flushDeferredRebindCleanups(s={}){for(let[n,a]of this.host.sessionSlots.deferredCleanups)if((s.sessionId===void 0||s.sessionId===a.sessionId)&&(s.deviceId===void 0||s.deviceId===a.deviceId))n.commit()}deferRebindOverrides(s,n,a){let d=Promise.withResolvers(),c="deferred",h=!1,p=Xl+Sr,S=this.host.deviceHealth?.incarnation(s.assignedDevice),R=()=>{let I=this.host.getSessionForDevice(s.assignedDevice);return(I===null||I===s.sessionId)&&(S===void 0||this.host.deviceHealth?.incarnation(s.assignedDevice)===S)},g=`rebind:${s.sessionId}:${s.assignedDevice}`,w=()=>{this.host.timer.clearTimeout(k),this.host.stateRestore.stopIosAppNetworkLease(g),this.host.sessionSlots.deleteDeferredCleanup(A)},y=()=>{if(h)return;h=!0,w(),this.host.timer.clearTimeout(T),d.resolve()},b=(I=!1)=>{if(h||c!=="deferred"&&!(I&&c==="cancelled"))return;if(c="started",w(),!R()){e.warn(`Not restoring rebound device ${s.assignedDevice}: runtime changed or reassigned`),y();return}let O=Promise.resolve().then(()=>Je(async()=>{let D=await this.restoreRebindOverrides(s,R);this.host.trackPendingTeardownCleanup(s.assignedDevice,D),await Promise.allSettled(D)})).catch((D)=>{e.warn(`Deferred rebind cleanup failed on ${s.assignedDevice}: ${r(D)}`,D)});this.host.registerPendingDeviceCleanup(s.assignedDevice,O),y()},A={settled:d.promise,get retained(){return c==="cancelled"},commit:()=>b(),cancel:()=>{if(c==="started"||c==="rebound")return!1;if(c==="deferred")c="cancelled",w();return!0},finish:(I)=>{if(h)return;if(c==="cancelled")if(I==="rebound")c="rebound",y();else b(!0);else if(c==="deferred")A.commit()},resumeRetainedState:()=>{if(c==="cancelled")n()}},k=this.host.timer.setTimeout(A.commit,Xl);k.unref?.();let T=this.host.timer.setTimeout(()=>{if(c==="cancelled")e.warn(`Deferred rebind cleanup deadline on ${s.assignedDevice} after ${p}ms: undo did not finish in time`),b(!0);else b()},p);if(T.unref?.(),this.host.sessionSlots.setDeferredCleanup(A,{sessionId:s.sessionId,deviceId:s.assignedDevice}),a)this.host.stateRestore.startIosAppNetworkLease(g,a,()=>c==="deferred"&&this.host.getSessionForDevice(s.assignedDevice)===null);return this.host.registerPendingDeviceCleanup(s.assignedDevice,d.promise,p),A}async restoreRebindOverrides(s,n=()=>!0){let a=s.assignedDevice,d=[...this.host.stateRestore.hasPendingIme(a)?[()=>this.host.stateRestore.restorePendingImeForRebind(a,n)]:[],()=>this.host.stateRestore.restoreKeepScreenAwakeBestEffort(s),()=>this.host.stateRestore.restoreBiometricEnrollmentBestEffort(s),async()=>{let h=this.host.stateRestore.networkConditionRestoreTarget(s);if(!h)return{pending:null};return{pending:(await this.host.stateRestore.runUnderTeardownShield(async()=>[{...await this.host.stateRestore.restoreNetworkConditionBestEffort(s),abandon:()=>this.host.stateRestore.abandonCappedRestore(h,"network-condition")}]))[0]??null}},()=>this.host.stateRestore.getPendingClockRestoration(s,null),()=>this.host.stateRestore.getPendingRotationRestoration(s,null),()=>this.host.stateRestore.getPendingScreenReaderRestoration(s,null)],c=[];for(let h of d){if(!n())break;let p=await h();if(p.pending)c.push(p.pending)}return c}createReboundSession(s,n,a,{stableDeviceId:d,recovery:c=!1}={}){return{...s,mutationRecorder:void 0,assignedDevice:n,...c&&n!==s.assignedDevice?{deviceGeneration:(s.deviceGeneration??0)+1,previousDeviceId:s.assignedDevice}:{},stableDeviceId:d,platform:a,cacheData:s.cacheData.deviceLabels===void 0?{}:{deviceLabels:s.cacheData.deviceLabels}}}}function Lr(s,n){return rr(s)&&!(n.supersededReasons??[]).includes(s)}class ct{host;constructor(s){this.host=s}async reassertSupersededLiveRow(s){if(!this.host.isCurrentSession(s))return!1;if(this.isRebindUnderWay(s))return this.oweSupersededRowReassert(s),!1;let n=s.assignedDevice,a=this.host.superseded.expectReassert(s.sessionId);try{await this.host.persistSession(s,s,this.supersededRowRewriteOptions())}catch(d){if(e.warn(`[SessionManager] Failed to re-persist live session ${s.sessionId} after an overlapping row write: ${r(d)}`,d),this.host.sessions.get(s.sessionId)===s)this.oweSupersededRowReassert(s);return!1}finally{a()}if(this.host.isCurrentSession(s)&&(this.isRebindUnderWay(s)||s.assignedDevice!==n))return this.oweSupersededRowReassert(s),!1;return this.host.superseded.settle(s),await this.restoreReleasedRowAfterReassert(s),this.host.isCurrentSession(s)}supersededRowRewriteOptions(s){return{rewriteOverSupersededRelease:{livePeerDaemonSessionIds:this.rowWriteLivePeerDaemonSessionIds(),expectedRowGeneration:s}}}rowWriteLivePeerDaemonSessionIds(){return Array.from(this.host.liveDaemonSessionIds?.()??[]).filter((s)=>s!==this.host.daemonSessionId)}guardedRowRewriteOptions(s){return{rewriteOverSupersededRelease:{expectedRowGeneration:s,livePeerDaemonSessionIds:[],ownDaemonSessionId:this.host.daemonSessionId}}}async retryRefusedRowWrite(s,n,a,{write:d,writingReleaseReason:c,...h}){let p=(S)=>{let R=(w)=>({row:w,guard:h.resolveRowGeneration?{...a,expectedRowGeneration:h.resolveRowGeneration(w)}:a}),g=h.resolveRowGeneration&&this.host.awaitInFlightOwnRowWrites(h.incarnation,S,a.expectedRowGeneration);return g?g.then(()=>this.host.readSessionRow(n)).then(R):R(S)};for(let S=0;S<2;S++){let{row:R,guard:g}=await p(await this.host.readSessionRow(n));if(this.rowWritePermanentlyRefused(R,g,c,h.unlessDaemonShutdown))throw s;if(R?.daemon_session_id&&R.daemon_session_id!==this.host.daemonSessionId)return await d({...g,ownDaemonSessionId:void 0,livePeerDaemonSessionIds:this.rowWriteLivePeerDaemonSessionIds()});if(S===1)break;e.debug(`[SessionManager] Retrying writable row after statement miss for ${n}`);try{return await d(g)}catch(w){if(!(w instanceof U)&&!(w instanceof _))throw w;e.debug(`[SessionManager] Reclassifying row write failure for ${n}`,w),s=w}}throw new t(`Session ${n} row stayed writable after two statement misses; retry its write.`)}rowWritePermanentlyRefused(s,n,a,d){if(!s)return a!==void 0;if(n.expectedRowGeneration!==void 0&&s.stable_identity_generation!==n.expectedRowGeneration)return!0;if(n.unlessReleased&&s.status==="released")return!0;let c=s.release_reason;if(!c)return!1;if(a!==void 0&&u4(c,a))return!0;if(d&&c==="daemon-shutdown")return!0;return Lr(c,n)}isRebindUnderWay(s){return this.host.sessionSlots.getRebind(s.sessionId)?.session===s}async restoreReleasedRowAfterReassert(s){let n=s.sessionId,a=this.host.sessionSlots.getTerminalSnapshot(n);if(!a){if(this.host.sessions.get(n)!==s)this.host.trackReleaseDrainWrite(this.restoreNonTerminalRowAfterReassert(s));return}if(this.host.sessions.get(n)===s&&this.host.volatileTerminalReleaseIntents.get(n)!==a.releaseReason)return;try{await this.host.persistSessionRelease(a)}catch(d){e.warn(`[SessionManager] Failed to re-persist the terminal release of session ${n} after a live-row rewrite: ${r(d)}`,d),this.host.trackReleaseDrainWrite(this.retryTerminalRowAfterRelease(n));return}}async retryTerminalRowAfterRelease(s){await this.waitOutReleaseOf(s);let n=this.host.sessionSlots.getTerminalSnapshot(s);if(!n)return;if(this.host.isSessionBeingRecreated(s)){e.warn(`[SessionManager] The terminal release of session ${s} is not persisted and is not retried: the session is still held behind its fence`);return}this.host.scheduleTerminalReleaseRetry(n)}async retryNonTerminalRowAfterRelease(s){await this.waitOutReleaseOf(s.sessionId),this.host.scheduleTerminalReleaseRetry(s)}async restoreNonTerminalRowAfterReassert(s){let n=s.sessionId;await this.waitOutReleaseOf(n);let a=this.releaseThatEnded(s);if(!a||a.terminal)return;let d=this.host.persistedRowGenerations.get(s);if(d===void 0&&this.host.isSessionBeingRecreated(n))return;let c={...a};this.host.captureReleaseRowGeneration(c,d??this.host.releaseRowGenerations.get(a));try{await this.host.persistSessionRelease(c)}catch(h){e.warn(`[SessionManager] Failed to re-persist the ${a.releaseReason} release of session ${n} after a live-row rewrite: ${r(h)}`,h)}}releaseThatEnded(s){return this.host.finalizedSessionReleases.get(s)?.finalizedSnapshot??this.host.sessionSlots.getForcedNonTerminal(s)}async waitOutReleaseOf(s){let n=this.host.sessionSlots.getReleaseOp(s);if(!n||n.forced)return;try{await l(n.promise,{timer:this.host.timer,signal:n.forcedAbort?.signal,label:"Session release"})}catch(a){e.debug(`[SessionManager] Release of session ${s} failed or was forced while a row write waited on it: ${r(a)}`)}}async waitOutRecreationOf(s){for(;;){let n=this.host.sessionSlots.getAssignment(s)??this.host.sessionSlots.getCreation(s)?.promise;if(!n)return;try{await n}catch(a){e.debug(`[SessionManager] Issue of session ${s} failed while a row write waited on it: ${r(a)}`)}if(await Promise.resolve(),n===(this.host.sessionSlots.getAssignment(s)??this.host.sessionSlots.getCreation(s)?.promise))return}}async waitOutRebindOf(s){let n=this.host.sessionSlots.getRebind(s.sessionId);if(n?.session!==s)return;try{await n.promise}catch(a){e.debug(`[SessionManager] Rebind of session ${s.sessionId} failed while a row write waited on it: ${r(a)}`)}}oweSupersededRowReassert(s){this.host.superseded.owe(s,this.host.supersededRowReassertRetries)}async retryOwedSupersededRowReassert(s){let{session:n}=s,a=n.sessionId,d=()=>this.host.superseded.owed(a)===s;if(!d())return!1;if(!this.host.isCurrentSession(n))return this.host.superseded.drop(s),!1;let c;try{c=await this.host.readPersistedSession(a)}catch(h){return e.warn(`[SessionManager] Failed to read the row of live session ${a} before re-persisting it: ${r(h)}`,h),this.host.superseded.defer(s),!1}if(!d())return!1;if(!this.host.isCurrentSession(n))return this.host.superseded.drop(s),!1;if(this.supersededRowReassertMustStop(s,c))return this.host.superseded.drop(s),!1;if(this.host.sessionSlots.isReleasing(n)||this.isRebindUnderWay(n))return this.host.superseded.defer(s),!1;return await this.reassertSupersededLiveRow(n)}supersededRowReassertMustStop(s,n){if(!n)return!1;if(this.host.isRowOwnedByLivePeer(n))return e.warn(`[SessionManager] Dropping owed rewrite of session ${s.session.sessionId}: live peer ${n.daemon_session_id} owns its row`),!0;return this.host.terminalReleaseFromPersisted(s.session.sessionId,n)!==void 0}async reassertOwedLiveRowForActivity(s){let n=this.host.superseded.owed(s.sessionId);if(n?.session!==s||n.handle!==void 0)return!1;return await this.retryOwedSupersededRowReassert(n)}async retryOwedSupersededRowReassertDuringDrain(s){await this.waitOutRebindOf(s.session),await this.waitOutReleaseOf(s.session.sessionId),await this.retryOwedSupersededRowReassert(s)}}class Qe extends _{}class ut{host;constructor(s){this.host=s}releaseRowGenerations=new WeakMap;releaseRowSessions=new WeakMap;captureReleaseRowGeneration(s,n){if(n!==void 0)this.releaseRowGenerations.set(s,n)}releaseWritePrecondition(s){let n=this.releaseRowGenerations.get(s);return{...n===void 0?{}:{expectedRowGeneration:n},...!s.terminal&&s.releaseReason!=="daemon-shutdown"?{unlessDaemonShutdown:!0}:{},unlessTerminalOrOwnedByLivePeer:{livePeerDaemonSessionIds:[],ownDaemonSessionId:this.host.daemonSessionId,reportRefusal:!0,supersededReasons:s.terminal?[...this.host.superseded.predecessors(s)]:[]}}}resolveTerminalReleaseWrite(s,n,a,d){let c=n.unlessTerminalOrOwnedByLivePeer;return this.host.retryRefusedRowWrite(d,s.sessionId,{...c,expectedRowGeneration:n.expectedRowGeneration},{write:(h)=>a({...n,expectedRowGeneration:h.expectedRowGeneration,unlessTerminalOrOwnedByLivePeer:h}),writingReleaseReason:s.releaseReason,unlessDaemonShutdown:n.unlessDaemonShutdown,incarnation:this.releaseRowSessions.get(s)?.deref(),resolveRowGeneration:(h)=>{let p=this.releaseRowSessions.get(s)?.deref(),S=this.host.sessions.get(s.sessionId);return p!==void 0&&(!S||S===p)&&!this.host.sessionSlots.hasCreation(s.sessionId)&&!this.host.sessionSlots.hasAssignment(s.sessionId)&&h?.stable_identity_generation!==void 0&&this.host.persistedRowGenerations.get(p)===h.stable_identity_generation?h.stable_identity_generation:n.expectedRowGeneration}})}releaseRowFallback(s,n,a){let d=n.unlessTerminalOrOwnedByLivePeer,c;return(h)=>{if(!(h instanceof _)||h instanceof Qe)throw h;if(s.terminal)return c??=this.resolveTerminalReleaseWrite(s,n,a,h);if(d.ownDaemonSessionId===void 0)throw h;return c??=this.host.retryRefusedRowWrite(h,s.sessionId,{...d,expectedRowGeneration:n.expectedRowGeneration},{write:(p)=>a({...n,unlessTerminalOrOwnedByLivePeer:p}),writingReleaseReason:s.releaseReason,unlessDaemonShutdown:n.unlessDaemonShutdown})}}issueReleaseRow(s,n){if(this.host.sessionSlots.getTerminalSnapshot(s.sessionId)!==s&&!this.host.rowWriter.canIssueRelease(s))return Promise.reject(new Qe(s.sessionId));return this.host.deviceSessionRepository.markReleased(s.sessionId,Hy(s.releaseReason),s.releasedAtMs,{reason:s.releaseReason,...n})}handleReleaseWriteFailure(s,n,a){if(s instanceof _)return e.debug(`[SessionManager] Release row refused for ${n.sessionId}`),this.confirmReleaseWrite(n),!0;if(e.warn(`[SessionManager] Failed to mark session released (${n.releaseReason}): ${s}`),!n.terminal&&!this.host.sessions.has(n.sessionId)){if(this.recordPendingNonTerminalRelease(n),!this.shouldSurfaceReleasePersistenceFailure(n,a))this.trackReleaseDrainWrite(this.host.retryNonTerminalRowAfterRelease(n))}if(this.shouldSurfaceReleasePersistenceFailure(n,a))throw u(s,`Failed to persist ${n.terminal?"terminal":"non-terminal"} release for session ${n.sessionId}`);return!1}trackLateReleaseWrite(s,n){let a=s.then(()=>{this.confirmReleaseWrite(n)},(d)=>{if(d instanceof _){e.debug(`[SessionManager] Late release row refused for ${n.sessionId}`),this.confirmReleaseWrite(n);return}if(e.warn(`[SessionManager] Late session release write failed: ${r(d)}`),n.terminal)this.trackReleaseDrainWrite(this.host.retryTerminalRowAfterRelease(n.sessionId))});this.trackReleaseDrainWrite(a)}liftTerminalFence(s,n,a=!1,d){this.host.forcedStuckRelease.liftTerminalFence(s,n,a,d)}confirmReleaseWrite(s){if(s.terminal)this.liftTerminalFence(s.sessionId,s,!0);else if(this.host.rowWriter.pendingNonTerminalReleases().get(s.sessionId)===s)this.host.rowWriter.deletePendingNonTerminalRelease(s.sessionId);this.host.restartReleasePersistence.get(s)?.resolve()}dropReleaseRetry(s){if(this.host.rowWriter.cancelRetry(s),s.terminal)this.liftTerminalFence(s.sessionId,s,!0)}scheduleTerminalReleaseRetry(s){this.host.rowWriter.scheduleRetry(s,{isStillOwed:()=>this.host.isTerminalReleaseRetryCurrent(s),drop:()=>this.host.dropReleaseRetry(s),run:(n)=>this.host.retryTerminalReleaseWrite(n)})}trackReleaseDrainWrite(s){this.host.rowWriter.trackDrainWrite(s)}isTerminalReleaseRetryCurrent(s){if(!s.terminal)return this.host.rowWriter.pendingNonTerminalReleases().get(s.sessionId)===s;let n=this.host.sessionSlots.getTerminalSnapshot(s.sessionId);return n!==void 0&&n.releaseReason===s.releaseReason&&!this.isSessionBeingRecreated(s.sessionId)}async retryTerminalReleaseWrite(s){let{snapshot:n}=s;if(!await this.isReleaseRetryDue(s))return;try{let a=await this.prepareRetriedReleaseWrite(s);if(!a)return;let d=(w)=>this.issueReleaseRow(n,w),c=this.releaseRowFallback(n,a,d),h=()=>this.host.timer.monotonicNow?.()??this.host.timer.now(),p=h(),S=!1,R=d(a),g={timer:this.host.timer,timeoutMs:Cs,unref:!0,label:"Session release retry",timeoutError:()=>new F(n.sessionId,n.releaseReason,Cs),onTimeout:()=>{S=!0,R.catch(c).catch((w)=>{e.debug(`[SessionManager] Late release retry failed for ${n.sessionId}`,w)})}};try{await l(R,g)}catch(w){if(R=c(w),S)throw g.timeoutError();await l(R,{...g,timeoutMs:Math.max(0,Cs-(h()-p)),onTimeout:void 0})}}catch(a){if(a instanceof _){if(await this.wasRetriedReleaseWriteSkipped(s)){this.scheduleTerminalReleaseRetry(n);return}e.debug(`[SessionManager] Retried release row refused for ${n.sessionId}`),this.confirmReleaseWrite(n),this.host.dropReleaseRetry(n);return}if(e.warn(`[SessionManager] Retrying the ${n.releaseReason} release write of session ${n.sessionId} failed: ${r(a)}`),s.isCurrent())this.scheduleTerminalReleaseRetry(n);return}if(await this.wasRetriedReleaseWriteSkipped(s)){this.scheduleTerminalReleaseRetry(n);return}if(this.confirmReleaseWrite(n),s.isCurrent())this.host.rowWriter.cancelRetry(n)}async wasRetriedReleaseWriteSkipped(s){let{snapshot:n}=s;if(n.terminal||!s.isCurrent())return!1;try{let a=await this.host.readSessionRow(n.sessionId);return a!==void 0&&a.release_reason!==n.releaseReason&&s.isCurrent()&&this.host.isRecoverablePersistedSession(a)&&!this.host.isRowOwnedByLivePeer(a)&&!this.isSessionBeingRecreated(n.sessionId)}catch(a){return e.warn(`[SessionManager] Failed to read the row of session ${n.sessionId} after retrying its ${n.releaseReason} release: ${r(a)}`,a),!1}}isReleaseRetryStillOwed(s){let{snapshot:n}=s;if(!s.isCurrent())return!1;if(!this.host.isTerminalReleaseRetryCurrent(n))return this.host.dropReleaseRetry(n),!1;return!0}async isReleaseRetryDue(s){let{snapshot:n}=s;if(!this.isReleaseRetryStillOwed(s))return!1;if(n.terminal||!this.isSessionBeingRecreated(n.sessionId))return!0;if(!s.shutdownAttempted)return this.scheduleTerminalReleaseRetry(n),!1;return await this.host.waitOutRecreationOf(n.sessionId),this.isReleaseRetryStillOwed(s)}async prepareRetriedReleaseWrite(s){let{snapshot:n}=s,a=await this.retriedReleaseWritePrecondition(n);return s.isCurrent()?a:void 0}async retriedReleaseWritePrecondition(s){let n=this.releaseWritePrecondition(s);if(n.expectedRowGeneration===void 0)return n;let a=await this.host.readSessionRow(s.sessionId);if(!a||a.stable_identity_generation===void 0||!this.host.isRecoverablePersistedSession(a)||this.host.isRowOwnedByLivePeer(a)||this.isSessionBeingRecreated(s.sessionId))return n;return{...n,expectedRowGeneration:a.stable_identity_generation}}retryPendingTerminalReleasesNow(){return this.host.rowWriter.retryPendingNow()}isSessionBeingRecreated(s){return Te(Re(this.host.getLegacyLifecycleView(),s))}shouldSurfaceReleasePersistenceFailure(s,n){return s.terminal||n||yo(s.releaseReason)}recordPendingNonTerminalRelease(s){this.host.rowWriter.recordPendingNonTerminalRelease(s)}fenceTerminalRelease(s){return this.host.sessionSlots.setTerminalSnapshot(s.sessionId,s),this.host.restartRecoveryActivityAt.delete(s.sessionId),this.host.recordTerminalReleaseIntent(s,!0)}async persistTerminalReleaseIfNeeded(s){if(!s.terminal)return;this.host.sessionSlots.setTerminalSnapshot(s.sessionId,s),this.host.restartRecoveryActivityAt.delete(s.sessionId),await this.host.persistSessionRelease(s)}}class ht{host;constructor(s){this.host=s}issuedActivityWrites=new WeakMap;persistedRowGenerations=new WeakMap;inFlightOwnRowWrites=new WeakMap;activityRowRePersists=new rt;async persistSession(s,n,a,d){let c=()=>{d?.(),d=void 0},h=(S)=>{let R=this.host.rowWriter.upsertLive({sessionUuid:s.sessionId,deviceId:s.assignedDevice,stableDeviceId:s.stableDeviceId,platform:s.platform,source:s.persistenceMetadata?.source??"session-manager",autolockEnabled:s.persistenceMetadata?.autolockEnabled,mcpSessionId:s.persistenceMetadata?.mcpSessionId,daemonSessionId:this.host.daemonSessionId??s.persistenceMetadata?.daemonSessionId,createdAtMs:s.createdAt,lastUsedAtMs:s.lastUsedAt,expiresAtMs:s.expiresAt,sessionTimeoutMs:s.sessionTimeoutMs,heartbeatTimeoutMs:s.heartbeatTimeoutMs,heartbeatTimeoutSource:s.heartbeatTimeoutSource,hasReceivedHeartbeat:s.hasReceivedHeartbeat,livenessPolicy:s.livenessPolicy,preCliHeartbeatTimeoutMs:s.preCliLiveness?.heartbeatTimeoutMs,preCliHeartbeatTimeoutSource:s.preCliLiveness?.heartbeatTimeoutSource,preCliSessionTimeoutMs:s.preCliLiveness?.sessionTimeoutMs},this.host.sessionNow(),S),g=this.inFlightOwnRowWrites.get(n)??new Set;this.inFlightOwnRowWrites.set(n,g),g.add(R);let w=()=>{if(g.delete(R),g.size===0)this.inFlightOwnRowWrites.delete(n);c()};return R.then((y)=>{this.recordPersistedRowGeneration(n,y),w()},w),R},p=a?.rewriteOverSupersededRelease;try{await h(a)}catch(S){if(!(S instanceof U)||p?.ownDaemonSessionId===void 0)throw S;await this.host.retryRefusedRowWrite(S,s.sessionId,p,{write:(R)=>h({...a,rewriteOverSupersededRelease:R})})}await this.host.rowWriter.replaceLiveOwnership(s.sessionId,s.livenessOwnerToken??null)}awaitInFlightOwnRowWrites(s,n,a){if(!s||n?.stable_identity_generation===a||this.persistedRowGenerations.get(s)===n?.stable_identity_generation)return;let d=this.inFlightOwnRowWrites.get(s);if(!d?.size)return;return Promise.allSettled(d).then((c)=>{for(let h of c)if(h.status==="rejected")e.debug("[SessionManager] Own row write rejected during terminal release",h.reason)})}recordPersistedRowGeneration(s,n){if(typeof n==="number")this.persistedRowGenerations.set(s,n)}async recordSessionActivity(s){let n=qs(s),a={key:Ks(n)};this.issuedActivityWrites.set(s,a);try{await this.persistSessionActivity(s,n)}catch(d){if(this.issuedActivityWrites.get(s)===a)this.issuedActivityWrites.delete(s);if(d instanceof Jt)throw d;throw new Ie(s.sessionId,d)}}async persistSessionActivity(s,n){try{await this.host.rowWriter.recordLiveActivity(s.sessionId,n);return}catch(d){if(!(d instanceof W))throw d}if(!this.host.isAdmittedForAutomation(s)){e.debug(`[SessionManager] Activity for released session ${s.sessionId} skipped`);return}e.warn(`[SessionManager] Session ${s.sessionId} is live but its row is not active; re-persisting it`);let a=this.rePersistSessionActivity(s);this.host.trackReleaseDrainWrite(a.then(()=>{},()=>{e.debug(`[SessionManager] Activity repair settled for ${s.sessionId}`)})),await a}async rePersistSessionActivity(s){try{let n=s.assignedDevice;if(await this.activityRowRePersists.run(s,()=>this.persistSession(s,s,{unlessTerminal:!0,rewriteOverSupersededRelease:{...this.host.guardedRowRewriteOptions(this.persistedRowGenerations.get(s)).rewriteOverSupersededRelease,unlessReleased:!0}},()=>this.activityRowRePersists.delete(s))),this.host.isCurrentSession(s)&&(this.host.isRebindUnderWay(s)||s.assignedDevice!==n))this.host.oweSupersededRowReassert(s);else if(this.host.sessions.get(s.sessionId)!==s&&!this.host.sessionSlots.hasTerminalSnapshot(s.sessionId))this.host.trackReleaseDrainWrite(this.host.restoreNonTerminalRowAfterReassert(s))}catch(n){if(!(n instanceof oe)&&!(n instanceof U))throw n;await this.handleActivityRowRefusal(s,n)}}async handleActivityRowRefusal(s,n){if(!this.host.isCurrentSession(s)){let d=this.host.sessionSlots.getTerminalSnapshot(s.sessionId);if(d)throw new Jt(s.sessionId,d);e.debug(`[SessionManager] Superseded activity row refused for ${s.sessionId}`);return}if(await this.host.reassertOwedLiveRowForActivity(s))return;let a=await this.endSessionTerminallyReleasedInRow(s);throw a instanceof Jt?a:n}async endSessionTerminallyReleasedInRow(s){let n=s.sessionId;if(this.host.superseded.isReassertPending(n))return new W(n);let a=await this.host.getPersistedTerminalRelease(n);if(!a||this.host.superseded.isReassertPending(n))return new W(n);let d=a.releaseReason;if(this.host.isAdmittedForAutomation(s)){if(e.warn(`[SessionManager] Session ${n} is live but its row was terminally released (${d}); releasing it`),Xi(d))this.host.cancelExecutionsCutByRelease(n,d);await this.host.releaseSessionForReason(n,d,{allowExpired:!0,expiryOrigin:"lazy-expiry"})}return new Jt(n,this.host.sessionSlots.getTerminalSnapshot(n)??a)}hasUnissuedActivity(s){return this.issuedActivityWrites.get(s)?.key!==Ks(qs(s))}}function pt(s){return Math.max(s.lastUsedAt,s.idleStallForgivenAt??Number.NEGATIVE_INFINITY)}function Qf(s){if(s.livenessPolicy==="cli-idle")return pt(s)+s.heartbeatTimeoutMs;return s.expiresAt}class mt{host;constructor(s){this.host=s}expireIfDue(s,n,a,d=!0){if(this.host.stallProbe?.(),this.host.sessionSlots.hasTerminalSnapshot(s))return null;let c=this.host.sessions.get(s);if(!c)return null;let h=a&&this.executionOnSessionClock(a);if(n){if(this.isLateExecutionWhileEarlierWorkIsActive(c,h,"timely-control"))return c;if(this.isLateExecutionWhileEarlierWorkIsActive(c,h,"recovery"))throw new ge(s,c.assignedDevice)}if(this.shouldExpireSession(c,n,h)){if(!d)return null;return this.releaseExpiredSessionLazily(c,a?.executionId),null}return c}releaseExpiredSessionLazily(s,n){if(this.host.sessionSlots.isReleasing(s))return;let a=s.sessionId;e.info(`Session ${a} has expired, found by lookup, releasing`);let d=this.expiredSessionReleaseReason(s);this.cancelExecutionsOverriddenByExpiry(s,d,n);let c=this.host.releaseSession(a,d,{allowExpired:!0,expiryOrigin:"lazy-expiry"});this.host.getBarrier().trackExisting(c).catch((h)=>e.warn(`[SessionManager] Failed to release expired session ${a}: ${h}`))}releaseSessionPastIdleDeadline(s,n){let a=this.host.sessions.get(s);if(a&&!this.host.sessionSlots.hasTerminalSnapshot(s)&&this.isSessionExpired(a))this.releaseExpiredSessionLazily(a,n)}observeSessionForRead(s,n){if(this.host.deviceHeldForLateRead(s,n)!==void 0)return null;return this.host.unlessBaseEnded(this.expireIfDue(s,!0,n,!1))}deviceHeldForLateRead(s,n){let a=this.host.sessions.get(s);if(!a||this.host.sessionSlots.hasTerminalSnapshot(s))return;let d=n&&this.executionOnSessionClock(n);return this.isLateExecutionWhileEarlierWorkIsActive(a,d)?a.assignedDevice:void 0}executionOnSessionClock(s){return{...s,sessionClockStartTime:s.sessionClockStartTime??this.host.wallToSessionClock(s.startTime)}}shouldExpireSession(s,n,a){return n?this.isSessionExpiredForNewExecution(s,a):this.isSessionExpired(s)}ownershipSessionUuid(s){return _B(s,{getDeviceLabels:(n)=>this.host.peekSession(n)?.cacheData.deviceLabels})}livenessOwnerView(s){let n=s.livenessOwnerToken,a=n===void 0||s.livenessPolicy==="cli-idle"?"none":G(is(s,this.host.sessionNow(),Y(s)&&(this.host.livenessOwnerCallInFlightReader?.(n)??!1))).phase;return{ownerToken:n,hold:a}}getOwnerLeaseHold(s){let n=this.host.sessions.get(s),a=n?this.host.liveness.livenessBaseSession(n):void 0,d=n&&a&&Ki(this.livenessOwnerView(n),this.livenessOwnerView(a))==="base"?a:n;if(!d||d.livenessPolicy==="cli-idle")return;return Ht(is(d,this.host.sessionNow(),Y(d)&&(this.host.livenessOwnerCallInFlightReader?.(d.livenessOwnerToken)??!1)))}getSessionLeaseState(s){let n=this.host.sessions.get(s);if(!n||n.livenessPolicy==="cli-idle")return;return G(de(n,this.host.sessionNow()))}isSessionSuspect(s){return Kl(s.livenessPolicy)&&G(de(s,this.host.sessionNow())).phase==="suspect"}assertSessionNotSuspect(s,n){if(n!=="read-only"&&this.isSessionSuspect(s)){let{remainingMs:a}=G(de(s,this.host.sessionNow()));throw new Z(s.sessionId,a)}}isOwnerLeaseLapsed(s){return le(s)&&Ly(s)>0&&nq(this.host.sessionNow(),this.host.judgedLeaseHeartbeat(s),s.heartbeatTimeoutMs,Ly(s))}ownerLeaseAwaitsReap(s){let n=this.host.peekSession(s);return n!==null&&this.isOwnerLeaseLapsed(n)&&!this.host.activeSessionExecutionChecker(s,{excludeReads:!0})}judgedLeaseHeartbeat(s){let n=Fy(s),a=this.host.ownershipSessionUuid(s.sessionId),d=a===s.sessionId?this.host.getBaseSessionOfDerivedLabel(s.sessionId):a,c=this.host.liveness.livenessBaseSession(s)??(d===void 0?void 0:this.host.getReleasingSession(d));if(!c||!le(c)||c.livenessOwnerToken===void 0||c.livenessOwnerToken!==s.livenessOwnerToken)return n;let h=this.host.sessionSlots.getReleaseOp(c.sessionId);return Math.max(n,Fy(c),h?.session===c?h.ownerHeartbeatDuringRelease??Number.NEGATIVE_INFINITY:Number.NEGATIVE_INFINITY)}creditOwnerHeartbeatDuringRelease(s,n){let a=this.host.getReleasingSession(s),d=this.host.sessionSlots.getReleaseOp(s);if(!a||d?.session!==a||d.forced||d.judgeSuspectOwnerAtCommit!==!0||!d4(d.reason.value)||n.length===0||a.livenessOwnerToken!==n)return;let c=this.releaseOwnerLeaseSnapshot(a,d);if(c&&G(c).phase!=="lapsed")d.ownerHeartbeatDuringRelease=c.now}releaseOwnerLeaseSnapshot(s,n){if(!le(s)||Ly(s)===0)return;let a=de(s,this.host.sessionNow());return a.lastHeartbeat=Math.max(this.host.judgedLeaseHeartbeat(s),n?.ownerHeartbeatDuringRelease??Number.NEGATIVE_INFINITY),a}judgeOwnerLeaseForRelease(s,n,a,d){if(a==="commit"&&d?.judgeSuspectOwnerAtCommit!==!0||!d4(n.value))return!1;let c=this.releaseOwnerLeaseSnapshot(s,d);if(!c)return!1;let{phase:h}=G(c);if(h==="lapsed")this.host.upgradeReleaseReason(n,"heartbeat-timeout");return h==="suspect"}async refuseControlCallOnLapsedOwnerLease(s,n,a,d){if(n==="read-only"||!this.isOwnerLeaseLapsed(s))return;let c=a?.executionId??d,h={excludeReads:!0,...c===void 0?{}:{excludeExecutionId:c}};if(this.host.activeSessionExecutionChecker(s.sessionId,h))throw new Z(s.sessionId,0);e.info(`Session ${s.sessionId} lost its owner's heartbeat lease before this call; releasing`),this.host.cancelExecutionsCutByRelease(s.sessionId,"heartbeat-timeout",c),await this.host.releaseSession(s.sessionId,"heartbeat-timeout",{allowExpired:!0,expiryOrigin:"lazy-expiry"});let p=this.host.sessionSlots.getTerminalSnapshot(s.sessionId)??await this.host.getPersistedTerminalRelease(s.sessionId);if(p)throw new Jt(s.sessionId,p);throw new Z(s.sessionId,0)}async refuseLabelCallOnLapsedBaseLease(s,n,a,d){if(n==="read-only"||s.persistenceMetadata?.source!==Ta)return;let c=this.host.getBaseSessionOfDerivedLabel(s.sessionId),h=c===void 0?void 0:this.host.sessions.get(c);if(!h||!this.isOwnerLeaseLapsed(h))return;try{await this.refuseControlCallOnLapsedOwnerLease(h,n,a,d)}catch(p){if(p instanceof Jt)throw new Jt(s.sessionId,this.host.terminalReleaseAsOfNow(s,p.release.releaseReason));throw p}}forgiveMintBoundClaimLease(s,n,a,d){if(Y(s)&&(d===void 0||DI(s.livenessOwnerBoundAt,s.heartbeatTimeoutMs,d)))s.livenessOwnerBoundAt=OI(s.livenessOwnerBoundAt,n,a)}isSessionExpired(s){if(Vd(s.livenessPolicy))return!1;if(s.livenessPolicy==="cli-idle")return!1;if(this.host.sessionNow()<=Qf(s))return!1;return!qt({hasActiveExecutions:this.host.activeSessionExecutionChecker(s.sessionId,{excludeReads:!0}),now:this.host.sessionNow(),...this.idleExecutionVetoBoundInput(s)})}idleExecutionVetoBoundInput(s){return{vetoedSince:Qf(s),latestDeadlineMs:this.host.sessionExecutionDeadlineLookup(s.sessionId,{excludeReads:!0})}}getIdleReleaseExecutionVeto(s){if(!this.host.sessions.get(s))return;let a={excludeReads:!0};if(!this.host.activeSessionExecutionChecker(s,a))return;return{latestDeadlineMs:this.host.sessionExecutionDeadlineLookup(s,a)}}cancelExecutionsOverriddenByExpiry(s,n,a){return this.host.cancelExecutionsCutByRelease(s.sessionId,n,a)}cancelExecutionsCutByRelease(s,n,a){let d=a===void 0?{}:{excludeExecutionId:a};if(!this.host.activeSessionExecutionChecker(s,d))return!1;let c=this.host.sessions.get(s)??this.host.getReleasingSession(s);return this.host.expiryReleaseExecutionCanceller(s,new ac(s,n,c?me(c):void 0),d,c?.assignedDevice),!0}expiredSessionReleaseReason(s){if(Ly(s)>0&&G(de(s,this.host.sessionNow())).phase==="lapsed")return"heartbeat-timeout";return s.livenessPolicy==="cli-idle"?"cli-idle-timeout":jN}isSessionExpiredForNewExecution(s,n){if(Vd(s.livenessPolicy))return!1;if(n===void 0)return this.isSessionExpired(s);let a=Qf(s);if(this.host.sessionNow()<=a)return!1;return n.sessionClockStartTime>a}isLateExecutionWhileEarlierWorkIsActive(s,n,a="any"){if(Vd(s.livenessPolicy))return!1;let d=Qf(s);return n!==void 0&&this.host.sessionNow()>d&&n.sessionClockStartTime>d&&this.host.activeSessionExecutionChecker(s.sessionId,{...a==="timely-control"?{sessionClockStartedAtOrBefore:d,liveOnSessionClock:{at:this.host.sessionNow(),undatedForMs:By}}:{},...a==="recovery"?{recoveryOnly:!0}:{},excludeExecutionId:n.executionId,excludeReads:!0})}}class Rt{host;constructor(s){this.host=s}updateSessionCache(s,n){let a=this.host.findSession(s);if(!a){e.warn(`Cannot update cache for session ${s}: not found`);return}if(a.cacheData={...a.cacheData,...n},"deviceLabels"in n)Er.emit("tools");e.debug(`Updated cache for session ${s}`)}setLastHierarchy(s,n){this.host.updateSessionCache(s,{lastHierarchy:n,lastObserveTime:this.host.sessionNow()})}setLastRenderedObservation(s,n,a){this.host.updateSessionCache(s,{lastRenderedObservation:n,lastRenderedDisplayGeneration:n.display?.generation,lastRenderedDisplayKey:n.display?.key,...a===void 0?{}:{lastRenderedDisplayRevision:a}})}getLastActionMetadata(s,n){let a=this.host.findSession(s)?.cacheData.lastActionMetadata;return a?.deviceId===n?a.blocks:void 0}setLastActionMetadata(s,n,a){this.host.updateSessionCache(s,{lastActionMetadata:{deviceId:n,blocks:a}})}getLastRenderedObservation(s){return this.host.findSession(s)?.cacheData.lastRenderedObservation}setLastRenderedDisplayRevision(s,n,a,d){this.host.updateSessionCache(s,{lastRenderedDisplayRevision:n,lastRenderedDisplayGeneration:d,...a===void 0?{}:{lastRenderedDisplayKey:a}})}getLastRenderedDisplayGeneration(s){return this.host.findSession(s)?.cacheData.lastRenderedDisplayGeneration}setDisplayPin(s,n){if(this.host.updateSessionCache(s,{displayPin:n??void 0}),n===null){let a=this.host.findSession(s);if(a)delete a.cacheData.displayPin}}getDisplayPin(s){return this.host.findSession(s)?.cacheData.displayPin}getLastRenderedDisplayKey(s){return this.host.findSession(s)?.cacheData.lastRenderedDisplayKey}getLastRenderedDisplayRevision(s){return this.host.findSession(s)?.cacheData.lastRenderedDisplayRevision}getKeepScreenAwake(s){return this.host.findSession(s)?.cacheData.keepScreenAwake}setDeviceReadiness(s,n){let a=this.host.getDeviceReadiness(s);if(a!==void 0&&$q(a)>=$q(n))return;this.host.updateSessionCache(s,{deviceReadiness:n})}getDeviceReadiness(s){return this.host.findSession(s)?.cacheData.deviceReadiness}invalidateAutomationReadiness(s,n){if(!this.host.findSession(s)){e.debug(`[SessionManager] Cannot invalidate readiness for unknown session ${s}`);return}e.warn(`[SessionManager] Invalidating automation readiness for ${s}: ${n}`),this.host.updateSessionCache(s,{deviceReadiness:"booted"})}invalidateAutomationReadinessForDevice(s,n){let a=this.host.getSessionForDevice(s);if(a)this.host.invalidateAutomationReadiness(a,n)}resetDeviceReadinessForDevice(s){let n=this.host.getSessionForDevice(s);if(!n)return;this.host.updateSessionCache(n,{deviceReadiness:"booted"})}setClock(s,n){s.cacheData.clock??=n}getClock(s){return this.host.findSession(s)?.cacheData.clock}getKeepAwakeRestoreReport(s){return this.host.stateRestore.getKeepAwakeRestoreReport(s)}trackClockSessionSetup(s,n){return this.host.stateRestore.trackClockSessionSetup(s,n)}runClockMutationExclusive(s,n){return this.host.stateRestore.runClockMutationExclusive(s,n)}setRotation(s,n){s.cacheData.rotation??=n}getRotation(s){return this.host.findSession(s)?.cacheData.rotation}trackRotationSessionSetup(s,n){return this.host.stateRestore.trackRotationSessionSetup(s,n)}runRotationMutationExclusive(s,n){return this.host.stateRestore.runRotationMutationExclusive(s,n)}trackScreenReaderSessionSetup(s,n){return this.host.stateRestore.trackScreenReaderSessionSetup(s,n)}setScreenReader(s,n){s.cacheData.screenReader??=n}getScreenReader(s){return this.host.findSession(s)?.cacheData.screenReader}runScreenReaderMutationExclusive(s,n){return this.host.stateRestore.runScreenReaderMutationExclusive(s,n)}setBiometricEnrollment(s,n){if(this.host.getBiometricEnrollment(s))return;this.host.updateSessionCache(s,{biometricEnrollment:n})}getBiometricEnrollment(s){return this.host.findSession(s)?.cacheData.biometricEnrollment}setNetworkCondition(s,n){if(this.host.getNetworkCondition(s))return;this.host.updateSessionCache(s,{networkCondition:n})}bumpNetworkConditionGeneration(s){return this.host.stateRestore.bumpNetworkConditionGeneration(s)}runNetworkConditionMutationExclusive(s,n){return this.host.stateRestore.runNetworkConditionMutationExclusive(s,n)}getNetworkCondition(s){return this.host.findSession(s)?.cacheData.networkCondition}getDeviceLabels(s){return this.host.peekSession(s)?.cacheData.deviceLabels}getSessionCache(s){return this.host.findSession(s)?.cacheData??null}clearSessionCache(s,n){let a=this.host.findSession(s);if(!a)return;if(n)delete a.cacheData[n];else a.cacheData=a.cacheData.displayPin===void 0?{}:{displayPin:a.cacheData.displayPin};if(!n||n==="deviceLabels")Er.emit("tools");e.debug(`Cleared cache for session ${s}${n?` (key: ${n})`:" (all)"}`)}}class ft{host;constructor(s){this.host=s}creditControlCallFailedOnRestartRecovery(s,n){if(n==="acquire"&&!this.host.sessions.has(s)&&this.host.restartRecoveryActivityAt.has(s))this.host.recordRestartRecoveryActivity(s)}resolveSessionAcquisitionOptions(s){return typeof s==="string"?{access:s}:{...s,access:s.access??"acquire"}}async startOrJoinUnseenAssignment(s,n,a,d){try{return await this.joinOrStartUnseenAssignment(s,n,a,d)}catch(c){throw this.creditControlCallFailedOnRestartRecovery(s,d.access),c}}async joinOrStartUnseenAssignment(s,n,a,{requireIssuedSession:d,access:c,requestDeadlineMs:h,signal:p}){let S=this.host.sessionSlots.getAssignment(s);if(S){if(c==="acquire"&&this.host.restartRecoveryActivityAt.has(s))this.host.recordRestartRecoveryActivity(s);let y=this.host.sessionSlots.getShared(s);if(y?.controller.signal.aborted)return await this.waitForAbortedAssignment(S,y,h,p),await this.host.getOrCreateSession(s,n,a,{requireIssuedSession:d,access:c,requestDeadlineMs:h,signal:p});let b=await this.waitForSharedAssignment(s,S,h,p);if(c==="acquire"&&b.ownership==="awaiting-owner")b.ownership="owned",b.awaitingOwnerSince=void 0;return b}let R=this.host.sessionSlots.getCreation(s);if(R)return await R.promise;let g=this.newSharedAssignment(s),w=this.createUnseenSession(s,n,a,{requireIssuedSession:d,shared:g}).finally(()=>{if(g.recoveryWait.resolve(void 0),this.host.sessionSlots.getAssignment(s)===w)this.host.sessionSlots.deleteAssignment(s),this.host.sessionSlots.deleteShared(s),this.host.slotShadowProbe.check(s,"assignment-end")});return this.host.sessionSlots.setAssignment(s,w),this.host.slotShadowProbe.check(s,"assignment-start"),await this.waitForSharedAssignment(s,w,h,p)}newSharedAssignment(s){let n={controller:new AbortController,waiters:0,recoveryWait:Promise.withResolvers()};return this.host.sessionSlots.setShared(s,n),n}async waitForAbortedAssignment(s,n,a,d){let c=s.then(()=>{},(p)=>{e.debug("[SessionManager] Aborted session assignment settled",p)}),h=await n.recoveryWait.promise;await l(c,{timer:this.host.timer,timeoutMs:a!==void 0&&Number.isFinite(a)?Math.max(0,this.host.wallToSessionClock(a)-(h?.responseMarginMs??0)-this.host.sessionNow()):void 0,signal:d,label:"Session restart recovery",timeoutError:h?.timeoutError})}async waitForSharedAssignment(s,n,a,d){let c=this.host.sessionSlots.getShared(s);if(!c)return await n;c.waiters++;let h=!0,p=()=>{if(!h)return;if(h=!1,c.waiters--,c.waiters===0)c.controller.abort(new t("Session recovery has no remaining callers"))};try{if((a===void 0||!Number.isFinite(a))&&!d)return await n;let S=await l([c.recoveryWait.promise,n.then(()=>{return})],{timer:this.host.timer,label:"Session recovery wait configuration"});if(!S)return await n;let R=a!==void 0&&Number.isFinite(a)?this.host.wallToSessionClock(a)-S.responseMarginMs:void 0;return await l(n,{timer:this.host.timer,timeoutMs:R!==void 0&&R<(S.restartDeadlineMs??1/0)?Math.max(0,R-this.host.sessionNow()):void 0,signal:d,label:"Session restart recovery",timeoutError:S.timeoutError,onTimeout:p})}finally{p()}}async admitIssuedSessionForAutomation(s,n,a={}){let d;try{if(a.access==="read-only"){let p=this.host.observeSessionForRead(s,n);if(p)return p;if(this.host.sessions.has(s))return}return await this.host.getOrCreateSession(s,void 0,void 0,{...a,execution:n})}catch(p){if(!(p instanceof Uy))throw p;d=p}let c=await this.host.readPersistedSession(s),h=c&&this.host.terminalReleaseFromPersisted(s,c);if(h)throw this.host.sessionSlots.setTerminalSnapshot(s,h),new Jt(s,h);if(c&&this.host.isReissuablePersistedSession(c))return;throw this.host.unadmittedSessionError(s,c,d,a.access)}isLapsedUnownedRestartRecovery(s){return Boolean(s&&Ny(s,this.host.sessionNow())==="restart-recovery-timeout"&&!this.host.isRowOwnedByLivePeer(s))}async admitPersistedSession(s,n){n=await this.host.terminalizeExpiredPersistedSession(n);let a=n&&this.host.terminalReleaseFromPersisted(s,n);if(a)throw this.host.sessionSlots.setTerminalSnapshot(s,a),new Jt(s,a);if(!this.host.isReissuablePersistedSession(n))throw this.host.unadmittedSessionError(s,n,new Uy(`Session ${s} is not an active daemon session (not found). Acquire a device with getAndroid or getApple before using its sessionUuid.`));return n}async createUnseenSession(s,n,a,{requireIssuedSession:d,shared:c}){let h=await this.host.readPersistedSession(s);await this.host.refusePlanLabelSessionOutsideItsRun(s,h);let p=h?this.host.terminalReleaseFromPersisted(s,h):void 0;if(p)throw this.host.sessionSlots.setTerminalSnapshot(s,p),new Jt(s,p);let S=n&&this.isLapsedUnownedRestartRecovery(h);if((d||S)&&!this.host.isReissuablePersistedSession(h))h=await this.admitPersistedSession(s,h);if(!n)throw new Uy(`Session ${s} is not an active daemon session (not found). Acquire a device with getAndroid or getApple before using its sessionUuid.`);if(h&&j(h))this.host.recordRestartRecoveryActivity(s);return await this.host.recoverPersistedSession(s,n,a,{listed:h,initialOwnership:"owned",shared:c})}}function mn(s,n,a){let d=s.forcedStuckRelease.inFlightReleaseStillOwning(n);if(d)return{kind:"forced-in-flight",release:d};let c=s.sessionSlots.getTerminalSnapshot(n);if(c&&rr(a)){let g=s.sessionSlots.getTerminalReasonState(n);return{kind:"terminal-fenced",snapshot:c,reasonState:g}}let h=s.rowWriter.pendingNonTerminalReleases().get(n);if(h)return{kind:"row-pending",snapshot:h};let p=s.sessionSlots.getAssignment(n),S=s.sessionSlots.getCreation(n),R=p??S?.promise;return R?{kind:"pending-work",pendingSession:R}:{kind:"persisted-only"}}function Sn(s,n,a,d){let c=s.sessions.get(n);if(c===a&&c.assignedDevice===d)return"release";if(c)return"decline";if(s.sessionSlots.hasAssignment(n)||s.sessionSlots.hasCreation(n))return"decline";let h=s.sessionSlots.getReleaseOp(n);if(h)return h.session===a&&a.assignedDevice===d?"release":"decline";return"finalized"}function Nr(s){let n={...s};return delete n.expectedOwner,n}class gt{host;constructor(s){this.host=s}releaseSession(s,n="explicit-release",a={}){if(a.expectedOwner){let{expectedOwner:d,...c}=a;return this.releaseIfOwned(s,d,n,c)}return this.releaseSessionForReason(s,n,a)}async releaseSessionForReason(s,n,a={}){let{allowExpired:d=!1,commitFence:c,...h}=a,p=Nr(h),S=()=>this.releaseSessionAttempt(s,n,{allowExpired:d,commitFence:c},p);if(UI(n)){let R=this.host.recoveryExpiryReleaseHandler?.release(s,n,S,p);if(R)return await R}return await S()}async releaseSessionAttempt(s,n,{allowExpired:a,commitFence:d},c={}){let h=a||this.host.sessionSlots.hasTerminalSnapshot(s)?this.host.sessions.get(s)??null:this.host.expireIfDue(s,!1);if(!h)return await this.releaseUnpublishedSession(s,n,a);let p=this.host.sessionSlots.getReleaseOp(s);if(p?.session===h)return this.host.upgradeReleaseReason(p.reason,n),this.host.markIdentityReplacedRelease(p,c,d),await p.promise;let S=this.host.releaseDeviceHold?.(s);this.host.sessionSlots.markReleasing(h),this.host.slotShadowProbe.check(s,"release-start");let R=this.host.sessionSlots.getRebind(s),g=this.host.createReleaseReasonState(s,n),w=this.host.judgeOwnerLeaseForRelease(h,g,"start"),y={session:h,options:{...c},commitFenced:d!==void 0,promise:Promise.resolve(null),reason:g,judgeSuspectOwnerAtCommit:w,startedAtMs:this.host.sessionNow(),stuckDeadlineMs:BN(h.cacheData),expiryOrigin:c.expiryOrigin,forcedAbort:new AbortController},b=()=>(this.host.flushDeferredRebindCleanups({sessionId:s}),y.forced?this.host.finishReleaseForcedBeforeStart(h):this.host.releaseSessionInternal({sessionId:s,session:h,reason:g,shouldCommit:d,options:y.options,operation:y}));try{return y.promise=this.startReleaseWithDeviceHold(y,S,R,b),this.host.sessionSlots.setReleaseOp(s,y),this.host.sessionSlots.addActiveRelease(y),await y.promise}finally{if(this.host.finishIdentityReplacedRelease(y),this.host.sessionSlots.deleteActiveRelease(y),this.host.sessionSlots.getReleaseOp(s)===y)this.host.sessionSlots.deleteReleaseOp(s),this.host.slotShadowProbe.check(s,"release-end")}}startReleaseWithDeviceHold(s,n,a,d){if(n&&"skipDeviceWrites"in n)s.options.deviceIdentityReplaced=!0;if(this.host.markIdentityReplacedRelease(s),n&&"settled"in n)return this.startReleaseAwaitingOwnership(s,n,a,d);if(a?.session===s.session)return s.stage="awaiting-rebind",a.promise.then(d,d);return d()}startReleaseAwaitingOwnership(s,n,a,d){let{session:c}=s,h=c.sessionId;s.stage="awaiting-ownership",s.teardownStartsByMs=this.host.sessionNow()+n.capMs;let p=(S)=>{if(s.teardownStartsByMs=this.host.sessionNow(),S!=="teardown")s.options.deviceIdentityReplaced=!0,this.host.markIdentityReplacedRelease(s)};return n.settled.then(p,(S)=>{e.warn(`[SessionManager] Release ownership hold failed for ${h}`,S),p("skip-device-writes")}).then(()=>{if(a?.session===c)return s.stage="awaiting-rebind",a.promise.then(d,d);return d()})}async releaseSessionUnlessSuperseded(s,n,a={}){let{commitFence:d,...c}=a,h=!1,p=d===void 0?void 0:()=>{if(h||d()===!1)return h=!0,!1;return!0},S=await this.host.releaseSession(s,n,{...c,commitFence:p});return h?{superseded:!0}:{superseded:!1,deviceId:S}}async releaseIfOwned(s,{session:n,deviceId:a},d="explicit-release",c={}){let h=Sn(this.host,s,n,a);switch(h){case"release":return await this.host.releaseSession(s,d,c);case"decline":return null;case"finalized":return await this.releaseFinalizedSessionIfOwned(s,n,a,d);default:return h}}async releaseFinalizedSessionIfOwned(s,n,a,d){let c=this.host.finalizedSessionReleases.get(n);if(c?.finalizedSnapshot?.sessionId===s&&c.finalizedSnapshot.deviceId===a&&rr(d))return await this.host.releaseFinalizedSession(c,d);return null}async releaseUnpublishedSession(s,n,a){let d=mn(this.host,s,n);switch(d.kind){case"forced-in-flight":{let{release:c}=d;if(c.reason.finalizedSnapshot&&rr(n))return await this.host.releaseFinalizedSession(c.reason,n);return this.host.upgradeReleaseReason(c.reason,n),await c.promise}case"terminal-fenced":{let{snapshot:c,reasonState:h}=d;if(h)return await this.host.releaseFinalizedSession(h,n);return await this.host.persistSessionRelease(c),c.deviceId}case"row-pending":return await this.host.persistSessionRelease(d.snapshot,!0)?d.snapshot.deviceId:null;case"pending-work":return await this.releasePendingSessionWork(s,n,a,d.pendingSession);case"persisted-only":return await this.releasePersistedRestartRecovery(s,n);default:return d}}async releasePersistedRestartRecovery(s,n){if(rr(n)||n==="superseded"){let a=await this.host.readPersistedSession(s),d=a&&q(a);if(a&&this.host.isReissuablePersistedSession(a)&&d!==void 0&&this.host.sessionNow()<d){let c=this.host.terminalReleaseFromPersisted(s,{...a,release_reason:n==="superseded"?"identity-recovery-superseded":n,released_at_ms:this.host.sessionNow()});return await this.host.persistTerminalReleaseIfNeeded(c),this.host.notifySessionRelease(c,{upgradeOnly:!0}),c.deviceId}}if(n==="explicit-release"){let a=await this.releaseUnrecoveredReissuableRow(s);if(a!==void 0)return a}return e.warn(`Cannot release session ${s}: not found`),null}async releaseUnrecoveredReissuableRow(s){for(let n=0;n<2;n++){if(this.host.sessions.has(s))break;if(this.host.isSessionBeingRecreated(s))return await this.host.releaseSession(s,"explicit-release")??void 0;let a=await this.tryReleaseUnrecoveredReissuableRow(s);if(a!=="row-changed")return a}return}async tryReleaseUnrecoveredReissuableRow(s){let n=await this.host.readPersistedSession(s);if(!n?.release_reason||!this.host.isReissuablePersistedSession(n))return;if(this.isRowOwnedByLivePeer(n)){e.info(`[SessionManager] Not releasing session ${s}: another AutoMobile daemon (${n.daemon_session_id}) owns its row`);return}return await this.host.deviceSessionRepository.markReleased(s,Hy("explicit-release"),this.host.sessionNow(),{reason:"explicit-release",...n.stable_identity_generation===void 0?{}:{expectedRowGeneration:n.stable_identity_generation}}),await this.fenceExplicitlyReleasedRow(s)??"row-changed"}isRowOwnedByLivePeer(s){let n=s.daemon_session_id??null;return n!==null&&n!==this.host.daemonSessionId&&this.host.isLiveDaemonSession(n)}async fenceExplicitlyReleasedRow(s){let n=await this.host.readPersistedSession(s),a=n&&this.host.terminalReleaseFromPersisted(s,n);if(a?.releaseReason!=="explicit-release"){e.info(`[SessionManager] Session ${s} was not released: its row changed first (now ${n?.status??"missing"}, ${n?.release_reason??"no release reason"})`);return}return this.host.sessionSlots.setTerminalSnapshot(s,a),this.host.restartRecoveryActivityAt.delete(s),this.host.notifySessionRelease(a,{upgradeOnly:!0}),e.info(`[SessionManager] Released unrecovered session ${s} (explicit-release)`),a.deviceId}async releasePendingSessionWork(s,n,a,d){let c=this.host.sessionSlots.getReleaseRequest(s);if(c)return this.host.upgradeReleaseReason(c.reason,n),await c.promise;let h={value:n},p={promise:this.releaseAfterPendingSessionWork(s,h,a,d),reason:h};this.host.sessionSlots.setReleaseRequest(s,p);try{return await p.promise}finally{if(this.host.sessionSlots.getReleaseRequest(s)===p)this.host.sessionSlots.deleteReleaseRequest(s)}}async releaseAfterPendingSessionWork(s,n,a,d){try{return await l(d,{timer:this.host.timer,timeoutMs:Xl,unref:!0,label:"Release of a session still being created"}),await this.releaseSessionForReason(s,n.value,{allowExpired:a})}catch(c){return e.warn(`Session ${s} assignment failed before release: ${c}`),null}}}class vt{host;constructor(s){this.host=s}openPlanLabelMints(s,n){return this.host.planLabels.openPlanLabelMints(s,n)}creatorSourceForCreation(s,n){return this.host.planLabels.creatorSource(s,n,Ta)}liftPlanLabelFenceForMint(s){if(!this.host.planLabels.isMintableAndNotLive(s))return;this.host.planLabels.clearEndedBase(s),this.host.liftTerminalFence(s,void 0,!1,()=>{this.host.slotShadowProbe.check(s,"plan-label-fence-lifted"),this.host.sessionSlots.deleteTerminalReasonState(s)})}async refusePlanLabelSessionOutsideItsRun(s,n){if(n?.source!==Ta)return;if((!n.release_reason||Ys(n.release_reason))&&this.host.planLabels.isRunning(s))return;let d=Se(n)===void 0?await qe(s,n,(c)=>this.host.readPersistedSession(c)):void 0;throw new Jt(s,{...this.host.releaseSnapshotFromPersisted(s,n,n.release_reason??UN),...te(d),terminal:!0})}getBaseSessionOfDerivedLabel(s){return this.host.planLabels.getBaseSessionOfDerivedLabel(s)}liveBaseOfDerivedId(s){return this.host.planLabels.liveBaseOfDerivedId(s,(n)=>Boolean(this.host.peekSession(n)))}isLiveSessionOfSamePlan(s,n){return this.host.peekSession(s)!==null&&this.host.ownershipSessionUuid(s)===this.host.ownershipSessionUuid(n)||this.endedWithPlanOf(s,n)}endedWithPlanOf(s,n){let a=this.host.sessions.get(s),d=a&&this.host.endedBaseOfLabel(a);if(!d)return!1;let c=this.host.sessions.get(n);return n===d.baseSessionId||c!==void 0&&this.host.endedBaseOfLabel(c)?.baseSessionId===d.baseSessionId}takeDerivedLabelSessions(s,n){return this.host.planLabels.takeDerivedLabelSessions(s,n,rr,this.host.sessionSlots.getTerminalSnapshot(s)?.cliIdleTimeoutMs)}}class wt{host;constructor(s){this.host=s}retiredCreationRows=new WeakSet;async withinCreateDeadline(s,n,a,d){return await l(a,{timer:this.host.timer,timeoutMs:Xl,unref:!0,label:"Session creation",timeoutError:()=>new nk(s,n,Xl),onTimeout:()=>{e.warn(`[SessionManager] Creating session ${s} did not finish within ${Xl}ms (reason=${$N}); refusing it so the device and the assignment mutex are freed`),d?.()}})}async persistCreatedSession(s,n){try{await this.host.persistSession(s,s,n&&{claimedRow:n})}catch(a){if(!(a instanceof ne))throw a;let d=await this.host.readPersistedSession(s.sessionId),c=d&&this.host.terminalReleaseFromPersisted(s.sessionId,d);if(c)throw this.host.sessionSlots.setTerminalSnapshot(s.sessionId,c),new Jt(s.sessionId,c);let h=d?.daemon_session_id??null;if(h!==null&&h!==this.host.daemonSessionId)throw e.info(`[SessionManager] Not recovering session ${s.sessionId}: another AutoMobile daemon (${h}) took its row during the recovery`),new Gt(s.assignedDevice,void 0);throw a}}async persistAndPublishSession(s,n,a,d){try{return await this.publishSessionCreation(s,n,a,d)}catch(c){throw await this.rollBackFailedCreationRow(s,a),c}}async publishSessionCreation(s,n,a,d){let c=this.host.planLabels.isMinting(s.sessionId)?void 0:await this.host.getPersistedTerminalRelease(s.sessionId);if(c)throw this.host.sessionSlots.setTerminalSnapshot(s.sessionId,c),new Jt(s.sessionId,c);this.assertCreationNotAbandoned(s,n),await this.host.rejectCreationAfterShutdownFence(s,!1,a,d),await this.persistCreatedSession(s,a),await this.retireCreationIfAbandoned(s,n),await this.host.rejectCreationAfterShutdownFence(s,!0,a,d),this.host.assertTerminalReleaseAdmission(s.sessionId,s);let h=this.host.sessionSlots.getTerminalSnapshot(s.sessionId);if(h)throw await this.host.persistSessionRelease(h),new Jt(s.sessionId,h);this.host.invalidateFinalizedSessionIdentity(s.sessionId),this.host.rowWriter.deletePendingNonTerminalRelease(s.sessionId);let p=this.host.observerSessions?.list?.().find((S)=>S.sessionId===s.sessionId)?.clientName;if(p!==void 0&&s.clientName===void 0)s.clientName=p;if(this.host.observerSessions?.release(s.sessionId,"promotion"),s.persistenceMetadata?.source===Ta)this.host.planLabels.markRunning(s.sessionId);return this.host.sessions.set(s.sessionId,s),this.host.rowWriter.noteLive(s.sessionId),this.host.slotShadowProbe.check(s.sessionId,"published"),this.host.deviceSessionMap.set(s.assignedDevice,s.sessionId),this.host.cancelSessionlessUseOnAcquisition(s.assignedDevice,s.sessionId),this.host.notifyDeviceOwnershipChange(s.assignedDevice),this.host.notifySessionCreated(s),e.info(`Created session ${s.sessionId} with device ${s.assignedDevice}`),s}async rollBackFailedCreationRow(s,n){let a=this.host.persistedRowGenerations.get(s);if(a===void 0||this.host.sessions.get(s.sessionId)===s||this.retiredCreationRows.has(s)||this.host.sessionSlots.hasTerminalSnapshot(s.sessionId))return;this.retiredCreationRows.add(s);let d=this.host.creationRowRollbackSnapshot(s,n?.releaseReason??"allocation-rollback",n?.releasedAtMs);this.host.captureReleaseRowGeneration(d,a),await this.persistCreationRollback(d)}async persistCreationRollback(s){try{await this.host.persistSessionRelease(s)}catch(n){e.debug(`[SessionManager] Creation rollback remains owed: ${r(n)}`),this.host.trackReleaseDrainWrite(this.host.retryNonTerminalRowAfterRelease(s))}}assertCreationNotAbandoned(s,n){if(n?.abandoned)throw new nk(s.sessionId,s.assignedDevice,Xl)}async retireCreationIfAbandoned(s,n){if(n?.abandoned)await this.host.retireAbandonedCreation(s)}}class yt{host;constructor(s){this.host=s}async releaseSessionInternal(s){let{sessionId:n,session:a,reason:d,shouldCommit:c,options:h,operation:p}=s,S=(R)=>Zi(p,R);try{S("teardown"),this.host.stateRestore.cancelNetworkConditionExpiry(n),this.host.stateRestore.stopIosAppNetworkLease(n);let R=await this.host.stateRestore.drainReleaseTeardown(n,a,p,h);while(this.host.revokeSupersededIdentityReplacement(p))R=await this.host.stateRestore.drainReleaseTeardown(n,a,p,h);let g=a.assignedDevice;if(Gl(p))return null;if(Ae(c))return p.commitDeclined=!0,this.host.abandonSupersededRelease(n,g,R);let w=this.host.sessionNow();this.host.judgeOwnerLeaseForRelease(a,d,"commit",p);let y=this.host.sessionSlots.hasTerminalSnapshot(n),b=this.host.sessionSlots.getTerminalSnapshot(n),A=this.buildReleaseSnapshot(a,g,d.value,w),k=this.fenceTerminal(A,d,a,S),T="then"in k?await k:k;A=T.snapshot;let I=T.intent;while(this.host.revokeSupersededIdentityReplacement(p))R=await this.host.stateRestore.drainReleaseTeardown(n,a,p,h);if(Gl(p))return null;if(this.declinesAtFinalFence(I,c))return p.commitDeclined=!0,this.undoUncommittedFence(A,b,I,!1),this.host.abandonSupersededRelease(n,g,R,!y);if(!this.host.commitReleaseRemoval(n,a,g,R))return this.undoUncommittedFence(A,b,I,!0),null;this.host.commitReplacedDeviceTeardown(n,a,h,p),this.settleNonTerminalCommit(A);let O=this.startCommittedTerminalWrite(A,d,a,{intent:I,enter:S});this.host.notifySessionRelease(A,h),S("finalize-persist");let D;try{let C=O?await O:void 0,N=this.writtenOutcome(C,T);if(D=await this.host.completeReleasePersistence(N.snapshot,d,a,N.persisted),N.error!==void 0)throw N.error}catch(C){this.finalizeFailure(C,a,d,A)}return this.host.finishCommittedRelease(a,d,{releaseSnapshot:A,persistedSnapshot:D,pendingCleanup:R},h)}finally{this.host.sessionSlots.unmarkReleasing(a)}}startCommittedTerminalWrite(s,n,a,{intent:d,enter:c}){if(!s.terminal||d==="volatile")return;return c("terminal-persist"),this.persistCommittedTerminalRelease(s,n,a)}declinesAtFinalFence(s,n){return s!=="volatile"&&Ae(n)}writtenOutcome(s,n){return s??{snapshot:n.snapshot,persisted:n.persisted}}settleNonTerminalCommit(s){if(s.terminal)return;this.host.forcedStuckRelease.liftTerminalFenceIfPresent(s.sessionId),this.host.sessionSlots.deleteTerminalReasonState(s.sessionId)}finalizeFailure(s,n,a,d){throw a.finalizedSnapshot??=d,this.host.recordFinalizedSessionRelease(n,a),u(s,`Failed to finalize session ${n.sessionId} release`)}buildReleaseSnapshot(s,n,a,d){let{sessionId:c}=s,h={sessionId:c,deviceId:n,releaseReason:a,releasedAtMs:d,terminal:rr(a),...$e(s),...Ue(s,a,this.host.planLabels.retainedEndedBase(s.sessionId)),heartbeat:{lastHeartbeatMs:s.lastHeartbeat,hasReceivedHeartbeat:s.hasReceivedHeartbeat,timeoutMs:this.host.releaseHeartbeatTimeoutMs(a,s),ageMs:Math.max(0,d-s.lastHeartbeat)}};return this.host.releaseRowSessions.set(h,new WeakRef(s)),this.host.captureReleaseRowGeneration(h,this.host.persistedRowGenerations.get(s)),h}fenceTerminal(s,n,a,d){if(!s.terminal)return{snapshot:s,intent:void 0,persisted:!0};let c=this.host.fenceTerminalRelease(s);if(c!=="volatile")return{snapshot:s,intent:c,persisted:!0};return d("terminal-persist"),this.host.persistTerminalReleaseWithinDeadline(s,n,a).then((h)=>({snapshot:h.snapshot,intent:c,persisted:h.persisted}))}undoUncommittedFence(s,n,a,d){if(a!=="durable")return;if(n)this.restorePriorFence(s,n);else if(d&&this.host.sessionSlots.getTerminalSnapshot(s.sessionId)===s)this.host.liftTerminalFence(s.sessionId,s)}finishCommittedRelease(s,n,{releaseSnapshot:a,persistedSnapshot:d,pendingCleanup:c},h){let{sessionId:p,deviceId:S}=a;if(this.host.recordFinalizedSessionRelease(s,n),d!==a)this.host.notifySessionRelease(d,{...h,upgradeOnly:!0});return e.info(c.length>0?`Released session ${p}; device ${S} remains quarantined until teardown completes`:`Released session ${p}, freeing device ${S}`),S}commitReleaseRemoval(s,n,a,d){let c=this.host.removeSession(s,n);if(d.length>0)this.host.trackPendingTeardownCleanup(a,d);if(!c)e.warn(`Skipping release finalization for ${s}: session ownership changed`);return c}commitReplacedDeviceTeardown(s,n,a,d){if(!a.deviceIdentityReplaced)return;let c=d?.identityReplacement?.deviceId??n.assignedDevice;this.host.replacedRestoreGenerations.set(c,(this.host.replacedRestoreGenerations.get(c)??0)+1);let h=new Set;if(this.host.stateRestore.clockRestores.targets.has(c))h.add("clock");if(this.host.stateRestore.abandonedRotations.has(c)||this.host.stateRestore.rotationRestores.targets.has(c))h.add("rotation");if(this.host.stateRestore.abandonedScreenReaders.has(c)||this.host.stateRestore.screenReaderRestores.targets.has(c))h.add("screen-reader");if(this.host.dropReplacedDeviceRestoreState(n,h),this.host.retireRestorations(c,"removal"),h.size>0)e.warn(`Dropped restore state for session ${s} on replaced serial ${c}: ${[...h].join(", ")}`)}dropReplacedDeviceRestoreState(s,n){let a=[["keepScreenAwake","keep-awake"],["biometricEnrollment","biometric"],["networkCondition","network-condition"],["clock","clock"],["rotation","rotation"],["screenReader","screen-reader"]];for(let[d,c]of a)if(s.cacheData[d])n.add(c),delete s.cacheData[d]}async persistTerminalReleaseWithUpgrade(s,n,a,d=!1){if(await this.host.persistTerminalReleaseIfNeeded(s),n.value===s.releaseReason)return s;if(d&&this.host.sessionSlots.getTerminalSnapshot(s.sessionId)!==s)return s;let c=this.host.withReleaseReason(s,n.value,a);return await this.host.persistTerminalReleaseIfNeeded(c),c}async persistTerminalReleaseWithinDeadline(s,n,a,d=!1){try{return{snapshot:await this.host.persistTerminalReleaseWithUpgrade(s,n,a,d),persisted:!0}}catch(c){if(!(c instanceof F))throw c;let h=this.host.sessionSlots.getTerminalSnapshot(s.sessionId)??s;if(this.host.volatileTerminalReleaseIntents.get(h.sessionId)===h.releaseReason)e.warn(`Terminal release of session ${h.sessionId} has no crash-safe intent (volatile); freeing its device before the row lands can revive the UUID after a crash`,c);return e.warn(`Freeing device ${h.deviceId} of session ${h.sessionId} before its terminal release row was written (reason=${De}); the session stays fenced and the next release of it retries the write`,c),{snapshot:h,persisted:!1}}}async persistCommittedTerminalRelease(s,n,a){try{return await this.host.persistTerminalReleaseWithinDeadline(s,n,a,!0)}catch(d){let c=this.host.sessionSlots.getTerminalSnapshot(s.sessionId)??s;return e.warn(`Terminal release row of committed session ${c.sessionId} was not written; the device is freed and the row is retried`,d),this.host.scheduleTerminalReleaseRetry(c),{snapshot:c,persisted:!1,error:d}}}restorePriorFence(s,n){if(!n||this.host.sessionSlots.getTerminalSnapshot(s.sessionId)!==s)return;if(n.releaseReason!==s.releaseReason)this.host.liftTerminalFence(s.sessionId,s,!0);this.host.sessionSlots.setTerminalSnapshot(s.sessionId,n)}abandonSupersededRelease(s,n,a,d=!1){if(d)this.host.liftTerminalFence(s);if(a.length>0)this.host.trackPendingTeardownCleanup(n,a);return e.info(`Skipping release of ${s}: a newer identity confirmation superseded the eviction of ${n}`),null}upgradeReleaseReason(s,n){s.value=h7(s.value,n)}createReleaseReasonState(s,n){let a={value:n},d=this.host.sessionSlots.getTerminalSnapshot(s)?.releaseReason;if(d)this.host.upgradeReleaseReason(a,d);return a}releaseHeartbeatTimeoutMs(s,n){return s==="missing-first-heartbeat"?wS():n.heartbeatTimeoutMs}withReleaseReason(s,n,a){let d={...s,releaseReason:n,terminal:rr(n),heartbeat:{...s.heartbeat,timeoutMs:a?this.host.releaseHeartbeatTimeoutMs(n,a):s.heartbeat.timeoutMs}},c=this.host.releaseRowSessions.get(s);if(c)this.host.releaseRowSessions.set(d,c);return this.host.captureReleaseRowGeneration(d,this.host.releaseRowGenerations.get(s)),this.host.superseded.notePredecessors(d,s),d}async completeReleasePersistence(s,n,a,d){if(s.terminal)return n.finalizedSnapshot=s,n.terminalPersisted=d,this.host.sessionSlots.setTerminalReasonState(s.sessionId,n),s;if(await this.host.persistSessionRelease(s),n.value===s.releaseReason)return n.finalizedSnapshot=s,s;let c=this.host.withReleaseReason(s,n.value,a);if(n.finalizedSnapshot=c,this.host.recordFinalizedSessionRelease(a,n),this.host.rowWriter.pendingNonTerminalReleases().get(s.sessionId)===s)this.host.rowWriter.deletePendingNonTerminalRelease(s.sessionId);if(this.host.dropReleaseRetry(s),c.terminal)this.host.sessionSlots.setTerminalReasonState(c.sessionId,n),await this.host.persistTerminalReleaseIfNeeded(c),n.terminalPersisted=!0;else await this.host.persistSessionRelease(c);return c}async releaseFinalizedSession(s,n){if(this.host.upgradeReleaseReason(s,n),s.lateTerminalRelease)return await s.lateTerminalRelease;let a=s.finalizedSnapshot;if(!a)return null;let d=this.host.sessionSlots.getTerminalReasonState(a.sessionId);if(d&&d!==s)return null;if(a.terminal&&s.terminalPersisted&&a.releaseReason===s.value)return a.deviceId;let c=this.host.withReleaseReason(a,s.value);s.finalizedSnapshot=c,s.terminalPersisted=!1,this.host.sessionSlots.setTerminalReasonState(c.sessionId,s);let h=(async()=>{if(await this.host.persistTerminalReleaseIfNeeded(c),s.value!==c.releaseReason)c=this.host.withReleaseReason(c,s.value),s.finalizedSnapshot=c,this.host.sessionSlots.setTerminalReasonState(c.sessionId,s),await this.host.persistTerminalReleaseIfNeeded(c);return s.terminalPersisted=!0,this.host.notifySessionRelease(c,{upgradeOnly:!0}),c.deviceId})();s.lateTerminalRelease=h;try{return await h}finally{s.lateTerminalRelease=void 0}}recordFinalizedSessionRelease(s,n){this.host.finalizedSessionReleases.set(s,n),this.host.sessionSlots.recordFinalizedIdentity(s)}invalidateFinalizedSessionIdentity(s){let n=this.host.sessionSlots.getFinalizedIdentity(s);if(!n)return;let a=n.deref();if(a)this.host.finalizedSessionReleases.delete(a);this.host.sessionSlots.deleteFinalizedIdentity(s)}}import{AsyncLocalStorage as Fr}from"async_hooks";function dq(s,n,a=!1){return{session:s,deviceId:n,activityGeneration:s.activityGeneration,...a?{clientSuppliedId:a}:{}}}function m7(s){return s??{}}var Rn=new Fr;function qN(s,n){return Rn.run(s,n)}function Gs(){return Rn.getStore()}function LI(s){s.deferredRebindCleanup?.commit()}class bt{host;constructor(s){this.host=s}async createSession(s,n,a,d={}){let{timeoutMs:c,heartbeatTimeoutMs:h,stableDeviceId:p,recoveredLiveness:S,initialOwnership:R,persistenceSource:g,signal:w}=en(d);if(w?.throwIfAborted(),!this.host.acceptingSessionCreations)throw new $y(s);this.host.assertTerminalReleaseAdmission(s,this.host.sessions.get(s)),this.host.liftPlanLabelFenceForMint(s);let y=this.host.sessionSlots.getTerminalSnapshot(s);if(y)throw new Jt(s,y);if(this.host.sessions.has(s))return e.warn(`Session ${s} already exists, returning existing session`),this.host.sessions.get(s);this.host.refuseLabelMintOutsidePlanAllocation(s,n);let b=Array.from(this.host.sessionSlots.activeReleases).filter((M)=>M.session.sessionId===s).map((M)=>M.promise);if(b.length>0){if(await this.host.withinCreateDeadline(s,n,Promise.all(b)),this.host.assertTerminalReleaseAdmission(s,this.host.sessions.get(s)),this.host.liftPlanLabelFenceForMint(s),y=this.host.sessionSlots.getTerminalSnapshot(s),y)throw new Jt(s,y)}let A=this.host.sessionSlots.getCreation(s);if(A)return await this.host.withinCreateDeadline(s,n,A.promise);this.host.stateRestore.forgetKeepAwakeRestoreReport(s);let k=this.host.sessionNow(),T=this.host.sessionSlots.getRecovery(s),I=this.host.creatorSourceForCreation(s,g),O=sn(c,h,S,this.host.SESSION_TIMEOUT_MS),D={sessionId:s,assignedDevice:n,stableDeviceId:p,platform:a,createdAt:k,lastUsedAt:k,activityGeneration:0,expiresAt:k+O.sessionTimeoutMs,cacheData:{},lastHeartbeat:k,...O,ownership:R,...I?{persistenceMetadata:{source:I,autolockEnabled:!1,mcpSessionId:null,daemonSessionId:null}}:{},...this.host.recoverySessionFields(T),...R==="awaiting-owner"?{awaitingOwnerSince:k,hasReceivedHeartbeat:!1}:{}},C={promise:Promise.resolve(D)},N=this.host.notifyManagedExecutionRecovery(D,T);C.promise=this.host.persistAndPublishSession(D,C,this.host.claimedIncarnation(T),w),N(C.promise),this.host.sessionSlots.setCreation(s,C),this.host.slotShadowProbe.check(s,"creation-start");try{let M=await this.host.withinCreateDeadline(s,n,C.promise,()=>{C.abandoned=!0});return await this.host.stateRestore.retryAbandonedRotationRestore(M.assignedDevice),await this.host.stateRestore.retryAbandonedScreenReaderRestore(M.assignedDevice),M}finally{if(this.host.sessionSlots.getCreation(s)===C)this.host.sessionSlots.deleteCreation(s),this.host.slotShadowProbe.check(s,"creation-end")}}claimedIncarnation(s){if(!s||!this.host.sessionSlots.isRowClaimed(s))return;return{rowGeneration:s.stable_identity_generation??0,daemonSessionId:s.daemon_session_id??null,releaseReason:s.release_reason??void 0,releasedAtMs:s.released_at_ms??void 0}}creationRowRollbackSnapshot(s,n,a=this.host.sessionNow()){return{sessionId:s.sessionId,deviceId:s.assignedDevice,releaseReason:n,releasedAtMs:a,terminal:!1,heartbeat:{lastHeartbeatMs:s.lastHeartbeat,hasReceivedHeartbeat:s.hasReceivedHeartbeat,timeoutMs:s.heartbeatTimeoutMs,ageMs:Math.max(0,a-s.lastHeartbeat)}}}async retireAbandonedCreation(s){this.host.retiredCreationRows.add(s);let n=this.host.sessionNow(),a={sessionId:s.sessionId,deviceId:s.assignedDevice,releaseReason:$N,releasedAtMs:n,terminal:!1,heartbeat:{lastHeartbeatMs:s.lastHeartbeat,hasReceivedHeartbeat:s.hasReceivedHeartbeat,timeoutMs:s.heartbeatTimeoutMs,ageMs:Math.max(0,n-s.lastHeartbeat)}};throw this.host.captureReleaseRowGeneration(a,this.host.persistedRowGenerations.get(s)),await this.host.persistSessionRelease(a,!0).catch((d)=>{e.warn(`[SessionManager] Failed to release abandoned creation of ${s.sessionId}: `+r(d))}),new nk(s.sessionId,s.assignedDevice,Xl)}async rejectCreationAfterShutdownFence(s,n,a,d){if(this.host.acceptingSessionCreations&&!d?.aborted)return;if(d&&this.host.acceptingSessionCreations)await this.host.rollBackCancelledClientChosenCreation(s,n,d);let c=this.host.sessionNow(),h={sessionId:s.sessionId,deviceId:s.assignedDevice,releaseReason:d?.aborted?"session-creation-cancelled":"daemon-shutdown",releasedAtMs:c,terminal:!0,heartbeat:{lastHeartbeatMs:s.lastHeartbeat,hasReceivedHeartbeat:s.hasReceivedHeartbeat,timeoutMs:s.heartbeatTimeoutMs,ageMs:Math.max(0,c-s.lastHeartbeat)}};if(h.releaseReason==="session-creation-cancelled")await this.host.persistTerminalReleaseIfNeeded(h);else await this.host.persistRejectedCreationRow(s,h,n,a);if(this.host.notifySessionRelease(h),d?.aborted)d.throwIfAborted();throw new $y(s.sessionId,h)}async persistRejectedCreationRow(s,n,a,d){if(this.host.retiredCreationRows.add(s),this.host.sessionSlots.setTerminalSnapshot(s.sessionId,n),this.host.restartRecoveryActivityAt.delete(s.sessionId),!a){this.host.terminalReleaseJournal.record({sessionId:n.sessionId,reason:n.releaseReason,at:this.host.sessionClockToWall(n.releasedAtMs)}),this.host.liftTerminalFence(n.sessionId,n,!0);return}let c=d?.releaseReason,h=c&&mq(c)&&!Ys(c)?c:n.releaseReason,p=h===n.releaseReason?n:this.host.creationRowRollbackSnapshot(s,h,d?.releasedAtMs);this.host.captureReleaseRowGeneration(p,this.host.persistedRowGenerations.get(s)),await this.host.persistCreationRollback(p)}async rollBackCancelledClientChosenCreation(s,n,a){if(Gs()?.clientChosenSessionId!==s.sessionId)return;if(!n){a.throwIfAborted();return}this.host.retiredCreationRows.add(s);let d=this.host.sessionNow(),c={sessionId:s.sessionId,deviceId:s.assignedDevice,releaseReason:"allocation-rollback",releasedAtMs:d,terminal:!1,heartbeat:{lastHeartbeatMs:s.lastHeartbeat,hasReceivedHeartbeat:s.hasReceivedHeartbeat,timeoutMs:s.heartbeatTimeoutMs,ageMs:Math.max(0,d-s.lastHeartbeat)}};this.host.captureReleaseRowGeneration(c,this.host.persistedRowGenerations.get(s)),await this.host.persistSessionRelease(c),a.throwIfAborted()}}class kt{host;constructor(s){this.host=s}findSession(s){if(this.host.stallProbe?.(),this.host.sessionSlots.hasTerminalSnapshot(s))return null;let n=this.host.sessions.get(s);return n&&!this.host.isSessionExpired(n)?n:null}getSessionForNewExecution(s,n){return this.host.unlessBaseEnded(this.host.expireIfDue(s,!0,n))}async reclaimAndRefreshExistingSession(s){let n=this.host.sessionNow(),a={lastUsedAt:s.lastUsedAt,lastHeartbeat:s.lastHeartbeat,expiresAt:s.expiresAt,ownership:s.ownership,awaitingOwnerSince:s.awaitingOwnerSince};if(s.ownership==="awaiting-owner")s.ownership="owned",s.awaitingOwnerSince=void 0;s.lastUsedAt=n,s.lastHeartbeat=n,s.expiresAt=n+s.sessionTimeoutMs,s.activityGeneration++;let d=s.activityGeneration;try{await this.host.recordSessionActivity(s)}catch(c){if(s.activityGeneration===d)Object.assign(s,a);throw c}}async refreshExistingSessionForAccess(s,n){if(n!=="acquire")return;await this.host.reclaimAndRefreshExistingSession(s)}async getOrCreateSession(s,n,a,d={}){let{execution:c,requireIssuedSession:h=!1,...p}=d,{access:S,requestDeadlineMs:R,callerExecutionId:g,signal:w}=this.host.resolveSessionAcquisitionOptions(p),y=this.host.sessionSlots.getRebind(s);if(y)return await y.promise,await this.host.getOrCreateSession(s,n,a,d);let b=this.host.getSessionForNewExecution(s,c);if(b){let I=this.host.sessionSlots.getReleaseOp(s);if(this.host.sessionSlots.isReleasing(b)&&I?.session===b)return await I.promise,await this.host.getOrCreateSession(s,n,a,{...p,requireIssuedSession:h});return e.info(`[SessionManager] Found existing session ${s} with device ${b.assignedDevice}`),this.host.assertSessionNotSuspect(b,S),await this.host.refuseControlCallOnLapsedOwnerLease(b,S,c,g),await this.host.refuseLabelCallOnLapsedBaseLease(b,S,c,g),await this.host.refreshExistingSessionForAccess(b,S),b}this.host.refuseLabelOfEndedBase(s,S,c,g),this.host.assertTerminalReleaseAdmission(s);let A=this.host.sessionSlots.getTerminalSnapshot(s);if(A)throw new Jt(s,A);let k=this.host.forcedStuckRelease.inFlightReleaseStillOwning(s),T=this.host.sessions.get(s);if(k&&(T===void 0||k.session===T))return await k.promise,await this.host.getOrCreateSession(s,n,a,{...p,requireIssuedSession:h});return await this.host.startOrJoinUnseenAssignment(s,n,a,{requireIssuedSession:h,access:S,requestDeadlineMs:R,signal:w})}async getReleasedSessionReason(s){let n=this.host.sessions.get(s),a=this.host.sessionSlots.getTerminalSnapshot(s)?.releaseReason;if(n)return(()=>{let h=this.host.sessionSlots.getReleaseOp(s),p=h?.session===n?h:void 0;if(a===void 0)return this.host.preFenceIdleReleaseReason(s,p);let S=p?.reason.value??a;return!p?.commitFenced&&S!==void 0&&rr(S)&&!gg(S)?S:void 0})()??this.host.endedBaseOfLabel(n)?.releaseReason;if(a)return a;let d=await this.host.readPersistedSession(s);if(!d)return;return this.host.expiredReleaseOfUnheldRow(s,d)?.releaseReason??d.release_reason??void 0}async getReleasedSessionIdleTimeoutMs(s){let n=this.host.sessionSlots.getTerminalSnapshot(s);if(n)return n.cliIdleTimeoutMs;let a=this.host.sessions.get(s);if(a)return me(a)??this.host.endedBaseOfLabel(a)?.cliIdleTimeoutMs;let d=await this.host.readPersistedSession(s);if(!d)return;return Se(d)??await qe(s,d,(c)=>this.host.readPersistedSession(c))}preFenceIdleReleaseReason(s,n){if(n?.commitFenced||n&&!rr(n.reason.value))return;let a=this.host.peekTerminalAnswerForEndedSession(s)?.release.releaseReason;return a!==void 0&&HI(a)?a:void 0}expiredReleaseOfUnheldRow(s,n){if(this.host.sessions.has(s)||this.host.sessionSlots.hasAssignment(s)||this.host.sessionSlots.hasCreation(s)||this.host.sessionSlots.hasRecovery(s)||this.host.sessionSlots.hasReleaseOp(s))return;return this.host.expiredReleaseFromPersisted(s,n)}async getExpiredReleaseSnapshot(s){if(this.host.sessions.has(s)||this.host.sessionSlots.hasTerminalSnapshot(s))return;let n=await this.host.readPersistedSession(s);return n&&this.host.expiredReleaseOfUnheldRow(s,n)}reserveSessionForTerminalRelease(s,n){if(s.assignedDevice!==n)throw new cd(s.sessionId,n);if(this.host.sessionSlots.hasRebind(s.sessionId))throw new ve(s.sessionId);if(this.host.sessionSlots.getTerminalReservation(s.sessionId))throw new ee(s.sessionId,n,"is already reserved for terminal release");let d={session:s,deviceId:n,owner:Symbol(s.sessionId)};return this.host.sessionSlots.setTerminalReservation(s.sessionId,d),()=>{if(this.host.sessionSlots.getTerminalReservation(s.sessionId)?.owner===d.owner)this.host.sessionSlots.deleteTerminalReservation(s.sessionId)}}assertTerminalReleaseAdmission(s,n){let a=this.host.sessionSlots.getTerminalReservation(s);if(a&&a.session!==n)throw new ee(s,a.deviceId,xe)}assertTerminalRebindAdmission(s,n){let a=this.host.sessionSlots.getTerminalReservation(s);if(a&&a.owner!==n)throw new ee(s,a.deviceId,xe)}endedBaseOfLabel(s){if(s.persistenceMetadata?.source!==Ta)return;let n=this.host.planLabels.retainedEndedBase(s.sessionId);if(n)return n;for(let a=this.host.getBaseSessionOfDerivedLabel(s.sessionId);a!==void 0;a=this.host.getBaseSessionOfDerivedLabel(a)){let d=this.host.sessionEndReason(a);if(d!==void 0)return ms(a,d,this.sessionEndCliIdleWindowMs(a))}return}sessionEndReason(s){let n=this.host.sessionSlots.getTerminalSnapshot(s);if(n)return n.releaseReason;let a=this.host.sessions.get(s);if(!a)return;let d=this.host.sessionSlots.getReleaseOp(s);if(d?.session===a&&rr(d.reason.value))return d.reason.value;return this.host.isSessionExpired(a)?this.host.expiredSessionReleaseReason(a):void 0}sessionEndCliIdleWindowMs(s){let n=this.host.sessionSlots.getTerminalSnapshot(s);if(n)return n.cliIdleTimeoutMs;let a=this.host.sessions.get(s);return a&&me(a)}unlessBaseEnded(s){return s&&this.host.endedBaseOfLabel(s)?null:s}terminalReleaseAsOfNow(s,n,a){let d=this.host.sessionNow();return{sessionId:s.sessionId,deviceId:s.assignedDevice,releaseReason:n,releasedAtMs:d,terminal:!0,...a?te(a.cliIdleTimeoutMs):zs(s),heartbeat:{lastHeartbeatMs:s.lastHeartbeat,hasReceivedHeartbeat:s.hasReceivedHeartbeat,timeoutMs:s.heartbeatTimeoutMs,ageMs:Math.max(0,d-s.lastHeartbeat)}}}refuseLabelOfEndedBase(s,n,a,d){let c=this.host.sessions.get(s),h=c&&this.host.endedBaseOfLabel(c);if(!c||!h)return;if(n!=="read-only")this.host.releaseSessionPastIdleDeadline(h.baseSessionId,a?.executionId??d);throw new Jt(s,this.host.terminalReleaseAsOfNow(c,h.releaseReason,h))}terminalAnswerForEndedSession(s,n){let a=this.host.peekTerminalAnswerForEndedSession(s);if(a)this.host.releaseSessionPastIdleDeadline(s,n);return a}peekTerminalAnswerForEndedSession(s){let n=this.host.sessions.get(s),a=this.host.sessionEndReason(s),d=a===void 0&&n?this.host.endedBaseOfLabel(n):void 0,c=a??d?.releaseReason;if(c===void 0)return;let h=this.host.sessionSlots.getTerminalSnapshot(s);if(h||!n)return h&&new Jt(s,h);return new Jt(s,this.host.terminalReleaseAsOfNow(n,c,d))}refuseControlCallOnLapsedOwnerLease(s,n,a,d){return this.host.leaseExpiry.refuseControlCallOnLapsedOwnerLease(s,n,a,d)}refuseLabelCallOnLapsedBaseLease(s,n,a,d){return this.host.leaseExpiry.refuseLabelCallOnLapsedBaseLease(s,n,a,d)}refuseLabelMintOutsidePlanAllocation(s,n){if(this.host.planLabels.isMinting(s)||this.host.sessionSlots.hasRecovery(s))return;let a=this.host.liveBaseOfDerivedId(s);if(a===void 0)return;e.warn(`Refused to create session ${s} outside a plan allocation of its base ${a}`);let d=this.host.sessionNow();throw new Jt(s,{sessionId:s,deviceId:n,releaseReason:UN,releasedAtMs:d,terminal:!0,heartbeat:{lastHeartbeatMs:d,hasReceivedHeartbeat:!1,timeoutMs:BI.DEFAULT_HEARTBEAT_TIMEOUT_MS,ageMs:0}})}}class Pt{host;constructor(s){this.host=s}trackSessionSetup(s,n){if(!this.host.canStartSessionSetup(s))return Promise.resolve();let a,d,c=new Promise((p,S)=>{a=p,d=S}),h={session:s,promise:c};this.host.sessionSetupPromises.add(h);try{n().then(a,d)}catch(p){e.warn(`Session setup factory failed for ${s.sessionId}: ${p}`),d(p)}return c.then(()=>this.host.clearSessionSetup(h),()=>this.host.clearSessionSetup(h)),c}canStartSessionSetup(s){return!this.host.sessionSlots.isReleasing(s)&&this.host.sessionSlots.getRebind(s.sessionId)?.session!==s&&this.host.sessions.get(s.sessionId)===s}async drainReleasePromises(s,n=[]){this.host.rowWriter.beginReleaseDrain();let a=[...Array.from(this.host.sessionSlots.activeReleases,(d)=>d.promise),...this.host.rowWriter.pendingDrainWrites(),...this.host.retryPendingTerminalReleasesNow(),...this.host.superseded.retryAllNow(),...n];try{if(a.length===0)return!0;let d=Error("Release drain timed out");try{return await l(this.host.settleReleaseDrain(a),{timer:this.host.timer,timeoutMs:s,label:"Release drain",timeoutError:()=>d})}catch(c){if(c===d)return!1;throw c}}finally{this.host.rowWriter.clearPendingNonTerminalReleases()}}async settleReleaseDrain(s){let n=s;while(n.length>0){let a=new Set(n);await Promise.allSettled(n),n=Array.from(this.host.rowWriter.pendingDrainWrites()).filter((d)=>!a.has(d))}return!0}async waitForSessionRelease(s){let n=this.host.sessionSlots.getReleaseRequest(s);if(n){await n.promise;return}let a=this.host.sessionSlots.getReleaseOp(s);if(a)await a.promise}async waitForSessionReleaseWithin(s,n){let a=this.host.sessionSlots.getReleaseRequest(s)??this.host.sessionSlots.getReleaseOp(s);if(!a)return!0;let d=Error("Session release wait timed out");try{return await l(Promise.allSettled([a.promise]).then(()=>!0),{timer:this.host.timer,timeoutMs:n,label:"Session release wait",timeoutError:()=>d})}catch(c){if(c===d)return e.debug(`Timed out after ${n}ms waiting for session ${s} release`),!1;throw c}}clearSessionSetup(s){this.host.sessionSetupPromises.delete(s)}async waitForSessionSetup(s,n,a="release"){let d=Promise.allSettled(n),c=Error("Session setup drain timed out"),h=await l(d,{timer:this.host.timer,timeoutMs:FN,label:"Session setup drain",timeoutError:()=>c}).catch((p)=>{if(p===c)return"timed-out";throw p});if(h==="timed-out")return e.warn(`Timed out after ${FN}ms waiting for session ${s} setup during ${a}`),{pending:d.then(()=>{return})};for(let p of h)if(p.status==="rejected")e.warn(`Failed session setup for ${s} before release: ${p.reason}`);return{pending:null}}getDeviceCleanupRetryAfterMs(s){let n=this.host.sessionNow(),a=Array.from(this.host.sessionSlots.activeReleases).filter((d)=>!d.forced&&!d.commitDeclined&&d.session.assignedDevice===s).map((d)=>(d.teardownStartsByMs??d.startedAtMs??n)+d.stuckDeadlineMs+2*QC()+Sr);return this.host.deviceCleanupQuarantine.retryAfterMs(s,a)}hasDeviceCleanupInProgress(s){let n=Gs(),a=n?.rebound?.fromDeviceId===s&&n.deferredRebindCleanup?.retained?n.deferredRebindCleanup?.settled:void 0;return this.host.getPendingDeviceCleanup(s,a)!==null||this.host.deviceCleanupQuarantine.hasAcquisitionWork(s)&&this.host.getSessionForDevice(s)===null||Array.from(this.host.sessionSlots.activeReleases).some((d)=>!d.forced&&d.session.assignedDevice===s)}getIdleReleasesInProgress(){return Array.from(this.host.sessionSlots.activeReleases).filter((s)=>s.expiryOrigin!==void 0&&!s.forced).map((s)=>({sessionId:s.session.sessionId,startedAtMs:s.startedAtMs??this.host.sessionNow()}))}getNonTerminalReleasesInProgress(){return Array.from(this.host.sessionSlots.releaseOps.values()).filter((s)=>this.host.sessionSlots.hasActiveRelease(s)&&!s.forced&&s.expiryOrigin===void 0&&!rr(s.reason.value)).map((s)=>({sessionId:s.session.sessionId,startedAtMs:s.startedAtMs??this.host.sessionNow(),session:s.session}))}getTerminalReleasesInProgress(){return Array.from(this.host.sessionSlots.activeReleases).filter((s)=>!s.forced&&!s.commitDeclined&&s.expiryOrigin===void 0&&rr(s.reason.value)).map((s)=>({sessionId:s.session.sessionId,startedAtMs:s.startedAtMs??this.host.sessionNow()}))}isReleaseInProgress(s,n){return Array.from(this.host.sessionSlots.activeReleases).some((a)=>!a.forced&&a.session.sessionId===s&&a.startedAtMs===n)}getReleaseStuckAtMs(s){let n=Array.from(this.host.sessionSlots.activeReleases).find((a)=>!a.forced&&!a.commitDeclined&&a.session.sessionId===s);return n?(n.teardownStartsByMs??n.startedAtMs??this.host.sessionNow())+n.stuckDeadlineMs:void 0}}class Tt{host;constructor(s){this.host=s}onSessionRelease(s){this.host.releaseCallbacks.push(s)}onDeviceOwnershipChange(s){return this.host.deviceOwnershipCallbacks.add(s),()=>this.host.deviceOwnershipCallbacks.delete(s)}notifyDeviceOwnershipChange(s,n="generation-only"){this.host.armPendingDeviceCleanupCaps(s);for(let a of this.host.deviceOwnershipCallbacks)try{a(s,n)}catch(d){e.warn(`Device ownership callback failed for ${s}: ${d}`)}}onSessionCreated(s){this.host.createdCallbacks.push(s)}onSessionDeviceUnbound(s){this.host.deviceUnboundCallbacks.push(s)}notifyManagedExecutionRecovery(s,n){if(!n||s.livenessPolicy!==Xn)return()=>{};let{sessionId:a}=s,d=Promise.withResolvers();this.host.managedExecutionRecoveries.set(a,d),d.promise.catch((c)=>{e.debug(`[SessionManager] Managed recovery ${a} did not complete`,c)});try{this.host.managedExecutionRecoveryListener?.(a,d.promise)}catch(c){e.warn(`[SessionManager] Managed recovery hook failed for ${a}`,c)}return(c)=>{c.then(void 0,d.reject)}}settleManagedExecutionRecovery(s,n){let a=this.host.managedExecutionRecoveries.get(s);if(this.host.managedExecutionRecoveries.delete(s),n)a?.resolve();else a?.reject(new wg(s))}notifySessionRelease(s,n={}){if(yo(s.releaseReason)){let d=this.host.restartReleasePersistence.get(s)??Promise.withResolvers();this.host.restartReleasePersistence.set(s,d),n={...n,releasePersisted:d.promise}}let a={...n,snapshot:s};for(let d of this.host.releaseCallbacks)try{d(s.sessionId,s.deviceId,s.releaseReason,a)}catch(c){e.warn(`Session release callback failed for ${s.sessionId}: ${c}`)}}notifySessionDeviceUnbound(s,n,a){for(let d of this.host.deviceUnboundCallbacks)try{d(s,n,a)}catch(c){e.warn(`Session device-unbound callback failed for ${s}: ${c}`)}}notifySessionCreated(s){for(let n of this.host.createdCallbacks)try{n(s)}catch(a){e.warn(`Session creation callback failed for ${s.sessionId}: ${a}`)}}deferDeviceAcquisitionCancellation(s){if(!this.host.deferredAcquisitionCancellations.has(s))this.host.deferredAcquisitionCancellations.set(s,void 0)}settleDeviceAcquisitionCancellation(s,n){if(!this.host.deferredAcquisitionCancellations.has(s))return;let a=this.host.deferredAcquisitionCancellations.get(s);if(this.host.deferredAcquisitionCancellations.delete(s),n&&a!==void 0)this.host.deviceAcquisitionExecutionCanceller(a,s)}cancelSessionlessUseOnAcquisition(s,n){if(this.host.deferredAcquisitionCancellations.has(n)){this.host.deferredAcquisitionCancellations.set(n,s);return}this.host.deviceAcquisitionExecutionCanceller(s,n)}}var gA=30000,lq=2000;function uq(s){let n=Math.min(s.wallElapsedMs,s.monotonicElapsedMs),a=n-s.scheduledMs,d=s.wallElapsedMs-n;if(s.monotonicIncludesHostSleep===!0&&a>s.maxCredibleStallMs)return{lateMs:0,sleptMs:d+a};return{lateMs:a,sleptMs:d}}class c4{histories=new WeakMap;connected(s,n){let a=this.histories.get(s)??{};a.current??={since:n},this.histories.set(s,a)}disconnected(s,n){let a=this.histories.get(s);if(a?.current)a.lastClosed={...a.current,closedAt:n},a.current=void 0}connectedAt(s,n){let a=this.histories.get(s);return[a?.current,a?.lastClosed].some((d)=>d!==void 0&&d.since<=n&&(d.closedAt===void 0||d.closedAt>n))}}var fn=new WeakMap,Br=600000;function Hr(s,n,a,{gapBeganAt:d,reader:c}){if(a<=0||d===void 0||s.ownership!=="owned"||!(c?.(s,d)??!1))return 0;let h=s.lastOwnerHeartbeat??s.lastHeartbeat,p=fn.get(s),S=p?.heartbeat===h?p.creditedMs:0,R=c?.(s,n)?Br:gA,g=Math.min(a,Math.max(0,R-S));return fn.set(s,{heartbeat:h,creditedMs:S+g}),g}function vn(s,n,a,d){let c=Wt(s,a.gapBeganAt),h=c?0:Hr(s,n,a.lostMs,{gapBeganAt:a.gapBeganAt,reader:d}),p=c?a.lostMs+a.sleptMs:h,S=Fy(s),R=c||p>0?OI(S,n,p):void 0,g=Number(R!==void 0&&R>S);return{leaseStart:R,leaseExtended:c?g:0,connectedExtended:c?0:g,connectedCreditMs:h}}class Et{host;constructor(s){this.host=s}restartMintBoundClaimLeases(s){let n=this.host.sessionNow();for(let a of this.host.sessions.values())if(a.livenessOwnerToken===s&&Y(a))a.livenessOwnerBoundAt=Math.max(a.livenessOwnerBoundAt,n)}recordToolCallEnded(s,n={admitted:!0}){if(!n.admitted)return;let a=this.host.sessions.get(s);if(!a&&this.host.restartRecoveryActivityAt.has(s)){this.host.recordRestartRecoveryActivity(s);return}if(!a||this.host.sessionSlots.isReleasing(a))return;let d=this.host.sessionNow();a.lastUsedAt=Math.max(a.lastUsedAt,d),a.lastHeartbeat=Math.max(a.lastHeartbeat,d),a.expiresAt=Math.max(a.expiresAt,d+a.sessionTimeoutMs),a.activityGeneration++,this.host.getBarrier().track(()=>this.host.recordSessionActivity(a)).catch((c)=>{e.warn(`[SessionManager] Failed to record tool-call end activity: ${r(c)}`)})}startRehydratedOwnerWindows(){let s=this.host.sessionNow(),n=0;for(let a of this.host.sessions.values())if(a.ownership==="awaiting-owner"&&a.awaitingOwnerSince!==void 0)a.awaitingOwnerSince=Math.max(a.awaitingOwnerSince,s),a.lastUsedAt=Math.max(a.lastUsedAt,s),a.expiresAt=Math.max(a.expiresAt,s+a.sessionTimeoutMs),n++;return n}forgiveDaemonStall(s,n,a=0,d){let c=n+a;this.host.observerSessions?.forgiveStall?.({lostMs:n,sleptMs:a,gapAgeMs:d===void 0?void 0:s-d});let h=0,p=0,S=0,R=0,g=0;for(let w of this.host.sessions.values()){if(w.livenessPolicy==="cli-idle"){let A=pt(w);if(w.idleStallForgivenAt=Math.max(A,Math.min(s,A+n)),g+=Number(w.idleStallForgivenAt>A),w.awaitingOwnerSince!==void 0)w.awaitingOwnerSince=Math.max(w.awaitingOwnerSince,Math.min(w.awaitingOwnerSince+n,s));h++;continue}this.host.forgiveMintBoundClaimLease(w,s,c,d);let y=vn(w,s,{lostMs:n,sleptMs:a,gapBeganAt:d},this.host.ownerConnectedAtReader);if(y.leaseStart!==void 0)w.stallForgivenAt=y.leaseStart;p+=y.leaseExtended,S+=y.connectedExtended,R+=y.connectedCreditMs;let b=w.expiresAt;if(w.expiresAt=Math.max(w.expiresAt,Math.min(w.expiresAt+n,s+w.sessionTimeoutMs)),g+=Number(w.expiresAt>b),w.awaitingOwnerSince!==void 0)w.awaitingOwnerSince=Math.max(w.awaitingOwnerSince,Math.min(w.awaitingOwnerSince+c,s));h++}if(h>0)e.info(`Stall forgiveness: ${p} session lease(s) extended by ${c}ms, ${S} connected-owner lease(s) extended by ${R}ms, ${g} idle deadline(s) extended by ${n}ms, of ${h} session(s)`);return h}cleanupExpiredSessions(){this.host.stallProbe?.();let s=[];for(let[n,a]of this.host.sessions)if(this.host.isSessionExpired(a)&&!this.host.sessionSlots.isReleasing(a))s.push(n);if(s.length===0)return;e.info(`Cleaning up ${s.length} expired sessions found by sweep: `+s.join(", "));for(let n of s){let a=this.host.sessions.get(n);if(!a)continue;let d=this.host.expiredSessionReleaseReason(a),c=this.host.activeSessionExecutionChecker(n,{excludeReads:!0});if(this.host.cancelExecutionsOverriddenByExpiry(a,d))if(c)e.warn(`Session ${n} was kept past its idle deadline by control calls that never settled; cancelling them and releasing it past their request deadline plus grace, or the unsettled-execution ceiling when a control call has no deadline`);else e.info(`Session ${n} idle release cut in-flight reads`);let h=this.host.releaseSession(n,d,{allowExpired:!0,expiryOrigin:"cleanup-expired"});this.host.getBarrier().trackExisting(h).catch((p)=>e.warn(`[SessionManager] Failed to release expired session ${n}: ${p}`))}}removeSession(s,n){let a=this.host.sessions.get(s);if(!a||n&&a!==n)return!1;let d=this.host.deviceSessionMap.get(a.assignedDevice)===s;if(d)this.host.deviceSessionMap.delete(a.assignedDevice);if(this.host.sessions.delete(s),this.host.slotShadowProbe.check(s,"unpublished"),this.host.planLabels.clearEndedBase(s),this.host.superseded.settle(a),this.host.stateRestore.forgetSession(s),d)this.host.notifyDeviceOwnershipChange(a.assignedDevice);return!0}}function VN(s){return{sessionUuid:s.sessionId,deviceId:s.assignedDevice,...s.stableDeviceId!==void 0?{stableDeviceId:s.stableDeviceId}:{},generation:s.deviceGeneration??0,...s.previousDeviceId!==void 0?{previousDeviceId:s.previousDeviceId}:{}}}function WN(s){let{stableDeviceId:n,generation:a,previousDeviceId:d}=VN(s);if(a===0)return{};return{deviceGeneration:a,...n!==void 0?{stableDeviceId:n}:{},...d!==void 0?{previousDeviceId:d}:{}}}var zN="notifications/automobile/sessionDeviceRebound";function $r(s,n){let{sessionUuid:a,...d}=VN(s);return{...d,sessionId:a,previousDeviceId:n,...s.platform==="android"&&d.stableDeviceId!==void 0?{avdName:d.stableDeviceId}:{}}}function wn(s,n,a){try{s?.emit($r(n,a))}catch(d){e.warn("[SessionManager] Failed to announce rebound session device",d)}}class yn{listeners=new Set;subscribe(s){return this.listeners.add(s),()=>{this.listeners.delete(s)}}emit(s){for(let n of this.listeners)try{n(s)}catch(a){e.warn("[SessionDeviceReboundBroadcaster] listener failed",a)}}}var pq=new yn;class Ct{host;constructor(s){this.host=s}async recoverPersistedRow(s,n,a,{persisted:d,initialOwnership:c,shared:h}){let p=await this.host.recoveryTargetFromPersisted(s,d,a,c==="owned");if(p&&c==="awaiting-owner")p.initialOwnership=c;if(e.info(`[SessionManager] Creating new session ${s}, calling devicePool.assignDeviceToSession()`),d&&(p||this.host.isNameReissueOnlyRow(d)))this.host.sessionSlots.setRecovery(s,d);try{let S=()=>this.host.assignUnseenSessionToDevicePool(s,n,a,{recoveryTarget:p,persisted:d});if(p?.restartRecoveryDeadlineMs!==void 0&&this.host.sessionNow()<p.restartRecoveryDeadlineMs)p.onRecoveryWait=(g)=>h.recoveryWait.resolve(g),await H(h.controller.signal,S);else h.recoveryWait.resolve(void 0),await S();let R=this.host.getSession(s);if(!R)throw new wg(s);return this.host.restartRecoveryActivityAt.delete(s),e.info(`[SessionManager] Successfully created session ${s} with device ${R.assignedDevice}`),this.host.settleManagedExecutionRecovery(s,!0),R}finally{if(this.host.settleManagedExecutionRecovery(s,!1),this.host.sessionSlots.getRecovery(s)===d)this.host.sessionSlots.deleteRecovery(s)}}async rehydratePersistedRow(s,n,a){let d=s.session_uuid;if(!this.host.isRecoverablePersistedSession(s))return{kind:"skipped",reason:"not-recoverable"};let c=this.host.rehydrationSkipReason(d);if(c)return{kind:"skipped",reason:c};try{return await this.host.registerRehydrationRecovery(d,n,s,a),{kind:"rehydrated"}}catch(h){let p=this.host.getTerminalReleaseSnapshot(d);if(p)return{kind:"terminalized",reason:p.releaseReason};if(h instanceof Gt)return{kind:"skipped",reason:"owned-by-other-daemon"};let S=r(h);return e.warn(`[SessionManager] Failed to rehydrate session ${d}: ${S}`),{kind:"skipped",reason:S}}}async listRecoverableSessionsBeforeDeadline(s,n){let a=Symbol("startup-deadline"),d=this.host.deviceSessionRepository.listRecoverableSessions(this.host.sessionNow(),()=>this.host.rowWriteLivePeerDaemonSessionIds()),c;try{c=await l(d,{timer:this.host.timer,timeoutMs:Math.max(0,s-this.host.sessionNow()),label:"Recoverable session listing",timeoutError:()=>a})}catch(h){if(h!==a)throw h;c=a}if(typeof c!=="symbol")return c;return d.catch((h)=>e.warn(`[SessionManager] Recoverable-session list continued after startup deadline: ${r(h)}`)),n.timedOut=!0,e.warn("[SessionManager] Startup rehydration deadline reached while listing rows"),[]}async terminalizePersistedRecoveryFailure(s,n,a){let d=this.host.sessionNow();await this.host.persistTerminalReleaseIfNeeded({sessionId:s,deviceId:n.device_id,releaseReason:a.terminalReleaseReason,releasedAtMs:d,terminal:!0,...a.ownerPid===void 0?{}:{ownerPid:a.ownerPid},heartbeat:{lastHeartbeatMs:n.last_used_at_ms,hasReceivedHeartbeat:n.has_received_heartbeat===1,timeoutMs:n.heartbeat_timeout_ms,ageMs:Math.max(0,d-n.last_used_at_ms)}})}releaseSnapshotFromPersisted(s,n,a){let d=n.released_at_ms??n.last_used_at_ms,c={sessionId:s,deviceId:n.device_id,releaseReason:a,releasedAtMs:d,terminal:rr(a),...tn(n),heartbeat:{lastHeartbeatMs:n.last_used_at_ms,hasReceivedHeartbeat:n.has_received_heartbeat===1,timeoutMs:a==="missing-first-heartbeat"?wS():n.heartbeat_timeout_ms,ageMs:Math.max(0,d-n.last_used_at_ms)}};return this.host.captureReleaseRowGeneration(c,n.stable_identity_generation),c}publishReboundIfLive(s,n,a,d){if(d!==!0||this.host.sessions.get(s)!==n)return;wn(this.host.sessionDeviceReboundEmitter,n,a)}async persistAndPublishRebind(s,n,a,{stableDeviceId:d,deferCleanup:c,recovery:h}){let p=Array.from(this.host.sessionSetupPromises,(k)=>k.session===s?k.promise:null).filter((k)=>k!==null);if((await this.host.waitForSessionSetup(s.sessionId,p,"rebind")).pending)throw new t(`Session ${s.sessionId} setup is still running; retry the device rebind after it settles.`);if(await this.host.liveness.livenessOwnershipClaimMutexFor(s).runExclusive(async()=>{await this.host.persistSession(this.host.createReboundSession(s,n,a,{stableDeviceId:d,recovery:h}),s,this.host.guardedRowRewriteOptions()),this.host.superseded.settle(s)}),this.host.sessions.get(s.sessionId)!==s)await this.host.restoreReleasedRowAfterReassert(s);let R=s.assignedDevice,g=this.host.identityReplacementFences.get(R),w={...s,cacheData:{...s.cacheData}},y=this.host.stateRestore.peekNetworkConditionExpiry(s.sessionId),b=this.host.stateRestore.activeIosAppNetworkLease(s.sessionId);if(this.host.stateRestore.cancelNetworkConditionExpiry(s.sessionId),this.host.stateRestore.stopIosAppNetworkLease(s.sessionId),g){let k=this.host.replacedRestoreGenerations.get(R)??0,T=this.host.deviceHealth?.incarnation(R),I=[...g.releases],O=()=>{let C=this.host.getSessionForDevice(R);return(C===null||C===w.sessionId)&&this.host.restoreIncarnationIsCurrent({deviceId:R,incarnation:T,restoreGeneration:k})},D=Je(async()=>{let N=!await this.host.waitForIdentityReplacement(R,k)||I.some(Gl)||!O();if(this.host.notifySessionDeviceUnbound(w.sessionId,R,{deviceIdentityReplaced:N}),N)return;let M=await this.host.restoreRebindOverrides(w,O);this.host.trackPendingTeardownCleanup(R,M),await Promise.allSettled(M)}).catch((C)=>{e.warn(`Fenced rebind cleanup failed on ${R}: ${r(C)}`,C)});this.host.registerPendingDeviceCleanup(R,D)}else if(c){let k=this.host.deferRebindOverrides(w,()=>{if(y)this.host.stateRestore.rearmNetworkConditionExpiry(s,y);if(b)this.host.stateRestore.confirmIosAppNetworkRule(s,b)},b);c(k)}else{let k=await this.host.restoreRebindOverrides(s,()=>!this.host.identityReplacementFences.has(R));if(k.length>0)this.host.trackPendingTeardownCleanup(R,k)}Object.assign(s,this.host.createReboundSession(s,n,a,{stableDeviceId:d,recovery:h}));let A=s.sessionId;if(this.host.rowWriter.noteLive(A),this.host.deviceSessionMap.get(R)===s.sessionId)this.host.deviceSessionMap.delete(R);if(this.host.deviceSessionMap.set(n,s.sessionId),n!==R)this.host.cancelSessionlessUseOnAcquisition(n,s.sessionId);if(this.host.notifyDeviceOwnershipChange(R,"full"),n!==R)this.host.notifyDeviceOwnershipChange(n,"full"),this.publishReboundIfLive(A,s,R,h);if(!g)this.host.notifySessionDeviceUnbound(s.sessionId,R,{deviceIdentityReplaced:this.host.identityReplacementFences.has(R)});return s}async dispatchDeviceRestore(s,n,a=this.host.replacedRestoreGenerations.get(s)??0,d){if(this.host.identityReplacementFences.has(s)){if(!await this.host.waitForIdentityReplacement(s,a))return}else if((this.host.replacedRestoreGenerations.get(s)??0)!==a)return;let c=new AbortController,h=this.host.activeRestoreControllers.get(s);if(!h)h=new Set,this.host.activeRestoreControllers.set(s,h);h.add(c);let p=Array.from(this.host.sessionSlots.activeReleases).filter((S)=>d!==void 0&&S.teardownStep===d&&S.stage==="teardown"&&S.session.assignedDevice===s).map((S)=>({release:S,step:S.teardownStep}));try{let S=V(),R=S?AbortSignal.any([S,c.signal]):c.signal;await H(R,()=>n(R,c.signal,()=>{for(let{release:g,step:w}of p)if(g.identityReplacement&&w!==void 0)g.identityReplacement.resumeStep=Math.max(g.identityReplacement.resumeStep,w+1);c.signal.throwIfAborted()}))}finally{if(h.delete(c),h.size===0)this.host.activeRestoreControllers.delete(s)}}async rejectRefusedRebind(s,n,a){let d=s.sessionId;if(this.host.sessionSlots.getRebind(d)===n)this.host.sessionSlots.deleteRebind(d);let c=this.host.endSessionTerminallyReleasedInRow(s);this.host.trackReleaseDrainWrite(c.then(()=>{},(p)=>{e.warn(`[SessionManager] Rebind refusal adoption failed: ${r(p)}`)}));let h=await c;throw h instanceof Jt?h:a}}class Ot{host;preRecorded=new WeakSet;constructor(s){this.host=s}recordTerminalIntent(s,n=!1){let a=this.host.terminalReleaseJournal.record({sessionId:s.sessionId,reason:s.releaseReason,at:this.host.sessionClockToWall(s.releasedAtMs)});if(a==="volatile")this.host.volatileTerminalReleaseIntents.set(s.sessionId,s.releaseReason);else this.host.volatileTerminalReleaseIntents.delete(s.sessionId);if(n)this.preRecorded.add(s);return a}async persistSessionRelease(s,n=!1,a){if(n&&this.host.isSessionBeingRecreated(s.sessionId))return!1;this.host.rowWriter.noteRelease(s);try{if(s.terminal&&!this.preRecorded.delete(s))this.recordTerminalIntent(s);let d={...this.host.releaseWritePrecondition(s),...a},c=(y)=>this.host.issueReleaseRow(s,y),h=this.host.releaseRowFallback(s,d,c),p=()=>this.host.timer.monotonicNow?.()??this.host.timer.now(),S=p(),R=!1,g=c(d),w={timer:this.host.timer,timeoutMs:Cs,unref:!0,label:"Session release persistence",timeoutError:()=>new F(s.sessionId,s.releaseReason,Cs),onTimeout:()=>{R=!0,this.host.trackLateReleaseWrite(g.catch(h),s)}};try{await l(g,w)}catch(y){if(g=h(y),R)throw w.timeoutError();await l(g,{...w,timeoutMs:Math.max(0,Cs-(p()-S)),onTimeout:()=>this.host.trackLateReleaseWrite(g,s)})}return this.host.confirmReleaseWrite(s),!0}catch(d){return this.host.handleReleaseWriteFailure(d,s,n)}}}class Dt{facade;dependencies;host;restoreHealth;persistedAdmission;recovery;rehydration;rebinding;supersededRows;releasePersistence;activityPersistence;leaseExpiry;cache;acquisition;releaseRequests;planLabelsLifecycle;creation;releaseCommit;creationGuard;admission;bookkeeping;callbacks;activityClocks;recoveryPublication;releaseWrite;constructor(s,n){this.facade=s;this.dependencies=n;this.host=un(this.createCollaboratorActions(),n),this.restoreHealth=new nt(this.host),this.persistedAdmission=new ot(this.host),this.recovery=new at(this.host),this.rehydration=new lt(this.host),this.rebinding=new dt(this.host),this.supersededRows=new ct(this.host),this.releasePersistence=new ut(this.host),this.activityPersistence=new ht(this.host),this.leaseExpiry=new mt(this.host),this.cache=new Rt(this.host),this.acquisition=new ft(this.host),this.releaseRequests=new gt(this.host),this.planLabelsLifecycle=new vt(this.host),this.creation=new wt(this.host),this.releaseCommit=new yt(this.host),this.creationGuard=new bt(this.host),this.admission=new kt(this.host),this.bookkeeping=new Pt(this.host),this.callbacks=new Tt(this.host),this.activityClocks=new Et(this.host),this.recoveryPublication=new Ct(this.host),this.releaseWrite=new Ot(this.host)}createCollaboratorActions(){return{...this.createPersistenceCollaboratorActions(),refusePlanLabelSessionOutsideItsRun:(...s)=>this.planLabelsLifecycle.refusePlanLabelSessionOutsideItsRun(...s),expireIfDue:(...s)=>this.facade.expireIfDue(...s),markIdentityReplacedRelease:(...s)=>this.restoreHealth.markIdentityReplacedRelease(...s),createReleaseReasonState:(...s)=>this.releaseCommit.createReleaseReasonState(...s),judgeOwnerLeaseForRelease:(...s)=>this.leaseExpiry.judgeOwnerLeaseForRelease(...s),finishReleaseForcedBeforeStart:(...s)=>this.facade.finishReleaseForcedBeforeStart(...s),releaseSessionInternal:(s)=>this.releaseCommit.releaseSessionInternal(s),finishIdentityReplacedRelease:(...s)=>this.restoreHealth.finishIdentityReplacedRelease(...s),releaseFinalizedSession:(...s)=>this.releaseCommit.releaseFinalizedSession(...s),persistTerminalReleaseIfNeeded:(...s)=>this.releasePersistence.persistTerminalReleaseIfNeeded(...s),isLiveDaemonSession:(...s)=>this.recovery.isLiveDaemonSession(...s),liftTerminalFence:(...s)=>this.facade.liftTerminalFence(...s),endedBaseOfLabel:(...s)=>this.admission.endedBaseOfLabel(...s),rejectCreationAfterShutdownFence:(...s)=>this.creationGuard.rejectCreationAfterShutdownFence(...s),assertTerminalReleaseAdmission:(...s)=>this.admission.assertTerminalReleaseAdmission(...s),invalidateFinalizedSessionIdentity:(...s)=>this.releaseCommit.invalidateFinalizedSessionIdentity(...s),cancelSessionlessUseOnAcquisition:(...s)=>this.callbacks.cancelSessionlessUseOnAcquisition(...s),notifySessionCreated:(...s)=>this.callbacks.notifySessionCreated(...s),creationRowRollbackSnapshot:(...s)=>this.creationGuard.creationRowRollbackSnapshot(...s),retireAbandonedCreation:(...s)=>this.creationGuard.retireAbandonedCreation(...s),revokeSupersededIdentityReplacement:(...s)=>this.restoreHealth.revokeSupersededIdentityReplacement(...s),abandonSupersededRelease:(...s)=>this.releaseCommit.abandonSupersededRelease(...s),releaseHeartbeatTimeoutMs:(...s)=>this.releaseCommit.releaseHeartbeatTimeoutMs(...s),fenceTerminalRelease:(...s)=>this.releasePersistence.fenceTerminalRelease(...s),persistTerminalReleaseWithinDeadline:(...s)=>this.releaseCommit.persistTerminalReleaseWithinDeadline(...s),commitReleaseRemoval:(...s)=>this.releaseCommit.commitReleaseRemoval(...s),commitReplacedDeviceTeardown:(...s)=>this.releaseCommit.commitReplacedDeviceTeardown(...s),completeReleasePersistence:(...s)=>this.releaseCommit.completeReleasePersistence(...s),recordFinalizedSessionRelease:(...s)=>this.releaseCommit.recordFinalizedSessionRelease(...s),finishCommittedRelease:(...s)=>this.releaseCommit.finishCommittedRelease(...s),removeSession:(...s)=>this.activityClocks.removeSession(...s),dropReplacedDeviceRestoreState:(...s)=>this.releaseCommit.dropReplacedDeviceRestoreState(...s),retireRestorations:(...s)=>this.facade.retireRestorations(...s),withReleaseReason:(...s)=>this.facade.withReleaseReason(...s),persistTerminalReleaseWithUpgrade:(...s)=>this.releaseCommit.persistTerminalReleaseWithUpgrade(...s),liftPlanLabelFenceForMint:(...s)=>this.planLabelsLifecycle.liftPlanLabelFenceForMint(...s),withinCreateDeadline:(...s)=>this.creation.withinCreateDeadline(...s),creatorSourceForCreation:(...s)=>this.planLabelsLifecycle.creatorSourceForCreation(...s),recoverySessionFields:(...s)=>this.recovery.recoverySessionFields(...s),notifyManagedExecutionRecovery:(...s)=>this.callbacks.notifyManagedExecutionRecovery(...s),persistAndPublishSession:(...s)=>this.facade.persistAndPublishSession(...s),claimedIncarnation:(...s)=>this.creationGuard.claimedIncarnation(...s),rollBackCancelledClientChosenCreation:(...s)=>this.creationGuard.rollBackCancelledClientChosenCreation(...s),persistRejectedCreationRow:(...s)=>this.creationGuard.persistRejectedCreationRow(...s),persistCreationRollback:(...s)=>this.creation.persistCreationRollback(...s),isSessionExpired:(...s)=>this.facade.isSessionExpired(...s),recordSessionActivity:(...s)=>this.facade.recordSessionActivity(...s),resolveSessionAcquisitionOptions:(...s)=>this.acquisition.resolveSessionAcquisitionOptions(...s),getSessionForNewExecution:(...s)=>this.facade.getSessionForNewExecution(...s),assertSessionNotSuspect:(...s)=>this.leaseExpiry.assertSessionNotSuspect(...s),refuseControlCallOnLapsedOwnerLease:(...s)=>this.facade.refuseControlCallOnLapsedOwnerLease(...s),refuseLabelCallOnLapsedBaseLease:(...s)=>this.admission.refuseLabelCallOnLapsedBaseLease(...s),refreshExistingSessionForAccess:(...s)=>this.admission.refreshExistingSessionForAccess(...s),refuseLabelOfEndedBase:(...s)=>this.admission.refuseLabelOfEndedBase(...s),startOrJoinUnseenAssignment:(...s)=>this.acquisition.startOrJoinUnseenAssignment(...s),preFenceIdleReleaseReason:(...s)=>this.admission.preFenceIdleReleaseReason(...s),expiredReleaseOfUnheldRow:(...s)=>this.admission.expiredReleaseOfUnheldRow(...s),peekTerminalAnswerForEndedSession:(...s)=>this.facade.peekTerminalAnswerForEndedSession(...s),expiredReleaseFromPersisted:(...s)=>this.persistedAdmission.expiredReleaseFromPersisted(...s),sessionEndReason:(...s)=>this.admission.sessionEndReason(...s),expiredSessionReleaseReason:(...s)=>this.leaseExpiry.expiredSessionReleaseReason(...s),releaseSessionPastIdleDeadline:(...s)=>this.facade.releaseSessionPastIdleDeadline(...s),liveBaseOfDerivedId:(...s)=>this.facade.liveBaseOfDerivedId(...s),canStartSessionSetup:(...s)=>this.bookkeeping.canStartSessionSetup(...s),clearSessionSetup:(...s)=>this.bookkeeping.clearSessionSetup(...s),retryPendingTerminalReleasesNow:(...s)=>this.facade.retryPendingTerminalReleasesNow(...s),settleReleaseDrain:(...s)=>this.bookkeeping.settleReleaseDrain(...s),getPendingDeviceCleanup:(...s)=>this.facade.getPendingDeviceCleanup(...s),armPendingDeviceCleanupCaps:(...s)=>this.facade.armPendingDeviceCleanupCaps(...s),forgiveMintBoundClaimLease:(...s)=>this.leaseExpiry.forgiveMintBoundClaimLease(...s),cancelExecutionsOverriddenByExpiry:(...s)=>this.facade.cancelExecutionsOverriddenByExpiry(...s),recoveryTargetFromPersisted:(...s)=>this.recovery.recoveryTargetFromPersisted(...s),assignUnseenSessionToDevicePool:(...s)=>this.recovery.assignUnseenSessionToDevicePool(...s),getSession:(...s)=>this.facade.getSession(...s),settleManagedExecutionRecovery:(...s)=>this.callbacks.settleManagedExecutionRecovery(...s),rehydrationSkipReason:(...s)=>this.rehydration.rehydrationSkipReason(...s),registerRehydrationRecovery:(...s)=>this.rehydration.registerRehydrationRecovery(...s),getTerminalReleaseSnapshot:(...s)=>this.facade.getTerminalReleaseSnapshot(...s),waitForSessionSetup:(...s)=>this.facade.waitForSessionSetup(...s),createReboundSession:(...s)=>this.rebinding.createReboundSession(...s),restoreReleasedRowAfterReassert:(...s)=>this.supersededRows.restoreReleasedRowAfterReassert(...s),restoreIncarnationIsCurrent:(...s)=>this.facade.restoreIncarnationIsCurrent(...s),waitForIdentityReplacement:(...s)=>this.facade.waitForIdentityReplacement(...s),notifySessionDeviceUnbound:(...s)=>this.callbacks.notifySessionDeviceUnbound(...s),restoreRebindOverrides:(...s)=>this.rebinding.restoreRebindOverrides(...s),deferRebindOverrides:(...s)=>this.rebinding.deferRebindOverrides(...s),releaseWritePrecondition:(...s)=>this.releasePersistence.releaseWritePrecondition(...s),recordTerminalReleaseIntent:(...s)=>this.releaseWrite.recordTerminalIntent(...s),issueReleaseRow:(...s)=>this.releasePersistence.issueReleaseRow(...s),releaseRowFallback:(...s)=>this.releasePersistence.releaseRowFallback(...s),trackLateReleaseWrite:(...s)=>this.releasePersistence.trackLateReleaseWrite(...s),confirmReleaseWrite:(...s)=>this.releasePersistence.confirmReleaseWrite(...s),handleReleaseWriteFailure:(...s)=>this.releasePersistence.handleReleaseWriteFailure(...s)}}createPersistenceCollaboratorActions(){return{isTerminalReleaseRetryCurrent:(...s)=>this.facade.isTerminalReleaseRetryCurrent(...s),retryTerminalReleaseWrite:(...s)=>this.facade.retryTerminalReleaseWrite(...s),dropReleaseRetry:(...s)=>this.releasePersistence.dropReleaseRetry(...s),refuseLabelMintOutsidePlanAllocation:(...s)=>this.admission.refuseLabelMintOutsidePlanAllocation(...s),rejectRefusedRebind:(...s)=>this.recoveryPublication.rejectRefusedRebind(...s),readSessionRow:(s)=>this.dependencies.deviceSessionRepository().getSession(s),dispatchDeviceRestore:(...s)=>this.facade.dispatchDeviceRestore(...s),sessionNow:(...s)=>this.facade.sessionNow(...s),isRowOwnedByLivePeer:(...s)=>this.releaseRequests.isRowOwnedByLivePeer(...s),isSessionBeingRecreated:(...s)=>this.facade.isSessionBeingRecreated(...s),sessionClockToWall:(...s)=>this.facade.sessionClockToWall(...s),rowWriteLivePeerDaemonSessionIds:(...s)=>this.supersededRows.rowWriteLivePeerDaemonSessionIds(...s),releaseSnapshotFromPersisted:(...s)=>this.recoveryPublication.releaseSnapshotFromPersisted(...s),persistSessionRelease:(...s)=>this.facade.persistSessionRelease(...s),notifySessionRelease:(...s)=>this.callbacks.notifySessionRelease(...s),isLapsedUnownedRestartRecovery:(...s)=>this.acquisition.isLapsedUnownedRestartRecovery(...s),admitPersistedSession:(...s)=>this.acquisition.admitPersistedSession(...s),isReissuablePersistedSession:(...s)=>this.persistedAdmission.isReissuablePersistedSession(...s),recoverPersistedRow:(...s)=>this.facade.recoverPersistedRow(...s),readPersistedSession:(...s)=>this.persistedAdmission.readPersistedSession(...s),terminalReleaseFromPersisted:(...s)=>this.persistedAdmission.terminalReleaseFromPersisted(...s),recoveredRowOwner:(...s)=>this.facade.recoveredRowOwner(...s),isNameReissueOnlyRow:(...s)=>this.persistedAdmission.isNameReissueOnlyRow(...s),terminalizePersistedRecoveryFailure:(...s)=>this.recoveryPublication.terminalizePersistedRecoveryFailure(...s),recoveryLivenessFromPersisted:(...s)=>this.facade.recoveryLivenessFromPersisted(...s),newSharedAssignment:(...s)=>this.acquisition.newSharedAssignment(...s),recoverPersistedSession:(...s)=>this.recovery.recoverPersistedSession(...s),waitForSharedAssignment:(...s)=>this.acquisition.waitForSharedAssignment(...s),applyRecoveredTerminalReleaseIntents:(...s)=>this.facade.applyRecoveredTerminalReleaseIntents(...s),listRecoverableSessionsBeforeDeadline:(...s)=>this.recoveryPublication.listRecoverableSessionsBeforeDeadline(...s),rehydratePersistedRow:(...s)=>this.recoveryPublication.rehydratePersistedRow(...s),isRecoverablePersistedSession:(...s)=>this.persistedAdmission.isRecoverablePersistedSession(...s),assertTerminalRebindAdmission:(...s)=>this.admission.assertTerminalRebindAdmission(...s),createSession:(...s)=>this.facade.createSession(...s),notifyDeviceOwnershipChange:(...s)=>this.callbacks.notifyDeviceOwnershipChange(...s),rebindSession:(...s)=>this.facade.rebindSession(...s),flushDeferredRebindCleanups:(...s)=>this.facade.flushDeferredRebindCleanups(...s),persistAndPublishRebind:(...s)=>this.recoveryPublication.persistAndPublishRebind(...s),endSessionTerminallyReleasedInRow:(...s)=>this.activityPersistence.endSessionTerminallyReleasedInRow(...s),trackReleaseDrainWrite:(...s)=>this.facade.trackReleaseDrainWrite(...s),getSessionForDevice:(...s)=>this.facade.getSessionForDevice(...s),trackPendingTeardownCleanup:(...s)=>this.facade.trackPendingTeardownCleanup(...s),registerPendingDeviceCleanup:(...s)=>this.facade.registerPendingDeviceCleanup(...s),isCurrentSession:(...s)=>this.facade.isCurrentSession(...s),persistSession:(...s)=>this.facade.persistSession(...s),awaitInFlightOwnRowWrites:(...s)=>this.activityPersistence.awaitInFlightOwnRowWrites(...s),scheduleTerminalReleaseRetry:(...s)=>this.facade.scheduleTerminalReleaseRetry(...s),captureReleaseRowGeneration:(...s)=>this.releasePersistence.captureReleaseRowGeneration(...s),recordPendingNonTerminalRelease:(...s)=>this.facade.recordPendingNonTerminalRelease(...s),retryRefusedRowWrite:(...s)=>this.supersededRows.retryRefusedRowWrite(...s),retryNonTerminalRowAfterRelease:(...s)=>this.supersededRows.retryNonTerminalRowAfterRelease(...s),retryTerminalRowAfterRelease:(...s)=>this.supersededRows.retryTerminalRowAfterRelease(...s),waitOutRecreationOf:(...s)=>this.supersededRows.waitOutRecreationOf(...s),getLegacyLifecycleView:(...s)=>this.facade.getLegacyLifecycleView(...s),isAdmittedForAutomation:(...s)=>this.facade.isAdmittedForAutomation(...s),guardedRowRewriteOptions:(...s)=>this.supersededRows.guardedRowRewriteOptions(...s),isRebindUnderWay:(...s)=>this.supersededRows.isRebindUnderWay(...s),oweSupersededRowReassert:(...s)=>this.supersededRows.oweSupersededRowReassert(...s),restoreNonTerminalRowAfterReassert:(...s)=>this.supersededRows.restoreNonTerminalRowAfterReassert(...s),reassertOwedLiveRowForActivity:(...s)=>this.supersededRows.reassertOwedLiveRowForActivity(...s),getPersistedTerminalRelease:(...s)=>this.persistedAdmission.getPersistedTerminalRelease(...s),cancelExecutionsCutByRelease:(...s)=>this.facade.cancelExecutionsCutByRelease(...s),releaseSessionForReason:(...s)=>this.facade.releaseSessionForReason(...s),releaseSession:(...s)=>this.facade.releaseSession(...s),deviceHeldForLateRead:(...s)=>this.facade.deviceHeldForLateRead(...s),unlessBaseEnded:(...s)=>this.facade.unlessBaseEnded(...s),wallToSessionClock:(...s)=>this.facade.wallToSessionClock(...s),peekSession:(...s)=>this.facade.peekSession(...s),judgedLeaseHeartbeat:(...s)=>this.facade.judgedLeaseHeartbeat(...s),ownershipSessionUuid:(...s)=>this.facade.ownershipSessionUuid(...s),getBaseSessionOfDerivedLabel:(...s)=>this.facade.getBaseSessionOfDerivedLabel(...s),getReleasingSession:(...s)=>this.facade.getReleasingSession(...s),upgradeReleaseReason:(...s)=>this.releaseCommit.upgradeReleaseReason(...s),terminalReleaseAsOfNow:(...s)=>this.admission.terminalReleaseAsOfNow(...s),findSession:(...s)=>this.facade.findSession(...s),updateSessionCache:(...s)=>this.facade.updateSessionCache(...s),getDeviceReadiness:(...s)=>this.facade.getDeviceReadiness(...s),invalidateAutomationReadiness:(...s)=>this.facade.invalidateAutomationReadiness(...s),getBiometricEnrollment:(...s)=>this.facade.getBiometricEnrollment(...s),getNetworkCondition:(...s)=>this.facade.getNetworkCondition(...s),reclaimAndRefreshExistingSession:(...s)=>this.admission.reclaimAndRefreshExistingSession(...s),recordRestartRecoveryActivity:(...s)=>this.facade.recordRestartRecoveryActivity(...s),getOrCreateSession:(...s)=>this.facade.getOrCreateSession(...s),observeSessionForRead:(...s)=>this.leaseExpiry.observeSessionForRead(...s),unadmittedSessionError:(...s)=>this.persistedAdmission.unadmittedSessionError(...s),terminalizeExpiredPersistedSession:(...s)=>this.facade.terminalizeExpiredPersistedSession(...s)}}}var bn=256;class Ye{persistence;timer;backoff;static create(s){let{persistence:n,timer:a,backoff:d,logger:c,timeoutMs:h,timeoutError:p}=s;return new Ye(n,a,d,{logger:c,timeoutMs:h,timeoutError:(S)=>new p(S.sessionId,S.releaseReason,h)})}rows=new Map;listeners=new Set;work=new Set;drainWrites=new Set;retries=new Map;nonTerminalSnapshots=new Map;waiters=new Map;liveSequences=new Map;releaseSequences=new WeakMap;finalizedGenerations=new FinalizationRegistry(({uuid:s,ref:n})=>{if(this.liveSequences.get(s)===n)this.liveSequences.delete(s)});desireSeq=0;draining=!1;superseded;logger;options;constructor(s,n,a,{logger:d,...c}){this.persistence=s;this.timer=n;this.backoff=a;this.logger=d,this.options=c,this.superseded=new hs({timer:n,logger:d,draining:()=>this.draining,trackDrainWrite:(h)=>this.trackDrainWrite(h)})}noteRelease(s){if(!this.releaseSequences.has(s)){let n=s.sessionId,a=this.liveSequences.get(n)?.deref()??{seq:0};if(!this.liveSequences.get(n)?.deref()){let d=new WeakRef(a);this.liveSequences.set(n,d),this.finalizedGenerations.register(a,{uuid:n,ref:d})}this.releaseSequences.set(s,{seq:++this.desireSeq,live:a})}}noteLive(s){let n=++this.desireSeq,a=this.liveSequences.get(s)?.deref();if(a)a.seq=n;let d=this.rows.get(s);if(d)d.liveSeq=n}upsertLive(s,n,a){return this.persistence.upsertActiveSession(s,n,a)}recordLiveActivity(s,n){return this.persistence.recordActivity(s,n)}replaceLiveOwnership(s,n){return this.persistence.replaceLivenessOwnership(s,n)}canIssueRelease(s){let n=this.releaseSequences.get(s);return!s.terminal||!n||n.seq>n.live.seq}desire(s,n){let a=this.rows.get(s)??{liveSeq:0,parked:0};if(a.desired?.desired.terminal&&!n.terminal)return;if(a.desired&&a.desired!==a.active)this.revoke(a.desired);let d={desired:n,desireSeq:++this.desireSeq,cancelled:!1,attempt:0,shutdownAttempted:!1,outcome:Promise.withResolvers()};d.outcome.promise.catch((c)=>{this.logger.warn(`Release row caller failed for ${s}: ${r(c)}`,c)}),a.desired=d,this.rows.set(s,a),this.evictNonTerminal(),this.start(s,a,d)}scheduleRetry(s,n){this.noteRelease(s);let a=s.sessionId,d=this.retries.get(a);if(!s.terminal&&d?.snapshot.terminal)return;if(!n.isStillOwed()){n.drop();return}let c=(d?.snapshot===s?d.attempt:0)+1;if(d?.handle!==void 0)this.timer.clearTimeout(d.handle);let h={snapshot:s,attempt:c,callbacks:n,shutdownAttempted:this.draining,isCurrent:()=>this.retries.get(a)===h};if(this.draining){this.retryDuringDrain(h,d);return}h.handle=this.timer.setTimeout(()=>{h.handle=void 0,n.run(h)},this.backoff.delayForAttempt(c)),h.handle.unref?.(),this.retries.set(a,h),this.logger.warn(`[SessionManager] The ${s.releaseReason} release of session ${a} is not persisted; retrying the write (attempt ${c})`)}retryDuringDrain(s,n){let{snapshot:a,attempt:d,callbacks:c}=s,h=a.sessionId;if(n?.snapshot===a&&n.shutdownAttempted){this.removeRetry(h),this.logger.warn(`[SessionManager] The ${a.releaseReason} release of session ${h} is still not persisted at shutdown`+(a.terminal?"; the session stays fenced only until this process exits":""));return}this.retries.set(h,s),this.logger.warn(`[SessionManager] The ${a.releaseReason} release of session ${h} is not persisted; retrying the write before shutdown (attempt ${d})`),this.trackDrainWrite(c.run(s))}cancelRetry(s){if(this.retries.get(s.sessionId)?.snapshot===s)this.removeRetry(s.sessionId)}removeRetry(s){let n=this.retries.get(s);if(n?.handle!==void 0)this.timer.clearTimeout(n.handle);this.retries.delete(s),this.resolveWaiters(s)}resolveWaiters(s){if(this.pending(s))return;for(let n of this.waiters.get(s)??[])n();this.waiters.delete(s)}beginReleaseDrain(){this.draining=!0}retryPendingNow(){return Array.from(this.retries.values(),(s)=>{if(s.handle!==void 0)this.timer.clearTimeout(s.handle),s.handle=void 0;return s.shutdownAttempted=!0,s.callbacks.run(s)})}stopRetryTimers(){for(let s of this.retries.values())if(s.handle!==void 0)this.timer.clearTimeout(s.handle),s.handle=void 0}setRetryBackoff(s){this.backoff=s}pendingNonTerminalReleases(){return this.nonTerminalSnapshots}recordPendingNonTerminalRelease(s){let n=this.nonTerminalSnapshots;if(!n.has(s.sessionId)&&n.size>=bn){let a=n.keys().next().value;if(a!==void 0)n.delete(a)}n.set(s.sessionId,s)}deletePendingNonTerminalRelease(s){this.nonTerminalSnapshots.delete(s)}clearPendingNonTerminalReleases(){this.nonTerminalSnapshots.clear()}evictNonTerminal(){let s=Array.from(this.rows.entries()).filter(([,d])=>d.desired&&!d.desired.desired.terminal);if(s.length<=bn)return;let[n,a]=s[0];this.cancel(n,a.desired.desired.snapshot)}pending(s){let n=this.rows.get(s);return this.retries.has(s)||n!==void 0&&(!!n.active||!!n.desired||n.parked>0)}pendingSnapshot(s){return this.rows.get(s)?.desired?.desired.snapshot}result(s){return this.rows.get(s)?.desired?.outcome.promise??Promise.resolve(!0)}settled(s){if(!this.pending(s))return Promise.resolve();let n=this.waiters.get(s)??new Set;return this.waiters.set(s,n),new Promise((a)=>n.add(a))}cancel(s,n){let a=this.rows.get(s);if(!a)return;if(a.desired?.desired.snapshot===n)this.revoke(a.desired),a.desired=void 0;if(a.active?.desired.snapshot===n)a.active.cancelled=!0;this.prune(s,a)}liftTerminal(s){let n=this.retries.get(s);if(n?.snapshot.terminal)this.cancelRetry(n.snapshot),this.cancel(s,n.snapshot);let a=this.rows.get(s);if(!a)return;if(a.liveSeq=++this.desireSeq,a.active?.desired.terminal)a.active.cancelled=!0;if(a.desired?.desired.terminal)this.cancel(s,a.desired.desired.snapshot)}revoke(s){if(s.cancelled=!0,s.handle!==void 0)this.timer.clearTimeout(s.handle);s.handle=void 0,s.outcome.resolve(!1)}current(s,n){return!n.cancelled&&(!n.desired.terminal||n.desireSeq>s.liveSeq)}start(s,n,a){if(n.active||a.handle!==void 0||n.desired!==a)return;if(!this.current(n,a)||!(a.desired.wanted?.()??!0)){this.cancel(s,a.desired.snapshot);return}n.active=a,this.track(this.run(s,n,a))}async run(s,n,a){let d=!1;try{let c=a.attempt>0;if(c&&!await this.prepare(n,a))return;let h=this.precondition(a),p=h instanceof Promise?await h:h;if(!this.current(n,a))throw new _(s);let S=this.issue(n,a,p),R=this.deadlineNow(),g=S.write(p),w=()=>{d=!0,n.parked++;let y=a.desired.parked?.();this.track(this.finishParked(s,n,a,{physical:g.catch(S.fallback),finish:y}))};try{await this.bounded(g,a,w)}catch(y){if(d)throw this.options.timeoutError(a.desired.snapshot);g=S.fallback(y);let b=this.deadlineNow()-R;await this.bounded(g,a,w,Math.max(0,this.options.timeoutMs-b))}if(c&&await a.desired.skipped?.())return;a.outcome.resolve(!0),await this.landed(a,!1,!1),this.complete(s,n,a)}catch(c){await this.failed(s,n,a,{error:c})}finally{this.unlock(s,n,a)}}deadlineNow(){return this.timer.monotonicNow?.()??this.timer.now()}precondition(s){return s.attempt===0&&s.desired.initialPrecondition?s.desired.initialPrecondition:s.desired.precondition()}async prepare(s,n){if(!this.current(s,n))throw new _(n.desired.snapshot.sessionId);if(n.desired.due&&!await n.desired.due(this.draining))return!1;if(await n.desired.beforeWrite?.(),!this.current(s,n))throw new _(n.desired.snapshot.sessionId);return!0}issue(s,n,a){let{snapshot:d}=n.desired,c=(S)=>{if(!this.current(s,n))return Promise.reject(new _(d.sessionId));return this.persistence.markReleased(d.sessionId,Hy(d.releaseReason),d.releasedAtMs,{reason:d.releaseReason,...S})},h;return{write:c,fallback:(S)=>{if(!(S instanceof _)||!n.desired.fallback)throw S;return h??=n.desired.fallback(S,a,c)}}}bounded(s,n,a,d=this.options.timeoutMs){return l(s,{timer:this.timer,timeoutMs:d,unref:!0,label:"Session release persistence",timeoutError:()=>this.options.timeoutError(n.desired.snapshot),onTimeout:a})}async landed(s,n,a){for(let d of this.listeners)await d({snapshot:s.desired.snapshot,late:n,refused:a})}async failed(s,n,a,{error:d,late:c=!1}){if(d instanceof _){if(!a.desired.terminal&&await a.desired.skipped?.())return;this.logger.debug(`Release row refused for ${s}`),a.outcome.resolve(!0),await this.landed(a,c,!0),this.complete(s,n,a);return}this.logger.warn(`Release row write failed for ${s}: ${r(d)}`,d);try{a.outcome.resolve(a.desired.failure?.(d)??!1)}catch(h){a.outcome.reject(h)}}async finishParked(s,n,a,{physical:d,finish:c}){try{await d,await this.landed(a,!0,!1),this.complete(s,n,a)}catch(h){await this.failed(s,n,a,{error:h,late:!0})}finally{c?.(),n.parked--,this.prune(s,n)}}schedule(s,n,a){if(n.desired!==a||!this.current(n,a))return;if(this.draining&&a.shutdownAttempted){this.logger.warn(`Release row still not persisted at shutdown for ${s}`),this.complete(s,n,a);return}if(a.attempt++,this.draining){a.shutdownAttempted=!0,this.start(s,n,a);return}a.handle=this.timer.setTimeout(()=>{a.handle=void 0,this.start(s,n,a)},this.backoff.delayForAttempt(a.attempt)),a.handle.unref?.()}complete(s,n,a){if(n.desired===a)n.desired=void 0;if(a.handle!==void 0)this.timer.clearTimeout(a.handle);this.prune(s,n)}unlock(s,n,a){if(n.active===a)n.active=void 0;if(n.desired===a)this.schedule(s,n,a);else if(n.desired)this.start(s,n,n.desired);this.prune(s,n)}prune(s,n){if(n.active||n.desired||n.parked>0)return;this.rows.delete(s),this.resolveWaiters(s)}track(s){let n=s.catch((a)=>{this.logger.warn(`Release row listener failed: ${r(a)}`,a)});this.work.add(n),n.then(()=>this.work.delete(n))}trackDrainWrite(s){this.drainWrites.add(s),s.then(()=>this.drainWrites.delete(s))}pendingDrainWrites(){return this.drainWrites}async drain(){this.beginReleaseDrain();let s=this.retryPendingNow();for(let[n,a]of this.rows){if(!a.desired)continue;if(a.desired.handle!==void 0)this.timer.clearTimeout(a.desired.handle);if(a.desired.handle=void 0,!a.active)this.schedule(n,a,a.desired)}if(s.length>0)await Promise.allSettled(s);while(this.work.size||this.rows.size||this.drainWrites.size||this.retries.size)await Promise.all([...this.work,...this.drainWrites,...Array.from(new Set([...this.rows.keys(),...this.retries.keys()]),(n)=>this.settled(n))])}stop(){this.stopRetryTimers();for(let[s,n]of this.rows){if(n.desired?.handle!==void 0)this.timer.clearTimeout(n.desired.handle);if(n.desired)n.desired.handle=void 0;if(n.desired&&!n.desired.desired.terminal)this.cancel(s,n.desired.desired.snapshot)}}onRowLanded(s){this.listeners.add(s)}}class It{logger;illegalTransitionCount=0;positions=new Map;baselineAfterReset=!1;constructor(s){this.logger=s}reset(){this.positions.clear(),this.baselineAfterReset=!0}forget(s){this.positions.delete(s)}check(s,n,a,d){let c=this.positions.get(s)??(this.baselineAfterReset?a:{tag:"absent"});if(a.tag==="absent")this.positions.delete(s);else this.positions.set(s,{tag:a.tag,fence:a.fence});if(c.tag===a.tag&&c.fence===a.fence)return;let h=Ke(c,a);if(h.ok)return;let p=an.has(`${n}:${c.tag}:${a.tag}`)||on.some((R)=>R.event===n&&R.from===c.tag&&R.to===a.tag&&Ke(c,{tag:R.via}).ok&&Ke({tag:R.via},a).ok);this.illegalTransitionCount++;let S=`[SlotTransitionGuard] uuid=${s} event=${n}: ${h.reason}`;if(p){this.logger.debug(S);return}if(d==="throw")throw new Ge(c,a,S);this.logger.warn(S)}}class _t{view;legacy;logger;notifySettled;currentMode="log";get mode(){return this.currentMode}set mode(s){if(s==="off")this.transitionGuard.reset();this.currentMode=s}transitionGuard;constructor(s,n,a,d){this.view=s;this.legacy=n;this.logger=a;this.notifySettled=d;this.transitionGuard=new It(a)}setReferencePredicates(s){this.legacy=s}check(s,n,a=[]){if(this.notifySettled?.(s),this.mode==="off")return;if(this.mode==="throw"){this.observe(s,n),this.compare(s,n,a);return}try{this.observe(s,n),this.compare(s,n,a)}catch(d){this.logger.warn(`[SessionSlotShadowProbe] uuid=${s} event=${n}: ${r(d)}`)}}observe(s,n){if(Wr.has(n))this.transitionGuard.check(s,n,ze(this.view(),s),this.mode==="throw"?"throw":"log")}readIdentities(s,n,a){let d=je(s,n);return[...new Set([s.sessions.get(n),s.releaseOps.get(n)?.session,s.latestFinalizedIdentities.get(n)?.deref(),...a])].filter((h)=>h!==void 0).map((h)=>({derived:d===h,legacy:this.legacy.isLatestSessionIdentity(h)}))}compare(s,n,a){if(!this.legacy)return;let d=this.view(),c=ze(d,s),h=d.sessions.get(s),p=h!==void 0&&(c.tag==="live"||c.tag==="rebinding"||c.tag==="releasing"&&c.fence==="none"),S={current:p,admitted:p&&!d.isReleasing(h),recreated:Te(c.tag),known:et(c)},R={current:h!==void 0&&this.legacy.isCurrentSession(h),admitted:h!==void 0&&this.legacy.isAdmittedForAutomation(h),recreated:this.legacy.isSessionBeingRecreated(s),known:this.legacy.isKnownSessionId(s)},g=this.readIdentities(d,s,a);if(JSON.stringify(S)===JSON.stringify(R)&&g.every((y)=>y.derived===y.legacy))return;let w=`[SessionSlotShadowProbe] uuid=${s} event=${n} slot=${JSON.stringify(c)} derived=${JSON.stringify(S)} legacy=${JSON.stringify(R)} identities=${JSON.stringify(g)}`;if(this.mode==="throw")throw Error(w);this.logger.debug(w)}}var Wr=new Set(["creation-start","creation-end","assignment-start","assignment-end","published","rebind-start","rebind-end","release-start","release-end","unpublished","plan-label-fence-lifted","recovered-terminal-intent-deleted"]);class BI extends Xs{forwardersHost=this.createForwardersHost();createForwardersHost(){let s=this;return{get rowWriter(){return s.rowWriter},get configuration(){return s.configuration},get recoveredIntents(){return s.recoveredIntents},get restoreHealth(){return s.wiring.restoreHealth},get sessionClock(){return s.sessionClock},get callbacks(){return s.wiring.callbacks},get deviceCleanupQuarantine(){return s.deviceCleanupQuarantine},get bookkeeping(){return s.wiring.bookkeeping},get forcedStuckRelease(){return s.forcedStuckRelease},get activityClocks(){return s.wiring.activityClocks},get creationGuard(){return s.wiring.creationGuard},get persistedAdmission(){return s.wiring.persistedAdmission},get admission(){return s.wiring.admission},get leaseExpiry(){return s.wiring.leaseExpiry},get acquisition(){return s.wiring.acquisition},get rehydration(){return s.wiring.rehydration},get rebinding(){return s.wiring.rebinding},get queries(){return s.queries},get slotShadowProbe(){return s.slotShadowProbe},get releaseRequests(){return s.wiring.releaseRequests},get stateRestore(){return s.stateRestore},get cache(){return s.wiring.cache},get planLabelsLifecycle(){return s.wiring.planLabelsLifecycle},get liveness(){return s.liveness},get cleanup(){return s.cleanup}}}waitOutRebindOf(s){return this.wiring.supersededRows.waitOutRebindOf(s)}waitOutReleaseOf(s){return this.wiring.supersededRows.waitOutReleaseOf(s)}waitOutRecreationOf(s){return this.wiring.supersededRows.waitOutRecreationOf(s)}configuration=new gs;get stallProbe(){return this.configuration.stallProbe}set stallProbe(s){this.configuration.stallProbe=s}get daemonSessionId(){return this.configuration.daemonSessionId}set daemonSessionId(s){this.configuration.daemonSessionId=s}get liveDaemonSessionIds(){return this.configuration.liveDaemonSessionIds}set liveDaemonSessionIds(s){this.configuration.liveDaemonSessionIds=s}get acceptingSessionCreations(){return this.configuration.acceptingSessionCreations}set acceptingSessionCreations(s){this.configuration.acceptingSessionCreations=s}get observerSessions(){return this.configuration.observerSessions}set observerSessions(s){this.configuration.observerSessions=s}get activeSessionExecutionChecker(){return this.configuration.activeSessionExecutionChecker}set activeSessionExecutionChecker(s){this.configuration.activeSessionExecutionChecker=s}get livenessOwnerCallInFlightReader(){return this.configuration.livenessOwnerCallInFlightReader}set livenessOwnerCallInFlightReader(s){this.configuration.livenessOwnerCallInFlightReader=s}get ownerConnectedAtReader(){return this.configuration.ownerConnectedAtReader}set ownerConnectedAtReader(s){this.configuration.ownerConnectedAtReader=s}get sessionExecutionDeadlineLookup(){return this.configuration.sessionExecutionDeadlineLookup}set sessionExecutionDeadlineLookup(s){this.configuration.sessionExecutionDeadlineLookup=s}get expiryReleaseExecutionCanceller(){return this.configuration.expiryReleaseExecutionCanceller}set expiryReleaseExecutionCanceller(s){this.configuration.expiryReleaseExecutionCanceller=s}get deviceAcquisitionExecutionCanceller(){return this.configuration.deviceAcquisitionExecutionCanceller}set deviceAcquisitionExecutionCanceller(s){this.configuration.deviceAcquisitionExecutionCanceller=s}get recoveryExpiryReleaseHandler(){return this.configuration.recoveryExpiryReleaseHandler}set recoveryExpiryReleaseHandler(s){this.configuration.recoveryExpiryReleaseHandler=s}get managedExecutionRecoveryListener(){return this.configuration.managedExecutionRecoveryListener}set managedExecutionRecoveryListener(s){this.configuration.managedExecutionRecoveryListener=s}get lateRehydrationListener(){return this.configuration.lateRehydrationListener}set lateRehydrationListener(s){this.configuration.lateRehydrationListener=s}get releaseDeviceHold(){return this.configuration.releaseDeviceHold}set releaseDeviceHold(s){this.configuration.releaseDeviceHold=s}wiring=this.createCollaboratorHost();queries=new st(this.wiring.host,{getAllSessions:()=>this.getAllSessions(),getAssignedDevices:()=>this.getAssignedDevices()});cleanup=this.createCleanup();createCleanup(){let s=this;return new fs(this.wiring.host,{get CLEANUP_INTERVAL_MS(){return s.CLEANUP_INTERVAL_MS},cleanupExpiredSessions:()=>this.cleanupExpiredSessions(),get rehydrationFollowUpTimer(){return s.rehydrationFollowUpTimer},set rehydrationFollowUpTimer(n){s.rehydrationFollowUpTimer=n}})}createCollaboratorHost(){return new Dt({expireIfDue:(...a)=>this.expireIfDue(...a),finishReleaseForcedBeforeStart:(...a)=>this.finishReleaseForcedBeforeStart(...a),liftTerminalFence:(...a)=>this.liftTerminalFence(...a),retireRestorations:(...a)=>this.retireRestorations(...a),withReleaseReason:(...a)=>this.withReleaseReason(...a),persistAndPublishSession:(...a)=>this.persistAndPublishSession(...a),isSessionExpired:(...a)=>this.isSessionExpired(...a),recordSessionActivity:(...a)=>this.recordSessionActivity(...a),getSessionForNewExecution:(...a)=>this.getSessionForNewExecution(...a),refuseControlCallOnLapsedOwnerLease:(...a)=>this.refuseControlCallOnLapsedOwnerLease(...a),peekTerminalAnswerForEndedSession:(...a)=>this.peekTerminalAnswerForEndedSession(...a),releaseSessionPastIdleDeadline:(...a)=>this.releaseSessionPastIdleDeadline(...a),liveBaseOfDerivedId:(...a)=>this.liveBaseOfDerivedId(...a),retryPendingTerminalReleasesNow:(...a)=>this.retryPendingTerminalReleasesNow(...a),getPendingDeviceCleanup:(...a)=>this.getPendingDeviceCleanup(...a),armPendingDeviceCleanupCaps:(...a)=>this.armPendingDeviceCleanupCaps(...a),cancelExecutionsOverriddenByExpiry:(...a)=>this.cancelExecutionsOverriddenByExpiry(...a),getSession:(...a)=>this.getSession(...a),getTerminalReleaseSnapshot:(...a)=>this.getTerminalReleaseSnapshot(...a),waitForSessionSetup:(...a)=>this.waitForSessionSetup(...a),restoreIncarnationIsCurrent:(...a)=>this.restoreIncarnationIsCurrent(...a),waitForIdentityReplacement:(...a)=>this.waitForIdentityReplacement(...a),isTerminalReleaseRetryCurrent:(...a)=>this.isTerminalReleaseRetryCurrent(...a),retryTerminalReleaseWrite:(...a)=>this.retryTerminalReleaseWrite(...a),dispatchDeviceRestore:(...a)=>this.dispatchDeviceRestore(...a),sessionNow:(...a)=>this.sessionNow(...a),isSessionBeingRecreated:(...a)=>this.isSessionBeingRecreated(...a),sessionClockToWall:(...a)=>this.sessionClockToWall(...a),persistSessionRelease:(...a)=>this.persistSessionRelease(...a),recoverPersistedRow:(...a)=>this.recoverPersistedRow(...a),recoveredRowOwner:(...a)=>this.recoveredRowOwner(...a),recoveryLivenessFromPersisted:(...a)=>this.recoveryLivenessFromPersisted(...a),applyRecoveredTerminalReleaseIntents:(...a)=>this.applyRecoveredTerminalReleaseIntents(...a),createSession:(...a)=>this.createSession(...a),rebindSession:(...a)=>this.rebindSession(...a),flushDeferredRebindCleanups:(...a)=>this.flushDeferredRebindCleanups(...a),trackReleaseDrainWrite:(...a)=>this.trackReleaseDrainWrite(...a),getSessionForDevice:(...a)=>this.getSessionForDevice(...a),trackPendingTeardownCleanup:(...a)=>this.trackPendingTeardownCleanup(...a),registerPendingDeviceCleanup:(...a)=>this.registerPendingDeviceCleanup(...a),isCurrentSession:(...a)=>this.isCurrentSession(...a),persistSession:(...a)=>this.persistSession(...a),scheduleTerminalReleaseRetry:(...a)=>this.scheduleTerminalReleaseRetry(...a),recordPendingNonTerminalRelease:(...a)=>this.recordPendingNonTerminalRelease(...a),getLegacyLifecycleView:(...a)=>this.getLegacyLifecycleView(...a),isAdmittedForAutomation:(...a)=>this.isAdmittedForAutomation(...a),cancelExecutionsCutByRelease:(...a)=>this.cancelExecutionsCutByRelease(...a),releaseSessionForReason:(...a)=>this.releaseSessionForReason(...a),releaseSession:(...a)=>this.releaseSession(...a),deviceHeldForLateRead:(...a)=>this.deviceHeldForLateRead(...a),unlessBaseEnded:(...a)=>this.unlessBaseEnded(...a),wallToSessionClock:(...a)=>this.wallToSessionClock(...a),peekSession:(...a)=>this.peekSession(...a),judgedLeaseHeartbeat:(...a)=>this.judgedLeaseHeartbeat(...a),ownershipSessionUuid:(...a)=>this.ownershipSessionUuid(...a),getBaseSessionOfDerivedLabel:(...a)=>this.getBaseSessionOfDerivedLabel(...a),getReleasingSession:(...a)=>this.getReleasingSession(...a),findSession:(...a)=>this.findSession(...a),updateSessionCache:(...a)=>this.updateSessionCache(...a),getDeviceReadiness:(...a)=>this.getDeviceReadiness(...a),invalidateAutomationReadiness:(...a)=>this.invalidateAutomationReadiness(...a),getBiometricEnrollment:(...a)=>this.getBiometricEnrollment(...a),getNetworkCondition:(...a)=>this.getNetworkCondition(...a),recordRestartRecoveryActivity:(...a)=>this.recordRestartRecoveryActivity(...a),getOrCreateSession:(...a)=>this.getOrCreateSession(...a),terminalizeExpiredPersistedSession:(...a)=>this.terminalizeExpiredPersistedSession(...a)},{stateRestore:()=>this.stateRestore,timer:()=>this.timer,acceptingSessionCreations:()=>this.acceptingSessionCreations,deviceSessionRepository:()=>this.deviceSessionRepository,recoveredIntents:()=>this.recoveredIntents,getBarrier:()=>this.getBarrier?.bind(this),sessionSlots:()=>this.sessionSlots,daemonSessionId:()=>this.daemonSessionId,activeSessionExecutionChecker:()=>this.activeSessionExecutionChecker?.bind(this),sessions:()=>this.sessions,superseded:()=>this.superseded,liveDaemonSessionIds:()=>this.liveDaemonSessionIds?.bind(this),SESSION_TIMEOUT_MS:()=>this.SESSION_TIMEOUT_MS,lateRehydrationListener:()=>this.lateRehydrationListener,slotShadowProbe:()=>this.slotShadowProbe,deviceHealth:()=>this.deviceHealth,persistedRowGenerations:()=>this.persistedRowGenerations,releaseRowGenerations:()=>this.releaseRowGenerations,finalizedSessionReleases:()=>this.finalizedSessionReleases,supersededRowReassertRetries:()=>this.supersededRowReassertRetries,rowWriter:()=>this.rowWriter,forcedStuckRelease:()=>this.forcedStuckRelease,restartReleasePersistence:()=>this.restartReleasePersistence,restartRecoveryActivityAt:()=>this.restartRecoveryActivityAt,stallProbe:()=>this.stallProbe?.bind(this),livenessOwnerCallInFlightReader:()=>this.livenessOwnerCallInFlightReader,liveness:()=>this.liveness,sessionExecutionDeadlineLookup:()=>this.sessionExecutionDeadlineLookup?.bind(this),expiryReleaseExecutionCanceller:()=>this.expiryReleaseExecutionCanceller?.bind(this),recoveryExpiryReleaseHandler:()=>this.recoveryExpiryReleaseHandler,releaseDeviceHold:()=>this.releaseDeviceHold,planLabels:()=>this.planLabels,observerSessions:()=>this.observerSessions,deviceSessionMap:()=>this.deviceSessionMap,releaseRowSessions:()=>this.releaseRowSessions,replacedRestoreGenerations:()=>this.replacedRestoreGenerations,volatileTerminalReleaseIntents:()=>this.volatileTerminalReleaseIntents,retiredCreationRows:()=>this.retiredCreationRows,terminalReleaseJournal:()=>this.terminalReleaseJournal,leaseExpiry:()=>this.wiring.leaseExpiry,sessionSetupPromises:()=>this.sessionSetupPromises,deviceCleanupQuarantine:()=>this.deviceCleanupQuarantine,releaseCallbacks:()=>this.releaseCallbacks,sessionDeviceReboundEmitter:()=>this.sessionDeviceReboundEmitter,deviceOwnershipCallbacks:()=>this.deviceOwnershipCallbacks,createdCallbacks:()=>this.createdCallbacks,deviceUnboundCallbacks:()=>this.deviceUnboundCallbacks,managedExecutionRecoveryListener:()=>this.managedExecutionRecoveryListener?.bind(this),managedExecutionRecoveries:()=>this.managedExecutionRecoveries,deferredAcquisitionCancellations:()=>this.deferredAcquisitionCancellations,deviceAcquisitionExecutionCanceller:()=>this.deviceAcquisitionExecutionCanceller.bind(this),ownerConnectedAtReader:()=>this.ownerConnectedAtReader,identityReplacementFences:()=>this.identityReplacementFences,activeRestoreControllers:()=>this.activeRestoreControllers})}sessions=new Map;deviceSessionMap=new Map;get rehydrationFollowUpTimer(){return this.wiring.rehydration.rehydrationFollowUpTimer}set rehydrationFollowUpTimer(s){this.wiring.rehydration.rehydrationFollowUpTimer=s}timer;sessionClock;sessionDeviceReboundEmitter;releaseCallbacks=[];restartReleasePersistence=new WeakMap;planLabels=new Ss({hasSession:(s)=>this.sessions.has(s)});createdCallbacks=[];deviceUnboundCallbacks=[];deviceOwnershipCallbacks=new Set;rowWriter;terminalReleaseJournal=new ps;volatileTerminalReleaseIntents=new Map;finalizedSessionReleases=new WeakMap;liveness;recoveredIntents;forcedStuckRelease;get persistedRowGenerations(){return this.wiring.activityPersistence.persistedRowGenerations}get retiredCreationRows(){return this.wiring.creation.retiredCreationRows}get releaseRowGenerations(){return this.wiring.releasePersistence.releaseRowGenerations}get releaseRowSessions(){return this.wiring.releasePersistence.releaseRowSessions}sessionSetupPromises=new Set;deviceCleanupQuarantine;sessionSlots=new Zs({rowPending:{pending:(s)=>this.rowWriter.pending(s)},onFinalizedIdentityCollected:(s)=>this.slotShadowProbe.transitionGuard.forget(s)});get restartRecoveryActivityAt(){return this.wiring.persistedAdmission.restartRecoveryActivityAt}supersededRowReassertRetries={retry:(s)=>this.wiring.supersededRows.retryOwedSupersededRowReassert(s),retryDuringDrain:(s)=>this.wiring.supersededRows.retryOwedSupersededRowReassertDuringDrain(s)};deviceSessionRepository;getBarrier;stateRestore;setSupersededRowReassertBackoff(s){this.superseded.setBackoff(s)}get superseded(){return this.rowWriter.superseded}recoveredRowOwner(){return this.configuration.recoveredRowOwner()}recordSessionClientName(s,n){let a=this.sessions.get(s);if(a)a.clientName=n}get deviceHealth(){return this.wiring.restoreHealth.deviceHealth}set deviceHealth(s){this.wiring.restoreHealth.deviceHealth=s}get identityReplacementFences(){return this.wiring.restoreHealth.identityReplacementFences}get replacedRestoreGenerations(){return this.wiring.restoreHealth.replacedRestoreGenerations}get activeRestoreControllers(){return this.wiring.restoreHealth.activeRestoreControllers}waitForIdentityReplacement(s,n){return this.wiring.restoreHealth.waitForIdentityReplacement(s,n)}dispatchDeviceRestore(s,n,a=this.replacedRestoreGenerations.get(s)??0,d){return this.wiring.recoveryPublication.dispatchDeviceRestore(s,n,a,d)}restoreIncarnationIsCurrent(s){return this.wiring.restoreHealth.restoreIncarnationIsCurrent(s)}clearRestoreHealth(s,n){return this.wiring.restoreHealth.clearRestoreHealth(s,n)}abandonRestore(s,n,a,d=Jl){return this.wiring.restoreHealth.abandonRestore(s,n,a,d)}deferredAcquisitionCancellations=new Map;SESSION_TIMEOUT_MS=nB();CLEANUP_INTERVAL_MS=300000;static DEFAULT_HEARTBEAT_TIMEOUT_MS=ag;constructor(s=i,n=new vS({timer:s}),a={}){super();let d=new Qs(this.wiring.host,{trackSessionSetup:(...c)=>this.trackSessionSetup(...c),clearRestoreHealth:(...c)=>this.clearRestoreHealth(...c),abandonRestore:(...c)=>this.abandonRestore(...c),trackPendingDeviceCleanup:(...c)=>this.trackPendingDeviceCleanup(...c),livenessOwnerView:(...c)=>this.livenessOwnerView(...c),hasUnissuedActivity:(...c)=>this.hasUnissuedActivity(...c),getBarrier:()=>this.getBarrier(),setJournal:(c)=>{this.terminalReleaseJournal=c}});this.timer=s,this.sessionDeviceReboundEmitter=a.sessionDeviceReboundEmitter,this.sessionClock=new SP(s),this.deviceCleanupQuarantine=d.createDeviceCleanupQuarantine(s),this.deviceSessionRepository=mi(n,{toWall:(c)=>this.sessionClockToWall(c),toSessionClock:(c)=>this.wallToSessionClock(c)}),this.rowWriter=Ye.create({persistence:this.deviceSessionRepository,timer:s,backoff:li,logger:e,timeoutMs:Cs,timeoutError:F}),this.getBarrier=a.barrier??Yt,this.stateRestore=d.createStateRestore(s,a),this.recoveredIntents=d.createRecoveredIntents(s),this.forcedStuckRelease=d.createForcedStuckRelease(s),this.liveness=d.createLiveness(),this.startCleanupTimer()}setRowWriter(s){this.rowWriter=s}getTimer(){return this.timer}sessionClockToWall(s){return this.timer.now()+(s-this.sessionNow())}wallToSessionClock(s){return this.sessionNow()+(s-this.timer.now())}async drainPendingDeviceCleanups(s){return this.flushDeferredRebindCleanups(),await this.deviceCleanupQuarantine.drain(s)}armPendingDeviceCleanupCaps(s){this.deviceCleanupQuarantine.armCaps(s)}async finishReleaseForcedBeforeStart(s){return this.sessionSlots.unmarkReleasing(s),null}managedExecutionRecoveries=new Map;persistAndPublishSession(s,n,a,d){return this.wiring.creation.persistAndPublishSession(s,n,a,d)}recordRestartRecoveryActivity(s){return this.wiring.persistedAdmission.recordRestartRecoveryActivity(s)}terminalizeExpiredPersistedSession(s,n){return this.wiring.persistedAdmission.terminalizeExpiredPersistedSession(s,n)}getSession(s){return this.expireIfDue(s,!1)}expireIfDue(s,n,a,d=!0){return this.wiring.leaseExpiry.expireIfDue(s,n,a,d)}releaseSessionPastIdleDeadline(s,n){return this.wiring.leaseExpiry.releaseSessionPastIdleDeadline(s,n)}recoverPersistedRow(s,n,a,d){return this.wiring.recoveryPublication.recoverPersistedRow(s,n,a,d)}reserveDevicesForRehydration(s,n,a){return this.wiring.rehydration.reserveDevicesForRehydration(s,n,a)}releaseRehydrationReservation(s,n){return this.wiring.rehydration.releaseRehydrationReservation(s,n)}slotShadowProbe=new _t(()=>this.getLegacyLifecycleView(),void 0,e,(s)=>this.sessionSlots.notifySettled(s));setSlotShadowProbeMode(s){this.slotShadowProbe.mode=s}releaseSessionForReason(s,n,a={}){return this.wiring.releaseRequests.releaseSessionForReason(s,n,a)}trackPendingTeardownCleanup(s,n){this.deviceCleanupQuarantine.trackTeardown(s,n)}withReleaseReason(s,n,a){return this.wiring.releaseCommit.withReleaseReason(s,n,a)}persistSessionRelease(s,n=!1,a){return this.wiring.releaseWrite.persistSessionRelease(s,n,a)}liftTerminalFence(s,n,a=!1,d){return this.wiring.releasePersistence.liftTerminalFence(s,n,a,d)}scheduleTerminalReleaseRetry(s){return this.wiring.releasePersistence.scheduleTerminalReleaseRetry(s)}trackReleaseDrainWrite(s){return this.wiring.releasePersistence.trackReleaseDrainWrite(s)}isTerminalReleaseRetryCurrent(s){return this.wiring.releasePersistence.isTerminalReleaseRetryCurrent(s)}retryTerminalReleaseWrite(s){return this.wiring.releasePersistence.retryTerminalReleaseWrite(s)}retriedReleaseWritePrecondition(s){return this.wiring.releasePersistence.retriedReleaseWritePrecondition(s)}retryPendingTerminalReleasesNow(){return this.wiring.releasePersistence.retryPendingTerminalReleasesNow()}isSessionBeingRecreated(s){return this.wiring.releasePersistence.isSessionBeingRecreated(s)}recordPendingNonTerminalRelease(s){return this.wiring.releasePersistence.recordPendingNonTerminalRelease(s)}waitForSessionSetup(s,n,a="release"){return this.wiring.bookkeeping.waitForSessionSetup(s,n,a)}retireRestorations(s,n){for(let a of[this.stateRestore.clockRestores,this.stateRestore.rotationRestores,this.stateRestore.screenReaderRestores])if(n==="removal"||a.policy.retiredOnIncarnationBump)a.retire(s)}trackPendingDeviceCleanup(s,n){this.deviceCleanupQuarantine.track(s,n)}updateSessionCache(s,n){return this.wiring.cache.updateSessionCache(s,n)}setLastHierarchy(s,n){return this.wiring.cache.setLastHierarchy(s,n)}setKeepScreenAwake(s,n){this.updateSessionCache(s,{keepScreenAwake:n})}invalidateAutomationReadinessForDevice(s,n){return this.wiring.cache.invalidateAutomationReadinessForDevice(s,n)}resetDeviceReadinessForDevice(s){return this.wiring.cache.resetDeviceReadinessForDevice(s)}setDeviceLabels(s,n){if(this.findSession(s))this.planLabels.indexDerivedLabels(s,n);this.updateSessionCache(s,{deviceLabels:n})}liveBaseOfDerivedId(s){return this.wiring.planLabelsLifecycle.liveBaseOfDerivedId(s)}getSessionCache(s){return this.wiring.cache.getSessionCache(s)}peekSession(s){return this.unlessBaseEnded(this.expireIfDue(s,!1,void 0,!1))}unlessBaseEnded(s){return this.wiring.admission.unlessBaseEnded(s)}livenessOwnerView(s){return this.wiring.leaseExpiry.livenessOwnerView(s)}refuseControlCallOnLapsedOwnerLease(s,n,a,d){return this.wiring.admission.refuseControlCallOnLapsedOwnerLease(s,n,a,d)}isSessionExpired(s){return this.wiring.leaseExpiry.isSessionExpired(s)}cancelExecutionsOverriddenByExpiry(s,n,a){return this.wiring.leaseExpiry.cancelExecutionsOverriddenByExpiry(s,n,a)}isSessionExpiredForNewExecution(s,n){return this.wiring.leaseExpiry.isSessionExpiredForNewExecution(s,n)}isLateExecutionWhileEarlierWorkIsActive(s,n,a="any"){return this.wiring.leaseExpiry.isLateExecutionWhileEarlierWorkIsActive(s,n,a)}startCleanupTimer(){this.cleanup.startCleanupTimer()}get testHooks(){return{sessions:this.sessions,wiring:this.wiring}}persistSession(s,n,a,d){return this.wiring.activityPersistence.persistSession(s,n,a,d)}recordPersistedRowGeneration(s,n){return this.wiring.activityPersistence.recordPersistedRowGeneration(s,n)}recoveryLivenessFromPersisted(s){return this.wiring.recovery.recoveryLivenessFromPersisted(s)}recordSessionActivity(s){return this.wiring.activityPersistence.recordSessionActivity(s)}persistSessionActivity(s,n){return this.wiring.activityPersistence.persistSessionActivity(s,n)}hasUnissuedActivity(s){return this.wiring.activityPersistence.hasUnissuedActivity(s)}recordHeartbeat(s){this.liveness.recordHeartbeat(s)}restartPreFirstHeartbeatGrace(s){this.liveness.restartPreFirstHeartbeatGrace(s)}claimLivenessOwnership(s,n){return this.liveness.claimLivenessOwnership(s,n)}releaseLivenessOwnership(s,n){return this.liveness.releaseLivenessOwnership(s,n)}hasLivenessOwnership(s,n){return this.liveness.hasLivenessOwnership(s,n)}claimUnownedLivenessOwnership(s,n){return this.liveness.claimUnownedLivenessOwnership(s,n)}bindAcquiredLivenessOwnerToken(s,n){return this.liveness.bindAcquiredLivenessOwnerToken(s,n)}adoptCliLivenessPolicy(s,n){return this.liveness.adoptCliLivenessPolicy(s,n)}adoptManagedExecutionLivenessPolicy(s,n={}){return this.liveness.adoptManagedExecutionLivenessPolicy(s,n)}restoreHeartbeatLivenessPolicy(s){return this.liveness.restoreHeartbeatLivenessPolicy(s)}}
4
- export{Xn,Vd,xI,yo,DN,Ny,vS,CI,Kl,rq,DI,OI,nq,iq,Fy,Ly,By,oq,MI,Gl,l7,u7,p7,bS,SS,ON,Ta,Yl,MN,NN,Jl,sq,hA,FN,Sr,Cs,LN,BN,Xl,$N,NI,s4,UN,oc,nm,wS,$y,Jt,Zl,Uy,a4,Zf,HN,FI,aq,Wd,sc,cq,Qf,dq,m7,qN,Gs,LI,gA,lq,uq,c4,VN,WN,zN,pq,BI};
2
+ import{e_,l0,NA,E4,vm,ir,t_,r_,ra,_4,BZ,_q,p0,ov,xq,Cq,$Z,UZ,lc,Jq}from"./chunk-8nj68t1v.js";import{h}from"./chunk-5wk1t46v.js";import{Zt,ci,Pg,ps,yD,ek,gz,wB,Qv,oR,kp,ine,H,Xe,V,ee,J,nt,Yr,ae,Yo,ie,Cg,v,Gn,z,Ve,Ws,Yn,L,fd,Sk,Du,Yt,Fg,gd,Np,Lg,MD,li,je,KB,o,P,Jg,yf,vf,Zr,oP,Mb,Yie,sP,oy,zp,kf,hO,Ga,x,Js,E}from"./chunk-sfqe223f.js";import{UP,i,Q,l,e}from"./chunk-r0vp315h.js";import{f,ei,Jt,_e,jr}from"./chunk-r6pvhj33.js";import{_r,Tc,yl,zL,ko}from"./chunk-4vxeq0vd.js";import{_h}from"./chunk-xezekwwn.js";import{Oe,jt,Tt}from"./chunk-e0870khr.js";import{mu,km}from"./chunk-z8tvs8nk.js";import{wn,Oi,Zc}from"./chunk-sqdrxjw5.js";import{r,t,u,Rt}from"./chunk-2b39zyxc.js";var ni="managed-execution";function Xd(s,n){return s==="managed-execution"&&n!=="lapsed"}class W extends t{sessionUuid;constructor(s){super(`Device session ${s} has no active row to record activity or ownership on.`);this.sessionUuid=s;this.name="DeviceSessionNotActiveError"}}class re extends t{sessionUuid;constructor(s){super(`Device session ${s} changed while it was being recovered; the recovery did not persist it.`);this.sessionUuid=s;this.name="DeviceSessionRowChangedError"}}class _ extends t{sessionUuid;constructor(s){super(`Device session ${s} was not released: its row is terminal or owned by a live peer.`);this.sessionUuid=s;this.name="DeviceSessionRowNotReleasableError"}}class U extends t{sessionUuid;constructor(s){super(`Device session ${s} was not rewritten: its row holds another terminal release or a live peer daemon owns it.`);this.sessionUuid=s;this.name="DeviceSessionRowNotRewritableError"}}class oe extends t{sessionUuid;constructor(s){super(`Device session ${s} was terminally released; its row was not made active again.`);this.sessionUuid=s;this.name="DeviceSessionTerminallyReleasedError"}}var ss=604800000,Pn=new Set(xq("recoverable")),le="device-restart:";function zI(s){return`${le}${s}`}function bo(s){return NA(s)===le}function JN(s,n){let a=n-ss;return(Xd(s.liveness_policy)||s.expires_at_ms>n)&&(s.released_at_ms===null||s.released_at_ms>=a)}function Qy(s,n){if(s.release_reason&&bo(s.release_reason)&&s.released_at_ms!==null){let a=s.released_at_ms+Ve;if((Xd(s.liveness_policy)||a<s.expires_at_ms)&&n>=a)return"restart-recovery-timeout"}return!Xd(s.liveness_policy)&&s.expires_at_ms<=n||s.release_reason==="expired"?"expired":void 0}function Ye(s){return s.or([s("liveness_policy","is",null),s("liveness_policy","!=",ni)])}function Ze(s){return s.or([s("release_reason","in",Array.from(Pn)),...Cq("recoverable").map((n)=>s("release_reason","like",`${n}_%`))])}function An(s,n){let a=p0(n),d=$Z(a);return s.or([...d.length>0?[s("release_reason","in",d)]:[],...UZ(a).map((c)=>s("release_reason","like",`${c}_%`))])}function es(s){return s.or([s("release_reason","in",xq("reissuableByName")),...Cq("reissuableByName").map((n)=>s("release_reason","like",`${n}_%`))])}function Mt(s){return s.or([s("release_reason","in",xq("terminal")),...Cq("terminal").map((n)=>s("release_reason","like",`${n}_%`))])}function Tn(s,n){return n.length>0?[s.or([s("device_sessions.daemon_session_id","is",null),s("device_sessions.daemon_session_id","not in",n)])]:[]}function _t(s,n,a,d){return s.and([s.or([s("device_sessions.release_reason","is",null),s.not(Mt(s)),...n.length>0?[s("device_sessions.release_reason","in",n)]:[]]),...Tn(s,a),...d===void 0?[]:[s.or([s("device_sessions.daemon_session_id","is",null),s("device_sessions.daemon_session_id","=",d)])]])}function xt(s){return ra(s)}function Lt(s){return{heartbeat_timeout_source:s.heartbeatTimeoutSource??null,has_received_heartbeat:s.hasReceivedHeartbeat?1:0,liveness_policy:s.livenessPolicy??null,pre_cli_heartbeat_timeout_ms:s.preCliHeartbeatTimeoutMs??null,pre_cli_heartbeat_timeout_source:s.preCliHeartbeatTimeoutSource??null,pre_cli_session_timeout_ms:s.preCliSessionTimeoutMs??null}}function En(s){return{heartbeat_timeout_source:s.heartbeat_timeout_source,has_received_heartbeat:s.has_received_heartbeat,liveness_policy:s.liveness_policy,pre_cli_heartbeat_timeout_ms:s.pre_cli_heartbeat_timeout_ms,pre_cli_heartbeat_timeout_source:s.pre_cli_heartbeat_timeout_source,pre_cli_session_timeout_ms:s.pre_cli_session_timeout_ms}}function Cn(s){let n=s.activitySeq??s.lastUsedAtMs,a=Lt(s);return{activity_seq:f`max(activity_seq, ${n})`,last_used_at_ms:B("last_used_at_ms",n,s.lastUsedAtMs),expires_at_ms:B("expires_at_ms",n,s.expiresAtMs),session_timeout_ms:B("session_timeout_ms",n,s.sessionTimeoutMs),heartbeat_timeout_ms:B("heartbeat_timeout_ms",n,s.heartbeatTimeoutMs),heartbeat_timeout_source:B("heartbeat_timeout_source",n,a.heartbeat_timeout_source),has_received_heartbeat:B("has_received_heartbeat",n,a.has_received_heartbeat),liveness_policy:B("liveness_policy",n,a.liveness_policy),pre_cli_heartbeat_timeout_ms:B("pre_cli_heartbeat_timeout_ms",n,a.pre_cli_heartbeat_timeout_ms),pre_cli_heartbeat_timeout_source:B("pre_cli_heartbeat_timeout_source",n,a.pre_cli_heartbeat_timeout_source),pre_cli_session_timeout_ms:B("pre_cli_session_timeout_ms",n,a.pre_cli_session_timeout_ms)}}function B(s,n,a){return f`CASE WHEN activity_seq > ${n} THEN ${f.ref(s)} ELSE ${a} END`}function On(s,n){return{session_uuid:s.sessionUuid,device_id:s.deviceId,stable_device_id:s.stableDeviceId??null,stable_identity_generation:0,platform:s.platform,status:s.status??"active",source:s.source??null,autolock_enabled:s.autolockEnabled?1:0,mcp_session_id:s.mcpSessionId??null,daemon_session_id:s.daemonSessionId??null,created_at_ms:s.createdAtMs,last_used_at_ms:s.lastUsedAtMs,activity_seq:s.activitySeq??s.lastUsedAtMs,expires_at_ms:s.expiresAtMs,released_at_ms:null,release_reason:null,session_timeout_ms:s.sessionTimeoutMs,heartbeat_timeout_ms:s.heartbeatTimeoutMs,...Lt(s),created_at:n,updated_at:n}}class MS{db;timer;constructor({db:s,timer:n=i}={}){this.timer=n,this.db=s??null}getDb(){return this.db??_e()}async upsertActiveSession(s,n=this.timer.now(),a={}){let{claimedRow:d,unlessTerminal:c,rewriteOverSupersededRelease:p}=a;await this.pruneExpiredSessions(n);let m;try{let S=await this.getDb(),R=jr(this.timer),g=On(s,R);m=await S.insertInto("device_sessions").values(g).onConflict((w)=>{let y=w.column("session_uuid").doUpdateSet({device_id:g.device_id,stable_device_id:g.stable_device_id,stable_identity_generation:f`stable_identity_generation + 1`,platform:g.platform,status:g.status,source:g.source,autolock_enabled:g.autolock_enabled,mcp_session_id:g.mcp_session_id,daemon_session_id:g.daemon_session_id,last_used_at_ms:g.last_used_at_ms,activity_seq:g.activity_seq,expires_at_ms:g.expires_at_ms,released_at_ms:null,release_reason:null,session_timeout_ms:g.session_timeout_ms,heartbeat_timeout_ms:g.heartbeat_timeout_ms,...En(g),liveness_contract_generation:f`liveness_contract_generation + 1`,updated_at:R});if(!d){if(p){let{livePeerDaemonSessionIds:b,expectedRowGeneration:A}=p;return y.where((k)=>k.and([_t(k,[],b,p.ownDaemonSessionId),...p.unlessReleased?[k("device_sessions.status","!=","released")]:[],...A===void 0?[]:[k("device_sessions.stable_identity_generation","=",A)]]))}return c?y.where((b)=>b.or([b("device_sessions.release_reason","is",null),b.not(Mt(b))])):y}return y.where("device_sessions.status","!=","active").where("device_sessions.stable_identity_generation","=",d.rowGeneration).where((b)=>d.daemonSessionId===null?b("device_sessions.daemon_session_id","is",null):b("device_sessions.daemon_session_id","=",d.daemonSessionId)).where((b)=>es(b))}).returning("stable_identity_generation").executeTakeFirst()}catch(S){throw e.warn(`[DeviceSessionRepository] Failed to upsert device session ${s.sessionUuid}: ${S}`),S}if(!m){if(d)throw new re(s.sessionUuid);throw p?new U(s.sessionUuid):new oe(s.sessionUuid)}return m.stable_identity_generation??0}async recordActivity(s,n){let a;try{let c=await(await this.getDb()).updateTable("device_sessions").set({...Cn(n),liveness_contract_generation:f`liveness_contract_generation + 1`,updated_at:jr(this.timer)}).where("session_uuid","=",s).where("status","=","active").executeTakeFirst();a=Number(c.numUpdatedRows)}catch(d){throw e.warn(`[DeviceSessionRepository] Failed to record activity for ${s}: ${d}`),u(d,`Failed to record activity for session ${s}`)}if(a===0)throw new W(s)}async recordRestartRecoveryActivity(s,n){try{await(await this.getDb()).updateTable("device_sessions").set({expires_at_ms:f`max(expires_at_ms, ${n} + session_timeout_ms)`,updated_at:jr(this.timer)}).where("session_uuid","=",s).where("release_reason","like",`${le}%`).where("released_at_ms","is not",null).execute()}catch(a){throw u(a,`Failed to record restart-recovery activity for session ${s}`)}}async claimRecoverableSession(s,n,a){try{return(await this.getDb().updateTable("device_sessions").set({daemon_session_id:a,stable_identity_generation:f`stable_identity_generation + 1`,updated_at:jr(this.timer)}).where("session_uuid","=",s).where("status","!=","active").where("stable_identity_generation","=",n.rowGeneration).where((c)=>n.daemonSessionId===null?c("daemon_session_id","is",null):c("daemon_session_id","=",n.daemonSessionId)).where((c)=>es(c)).returning("stable_identity_generation").executeTakeFirst())?.stable_identity_generation??void 0}catch(d){throw u(d,`Failed to claim recoverable session ${s}`)}}async releaseRecoverableSessionClaim(s,n,a){try{let d=await this.getDb().updateTable("device_sessions").set({daemon_session_id:a,stable_identity_generation:f`stable_identity_generation + 1`,updated_at:jr(this.timer)}).where("session_uuid","=",s).where("status","!=","active").where("stable_identity_generation","=",n.rowGeneration).where((c)=>n.daemonSessionId===null?c("daemon_session_id","is",null):c("daemon_session_id","=",n.daemonSessionId)).where((c)=>es(c)).executeTakeFirst();return Number(d.numUpdatedRows)===1}catch(d){throw u(d,`Failed to release the claim on session ${s}`)}}async recordLivenessOwnership(s,n){await this.replaceLivenessOwnership(s,n)}async replaceLivenessOwnership(s,n){try{let a=await this.getDb().updateTable("device_sessions").set({liveness_owner_token:n,updated_at:jr(this.timer)}).where("session_uuid","=",s).where("status","=","active").executeTakeFirst();if(Number(a.numUpdatedRows)!==1)throw new W(s)}catch(a){throw e.warn(`[DeviceSessionRepository] Failed to persist liveness ownership for ${s}: ${a}`),a}}async markAutolockSession(s,n){try{await(await this.getDb()).updateTable("device_sessions").set({status:"active",source:"autolock",autolock_enabled:1,mcp_session_id:n.mcpSessionId??null,daemon_session_id:n.daemonSessionId??null,activity_seq:f`max(activity_seq, ${n.activitySeq??n.lastUsedAtMs})`,last_used_at_ms:B("last_used_at_ms",n.activitySeq??n.lastUsedAtMs,n.lastUsedAtMs),expires_at_ms:B("expires_at_ms",n.activitySeq??n.lastUsedAtMs,n.expiresAtMs),released_at_ms:null,release_reason:null,updated_at:jr(this.timer)}).where("session_uuid","=",s).where("status","=","active").execute()}catch(a){throw e.warn(`[DeviceSessionRepository] Failed to mark autolock session ${s}: ${a}`),u(a,`Failed to persist autolock session ${s}`)}}async markReleased(s,n,a,{reason:d,...c}){let{expectedRowGeneration:p,onlyIfRecoverable:m,onlyIfExpiredAtMs:S,onlyIfOwnedByDaemon:R}=c;try{let w=(await this.getDb()).updateTable("device_sessions").set({status:n,released_at_ms:a,release_reason:d,...xt(d)?{}:{liveness_owner_token:null},updated_at:jr(this.timer)}).where("session_uuid","=",s).where((k)=>p0(d)===2?k.val(!0):k.or([k("release_reason","is",null),k.not(An(k,d))])).where((k)=>c.unlessDaemonShutdown?k.or([k("release_reason","is",null),k("release_reason","!=","daemon-shutdown")]):k.val(!0));if(p!==void 0)w=w.where("stable_identity_generation","=",p);if(m)w=w.where((k)=>Ze(k));let y=c.onlyIfRestartRecoveryHandoff;if(y)w=w.where("release_reason","like",`${le}_%`).where("released_at_ms","<=",y.releasedAtOrBeforeMs).where((k)=>k.or([k("liveness_policy","=",ni),k("expires_at_ms",">",f`released_at_ms + ${y.recoveryWindowMs}`)]));if(S!==void 0)w=w.where((k)=>Ye(k)).where("expires_at_ms","<=",S);if(R!==void 0)w=w.where("daemon_session_id","=",R);let b=c.unlessTerminalOrOwnedByLivePeer;if(b)w=w.where((k)=>_t(k,b.supersededReasons??[],b.livePeerDaemonSessionIds,b.ownDaemonSessionId));let A=await w.executeTakeFirst();if(Number(A.numUpdatedRows)===0)this.reportReleaseStatementMiss(s,d,c)}catch(g){if(g instanceof _)throw e.debug(`[DeviceSessionRepository] Release row refused for ${s}`),g;throw e.warn(`[DeviceSessionRepository] Failed to mark session ${s} ${n}: ${g}`),g}}reportReleaseStatementMiss(s,n,a){let d=a.unlessTerminalOrOwnedByLivePeer;if(a.unlessDaemonShutdown)throw new _(s);if(d&&(d.reportRefusal||d.ownDaemonSessionId!==void 0))throw new _(s);if(a.expectedRowGeneration!==void 0)e.info(`[DeviceSessionRepository] Skipped ${n} release of ${s}: the row is no longer generation ${a.expectedRowGeneration}`);else if(d)throw new _(s)}async markStaleActiveSessionsExpired(s,n,a="daemon-restart",d=new Set){let c=await this.getDb(),p=Array.from(d),m=p.some((S)=>S!==s);await c.updateTable("device_sessions").set({status:"expired",released_at_ms:n,release_reason:a,...xt(a)?{}:{liveness_owner_token:null},updated_at:jr(this.timer)}).where("status","=","active").where((S)=>{let R=S("daemon_session_id","!=",s),g=p.length===0?R:S.and([R,S("daemon_session_id","not in",p)]),w=S("daemon_session_id","is",null),y=m?S.and([w,Ye(S),S("expires_at_ms","<=",n)]):w;return S.or([y,g])}).execute()}async getSession(s){return await(await this.getDb()).selectFrom("device_sessions").selectAll().where("session_uuid","=",s).executeTakeFirst()}async listRecoverableSessions(s=this.timer.now(),n=()=>[]){let a=await this.getDb();await this.pruneExpiredSessions(s);let d=await a.selectFrom("device_sessions").selectAll().where((c)=>Ze(c)).where((c)=>c.or([c.and([Ye(c),c("expires_at_ms","<=",s)]),c.and([c("release_reason","like",`${le}_%`),c("released_at_ms","<=",s-Ve)])])).execute();for(let c of d)try{let p=Qy(c,s);await this.markReleased(c.session_uuid,"expired",s,{reason:p,expectedRowGeneration:c.stable_identity_generation??0,onlyIfRecoverable:!0,...p==="restart-recovery-timeout"?{onlyIfRestartRecoveryHandoff:{releasedAtOrBeforeMs:s-Ve,recoveryWindowMs:Ve}}:{onlyIfExpiredAtMs:s},unlessTerminalOrOwnedByLivePeer:{livePeerDaemonSessionIds:bo(c.release_reason)&&c.released_at_ms!==null&&s>=c.released_at_ms+Ve?n():[]}})}catch(p){e.warn(`[DeviceSessionRepository] Failed to terminalize expired recoverable session ${c.session_uuid}: ${r(p)}`,p);continue}return await a.selectFrom("device_sessions").selectAll().where((c)=>Ze(c)).where((c)=>c.or([c("released_at_ms","is",null),c("released_at_ms",">=",s-ss)])).where((c)=>c.or([c("liveness_policy","=",ni),c("expires_at_ms",">",s)])).where((c)=>c.or([c("release_reason","not like",`${le}_%`),c("released_at_ms","is",null),c("released_at_ms",">",s-Ve)])).orderBy("last_used_at_ms","desc").execute()}async pruneExpiredSessions(s){try{let n=await this.getDb(),a=s-ss;await n.deleteFrom("device_sessions").where("released_at_ms","is not",null).where("released_at_ms","<",a).execute()}catch(n){e.warn(`[DeviceSessionRepository] Failed to prune expired sessions: ${n}`,n)}}}var Ee=gz,Ce=3600000;class ts extends t{code;constructor(s,n,a){super(`${s}: ${n}`,a);this.code=s;this.name="BindingConfigError"}}var jI=1500;function ru(s){return s==="heartbeat"||s===ni}function Dn(s){return Number.isSafeInteger(s)&&s>=Ee&&s<=Ce}function vq(s){if(s===void 0)return ek;if(!Dn(s))throw new ts("binding_config_invalid",`managed execution idleTimeoutMs ${String(s)} must be an integer between ${Ee} and ${Ce}`);return s}function Nt(s){if(!Number.isFinite(s))return ek;return Math.min(Ce,Math.max(Ee,Math.trunc(s)))}function KI(s,n,a){return a-s<=n}function GI(s,n,a){return Math.max(s,Math.min(n,s+a))}function bq(s,n,a,d){return s-n>a+d}function G(s){let n=s.now-s.lastHeartbeat;if(n<=s.heartbeatTimeoutMs)return{phase:"live",remainingMs:s.heartbeatTimeoutMs-n};let a=s.heartbeatTimeoutMs+(s.graceMs??0);if(n<=a)return{phase:"suspect",remainingMs:a-n};return{phase:"lapsed",remainingMs:0}}function Ft(s){let{phase:n,remainingMs:a}=G(s),d=s.heartbeatTimeoutMs+(s.graceMs??0);return{state:n,remainingMs:a,holdRemainingMs:Math.max(0,d-(s.now-s.lastHeartbeat))}}function Bt(s){return Math.max(s.lastHeartbeat,s.stallForgivenAt??Number.NEGATIVE_INFINITY)}function Sq(s){return Math.max(s.lastOwnerHeartbeat??s.lastHeartbeat,s.stallForgivenAt??Number.NEGATIVE_INFINITY)}function Y(s){return s.livenessOwnerToken!==void 0&&s.lastOwnerHeartbeat===void 0&&s.livenessOwnerBoundAt!==void 0}function de(s){return s.livenessOwnerToken!==void 0&&s.hasReceivedHeartbeat}function ev(s){return de(s)?Sq(s):Bt(s)}function Ht(s,n){if(n===void 0||s.ownership!=="owned")return!0;let a=de(s)?s.lastOwnerHeartbeat??s.lastHeartbeat:s.lastHeartbeat;return KI(a,s.heartbeatTimeoutMs,n)}function tv(s){return ru(s.livenessPolicy)&&s.hasReceivedHeartbeat&&s.ownership==="owned"?ps:0}function $t(s,n){return{now:n,lastHeartbeat:Bt(s),heartbeatTimeoutMs:s.heartbeatTimeoutMs,livenessPolicy:s.livenessPolicy,graceMs:tv(s)}}function is(s,n,a=!1){let d=Y(s);return{...$t(s,n),lastHeartbeat:d?a?n:s.livenessOwnerBoundAt:Sq(s),graceMs:d&&ru(s.livenessPolicy)&&s.ownership==="owned"?ps:tv(s)}}function ce(s,n){return{...$t(s,n),lastHeartbeat:ev(s)}}var rv=_h,In=1e4;function _n(s){return typeof s==="function"?{hasActiveExecutions:s}:s}function wq(s){let{latestDeadlineMs:n}=s;if(Ut(n))return n+(s.deadlineGraceMs??In);return s.vetoedSince+(s.ceilingMs??rv)}function Wt(s){return s.hasActiveExecutions&&s.now<wq(s)}function Ut(s){return s!==void 0&&Number.isFinite(s)}class YI{ceilingMs;vetoedSince=new WeakMap;probe;now;constructor(s,n,a=rv,d){this.ceilingMs=a;this.probe=_n(s),this.now=d??(()=>n.now())}judge(s){if(!this.probe.hasActiveExecutions(s.sessionId))return this.vetoedSince.delete(s),{kind:"clear"};let n=this.now(),a=this.vetoedSince.get(s),d=a??n;if(a===void 0)this.vetoedSince.set(s,d);let c=this.probe.latestExecutionDeadlineMs?.(s.sessionId),p=wq({vetoedSince:d,latestDeadlineMs:c,ceilingMs:this.ceilingMs});if(n<p)return{kind:"kept",until:p,firstKept:a===void 0};return{kind:"expired",vetoedMs:n-d,bound:Ut(c)?"request-deadline":"ceiling"}}forget(s){this.vetoedSince.delete(s)}}function nu(s){return s?.forced===!0}var qt=new Set(["com.google.android.permissioncontroller","com.android.permissioncontroller"]),Gt=new Set(["com.android.systemui","android"]);function ns(s){return qt.has(s.packageName)&&s.activityName?.split(".").at(-1)==="GrantPermissionsActivity"}function Kt(s){let n=s.activityName;if(!n)return;if(ns(s))return{kind:"runtime-permission",package:s.packageName,activity:n};return Gt.has(s.packageName)?{kind:"system-dialog",package:s.packageName,activity:n}:void 0}function xn(s){let a=s?.find((d)=>d.isFocused===!0)?.packageName;if(!a)return;if(qt.has(a))return{kind:"runtime-permission",package:a};return Gt.has(a)?{kind:"system-dialog",package:a}:void 0}function OZ(s){let n=xn(s?.viewHierarchy?.windows),a=s?.activeWindow;if(n)return a?.appId===n.package&&a.activityName?{...n,activity:a.activityName}:n;if(!a)return;if(ns({packageName:a.appId,activityName:a.activityName}))return{kind:"runtime-permission",package:a.appId,activity:a.activityName};return a.systemOverlay===!0?{kind:"system-dialog",package:a.appId,activity:a.activityName}:void 0}function MZ(s){let n=s.kind==="runtime-permission"?`A system runtime permission prompt (${s.package}) is covering the app`:`A system window from ${s.package} is covering the app`,a=s.kind==="runtime-permission"?"answer it with tapOn on its permission_allow_button or permission_deny_button":"dismiss it (tapOn its button, or pressButton back)";return`${n}; scrolling will not reveal the field. Use observe to inspect it, ${a}, then retry.`}class rs{device;constructor(s){this.device=s}async put(s,n,a){return{success:(await E.getInstance(this.device).requestSettingsPut("secure",s,n,{valueType:a})).success}}async get(s){let a=await E.getInstance(this.device).requestSettingsGet("secure",s);return{success:a.success,found:a.found,value:a.value}}}var Mn=3000,Ln="android:id/button1";function Vt(s){if(!s.node)return[];return Array.isArray(s.node)?s.node:[s.node]}function Nn(s){let n=[],a=[s];for(let d=a.pop();d!==void 0;d=a.pop())n.push(d),a.push(...Vt(d));return n}function Fn(s){let n=[],a=[s];for(let d=a.pop();d!==void 0;d=a.pop())if(d.windowId!==void 0)n.push(d);else a.push(...Vt(d));return n.length>0?n:[s]}function Bn(s){let n=Nn(s);return n.some((d)=>d.text?.includes("TalkBack")||d["content-desc"]?.includes("TalkBack"))?n.find((d)=>d["resource-id"]===Ln):void 0}function Hn(s){let n=Fn(s).map(Bn).find((d)=>d!==void 0);if(!n)return{kind:"none"};let a=n.bounds;return{kind:"dialog",tap:a?{x:Math.round((a.left+a.right)/2),y:Math.round((a.top+a.bottom)/2)}:null}}class os{device;clientProvider;constructor(s,n=()=>E.getInstance(this.device)){this.device=s;this.clientProvider=n}async probe(){try{let n=(await this.clientProvider().requestHierarchySyncWithoutObservationStreamPush(void 0,!0,void 0,Mn))?.hierarchy.hierarchy;return n?Hn(n):{kind:"unavailable"}}catch(s){return e.warn(`[TalkBackDialogProbe] CtrlProxy hierarchy unavailable: ${r(s)}`),{kind:"unavailable"}}}}var X="com.google.android.marvin.talkback",$n=`${X}/${X}.TalkBackService`,zt=4,Qt=500,ds=4,cs=500,si=30000,ti=si+(zt-1)*Qt+(ds-1)*cs,Wn="A system runtime permission prompt is covering the screen after enabling TalkBack. On API 36 this was observed as the Android Accessibility Suite (TalkBack) notifications permission. The foreground activity does not identify the requested permission. Nothing was tapped. You must answer it: use observe to inspect the prompt, then tapOn its permission_allow_button or permission_deny_button.",Un="A system runtime permission prompt is covering the screen after enabling TalkBack. TalkBack has no runtime permission left to request, so another app raised it. Nothing was tapped. You must answer it: use observe to inspect the prompt, then tapOn its permission_allow_button or permission_deny_button.";function as(s,n){if(s.kind==="system-dialog")return`A system window (${s.package}/${s.activity}) is covering the screen after enabling TalkBack. Nothing was tapped. Use observe to inspect it, then dismiss it (tapOn its button, or pressButton back).`;return n?Wn:Un}var NZ=4000,ls=500,qn=2,Kn=["USER_FIXED","POLICY_FIXED","SYSTEM_FIXED"];async function Vn(s,n){await s?.beforeChange?.(n)}class NS{device;detector;adb;secureSettings;dialogProbe;timer;promptSettleMs;signal;constructor(s,n=null,a=li,{timer:d=i,promptSettleMs:c=0,signal:p,secureSettings:m,dialogProbe:S}={}){this.device=s;this.detector=a;this.timer=d,this.promptSettleMs=c,this.signal=p,this.adb=n??v.create(s),this.secureSettings=m??new rs(s),this.dialogProbe=S??new os(s)}async toggle(s,n){let a=null;if(s){if(a=await this.detectInstalledService(),!a)return{supported:!1,applied:!1,reason:"TalkBack service not installed on this device"}}let d=await this.detectTalkBackEnabled();if(d===null)return{supported:!0,applied:!1,reason:"could not determine TalkBack state: device accessibility settings read unavailable"};if(d===s)return{supported:!0,applied:!1,currentState:s};await Vn(n,d),this.detector.invalidateCache(this.device.deviceId);let c;try{if(s){await this.enableTalkBack(a);let p=await this.dismissPermissionDialog();if(p==="could-not-confirm")return e.warn("[TalkBackToggle] TalkBack permission dialog dismissal could not be confirmed"),await this.failedToggleResult("TalkBack permission dialog dismissal could not be confirmed");if(c=await this.readBlockingPrompt(),c)e.warn(`[TalkBackToggle] ${as(c,!0)}`);else if(p==="not-found")e.warn("[TalkBackToggle] TalkBack permission dialog not found \u2014 continuing")}else await this.disableTalkBack()}catch(p){let m=r(p);return e.warn(`[TalkBackToggle] Failed to ${s?"enable":"disable"} TalkBack: ${m}`),await this.failedToggleResult(m)}finally{this.detector.invalidateCache(this.device.deviceId)}return await this.confirmWithBlockingPrompt(s,c)}async confirmWithBlockingPrompt(s,n){let a=await this.confirmTalkBackState(s);if(n)return{...a,blockingPrompt:n,warning:as(n,!0)};if(!s||!a.applied)return a;let d=await this.awaitLateBlockingPrompt();if(!d)return a;let c=as(d.prompt,d.talkBackMayPrompt);return e.warn(`[TalkBackToggle] ${c}`),{...a,blockingPrompt:d.prompt,warning:c}}async awaitLateBlockingPrompt(){let s=Math.floor(this.promptSettleMs/ls);if(s===0)return;o(this.signal);let n=await this.talkBackMayStillPrompt(),a,d=0;for(let c=0;c<s;c++){await P(this.timer.sleep(ls),this.signal);let p=await this.readSettleForeground();if(o(this.signal),p.kind==="prompt")return{prompt:p.prompt,talkBackMayPrompt:n};let m=p.kind==="screen"?p.signature:void 0;if(d=m!==void 0&&m===a?d+1:1,a=m,!n&&m!==void 0&&d>=qn){e.debug(`[TalkBackToggle] Screen stable with no pending TalkBack permission after ${(c+1)*ls}ms; ending settle window`);return}}return}async talkBackMayStillPrompt(){try{let s=await this.adb.executeCommand(`shell dumpsys package ${X}`,{maxBuffer:ie,noRetry:!0});if(je(s.stdout,s.stderr??""))return!0;let n=wn(s.stdout,X)?.runtimePermissions;if(!n||n.size===0)return!0;return[...n.values()].some(({state:a,raw:d})=>{let c=typeof d?.flags==="string"?d.flags:"";return a!=="granted"&&!Kn.some((p)=>c.includes(p))})}catch(s){return e.debug("[TalkBackToggle] TalkBack permission read failed:",r(s)),!0}}async readSettleForeground(){try{let s=await this.adb.getForegroundApp(this.signal);if(!s)return e.debug("[TalkBackToggle] Foreground app unavailable; no prompt reported"),{kind:"unknown"};let n=Kt(s);if(n)return{kind:"prompt",prompt:n};return{kind:"screen",signature:`${s.packageName}/${s.activityName??""}`}}catch(s){return e.debug("[TalkBackToggle] Foreground prompt read failed:",r(s)),{kind:"unknown"}}}async failedToggleResult(s){let n=await this.detectTalkBackEnabled();return{supported:!0,applied:!1,...n!==null?{currentState:n}:{},reason:s}}async confirmTalkBackState(s){let n=await this.detectTalkBackEnabled();for(let d=1;n!==s&&d<ds;d++)await this.timer.sleep(cs),n=await this.detectTalkBackEnabled();let a;if(n!==s){let d=(ds-1)*cs;a=`TalkBack requested ${s?"enabled":"disabled"} but observed ${n===null?"unknown (could not determine)":n?"enabled":"disabled"} after ${d}ms of confirmation waits`,e.warn(`[TalkBackToggle] ${a}`)}return{supported:!0,applied:n===s,...n!==null?{currentState:n}:{},...a?{reason:a}:{}}}async readBlockingPrompt(){let s=await this.readSettleForeground();return s.kind==="prompt"?s.prompt:void 0}async detectTalkBackEnabled(){this.detector.invalidateCache(this.device.deviceId);let s=await this.detector.resolveState(this.device.deviceId,this.adb);return s===null?null:s.service==="talkback"}async writeSecureSetting(s,n,a="string"){try{if((await this.secureSettings.put(s,n,a)).success)return}catch(d){e.debug(`[TalkBackToggle] a11y settings put failed for secure/${s}: ${d}`)}await this.adb.executeCommand(`shell settings put secure ${s} ${n}`)}async deleteSecureSetting(s){try{if((await this.secureSettings.put(s,null)).success)return}catch(n){e.debug(`[TalkBackToggle] a11y settings delete failed for secure/${s}: ${n}`)}await this.adb.executeCommand(`shell settings delete secure ${s}`)}async readSecureSetting(s){try{let a=await this.secureSettings.get(s);if(a.success)return a.found?a.value??"":""}catch(a){e.debug(`[TalkBackToggle] a11y settings get failed for secure/${s}: ${a}`)}return(await this.adb.executeCommand(`shell settings get secure ${s}`)).stdout.trim()}async enableTalkBack(s){let a=[...await this.getOtherServices(),s].join(":");await this.writeSecureSetting("enabled_accessibility_services",a),await this.writeSecureSetting("accessibility_enabled","1","int")}async disableTalkBack(){let s=await this.getOtherServices();if(s.length===0)await this.deleteSecureSetting("enabled_accessibility_services"),await this.writeSecureSetting("accessibility_enabled","0","int");else await this.writeSecureSetting("enabled_accessibility_services",s.join(":"))}async getOtherServices(){let s=await this.readSecureSetting("enabled_accessibility_services"),n=[];if(s&&s!=="null")for(let a of s.split(":")){let d=a.trim();if(d&&!d.includes(X)&&!d.includes("TalkBackService"))n.push(d)}return n}async detectInstalledService(){try{if(!(await this.adb.executeCommand(`shell pm list packages ${X}`)).stdout.split(`
3
+ `).some((a)=>a.trim()===`package:${X}`))return e.debug("[TalkBackToggle] TalkBack package not found"),null;return e.debug("[TalkBackToggle] TalkBack package found; using known service component"),$n}catch(s){return e.error("[TalkBackToggle] Failed to detect TalkBack package:",s),null}}async dismissPermissionDialog(){let s={dialogSeen:!1,observed:!1,dumpUsed:!1};for(let n=0;n<zt;n++){if(n>0)await this.timer.sleep(Qt);let a=await this.dismissAttempt(s);if(a)return a}return s.dialogSeen||!s.observed?"could-not-confirm":"not-found"}async dismissAttempt(s){if(await this.detectTalkBackEnabled()===!0)return e.debug("[TalkBackToggle] TalkBack reads enabled; no consent dialog to dismiss"),s.dialogSeen?"dismissed":"not-found";let n=await this.lookForDialog(s);if(n.kind==="unavailable")return;if(s.observed=!0,n.kind==="none")return s.dialogSeen?"dismissed":void 0;if(s.dialogSeen=!0,!n.tap)return;if(await this.adb.executeCommand(`shell input tap ${n.tap.x} ${n.tap.y}`),(await this.lookForDialog(s)).kind==="none")return e.debug("[TalkBackToggle] TalkBack permission dialog dismissed"),"dismissed";return}async lookForDialog(s){let n=await this.dialogProbe.probe();if(n.kind!=="unavailable"||s.dumpUsed)return n;s.dumpUsed=!0;try{return this.classifyDump(await this.dumpWindowHierarchy())}catch(a){return e.warn("[TalkBackToggle] Dialog fallback hierarchy dump failed:",a),{kind:"unavailable"}}}classifyDump(s){let n=this.findTalkBackPermissionButton(s);if(!n)return{kind:"none"};let a=/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/.exec(n[0]);if(!a)return{kind:"dialog",tap:null};return{kind:"dialog",tap:{x:Math.round((parseInt(a[1],10)+parseInt(a[3],10))/2),y:Math.round((parseInt(a[2],10)+parseInt(a[4],10))/2)}}}findTalkBackPermissionButton(s){if(!s.includes("TalkBack"))return null;return/<node[^>]*resource-id="android:id\/button1"[^>]*\/?>/.exec(s)}async dumpWindowHierarchy(){return await this.adb.executeCommand("shell uiautomator dump /sdcard/window_dump.xml",{timeoutMs:si}),(await this.adb.executeCommand("shell cat /sdcard/window_dump.xml")).stdout}}var ii=1e4,zn=500;class FS{device;detector;processExecutor;timer;clientProvider;constructor(s,{detector:n=ko,processExecutor:a=new ee,timer:d=i,clientProvider:c=()=>x.getInstance(this.device)}={}){this.device=s;this.detector=n,this.processExecutor=a,this.timer=d,this.clientProvider=c}async toggle(s,n){if(await this.reportPreviousState(s,n),!this.isSimulator())return this.toggleViaSettings(s);return this.toggleViaSimctl(s)}async getEnabled(){return this.detector.invalidateCache(this.device.deviceId),this.detector.resolveState(this.device.deviceId,this.clientProvider())}async reportPreviousState(s,n){if(!n?.beforeChange)return;let a=null;try{a=await this.getEnabled()}catch(d){e.warn(`[VoiceOverToggle] Could not read VoiceOver state: ${r(d)}`)}if(a===null){e.warn(`[VoiceOverToggle] VoiceOver state on ${this.device.deviceId} was unreadable before the toggle; it will not be restored on session release`);return}if(a!==s)await n.beforeChange(a)}async toggleViaSettings(s){let a=await this.clientProvider().requestSetVoiceOverEnabled(s);if(!a.success){let d=a.error??"Failed to toggle VoiceOver via Settings";return e.warn(`[VoiceOverToggle] Failed to ${s?"enable":"disable"} VoiceOver via Settings: ${d}`),{supported:!1,applied:!1,reason:d}}return this.detector.invalidateCache(this.device.deviceId),{supported:!0,applied:!0,currentState:s}}async toggleViaSimctl(s){let n=s?"YES":"NO";try{await this.processExecutor.executeCommand("xcrun",Gn(["spawn",this.device.deviceId,"defaults","write","com.apple.Accessibility","VoiceOverTouchEnabled","-bool",n])),await this.processExecutor.executeCommand("xcrun",Gn(["spawn",this.device.deviceId,"notifyutil","-p","com.apple.accessibility.VoiceOverStatusDidChange"]));let c=s?"launchctl kickstart -p system/com.apple.VoiceOverTouch":"launchctl kill SIGTERM system/com.apple.VoiceOverTouch";try{await this.processExecutor.executeCommand("xcrun",Gn(["spawn",this.device.deviceId,...c.split(" ")]))}catch(p){if(s||!this.isServiceAlreadyStopped(p))throw p;e.debug("[VoiceOverToggle] VoiceOver service was already stopped")}}catch(c){let p=r(c);return e.warn(`[VoiceOverToggle] Failed to ${s?"enable":"disable"} VoiceOver: ${p}`),{supported:!0,applied:!1,reason:p}}let a=this.clientProvider(),d=await this.waitForState(s,a);if(d===null){let c=`VoiceOver state could not be confirmed within ${ii}ms`;return e.warn(`[VoiceOverToggle] ${c}`),{supported:!0,applied:!1,reason:c}}return{supported:!0,applied:d===s,currentState:d}}isSimulator(){return z({deviceId:this.device.deviceId})==="simulator"}async waitForState(s,n){let a=this.timer.now()+ii,d=null;while(!0){let c=a-this.timer.now();if(c<=0)return d;if(this.detector.invalidateCache(this.device.deviceId),d=await this.detector.resolveState(this.device.deviceId,n,{timeoutMs:c}),d===s||this.timer.now()>=a)return d;await this.timer.sleep(Math.min(zn,a-this.timer.now()))}}isServiceAlreadyStopped(s){return s instanceof Error&&s.message.includes("No process to signal.")}}var fe=ti+2000,jn={talkBack:(s)=>new NS(s),voiceOver:(s)=>new FS(s)};async function ri(s,n,a,d=jn){a?.throwIfAborted();let c=n.platform==="android"?await d.talkBack(s).toggle(n.previousEnabled):await d.voiceOver(s).toggle(n.previousEnabled);if(a?.throwIfAborted(),c.currentState===n.previousEnabled)return;let p=n.platform==="android"?"TalkBack":"VoiceOver",m=n.previousEnabled?"enabled":"disabled";throw Error(c.reason??`${p} was not confirmed ${m} while restoring ${s.deviceId}`)}var XN="anonymous-acquisition",_a="plan-label";function iu(s){return s.persistenceMetadata?.source===XN}var ZN=1000,QN=1000,ou=1000,Rq=15000,DA=250,e0=1000,wr=1e4,Os=Qv+1000,oi=2000,t0=e0+ZN+QN+ou+2*Os+oi;function r0(s){return t0+(s?.clock?Rq:0)+(s?.rotation?ou:0)+(s?.screenReader?fe:0)}var su=wr+2*Os+1e4,n0="session-creation-timeout",ai=Q({initialDelayMs:1000,maxDelayMs:30000}),JI=15000,A4=4,i0="plan-auto-release";function cc(){return ei(h.SESSION_HEARTBEAT_TIMEOUT_MS.name,h.SESSION_HEARTBEAT_TIMEOUT_MS.legacyName,{fallback:Pg})}var di=5000,ym=Ve;function LS(){return ei(h.SESSION_PRE_FIRST_HEARTBEAT_GRACE_MS.name,h.SESSION_PRE_FIRST_HEARTBEAT_GRACE_MS.legacyName,{fallback:di})}var De="release-persist-timeout";class F extends t{sessionId;releaseReason;timeoutMs;reason=De;constructor(s,n,a){super(`Persisting the ${n} release of session ${s} did not finish within ${a}ms (reason=${De}).`);this.sessionId=s;this.releaseReason=n;this.timeoutMs=a;this.name="SessionReleasePersistTimeoutError"}}class Ie extends t{constructor(s,n){super(`Failed to persist liveness activity for session ${s}.`,{cause:n});this.name="SessionActivityPersistenceError"}}class nv extends t{sessionUuid;release;constructor(s,n){super(`Cannot create device session ${s}: the daemon is shutting down.`);this.sessionUuid=s;this.release=n;this.name="DaemonSessionCreationRejectedError"}}class ge extends t{sessionUuid;deviceId;code=MD;retryable=!0;retryAfterMs=fd;constructor(s,n){super(`Session ${s} is past its idle deadline and its device ${n} is being recovered (code ${MD}); retry after the recovery settles to receive either the live session or the terminal idle answer.`);this.sessionUuid=s;this.deviceId=n;this.name="SessionHeldByRecoveryError"}}class ve extends t{sessionUuid;code=Lg;retryable=!0;retryAfterMs=fd;constructor(s){super(`Session ${s} is rebinding devices (code ${Lg}); retry shutdown after it settles.`);this.sessionUuid=s;this.name="SessionRebindingError"}}class Z extends t{sessionUuid;remainingMs;code=mu;constructor(s,n){super(`Session ${s} missed a liveness heartbeat and is being restored; its device stays reserved for ${Math.ceil(n/1000)}s. Retry this call now, without waiting. If the retry says the session was released, acquire a device again with getAndroid or getApple.`);this.sessionUuid=s;this.remainingMs=n;this.name="SessionSuspectError"}}class se extends t{sessionUuid;deviceId;code=Np;retryable=!1;nextAction=ci;constructor(s,n,a){super(`Session ${s} ${a} (code ${Np}, device '${n}').`);this.sessionUuid=s;this.deviceId=n;this.name="SessionTerminalReleaseInProgressError"}}var xe="is being terminally released from its device; use a new session UUID";class Xt extends Error{sessionUuid;release;constructor(s,n){super((n.releaseReason==="explicit-release"?`Session ${s} was released and cannot be reused. `:`Session ${s} is terminal after ${n.releaseReason} and cannot be reused. `)+"Acquire a new device with getAndroid or getApple.");this.sessionUuid=s;this.release=n;this.name="TerminalSessionError"}}class au extends t{sessionUuid;target;reason;terminalReleaseReason;code;deviceId;ownerPid;constructor(s,n,a,d){super(`Cannot safely recover session ${s}: ${n.platform} device '${n.stableDeviceId}' ${Qn(a,d)} (recovery reason: ${a}). The persisted session is terminal; acquire a new device with getAndroid or getApple.`);this.sessionUuid=s;this.target=n;this.reason=a;this.name="SessionRecoveryIdentityLossError",this.terminalReleaseReason=`identity-recovery-${a}`,this.code=a==="owned-by-other-daemon"?Du:void 0,this.deviceId=d?.deviceId,this.ownerPid=d?.ownerPid}}function Qn(s,n){switch(s){case"target-busy":return"is already in use";case"identity-continuity-lost":return"lost identity continuity";case"owned-by-other-daemon":return"is claimed by another AutoMobile daemon"+(n?.ownerPid===void 0?"":` (PID ${n.ownerPid})`)+` (code ${Du})`;case"target-absent":return"is unavailable"}}class iv extends t{data={code:km}}var ui=5,Xn=Q({initialDelayMs:250,maxDelayMs:5000});class us{collaborators;reasonPredecessors=new WeakMap;pendingReasserts=new Map;owedReasserts=new Map;backoff=Xn;constructor(s){this.collaborators=s}setBackoff(s){this.backoff=s}notePredecessors(s,n){this.reasonPredecessors.set(s,[...this.reasonPredecessors.get(n)??[],n.releaseReason])}predecessors(s){return this.reasonPredecessors.get(s)??[]}expectReassert(s){let n=this.pendingReasserts;n.set(s,(n.get(s)??0)+1);let a=!1;return()=>{if(a)return;a=!0;let d=(n.get(s)??1)-1;if(d>0)n.set(s,d);else n.delete(s)}}isReassertPending(s){return this.pendingReasserts.has(s)}owed(s){return this.owedReasserts.get(s)}owe(s,n){let a=s.sessionId,d=this.owedReasserts.get(a),c=d?.session===s?d:void 0;if(d?.handle!==void 0)this.collaborators.timer.clearTimeout(d.handle);let p={session:s,attempt:(c?.attempt??0)+1,drainAttempted:c?.drainAttempted,callbacks:n};this.owedReasserts.set(a,p),this.arm(p)}arm(s){let n=this.collaborators.draining();if(n&&!s.drainAttempted){this.collaborators.trackDrainWrite(this.retryDuringDrain(s));return}if(s.attempt>ui||n){this.collaborators.logger.warn(`[SessionManager] The live row of session ${s.session.sessionId} is still not re-persisted after ${s.attempt} attempt(s); its next activity write retries it`);return}s.handle=this.collaborators.timer.setTimeout(()=>{s.handle=void 0,this.collaborators.trackDrainWrite(s.callbacks.retry(s).then(()=>{}))},this.backoff.delayForAttempt(s.attempt)),s.handle.unref?.()}defer(s){if(this.owedReasserts.get(s.session.sessionId)!==s||s.handle!==void 0)return;s.attempt++,this.arm(s)}drop(s){if(s.handle!==void 0)this.collaborators.timer.clearTimeout(s.handle),s.handle=void 0;if(this.owedReasserts.get(s.session.sessionId)===s)this.owedReasserts.delete(s.session.sessionId)}settle(s){let n=this.owedReasserts.get(s.sessionId);if(n?.session===s)this.drop(n)}retryAllNow(){return Array.from(this.owedReasserts.values(),(s)=>{if(s.handle!==void 0)this.collaborators.timer.clearTimeout(s.handle),s.handle=void 0;return this.retryDuringDrain(s)})}retryDuringDrain(s){return s.drainAttempted=!0,s.callbacks.retryDuringDrain(s)}stopTimers(){for(let s of this.owedReasserts.values())if(s.handle!==void 0)this.collaborators.timer.clearTimeout(s.handle),s.handle=void 0}}class hs{loadUnconfirmed(){return[]}record(){return"volatile"}resolve(){}}function ms(s,n,a){return n==="cli-idle-timeout"&&a!==void 0?{baseSessionId:s,releaseReason:n,cliIdleTimeoutMs:a}:{baseSessionId:s,releaseReason:n}}class Ss{host;derivedLabelSessionsByBase=new Map;endedLabelBases=new Map;planLabelMints=new Map;runningPlanLabelSessions=new Set;constructor(s){this.host=s}indexDerivedLabels(s,n){let a=Object.values(n).filter((d)=>d!==s);if(a.length>0){let d=this.derivedLabelSessionsByBase.get(s)??[];this.derivedLabelSessionsByBase.set(s,new Set([...d,...a]))}}openPlanLabelMints(s,n){let a=[...new Set(Object.values(n))].filter((c)=>c!==s);for(let c of a)this.planLabelMints.set(c,(this.planLabelMints.get(c)??0)+1);let d=!0;return()=>{if(!d)return;d=!1;for(let c of a){let p=(this.planLabelMints.get(c)??1)-1;if(p>0)this.planLabelMints.set(c,p);else this.planLabelMints.delete(c)}}}isMinting(s){return this.planLabelMints.has(s)}isMintableAndNotLive(s){return this.planLabelMints.has(s)&&!this.host.hasSession(s)}creatorSource(s,n,a){return this.planLabelMints.has(s)?a:n}getBaseSessionOfDerivedLabel(s){for(let[n,a]of this.derivedLabelSessionsByBase)if(a.has(s))return n;return}liveBaseOfDerivedId(s,n){for(let a=s.lastIndexOf(":");a>0;a=s.lastIndexOf(":",a-1)){let d=s.slice(0,a);if(n(d))return d}return}markRunning(s){this.runningPlanLabelSessions.add(s)}isRunning(s){return this.runningPlanLabelSessions.has(s)}takeDerivedLabelSessions(s,n,a,d){let c=this.derivedLabelSessionsByBase.get(s);if(n!==void 0&&a(n)){let p=ms(s,n,d);for(let m of c??[])if(this.host.hasSession(m))this.endedLabelBases.set(m,p)}return this.derivedLabelSessionsByBase.delete(s),c?.forEach((p)=>this.runningPlanLabelSessions.delete(p)),c?[...c]:[]}retainedEndedBase(s){return this.endedLabelBases.get(s)}clearEndedBase(s){this.endedLabelBases.delete(s)}}class Rs{bySession=new Map;remember(s,n,a){let d=this.bySession.get(s)??{};if(n==="lastUsed"&&d.lastUsed&&a.sessionClockMs<d.lastUsed.sessionClockMs)return;if(this.bySession.delete(s),this.bySession.set(s,{...d,[n]:a}),this.bySession.size>512){let c=this.bySession.keys().next();if(!c.done)this.bySession.delete(c.value)}}recall(s,n,a){let d=this.bySession.get(s)?.[n];return d?.wallMs===a?d.sessionClockMs:void 0}wallStamp(s,n,a){let d=this.bySession.get(s)?.[n];return d?.sessionClockMs===a?d.wallMs:void 0}}function hi(s,n,a){let d=(c,p)=>a?.recall(s.session_uuid,c,p)??n.toSessionClock(p);return{...s,created_at_ms:d("created",s.created_at_ms),last_used_at_ms:d("lastUsed",s.last_used_at_ms),expires_at_ms:d("expires",s.expires_at_ms),released_at_ms:typeof s.released_at_ms==="number"?d("released",s.released_at_ms):s.released_at_ms}}var pi=(s,n)=>n===void 0?void 0:s.toWall(n);class mi{inner;frame;written=new Rs;constructor(s,n){this.inner=s;this.frame=n}store(s,n,a){let d=this.written.wallStamp(s,n,a)??this.frame.toWall(a);return this.written.remember(s,n,{wallMs:d,sessionClockMs:a}),d}upsertActiveSession(s,n,a){return this.inner.upsertActiveSession({...s,activitySeq:s.activitySeq??s.lastUsedAtMs,createdAtMs:this.store(s.sessionUuid,"created",s.createdAtMs),lastUsedAtMs:this.store(s.sessionUuid,"lastUsed",s.lastUsedAtMs),expiresAtMs:this.store(s.sessionUuid,"expires",s.expiresAtMs)},pi(this.frame,n),a)}getSession(s){return this.inner.getSession(s).then((n)=>n&&hi(n,this.frame,this.written))}listRecoverableSessions(s,n){return this.inner.listRecoverableSessions(pi(this.frame,s),n).then((a)=>a.map((d)=>hi(d,this.frame,this.written)))}recordActivity(s,n){return this.inner.recordActivity(s,{...n,activitySeq:n.activitySeq??n.lastUsedAtMs,lastUsedAtMs:this.store(s,"lastUsed",n.lastUsedAtMs),expiresAtMs:this.store(s,"expires",n.expiresAtMs)})}recordRestartRecoveryActivity(s,n){return this.inner.recordRestartRecoveryActivity(s,this.frame.toWall(n))}recordLivenessOwnership(...s){return this.inner.recordLivenessOwnership(...s)}claimRecoverableSession(...s){return this.inner.claimRecoverableSession(...s)}releaseRecoverableSessionClaim(...s){return this.inner.releaseRecoverableSessionClaim(...s)}replaceLivenessOwnership(...s){return this.inner.replaceLivenessOwnership(...s)}markReleased(s,n,a,{reason:d,...c}){return this.inner.markReleased(s,n,this.store(s,"released",a),{reason:d,...c})}}function Si(s,n){return new mi(s,n)}class fs{host;lifecycle;cleanupTimer=null;constructor(s,n){this.host=s;this.lifecycle=n}startCleanupTimer(){if(this.cleanupTimer=this.host.timer.setInterval(()=>{this.lifecycle.cleanupExpiredSessions()},this.lifecycle.CLEANUP_INTERVAL_MS),this.cleanupTimer&&typeof this.cleanupTimer.unref==="function")this.cleanupTimer.unref()}stopCleanupTimer(){if(this.cleanupTimer)this.host.timer.clearInterval(this.cleanupTimer),this.cleanupTimer=null;if(this.lifecycle.rehydrationFollowUpTimer)this.host.timer.clearTimeout(this.lifecycle.rehydrationFollowUpTimer),this.lifecycle.rehydrationFollowUpTimer=null;this.host.rowWriter.stopRetryTimers(),this.host.superseded.stopTimers(),this.host.stateRestore.stopAll(),this.host.rowWriter.clearPendingNonTerminalReleases()}}var ue={activeSessionExecutionChecker:()=>!1,sessionExecutionDeadlineLookup:()=>{return},expiryReleaseExecutionCanceller:()=>{return},deviceAcquisitionExecutionCanceller:()=>{return}};function Ri(s,n){let a=Object.entries(n).filter(([d,c])=>c===void 0||c===ue[d]).map(([d])=>d);if(a.length>0)throw new t(`${s} is missing daemon-attached collaborators: ${a.join(", ")}.`)}class gs{stallProbe;daemonSessionId;liveDaemonSessionIds;acceptingSessionCreations=!0;observerSessions;assertDaemonCollaboratorsAttached(){Ri("SessionManager",{daemonSessionId:this.daemonSessionId,activeSessionExecutionChecker:this.activeSessionExecutionChecker,sessionExecutionDeadlineLookup:this.sessionExecutionDeadlineLookup,expiryReleaseExecutionCanceller:this.expiryReleaseExecutionCanceller,deviceAcquisitionExecutionCanceller:this.deviceAcquisitionExecutionCanceller})}attachDaemonSessionId(s){this.daemonSessionId=s}attachLiveDaemonSessionIds(s){this.liveDaemonSessionIds=s}recoveredRowOwner(){return this.daemonSessionId??null}setObserverSessionRegistry(s){this.observerSessions=s,s.setStallProbe?.(this.stallProbe)}activeSessionExecutionChecker=ue.activeSessionExecutionChecker;livenessOwnerCallInFlightReader;ownerConnectedAtReader;sessionExecutionDeadlineLookup=ue.sessionExecutionDeadlineLookup;expiryReleaseExecutionCanceller=ue.expiryReleaseExecutionCanceller;deviceAcquisitionExecutionCanceller=ue.deviceAcquisitionExecutionCanceller;recoveryExpiryReleaseHandler;setRecoveryExpiryReleaseHandler(s){this.recoveryExpiryReleaseHandler=s}setActiveSessionExecutionChecker(s){this.activeSessionExecutionChecker=s}setLivenessOwnerCallInFlightReader(s){this.livenessOwnerCallInFlightReader=s}setOwnerConnectedAtReader(s){this.ownerConnectedAtReader=s}setSessionExecutionDeadlineLookup(s){this.sessionExecutionDeadlineLookup=s}setExpiryReleaseExecutionCanceller(s){this.expiryReleaseExecutionCanceller=s}setDeviceAcquisitionExecutionCanceller(s){this.deviceAcquisitionExecutionCanceller=s}managedExecutionRecoveryListener;setManagedExecutionRecoveryListener(s){this.managedExecutionRecoveryListener=s}stopAcceptingSessionCreations(){this.acceptingSessionCreations=!1}isAcceptingSessionCreations(){return this.acceptingSessionCreations}lateRehydrationListener;setLateRehydrationListener(s){this.lateRehydrationListener=s}releaseDeviceHold;setReleaseDeviceHold(s){this.releaseDeviceHold=s}setStallProbe(s){this.stallProbe=s,this.observerSessions?.setStallProbe?.(s)}}class vs{host;pending=new Map;work=new Map;bounds=new Map;teardownBounds=new WeakMap;acquisition=new Map;acquisitionBounds=new Map;constructor(s){this.host=s}get(s,n){if(n){let a=Array.from(this.work.get(s)??[]).filter((d)=>d!==n);return a.length>0?Promise.allSettled(a).then(()=>{return}):null}return this.pending.get(s)??null}hasAcquisitionWork(s){return this.acquisition.has(s)}async drain(s){let n=[...this.pending.values(),...this.acquisition.values()];if(n.length===0)return!0;let a=Symbol("device cleanup drain timeout");try{return await l(Promise.allSettled(n),{timer:this.host.timer,timeoutMs:s,label:"Device cleanup drain",timeoutError:()=>a}),!0}catch(d){if(d!==a)throw u(d,"Failed to drain pending device cleanups");return e.warn(`Timed out after ${s}ms draining pending device cleanups`),!1}}register(s,n,a){if(a===void 0){this.track(s,[n]);return}let d={};if(typeof a==="number")d.settlesBy=this.host.now()+a;else n=this.cap(s,n,d,a);this.trackBound(this.bounds,s,n,d),this.track(s,[n]),this.armCaps(s)}registerAcquisition(s,n,a){if(a!==void 0)this.trackBound(this.acquisitionBounds,s,n,{settlesBy:this.host.now()+a});let d=Promise.allSettled([n]).then(()=>{return}),c=this.acquisition.get(s),p=c?Promise.allSettled([c,d]).then(()=>{return}):d;this.acquisition.set(s,p),p.then(()=>{if(this.acquisition.get(s)===p)this.acquisition.delete(s)})}noteTeardownBound(s,n){this.teardownBounds.set(s,n)}trackTeardown(s,n){for(let a of n){let d=this.teardownBounds.get(a);if(d!==void 0)this.trackBound(this.bounds,s,a,{settlesBy:d})}this.track(s,n)}track(s,n){let a=this.work.get(s)??new Set;this.work.set(s,a);for(let p of n){a.add(p);let m=()=>{if(a.delete(p),a.size===0&&this.work.get(s)===a)this.work.delete(s)};p.then(m,m)}let d=this.pending.get(s),c=Promise.allSettled(d?[d,...n]:n).then(()=>{return});this.pending.set(s,c),c.then(()=>{if(this.pending.get(s)===c)this.pending.delete(s)})}armCaps(s){if(this.host.hasOwner(s))return;for(let n of this.bounds.get(s)??[])n.start?.()}retryAfterMs(s,n){let a=this.host.now(),d=[...n];for(let p of this.bounds.get(s)??[])if(p.start)d.push(a+this.host.teardownCapMs);else if(p.settlesBy!==void 0)d.push(p.settlesBy);if(!this.host.hasOwner(s)){for(let p of this.acquisitionBounds.get(s)??[])if(p.settlesBy!==void 0)d.push(p.settlesBy)}let c=Math.max(0,...d.map((p)=>p-a));return c>0?c:this.host.defaultRetryAfterMs}workCount(s){return this.work.get(s)?.size??0}boundCount(s){return this.bounds.get(s)?.size??0}trackBound(s,n,a,d){let c=s.get(n)??new Set;s.set(n,c),c.add(d);let p=()=>{if(c.delete(d),c.size===0&&s.get(n)===c)s.delete(n)};a.then(p,p)}cap(s,n,a,d){let c=this.host.teardownCapMs,p=Promise.withResolvers(),m=!1,S=()=>{m=!0,a.start=void 0,p.resolve()};return n.then(S,S),a.start=()=>{if(a.start=void 0,m)return;a.settlesBy=this.host.now()+c,l(n,{timer:this.host.timer,timeoutMs:c,unref:!0,label:d.name,onTimeout:()=>{try{d.abandon?.()}catch(R){e.warn(`Failed to abandon ${d.name} for ${s}: ${r(R)}`,R)}e.warn(`Abandoned ${d.name} for ${s} after ${c}ms; the device is no longer held for it and may still carry ${d.leftover}`)}}).then(S,(R)=>{e.debug(`Device cleanup wait ended for ${s}: ${r(R)}`),S()})},p.promise}}var gi="Rotation is not supported on this display (the screen size did not change)",vi="Rotation is not supported on the cover panel (the screen size did not change). Open the device to its inner panel (unfold the hinge) and retry there, or keep the current orientation.";function wi(s){return s?.display.role==="inner"?"the inner panel":"this display"}function ws(s){return`Rotation is not supported on ${wi(s)} (the screen size did not change)`}function Zn(s){return s?.display.role==="cover"?vi:`${ws(s)}. The runner reported a rotation but the screen size is unchanged.`}function er(s,n){return s?.display.role==="cover"&&n===gi?vi:void 0}function sr(s,n,a){return n?.display.role==="inner"&&a===gi?{...s,error:`${ws(n)}. Keep the current orientation.`}:s}function tr(s,n,a){let{requested:d,previous:c,current:p,previousObservation:m}=a,S=er(m,n.error);if(S)return{...s,success:!1,rotationPerformed:!1,error:S};if(p===d&&c!=="unknown"&&c!==d)return{...s,success:!0,rotationPerformed:!0,error:void 0,warning:`The runner reported "${n.error??"Failed to rotate iOS device"}" although the observed display changed from ${c} to ${p}.`,message:`Successfully rotated from ${c} to ${p}`};return sr(s,m,n.error)}function Me(s){switch(s){case"portrait":case"portrait_upside_down":return"portrait";case"landscape":case"landscape_left":case"landscape_right":return"landscape";default:return"unknown"}}function Le(s){if(!s)return"unknown";let n=s.rotation;if(n===0||n===2)return"portrait";if(n===1||n===3)return"landscape";let a=Tc(void 0,s.screenSize);return a===void 0?"unknown":a===0?"portrait":"landscape"}function nr(s,n,a,d){let c=s.rotationPerformed?`a completed rotation to ${n}`:`the device was already in ${n} orientation`,p=yi(d,s);return`${s.rotationPerformed&&Me(s.previousOrientation)==="unknown"&&p?`${ws(d)}. `:""}The display is still ${a} after the runner reported ${c} (currentOrientation: ${s.currentOrientation??"unknown"}).`}function yi(s,n){let a=s?.screenSize,d=n.observation?.screenSize;return Boolean(ar(s,n.observation)&&a&&d&&a.width===d.width&&a.height===d.height)===!0}function fi(s){return(s?.screenSize.width??0)>0&&(s?.screenSize.height??0)>0}function rr(s,n,a,d){let{previous:c,current:p}=a;return((s.success&&s.rotationPerformed||!s.success&&c!=="unknown"&&p===n)&&c!==n&&(p===n||p==="unknown")&&fi(d)&&fi(s.observation)&&yi(d,s))===!0}function or(s,n,a){return s.success&&a!=="unknown"&&a!==n}function ar(s,n){let a=s?.display?.key,d=n?.display?.key;return a===void 0||d===void 0||a===d}function lr(s,n,a){let d=Le(a),c=Le(s.observation),p={...s,previousOrientation:d==="unknown"?Me(s.previousOrientation):d,currentOrientation:c==="unknown"?Me(s.currentOrientation):c};if(rr(s,n,{previous:d,current:c},a)){let m=Zn(a),S=d!=="unknown";return{...p,currentOrientation:S?d:p.currentOrientation,...s.observation&&S?{observation:{...s.observation,rotation:a?.rotation}}:{},success:!1,rotationPerformed:!1,error:m,message:`Failed to rotate to ${n}; the screen size did not change.`}}if(or(s,n,c)){let m=nr(s,n,c,a);return{...p,success:!1,rotationPerformed:!1,error:m,message:`Failed to rotate to ${n}; the display is still ${c}.`}}if(!s.success)return tr(p,s,{requested:n,previous:d,current:c,previousObservation:a});return{...p,message:s.rotationPerformed?`Successfully rotated from ${p.previousOrientation} to ${p.currentOrientation}`:`Device is already in ${p.currentOrientation} orientation`}}function bi(s){let{width:n,height:a}=s?.screenSize??{width:0,height:0};if(n>0&&a>0&&n!==a)return n>a?"landscape":"portrait";return Le(s)}function ys(s){if(!s||!Number.isFinite(s.width)||!Number.isFinite(s.height)||s.width<=0||s.height<=0||s.width===s.height)return;return s.width>s.height?"landscape":"portrait"}function ki(s,n,a,d){let c=ys(d);if(!s.success||c===void 0||c===n)return s;let p=s.rotationPerformed?`a completed rotation to ${n}`:`the device was already in ${n} orientation`,m={...s};return delete m.observation,{...m,success:!1,rotationPerformed:!1,currentOrientation:c,error:`Rotation is not supported on ${wi(a)} (the display is still ${c} after the runner reported ${p}). Keep the current orientation.`,message:`Failed to rotate to ${n}; the display is still ${c}.`}}function Pi(s,n,a,d=!1){if(!d)return lr(s,n,a);let c=Le(a);return{...s,success:!1,rotationPerformed:!1,previousOrientation:c==="unknown"?Me(s.previousOrientation):c,currentOrientation:"unknown",error:`${s.error??"Rotate timed out"}; the orientation could not be confirmed.`,message:`Failed to rotate to ${n}; the orientation could not be confirmed.`}}class Ai{device;screenshotClient;constructor(s,n){this.device=s;this.screenshotClient=n}async readPixelSize(s,n,a){if(!Zr(this.device))return;try{let d=await(this.screenshotClient??new L(this.device)).screenshot(s,n,a),c=Ws(d);if(!c)e.warn("iOS rotate display probe could not read screenshot dimensions");return c??void 0}catch(d){o(a),e.warn(`iOS rotate display probe failed: ${r(d)}`,d);return}}}async function Ti(s,n){let{requested:a,previousObservation:d,device:c,probe:p,timer:m,signal:S}=n;if(!s.success)return s;let R=p??new Ai(c),g=s.observation?.display.key??d?.display.key,w=(A)=>ki(s,a,d,A),y=w(await R.readPixelSize(c.deviceId,g,S));if(y.success)return y;await P(m.sleep(200),S);let b=await R.readPixelSize(c.deviceId,g,S);return ys(b)===void 0?y:w(b)}var bs=(s)=>`The device orientation could not be restored to ${s} after the failed rotate; the next app may open rotated.`;async function ks(s,n,a){let d;try{let c=await s.awaitRecovery(x.OBSERVE_RECOVERY_WAIT_MS,a);d=`iOS runner recovery after ${n} timeout: ${c}${c==="recovered"?" (runner restarted)":""}.`}catch(c){o(a),e.warn(`iOS ${n} timeout recovery failed: ${r(c)}`,c),d=`iOS runner recovery after ${n} timeout: failed; ${r(c)}`}return o(a),d}function he(s,n){if(![0,1,2,3].includes(s))return null;return(n??!1)===(s===1||s===3)?"portrait":"landscape"}function Ps(s,n){return s==="landscape"===(n??!1)?0:1}async function we(s,n,a){try{let{stdout:d}=await s.executeCommand(a===void 0||a===0?"shell wm size":`shell wm size -d ${a}`,{signal:n}),c=d.match(/Override size:\s*(\d+)x(\d+)/)??d.match(/Physical size:\s*(\d+)x(\d+)/);return c?Number(c[1])>Number(c[2]):null}catch(d){return e.debug(`[OrientationReader] Failed to read natural display size: ${d}`),null}}class T4{adb;constructor(s){this.adb=s}async readOrientation(s,n){try{let a=await yl(this.adb,{signal:n});if(a===null)return null;let d=await we(this.adb,n);return he(a,d)}catch(a){return e.debug(`[OrientationReader] Failed to read Android orientation: ${a}`),null}}}class ye extends t{details;constructor(s){super(`Restoration of ${s.key}=${s.expected} read back ${s.actual??"unset"}: this device's window manager manages rotation per device state (fold posture), so the setting cannot be restored by writing it. Not retrying.`);this.name="RotationSettingManagedError",this.details={...s,retryable:!1}}}var K="device_state_rotation_lock";function As(s,n){let a=s.split(":");if(a.length<2||a.length%2!==0)return null;let d=a.findIndex((c,p)=>p%2===0&&c===String(n));if(d<0||a[d+1]!=="1")return null;return a[d+1]="2",a.join(":")}var te=1000,Ne=1000;class Ts{ctx;constructor(s){this.ctx=s}async readSystemSetting(s,n){return this.readSetting("system",s,n)}async readSetting(s,n,a){o(a);try{let d=E.getInstance(this.ctx().device),c=await P(d.requestSettingsGet(s,n),a);if(c.success)return c.found?c.value??null:null}catch(d){o(a),e.debug(`[Rotate] a11y settings get failed for ${n}: ${d}`)}o(a);try{let c=(await P(this.ctx().adb.executeCommand(`shell settings get ${s} ${n}`),a)).stdout.trim();return!c||c==="null"?null:c}catch(d){return o(a),e.warn(`Failed to read ${s} setting ${n}: ${d}`),null}}async writeRotationSettings(s){let{state:n,signal:a,assertCurrentDevice:d,skipIfCurrent:c}=s,p={needed:!1,assertCurrentDevice:d},m=[];if(n.userRotation!==null)m.push(["user_rotation",n.userRotation]);if(n.accelerometerRotation!==null)m.push(["accelerometer_rotation",n.accelerometerRotation]);let S=n.deviceStateRotationLock;await H(a,async()=>{if(c&&await this.settingsAlreadyMatch(m,a)&&(S===void 0||await this.readSetting("secure",K,a)===S))return;if(S!==void 0)try{await this.writeSetting({namespace:"secure",key:K,value:S,valueType:"string"},a,p)}catch(R){o(a),e.warn(`[Rotate] Failed to restore device_state_rotation_lock=${S}; restoring the rotation settings anyway: ${r(R)}`,R)}if(n.userRotation!==null)await this.writeSystemSetting("user_rotation",String(n.userRotation),a,p);if(n.accelerometerRotation!==null)await this.writeSystemSetting("accelerometer_rotation",String(n.accelerometerRotation),a,p);for(let[R,g]of m){let w=await this.readSystemSetting(R,a);if(w!==String(g))throw await this.readBackMismatch(R,g,w,a)}})}async settingsAlreadyMatch(s,n){for(let[a,d]of s)if(await this.readSystemSetting(a,n)!==String(d))return!1;return s.length>0}async readBackMismatch(s,n,a,d){let c=!1;try{let{stdout:p}=await P(this.ctx().adb.executeCommand("shell cmd device_state print-states"),d);c=yf(p).length>1}catch(p){o(d),e.warn(`[Rotate] Could not read device states after ${s} read-back mismatch: ${r(p)}`,p)}return c?new ye({key:s,expected:n,actual:a}):new t(`Restoration of ${s}=${n} did not verify by read-back (read ${a??"unset"}).`)}async readUserRotation(s){let n=await this.readSystemSetting("user_rotation",s);if(n===null||n.trim()==="")return null;let a=Number(n);return Number.isSafeInteger(a)?a:null}async rollbackUserRotation(s){let{previous:n,written:a,signal:d,slot:c}=s;if(a===null||d?.aborted||n===null)return;try{c?.get();let p=await this.readUserRotation(d);if(p!==a)return"Skipped user_rotation rollback: its current value no longer matches this call's write (another actor may have changed it).";if(p===n)return;await l(()=>this.writeRotationSettings({state:{userRotation:n,accelerometerRotation:null},signal:d,assertCurrentDevice:()=>{c?.get()}}),{timer:this.ctx().timer,timeoutMs:te,signal:d,label:"Rollback user_rotation"})}catch(p){return e.warn(`Failed to roll back user_rotation after rotation failure: ${r(p)}`,p),`Failed to roll back user_rotation: ${p}`}}async completeSessionRestore(s,n,a,d){if(n!==!1||s.orientationLockState!=="unlocked"||!a)return s;let c=a.get();if(!c)return s;try{await l(()=>this.writeRotationSettings({state:{userRotation:c.userRotation,accelerometerRotation:null},signal:d,assertCurrentDevice:()=>{a.get()}}),{timer:this.ctx().timer,timeoutMs:te,signal:d,label:"Restore original user_rotation"})}catch(p){e.warn(`Failed to restore original user_rotation after explicit automatic rotation: ${r(p)}`,p),s.warning=[s.warning,`Failed to restore original user_rotation: ${p}`].filter(Boolean).join(" ")}return s}async restoreAutoRotateSetting(s){await l(()=>H(void 0,async()=>{if(s.pendingWrite)try{await s.pendingWrite}catch(a){e.warn(`[Rotate] Pending setting write failed before cleanup: ${r(a)}`,a)}let n=await this.prepareDeviceStateLockForAutoRotate(s);if(await this.writeSystemSetting("accelerometer_rotation","1",void 0,s),n){let a=await this.readSystemSetting("accelerometer_rotation");if(a!=="1")throw new t(`accelerometer_rotation=1 read back ${a??"unset"} after restoring device_state_rotation_lock.`)}s.needed=!1}),{timer:this.ctx().timer,timeoutMs:te,label:"Restore accelerometer_rotation=1"})}async prepareDeviceStateLockForAutoRotate(s){let n=s.deviceStateLock;if(n===void 0)return!1;let a;if(n.kind==="restore")a=n.value;else{let d=await this.readSetting("secure",K);if(d===null)return!1;a=As(d,await this.readCommittedDeviceState())}if(a!==null)try{await this.writeSetting({namespace:"secure",key:K,value:a,valueType:"string"},void 0,s)}catch(d){e.warn(`[Rotate] Failed to write device_state_rotation_lock before restoring auto-rotate: ${r(d)}`,d)}return!0}async readCommittedDeviceState(){try{let{stdout:s}=await this.ctx().adb.executeCommand("shell cmd device_state state",{timeoutMs:te}),n=vf(s);if(n!==void 0)return n;e.warn(`[Rotate] Could not parse the committed device state from: ${s.trim()}`)}catch(s){e.warn(`[Rotate] Could not read the committed device state: ${r(s)}`,s)}return-1}async writeSystemSetting(s,n,a,d){await this.writeSetting({namespace:"system",key:s,value:n,valueType:"int"},a,d)}async writeSetting(s,n,a){let{namespace:d,key:c,value:p,valueType:m}=s;o(n),a?.assertCurrentDevice?.();try{let R=E.getInstance(this.ctx().device);a?.assertCurrentDevice?.();let g=R.requestSettingsPut(d,c,p,{valueType:m});if(a)a.pendingWrite=g;let w=await P(g,n);if(w.success)return;e.debug(`[Rotate] a11y settings put failed for ${c}: ${w.error}`)}catch(R){o(n),e.debug(`[Rotate] a11y settings put threw for ${c}: ${R}`)}o(n),a?.assertCurrentDevice?.();let S=this.ctx().adb.executeCommand(`shell settings put ${d} ${c} ${p}`);if(a)a.pendingWrite=S;await P(S,n)}}var Fe=150,dr=1000,Ei=3000,Ci=2,Es={maxAttempts:3,holdMs:0,windowMs:1/0},Di={maxAttempts:Math.ceil(Ei/Fe)+2,holdMs:dr,windowMs:Ei};class Cs{ctx;store;callNaturalLandscape;callScoped=!1;constructor(s,n){this.ctx=s;this.store=n}beginCall(){this.callScoped=!0,this.callNaturalLandscape=void 0}endCall(){this.callScoped=!1,this.callNaturalLandscape=void 0}async readNaturalAxes(s){if(this.callNaturalLandscape)return this.callNaturalLandscape.value;o(s);let n=await P(we(this.ctx().adb,s),s);if(o(s),this.callScoped)this.callNaturalLandscape={value:n};return n}async orientationOfRotation(s,n){return he(s,await this.readNaturalAxes(n))??"landscape"}async readLiveRotation(s){o(s);try{let n=this.ctx().deadlineMs,a=n===void 0?{signal:s}:{signal:s,timeoutMs:Math.max(n-this.ctx().timer.now(),zL)};return await P(yl(this.ctx().adb,a),s)}catch(n){return o(s),e.warn("[Rotate] Failed to read live rotation via dumpsys window",n),null}}updateSettleStreak(s,n,a,d){if(n!==null&&n===s.orientation)s.count++;else s.orientation=n,s.count=n===null?0:1,s.startedAt=a;return s.count>=Ci&&a-s.startedAt>=d}async readLiveRotationWithSettleWait(s,n,a=Es){o(n);let d=this.ctx().timer,c=d.now(),p={orientation:null,count:0,startedAt:c},m=null;for(let S=0;S<a.maxAttempts;S++){if(d.now()-c>=a.windowMs)break;let R=await this.readLiveRotation(n),g=R===null?null:await this.orientationOfRotation(R,n),w=d.now(),y=this.updateSettleStreak(p,g,w,a.holdMs);if(g!==null)m=g!==s&&p.count>=Ci?R:null;if(g===s&&y)return R;let b=a.windowMs-(w-c);if(b<=0||S+1>=a.maxAttempts)break;await P(d.sleep(Math.min(Fe,b)),n)}return m}async getCurrentOrientation(s){o(s);let n=await this.readLiveRotation(s);if(n!==null)return this.orientationOfRotation(n,s);let a=await this.store.readSystemSetting("user_rotation",s);if(!a||!/^\d+$/.test(a))return e.warn(`Invalid user_rotation value: ${a}, defaulting to portrait`),"portrait";let d=parseInt(a,10);return this.orientationOfRotation(d,s)}async getAutoRotateState(s){o(s);let n=await this.store.readSystemSetting("accelerometer_rotation",s);if(n===null||!/^\d+$/.test(n))return"unknown";return parseInt(n,10)===0?"locked":"enabled"}async getOrientationLockState(s){o(s);let n=await this.getAutoRotateState(s);if(n==="unknown")return"unknown";return n==="locked"?"locked":"unlocked"}}class Ds{ctx;reader;store;constructor(s,n,a){this.ctx=s;this.reader=n;this.store=a}async lockAlreadyAppliedOrientation(s,n,a,{options:d,signal:c}){o(c);let{beforeWrite:p,cleanup:m}=d,S=await this.reader.readLiveRotation(c);if(S===null)return{kind:"requires-rotation",reason:"live-rotation-unavailable"};if(await this.reader.orientationOfRotation(S,c)!==s)return{kind:"requires-rotation",reason:"live-orientation-changed"};await p({accelerometerRotation:!0,captureUserRotation:!0});try{await p({userRotation:S}),await this.store.writeSystemSetting("user_rotation",String(S),c,m),await p(),await this.store.writeSystemSetting("accelerometer_rotation","0",c,m),await this.ctx().awaitIdle.waitForRotation(S,void 0,c)}catch(y){return o(c),e.warn(`Failed to lock the current ${s} orientation: ${y}`,y),{kind:"handled",result:{success:!1,orientation:s,value:n,currentOrientation:a,previousOrientation:a,rotationPerformed:!1,orientationLockHandled:!1,orientationLockState:await this.reader.getOrientationLockState(c),error:`Failed to lock the device in its current ${s} orientation: ${y}`}}}let g=await this.reader.getOrientationLockState(c),w=await this.reader.readLiveRotation(c);if(g!=="locked"||w!==S){let y=w===null?"unknown":await this.reader.orientationOfRotation(w,c);return{kind:"handled",result:{success:!1,orientation:s,value:n,currentOrientation:y,previousOrientation:a,rotationPerformed:!1,orientationLockHandled:!1,orientationLockState:g,error:`Device was already in ${s} orientation, but its exact locked rotation could not be confirmed (auto-rotate is ${g}).`}}}return{kind:"handled",result:{success:!0,orientation:s,value:n,currentOrientation:a,previousOrientation:a,rotationPerformed:!1,orientationLockHandled:!0,orientationLockState:g,message:`Locked device orientation to ${s}.`}}}shouldReturnAlreadyAppliedOrientation(s,n,a){return s&&a==="locked"||n&&a==="unlocked"||!s&&!n}async handleAlreadyAppliedOrientation(s,n,a,{autoRotateState:d,plan:c}){let{preserveLock:p,restoreAutomaticRotation:m,beforeWrite:S,cleanup:R,signal:g}=c;if(o(g),a!==s)return{kind:"requires-rotation",reason:"orientation-differs"};let w=d==="locked"?"locked":d==="enabled"?"unlocked":"unknown";if(this.shouldReturnAlreadyAppliedOrientation(p,m,w))return{kind:"handled",result:{success:!0,orientation:s,value:n,currentOrientation:a,previousOrientation:a,rotationPerformed:!1,orientationLockHandled:!1,orientationLockState:w,message:`Device is already in ${s} orientation`}};if(p)return this.lockAlreadyAppliedOrientation(s,n,a,{options:{beforeWrite:S,cleanup:R},signal:g});if(!m)return{kind:"requires-rotation",reason:"orientation-differs"};await S({accelerometerRotation:!0}),R.deviceStateLock={kind:"clear"};let{achievedOrientation:y,warning:b}=await this.restoreAutoRotateAndConfirmOrientation(s,g,R),A=await this.reader.getOrientationLockState(g);if(A!=="unlocked"&&y!=="unknown")return{kind:"handled",result:{success:!1,orientation:s,value:n,currentOrientation:y,previousOrientation:a,rotationPerformed:!1,orientationLockHandled:!0,orientationLockState:A,error:`Automatic rotation could not be confirmed as restored (orientation lock is ${A}).`}};let k=y==="unknown"?"The end orientation could not be confirmed after restoring automatic rotation.":void 0;return{kind:"handled",result:{success:k===void 0,error:k,orientation:s,value:n,currentOrientation:y,previousOrientation:a,rotationPerformed:!1,orientationLockHandled:!0,orientationLockState:A,warning:b,message:k??`Restored automatic rotation; device is currently ${y}.`}}}resolveAutoRotatePlan(s,n,a=!1){let d=n===!0,c=n===!1,p=s==="enabled",m=a&&n===void 0&&p;return{preserveLock:d,restoreAutomaticRotation:c,wasAutoRotateEnabled:p,shouldRestoreAutoRotate:c||p&&!d&&!m,restoreAfterConfirmation:m,canForceAutoRotateOff:n!==void 0||s!=="unknown"}}logAutoRotatePlan(s,n,a){if(n)e.info("Keeping the requested orientation locked after rotation");else if(a)e.info("Rotating before explicitly restoring automatic rotation");else if(s==="locked")e.info("Orientation is locked; forcing the requested rotation");else if(s==="enabled")e.info("Auto-rotate is on; temporarily disabling it to force rotation");else e.info("accelerometer_rotation is unreadable; setting user_rotation only, without forcing accelerometer_rotation (no confirmed prior state to restore)")}async restoreAutoRotateAfterFailedLock(s,n,a,{cleanup:d,sessionMode:c}){if(s.success||c||!a.started||!n.preserveLock||!n.wasAutoRotateEnabled)return s;try{await this.store.restoreAutoRotateSetting(d)}catch(p){e.warn("Failed to restore auto-rotate after failed lock",p),s.warning=[s.warning,`Failed to restore auto-rotate: ${p}`].filter(Boolean).join(" ")}return s}async finalizeAndroidRotation(s){let{orientation:n,value:a,currentOrientation:d,achievedOrientation:c,warning:p,restoreConfirmed:m,preserveLock:S,restoreAutomaticRotation:R,wasAutoRotateEnabled:g,signal:w}=s;o(w);let y=await this.reader.getOrientationLockState(w),b=d!==n;if(c==="unknown")return{success:!1,orientation:n,value:a,currentOrientation:"unknown",previousOrientation:d,rotationPerformed:b,orientationLockHandled:g,orientationLockState:y,warning:p??"The end orientation could not be confirmed after restoring auto-rotate.",error:"The end orientation could not be confirmed after restoring auto-rotate.",message:"The end orientation could not be confirmed after restoring auto-rotate."};if(S&&y!=="locked"){let A=await this.confirmOrientationAfterAutoRotateRestore(n,!1,w);return{success:!1,orientation:n,value:a,currentOrientation:A.achievedOrientation,previousOrientation:d,rotationPerformed:b,orientationLockHandled:!1,orientationLockState:y,error:`${b?`Rotated to ${n}`:`Device is already in ${n} orientation`}, but the persistent orientation lock could not be confirmed (auto-rotate is ${y}).`}}if(R&&y!=="unlocked")return{success:!1,orientation:n,value:a,currentOrientation:c,previousOrientation:d,rotationPerformed:b,orientationLockHandled:!0,orientationLockState:y,error:`Rotated to ${n}, but automatic rotation could not be confirmed as restored (orientation lock is ${y}).`};if(c!==n){let A=m?"auto-rotate reverted it":`after attempting to restore auto-rotate, it was confirmed ${c}; auto-rotate may have reverted it`,k=`Requested ${n}, but the device is actually in ${c}; ${A}. Pass lockOrientation: true to keep the requested ${n} orientation.`;return{success:!1,orientation:n,value:a,currentOrientation:c,previousOrientation:d,rotationPerformed:c!==d,orientationLockHandled:g,orientationLockState:y,warning:p,error:k,message:k}}return{success:!0,orientation:n,value:a,currentOrientation:c,previousOrientation:d,rotationPerformed:b,orientationLockHandled:g,orientationLockState:y,warning:p,message:b?this.buildRotationMessage(n,d,c,{warning:p,restoreConfirmed:m}):`Locked device orientation to ${n}.`}}buildConfirmationWarning(s,n,a){if(a===s)return;if(a===null)return n?`Auto-rotate is enabled and the device's orientation after restoring it could not be confirmed (live rotation read failed); the requested ${s} orientation may not be held.`:`The device's orientation after attempting to restore auto-rotate could not be confirmed (live rotation read failed); the requested ${s} orientation may not be held.`;return n?`Auto-rotate is enabled and immediately reverted the device to ${a} based on the physical sensor; the requested ${s} orientation is not held.`:`The device reverted to ${a} after attempting to restore auto-rotate; the requested ${s} orientation is not held.`}async confirmOrientationAfterAutoRotateRestore(s,n,a){o(a);let d=await this.reader.readLiveRotationWithSettleWait(s,a,Di);if(d===null)return{achievedOrientation:"unknown",warning:this.buildConfirmationWarning(s,n,null)};let c=await this.reader.orientationOfRotation(d,a);return{achievedOrientation:c,warning:this.buildConfirmationWarning(s,n,c)}}async restoreAutoRotateAndConfirmOrientation(s,n,a={needed:!1}){let d;try{await this.store.restoreAutoRotateSetting(a)}catch(g){e.debug(`[Rotate] accelerometer_rotation restore write failed on first attempt, retrying once: ${g}`);try{await this.store.restoreAutoRotateSetting(a)}catch(w){d=w,e.warn(`[Rotate] accelerometer_rotation restore write failed after retry (ambiguous outcome) after confirming rotation to ${s}: ${w}`)}}if(n?.aborted&&d!==void 0)throw new t("Rotation cancelled; accelerometer_rotation may be left changed (auto-rotate may remain disabled)",{cause:d});let c=d===void 0,{achievedOrientation:p,warning:m}=await this.confirmOrientationAfterAutoRotateRestore(s,c,n);if(c)return{achievedOrientation:p,warning:m,restoreConfirmed:c};let S=`the accelerometer_rotation restore write failed after a retry (ambiguous outcome \u2014 could not confirm whether auto-rotate was actually re-enabled): ${d}`,R=m?`${m} Additionally, ${S}`:`Rotated to ${s}, but ${S}`;return{achievedOrientation:p,warning:R,restoreConfirmed:c}}buildRotationMessage(s,n,a,{warning:d,restoreConfirmed:c}){if(!d)return`Successfully rotated from ${n} to ${s}`;if(!c){if(a==="unknown")return`Rotated to ${s}, but after attempting to restore auto-rotate, the device's current orientation could not be confirmed`;if(a===s)return`Rotated to ${s}; after attempting to restore auto-rotate, the device was confirmed to remain ${a}`;return`Rotated to ${s}; after attempting to restore auto-rotate, the device was confirmed ${a}`}if(a==="unknown")return`Rotated to ${s}, but the device's orientation after auto-rotate restore could not be confirmed`;if(a!==s)return`Rotated to ${s}, but auto-rotate reverted the device to ${a}`;return`Successfully rotated from ${n} to ${s}`}}class Is{ctx;reader;store;readLiveRotation;constructor(s,n,a,d){this.ctx=s;this.reader=n;this.store=a;this.readLiveRotation=d}async readRotationAtReturn(s){let{signal:n}=s;try{let a=await l(()=>this.readLiveRotation(n),{timer:this.ctx().timer,timeoutMs:Ne,signal:n,label:"Confirm end-of-call rotation"});return o(n),a}catch(a){return o(n),e.warn("[Rotate] Failed to confirm end-of-call orientation",a),null}}async confirmAndroidOrientationAtReturn(s){let{result:n,orientation:a,signal:d,settings:c,restoreOnFailure:p}=s;if(!n.success||n.currentOrientation!==a)return n;let m=await this.readRotationAtReturn({signal:d});if(m===null){let k=`The end-of-call orientation could not be confirmed (live rotation read failed); the requested ${a} orientation may not be held.`,T={...n,success:!1,error:k,currentOrientation:"unknown",warning:[n.warning,k].filter(Boolean).join(" "),message:k};return p(T)}let S=await this.reader.orientationOfRotation(m,d);if(S===a)return n;let R=n.rotationPerformed===!1?`was already in ${a}`:`rotated to ${a}`,w=`${n.orientationLockState==="unlocked"?`The device ${R} and then returned to ${S} because automatic rotation is on.`:`The device left the requested ${a} orientation after the call confirmed it.`} The device is in ${S} at the time the call returned. Pass lockOrientation: true to keep the requested orientation.`,y=c?.started?await this.store.rollbackUserRotation({previous:c.previousUserRotation,written:c.writtenUserRotation,signal:d}):void 0,b=[n.warning,y].filter(Boolean).join(" ")||void 0,A={...n,success:!1,currentOrientation:S,error:w,message:w,...b?{warning:b}:{}};return p(A)}}var cr=2000,Ii=5;class ph extends Oe{static rotationLocks=new Map;store;reader;outcomes;endConfirmation;options;constructor(s,{adb:n=null,timer:a=i,options:d={},collaborators:c={}}={}){super(s,{adb:n,timer:a,displayFence:c});this.options=d;let p=()=>({device:this.device,adb:this.adb,timer:this.timer,awaitIdle:this.awaitIdle,deadlineMs:this.options.deadlineMs});this.store=new Ts(p),this.reader=new Cs(p,this.store),this.outcomes=new Ds(p,this.reader,this.store),this.endConfirmation=new Is(p,this.reader,this.store,(m)=>this.readLiveRotation(m))}readLiveRotation(s){return this.reader.readLiveRotation(s)}readLiveRotationWithSettleWait(s,n){return this.reader.readLiveRotationWithSettleWait(s,n,Es)}getCurrentOrientation(s){return this.reader.getCurrentOrientation(s)}async getRestoreState(s){if(o(s),this.device.platform==="ios")throw new t("iOS rotation restore state is unobservable");let n={accelerometerRotation:null,userRotation:null};return await this.captureSessionRotationOriginals({state:n,captureAccelerometer:!0,captureUser:!0,signal:s}),await this.captureDeviceStateRotationLock(n,s),n}async isOrientationLocked(s){return o(s),await this.reader.getAutoRotateState(s)==="locked"}getRotationLock(){let s=ph.rotationLocks.get(this.device.deviceId);if(!s)s=new Yn,ph.rotationLocks.set(this.device.deviceId,s);return s}async restoreRotationSettings(s,n){o(n),await this.getRotationLock().runExclusive(()=>this.store.writeRotationSettings({state:s,signal:n,skipIfCurrent:!0}))}async execute(s,{progress:n,lockOrientation:a,signal:d,display:c=0}={}){o(d);let p=J();p.serial("rotate");try{switch(this.device.platform){case"ios":if(c!==0)throw new t("Selecting a non-default display for rotate is supported only on Android devices.");return await this.executeIosRotation(s,n,p,d);case"android":if(c!==0)return await this.rotateNonDefaultDisplay(s,c,a,d);return await this.executeAndroidRotation({orientation:s,perf:p,lockOrientation:a,signal:d},n);default:throw Rt(this.device.platform,"rotate the device")}}catch(m){throw u(m,d?.aborted?"Rotation cancelled; device may still complete the change":"Failed to rotate device")}}async rotateNonDefaultDisplay(s,n,a,d){await this.assertDisplayExists(n,d);let c=await we(this.adb,d,n),p=Ps(s,c),m=a===!1?"free":"lock";await this.adb.executeCommand(`shell cmd window user-rotation -d ${n} ${m} ${p}`);let S=await this.readDisplayRotationUntil(n,(y)=>he(y,c)===s,d),R={orientation:s,value:p,rotationPerformed:!0};if(S===null){let y=`Display ${n}'s orientation after rotation could not be confirmed (live rotation read failed); the requested ${s} orientation may not be held.`;return{...R,success:!0,currentOrientation:"unknown",warning:y,message:y}}let g=he(S,c)??"unknown";if(g===s)return{...R,success:!0,currentOrientation:s,message:`Rotated display ${n} to ${s}`};let w=`Requested ${s} on display ${n}, but the display is actually in ${g} (rotation ${S}) after the rotation settled.`;return{...R,success:!1,currentOrientation:g,rotationPerformed:!1,error:w,message:w}}async readDisplayRotationUntil(s,n,a){let d=this.timer.now(),c=null;for(let p=1;p<=Ii;p++){o(a);try{let m=await yl(this.adb,{displayId:s,signal:a,timeoutMs:zL});if(c=m??c,m!==null&&n(m))return m}catch(m){o(a),e.warn(`[Rotate] Failed to read display ${s} rotation: ${r(m)}`,m)}if(p===Ii||this.timer.now()-d>=Ne)break;await P(this.timer.sleep(Fe),a)}return c}async assertDisplayExists(s,n){let a=[];try{let d=await this.adb.executeCommand("shell cmd display get-displays",{timeoutMs:cr,noRetry:!0,signal:n});o(n),a=Jg(d.stdout).map(({logicalId:c})=>c)}catch(d){if(o(n),d instanceof Error&&d.name==="AbortError")throw d;e.debug(`[Rotate] Could not read Android displays: ${d}`)}if(a.length===0){e.debug("[Rotate] Android display list is empty; skipping display existence check");return}if(!a.includes(String(s)))throw new t(`display ${s} not found; available: ${a.join(", ")}`)}async executeIosRotation(s,n,a,d){o(d);let c,p,m=!1,S=await this.observedInteraction(async(g)=>{c=g;try{o(d);let w=x.getInstance(this.device);p=w;let y=await a.track("iOSRotation",()=>P(w.requestRotate(s,5000,a),d));if(m=y.timedOut===!0,m)w.ensureRecoveryStarted();if(!y.success)return{success:!1,orientation:s,value:s==="portrait"?0:1,error:y.error??"Failed to rotate iOS device",currentOrientation:y.currentOrientation,previousOrientation:y.previousOrientation,rotationPerformed:y.rotationPerformed};return{success:!0,orientation:s,value:y.value,currentOrientation:y.currentOrientation,previousOrientation:y.previousOrientation,rotationPerformed:y.rotationPerformed,orientationLockHandled:!1,message:y.rotationPerformed?`Successfully rotated from ${y.previousOrientation} to ${y.currentOrientation}`:`Device is already in ${s} orientation`}}catch(w){throw o(d),u(w,"Failed to rotate iOS device")}},{...jt.noTreeResolution,timeoutMs:Tt.lifecycle,progress:n,perf:a,signal:d,skipUiStability:!0}),R=Pi(S,s,c,m);if(m&&p){let g=await ks(p,"rotate",d);return{...R,warning:[R.warning,g].filter(Boolean).join(" ")}}return R=await Ti(R,{requested:s,previousObservation:c,device:this.device,probe:this.options.iosDisplayPixelProbe,timer:this.timer,signal:d}),R.success?R:await this.restoreIosOrientationAfterFailure(R,p,c,{perf:a,signal:d})}async restoreIosOrientationAfterFailure(s,n,a,d){let{perf:c,signal:p}=d,m=bi(a);if(!n||m==="unknown"||m===s.orientation)return s;try{o(p);let S=await c.track("iOSRotationRestore",()=>P(n.requestRotate(m,5000,c),p));if(S.timedOut){n.ensureRecoveryStarted();let R=await ks(n,"rotate restore",p);return{...s,warning:`${bs(m)} ${R}`}}if(!S.success)throw Error(S.error??"runner reported failure");return s}catch(S){return o(p),e.warn(`iOS rotation restore to ${m} failed: ${r(S)}`,S),{...s,warning:bs(m)}}}async executeAndroidRotation(s,n){o(s.signal),this.reader.beginCall();try{return await this.runAndroidRotation(s,n)}finally{this.reader.endCall()}}async runAndroidRotation(s,n){let{orientation:a,perf:d,signal:c}=s,p={usesObservationForResolution:!1,changeExpected:!0,timeoutMs:Tt.lifecycle,progress:n,perf:d,signal:c,skipUiStability:!0},m={restoreOnFailure:async(R)=>R},S=await this.observedInteraction(async()=>{let R=this.getRotationLock().acquire(),g;try{g=await P(R,c)}catch(w){throw R.then((y)=>y()),u(w,"Could not acquire the device rotation lock")}try{let w=(b)=>this.performAndroidRotation(s,b,m),y=this.options.sessionRotation?await this.options.sessionRotation(w):await w();if(y.success&&y.rotationPerformed===!1)p.changeExpected=!1;return y}finally{g()}},p);return this.endConfirmation.confirmAndroidOrientationAtReturn({result:S,orientation:a,signal:c,settings:m.settings,restoreOnFailure:m.restoreOnFailure})}async captureSessionRotationOriginals(s){let{state:n,captureAccelerometer:a,captureUser:d,signal:c}=s;if(a&&n.accelerometerRotation===null){let p=await this.reader.getAutoRotateState(c);if(p==="unknown")throw new t("The current rotation setting accelerometer_rotation could not be read; retry rotation when settings are readable.");n.accelerometerRotation=p==="locked"?0:1}if(d&&n.userRotation===null){let p=await this.store.readUserRotation(c);if(p===null)throw new t("The current rotation setting user_rotation could not be read; retry rotation when settings are readable.");n.userRotation=p}}async captureDeviceStateRotationLock(s,n){let a=await this.store.readSetting("secure",K,n);if(a!==null)s.deviceStateRotationLock=a}rotationCallSettings(s,n,a){let d=s==="locked"?0:s==="enabled"?1:null,c={previousUserRotation:null,started:!1,writtenUserRotation:null,beforeWrite:async(p={})=>{let m=n?.get();if(!c.started)c.previousUserRotation=await this.store.readUserRotation(a);let S=m??{accelerometerRotation:d,userRotation:c.previousUserRotation};if(n){if(await this.captureSessionRotationOriginals({state:S,captureAccelerometer:p.accelerometerRotation===!0,captureUser:p.captureUserRotation===!0||p.userRotation!==void 0,signal:a}),!c.started&&c.previousUserRotation===null)c.previousUserRotation=S.userRotation;if(!m)await this.captureDeviceStateRotationLock(S,a);if(o(a),n.get(),!m)n.record(S)}if(c.started=!0,p.userRotation!==void 0)c.writtenUserRotation=p.userRotation}};return c}async finishAndroidRotation(s,n,a,d){let{lockOrientation:c,signal:p}=a;if(n.started&&!s.success&&s.currentOrientation!=="unknown"&&s.currentOrientation!==s.orientation){let m=await this.store.rollbackUserRotation({previous:n.previousUserRotation,written:n.writtenUserRotation,signal:p,slot:d});s.warning=[s.warning,m].filter(Boolean).join(" ")||void 0}return this.store.completeSessionRestore(s,c,d,p)}async performAndroidRotation(s,n,a){let{orientation:d,perf:c,lockOrientation:p,signal:m}=s;o(m);let S=Ps(d,await this.reader.readNaturalAxes(m)),[R,g]=await c.track("getOrientationState",()=>Promise.all([this.getCurrentOrientation(m),this.reader.getAutoRotateState(m)])),w=this.rotationCallSettings(g,n,m);if(a)a.settings=w;let y=this.outcomes.resolveAutoRotatePlan(g,p,n!==void 0),{preserveLock:b,restoreAutomaticRotation:A,wasAutoRotateEnabled:k,shouldRestoreAutoRotate:T,canForceAutoRotateOff:I}=y,O={needed:!1,assertCurrentDevice:()=>{n?.get()}};if(a)a.restoreOnFailure=(C)=>this.outcomes.restoreAutoRotateAfterFailedLock(C,y,w,{cleanup:O,sessionMode:n!==void 0});await this.planDeviceStateLock(O,{shouldRestoreAutoRotate:!n&&b&&k,autoRotateState:g,signal:m});let D=await this.outcomes.handleAlreadyAppliedOrientation(d,S,R,{autoRotateState:g,plan:{preserveLock:b,restoreAutomaticRotation:A,beforeWrite:w.beforeWrite,cleanup:O,signal:m}});if(D.kind==="handled")return await this.outcomes.restoreAutoRotateAfterFailedLock(D.result,y,w,{cleanup:O,sessionMode:n!==void 0}),this.finishAndroidRotation(D.result,w,{lockOrientation:p,signal:m},n);e.debug(`[Rotate] Continuing with requested rotation: ${D.reason.replaceAll("-"," ")}`);try{this.outcomes.logAutoRotatePlan(g,b,A),await c.track("setRotation",async()=>{if(await w.beforeWrite({accelerometerRotation:I,captureUserRotation:!0}),I)o(m),O.needed=T&&g!=="locked",await this.planDeviceStateLock(O,{shouldRestoreAutoRotate:T||y.restoreAfterConfirmation,autoRotateState:g,signal:m}),await this.store.writeSystemSetting("accelerometer_rotation","0",m,O);else e.debug("[Rotate] accelerometer_rotation is unconfirmed; writing user_rotation without changing the lock state");await w.beforeWrite({userRotation:S}),await this.store.writeSystemSetting("user_rotation",String(S),m,O)}),await c.track("waitForRotation",()=>this.awaitIdle.waitForRotation(S,void 0,m));let C=d,N,M=!0;if(T||y.restoreAfterConfirmation)({achievedOrientation:C,warning:N,restoreConfirmed:M}=await this.outcomes.restoreAutoRotateAndConfirmOrientation(d,m,O));let It=await this.outcomes.finalizeAndroidRotation({orientation:d,value:S,currentOrientation:R,achievedOrientation:C,warning:N,restoreConfirmed:M,preserveLock:b,restoreAutomaticRotation:A,wasAutoRotateEnabled:k,signal:m});return await this.outcomes.restoreAutoRotateAfterFailedLock(It,y,w,{cleanup:O,sessionMode:n!==void 0}),this.finishAndroidRotation(It,w,{lockOrientation:p,signal:m},n)}catch(C){return this.recoverAndroidRotation({error:C,orientation:d,value:S,currentOrientation:R,settings:w,cleanup:O,plan:y,lockOrientation:p,slot:n,signal:m})}}async planDeviceStateLock(s,n){let{shouldRestoreAutoRotate:a,autoRotateState:d,signal:c}=n;if(!a)return;if(d!=="enabled"){s.deviceStateLock={kind:"clear"};return}let p=await this.store.readSetting("secure",K,c);if(p!==null)s.deviceStateLock={kind:"restore",value:p}}async confirmAndroidRotationAfterError(s){let{orientation:n,settings:a,slot:d,signal:c}=s;if(a.writtenUserRotation===null)return{achievedOrientation:"unknown"};try{d?.get();let p=await l(()=>this.readLiveRotationWithSettleWait(n,c),{timer:this.timer,timeoutMs:te,signal:c,label:"Confirm rotation after error"});if(p!==null)return{achievedOrientation:await this.reader.orientationOfRotation(p,c)};return{achievedOrientation:"unknown",warning:"Orientation is unconfirmed; user_rotation was left unchanged because the rotation outcome is unknown."}}catch(p){return e.warn("Failed to confirm orientation after rotation error",p),{achievedOrientation:"unknown",warning:`Orientation is unconfirmed: ${p}`}}}async restoreAutoRotateAfterError(s){let{settings:n,cleanup:a,shouldRestoreAutoRotate:d,signal:c}=s,p;if(c?.aborted?a.needed:n.started&&d)try{await this.store.restoreAutoRotateSetting(a),e.info("Restored auto-rotate after error")}catch(m){e.warn(`Failed to restore auto-rotate: ${r(m)}`,m),p=u(m,"Failed to restore auto-rotate")}if(c?.aborted&&p)throw new t("Rotation cancelled; accelerometer_rotation may be left changed (auto-rotate may remain disabled)",{cause:p});return o(c),p}async recoverAndroidRotation(s){let{error:n,orientation:a,value:d,currentOrientation:c,settings:p,cleanup:m,plan:S,lockOrientation:R,slot:g,signal:w}=s,{shouldRestoreAutoRotate:y,preserveLock:b,restoreAutomaticRotation:A,wasAutoRotateEnabled:k}=S;if(e.warn("Failed to change device orientation",n),!p.started&&n instanceof t)throw n;let T=await this.restoreAutoRotateAfterError({settings:p,cleanup:m,shouldRestoreAutoRotate:y,signal:w}),I=await this.confirmAndroidRotationAfterError({orientation:a,settings:p,slot:g,signal:w}),{achievedOrientation:O,warning:D}=I;if(O===a){let C=!T;if(S.restoreAfterConfirmation){let M=await this.outcomes.restoreAutoRotateAndConfirmOrientation(a,w,m);O=M.achievedOrientation,D=[D,M.warning].filter(Boolean).join(" ")||void 0,C=M.restoreConfirmed}let N=await this.outcomes.finalizeAndroidRotation({orientation:a,value:d,currentOrientation:c,achievedOrientation:O,warning:[T?.message,D,`Rotation was confirmed after an earlier error: ${n}`].filter(Boolean).join(" "),restoreConfirmed:C,preserveLock:b,restoreAutomaticRotation:A,wasAutoRotateEnabled:k,signal:w});return await this.outcomes.restoreAutoRotateAfterFailedLock(N,S,p,{cleanup:m,sessionMode:g!==void 0}),this.finishAndroidRotation(N,p,{lockOrientation:R,signal:w},g)}if(O!=="unknown"){let C=await this.store.rollbackUserRotation({previous:p.previousUserRotation,written:p.writtenUserRotation,signal:w,slot:g});D=[D,C].filter(Boolean).join(" ")||void 0}return D=[D,T?.message].filter(Boolean).join(" ")||void 0,this.outcomes.restoreAutoRotateAfterFailedLock({success:!1,warning:D,orientation:a,value:d,currentOrientation:O,previousOrientation:c,rotationPerformed:!1,orientationLockHandled:k,orientationLockState:await this.reader.getOrientationLockState(w),error:`Failed to change device orientation: ${n}`},S,p,{cleanup:m,sessionMode:g!==void 0})}}var ur="7",hr="2147483647",pr="0",mr="60000";class o0{settingsClientProvider;deviceTraits;device;adb;constructor(s,n=v,a,d=Yr){this.settingsClientProvider=a;this.deviceTraits=d;this.device=s,this.adb=n.create(s)}async apply(s){if(!s)return{applied:!1,skipReason:"disabled"};if(this.device.platform!=="android")return{applied:!1,skipReason:"unsupported"};let n=await this.detectDeviceType();if(n==="emulator")return{applied:!1,skipReason:"emulator"};if(n==="unknown")return e.warn(`[KeepScreenAwake] Unable to detect device type for ${this.device.deviceId}; skipping keep-awake`),{applied:!1,skipReason:"detection_failed"};await this.wakeDevice();let a=await this.readSvcStayonState();if(await this.tryEnableSvcStayon()){let c=await this.readSvcStayonState();if(c.enabled===!0)return{applied:!0,method:"svc",svcWasEnabled:a.enabled,originalStayOnWhilePluggedIn:a.value};if(c.value===void 0)e.warn(`[KeepScreenAwake] Unable to verify svc stayon on ${this.device.deviceId}; falling back to settings`);else e.warn(`[KeepScreenAwake] svc stayon did not enable stay_on_while_plugged_in on ${this.device.deviceId}; falling back to settings`)}let d=await this.applySettingsFallback();if(!d.applied)return e.warn(`[KeepScreenAwake] Failed to keep screen awake on ${this.device.deviceId}`),{applied:!1,skipReason:"failed"};return{applied:!0,method:"settings",originalStayOnWhilePluggedIn:d.originalStayOnWhilePluggedIn,originalScreenOffTimeout:d.originalScreenOffTimeout,appliedSettings:d.appliedSettings}}async restore(s){if(!s.applied||this.device.platform!=="android")return{status:"skipped",reason:"not_applied"};if(s.method==="svc")return this.restoreSvcStayon(s);if(s.method!=="settings"||!s.appliedSettings)return{status:"skipped",reason:"not_applied"};let n=[],a=[];for(let[d,c,p,m,S]of[[s.appliedSettings.stayOnWhilePluggedIn,"global","stay_on_while_plugged_in",s.originalStayOnWhilePluggedIn,"int"],[s.appliedSettings.screenOffTimeout,"system","screen_off_timeout",s.originalScreenOffTimeout,"long"]]){if(!d)continue;let R=await this.restoreSetting(c,p,m,S);if(R.status==="failed")n.push(...R.failures);else if(R.status==="restored_to_baseline")a.push(...R.settings)}return this.restoreOutcome(n,a)}async restoreSvcStayon(s){let n;if(s.originalStayOnWhilePluggedIn!==void 0){let a=this.parseStayOnWhilePluggedIn(s.originalStayOnWhilePluggedIn),d=await this.restoreSetting("global","stay_on_while_plugged_in",s.originalStayOnWhilePluggedIn,"int");if(d.status==="restored")return d;if(a!==!1){if(a===void 0)e.warn(`[KeepScreenAwake] Failed svc stayon restore on ${this.device.deviceId}: original value unparseable`);return d}n=d}else{if(s.svcWasEnabled===void 0)return this.restoreUnknownSvcStayon();if(s.svcWasEnabled)return{status:"restored"}}try{return await this.adb.executeCommand("shell svc power stayon false"),{status:"restored"}}catch(a){return e.warn(`[KeepScreenAwake] Failed to disable svc stayon on ${this.device.deviceId}: ${a}`),{status:"failed",failures:[...n?.status==="failed"?n.failures:[],{setting:"svc_stayon",error:r(a)}]}}}async restoreUnknownSvcStayon(){let s=await this.restoreSetting("global","stay_on_while_plugged_in",void 0,"int"),n=s.status==="restored_to_baseline"?[...s.settings]:[],a=s.status==="failed"?[...s.failures]:[];try{await this.adb.executeCommand("shell svc power stayon false"),n.push({setting:"svc_stayon",value:"svc stayon false"})}catch(d){e.warn(`[KeepScreenAwake] Failed to disable svc stayon on ${this.device.deviceId}: ${d}`,d),a.push({setting:"svc_stayon",error:r(d)})}return this.restoreOutcome(a,n)}restoreOutcome(s,n){if(s.length)return{status:"failed",failures:s,...n.length?{baselineSettings:n}:{}};return n.length?{status:"restored_to_baseline",settings:n}:{status:"restored"}}async detectDeviceType(){if(this.device.deviceId.startsWith("emulator-"))return"emulator";try{let{isEmulator:s}=await this.deviceTraits.read(this.adb,this.device.deviceId);if(s===!0)return"emulator";if(s===!1)return"physical";return e.warn(`[KeepScreenAwake] Unexpected emulator flag on ${this.device.deviceId}; device type unknown`),"unknown"}catch(s){return e.warn(`[KeepScreenAwake] Failed to read device traits on ${this.device.deviceId}: ${r(s)}`,s),"unknown"}}async wakeDevice(){try{await this.adb.executeCommand("shell input keyevent KEYCODE_WAKEUP")}catch(s){e.warn(`[KeepScreenAwake] Failed to wake ${this.device.deviceId}: ${s}`)}}async tryEnableSvcStayon(){try{return await this.adb.executeCommand("shell svc power stayon true"),!0}catch(s){return e.info(`[KeepScreenAwake] svc power stayon failed on ${this.device.deviceId}, falling back: ${s}`),!1}}async applySettingsFallback(){let s=await this.readSetting("global","stay_on_while_plugged_in"),n=await this.readSetting("system","screen_off_timeout"),a={stayOnWhilePluggedIn:!1,screenOffTimeout:!1};try{await this.putSetting("global","stay_on_while_plugged_in",ur,"int"),a.stayOnWhilePluggedIn=!0}catch(d){e.warn(`[KeepScreenAwake] Failed to set stay_on_while_plugged_in on ${this.device.deviceId}: ${d}`)}try{await this.putSetting("system","screen_off_timeout",hr,"long"),a.screenOffTimeout=!0}catch(d){e.warn(`[KeepScreenAwake] Failed to set screen_off_timeout on ${this.device.deviceId}: ${d}`)}return{applied:a.stayOnWhilePluggedIn||a.screenOffTimeout,originalStayOnWhilePluggedIn:s,originalScreenOffTimeout:n,appliedSettings:a}}async readSvcStayonState(){let s=await this.readSetting("global","stay_on_while_plugged_in");return{value:s,enabled:this.parseStayOnWhilePluggedIn(s)}}parseStayOnWhilePluggedIn(s){if(s===void 0)return;if(s===null)return!1;let n=s.trim().toLowerCase();if(n==="true")return!0;if(n==="false")return!1;let a=Number.parseInt(n,10);if(Number.isNaN(a))return;return a!==0}async readSetting(s,n){try{let d=await this.settingsClientProvider(this.device).requestSettingsGet(s,n);if(d.success){let c=d.found?d.value??null:null;if(c===null)return null;let p=c.trim();return!p||p==="null"?null:p}}catch(a){e.debug(`[KeepScreenAwake] a11y settings get failed for ${s}/${n}: ${a}`)}try{let d=(await this.adb.executeCommand(`shell settings get ${s} ${n}`,{noRetry:!0})).stdout.trim();if(!d||d==="null")return null;return d}catch(a){e.warn(`[KeepScreenAwake] Failed to read ${s} ${n} on ${this.device.deviceId}: ${a}`);return}}async putSetting(s,n,a,d="string"){try{if((await this.settingsClientProvider(this.device).requestSettingsPut(s,n,a,{valueType:d})).success)return}catch(c){e.debug(`[KeepScreenAwake] a11y settings put failed for ${s}/${n}: ${c}`)}await this.adb.executeCommand(`shell settings put ${s} ${n} ${a}`)}async deleteSetting(s,n){try{if((await this.settingsClientProvider(this.device).requestSettingsPut(s,n,null)).success)return}catch(a){e.debug(`[KeepScreenAwake] a11y settings delete failed for ${s}/${n}: ${a}`)}await this.adb.executeCommand(`shell settings delete ${s} ${n}`)}async restoreSetting(s,n,a,d="int"){let c=n==="stay_on_while_plugged_in"?pr:mr;try{if(a===null)await this.deleteSetting(s,n);else await this.putSetting(s,n,a??c,d);return a===void 0?{status:"restored_to_baseline",settings:[{setting:n,value:c}]}:{status:"restored"}}catch(p){return e.warn(`[KeepScreenAwake] Failed to restore ${s} ${n} on ${this.device.deviceId}: ${p}`),{status:"failed",failures:[{setting:n,error:r(p)}]}}}}function _i(s){return new o0(s,v,(n)=>E.getInstance(n))}function xi(s){return{restore:async(n)=>{let a=await new Ga(s).setBiometricEnrollmentState(n);if(!a.supported||a.error||a.verified===!1)throw Error(a.error??"Failed to restore iOS Simulator biometric enrollment")}}}function Mi(s){return{restore:async(n)=>{let a=await new Ga(s).setState({networkCondition:{profile:n}});if(!a.success)throw Error(a.networkCondition?.error??a.error??"Failed to restore network condition")}}}function Li(s){return(n)=>({restore:async(a,d)=>{let c=new zp(v.create(n),d),p=await c.ensureRoot();if(!p.success)throw Error(p.error);a.rootedByUs||=p.rootedByUs;let m=await hO(n,c,a,{hostClock:s,mutationSignal:d,invalidate:(S)=>{if(!d?.aborted)Js(S,"Device clock restored")}});if(!m.verified)throw Error(m.error??"Clock restoration did not verify")}})}function Ni(s){return(n)=>({restore:(a,d)=>new ph(n,{adb:null,timer:s}).restoreRotationSettings(a,d)})}function Fi(s){return{restore:(n,a)=>ri(s,n,a)}}class _s extends Error{report;constructor(s,n){super(s);this.report=n;this.name="KeepAwakeRestoreError"}}class be{policy;onRetire;targets=new Map;generations=new Map;constructor(s,n=()=>{}){this.policy=s;this.onRetire=n}generation(s){return this.generations.get(s)??0}join(s,n,a,d){let c=this.targets.get(s),p=c?.get(n);if(p)return p.result;if(!c)c=new Map,this.targets.set(s,c);let m=Promise.withResolvers(),S={state:n,removed:!1,controller:new AbortController,result:m.promise,clear:a};return c.set(n,S),d(S).then(m.resolve,m.reject),S.result}retire(s){this.onRetire(s);let n=this.targets.get(s);this.generations.set(s,this.generation(s)+1);for(let a of n?.values()??[])a.removed=!0,a.controller.abort(),a.clear();this.targets.delete(s)}}var xs=2,Bi=5;function Hi(s){if(s instanceof ye)return!0;let n=typeof s==="object"&&s!==null&&"details"in s?s.details:void 0;return typeof n==="object"&&n!==null&&"retryable"in n&&n.retryable===!1}var Sr={kind:"rotation",retiredOnIncarnationBump:!1,setupHandoff:"track-eagerly",removedDuringSetupMessage:"Cannot change rotation: device was removed during session setup."},Rr={kind:"clock",retiredOnIncarnationBump:!0,setupHandoff:"await-then-track",removedDuringSetupMessage:"Cannot change the clock: device was removed during session setup."},fr={kind:"screen-reader",retiredOnIncarnationBump:!1,setupHandoff:"track-eagerly",removedDuringSetupMessage:"Cannot change the screen reader: device was removed during session setup."};class Ms{host;screenReaderRestores=new be(fr,(s)=>{this.abandonedScreenReaders.delete(s)});abandonedScreenReaders=new Map;abandonedScreenReaderRetries=new Map;screenReaderMutationQueues=new Map;screenReaderRestorer;screenReaderRestoreBackoff;clockMutationQueues=new Map;clockRestores=new be(Rr,(s)=>{let n=this.host.healthIncarnation(s);if(n!==void 0)this.host.clearHealthMarker(s,n,"clock");this.clockRegistry.retire(s)});clockRestorer;clockRegistry;rotationMutationQueues=new Map;abandonedRotations=new Map;abandonedRotationRetries=new Map;rotationRestores=new be(Sr,(s)=>{this.abandonedRotations.delete(s)});rotationRestoreBackoff;rotationRestorer;screenReaderKind={queue:this.screenReaderRestores,name:"Screen reader",timeoutMs:fe,mapStartError:(s)=>u(s,"Screen reader restoration failed"),prepare:(s,n)=>this.prepareScreenReaderRestore(s,n)};screenReaderRetry={attempts:xs,delayForAttempt:(s)=>this.screenReaderRestoreBackoff.delayForAttempt(s),isNonRetryable:()=>!1,logFirstFailure:(s,n)=>e.warn(`Failed to restore screen reader on ${s}`,n),logRetryFailure:(s,n,a)=>e.warn(`Screen reader restore retry ${n}/${xs} failed on ${s}`,a),abandon:(s,n)=>this.abandonScreenReaderRestore(s,n)};abandonedScreenReaderRestore={memory:this.abandonedScreenReaders,inFlight:this.abandonedScreenReaderRetries,timeoutMs:fe,label:"Screen reader restoration",restore:(s,n,a)=>this.screenReaderRestorer({name:s,deviceId:s,platform:n.platform}).restore(n,a),restored:(s,n)=>{this.forgetAbandonedRestore(this.abandonedScreenReaders,s,n),e.info(`Restored the screen reader on ${s} on its next natural attempt`)},failed:(s,n,a)=>e.warn(`Screen reader on ${s} is still not restored to ${n.previousEnabled?"enabled":"disabled"}`,a)};rotationKind={queue:this.rotationRestores,name:"Rotation",timeoutMs:ou,mapStartError:(s)=>u(s,"Rotation restoration failed"),prepare:(s,n)=>this.prepareRotationRestore(s,n)};rotationRetry={attempts:Bi,delayForAttempt:(s)=>this.rotationRestoreBackoff.delayForAttempt(s),isNonRetryable:Hi,logFirstFailure:(s,n)=>e.warn(`Failed to restore rotation on ${s}: ${r(n)}`),logRetryFailure:(s,n,a)=>e.warn(`Rotation restore retry ${n}/${Bi} failed on ${s}; device remains quarantined: ${r(a)}`),abandon:(s,n,a,d)=>this.abandonRotationRestore(s,n,a,d)};abandonedRotationRestore={memory:this.abandonedRotations,inFlight:this.abandonedRotationRetries,timeoutMs:ou,label:"Abandoned rotation restoration",restore:(s,n,a)=>this.rotationRestorer({name:s,deviceId:s,platform:"android"}).restore(n,a),restored:(s,n)=>{this.forgetAbandonedRestore(this.abandonedRotations,s,n),e.info(`Restored rotation settings on ${s} on its next natural attempt`)},failed:(s,n,a)=>{if(Hi(a)){this.forgetAbandonedRestore(this.abandonedRotations,s,n),e.warn(`Rotation settings on ${s} cannot be restored (window manager owns rotation); dropping the abandoned restore: ${r(a)}`);return}e.warn(`Rotation settings on ${s} are still not restored; will try again at the next session start or release: ${r(a)}`)}};clockKind={queue:this.clockRestores,name:"Clock",timeoutMs:Rq,mapStartError:(s)=>s,prepare:(s,n)=>this.prepareClockRestore(s,n)};constructor(s,n){this.host=s;this.screenReaderRestorer=n.screenReader,this.screenReaderRestoreBackoff=n.screenReaderBackoff,this.rotationRestorer=n.rotation,this.rotationRestoreBackoff=n.rotationBackoff,this.clockRestorer=n.clock,this.clockRegistry=n.clockRegistry??kf}runClockMutationExclusive(s,n){return ke(this.clockMutationQueues,s,n)}runRotationMutationExclusive(s,n){return ke(this.rotationMutationQueues,s,n)}runScreenReaderMutationExclusive(s,n){return ke(this.screenReaderMutationQueues,s,n)}forgetFencedRestore(s,n,a){let d=s.get(n);if(d?.get(a.state)!==a)return;if(d.delete(a.state),d.size===0)s.delete(n)}getPendingRestoration(s,n,a,{pendingSetups:d,start:c,again:p}){let m=a.assignedDevice;if(d){let R=s.generation(m);return{pending:d.then(async()=>{if(s.generation(m)!==R){delete a.cacheData[n];return}await(await p(a,null)).pending})}}let S=a.cacheData[n];if(!S)return{pending:null};return s.join(m,S,()=>{if(a.cacheData[n]===S)delete a.cacheData[n]},(R)=>c(m,R))}async startRestoration(s,n,a){let d=s.prepare(n,a),c=d.restore().then(()=>({outcome:"restored"}),(g)=>({outcome:"failed",error:g})),p=Error(`${s.name} restoration timed out`),m=await l(c,{timer:this.host.timer,timeoutMs:s.timeoutMs,label:`${s.name} restoration`,timeoutError:()=>p}).catch((g)=>{if(g===p)return{outcome:"timed-out"};throw s.mapStartError(g)});if(m.outcome==="restored")return{pending:null};if(this.host.hasIdentityReplacementFence(n))return this.forgetFencedRestore(s.queue.targets,n,a),{pending:null};d.quarantined(m.outcome,m.outcome==="failed"?m.error:p);let S=s.name.toLowerCase();return{pending:l(d.retry(c),{timer:this.host.timer,signal:a.controller.signal,label:`Pending ${S} restoration`}).catch((g)=>{if(!a.removed)throw u(g,`${s.name} restoration failed`);e.debug(`Retired ${S} restoration on removed device ${n}`)})}}async retryRestoreBounded(s,n,a,{restoration:d,restore:c}){let p=await d;if(p.outcome==="restored")return;if(s.logFirstFailure(n,p.error),s.isNonRetryable(p.error)){s.abandon(n,a,p.error,"without retrying");return}let m=p.error;for(let S=1;S<=s.attempts;S++){if(await this.host.timer.sleep(s.delayForAttempt(S)),a.removed)return;try{await c();return}catch(R){if(s.isNonRetryable(R)){s.abandon(n,a,R,`after ${S} retries`);return}m=R,s.logRetryFailure(n,S,R)}}s.abandon(n,a,m,`after ${s.attempts} retries`)}forgetAbandonedRestore(s,n,a){if(s.get(n)===a)s.delete(n)}async retryAbandonedAfter(s,n){try{await s}finally{await n()}}retryAbandonedRestore(s,n){let a=s.memory.get(n);if(!a)return Promise.resolve();let d=s.inFlight.get(n);if(d)return d;let c=new AbortController,p=this.host.restoreGeneration(n),m=(async()=>{try{await l(this.host.dispatchDeviceRestore(n,(S)=>s.restore(n,a,AbortSignal.any([S,c.signal])),p),{timer:this.host.timer,timeoutMs:s.timeoutMs,label:s.label}),s.restored(n,a)}catch(S){c.abort(),s.failed(n,a,S)}})().finally(()=>{if(s.inFlight.get(n)===m)s.inFlight.delete(n)});return s.inFlight.set(n,m),m}trackRestoreSetup(s,n,a,{createSetup:d,startRestore:c}){let p=a.assignedDevice,m=s.generation(p),S=()=>!this.host.isPublished(a)&&Boolean(a.cacheData[n]);return this.host.trackSessionSetup(a,async()=>{try{await d(()=>{if(s.generation(p)!==m)throw new t(s.policy.removedDuringSetupMessage)})}finally{if(s.generation(p)!==m)delete a.cacheData[n];else if(S()&&s.policy.setupHandoff==="await-then-track"){let R=await c();if(R.pending)this.host.trackPendingDeviceCleanup(p,[R.pending])}else if(S()){let R=c().then(async({pending:g})=>{await g});this.host.trackPendingDeviceCleanup(p,[R])}}})}async getPendingScreenReaderRestoration(s,n){return this.getPendingRestoration(this.screenReaderRestores,"screenReader",s,{pendingSetups:n,start:(a,d)=>this.startScreenReaderRestoration(a,d),again:(a,d)=>this.getPendingScreenReaderRestoration(a,d)})}startScreenReaderRestoration(s,n){return this.startRestoration(this.screenReaderKind,s,n)}prepareScreenReaderRestore(s,n){let a={name:s,deviceId:s,platform:n.state.platform},d=this.host.restoreGeneration(s),c=()=>this.host.dispatchDeviceRestore(s,async(p,m,S)=>{let R=AbortSignal.any([n.controller.signal,p]);n.controller.signal.throwIfAborted(),m.throwIfAborted(),await this.screenReaderRestorer(a).restore(n.state,R),S(),n.controller.signal.throwIfAborted(),n.clear(),this.forgetFencedRestore(this.screenReaderRestores.targets,s,n)},d,6);return{restore:c,quarantined:(p,m)=>e.warn(`Screen reader restore ${p}; quarantining ${a.deviceId}`,m),retry:(p)=>this.retryRestoreBounded(this.screenReaderRetry,a.deviceId,n,{restoration:p,restore:c})}}abandonScreenReaderRestore(s,n){if(n.removed)return;let{platform:a,previousEnabled:d}=n.state;e.warn(`Gave up restoring the screen reader on ${s} after ${xs} retries; ${a==="ios"?"VoiceOver":"TalkBack"} should be ${d?"enabled":"disabled"} but was not confirmed. Will try once more at the next session start or release on this device.`),this.abandonedScreenReaders.set(s,n.state),n.clear(),this.forgetFencedRestore(this.screenReaderRestores.targets,s,n)}retryAbandonedScreenReaderAfter(s,n){return this.retryAbandonedAfter(n,()=>this.retryAbandonedScreenReaderRestore(s))}retryAbandonedScreenReaderRestore(s){return this.retryAbandonedRestore(this.abandonedScreenReaderRestore,s)}trackScreenReaderSessionSetup(s,n){return this.trackRestoreSetup(this.screenReaderRestores,"screenReader",s,{createSetup:n,startRestore:()=>this.getPendingScreenReaderRestoration(s,null)})}async getPendingRotationRestoration(s,n){return this.getPendingRestoration(this.rotationRestores,"rotation",s,{pendingSetups:n,start:(a,d)=>this.startRotationRestoration(a,d),again:(a,d)=>this.getPendingRotationRestoration(a,d)})}startRotationRestoration(s,n){return this.startRestoration(this.rotationKind,s,n)}prepareRotationRestore(s,n){let a={name:s,deviceId:s,platform:"android"},d=this.host.restoreGeneration(s),c=()=>this.host.dispatchDeviceRestore(s,async(p,m,S)=>{let R=AbortSignal.any([n.controller.signal,p]);n.controller.signal.throwIfAborted(),m.throwIfAborted(),await this.rotationRestorer(a).restore(n.state,R),S(),n.controller.signal.throwIfAborted(),n.clear(),this.forgetFencedRestore(this.rotationRestores.targets,s,n)},d,5);return{restore:c,quarantined:(p,m)=>e.warn(`Rotation restore ${p}; quarantining ${a.deviceId}: ${r(m)}`),retry:(p)=>this.retryRestoreBounded(this.rotationRetry,a.deviceId,n,{restoration:p,restore:c})}}abandonRotationRestore(s,n,a,d){if(n.removed)return;let{userRotation:c,accelerometerRotation:p,deviceStateRotationLock:m}=n.state,S=m===void 0?"":`, device_state_rotation_lock=${m}`;if(e.warn(`Gave up restoring rotation settings on ${s} ${d} (user_rotation=${c??"unchanged"}, accelerometer_rotation=${p??"unchanged"}${S} not confirmed: ${r(a)}); releasing the device from cleanup. A fold or display change during the session can make the recorded settings unverifiable. Will try once more at the next session start or release on this device.`),!this.abandonedRotations.has(s))this.abandonedRotations.set(s,n.state);n.clear(),this.forgetFencedRestore(this.rotationRestores.targets,s,n)}retryAbandonedRotationAfter(s,n){return this.retryAbandonedAfter(n,()=>this.retryAbandonedRotationRestore(s))}retryAbandonedRotationRestore(s){return this.retryAbandonedRestore(this.abandonedRotationRestore,s)}trackRotationSessionSetup(s,n){return this.trackRestoreSetup(this.rotationRestores,"rotation",s,{createSetup:n,startRestore:()=>this.getPendingRotationRestoration(s,null)})}async getPendingClockRestoration(s,n){return this.getPendingRestoration(this.clockRestores,"clock",s,{pendingSetups:n,start:(a,d)=>this.startClockRestoration(a,d),again:(a,d)=>this.getPendingClockRestoration(a,d)})}startClockRestoration(s,n){return this.startRestoration(this.clockKind,s,n)}prepareClockRestore(s,n){let a={deviceId:s,incarnation:this.host.healthIncarnation(s)},d={name:s,deviceId:s,platform:"android"},c=this.clockRegistry.signal(s),p=this.host.restoreGeneration(s),m=()=>this.host.dispatchDeviceRestore(s,(S,R,g)=>this.clockRegistry.runExclusive(s,async()=>{if(n.controller.signal.throwIfAborted(),!this.host.restoreIncarnationIsCurrent(a))return;let w=AbortSignal.any([n.controller.signal,S]);if(R.throwIfAborted(),await this.clockRestorer(d).restore(n.state,w),g(),n.controller.signal.throwIfAborted(),this.clockRegistry.restored(s,n.state),n.clear(),this.forgetFencedRestore(this.clockRestores.targets,s,n),!this.clockRestores.targets.has(s))this.host.clearRestoreHealth(a,"clock")},void 0,c),p,4);return{restore:m,quarantined:(S)=>{if(e.warn(`Clock restore ${S}; quarantining ${d.deviceId}`),a.incarnation===void 0)e.warn(`Failed to restore state on ${s} (clock); no health marker could be keyed because the device has no pool incarnation`);if(a.incarnation!==void 0&&this.host.restoreIncarnationIsCurrent(a)&&!n.removed&&this.clockRestores.targets.get(s)?.has(n.state))this.host.markHealth(s,a.incarnation,"clock")},retry:(S)=>this.retryClockRestore(d.deviceId,n,S,m)}}async retryClockRestore(s,n,a,d){let c=await a;if(c.outcome==="restored")return;e.warn(`Failed to restore clock on ${s}`,c.error);while(!n.removed){if(await this.host.timer.sleep(DA),n.removed)return;try{await d();return}catch(p){e.warn(`Clock restore retry failed on ${s}; device remains quarantined`,p)}}}trackClockSessionSetup(s,n){return this.trackRestoreSetup(this.clockRestores,"clock",s,{createSetup:()=>n(),startRestore:()=>this.getPendingClockRestoration(s,null)})}}function ke(s,n,a){let c=(s.get(n)??Promise.resolve()).catch(()=>{return}).then(a);return s.set(n,c),c.finally(()=>{if(s.get(n)===c)s.delete(n)})}class Ls{timer;restorer;options;entries=new Map;constructor(s,n,a){this.timer=s;this.restorer=n;this.options=a}start(s,n,a){this.stop(s);let d={rule:n,confirmedAtMs:this.timer.now(),isCurrent:a};this.entries.set(s,d),this.schedule(s,d)}stop(s){let n=this.entries.get(s);if(n?.handle!==void 0)this.timer.clearTimeout(n.handle);this.entries.delete(s)}active(s){return this.entries.get(s)?.rule}stopAll(){for(let s of[...this.entries.keys()])this.stop(s)}schedule(s,n){n.handle=this.timer.setTimeout(()=>{this.tick(s,n)},this.options.renewIntervalMs)}live(s,n){return this.entries.get(s)===n&&n.isCurrent()}async tick(s,n){if(!this.live(s,n)){this.stopIfSame(s,n);return}let a;try{a=await this.restorer().renew(n.rule,this.options.leaseMs)}catch(d){e.warn(`[IosAppNetworkLeases] renewing ${n.rule.bundleId} on ${n.rule.udid} failed: ${r(d)}`,d),a="retry"}if(!this.live(s,n)){this.stopIfSame(s,n);return}if(a==="renewed"){n.confirmedAtMs=this.timer.now(),this.schedule(s,n);return}if(a==="retry"&&this.timer.now()-n.confirmedAtMs<this.options.leaseMs){this.schedule(s,n);return}e.warn(`[IosAppNetworkLeases] lease for ${n.rule.bundleId} on ${n.rule.udid} (revision ${n.rule.revision}) ended: ${a==="lost"?"the provider no longer holds it":"no renew was confirmed within the lease"}`),this.stopIfSame(s,n)}stopIfSame(s,n){if(this.entries.get(s)===n)this.stop(s)}}class Ns{host;callbacks;injectedIosAppNetworkRuleRestorer;defaultIosAppNetworkRuleRestorer;networkConditionExpiryTimers=new Map;networkConditionGeneration=new Map;networkConditionMutationQueues=new Map;iosAppNetworkLeases;lastIosOwnerGeneration=0;constructor(s,n,a){this.host=s;this.callbacks=a;this.injectedIosAppNetworkRuleRestorer=n.iosAppNetworkRuleRestorer,this.defaultIosAppNetworkRuleRestorer=n.defaultIosAppNetworkRuleRestorer,this.iosAppNetworkLeases=new Ls(this.host.timer,()=>this.iosAppNetworkRuleRestorer,n.iosLease)}get iosAppNetworkRuleRestorer(){return this.injectedIosAppNetworkRuleRestorer??=this.defaultIosAppNetworkRuleRestorer(),this.injectedIosAppNetworkRuleRestorer}allocateIosOwnerGeneration(){return this.lastIosOwnerGeneration=Math.max(this.lastIosOwnerGeneration+1,Math.floor(this.host.sessionNow())),this.lastIosOwnerGeneration}beginIosAppNetworkRule(s,n,a={}){let c=s.cacheData.networkCondition?.iosAppRule;if(c&&(c.udid!==n.udid||c.bundleId!==n.bundleId))throw new t(`Session ${s.sessionId} already holds an offline rule for ${c.bundleId}; reset it with networkCondition { profile: "none", appId: "${c.bundleId}" } first.`);let p=c??{udid:n.udid,bundleId:n.bundleId,ownerGeneration:this.allocateIosOwnerGeneration(),lastRevision:0};if(!c)s.cacheData.networkCondition={initialProfile:"none",iosAppRule:p};if(a.watch)p.watch=!0;else delete p.watch;return this.iosRuleContext(s,p,++p.lastRevision)}async releaseIosAppWatchFor(s,n){let a=s.cacheData.networkCondition?.iosAppRule;if(!a?.watch||a.udid===n.udid&&a.bundleId===n.bundleId)return;let d=this.prepareIosAppNetworkReset(s,a);try{await this.iosAppNetworkRuleRestorer.reset(d.rule)}catch(c){throw u(c,`Failed to release the launch watch for ${a.bundleId} before applying a rule for ${n.bundleId}`)}this.finishIosAppNetworkReset(s,d.rule)}prepareIosAppNetworkReset(s,n){let a=s.cacheData.networkCondition?.iosAppRule;if(a&&a.udid===n.udid&&a.bundleId===n.bundleId)return this.iosRuleContext(s,a,++a.lastRevision);let d={udid:n.udid,bundleId:n.bundleId,ownerGeneration:this.allocateIosOwnerGeneration(),lastRevision:1};return this.iosRuleContext(s,d,d.lastRevision)}iosRuleContext(s,n,a){return{rule:{udid:n.udid,bundleId:n.bundleId,owner:s.sessionId,ownerGeneration:n.ownerGeneration,revision:a},nextRevision:()=>++n.lastRevision}}confirmIosAppNetworkRule(s,n){let a=s.cacheData.networkCondition?.iosAppRule;if(!this.host.isPublished(s)||!a||a.ownerGeneration!==n.ownerGeneration)return;a.installedRevision=n.revision,this.iosAppNetworkLeases.start(s.sessionId,n,()=>{let d=s.cacheData.networkCondition?.iosAppRule;return this.host.isAdmittedForAutomation(s)&&d===a&&d.installedRevision===n.revision})}finishIosAppNetworkReset(s,n){if(!this.host.isPublished(s))return;let a=s.cacheData.networkCondition?.iosAppRule;if(!a||a.ownerGeneration!==n.ownerGeneration)return;this.iosAppNetworkLeases.stop(s.sessionId),delete s.cacheData.networkCondition}activeIosAppNetworkLease(s){return this.iosAppNetworkLeases.active(s)}stopIosAppNetworkLease(s){this.iosAppNetworkLeases.stop(s)}startIosAppNetworkLease(s,n,a){this.iosAppNetworkLeases.start(s,n,a)}scheduleNetworkConditionExpiry(s,n,a){let d=s.sessionId;if(this.cancelNetworkConditionExpiry(d),!(n>0))return;if(!this.host.isPublished(s))return;let c=Math.min(n,oy);if(c<n)e.warn(`networkCondition TTL of ${n}s exceeds the ${oy}s setTimeout limit for session ${d}; clamping to ${c}s`);let p=a??this.currentNetworkConditionGeneration(d);this.armNetworkConditionExpiryAt(s,this.host.sessionNow()+c*1000,p)}armNetworkConditionExpiryAt(s,n,a){let d=s.sessionId;if(!this.host.isPublished(s))return;let c=Math.max(0,n-this.host.sessionNow()),p=this.host.timer.setTimeout(()=>{this.handleNetworkConditionExpiry(s,a)},c);this.networkConditionExpiryTimers.set(d,{handle:p,session:s,deadlineMs:n,generation:a})}peekNetworkConditionExpiry(s){let n=this.networkConditionExpiryTimers.get(s);return n?{deadlineMs:n.deadlineMs,generation:n.generation}:void 0}rearmNetworkConditionExpiry(s,n){let a=s.sessionId;if(this.currentNetworkConditionGeneration(a)!==n.generation){e.debug(`Skipping network-condition TTL re-arm for session ${a}: generation ${n.generation} has been superseded by a later mutation`);return}if(!this.host.isAdmittedForAutomation(s)){e.debug(`Skipping network-condition TTL re-arm for session ${a}: session is releasing or no longer live`);return}this.armNetworkConditionExpiryAt(s,n.deadlineMs,n.generation)}cancelNetworkConditionExpiry(s){let n=this.networkConditionExpiryTimers.get(s);if(n!==void 0)this.host.timer.clearTimeout(n.handle),this.networkConditionExpiryTimers.delete(s)}handleNetworkConditionExpiry(s,n){let a=s.sessionId,d=this.networkConditionExpiryTimers.get(a);if(d&&d.session===s)this.networkConditionExpiryTimers.delete(a);if(!this.host.isPublished(s))return;this.callbacks.onExpiry(s,()=>this.clearNetworkConditionIfOwned(s,n))}clearNetworkConditionIfOwned(s,n){if(!this.host.isPublished(s))return;if(this.currentNetworkConditionGeneration(s.sessionId)!==n){e.debug(`Network condition TTL expiry for session ${s.sessionId} settled after a newer condition superseded it; leaving that condition's restore binding in place`);return}if(s.cacheData.networkCondition)delete s.cacheData.networkCondition,this.iosAppNetworkLeases.stop(s.sessionId)}bumpNetworkConditionGeneration(s){let n=(this.networkConditionGeneration.get(s)??0)+1;return this.networkConditionGeneration.set(s,n),n}runNetworkConditionMutationExclusive(s,n){return ke(this.networkConditionMutationQueues,s,n)}currentNetworkConditionGeneration(s){return this.networkConditionGeneration.get(s)??0}forgetSession(s){this.networkConditionGeneration.delete(s),this.networkConditionMutationQueues.delete(s)}stopAll(){for(let s of this.networkConditionExpiryTimers.values())this.host.timer.clearTimeout(s.handle);this.networkConditionExpiryTimers.clear(),this.iosAppNetworkLeases.stopAll()}}var $i=new Map,Pe=new Map;function XI(s,n){Pe.set(s,n)}function Pq(s){Pe.delete(s)}Zt({name:"android-ime-quarantine",onDeviceIdentityReplaced:Pq,onDeviceIncarnationChanged:()=>{}});async function gr(s,n){if(n?.throwIfAborted(),!n)return s.acquire();return new Promise((a,d)=>{let c=()=>d(n.reason);n.addEventListener("abort",c,{once:!0}),s.acquire().then((p)=>{if(n.removeEventListener("abort",c),n.aborted){p();return}a(p)},(p)=>{n.removeEventListener("abort",c),d(p)})})}async function Zd(s,n,a,d={}){let c=$i.get(s);if(!c)c=new Yn,$i.set(s,c);let p=await gr(c,a);try{if(Pe.has(s)&&!d.allowQuarantined){let m=Pe.get(s);if(m&&await d.recoverQuarantined?.(m))Pq(s)}if(Pe.has(s)&&!d.allowQuarantined)throw Error('IME state is unknown after an unacknowledged cancellation; run "keyboard setIme <imeId>" with an enabled IME, or restart AutoMobile before other IME operations.');return a?.throwIfAborted(),await n()}finally{p()}}class Wi{entries=new Map;inFlight=new Set;hasPending(s){return this.entries.has(s)||this.inFlight.has(s)}pendingDeviceIds(){return[...new Set([...this.entries.keys(),...this.inFlight])]}take(s){let n=this.entries.get(s);return this.entries.delete(s),n}store(s,n){this.entries.set(s,n)}discard(s){this.take(s)}async flush(s,n={}){if(!this.hasPending(s))return;await Zd(s,async()=>{if(n.isForced?.()||n.signal?.aborted){this.discard(s);return}let a=this.take(s);if(!a)return;this.inFlight.add(s);try{await a.restore(n.signal)}finally{this.inFlight.delete(s)}},n.signal,{allowQuarantined:!0})}}var dc=new Wi;Zt({name:"pending-ime-restore",onDeviceIdentityReplaced:(s)=>dc.discard(s),onDeviceIncarnationChanged:()=>{}});class Fs{host;restores;pendingIme;constructor(s,n,a=dc){this.host=s;this.restores=n;this.pendingIme=a}async drainReleaseTeardown(s,n,a,d={}){let c=n.assignedDevice;if(d.deviceIdentityReplaced||nu(a))this.pendingIme.discard(c);let p=!d.deviceIdentityReplaced&&!nu(a)&&this.pendingIme.hasPending(c),m=d.deviceIdentityReplaced||this.releaseNeedsTeardown(n);if(!p&&!m)return[];let S=a?.forcedAbort?.signal;return this.runUnderTeardownShield(async(R)=>{if(p)await this.flushPendingIme(c,()=>nu(a),R);if(!m)return[];let g=await this.startReleaseTeardown(s,n,a,d);return d.deviceIdentityReplaced?g.filter((w)=>w.setup):g},S)}async flushPendingIme(s,n,a){try{await this.pendingIme.flush(s,{signal:a,isForced:n})}catch(d){if(e.warn(`[SendKeys] Session-end IME restoration failed on ${s}`,d),n()||a.aborted)this.pendingIme.discard(s)}}async restorePendingImeForRebind(s,n){let a=await this.runUnderTeardownShield(async(d)=>(await this.flushPendingIme(s,()=>!n(),d),[]));return await Promise.all(a),{pending:null}}hasPendingIme(s){return this.pendingIme.hasPending(s)}async runUnderTeardownShield(s,n){let a=new AbortController;if(n)if(n.aborted)a.abort(n.reason);else n.addEventListener("abort",()=>a.abort(n.reason),{once:!0});let d=this.host.sessionNow(),c=this.host.timer.setTimeout(()=>{a.abort(new t("Session release teardown exceeded its budget"))},wr);try{let m=(await H(a.signal,()=>s(a.signal))).flatMap((S)=>{let R=this.boundTeardownStage(S,d);return R?[R]:[]});return Promise.allSettled(m).then(()=>this.host.timer.clearTimeout(c)),m}catch(p){throw this.host.timer.clearTimeout(c),p}}releaseNeedsTeardown(s){let{keepScreenAwake:n,biometricEnrollment:a,networkCondition:d,clock:c,rotation:p,screenReader:m}=s.cacheData;return n?.applied===!0||Boolean(a||d||c||p||m)||this.restores.abandonedScreenReaders.has(s.assignedDevice)||this.restores.abandonedRotations.has(s.assignedDevice)||this.host.sessionSetupsOf(s).length>0}boundTeardownStage(s,n){let{pending:a,abandon:d}=s;if(!a||!d)return a;let c=!1,p=a.finally(()=>{c=!0}),m=Error("Session release teardown cap reached"),S=l(p,{timer:this.host.timer,timeoutMs:Math.max(0,wr-(this.host.sessionNow()-n)),label:"Session release teardown",timeoutError:()=>m,onTimeout:()=>{if(!c)d()}}).catch((R)=>{if(R!==m)throw R});return this.host.noteTeardownBound(S,n+wr),S}async startReleaseTeardown(s,n,a,d={}){let c=n.assignedDevice,p=this.restores.keepScreenAwakeRestoreTarget(n),m=this.restores.biometricRestoreTarget(n),S=this.restores.networkConditionRestoreTarget(n),R=this.host.sessionSetupsOf(n);if(d.deviceIdentityReplaced)return await this.startReplacedDeviceTeardown(s,R);let g=()=>nu(a)||d.deviceIdentityReplaced===!0,w=a?.forcedAbort?.signal,y=(k)=>H(w,k),b=null,A=[async()=>{if(b=R.length>0?(await this.host.waitForSessionSetup(s,R)).pending:null,a)a.stuckDeadlineMs=Math.max(a.stuckDeadlineMs,r0(n.cacheData));return{pending:b,setup:!0}},async()=>({pending:(await this.restores.restoreKeepScreenAwakeBestEffort(n,g)).pending,abandon:()=>g()?e.warn(`Gave up restoring keep-awake state on ${c} after a forced release; the screen may stay awake`):this.abandonCappedRestore(p,"keep-screen-awake")}),async()=>({pending:n.cacheData.biometricEnrollment?(await this.restores.getPendingBiometricRestoration(n,b)).pending:null,abandon:()=>this.abandonCappedRestore(m,"biometric-enrollment")}),async()=>({pending:n.cacheData.networkCondition?(await this.restores.getPendingNetworkRestoration(n,b)).pending:null,abandon:()=>this.abandonCappedRestore(S,"network-condition")}),async()=>({pending:n.cacheData.clock?(await y(()=>this.restores.getPendingClockRestoration(n,b))).pending:null}),async()=>{let k=this.restores.abandonedRotations.has(n.assignedDevice),T=n.cacheData.rotation?(await y(()=>this.restores.getPendingRotationRestoration(n,b))).pending:null;return{pending:k&&!g()?y(()=>this.restores.retryAbandonedRotationAfter(n.assignedDevice,T)):T}},async()=>{let k=n.cacheData.screenReader?(await y(()=>this.restores.getPendingScreenReaderRestoration(n,b))).pending:null;return{pending:this.restores.abandonedScreenReaders.has(n.assignedDevice)&&!g()?y(()=>this.restores.retryAbandonedScreenReaderAfter(n.assignedDevice,k)):k}}];return await this.runReleaseTeardownSteps(A,a,g)}async runReleaseTeardownSteps(s,n,a){let d=n?.teardownResumeStep??0,c=n?.teardownStages?.slice(1,d)??[];for(let[p,m]of s.entries()){if(p>0&&p<d)continue;if(n)n.teardownStep=p;let S=await m();if(c.push(S),this.recordReleaseTeardownStage(n,p,S),a())break}return c}recordReleaseTeardownStage(s,n,a){if(s)(s.teardownStages??=[])[n]=a}async startReplacedDeviceTeardown(s,n){let a=n.length>0?(await this.host.waitForSessionSetup(s,n)).pending:null;return a?[{pending:a,setup:!0}]:[]}abandonCappedRestore(s,n){if(!s)return;e.warn(`Session release teardown exceeded ${wr}ms before the ${n} restore finished on ${s.deviceId}; the device may hold session-modified state`),this.host.abandonRestore(s,n,()=>("state"in s)?this.restores.restoreKeepScreenAwakeTarget(s):("enrollment"in s)?this.restores.restoreBiometricEnrollment(s):this.restores.restoreNetworkCondition(s))}}var Ui=2,vr=250,qi=2,yr=250,Gi=2;class Bs{host;queued;teardown;network;screenReaderRestorer;screenReaderRestoreBackoff;rotationRestoreBackoff;screenReaderRestores;abandonedScreenReaders;clockRestores;abandonedRotations;rotationRestores;networkConditionRestorer;biometricEnrollmentRestorer;keepAwakeRestoreReports=new Map;keepScreenAwakeRestorer;constructor(s,n){this.host=s;this.queued=new Ms(s,n),this.screenReaderRestorer=n.screenReader,this.screenReaderRestoreBackoff=n.screenReaderBackoff,this.rotationRestoreBackoff=n.rotationBackoff,this.keepScreenAwakeRestorer=n.keepScreenAwake,this.biometricEnrollmentRestorer=n.biometricEnrollment,this.networkConditionRestorer=n.networkCondition,this.teardown=new Fs(s,this),this.network=new Ns(s,n,{onExpiry:(a,d)=>this.restoreNetworkConditionOnExpiryFor(a,d)}),this.screenReaderRestores=this.queued.screenReaderRestores,this.abandonedScreenReaders=this.queued.abandonedScreenReaders,this.clockRestores=this.queued.clockRestores,this.abandonedRotations=this.queued.abandonedRotations,this.rotationRestores=this.queued.rotationRestores}runClockMutationExclusive(s,n){return this.queued.runClockMutationExclusive(s,n)}runRotationMutationExclusive(s,n){return this.queued.runRotationMutationExclusive(s,n)}runScreenReaderMutationExclusive(s,n){return this.queued.runScreenReaderMutationExclusive(s,n)}forgetFencedRestore(s,n,a){return this.queued.forgetFencedRestore(s,n,a)}getPendingRestoration(s,n,a,{pendingSetups:d,steps:c}){return this.queued.getPendingRestoration(s,n,a,{pendingSetups:d,...c})}startRestoration(s,n,a){return this.queued.startRestoration(s,n,a)}retryRestoreBounded(s,n,a,{restoration:d,restore:c}){return this.queued.retryRestoreBounded(s,n,a,{restoration:d,restore:c})}forgetAbandonedRestore(s,n,a){return this.queued.forgetAbandonedRestore(s,n,a)}retryAbandonedAfter(s,n){return this.queued.retryAbandonedAfter(s,n)}retryAbandonedRestore(s,n){return this.queued.retryAbandonedRestore(s,n)}trackRestoreSetup(s,n,a,{createSetup:d,startRestore:c}){return this.queued.trackRestoreSetup(s,n,a,{createSetup:d,startRestore:c})}getPendingScreenReaderRestoration(s,n){return this.queued.getPendingScreenReaderRestoration(s,n)}retryAbandonedScreenReaderAfter(s,n){return this.queued.retryAbandonedScreenReaderAfter(s,n)}retryAbandonedScreenReaderRestore(s){return this.queued.retryAbandonedScreenReaderRestore(s)}abandonScreenReaderRestore(s,n){this.queued.abandonScreenReaderRestore(s,n)}trackScreenReaderSessionSetup(s,n){return this.queued.trackScreenReaderSessionSetup(s,n)}getPendingRotationRestoration(s,n){return this.queued.getPendingRotationRestoration(s,n)}retryAbandonedRotationAfter(s,n){return this.queued.retryAbandonedRotationAfter(s,n)}retryAbandonedRotationRestore(s){return this.queued.retryAbandonedRotationRestore(s)}abandonRotationRestore(s,n,a,d){this.queued.abandonRotationRestore(s,n,a,d)}trackRotationSessionSetup(s,n){return this.queued.trackRotationSessionSetup(s,n)}getPendingClockRestoration(s,n){return this.queued.getPendingClockRestoration(s,n)}trackClockSessionSetup(s,n){return this.queued.trackClockSessionSetup(s,n)}drainReleaseTeardown(s,n,a,d={}){return this.teardown.drainReleaseTeardown(s,n,a,d)}hasPendingIme(s){return this.teardown.hasPendingIme(s)}restorePendingImeForRebind(s,n){return this.teardown.restorePendingImeForRebind(s,n)}runUnderTeardownShield(s,n){return this.teardown.runUnderTeardownShield(s,n)}abandonCappedRestore(s,n){return this.teardown.abandonCappedRestore(s,n)}get iosAppNetworkRuleRestorer(){return this.network.iosAppNetworkRuleRestorer}beginIosAppNetworkRule(s,n,a){return this.network.beginIosAppNetworkRule(s,n,a)}releaseIosAppWatchFor(s,n){return this.network.releaseIosAppWatchFor(s,n)}prepareIosAppNetworkReset(s,n){return this.network.prepareIosAppNetworkReset(s,n)}confirmIosAppNetworkRule(s,n){return this.network.confirmIosAppNetworkRule(s,n)}finishIosAppNetworkReset(s,n){return this.network.finishIosAppNetworkReset(s,n)}activeIosAppNetworkLease(s){return this.network.activeIosAppNetworkLease(s)}stopIosAppNetworkLease(s){return this.network.stopIosAppNetworkLease(s)}startIosAppNetworkLease(s,n,a){return this.network.startIosAppNetworkLease(s,n,a)}scheduleNetworkConditionExpiry(s,n,a){return this.network.scheduleNetworkConditionExpiry(s,n,a)}peekNetworkConditionExpiry(s){return this.network.peekNetworkConditionExpiry(s)}rearmNetworkConditionExpiry(s,n){return this.network.rearmNetworkConditionExpiry(s,n)}cancelNetworkConditionExpiry(s){return this.network.cancelNetworkConditionExpiry(s)}bumpNetworkConditionGeneration(s){return this.network.bumpNetworkConditionGeneration(s)}runNetworkConditionMutationExclusive(s,n){return this.network.runNetworkConditionMutationExclusive(s,n)}forgetSession(s){return this.network.forgetSession(s)}stopAll(){return this.network.stopAll()}async restoreKeepScreenAwakeBestEffort(s,n=()=>!1){let a=this.keepScreenAwakeRestoreTarget(s);if(!a)return{pending:null};let d=this.restoreKeepScreenAwakeTarget(a).then(()=>({outcome:"restored"}),(m)=>({outcome:"failed",error:m})),c=Error("Keep-awake restore timed out"),p=await l(d,{timer:this.host.timer,timeoutMs:ZN,label:"Keep-awake restore",timeoutError:()=>c}).catch((m)=>{if(m===c)return{outcome:"timed-out"};throw m});if(this.host.hasIdentityReplacementFence(a.deviceId))return{pending:null};if(p.outcome==="failed")return e.warn(`Failed to restore keep-awake state for session ${s.sessionId}: ${p.error}`),{pending:this.retryKeepScreenAwakeRestore(a,p.error,n)};if(p.outcome==="timed-out")return e.warn(`Timed out after ${ZN}ms restoring keep-awake state for session ${s.sessionId}`),{pending:d.then((m)=>m.outcome==="failed"?this.retryKeepScreenAwakeRestore(a,m.error,n):void 0)};return{pending:null}}keepScreenAwakeRestoreTarget(s){let n=s.cacheData.keepScreenAwake;if(s.platform!=="android"||!n?.applied)return null;return{sessionId:s.sessionId,deviceId:s.assignedDevice,incarnation:this.host.healthIncarnation(s.assignedDevice),restoreGeneration:this.host.restoreGeneration(s.assignedDevice),state:n}}forgetKeepAwakeRestoreReport(s){this.keepAwakeRestoreReports.delete(s)}getKeepAwakeRestoreReport(s){return this.keepAwakeRestoreReports.get(s)}recordKeepAwakeRestoreReport(s,n){if(this.keepAwakeRestoreReports.delete(s),this.keepAwakeRestoreReports.set(s,n),this.keepAwakeRestoreReports.size>64){let a=this.keepAwakeRestoreReports.keys().next().value;if(a!==void 0)this.keepAwakeRestoreReports.delete(a)}}async restoreKeepScreenAwakeTarget(s){if(!this.host.restoreIncarnationIsCurrent(s))return;let n={name:s.deviceId,platform:"android",deviceId:s.deviceId};await this.host.dispatchDeviceRestore(s.deviceId,(a,d,c)=>this.keepScreenAwakeRestorer(n).restore(s.state).then((p)=>{if(c(),p.status==="failed"){let m=new _s(p.failures.map(({setting:S,error:R})=>`${S}: ${R}`).join("; ")+(p.baselineSettings?.length?`; baseline applied: ${p.baselineSettings.map(({setting:S,value:R})=>`${S}=${R}`).join(", ")}`:""),{status:"failed",settings:[...p.failures,...p.baselineSettings??[]]});throw this.recordKeepAwakeRestoreReport(s.sessionId,m.report),m}if(this.keepAwakeRestoreReports.delete(s.sessionId),p.status==="restored_to_baseline")this.recordKeepAwakeRestoreReport(s.sessionId,{status:p.status,settings:[...p.settings]}),e.warn(`Keep-awake baseline applied for session ${s.sessionId}, device ${s.deviceId}: ${p.settings.map(({setting:m,value:S})=>`${m}=${S}`).join(", ")}`)}),s.restoreGeneration,1),this.host.clearRestoreHealth(s,"keep-screen-awake")}async retryKeepScreenAwakeRestore(s,n,a){let d=n;for(let c=1;c<=Ui;c++){if(!await this.host.waitForIdentityReplacement(s.deviceId,s.restoreGeneration??0))return;if(a()){e.warn(`Not retrying the keep-awake restore for session ${s.sessionId} after a forced release: ${d}`);return}if(await this.host.timer.sleep(vr),!await this.host.waitForIdentityReplacement(s.deviceId,s.restoreGeneration??0))return;if(a()||!this.host.restoreIncarnationIsCurrent(s))return;try{await this.restoreKeepScreenAwakeTarget(s);return}catch(p){d=p,e.debug(`Retry ${c} restoring keep-awake state for session ${s.sessionId} failed: ${p}`)}}e.warn(`Gave up restoring keep-awake state for session ${s.sessionId} after ${Ui} retries; device ${s.deviceId} may stay awake: ${d}`),this.host.abandonRestore(s,"keep-screen-awake",()=>this.restoreKeepScreenAwakeTarget(s))}biometricRestoreTarget(s){let n=s.cacheData.biometricEnrollment;if(!n)return null;return{sessionId:s.sessionId,deviceId:s.assignedDevice,incarnation:this.host.healthIncarnation(s.assignedDevice),restoreGeneration:this.host.restoreGeneration(s.assignedDevice),enrollment:n.initialEnrollment}}async restoreBiometricEnrollment(s){let n={name:s.deviceId,platform:"ios",deviceId:s.deviceId};if(!this.host.restoreIncarnationIsCurrent(s))return;await this.host.dispatchDeviceRestore(s.deviceId,(a,d,c)=>this.biometricEnrollmentRestorer(n).restore(s.enrollment).then(c),s.restoreGeneration,2),this.host.clearRestoreHealth(s,"biometric-enrollment")}async restoreBiometricEnrollmentBestEffort(s){let n=this.biometricRestoreTarget(s);if(!n)return{pending:null};let a=this.restoreBiometricEnrollment(n).then(()=>({outcome:"restored"}),(p)=>({outcome:"failed",error:p})),d=Error("Biometric restore timed out"),c=await l(a,{timer:this.host.timer,timeoutMs:QN,label:"Biometric restore",timeoutError:()=>d}).catch((p)=>{if(p===d)return{outcome:"timed-out"};throw p});if(this.host.hasIdentityReplacementFence(n.deviceId))return{pending:null};if(c.outcome==="failed")return e.warn(`Failed to restore biometric enrollment for session ${s.sessionId}: ${c.error}`),{pending:this.retryBiometricEnrollmentRestore(n,c.error)};if(c.outcome==="timed-out")return e.warn(`Timed out after ${QN}ms restoring biometric enrollment for session ${s.sessionId}`),{pending:this.settleBiometricEnrollmentRestore(n,a)};return{pending:null}}async settleBiometricEnrollmentRestore(s,n){let a=await n;if(a.outcome==="restored")return;e.warn(`Failed to restore biometric enrollment for session ${s.sessionId}: ${a.error}`),await this.retryBiometricEnrollmentRestore(s,a.error)}async retryBiometricEnrollmentRestore(s,n){let a=n;for(let d=1;d<=qi;d++){if(await this.host.timer.sleep(yr),!this.host.restoreIncarnationIsCurrent(s))return;try{await this.restoreBiometricEnrollment(s),e.info(`Restored biometric enrollment for session ${s.sessionId} on retry ${d}`);return}catch(c){a=c,e.debug(`Retry ${d} restoring biometric enrollment for session ${s.sessionId} failed: ${c}`)}}e.warn(`Gave up restoring biometric enrollment for session ${s.sessionId} after ${qi} retries; device ${s.deviceId} may hold session-modified enrollment: ${a}`),this.host.abandonRestore(s,"biometric-enrollment",()=>this.restoreBiometricEnrollment(s))}restoreBiometricEnrollmentAfterSetups(s,n){return n.then(async()=>{await(await this.restoreBiometricEnrollmentBestEffort(s)).pending})}async getPendingBiometricRestoration(s,n){if(n&&s.cacheData.biometricEnrollment)return{pending:this.restoreBiometricEnrollmentAfterSetups(s,n)};return{pending:(await this.restoreBiometricEnrollmentBestEffort(s)).pending}}restoreNetworkConditionAfterSetups(s,n){return n.then(async()=>{await(await this.restoreNetworkConditionBestEffort(s)).pending})}async getPendingNetworkRestoration(s,n){if(n&&s.cacheData.networkCondition)return{pending:this.restoreNetworkConditionAfterSetups(s,n)};return{pending:(await this.restoreNetworkConditionBestEffort(s)).pending}}networkConditionRestoreTarget(s){let n=s.cacheData.networkCondition;if(!n)return null;let a=n.iosAppRule;return{sessionId:s.sessionId,deviceId:s.assignedDevice,incarnation:this.host.healthIncarnation(s.assignedDevice),restoreGeneration:this.host.restoreGeneration(s.assignedDevice),profile:n.initialProfile,...a?{iosAppRule:{udid:a.udid,bundleId:a.bundleId,owner:s.sessionId,ownerGeneration:a.ownerGeneration,revision:++a.lastRevision}}:{}}}async restoreNetworkCondition(s){if(s.iosAppRule){if(!this.host.restoreIncarnationIsCurrent(s))return;await this.iosAppNetworkRuleRestorer.reset(s.iosAppRule),this.host.clearRestoreHealth(s,"network-condition");return}let n={name:s.deviceId,platform:"android",deviceId:s.deviceId};if(!this.host.restoreIncarnationIsCurrent(s))return;await this.host.dispatchDeviceRestore(s.deviceId,(a,d,c)=>this.networkConditionRestorer(n).restore(s.profile).then(c),s.restoreGeneration,3),this.host.clearRestoreHealth(s,"network-condition")}async restoreNetworkConditionBestEffort(s){let n=this.networkConditionRestoreTarget(s);if(!n)return{pending:null};let a=this.restoreNetworkCondition(n).then(()=>({outcome:"restored"}),(p)=>({outcome:"failed",error:p})),d=Error("Network condition restore timed out"),c=await l(a,{timer:this.host.timer,timeoutMs:ou,label:"Network condition restore",timeoutError:()=>d}).catch((p)=>{if(p===d)return{outcome:"timed-out"};throw p});if(this.host.hasIdentityReplacementFence(n.deviceId))return{pending:null};if(c.outcome==="failed")return e.warn(`Failed to restore network condition for session ${s.sessionId}; device ${n.deviceId} may hold session-modified shaping: ${c.error}`),{pending:this.retryNetworkConditionRestore(n,c.error)};if(c.outcome==="timed-out")return e.warn(`Timed out after ${ou}ms restoring network condition for session ${s.sessionId}`),{pending:this.settleNetworkConditionRestore(n,a)};return{pending:null}}async settleNetworkConditionRestore(s,n){let a=await n;if(a.outcome==="restored")return;e.warn(`Failed to restore network condition for session ${s.sessionId}: ${a.error}`),await this.retryNetworkConditionRestore(s,a.error)}async retryNetworkConditionRestore(s,n){await this.retryNetworkConditionRestoreUntilSuccess(s,n)}async retryNetworkConditionRestoreUntilSuccess(s,n){let a=n;for(let d=1;d<=Gi;d++){if(await this.host.timer.sleep(DA),!this.host.restoreIncarnationIsCurrent(s))return!1;try{return await this.restoreNetworkCondition(s),e.info(`Restored network condition for session ${s.sessionId} on retry ${d}`),!0}catch(c){a=c,e.debug(`Retry ${d} restoring network condition for session ${s.sessionId} failed: ${c}`)}}return e.warn(`Gave up restoring network condition for session ${s.sessionId} after ${Gi} retries; device ${s.deviceId} may hold session-modified shaping: ${a}`),this.host.abandonRestore(s,"network-condition",()=>this.restoreNetworkCondition(s)),!1}restoreNetworkConditionOnExpiryFor(s,n){let a=s.sessionId,d=this.networkConditionRestoreTarget(s);if(!d)return;e.info(`Network condition TTL elapsed for session ${a}; resetting device ${d.deviceId} to none`),this.host.registerPendingDeviceCleanup(d.deviceId,this.runUnderTeardownShield(async()=>[{pending:this.restoreNetworkConditionOnExpiry(s,d,n),abandon:()=>this.abandonCappedRestore(d,"network-condition")}]).then(async(c)=>{await Promise.all(c)}),wr)}async restoreNetworkConditionOnExpiry(s,n,a){try{await this.restoreNetworkCondition(n),a();return}catch(d){if(e.warn(`Failed to reset network condition on TTL expiry for session ${s.sessionId}; device ${n.deviceId} may hold session-modified shaping, retrying: ${d}`),await this.retryNetworkConditionRestoreUntilSuccess(n,d))a()}}}function pe(s){return s!==void 0&&s.ownerToken!==void 0&&(s.hold==="live"||s.hold==="suspect")}function Ki(s){let{claimantToken:n,session:a,base:d}=s;if(a.ownerToken===n)return{outcome:"claimed"};if(pe(d)&&d.ownerToken===n)return{outcome:"claimed"};if(a.ownerToken!==void 0&&s.claimAlreadyProcessed)return{outcome:"superseded"};if(pe(a))return{outcome:"conflict",holdOf:"session"};if(pe(d))return{outcome:"conflict",holdOf:"base"};return{outcome:"claimed"}}function Vi(s,n){return!pe(s)&&pe(n)?"base":"session"}function zi(s){if(s.session.ownerToken!==void 0||s.sessionHasClaimHistory)return!1;return!(pe(s.base)&&s.base.ownerToken!==s.claimantToken)}function br(s){s.expiresAt=Math.max(s.expiresAt,s.lastUsedAt+s.sessionTimeoutMs)}function ji(s){s.expiresAt=s.lastUsedAt+s.sessionTimeoutMs}class Hs{port;livenessOwnershipClaimMutexes=new WeakMap;constructor(s){this.port=s}restartPreFirstHeartbeatGrace(s){let n=this.port.unlessBaseEnded(this.port.getSession(s));if(!n||n.hasReceivedHeartbeat)return;n.lastHeartbeat=Math.max(n.lastHeartbeat,this.port.sessionNow())}recordHeartbeat(s){let n=this.port.unlessBaseEnded(this.port.getSession(s));if(!n){e.warn(`Cannot record heartbeat for session ${s}: not found`);return}if(!this.port.isAdmittedForAutomation(n))return;let a=this.port.sessionNow(),d=n.lastHeartbeat;if(n.lastHeartbeat=a,e.debug(`Heartbeat accepted for session ${s}; previous heartbeat age=${Math.max(0,a-d)}ms`),n.lastOwnerHeartbeat=a,n.activityGeneration++,n.hasReceivedHeartbeat=!0,n.ownership==="awaiting-owner")n.ownership="owned",n.awaitingOwnerSince=void 0;if(!this.port.hasUnissuedActivity(n))return;this.port.getBarrier().track(()=>this.port.recordSessionActivity(n)).catch((c)=>{e.warn(`[SessionManager] Failed to record heartbeat activity for ${s}: ${r(c)}`,c)})}async claimLivenessOwnership(s,n){let a=this.port.unlessBaseEnded(this.port.getSession(s));if(!a)return e.warn(`Cannot claim liveness ownership for session ${s}: not found`),"not-found";return await this.livenessOwnershipClaimMutexFor(a).runExclusive(async()=>{if(this.port.unlessBaseEnded(this.port.getSession(s))!==a)return"not-found";let c=a.livenessOwnershipClaims??new Set;a.livenessOwnershipClaims=c;let p=this.livenessBaseSession(a),m=Ki({claimantToken:n,session:this.port.livenessOwnerView(a),claimAlreadyProcessed:c.has(n),base:p?this.port.livenessOwnerView(p):void 0});if(m.outcome==="superseded")return"superseded";if(m.outcome==="conflict"){let S=m.holdOf==="base"?`its base session ${p?.sessionId}`:"it";return e.warn(`Rejected liveness ownership claim for session ${s}: another owner holds a live lease on ${S}`),"conflict"}if(a.livenessOwnerToken===n&&c.has(n))return"claimed";return await this.takeLivenessOwnership(a,n,c)})}livenessBaseSession(s){let n=this.port.ownershipSessionUuid(s.sessionId);return n===s.sessionId?void 0:this.port.peekSession(n)??void 0}async releaseLivenessOwnership(s,n){let a=this.port.unlessBaseEnded(this.port.getSession(s));if(!a||!this.port.isAdmittedForAutomation(a))return"not-found";return await this.livenessOwnershipClaimMutexFor(a).runExclusive(async()=>{if(this.port.unlessBaseEnded(this.port.getSession(s))!==a||!this.port.isAdmittedForAutomation(a))return"not-found";if(a.livenessOwnerToken===void 0)return"already-unowned";if(a.livenessOwnerToken!==n)return"not-owner";a.livenessOwnershipClaims??=new Set,a.livenessOwnershipClaims.add(n);let d=a.livenessOwnerBoundAt;a.livenessOwnerToken=void 0,a.livenessOwnerBoundAt=void 0,a.activityGeneration++;try{await this.port.recordLivenessOwnership(s,null)}catch(c){if(a.livenessOwnerToken=n,a.livenessOwnerBoundAt=d,!this.port.isAdmittedForAutomation(a))return"not-found";throw c}return"released"})}livenessOwnershipClaimMutexFor(s){let n=this.livenessOwnershipClaimMutexes.get(s);if(n)return n;let a=new Yn;return this.livenessOwnershipClaimMutexes.set(s,a),a}async takeLivenessOwnership(s,n,a){let{livenessOwnerToken:d,lastOwnerHeartbeat:c,livenessOwnerBoundAt:p}=s,m=a.has(n);a.add(n),s.livenessOwnerToken=n,s.livenessOwnerBoundAt=void 0,s.lastOwnerHeartbeat=this.port.sessionNow();try{await this.persistNewLivenessOwnershipClaim(s,n,{previousOwnerToken:d,previousOwnerHeartbeat:c,previousOwnerBoundAt:p},a)}catch(S){if(m)a.add(n);if(!this.port.isAdmittedForAutomation(s))return e.info(`Liveness ownership claim for session ${s.sessionId} lost to its release: `+r(S)),"not-found";throw S}return"claimed"}async persistNewLivenessOwnershipClaim(s,n,a,d){let c=this.markAcceptedClaimantHeartbeating(s);try{await this.port.recordLivenessOwnership(s.sessionId,n)}catch(p){throw d.delete(n),s.livenessOwnerToken=a.previousOwnerToken,s.lastOwnerHeartbeat=a.previousOwnerHeartbeat,s.livenessOwnerBoundAt=a.previousOwnerBoundAt,c("undo"),p}c("keep")}markAcceptedClaimantHeartbeating(s){let{hasReceivedHeartbeat:n,ownership:a,activityGeneration:d}=s;if(s.hasReceivedHeartbeat=!0,a==="awaiting-owner")s.ownership="owned";return(c)=>{if(c==="undo"&&s.activityGeneration===d){s.hasReceivedHeartbeat=n,s.ownership=a;return}if(a==="awaiting-owner"&&s.ownership==="owned")s.awaitingOwnerSince=void 0}}hasLivenessOwnership(s,n){return this.port.unlessBaseEnded(this.port.getSession(s))?.livenessOwnerToken===n}claimUnownedLivenessOwnership(s,n){let a=this.port.unlessBaseEnded(this.port.getSession(s));if(!a||!this.adoptUnownedLivenessOwnerToken(a,n))return!1;return a.lastOwnerHeartbeat=this.port.sessionNow(),!0}bindAcquiredLivenessOwnerToken(s,n){let a=this.port.peekSession(s);if(!a||!this.adoptUnownedLivenessOwnerToken(a,n))return!1;return a.livenessOwnerBoundAt=this.port.sessionNow(),!0}adoptUnownedLivenessOwnerToken(s,n){let a=this.livenessBaseSession(s);if(!zi({claimantToken:n,session:this.port.livenessOwnerView(s),sessionHasClaimHistory:Boolean(s.livenessOwnershipClaims?.size),base:a?this.port.livenessOwnerView(a):void 0}))return!1;return s.livenessOwnerToken=n,s.livenessOwnerBoundAt=void 0,this.persistAdoptedLivenessOwnerToken(s),!0}persistAdoptedLivenessOwnerToken(s){this.port.getBarrier().track(()=>this.livenessOwnershipClaimMutexFor(s).runExclusive(async()=>{if(this.port.peekSession(s.sessionId)!==s||!this.port.isAdmittedForAutomation(s)||!s.livenessOwnerToken)return;await this.port.replaceLivenessOwnership(s.sessionId,s.livenessOwnerToken)})).catch((n)=>{if(n instanceof W){e.debug("[SessionManager] Adopted liveness owner row is no longer active");return}e.warn("[SessionManager] Failed to persist adopted liveness ownership")})}adoptCliLivenessPolicy(s,n){let a=this.port.unlessBaseEnded(this.port.getSession(s));if(!a)return e.warn(`Cannot adopt CLI liveness policy for session ${s}: not found`),!1;if(a.livenessPolicy===ni)return e.warn(`Refusing the CLI liveness policy for managed-execution session ${s}; it stays on its owner lease`),!1;let d=ine(n)??Math.min(kp(),oR);if(a.livenessPolicy==="heartbeat")a.preCliLiveness={heartbeatTimeoutMs:a.heartbeatTimeoutMs,heartbeatTimeoutSource:a.heartbeatTimeoutSource,sessionTimeoutMs:a.sessionTimeoutMs};return a.livenessPolicy="cli-idle",a.heartbeatTimeoutMs=d,a.sessionTimeoutMs=Math.max(a.sessionTimeoutMs,d),br(a),this.recordHeartbeat(s),e.debug(`Session ${s} adopted the CLI liveness policy (idle timeout ${a.heartbeatTimeoutMs}ms)`),!0}async adoptManagedExecutionLivenessPolicy(s,n={}){let a=vq(n.idleTimeoutMs),d=this.port.getSession(s);if(!d)throw new t(`Cannot hold session ${s} for a managed execution: the session is not active.`);if(d.livenessPolicy==="cli-idle")throw new t(`Cannot hold session ${s} for a managed execution: it is owned by a one-shot CLI.`);let c={livenessPolicy:d.livenessPolicy,sessionTimeoutMs:d.sessionTimeoutMs,expiresAt:d.expiresAt};d.livenessPolicy=ni,d.sessionTimeoutMs=a,ji(d),d.activityGeneration++;let p=d.activityGeneration;try{await this.port.recordSessionActivity(d)}catch(m){if(d.activityGeneration===p)Object.assign(d,c);throw m}return e.info(`Session ${s} is held for a managed execution (idle window ${a}ms)`),d}restoreHeartbeatLivenessPolicy(s){let n=this.port.unlessBaseEnded(this.port.getSession(s));if(!n||n.livenessPolicy!=="cli-idle")return!1;let a=n.preCliLiveness??{heartbeatTimeoutMs:this.port.defaultHeartbeatTimeoutMs(),heartbeatTimeoutSource:"default",sessionTimeoutMs:n.sessionTimeoutMs};return n.livenessPolicy="heartbeat",n.heartbeatTimeoutMs=a.heartbeatTimeoutMs,n.heartbeatTimeoutSource=a.heartbeatTimeoutSource,n.sessionTimeoutMs=a.sessionTimeoutMs,delete n.preCliLiveness,ji(n),this.recordHeartbeat(s),e.debug(`Session ${s} restored the heartbeat liveness policy (timeout ${n.heartbeatTimeoutMs}ms)`),!0}}function Ae(s){return s!==void 0&&s()===!1}function j(s){return Boolean(s.release_reason&&bo(s.release_reason)&&s.released_at_ms!==null)}function q(s,n=!1){if(!j(s))return;let a=s.released_at_ms+ym;return n||Xd(s.liveness_policy)?a:Math.min(s.expires_at_ms,a)}function Be(s,n){let a=q(s,!0);return a!==void 0&&n>=a}function Ji(s){if(!(s instanceof Error)||s.name!=="SessionRecoveryIdentityLossError")return!1;let n=s;return typeof n.sessionUuid==="string"&&typeof n.terminalReleaseReason==="string"&&kr(n.reason)&&n.terminalReleaseReason===`identity-recovery-${n.reason}`&&Pr(n.target)}function He(s){return(s.stable_device_id??(s.platform==="ios"||s.platform==="android"&&!ae(s.device_id)&&!Yo(s.device_id)?s.device_id:void 0))||void 0}function $s(s){return s==="custom"?"custom":"default"}function Us(s){if(s==="cli-idle"||s===ni)return s;return"heartbeat"}function Qi(s){if(typeof s.pre_cli_heartbeat_timeout_ms!=="number"||typeof s.pre_cli_session_timeout_ms!=="number")return;return{heartbeatTimeoutMs:s.pre_cli_heartbeat_timeout_ms,heartbeatTimeoutSource:$s(s.pre_cli_heartbeat_timeout_source),sessionTimeoutMs:s.pre_cli_session_timeout_ms}}var Yi=600000,Xi=1800000;function qs(s){return{lastUsedAtMs:s.lastUsedAt,expiresAtMs:s.expiresAt,sessionTimeoutMs:s.sessionTimeoutMs,heartbeatTimeoutMs:s.heartbeatTimeoutMs,hasReceivedHeartbeat:s.hasReceivedHeartbeat,heartbeatTimeoutSource:s.heartbeatTimeoutSource,livenessPolicy:s.livenessPolicy,preCliHeartbeatTimeoutMs:s.preCliLiveness?.heartbeatTimeoutMs,preCliHeartbeatTimeoutSource:s.preCliLiveness?.heartbeatTimeoutSource,preCliSessionTimeoutMs:s.preCliLiveness?.sessionTimeoutMs}}function Gs(s){return JSON.stringify(s)}function Zi(s){return ir(s)}function kr(s){return s==="target-absent"||s==="target-busy"||s==="identity-continuity-lost"||s==="owned-by-other-daemon"}function Pr(s){if(!s||typeof s!=="object")return!1;let n=s;if(n.platform!=="android"&&n.platform!=="ios")return!1;return typeof n.stableDeviceId==="string"&&typeof n.deviceId==="string"}function en(s,n){if(s)s.stage=n}function sn(s){return{...s,initialOwnership:s.initialOwnership??"owned"}}function tn(s,n,a,d){if(a)return{sessionTimeoutMs:a.sessionTimeoutMs,heartbeatTimeoutMs:a.heartbeatTimeoutMs,heartbeatTimeoutSource:a.heartbeatTimeoutSource,hasReceivedHeartbeat:a.hasReceivedHeartbeat,livenessPolicy:a.livenessPolicy,preCliLiveness:a.preCliLiveness};return{sessionTimeoutMs:s??d,heartbeatTimeoutMs:n??cc(),heartbeatTimeoutSource:n===void 0?"default":"custom",hasReceivedHeartbeat:!1,livenessPolicy:"heartbeat"}}function $e(s){return s.livenessPolicy===ni?{livenessPolicy:ni}:{}}function me(s){return s.livenessPolicy==="cli-idle"?s.heartbeatTimeoutMs:void 0}function Ks(s){return ne(me(s))}function We(s,n,a){return a?.releaseReason===n?ne(a.cliIdleTimeoutMs):Ks(s)}async function Ue(s,n,a){if(n.source!==_a||n.release_reason!=="cli-idle-timeout")return;for(let d=s.lastIndexOf(":");d>0;d=s.lastIndexOf(":",d-1)){let c=await a(s.slice(0,d)),p=c?.release_reason==="cli-idle-timeout"?Se(c):void 0;if(p!==void 0)return p}return}function ne(s){return s===void 0?{}:{cliIdleTimeoutMs:s}}function Se(s){return Us(s.liveness_policy)==="cli-idle"?s.heartbeat_timeout_ms:void 0}function nn(s){return ne(Se(s))}class Vs{port;constructor(s){this.port=s}forceStuckRelease(s){let n=this.port.sessionSlots().getReleaseOp(s);if(!n||n.forced||n.commitDeclined||!this.port.sessionSlots().hasActiveRelease(n))return;let{session:a}=n,d=a.assignedDevice;n.forced=!0,n.forcedAbort?.abort(new t(`Release of session ${s} was forced; its teardown is abandoned`));let c=this.forcedReleaseSnapshot(s,a,n.reason.value);if(this.port.removeSession(s,a)){let S={...c,...this.port.managedExecutionReleaseMarker(a)};if(bo(c.releaseReason)){let R=this.port.restartReleasePersistence().get(c)??Promise.withResolvers();this.port.restartReleasePersistence().set(c,R),this.port.restartReleasePersistence().set(S,R)}this.port.notifySessionRelease(S,{deviceIdentityReplaced:n.stage==="awaiting-ownership"||n.options.deviceIdentityReplaced})}this.persistForcedReleaseFence(c);let p=n.promise.then(()=>{return},()=>{return}),m=l(p,{timer:this.port.timer,timeoutMs:wr,unref:!0,label:"Forced stuck release"}).catch((S)=>{e.debug(`[SessionManager] Forced release of ${s}: ${r(S)}`)});return this.port.registerPendingDeviceCleanup(d,m,wr),e.warn(`[SessionManager] Forcing the stuck release of session ${s} (stage=${n.stage??"unknown"}, reason=${c.releaseReason}): the session ${c.terminal?"stays fenced":"is released"} and device ${d} returns to the pool after at most ${wr}ms`),{deviceId:d,stage:n.stage}}forcedReleaseSnapshot(s,n,a){let d=this.port.sessionSlots().getTerminalSnapshot(s);if(d)return d;let c=this.port.sessionNow(),p={sessionId:s,deviceId:n.assignedDevice,releaseReason:a,releasedAtMs:c,terminal:ir(a),...We(n,a,this.port.retainedEndedBase(s)),heartbeat:{lastHeartbeatMs:n.lastHeartbeat,hasReceivedHeartbeat:n.hasReceivedHeartbeat,timeoutMs:n.heartbeatTimeoutMs,ageMs:Math.max(0,c-n.lastHeartbeat)}};if(this.port.releaseRowSessions().set(p,new WeakRef(n)),this.port.captureReleaseRowGeneration(p,this.port.persistedRowGenerations().get(n)),p.terminal)this.port.sessionSlots().setTerminalSnapshot(s,p);else this.port.sessionSlots().setForcedNonTerminal(n,p);return p}inFlightReleaseStillOwning(s){let n=this.port.sessionSlots().getReleaseOp(s);return n?.forced&&!this.port.sessionSlots().hasTerminalSnapshot(s)?void 0:n}persistForcedReleaseFence(s){let n=this.port.persistSessionRelease(s).then(()=>{return},(a)=>{if(e.warn(`[SessionManager] Failed to persist the forced release of ${s.sessionId}: `+r(a)),s.terminal&&!(a instanceof F))this.port.scheduleTerminalReleaseRetry(s);else if(!s.terminal&&!(a instanceof F))this.port.trackReleaseDrainWrite(this.port.retryNonTerminalRowAfterRelease(s))});this.port.trackReleaseDrainWrite(n)}liftTerminalFenceIfPresent(s){if(this.port.sessionSlots().hasTerminalSnapshot(s))this.liftTerminalFence(s)}liftTerminalFence(s,n,a=!1,d){if(!a){let c=this.port.sessionSlots().deleteTerminalSnapshot(s);if(d&&!c)return;d?.()}if(!n||this.port.volatileTerminalReleaseIntents().get(s)===n.releaseReason)this.port.volatileTerminalReleaseIntents().delete(s);if(this.port.terminalReleaseJournal().resolve(s,n?.releaseReason),n&&"sessionId"in n)this.port.rowWriter().cancel(s,n);else if(!a)this.port.rowWriter().liftTerminal(s)}}class zs{port;constructor(s){this.port=s}attachTerminalReleaseJournal(s){this.port.setJournal(s);for(let n of s.loadUnconfirmed())this.port.sessionSlots().setRecoveredTerminalIntent(n.sessionId,{...n,at:this.port.wallToSessionClock(n.at)})}async applyRecoveredTerminalReleaseIntents(s){let n=[];for(let a of Array.from(this.port.sessionSlots().recoveredTerminalIntents.values())){if(s!==void 0&&this.port.sessionNow()>=s)break;try{let d=await this.port.deviceSessionRepository().getSession(a.sessionId);if(d&&!(d.release_reason&&ir(d.release_reason))&&this.adoptedTerminalReleaseApplies(d))await l(this.port.deviceSessionRepository().markReleased(a.sessionId,ov(a.reason),a.at,{reason:a.reason,...this.adoptedTerminalReleaseFence(a.sessionId)}),{timer:this.port.timer,timeoutMs:Os,unref:!0,label:"Recovered terminal session release",timeoutError:()=>new F(a.sessionId,a.reason,Os)}),n.push(a.sessionId)}catch(d){e.warn(`[SessionManager] Failed to apply the unconfirmed terminal release of session ${a.sessionId} (${a.reason}); it stays fenced: ${r(d)}`,d);continue}this.port.sessionSlots().deleteRecoveredTerminalIntent(a.sessionId),this.port.checkSlotShadow(a.sessionId,"recovered-terminal-intent-deleted"),this.port.sessionSlots().deleteAdoptedTerminalOwner(a.sessionId),this.port.liftTerminalFence(a.sessionId,{releaseReason:a.reason},!0)}if(n.length>0)e.warn(`[SessionManager] Terminalized ${n.length} session(s) whose terminal release a previous daemon never persisted: ${n.join(", ")}`);return n}withRecoveredTerminalRelease(s){let n=this.port.sessionSlots().getRecoveredTerminalIntent(s.session_uuid);if(!n||s.release_reason!==null&&ir(s.release_reason)||!this.adoptedTerminalReleaseApplies(s))return s;return{...s,status:ov(n.reason),released_at_ms:n.at,release_reason:n.reason}}adoptedTerminalReleaseApplies(s){let n=this.port.sessionSlots().getAdoptedTerminalOwner(s.session_uuid);return n===void 0||(s.daemon_session_id??null)===n}adoptedTerminalReleaseFence(s){let n=this.port.sessionSlots().getAdoptedTerminalOwner(s);return n===void 0?{}:{onlyIfOwnedByDaemon:n}}async adoptDeadOwnerTerminalReleases(s){let n=this.confirmedDeadOwner(s);if(n===void 0)return!1;let a=!this.port.sessionSlots().hasAdoptedDeadJournal(n);if(a&&!this.fenceDeadDaemonIntents(n))return!1;let d=this.hasUnsettledAdoptedIntent(n);if(!a&&!d)return!1;if(d)await this.applyRecoveredTerminalReleaseIntents();if(!this.hasUnsettledAdoptedIntent(n))this.port.terminalReleaseJournal().discardDeadDaemon?.(n);return!0}fenceDeadDaemonIntents(s){let n=this.port.terminalReleaseJournal().readDeadDaemon?.(s);if(n===void 0)return!1;this.port.sessionSlots().addAdoptedDeadJournal(s);for(let a of n)this.port.sessionSlots().setRecoveredTerminalIntent(a.sessionId,{...a,at:this.port.wallToSessionClock(a.at)}),this.port.sessionSlots().setAdoptedTerminalOwner(a.sessionId,s);if(n.length>0)e.warn(`[SessionManager] Adopted ${n.length} unconfirmed terminal release(s) of dead daemon ${s}: ${n.map((a)=>a.sessionId).join(", ")}`);return!0}hasUnsettledAdoptedIntent(s){for(let n of this.port.sessionSlots().adoptedTerminalOwners.values())if(n===s)return!0;return!1}confirmedDeadOwner(s){let n=s.daemon_session_id??null;if(n===null||this.port.daemonSessionId()===void 0||n===this.port.daemonSessionId())return;if(!this.port.terminalReleaseJournal().readDeadDaemon||s.release_reason!==null&&ir(s.release_reason))return;return this.isConfirmedDeadDaemonSession(n)?n:void 0}isConfirmedDeadDaemonSession(s){let n=this.port.liveDaemonSessionIds();if(!n)return!1;try{return!n().has(s)}catch(a){return e.warn(`[SessionManager] Cannot list live daemons to check journal owner ${s}; its journal is not adopted yet: ${r(a)}`,a),!1}}}function Ar(s,n){return rn??=Q({initialDelayMs:DA,maxDelayMs:2000}),{networkCondition:n.networkCondition??Mi,clock:n.clock??Li(s),rotation:n.rotation??Ni(s),rotationBackoff:n.rotationBackoff??rn,screenReader:n.screenReader??Fi,screenReaderBackoff:n.screenReaderBackoff??Er,iosAppNetworkRule:n.iosAppNetworkRule}}function Tr(){let s=new sP(new oP);return{reset:async(n)=>{let a=await s.reset(n);if(a.kind==="reset"||a.kind==="refused"&&a.outcome==="owned_by_another_session")return;throw Error(`Failed to remove the offline rule for ${n.bundleId} on ${n.udid}: ${a.detail}`)},renew:(n,a)=>s.renew(n,a)}}class js{host;seams;constructor(s,n){this.host=s;this.seams=n}createDeviceCleanupQuarantine(s){return new vs({timer:s,now:()=>this.host.sessionNow(),hasOwner:(n)=>this.host.getSessionForDevice(n)!==null,teardownCapMs:wr,defaultRetryAfterMs:fd})}createStateRestore(s,n){let a=n.restorers??{},d=n.keepScreenAwakeRestorer??_i,c=n.biometricEnrollmentRestorer??xi,p=Ar(s,a);return new Bs({timer:s,dispatchDeviceRestore:(m,S,R,g)=>this.host.dispatchDeviceRestore(m,S,R,g),restoreGeneration:(m)=>this.host.replacedRestoreGenerations.get(m)??0,hasIdentityReplacementFence:(m)=>this.host.identityReplacementFences.has(m),trackSessionSetup:(m,S)=>this.seams.trackSessionSetup(m,S),isPublished:(m)=>this.host.sessions.get(m.sessionId)===m,healthIncarnation:(m)=>this.host.deviceHealth?.incarnation(m),restoreIncarnationIsCurrent:(m)=>this.host.restoreIncarnationIsCurrent(m),clearRestoreHealth:(m,S)=>this.seams.clearRestoreHealth(m,S),markHealth:(m,S,R)=>this.host.deviceHealth?.markers.mark(m,S,R),clearHealthMarker:(m,S,R)=>this.host.deviceHealth?.markers.clear(m,S,R),waitForIdentityReplacement:(m,S)=>this.host.waitForIdentityReplacement(m,S),abandonRestore:(m,S,R,g)=>this.seams.abandonRestore(m,S,R,g),sessionSetupsOf:(m)=>Array.from(this.host.sessionSetupPromises,(S)=>S.session===m?S.promise:null).filter((S)=>S!==null),waitForSessionSetup:(m,S,R)=>this.host.waitForSessionSetup(m,S,R),noteTeardownBound:(m,S)=>this.host.deviceCleanupQuarantine.noteTeardownBound(m,S),trackPendingDeviceCleanup:(m,S)=>this.seams.trackPendingDeviceCleanup(m,S),isAdmittedForAutomation:(m)=>this.host.isAdmittedForAutomation(m),sessionNow:()=>this.host.sessionNow(),registerPendingDeviceCleanup:(m,S,R)=>this.host.registerPendingDeviceCleanup(m,S,R)},{keepScreenAwake:d,biometricEnrollment:c,networkCondition:p.networkCondition,screenReader:p.screenReader,screenReaderBackoff:p.screenReaderBackoff,rotation:p.rotation,rotationBackoff:p.rotationBackoff,clock:p.clock,iosAppNetworkRuleRestorer:p.iosAppNetworkRule,defaultIosAppNetworkRuleRestorer:Tr,iosLease:{leaseMs:Mb,renewIntervalMs:Yie}})}createRecoveredIntents(s){return new zs({terminalReleaseJournal:()=>this.host.terminalReleaseJournal,setJournal:(n)=>{this.seams.setJournal(n)},daemonSessionId:()=>this.host.daemonSessionId,liveDaemonSessionIds:()=>this.host.liveDaemonSessionIds?.bind(this),sessionSlots:()=>this.host.sessionSlots,deviceSessionRepository:()=>this.host.deviceSessionRepository,timer:s,sessionNow:()=>this.host.sessionNow(),wallToSessionClock:(n)=>this.host.wallToSessionClock(n),checkSlotShadow:(n,a)=>this.host.slotShadowProbe.check(n,a),liftTerminalFence:(n,a,d)=>this.host.liftTerminalFence(n,a,d)})}createForcedStuckRelease(s){return new Vs({sessionSlots:()=>this.host.sessionSlots,removeSession:(n,a)=>this.host.removeSession(n,a),notifySessionRelease:(n,a)=>this.host.notifySessionRelease(n,a),managedExecutionReleaseMarker:$e,restartReleasePersistence:()=>this.host.restartReleasePersistence,registerPendingDeviceCleanup:(n,a,d)=>this.host.registerPendingDeviceCleanup(n,a,d),persistSessionRelease:(n)=>this.host.persistSessionRelease(n),scheduleTerminalReleaseRetry:(n)=>this.host.scheduleTerminalReleaseRetry(n),trackReleaseDrainWrite:(n)=>this.host.trackReleaseDrainWrite(n),retryNonTerminalRowAfterRelease:(n)=>this.host.retryNonTerminalRowAfterRelease(n),releaseRowSessions:()=>this.host.releaseRowSessions,captureReleaseRowGeneration:(n,a)=>this.host.captureReleaseRowGeneration(n,a),persistedRowGenerations:()=>this.host.persistedRowGenerations,volatileTerminalReleaseIntents:()=>this.host.volatileTerminalReleaseIntents,terminalReleaseJournal:()=>this.host.terminalReleaseJournal,rowWriter:()=>this.host.rowWriter,retainedEndedBase:(n)=>this.host.planLabels.retainedEndedBase(n),timer:s,sessionNow:()=>this.host.sessionNow()})}createLiveness(){return new Hs({getSession:(s)=>this.host.getSession(s),peekSession:(s)=>this.host.peekSession(s),unlessBaseEnded:(s)=>this.host.unlessBaseEnded(s),isAdmittedForAutomation:(s)=>this.host.isAdmittedForAutomation(s),sessionNow:()=>this.host.sessionNow(),ownershipSessionUuid:(s)=>this.host.ownershipSessionUuid(s),livenessOwnerView:(s)=>this.seams.livenessOwnerView(s),hasUnissuedActivity:(s)=>this.seams.hasUnissuedActivity(s),recordSessionActivity:(s)=>this.host.recordSessionActivity(s),getBarrier:()=>this.seams.getBarrier(),recordLivenessOwnership:(s,n)=>this.host.deviceSessionRepository.recordLivenessOwnership(s,n),replaceLivenessOwnership:(s,n)=>this.host.deviceSessionRepository.replaceLivenessOwnership(s,n),defaultHeartbeatTimeoutMs:()=>cc()})}}var Er=Q({initialDelayMs:250,maxDelayMs:2000}),rn;class Qs{setTerminalReleaseRetryBackoff(s){this.forwardersHost.rowWriter.setRetryBackoff(s)}assertDaemonCollaboratorsAttached(){this.forwardersHost.configuration.assertDaemonCollaboratorsAttached()}attachDaemonSessionId(s){this.forwardersHost.configuration.attachDaemonSessionId(s)}attachLiveDaemonSessionIds(s){this.forwardersHost.configuration.attachLiveDaemonSessionIds(s)}attachTerminalReleaseJournal(s){this.forwardersHost.recoveredIntents.attachTerminalReleaseJournal(s)}applyRecoveredTerminalReleaseIntents(s){return this.forwardersHost.recoveredIntents.applyRecoveredTerminalReleaseIntents(s)}setObserverSessionRegistry(s){this.forwardersHost.configuration.setObserverSessionRegistry(s)}getDeviceHealthRecovery(s,n,a){return this.forwardersHost.restoreHealth.getDeviceHealthRecovery(s,n,a)}setDeviceHealthMarkers(s,n,a,d=Q({initialDelayMs:1000})){return this.forwardersHost.restoreHealth.setDeviceHealthMarkers(s,n,a,d)}markDeviceNeedsAppCleanup(s,n,a,d){return this.forwardersHost.restoreHealth.markDeviceNeedsAppCleanup(s,n,a,d)}markDeviceNeedsRecorderTeardown(s,n,a,d){return this.forwardersHost.restoreHealth.markDeviceNeedsRecorderTeardown(s,n,a,d)}setRecoveryExpiryReleaseHandler(s){this.forwardersHost.configuration.setRecoveryExpiryReleaseHandler(s)}sessionNow(){return this.forwardersHost.sessionClock.now()}sessionClockToReportedWall(s){return this.forwardersHost.sessionClock.toWall(s)}onSessionRelease(s){return this.forwardersHost.callbacks.onSessionRelease(s)}onDeviceOwnershipChange(s){return this.forwardersHost.callbacks.onDeviceOwnershipChange(s)}onSessionCreated(s){return this.forwardersHost.callbacks.onSessionCreated(s)}getPendingDeviceCleanup(s,n){return this.forwardersHost.deviceCleanupQuarantine.get(s,n)}registerPendingDeviceCleanup(s,n,a){this.forwardersHost.deviceCleanupQuarantine.register(s,n,a)}getDeviceCleanupRetryAfterMs(s){return this.forwardersHost.bookkeeping.getDeviceCleanupRetryAfterMs(s)}registerAcquisitionDeviceCleanup(s,n,a){this.forwardersHost.deviceCleanupQuarantine.registerAcquisition(s,n,a)}hasDeviceCleanupInProgress(s){return this.forwardersHost.bookkeeping.hasDeviceCleanupInProgress(s)}getIdleReleasesInProgress(){return this.forwardersHost.bookkeeping.getIdleReleasesInProgress()}getNonTerminalReleasesInProgress(){return this.forwardersHost.bookkeeping.getNonTerminalReleasesInProgress()}getTerminalReleasesInProgress(){return this.forwardersHost.bookkeeping.getTerminalReleasesInProgress()}isReleaseInProgress(s,n){return this.forwardersHost.bookkeeping.isReleaseInProgress(s,n)}getReleaseStuckAtMs(s){return this.forwardersHost.bookkeeping.getReleaseStuckAtMs(s)}forceStuckRelease(s){return this.forwardersHost.forcedStuckRelease.forceStuckRelease(s)}setActiveSessionExecutionChecker(s){this.forwardersHost.configuration.setActiveSessionExecutionChecker(s)}setLivenessOwnerCallInFlightReader(s){this.forwardersHost.configuration.setLivenessOwnerCallInFlightReader(s)}setOwnerConnectedAtReader(s){this.forwardersHost.configuration.setOwnerConnectedAtReader(s)}restartMintBoundClaimLeases(s){return this.forwardersHost.activityClocks.restartMintBoundClaimLeases(s)}setSessionExecutionDeadlineLookup(s){this.forwardersHost.configuration.setSessionExecutionDeadlineLookup(s)}setExpiryReleaseExecutionCanceller(s){this.forwardersHost.configuration.setExpiryReleaseExecutionCanceller(s)}setDeviceAcquisitionExecutionCanceller(s){this.forwardersHost.configuration.setDeviceAcquisitionExecutionCanceller(s)}deferDeviceAcquisitionCancellation(s){return this.forwardersHost.callbacks.deferDeviceAcquisitionCancellation(s)}settleDeviceAcquisitionCancellation(s,n){return this.forwardersHost.callbacks.settleDeviceAcquisitionCancellation(s,n)}onSessionDeviceUnbound(s){return this.forwardersHost.callbacks.onSessionDeviceUnbound(s)}setManagedExecutionRecoveryListener(s){this.forwardersHost.configuration.setManagedExecutionRecoveryListener(s)}createSession(s,n,a,d={}){return this.forwardersHost.creationGuard.createSession(s,n,a,d)}stopAcceptingSessionCreations(){this.forwardersHost.configuration.stopAcceptingSessionCreations()}isAcceptingSessionCreations(){return this.forwardersHost.configuration.isAcceptingSessionCreations()}onRestartRecoveryActivity(s){return this.forwardersHost.persistedAdmission.onRestartRecoveryActivity(s)}isReleasedSessionInRestartRecoveryWindow(s){return this.forwardersHost.persistedAdmission.isReleasedSessionInRestartRecoveryWindow(s)}expireRestartRecoveryReservation(s){return this.forwardersHost.persistedAdmission.expireRestartRecoveryReservation(s)}terminalizeDeviceRestartHandoffForStop(s){return this.forwardersHost.persistedAdmission.terminalizeDeviceRestartHandoffForStop(s)}findSession(s){return this.forwardersHost.admission.findSession(s)}getSessionForNewExecution(s,n){return this.forwardersHost.admission.getSessionForNewExecution(s,n)}deviceHeldForLateRead(s,n){return this.forwardersHost.leaseExpiry.deviceHeldForLateRead(s,n)}getOrCreateSession(s,n,a,d={}){return this.forwardersHost.admission.getOrCreateSession(s,n,a,d)}admitIssuedSessionForAutomation(s,n,a={}){return this.forwardersHost.acquisition.admitIssuedSessionForAutomation(s,n,a)}rehydratePersistedSessions(s,n={}){return this.forwardersHost.rehydration.rehydratePersistedSessions(s,n)}setLateRehydrationListener(s){this.forwardersHost.configuration.setLateRehydrationListener(s)}rebindSession(s,n,a,d={}){return this.forwardersHost.rebinding.rebindSession(s,n,a,d)}rebindSessionForTerminalReleaseRecovery(s,n,a){return this.forwardersHost.rebinding.rebindSessionForTerminalReleaseRecovery(s,n,a)}flushDeferredRebindCleanups(s={}){return this.forwardersHost.rebinding.flushDeferredRebindCleanups(s)}getDeviceForSession(s){return this.forwardersHost.queries.getDeviceForSession(s)}getFinalizedReleaseReason(s){return this.forwardersHost.queries.getFinalizedReleaseReason(s)}getReleasedSessionReason(s){return this.forwardersHost.admission.getReleasedSessionReason(s)}getReleasedSessionIdleTimeoutMs(s){return this.forwardersHost.admission.getReleasedSessionIdleTimeoutMs(s)}getExpiredReleaseSnapshot(s){return this.forwardersHost.admission.getExpiredReleaseSnapshot(s)}getTerminalReleaseSnapshot(s){return this.forwardersHost.queries.getTerminalReleaseSnapshot(s)}reserveSessionForTerminalRelease(s,n){return this.forwardersHost.admission.reserveSessionForTerminalRelease(s,n)}getSessionForDevice(s){return this.forwardersHost.queries.getSessionForDevice(s)}getHeldDeviceSessions(){return this.forwardersHost.queries.getHeldDeviceSessions()}hasSession(s){return this.forwardersHost.queries.hasSession(s)}isLiveManagedExecutionSession(s){return this.forwardersHost.queries.isLiveManagedExecutionSession(s)}getLegacyLifecycleView(){return this.forwardersHost.queries.getLegacyLifecycleView()}checkSlotShadowAgreement(s,n,a=[]){this.forwardersHost.slotShadowProbe.check(s,n,a)}isCurrentSession(s){return this.forwardersHost.queries.isCurrentSession(s)}isAdmittedForAutomation(s){return this.forwardersHost.queries.isAdmittedForAutomation(s)}getSessionLivenessOwnerToken(s){return this.forwardersHost.queries.getSessionLivenessOwnerToken(s)}getReleasingSession(s){return this.forwardersHost.queries.getReleasingSession(s)}isLatestSessionIdentity(s,n={}){return this.forwardersHost.queries.isLatestSessionIdentity(s,n)}releaseSession(s,n="explicit-release",a={}){return this.forwardersHost.releaseRequests.releaseSession(s,n,a)}setReleaseDeviceHold(s){this.forwardersHost.configuration.setReleaseDeviceHold(s)}releaseSessionUnlessSuperseded(s,n,a={}){return this.forwardersHost.releaseRequests.releaseSessionUnlessSuperseded(s,n,a)}trackSessionSetup(s,n){return this.forwardersHost.bookkeeping.trackSessionSetup(s,n)}drainReleasePromises(s,n=[]){return this.forwardersHost.bookkeeping.drainReleasePromises(s,n)}waitForSessionRelease(s){return this.forwardersHost.bookkeeping.waitForSessionRelease(s)}waitForSessionReleaseWithin(s,n){return this.forwardersHost.bookkeeping.waitForSessionReleaseWithin(s,n)}beginIosAppNetworkRule(s,n,a){return this.forwardersHost.stateRestore.beginIosAppNetworkRule(s,n,a)}releaseIosAppWatchFor(s,n){return this.forwardersHost.stateRestore.releaseIosAppWatchFor(s,n)}prepareIosAppNetworkReset(s,n){return this.forwardersHost.stateRestore.prepareIosAppNetworkReset(s,n)}confirmIosAppNetworkRule(s,n){this.forwardersHost.stateRestore.confirmIosAppNetworkRule(s,n)}finishIosAppNetworkReset(s,n){this.forwardersHost.stateRestore.finishIosAppNetworkReset(s,n)}activeIosAppNetworkLease(s){return this.forwardersHost.stateRestore.activeIosAppNetworkLease(s)}scheduleNetworkConditionExpiry(s,n,a){this.forwardersHost.stateRestore.scheduleNetworkConditionExpiry(s,n,a)}peekNetworkConditionExpiry(s){return this.forwardersHost.stateRestore.peekNetworkConditionExpiry(s)}rearmNetworkConditionExpiry(s,n){this.forwardersHost.stateRestore.rearmNetworkConditionExpiry(s,n)}cancelNetworkConditionExpiry(s){this.forwardersHost.stateRestore.cancelNetworkConditionExpiry(s)}setLastRenderedObservation(s,n,a){return this.forwardersHost.cache.setLastRenderedObservation(s,n,a)}getLastActionMetadata(s,n){return this.forwardersHost.cache.getLastActionMetadata(s,n)}setLastActionMetadata(s,n,a){return this.forwardersHost.cache.setLastActionMetadata(s,n,a)}getLastRenderedObservation(s){return this.forwardersHost.cache.getLastRenderedObservation(s)}setLastRenderedDisplayRevision(s,n,a,d){return this.forwardersHost.cache.setLastRenderedDisplayRevision(s,n,a,d)}getLastRenderedDisplayGeneration(s){return this.forwardersHost.cache.getLastRenderedDisplayGeneration(s)}setDisplayPin(s,n){return this.forwardersHost.cache.setDisplayPin(s,n)}getDisplayPin(s){return this.forwardersHost.cache.getDisplayPin(s)}getLastRenderedDisplayKey(s){return this.forwardersHost.cache.getLastRenderedDisplayKey(s)}getLastRenderedDisplayRevision(s){return this.forwardersHost.cache.getLastRenderedDisplayRevision(s)}getKeepScreenAwake(s){return this.forwardersHost.cache.getKeepScreenAwake(s)}setDeviceReadiness(s,n){return this.forwardersHost.cache.setDeviceReadiness(s,n)}getDeviceReadiness(s){return this.forwardersHost.cache.getDeviceReadiness(s)}invalidateAutomationReadiness(s,n){return this.forwardersHost.cache.invalidateAutomationReadiness(s,n)}setClock(s,n){return this.forwardersHost.cache.setClock(s,n)}getClock(s){return this.forwardersHost.cache.getClock(s)}getKeepAwakeRestoreReport(s){return this.forwardersHost.cache.getKeepAwakeRestoreReport(s)}trackClockSessionSetup(s,n){return this.forwardersHost.cache.trackClockSessionSetup(s,n)}runClockMutationExclusive(s,n){return this.forwardersHost.cache.runClockMutationExclusive(s,n)}setRotation(s,n){return this.forwardersHost.cache.setRotation(s,n)}getRotation(s){return this.forwardersHost.cache.getRotation(s)}trackRotationSessionSetup(s,n){return this.forwardersHost.cache.trackRotationSessionSetup(s,n)}runRotationMutationExclusive(s,n){return this.forwardersHost.cache.runRotationMutationExclusive(s,n)}trackScreenReaderSessionSetup(s,n){return this.forwardersHost.cache.trackScreenReaderSessionSetup(s,n)}setScreenReader(s,n){return this.forwardersHost.cache.setScreenReader(s,n)}getScreenReader(s){return this.forwardersHost.cache.getScreenReader(s)}runScreenReaderMutationExclusive(s,n){return this.forwardersHost.cache.runScreenReaderMutationExclusive(s,n)}setBiometricEnrollment(s,n){return this.forwardersHost.cache.setBiometricEnrollment(s,n)}getBiometricEnrollment(s){return this.forwardersHost.cache.getBiometricEnrollment(s)}setNetworkCondition(s,n){return this.forwardersHost.cache.setNetworkCondition(s,n)}bumpNetworkConditionGeneration(s){return this.forwardersHost.cache.bumpNetworkConditionGeneration(s)}runNetworkConditionMutationExclusive(s,n){return this.forwardersHost.cache.runNetworkConditionMutationExclusive(s,n)}getNetworkCondition(s){return this.forwardersHost.cache.getNetworkCondition(s)}openPlanLabelMints(s,n){return this.forwardersHost.planLabelsLifecycle.openPlanLabelMints(s,n)}getBaseSessionOfDerivedLabel(s){return this.forwardersHost.planLabelsLifecycle.getBaseSessionOfDerivedLabel(s)}isLiveSessionOfSamePlan(s,n){return this.forwardersHost.planLabelsLifecycle.isLiveSessionOfSamePlan(s,n)}takeDerivedLabelSessions(s,n){return this.forwardersHost.planLabelsLifecycle.takeDerivedLabelSessions(s,n)}getDeviceLabels(s){return this.forwardersHost.cache.getDeviceLabels(s)}recordToolCallEnded(s,n={admitted:!0}){return this.forwardersHost.activityClocks.recordToolCallEnded(s,n)}terminalAnswerForEndedSession(s,n){return this.forwardersHost.admission.terminalAnswerForEndedSession(s,n)}peekTerminalAnswerForEndedSession(s){return this.forwardersHost.admission.peekTerminalAnswerForEndedSession(s)}ownershipSessionUuid(s){return this.forwardersHost.leaseExpiry.ownershipSessionUuid(s)}getOwnerLeaseHold(s){return this.forwardersHost.leaseExpiry.getOwnerLeaseHold(s)}getSessionLeaseState(s){return this.forwardersHost.leaseExpiry.getSessionLeaseState(s)}ownerLeaseAwaitsReap(s){return this.forwardersHost.leaseExpiry.ownerLeaseAwaitsReap(s)}judgedLeaseHeartbeat(s){return this.forwardersHost.leaseExpiry.judgedLeaseHeartbeat(s)}creditOwnerHeartbeatDuringRelease(s,n){return this.forwardersHost.leaseExpiry.creditOwnerHeartbeatDuringRelease(s,n)}setStallProbe(s){this.forwardersHost.configuration.setStallProbe(s)}startRehydratedOwnerWindows(){return this.forwardersHost.activityClocks.startRehydratedOwnerWindows()}forgiveDaemonStall(s,n,a=0,d){return this.forwardersHost.activityClocks.forgiveDaemonStall(s,n,a,d)}clearSessionCache(s,n){return this.forwardersHost.cache.clearSessionCache(s,n)}getActiveSessionCount(){return this.forwardersHost.queries.getActiveSessionCount()}getAllSessions(){return this.forwardersHost.queries.getAllSessions()}getAllSessionIds(){return this.forwardersHost.queries.getAllSessionIds()}getAllKnownSessionIds(){return this.forwardersHost.queries.getAllKnownSessionIds()}getAssignedDevices(){return this.forwardersHost.queries.getAssignedDevices()}getIdleReleaseExecutionVeto(s){return this.forwardersHost.leaseExpiry.getIdleReleaseExecutionVeto(s)}cancelExecutionsCutByRelease(s,n,a){return this.forwardersHost.leaseExpiry.cancelExecutionsCutByRelease(s,n,a)}cleanupExpiredSessions(){return this.forwardersHost.activityClocks.cleanupExpiredSessions()}stopCleanupTimer(){this.forwardersHost.cleanup.stopCleanupTimer()}getStats(){return this.forwardersHost.queries.getStats()}}function on(s,n){return{...s,isReleasing:(a)=>n.has(a)}}class qe extends Error{from;to;constructor(s,n,a){super(a);this.from=s;this.to=n;this.name="SlotTransitionError"}}class Ys{pendingSessionAssignments=new Map;sharedSessionAssignments=new Map;pendingSessionCreations=new Map;pendingPersistedRecoveries=new Map;claimedRecoverableRows=new WeakSet;pendingSessionReleases=new Map;pendingRebinds=new Map;deferredCleanupOwners=new Map;releasePromises=new Map;activeReleasePromises=new Set;forcedNonTerminalReleases=new WeakMap;releasingSessions=new WeakSet;terminalReleaseSnapshots=new Map;terminalReleaseReasonStates=new Map;terminalReleaseReservations=new Map;latestFinalizedSessionIdentities=new Map;finalizedSessionIdentityRegistry;recoveredTerminalReleaseIntents=new Map;adoptedDeadDaemonJournals=new Set;adoptedTerminalReleaseOwners=new Map;rowPendingSignal;tagWaiters=new Map;settled(s,n){let a=this.tagWaiters.get(s);if(a)return a.promise;let{promise:d,resolve:c}=Promise.withResolvers();return this.tagWaiters.set(s,{view:n,tag:Re(n,s),promise:d,resolve:c}),d}notifySettled(s){let n=this.tagWaiters.get(s);if(n&&Re(n.view,s)!==n.tag)this.tagWaiters.delete(s),n.resolve()}notifyReleasingChanged(){for(let s of this.tagWaiters.keys())this.notifySettled(s)}constructor(s={}){this.rowPendingSignal=s.rowPending??{pending:()=>!1};let n=({sessionId:a,identity:d})=>{if(this.latestFinalizedSessionIdentities.get(a)===d)this.latestFinalizedSessionIdentities.delete(a),this.notifySettled(a),s.onFinalizedIdentityCollected?.(a)};this.finalizedSessionIdentityRegistry=s.createFinalizationRegistry?s.createFinalizationRegistry(n):new FinalizationRegistry(n)}rowPending(s){return this.rowPendingSignal.pending(s)}recordFinalizedIdentity(s){if(this.latestFinalizedSessionIdentities.get(s.sessionId)?.deref()===s)return;let a=new WeakRef(s);this.latestFinalizedSessionIdentities.set(s.sessionId,a),this.notifySettled(s.sessionId),this.finalizedSessionIdentityRegistry.register(s,{sessionId:s.sessionId,identity:a})}get terminalSnapshots(){return this.terminalReleaseSnapshots}getTerminalSnapshot(s){return this.terminalReleaseSnapshots.get(s)}hasTerminalSnapshot(s){return this.terminalReleaseSnapshots.has(s)}setTerminalSnapshot(s,n){this.terminalReleaseSnapshots.set(s,n),this.notifySettled(s)}deleteTerminalSnapshot(s){let n=this.terminalReleaseSnapshots.delete(s);return this.notifySettled(s),n}get terminalReasonStates(){return this.terminalReleaseReasonStates}getTerminalReasonState(s){return this.terminalReleaseReasonStates.get(s)}hasTerminalReasonState(s){return this.terminalReleaseReasonStates.has(s)}setTerminalReasonState(s,n){this.terminalReleaseReasonStates.set(s,n)}deleteTerminalReasonState(s){return this.terminalReleaseReasonStates.delete(s)}get terminalReservations(){return this.terminalReleaseReservations}getTerminalReservation(s){return this.terminalReleaseReservations.get(s)}hasTerminalReservation(s){return this.terminalReleaseReservations.has(s)}setTerminalReservation(s,n){this.terminalReleaseReservations.set(s,n)}deleteTerminalReservation(s){return this.terminalReleaseReservations.delete(s)}get latestFinalizedIdentities(){return this.latestFinalizedSessionIdentities}getFinalizedIdentity(s){return this.latestFinalizedSessionIdentities.get(s)}hasFinalizedIdentity(s){return this.latestFinalizedSessionIdentities.has(s)}deleteFinalizedIdentity(s){let n=this.latestFinalizedSessionIdentities.delete(s);return this.notifySettled(s),n}get recoveredTerminalIntents(){return this.recoveredTerminalReleaseIntents}getRecoveredTerminalIntent(s){return this.recoveredTerminalReleaseIntents.get(s)}hasRecoveredTerminalIntent(s){return this.recoveredTerminalReleaseIntents.has(s)}setRecoveredTerminalIntent(s,n){this.recoveredTerminalReleaseIntents.set(s,n),this.notifySettled(s)}deleteRecoveredTerminalIntent(s){let n=this.recoveredTerminalReleaseIntents.delete(s);return this.notifySettled(s),n}get adoptedTerminalOwners(){return this.adoptedTerminalReleaseOwners}getAdoptedTerminalOwner(s){return this.adoptedTerminalReleaseOwners.get(s)}hasAdoptedTerminalOwner(s){return this.adoptedTerminalReleaseOwners.has(s)}setAdoptedTerminalOwner(s,n){this.adoptedTerminalReleaseOwners.set(s,n)}deleteAdoptedTerminalOwner(s){return this.adoptedTerminalReleaseOwners.delete(s)}get adoptedDeadJournals(){return this.adoptedDeadDaemonJournals}hasAdoptedDeadJournal(s){return this.adoptedDeadDaemonJournals.has(s)}addAdoptedDeadJournal(s){this.adoptedDeadDaemonJournals.add(s)}deleteAdoptedDeadJournal(s){return this.adoptedDeadDaemonJournals.delete(s)}get releaseOps(){return this.releasePromises}getReleaseOp(s){return this.releasePromises.get(s)}hasReleaseOp(s){return this.releasePromises.has(s)}setReleaseOp(s,n){this.releasePromises.set(s,n),this.notifySettled(s)}deleteReleaseOp(s){let n=this.releasePromises.delete(s);return this.notifySettled(s),n}get activeReleases(){return this.activeReleasePromises}addActiveRelease(s){this.activeReleasePromises.add(s)}hasActiveRelease(s){return this.activeReleasePromises.has(s)}deleteActiveRelease(s){return this.activeReleasePromises.delete(s)}markReleasing(s){this.releasingSessions.add(s),this.notifyReleasingChanged()}unmarkReleasing(s){let n=this.releasingSessions.delete(s);return this.notifyReleasingChanged(),n}isReleasing(s){return this.releasingSessions.has(s)}getForcedNonTerminal(s){return this.forcedNonTerminalReleases.get(s)}setForcedNonTerminal(s,n){this.forcedNonTerminalReleases.set(s,n)}hasForcedNonTerminal(s){return this.forcedNonTerminalReleases.has(s)}deleteForcedNonTerminal(s){return this.forcedNonTerminalReleases.delete(s)}get assignments(){return this.pendingSessionAssignments}getAssignment(s){return this.pendingSessionAssignments.get(s)}hasAssignment(s){return this.pendingSessionAssignments.has(s)}setAssignment(s,n){this.pendingSessionAssignments.set(s,n),this.notifySettled(s)}deleteAssignment(s){let n=this.pendingSessionAssignments.delete(s);return this.notifySettled(s),n}get sharedAssignments(){return this.sharedSessionAssignments}getShared(s){return this.sharedSessionAssignments.get(s)}setShared(s,n){this.sharedSessionAssignments.set(s,n)}deleteShared(s){return this.sharedSessionAssignments.delete(s)}get creations(){return this.pendingSessionCreations}getCreation(s){return this.pendingSessionCreations.get(s)}hasCreation(s){return this.pendingSessionCreations.has(s)}setCreation(s,n){this.pendingSessionCreations.set(s,n),this.notifySettled(s)}deleteCreation(s){let n=this.pendingSessionCreations.delete(s);return this.notifySettled(s),n}get recoveries(){return this.pendingPersistedRecoveries}getRecovery(s){return this.pendingPersistedRecoveries.get(s)}hasRecovery(s){return this.pendingPersistedRecoveries.has(s)}setRecovery(s,n){this.pendingPersistedRecoveries.set(s,n)}deleteRecovery(s){return this.pendingPersistedRecoveries.delete(s)}get releaseRequests(){return this.pendingSessionReleases}getReleaseRequest(s){return this.pendingSessionReleases.get(s)}setReleaseRequest(s,n){this.pendingSessionReleases.set(s,n),this.notifySettled(s)}deleteReleaseRequest(s){let n=this.pendingSessionReleases.delete(s);return this.notifySettled(s),n}get rebinds(){return this.pendingRebinds}getRebind(s){return this.pendingRebinds.get(s)}hasRebind(s){return this.pendingRebinds.has(s)}setRebind(s,n){this.pendingRebinds.set(s,n),this.notifySettled(s)}deleteRebind(s){let n=this.pendingRebinds.delete(s);return this.notifySettled(s),n}get deferredCleanups(){return this.deferredCleanupOwners}setDeferredCleanup(s,n){this.deferredCleanupOwners.set(s,n)}deleteDeferredCleanup(s){return this.deferredCleanupOwners.delete(s)}markRowClaimed(s){this.claimedRecoverableRows.add(s)}isRowClaimed(s){return this.claimedRecoverableRows.has(s)}}var Cr=new Map([["absent",new Set(["assigning","creating","fenced"])],["assigning",new Set(["creating","absent"])],["creating",new Set(["absent","live","releasing"])],["live",new Set(["rebinding","releasing"])],["rebinding",new Set(["live","releasing"])],["releasing",new Set(["ended","fenced","live"])],["ended",new Set(["creating","absent"])],["fenced",new Set(["creating"])]]);function Ge(s,n){let a=`${s.tag} -> ${n.tag}`;if(s.fence!==void 0&&s.tag!=="releasing"||n.fence!==void 0&&n.tag!=="releasing")return{ok:!1,reason:`${a}: fence is only meaningful for releasing`};if(s.tag===n.tag){if(s.tag==="releasing"&&s.fence==="none"&&n.fence==="terminal")return{ok:!0};return{ok:!1,reason:`${a}: only the releasing fence upgrade from none to terminal may keep its tag`}}if(!Cr.get(s.tag)?.has(n.tag))return{ok:!1,reason:`${a}: not a legal slot transition`};return{ok:!0}}var an=[{event:"published",from:"absent",via:"creating",to:"live"},{event:"assignment-end",from:"assigning",via:"absent",to:"fenced"},{event:"creation-end",from:"creating",via:"absent",to:"fenced"},{event:"unpublished",from:"releasing",via:"ended",to:"creating"}],ln=new Set(["assignment-start:ended:assigning","assignment-end:assigning:ended","creation-end:creating:assigning","creation-end:creating:ended","unpublished:releasing:assigning","release-end:ended:fenced","release-end:ended:live"]);function Ke(s,n){let a=Re(s,n),d={tag:a,releaseRequested:(a==="creating"||a==="assigning")&&s.pendingReleases.has(n)};if(a==="releasing")d.fence=s.terminalSnapshots.has(n)?"terminal":"none";if(!Te(a)&&(s.pendingReleases.has(n)||s.pendingRebinds.has(n)||s.releaseOps.has(n)))d.residue=!0;return d}function Re(s,n){let a=s.sessions.get(n);if(a!==void 0)return Or(s,n,a);if(s.pendingCreations.has(n))return"creating";if(s.pendingAssignments.has(n))return"assigning";if(s.terminalSnapshots.has(n)||s.recoveredTerminalIntents.has(n))return"fenced";if(s.releaseOps.has(n)||s.latestFinalizedIdentities.get(n)?.deref()!==void 0)return"ended";return"absent"}function Or(s,n,a){let d=s.releaseOps.get(n);if(s.terminalSnapshots.has(n)||s.isReleasing(a)||d?.session===a&&!d.forced&&!d.commitDeclined)return"releasing";return s.pendingRebinds.has(n)?"rebinding":"live"}function Te(s){return s==="assigning"||s==="creating"||s==="live"||s==="rebinding"||s==="releasing"}function Dr(s){return s!=="absent"&&s!=="ended"&&s!=="fenced"}function Xs(s){return Dr(s.tag)||s.residue===!0}function ze(s,n,a=!1){let d=s.sessions.get(n);if(d!==void 0)return d;if(s.pendingCreations.has(n)||!a&&s.pendingAssignments.has(n))return;return s.releaseOps.get(n)?.session??s.latestFinalizedIdentities.get(n)?.deref()}function dn(s,n,a){if(s.sessions.get(n)!==a)return!1;let d=Re(s,n);return d==="live"||d==="rebinding"||d==="releasing"&&!s.terminalSnapshots.has(n)}function cn(s,n){return s.sessions.get(n)??s.releaseOps.get(n)?.session}function un(s){return[...new Set([...s.sessions.keys(),...s.pendingCreations.keys(),...s.pendingAssignments.keys(),...s.pendingRebinds.keys(),...s.pendingReleases.keys(),...s.releaseOps.keys()])].filter((n)=>Xs(Ke(s,n)))}class Zs{host;facade;lifecycleView;constructor(s,n){this.host=s;this.facade=n}getDeviceForSession(s){let n=this.host.findSession(s);if(!n)return null;return n.assignedDevice}getFinalizedReleaseReason(s){return this.host.finalizedSessionReleases.get(s)?.finalizedSnapshot?.releaseReason}getTerminalReleaseSnapshot(s){let n=this.host.sessionSlots.getTerminalSnapshot(s);return n?{...n,heartbeat:{...n.heartbeat}}:void 0}getSessionForDevice(s){return this.host.deviceSessionMap.get(s)??null}getHeldDeviceSessions(){return[...this.host.deviceSessionMap].flatMap(([s,n])=>{let a=cn(this.host.getLegacyLifecycleView(),n);return a?[{deviceId:s,sessionId:n,platform:a.platform,stableDeviceId:a.stableDeviceId}]:[]})}hasSession(s){return this.host.sessions.has(s)}isLiveManagedExecutionSession(s){let n=this.host.expireIfDue(s,!1,void 0,!1);return n!==null&&n.livenessPolicy===ni&&!this.host.sessionSlots.isReleasing(n)}getLegacyLifecycleView(){return this.lifecycleView??=on({sessions:this.host.sessions,pendingAssignments:this.host.sessionSlots.assignments,pendingCreations:this.host.sessionSlots.creations,pendingReleases:this.host.sessionSlots.releaseRequests,pendingRebinds:this.host.sessionSlots.rebinds,releaseOps:this.host.sessionSlots.releaseOps,terminalSnapshots:this.host.sessionSlots.terminalSnapshots,recoveredTerminalIntents:this.host.sessionSlots.recoveredTerminalIntents,latestFinalizedIdentities:this.host.sessionSlots.latestFinalizedIdentities},{has:(s)=>this.host.sessionSlots.isReleasing(s)})}isCurrentSession(s){return dn(this.host.getLegacyLifecycleView(),s.sessionId,s)}isAdmittedForAutomation(s){return this.host.isCurrentSession(s)&&!this.host.sessionSlots.isReleasing(s)}getSessionLivenessOwnerToken(s){return(this.host.sessions.get(s)??this.host.sessionSlots.getReleaseOp(s)?.session)?.livenessOwnerToken}getReleasingSession(s){return this.host.sessionSlots.getReleaseOp(s)?.session??null}isLatestSessionIdentity(s,n={}){return ze(this.host.getLegacyLifecycleView(),s.sessionId,n.ignorePendingAssignment)===s}getActiveSessionCount(){return this.host.sessions.size}getAllSessions(){return Array.from(this.host.sessions.values()).filter((s)=>!this.host.isSessionExpired(s))}getAllSessionIds(){return Array.from(this.host.sessions.keys())}getAllKnownSessionIds(){return un(this.host.getLegacyLifecycleView())}getAssignedDevices(){return new Set(Array.from(this.host.sessions.values()).filter((s)=>!this.host.isSessionExpired(s)).map((s)=>s.assignedDevice))}getStats(){let s=this.facade.getAllSessions().length,n=this.host.sessions.size-s;return{totalSessions:this.host.sessions.size,activeSessions:s,expiredSessions:n,assignedDevices:this.facade.getAssignedDevices().size}}}function hn(s,n){let a=Object.fromEntries(Object.entries(n).map(([d,c])=>[d,{get:c,enumerable:!0,configurable:!0}]));return Object.defineProperties({...s},a)}var Aq=5000,et=Oi*1000+Aq;class st{reason;entries=new Map;revision=0;recheckUsed=!1;constructor(s="recording-teardown"){this.reason=s}add(s,n,a){let d=a??Symbol(),c={retry:s,retryTimeoutMs:n};return this.entries.set(d,c),this.revision++,this.recheckUsed=!1,()=>{if(this.entries.get(d)===c)this.entries.delete(d)}}get empty(){return this.entries.size===0}get timeoutMs(){return Math.max(0,...Array.from(this.entries.values(),(s)=>s.retryTimeoutMs))}async dispatch(){let s=[...this.entries],n=[];if(await Promise.all(s.map(async([a,d])=>{try{if(await d.retry(),this.entries.get(a)===d)this.entries.delete(a)}catch(c){n.push(c),e.warn(`${this.reason==="recording-teardown"?"Recorder teardown":"App cleanup"} retry remains unconfirmed`,c)}})),!this.empty)throw new(this.reason==="recording-teardown"&&n.length>0&&n.every((d)=>d instanceof Zc)?Zc:Error)(`${this.reason==="recording-teardown"?"Recorder teardown":"App cleanup"} retries remain unconfirmed`)}}function pn(s,n,a,d){return n.slice(a-1).reduce((c,p,m)=>c+s.timeoutMs*(a+m)+(m>0||d?p:0),0)}async function Ir(s,n,a){let d=a.reason==="app-cleanup"?"App cleanup":"Recorder teardown",c=Error(`${d} recovery timed out`);try{await l(s,{timer:a.timer,timeoutMs:n,label:`${d} recovery`,timeoutError:()=>c})}catch(p){if(e.warn(`${d} recovery dispatch failed`,p),p===c){a.publishDeadline(void 0);try{await s}catch(m){return e.warn(`Timed-out ${d.toLowerCase()} recovery failed late`,m),m instanceof Zc}}else return p instanceof Zc}return!1}async function mn(s,n){let a=s.revision;for(let d=1;d<=3;){if(a!==s.revision)d=1,a=s.revision;if(n.publishDeadline(n.timer.now()+pn(s,n.delays,d,!0)),await n.timer.sleep(n.delays[d-1]),!await n.isCurrent())return n.drop(),s.revision;if(!n.canRecover()){if(!n.acceptingSessions())return s.revision;continue}if(a!==s.revision)d=1;a=s.revision;let c=s.timeoutMs*d;n.publishDeadline(n.timer.now()+pn(s,n.delays,d,!1));let p=n.dispatch(()=>s.dispatch()),m=await Ir(p,c,n);if(!await n.isCurrent())return n.drop(),s.revision;if(s.empty)return n.clear(),n.drop(),s.revision;if(m){if(!n.acceptingSessions())return s.revision;continue}d=a!==s.revision?1:d+1,a=s.revision}return a}class tt{host;constructor(s){this.host=s}deviceHealth;identityReplacementFences=new Map;replacedRestoreGenerations=new Map;activeRestoreControllers=new Map;markIdentityReplacedRelease(s,n=s.options,a){if(!n.deviceIdentityReplaced)return;s.options.deviceIdentityReplaced=!0;let d=s.identityReplacement??={deviceId:s.session.assignedDevice,final:!1,commitFences:[],resumeStep:s.teardownStep??0};if(a)d.commitFences.push(a);else d.final=!0;let{deviceId:c}=d,p=this.identityReplacementFences.get(c);if(!p){let m=Promise.withResolvers();p={releases:new Set,settled:m.promise,resume:m.resolve},this.identityReplacementFences.set(c,p)}p.releases.add(s);for(let m of this.activeRestoreControllers.get(c)??[])m.abort(Error("Device identity replaced during restoration"))}finishIdentityReplacedRelease(s){let n=s.identityReplacement?.deviceId;if(n===void 0)return;let a=this.identityReplacementFences.get(n);if(!a||!a.releases.delete(s)||a.releases.size>0)return;this.identityReplacementFences.delete(n),a.resume()}revokeSupersededIdentityReplacement(s){let n=s?.identityReplacement;if(!s||nu(s)||!n||n.final||!n.commitFences.every(Ae))return!1;return this.finishIdentityReplacedRelease(s),delete s.options.deviceIdentityReplaced,s.teardownResumeStep=n.resumeStep,delete s.identityReplacement,!0}async waitForIdentityReplacement(s,n){let a=this.identityReplacementFences.get(s);while(a)await a.settled,a=this.identityReplacementFences.get(s);return(this.replacedRestoreGenerations.get(s)??0)===n}recorderTeardownRetries=new Map;recorderTeardownRechecks=new Map;healthRecoveries=new Map;healthRecoveryDeadlines=new Map;getDeviceHealthRecovery(s,n,a){if(this.pruneRecorderTeardownRetries(),this.deviceHealth?.incarnation(s)!==n)return{recovering:!1};if(a==="clock")return{recovering:[...this.host.stateRestore.clockRestores.targets.get(s)?.values()??[]].some((p)=>!p.removed)};let d=`${s}#${n}:${a}`;if(!this.healthRecoveries.has(d)&&!this.recorderTeardownRechecks.has(d))return{recovering:!1};let c=this.healthRecoveryDeadlines.get(d);return{recovering:!0,...c!==void 0&&(this.recorderTeardownRechecks.has(d)||!this.identityReplacementFences.has(s)&&this.deviceHealth.canRecover(s))?{retryAfterMs:Math.max(1,Math.ceil(c-this.host.timer.now()))}:{}}}setDeviceHealthMarkers(s,n,a,d=Q({initialDelayMs:1000})){this.deviceHealth={markers:s,incarnation:n,canRecover:a,backoff:d}}markDeviceNeedsAppCleanup(s,n,a,d){this.markDeviceNeedsKeyedRecovery(s,n,a,{retryKey:d,reason:"app-cleanup"})}markDeviceNeedsRecorderTeardown(s,n,a,d){return this.markDeviceNeedsKeyedRecovery(s,n,a,{retryKey:d,reason:"recording-teardown"})}markDeviceNeedsKeyedRecovery(s,n,a,{retryKey:d,reason:c}){this.pruneRecorderTeardownRetries();let p=this.deviceHealth,m=p?.incarnation(s);if(!p||m===void 0)return e.warn(`${c==="recording-teardown"?"Recorder teardown":"App cleanup"} on ${s} has no pool incarnation; cannot key health marker`),()=>{};let S={deviceId:s,incarnation:m},R=`${s}#${m}:${c}`,g=this.recorderTeardownRetries.get(R)?.retries??new st(c);this.recorderTeardownRetries.set(R,{...S,reason:c,retries:g});let w=g.add(n,a,d),y=this.recorderTeardownRechecks.get(R);if(y!==void 0)this.host.timer.clearTimeout(y),this.recorderTeardownRechecks.delete(R);if(p.markers.mark(s,m,c),this.healthRecoveryDeadlines.set(R,void 0),!this.healthRecoveries.has(R))this.startRecorderTeardownRecovery(S,g,c);return()=>{if(w(),g.empty&&this.recorderTeardownRetries.get(R)?.retries===g)this.clearRestoreHealth(S,c),this.pruneRecorderTeardownRetries(),this.healthRecoveries.delete(R),this.healthRecoveryDeadlines.delete(R)}}startRecorderTeardownRecovery(s,n,a){let{deviceId:d,incarnation:c}=s,p=this.deviceHealth,m=`${d}#${c}:${a}`,S,R=this.replacedRestoreGenerations.get(d)??0,g=H(void 0,()=>mn(n,{reason:a,timer:this.host.timer,delays:[1,2,3].map((w)=>p.backoff.delayForAttempt(w)),isCurrent:async()=>await this.waitForIdentityReplacement(d,R)&&this.restoreIncarnationIsCurrent(s)&&this.recorderTeardownRetries.get(m)?.retries===n&&!!p.markers.get(d,c,a),canRecover:()=>p.canRecover(d),acceptingSessions:()=>this.host.acceptingSessionCreations,dispatch:(w)=>this.host.dispatchDeviceRestore(d,w,R),publishDeadline:(w)=>this.healthRecoveryDeadlines.set(m,w),clear:()=>this.clearRestoreHealth(s,a),drop:()=>{if(this.recorderTeardownRetries.get(m)?.retries===n)this.recorderTeardownRetries.delete(m)}})).then((w)=>{S=w});this.healthRecoveries.set(m,g),g.catch((w)=>{e.warn(`${a==="recording-teardown"?"Recorder teardown":"App cleanup"} recovery failed on ${d}`,w)}).finally(()=>{if(this.healthRecoveries.get(m)===g){this.healthRecoveries.delete(m),this.healthRecoveryDeadlines.delete(m),this.pruneRecorderTeardownRetries();let w=this.recorderTeardownRetries.get(m);if(S!==void 0&&w&&(w.retries!==n||w.retries.revision!==S))this.startRecorderTeardownRecovery(s,w.retries,a);else if(w&&a==="recording-teardown"&&!n.empty&&!n.recheckUsed&&this.host.acceptingSessionCreations){n.recheckUsed=!0,this.healthRecoveryDeadlines.set(m,this.host.timer.now()+et);let y=this.host.timer.setTimeout(()=>{if(this.recorderTeardownRechecks.delete(m),this.healthRecoveryDeadlines.delete(m),this.pruneRecorderTeardownRetries(),this.host.acceptingSessionCreations&&this.recorderTeardownRetries.get(m)?.retries===n&&!n.empty)this.startRecorderTeardownRecovery(s,n,a)},et);y.unref?.(),this.recorderTeardownRechecks.set(m,y)}}})}pruneRecorderTeardownRetries(){for(let[s,n]of this.recorderTeardownRetries)if(!this.restoreIncarnationIsCurrent(n)||!this.deviceHealth?.markers.get(n.deviceId,n.incarnation,n.reason)){this.recorderTeardownRetries.delete(s);let a=this.recorderTeardownRechecks.get(s);if(a!==void 0)this.host.timer.clearTimeout(a),this.recorderTeardownRechecks.delete(s),this.healthRecoveryDeadlines.delete(s)}}restoreIncarnationIsCurrent(s){return(s.restoreGeneration===void 0||(this.replacedRestoreGenerations.get(s.deviceId)??0)===s.restoreGeneration)&&(s.incarnation===void 0||this.deviceHealth?.incarnation(s.deviceId)===s.incarnation)}clearRestoreHealth(s,n){if(s.incarnation!==void 0&&this.restoreIncarnationIsCurrent(s))this.deviceHealth?.markers.clear(s.deviceId,s.incarnation,n)}abandonRestore(s,n,a,d=ou){let c=this.deviceHealth;if(s.incarnation===void 0){e.warn(`Gave up restoring state on ${s.deviceId} (${n}); no health marker could be keyed because the device has no pool incarnation`);return}if(!c||!this.restoreIncarnationIsCurrent(s))return;let p=c.markers.mark(s.deviceId,s.incarnation,n),m=`${s.deviceId}#${s.incarnation}:${n}`;if(this.healthRecoveries.has(m))return;let S=this.replacedRestoreGenerations.get(s.deviceId)??0,R=[1,2,3].map((y)=>c.backoff.delayForAttempt(y)),g=(y,b)=>R.slice(y-1).reduce((A,k,T)=>A+d*(y+T)+(T>0||b?k:0),0),w=H(void 0,async()=>{for(let y=1;y<=3;){if(this.healthRecoveryDeadlines.set(m,this.host.timer.now()+g(y,!0)),await this.host.timer.sleep(R[y-1]),!await this.waitForIdentityReplacement(s.deviceId,S)||!this.restoreIncarnationIsCurrent(s))return;if(!c.markers.get(s.deviceId,s.incarnation,n))return;if(!c.canRecover(s.deviceId)){if(!this.host.acceptingSessionCreations)return;continue}let b=Error("Device health recovery timed out"),A=this.host.dispatchDeviceRestore(s.deviceId,a,S);this.healthRecoveryDeadlines.set(m,this.host.timer.now()+g(y,!1));try{await l(A,{timer:this.host.timer,timeoutMs:d*y,label:"Device health recovery",timeoutError:()=>b}),this.clearRestoreHealth(s,n);return}catch(k){if(e.warn(`Device health recovery ${y} failed on ${s.deviceId} (${p.reason})`,k),k===b)this.healthRecoveryDeadlines.set(m,void 0);if(k===b&&await this.inFlightRestoreSucceeded(A,s)){this.clearRestoreHealth(s,n);return}}y++}});this.healthRecoveries.set(m,w),w.catch((y)=>{e.warn(`Device health recovery failed on ${s.deviceId}`,y)}).finally(()=>{if(this.healthRecoveries.get(m)===w)this.healthRecoveries.delete(m),this.healthRecoveryDeadlines.delete(m)})}async inFlightRestoreSucceeded(s,n){try{return await s,!0}catch(a){return e.warn(`Timed-out device health recovery failed late on ${n.deviceId}`,a),!1}}}class it{host;constructor(s){this.host=s}restartRecoveryActivityAt=new Map;restartRecoveryActivityCallbacks=[];async readPersistedSession(s){let n=await this.host.readSessionRow(s);if(n&&await this.host.recoveredIntents.adoptDeadOwnerTerminalReleases(n))n=await this.host.readSessionRow(s);let a=n&&this.host.recoveredIntents.withRecoveredTerminalRelease(n),d=this.restartRecoveryActivityAt.get(s);if(!a||d===void 0||!j(a))return a;return{...a,expires_at_ms:Math.max(a.expires_at_ms,d+a.session_timeout_ms)}}onRestartRecoveryActivity(s){this.restartRecoveryActivityCallbacks.push(s)}recordRestartRecoveryActivity(s){let n=Math.max(this.restartRecoveryActivityAt.get(s)??0,this.host.sessionNow());this.restartRecoveryActivityAt.set(s,n);for(let a of this.restartRecoveryActivityCallbacks)try{a(s,n)}catch(d){e.warn(`[SessionManager] Restart activity callback failed for ${s}: ${d}`)}this.host.getBarrier().track(async()=>{await this.host.deviceSessionRepository.recordRestartRecoveryActivity(s,n)}).catch((a)=>{e.warn(`[SessionManager] Failed to persist restart-recovery activity for ${s}: `+r(a))})}async isReleasedSessionInRestartRecoveryWindow(s){if(this.host.sessionSlots.hasTerminalSnapshot(s))return!1;let n=await this.readPersistedSession(s);if(!n||this.host.sessionSlots.hasTerminalSnapshot(s)||!this.isReissuablePersistedSession(n))return!1;let a=q(n);return a!==void 0&&this.host.sessionNow()<a}async expireRestartRecoveryReservation(s){let n=await this.readPersistedSession(s);if(!n||!j(n))return;let a=(m)=>this.host.daemonSessionId!==void 0&&(m.daemon_session_id??this.host.daemonSessionId)!==this.host.daemonSessionId,d=(m)=>{let S=q(m,!0);return this.host.isRowOwnedByLivePeer(m)&&this.host.sessionNow()<S?S:void 0};if(a(n))return d(n);let c=this.host.isSessionBeingRecreated(s)||this.host.activeSessionExecutionChecker(s),p=q(n,c);if(this.host.sessionNow()<p)return p;if(!c){let m=await this.terminalizeExpiredPersistedSession(n,n.daemon_session_id===this.host.daemonSessionId?this.host.daemonSessionId:void 0);if(m&&j(m)){if(a(m))return d(m);let S=q(m);if(this.host.sessionNow()<S)return S}}return}async getPersistedTerminalRelease(s){let n=await this.readPersistedSession(s);return n?this.terminalReleaseFromPersisted(s,n):void 0}isReissuablePersistedSession(s){return Boolean(s&&(!s.release_reason||_q(s.release_reason))&&JN(s,this.host.sessionNow())&&(this.host.sessionSlots.isRowClaimed(s)||this.host.isRowOwnedByLivePeer(s)||!Be(s,this.host.sessionNow())))}isRecoverablePersistedSession(s){return Boolean(s&&s.source!==_a&&(!s.release_reason||ra(s.release_reason))&&JN(s,this.host.sessionNow())&&!Be(s,this.host.sessionNow()))}isNameReissueOnlyRow(s){return Boolean(s?.release_reason&&!ra(s.release_reason)&&this.isReissuablePersistedSession(s))}async terminalizeExpiredPersistedSession(s,n){let a=this.host.sessionNow();if(!s)return s;if(Be(s,a)&&this.host.isRowOwnedByLivePeer(s))return s;if(Qy(s,a)==="restart-recovery-timeout")return this.terminalizeRestartRecoveryHandoff(s,n);if(Qy(s,a)===void 0||s.release_reason&&(ir(s.release_reason)||vm(s.release_reason).releasedBeforeHandout))return s;await this.host.deviceSessionRepository.markReleased(s.session_uuid,"expired",a,{reason:"expired",...s.stable_identity_generation===void 0?{}:{expectedRowGeneration:s.stable_identity_generation},onlyIfExpiredAtMs:this.host.sessionClockToWall(a),onlyIfOwnedByDaemon:n});let d=await this.readPersistedSession(s.session_uuid);if(this.confirmPersistedExpiry(s,d,"expired"),!this.isReissuablePersistedSession(d))this.restartRecoveryActivityAt.delete(s.session_uuid);return d}async terminalizeDeviceRestartHandoffForStop(s){let n=await this.readPersistedSession(s);if(!n||!j(n)||this.host.sessions.has(s)||this.host.isSessionBeingRecreated(s)||this.host.daemonSessionId===void 0||n.daemon_session_id!==this.host.daemonSessionId)return e.warn(`[SessionManager] Cannot terminalize stopped restart holder ${s}: row is no longer this daemon's handoff`),!1;let a=await this.terminalizeRestartRecoveryHandoff({...n},this.host.daemonSessionId,"device-killed"),d=a?.release_reason==="device-killed"&&a.stable_identity_generation===n.stable_identity_generation;if(!d)e.warn(`[SessionManager] Stopped restart holder ${s} terminal row write was not confirmed`);return d}async terminalizeRestartRecoveryHandoff(s,n,a="restart-recovery-timeout"){let d;try{d=this.host.rowWriteLivePeerDaemonSessionIds()}catch(S){return e.warn(`[SessionManager] Cannot prove ownership to expire restart recovery for ${s.session_uuid}: ${r(S)}`,S),s}let c=this.host.releaseSnapshotFromPersisted(s.session_uuid,s,a);c.releasedAtMs=this.host.sessionNow();let p=a==="device-killed"?0:ym;await this.host.persistSessionRelease(c,!1,{expectedRowGeneration:s.stable_identity_generation??0,onlyIfRecoverable:!0,onlyIfOwnedByDaemon:n??s.daemon_session_id??void 0,unlessTerminalOrOwnedByLivePeer:{livePeerDaemonSessionIds:d,reportRefusal:!0},onlyIfRestartRecoveryHandoff:{releasedAtOrBeforeMs:this.host.sessionClockToWall(c.releasedAtMs-p),recoveryWindowMs:p}});let m=await this.readPersistedSession(s.session_uuid);return this.confirmPersistedExpiry(s,m,a),m}confirmPersistedExpiry(s,n,a){if(this.host.sessionSlots.hasTerminalSnapshot(s.session_uuid)||n?.release_reason!==a||n.stable_identity_generation!==s.stable_identity_generation)return;let d=a==="expired"?this.expiredReleaseFromPersisted(s.session_uuid,n):this.terminalReleaseFromPersisted(s.session_uuid,n);if(d)this.host.sessionSlots.setTerminalSnapshot(s.session_uuid,d),this.restartRecoveryActivityAt.delete(s.session_uuid),this.host.notifySessionRelease(d,{upgradeOnly:!0})}terminalReleaseFromPersisted(s,n){if(!n.release_reason||!ir(n.release_reason))return;return this.host.releaseSnapshotFromPersisted(s,n,n.release_reason)}expiredReleaseFromPersisted(s,n){if(n.release_reason&&(ir(n.release_reason)||vm(n.release_reason).releasedBeforeHandout))return;let a=this.host.isRowOwnedByLivePeer(n)?!Xd(n.liveness_policy)&&n.expires_at_ms<=this.host.sessionNow()?"expired":void 0:Qy(n,this.host.sessionNow());if(!a)return;return{...this.host.releaseSnapshotFromPersisted(s,n,a),terminal:!0}}unadmittedSessionError(s,n,a,d){if(d==="read-only")return a;let c=n&&this.expiredReleaseFromPersisted(s,n);return c?new Xt(s,c):a}}class rt{host;constructor(s){this.host=s}async recoverPersistedSession(s,n,a,{listed:d,...c}){if(this.host.isLapsedUnownedRestartRecovery(d))d=await this.host.admitPersistedSession(s,d);let p=d&&this.host.isReissuablePersistedSession(d)?await this.claimRecoverableRow(s,d):void 0;try{return await this.host.recoverPersistedRow(s,n,a,{persisted:p?.row??d,...c})}catch(m){if(p)await this.releaseFailedRecoveryClaim(s,p);throw m}}async claimRecoverableRow(s,n){let a=this.host.daemonSessionId,d=this.host.deviceSessionRepository.claimRecoverableSession.bind(this.host.deviceSessionRepository);if(a===void 0)return;let c=await this.tryClaimRecoverableRow(s,n,d,a);if(c)return c;let p=await this.host.readPersistedSession(s);if(this.host.isLapsedUnownedRestartRecovery(p))p=await this.host.admitPersistedSession(s,p);let m=p&&this.host.terminalReleaseFromPersisted(s,p);if(m)throw this.host.sessionSlots.setTerminalSnapshot(s,m),new Xt(s,m);if(p&&this.host.isReissuablePersistedSession(p)){let S=await this.tryClaimRecoverableRow(s,p,d,a);if(S)return S}throw this.recoverableRowClaimRefusal(s,p??n)}async tryClaimRecoverableRow(s,n,a,d){let c=n.daemon_session_id??null;if(c!==null&&c!==d&&this.isLiveDaemonSession(c))throw this.recoverableRowClaimRefusal(s,n);let p=await a(s,{rowGeneration:n.stable_identity_generation??0,daemonSessionId:c},d);if(p===void 0)return;let m={...n,stable_identity_generation:p,daemon_session_id:d};return this.host.sessionSlots.markRowClaimed(m),{row:m,previousOwner:c===d?null:c}}recoverableRowClaimRefusal(s,n){let a=n.daemon_session_id??null;if(a!==null&&a!==this.host.daemonSessionId)return e.info(`[SessionManager] Not recovering session ${s}: another AutoMobile daemon (${a}) took its row first`),new Yt(n.device_id,void 0);return e.info(`[SessionManager] Not recovering session ${s}: its row changed during recovery (now ${n.status}, ${n.release_reason??"no release reason"})`),new t(`Session ${s} is no longer recoverable: its persisted row changed during recovery. Retry, or acquire a new device with getAndroid or getApple.`)}async releaseFailedRecoveryClaim(s,n){let a=this.host.deviceSessionRepository.releaseRecoverableSessionClaim.bind(this.host.deviceSessionRepository);if(this.host.sessions.has(s)||this.host.sessionSlots.hasTerminalSnapshot(s))return;try{if(await a(s,{rowGeneration:n.row.stable_identity_generation??0,daemonSessionId:n.row.daemon_session_id??null},n.previousOwner))e.info(`[SessionManager] Recovery of session ${s} failed; handed its row back to ${n.previousOwner??"no owner"} so another recovery can take it`)}catch(d){e.warn(`[SessionManager] Failed to hand back the claim on session ${s}: `+r(d),d)}}isLiveDaemonSession(s){if(!this.host.liveDaemonSessionIds)return!1;try{return this.host.liveDaemonSessionIds().has(s)}catch(n){return e.warn(`[SessionManager] Cannot list live daemons to check row owner ${s}: `+r(n),n),!1}}recoverySessionFields(s){if(!s)return{};return{persistenceMetadata:{source:s.source,autolockEnabled:s.autolock_enabled===1,mcpSessionId:s.mcp_session_id,daemonSessionId:this.host.recoveredRowOwner()},...s.release_reason===e_?{recoveredFromUncleanDaemonExit:!0}:{},...s.liveness_owner_token?{livenessOwnerToken:s.liveness_owner_token,livenessOwnershipClaims:new Set([s.liveness_owner_token]),lastOwnerHeartbeat:this.host.sessionNow()}:{}}}async assignUnseenSessionToDevicePool(s,n,a,{recoveryTarget:d,persisted:c}={}){try{await n.assignDeviceToSession(s,a,d)}catch(p){e.debug(`[SessionManager] Recovery assignment refused for ${s}: ${r(p)}`);let m=p instanceof Yt&&d?new au(s,d,"owned-by-other-daemon",{deviceId:p.deviceId,ownerPid:p.ownerPid}):p;if(!c||!Ji(m)||m.sessionUuid!==s)throw p;if(!this.host.isNameReissueOnlyRow(c))throw await this.host.terminalizePersistedRecoveryFailure(s,c,m),p;e.info(`[SessionManager] Re-issuing session ${s} on another device: its previous device ${c.device_id} cannot be reused (${m.reason})`),await n.assignDeviceToSession(s,a??c.platform)}}async recoveryTargetFromPersisted(s,n,a,d){if(!n||!this.host.isReissuablePersistedSession(n))return;let c=He(n);if(!c&&this.host.isNameReissueOnlyRow(n))return;if(!c)throw await this.host.terminalizePersistedRecoveryFailure(s,n,{terminalReleaseReason:"identity-recovery-identity-continuity-lost"}),new t(`Cannot safely recover session ${s}: its persisted device identity is unavailable. Acquire a new device with getAndroid or getApple.`);if(a&&a!==n.platform)throw new t(`Cannot safely recover session ${s}: requested platform ${a} does not match persisted platform ${n.platform}. Acquire a new device with getAndroid or getApple.`);return{platform:n.platform,stableDeviceId:c,deviceId:n.device_id,restartRecoveryDeadlineMs:q(n,d),liveness:this.host.recoveryLivenessFromPersisted(n),persistenceMetadata:{source:n.source,autolockEnabled:n.autolock_enabled===1,mcpSessionId:n.mcp_session_id,daemonSessionId:this.host.recoveredRowOwner()},...n.release_reason===e_?{recoveredFromUncleanDaemonExit:!0}:{},...n.platform==="android"?{androidEmulator:ae(n.device_id)}:{}}}recoveryLivenessFromPersisted(s){let n=$s(s.heartbeat_timeout_source),a=Us(s.liveness_policy),d=Qi(s),c=d&&{...d,heartbeatTimeoutMs:this.currentDefaultLease(d.heartbeatTimeoutMs,d.heartbeatTimeoutSource),sessionTimeoutMs:this.currentDefaultIdleWindow(d.sessionTimeoutMs)};if(a===ni)return{sessionTimeoutMs:Nt(s.session_timeout_ms),heartbeatTimeoutMs:this.currentDefaultLease(s.heartbeat_timeout_ms,n),heartbeatTimeoutSource:n,hasReceivedHeartbeat:s.has_received_heartbeat===1,livenessPolicy:a};let p=this.currentDefaultIdleWindow(s.session_timeout_ms);if(a==="cli-idle"){let m=s.heartbeat_timeout_ms===Yi?Math.min(kp(),oR):s.heartbeat_timeout_ms;return{sessionTimeoutMs:Math.max(p,m),heartbeatTimeoutMs:m,heartbeatTimeoutSource:n,hasReceivedHeartbeat:s.has_received_heartbeat===1,livenessPolicy:a,...c?{preCliLiveness:c}:{}}}return{sessionTimeoutMs:p,heartbeatTimeoutMs:this.currentDefaultLease(s.heartbeat_timeout_ms,n),heartbeatTimeoutSource:n,hasReceivedHeartbeat:s.has_received_heartbeat===1,livenessPolicy:a,...c?{preCliLiveness:c}:{}}}currentDefaultLease(s,n){return n==="default"?cc():s}currentDefaultIdleWindow(s){return s===Xi?this.host.SESSION_TIMEOUT_MS:s}}class ot{host;constructor(s){this.host=s}rehydrationFollowUpTimer=null;rehydrationSkipReason(s){if(this.host.sessions.has(s))return"already-live";if(this.host.sessionSlots.hasAssignment(s))return"already-pending";return}registerRehydrationRecovery(s,n,a,d){let c=this.host.newSharedAssignment(s),p=this.host.recoverPersistedSession(s,n,a.platform,{listed:a,initialOwnership:"awaiting-owner",shared:c}).finally(()=>{if(c.recoveryWait.resolve(void 0),this.host.sessionSlots.getAssignment(s)===p)this.host.sessionSlots.deleteAssignment(s),this.host.sessionSlots.deleteShared(s)});return this.host.sessionSlots.setAssignment(s,p),this.host.waitForSharedAssignment(s,p,void 0,d)}async rehydratePersistedSessions(s,n={}){let a=n.deadlineMs??JI,d=Math.max(1,n.concurrency??A4),c=this.host.sessionNow()+a,p={rehydrated:[],terminalized:[],skipped:[],timedOut:!1};await this.host.applyRecoveredTerminalReleaseIntents(c);let m=(await this.host.listRecoverableSessionsBeforeDeadline(c,p)).map((b)=>this.host.recoveredIntents.withRecoveredTerminalRelease(b));await this.reserveDevicesForRehydration(m,s,c);let S=[],R=0,g=!1,w=async()=>{while(!g&&R<m.length){let b=R++,A=await this.host.rehydratePersistedRow(m[b],s,n.signal);if(this.releaseRehydrationReservation(m[b].session_uuid,s),g)this.logLateRehydrationOutcome(m[b].session_uuid,A);else S[b]=A}};if(this.host.sessionNow()<c&&m.length>0){let b=Symbol("startup-deadline"),A=Promise.all(Array.from({length:Math.min(d,m.length)},w));g=await l(A,{timer:this.host.timer,timeoutMs:Math.max(0,c-this.host.sessionNow()),label:"Session rehydration",timeoutError:()=>b}).catch((T)=>{if(T!==b)throw T;return b})===b}else g=m.length>0;let y=m.slice(R);R=m.length;for(let b of y)this.releaseRehydrationReservation(b.session_uuid,s);for(let[b,A]of m.entries())this.recordRehydrationOutcome(p,A,S[b]);if(g&&!p.timedOut){p.timedOut=!0;let b=p.skipped.filter(({reason:A})=>A==="startup-deadline").length;e.warn(`[SessionManager] Startup rehydration deadline reached; skipped ${b} rows due to startup-deadline`)}return this.scheduleRehydrationFollowUp(y,s,d),e.info(`[SessionManager] Rehydration: ${p.rehydrated.length} rehydrated, ${p.terminalized.length} terminalized, ${p.skipped.length} skipped`),p}async reserveDevicesForRehydration(s,n,a){let d=n.reserveDevicesForRehydration?.bind(n),c=s.flatMap((m)=>{let S=He(m);if(S===void 0||!this.host.isRecoverablePersistedSession(m)||this.rehydrationSkipReason(m.session_uuid)!==void 0)return[];return[{sessionId:m.session_uuid,target:{platform:m.platform,stableDeviceId:S,deviceId:m.device_id,...m.platform==="android"?{androidEmulator:ae(m.device_id)}:{}}}]});if(!d||c.length===0||this.host.sessionNow()>=a)return;let p=d(c);try{await l(p,{timer:this.host.timer,timeoutMs:Math.max(0,a-this.host.sessionNow()),label:"Session rehydration device reservation"})}catch(m){e.warn(`[SessionManager] Could not reserve devices for rehydration: ${r(m)}`,m);let S=()=>{for(let R of c)n.releaseRehydrationReservation?.(R.sessionId)};S(),p.then(S,()=>{return})}}releaseRehydrationReservation(s,n){let a=()=>n.releaseRehydrationReservation?.(s),d=this.host.sessionSlots.getAssignment(s);if(d)d.then(a,a);else a()}recordRehydrationOutcome(s,n,a){let d=n.session_uuid;if(a?.kind==="rehydrated")s.rehydrated.push(d);else if(a?.kind==="terminalized")s.terminalized.push({sessionUuid:d,reason:a.reason});else if(a)s.skipped.push({sessionUuid:d,reason:a.reason});else if(!this.host.isRecoverablePersistedSession(n))s.skipped.push({sessionUuid:d,reason:"not-recoverable"});else if(this.host.sessions.has(d))s.skipped.push({sessionUuid:d,reason:"already-live"});else s.skipped.push({sessionUuid:d,reason:"startup-deadline"})}logLateRehydrationOutcome(s,n){if(e.info(`[SessionManager] Rehydration of ${s} finished after the startup deadline: ${n.kind}${n.kind==="rehydrated"?"":` (${n.reason})`}`),n.kind!=="rehydrated"||!this.host.lateRehydrationListener)return;this.host.lateRehydrationListener([s]).catch((a)=>{e.warn(`[SessionManager] Late rehydration hook failed for ${s}: ${r(a)}`,a)})}scheduleRehydrationFollowUp(s,n,a){let d=s.filter((c)=>this.host.isRecoverablePersistedSession(c)&&!this.host.sessions.has(c.session_uuid));if(d.length===0)return;if(this.rehydrationFollowUpTimer)this.host.timer.clearTimeout(this.rehydrationFollowUpTimer);this.rehydrationFollowUpTimer=this.host.timer.setTimeout(()=>{this.rehydrationFollowUpTimer=null,this.runRehydrationFollowUp(d,n,a)},0)}async runRehydrationFollowUp(s,n,a){e.info(`[SessionManager] Follow-up rehydration of ${s.length} deadline-skipped rows`);let d=0,c=async()=>{while(d<s.length){let p=s[d++];this.logLateRehydrationOutcome(p.session_uuid,await this.host.rehydratePersistedRow(p,n))}};await Promise.all(Array.from({length:Math.min(a,s.length)},c))}}class at{host;constructor(s){this.host=s}async rebindSession(s,n,a,d={}){let c=this.host.sessions.get(s);if(this.host.assertTerminalRebindAdmission(s,d.terminalReleaseReservationOwner),!c)return await this.host.createSession(s,n,a,{stableDeviceId:d.stableDeviceId,signal:d.signal});if(c.assignedDevice===n&&!d.force)return this.host.notifyDeviceOwnershipChange(n),c;let p=this.host.sessionSlots.getRebind(s);if(p)return await p.promise,await this.host.rebindSession(s,n,a,d);let m=this.host.sessionSlots.getReleaseOp(s);if(m?.session===c)throw await m.promise,Error(`Cannot rebind released session ${s}.`);this.host.flushDeferredRebindCleanups({sessionId:s});let S=this.host.persistAndPublishRebind(c,n,a,{stableDeviceId:d.stableDeviceId??c.stableDeviceId,deferCleanup:d.deferCleanup,recovery:d.recovery===!0}),R={session:c,promise:S};this.host.sessionSlots.setRebind(s,R),this.host.slotShadowProbe.check(s,"rebind-start");try{return await S}catch(g){if(!(g instanceof U))throw g;return await this.host.rejectRefusedRebind(c,R,g)}finally{if(this.host.sessionSlots.getRebind(s)===R)this.host.sessionSlots.deleteRebind(s),this.host.slotShadowProbe.check(s,"rebind-end")}}async rebindSessionForTerminalReleaseRecovery(s,n,a){let d=this.host.sessionSlots.getTerminalReservation(s.sessionId);if(d?.session!==s)throw Error(`Session ${s.sessionId} has no matching terminal release reservation.`);return await this.host.rebindSession(s.sessionId,n,a,{force:!0,recovery:!0,terminalReleaseReservationOwner:d.owner})}flushDeferredRebindCleanups(s={}){for(let[n,a]of this.host.sessionSlots.deferredCleanups)if((s.sessionId===void 0||s.sessionId===a.sessionId)&&(s.deviceId===void 0||s.deviceId===a.deviceId))n.commit()}deferRebindOverrides(s,n,a){let d=Promise.withResolvers(),c="deferred",p=!1,m=su+wr,S=this.host.deviceHealth?.incarnation(s.assignedDevice),R=()=>{let I=this.host.getSessionForDevice(s.assignedDevice);return(I===null||I===s.sessionId)&&(S===void 0||this.host.deviceHealth?.incarnation(s.assignedDevice)===S)},g=`rebind:${s.sessionId}:${s.assignedDevice}`,w=()=>{this.host.timer.clearTimeout(k),this.host.stateRestore.stopIosAppNetworkLease(g),this.host.sessionSlots.deleteDeferredCleanup(A)},y=()=>{if(p)return;p=!0,w(),this.host.timer.clearTimeout(T),d.resolve()},b=(I=!1)=>{if(p||c!=="deferred"&&!(I&&c==="cancelled"))return;if(c="started",w(),!R()){e.warn(`Not restoring rebound device ${s.assignedDevice}: runtime changed or reassigned`),y();return}let O=Promise.resolve().then(()=>Xe(async()=>{let D=await this.restoreRebindOverrides(s,R);this.host.trackPendingTeardownCleanup(s.assignedDevice,D),await Promise.allSettled(D)})).catch((D)=>{e.warn(`Deferred rebind cleanup failed on ${s.assignedDevice}: ${r(D)}`,D)});this.host.registerPendingDeviceCleanup(s.assignedDevice,O),y()},A={settled:d.promise,get retained(){return c==="cancelled"},commit:()=>b(),cancel:()=>{if(c==="started"||c==="rebound")return!1;if(c==="deferred")c="cancelled",w();return!0},finish:(I)=>{if(p)return;if(c==="cancelled")if(I==="rebound")c="rebound",y();else b(!0);else if(c==="deferred")A.commit()},resumeRetainedState:()=>{if(c==="cancelled")n()}},k=this.host.timer.setTimeout(A.commit,su);k.unref?.();let T=this.host.timer.setTimeout(()=>{if(c==="cancelled")e.warn(`Deferred rebind cleanup deadline on ${s.assignedDevice} after ${m}ms: undo did not finish in time`),b(!0);else b()},m);if(T.unref?.(),this.host.sessionSlots.setDeferredCleanup(A,{sessionId:s.sessionId,deviceId:s.assignedDevice}),a)this.host.stateRestore.startIosAppNetworkLease(g,a,()=>c==="deferred"&&this.host.getSessionForDevice(s.assignedDevice)===null);return this.host.registerPendingDeviceCleanup(s.assignedDevice,d.promise,m),A}async restoreRebindOverrides(s,n=()=>!0){let a=s.assignedDevice,d=[...this.host.stateRestore.hasPendingIme(a)?[()=>this.host.stateRestore.restorePendingImeForRebind(a,n)]:[],()=>this.host.stateRestore.restoreKeepScreenAwakeBestEffort(s),()=>this.host.stateRestore.restoreBiometricEnrollmentBestEffort(s),async()=>{let p=this.host.stateRestore.networkConditionRestoreTarget(s);if(!p)return{pending:null};return{pending:(await this.host.stateRestore.runUnderTeardownShield(async()=>[{...await this.host.stateRestore.restoreNetworkConditionBestEffort(s),abandon:()=>this.host.stateRestore.abandonCappedRestore(p,"network-condition")}]))[0]??null}},()=>this.host.stateRestore.getPendingClockRestoration(s,null),()=>this.host.stateRestore.getPendingRotationRestoration(s,null),()=>this.host.stateRestore.getPendingScreenReaderRestoration(s,null)],c=[];for(let p of d){if(!n())break;let m=await p();if(m.pending)c.push(m.pending)}return c}createReboundSession(s,n,a,{stableDeviceId:d,recovery:c=!1}={}){return{...s,mutationRecorder:void 0,assignedDevice:n,...c&&n!==s.assignedDevice?{deviceGeneration:(s.deviceGeneration??0)+1,previousDeviceId:s.assignedDevice}:{},stableDeviceId:d,platform:a,cacheData:s.cacheData.deviceLabels===void 0?{}:{deviceLabels:s.cacheData.deviceLabels}}}}function xr(s,n){return ir(s)&&!(n.supersededReasons??[]).includes(s)}class lt{host;constructor(s){this.host=s}async reassertSupersededLiveRow(s){if(!this.host.isCurrentSession(s))return!1;if(this.isRebindUnderWay(s))return this.oweSupersededRowReassert(s),!1;let n=s.assignedDevice,a=this.host.superseded.expectReassert(s.sessionId);try{await this.host.persistSession(s,s,this.supersededRowRewriteOptions())}catch(d){if(e.warn(`[SessionManager] Failed to re-persist live session ${s.sessionId} after an overlapping row write: ${r(d)}`,d),this.host.sessions.get(s.sessionId)===s)this.oweSupersededRowReassert(s);return!1}finally{a()}if(this.host.isCurrentSession(s)&&(this.isRebindUnderWay(s)||s.assignedDevice!==n))return this.oweSupersededRowReassert(s),!1;return this.host.superseded.settle(s),await this.restoreReleasedRowAfterReassert(s),this.host.isCurrentSession(s)}supersededRowRewriteOptions(s){return{rewriteOverSupersededRelease:{livePeerDaemonSessionIds:this.rowWriteLivePeerDaemonSessionIds(),expectedRowGeneration:s}}}rowWriteLivePeerDaemonSessionIds(){return Array.from(this.host.liveDaemonSessionIds?.()??[]).filter((s)=>s!==this.host.daemonSessionId)}guardedRowRewriteOptions(s){return{rewriteOverSupersededRelease:{expectedRowGeneration:s,livePeerDaemonSessionIds:[],ownDaemonSessionId:this.host.daemonSessionId}}}async retryRefusedRowWrite(s,n,a,{write:d,writingReleaseReason:c,...p}){let m=(S)=>{let R=(w)=>({row:w,guard:p.resolveRowGeneration?{...a,expectedRowGeneration:p.resolveRowGeneration(w)}:a}),g=p.resolveRowGeneration&&this.host.awaitInFlightOwnRowWrites(p.incarnation,S,a.expectedRowGeneration);return g?g.then(()=>this.host.readSessionRow(n)).then(R):R(S)};for(let S=0;S<2;S++){let{row:R,guard:g}=await m(await this.host.readSessionRow(n));if(this.rowWritePermanentlyRefused(R,g,c,p.unlessDaemonShutdown))throw s;if(R?.daemon_session_id&&R.daemon_session_id!==this.host.daemonSessionId)return await d({...g,ownDaemonSessionId:void 0,livePeerDaemonSessionIds:this.rowWriteLivePeerDaemonSessionIds()});if(S===1)break;e.debug(`[SessionManager] Retrying writable row after statement miss for ${n}`);try{return await d(g)}catch(w){if(!(w instanceof U)&&!(w instanceof _))throw w;e.debug(`[SessionManager] Reclassifying row write failure for ${n}`,w),s=w}}throw new t(`Session ${n} row stayed writable after two statement misses; retry its write.`)}rowWritePermanentlyRefused(s,n,a,d){if(!s)return a!==void 0;if(n.expectedRowGeneration!==void 0&&s.stable_identity_generation!==n.expectedRowGeneration)return!0;if(n.unlessReleased&&s.status==="released")return!0;let c=s.release_reason;if(!c)return!1;if(a!==void 0&&_4(c,a))return!0;if(d&&c==="daemon-shutdown")return!0;return xr(c,n)}isRebindUnderWay(s){return this.host.sessionSlots.getRebind(s.sessionId)?.session===s}async restoreReleasedRowAfterReassert(s){let n=s.sessionId,a=this.host.sessionSlots.getTerminalSnapshot(n);if(!a){if(this.host.sessions.get(n)!==s)this.host.trackReleaseDrainWrite(this.restoreNonTerminalRowAfterReassert(s));return}if(this.host.sessions.get(n)===s&&this.host.volatileTerminalReleaseIntents.get(n)!==a.releaseReason)return;try{await this.host.persistSessionRelease(a)}catch(d){e.warn(`[SessionManager] Failed to re-persist the terminal release of session ${n} after a live-row rewrite: ${r(d)}`,d),this.host.trackReleaseDrainWrite(this.retryTerminalRowAfterRelease(n));return}}async retryTerminalRowAfterRelease(s){await this.waitOutReleaseOf(s);let n=this.host.sessionSlots.getTerminalSnapshot(s);if(!n)return;if(this.host.isSessionBeingRecreated(s)){e.warn(`[SessionManager] The terminal release of session ${s} is not persisted and is not retried: the session is still held behind its fence`);return}this.host.scheduleTerminalReleaseRetry(n)}async retryNonTerminalRowAfterRelease(s){await this.waitOutReleaseOf(s.sessionId),this.host.scheduleTerminalReleaseRetry(s)}async restoreNonTerminalRowAfterReassert(s){let n=s.sessionId;await this.waitOutReleaseOf(n);let a=this.releaseThatEnded(s);if(!a||a.terminal)return;let d=this.host.persistedRowGenerations.get(s);if(d===void 0&&this.host.isSessionBeingRecreated(n))return;let c={...a};this.host.captureReleaseRowGeneration(c,d??this.host.releaseRowGenerations.get(a));try{await this.host.persistSessionRelease(c)}catch(p){e.warn(`[SessionManager] Failed to re-persist the ${a.releaseReason} release of session ${n} after a live-row rewrite: ${r(p)}`,p)}}releaseThatEnded(s){return this.host.finalizedSessionReleases.get(s)?.finalizedSnapshot??this.host.sessionSlots.getForcedNonTerminal(s)}async waitOutReleaseOf(s){let n=this.host.sessionSlots.getReleaseOp(s);if(!n||n.forced)return;try{await l(n.promise,{timer:this.host.timer,signal:n.forcedAbort?.signal,label:"Session release"})}catch(a){e.debug(`[SessionManager] Release of session ${s} failed or was forced while a row write waited on it: ${r(a)}`)}}async waitOutRecreationOf(s){for(;;){let n=this.host.sessionSlots.getAssignment(s)??this.host.sessionSlots.getCreation(s)?.promise;if(!n)return;try{await n}catch(a){e.debug(`[SessionManager] Issue of session ${s} failed while a row write waited on it: ${r(a)}`)}if(await Promise.resolve(),n===(this.host.sessionSlots.getAssignment(s)??this.host.sessionSlots.getCreation(s)?.promise))return}}async waitOutRebindOf(s){let n=this.host.sessionSlots.getRebind(s.sessionId);if(n?.session!==s)return;try{await n.promise}catch(a){e.debug(`[SessionManager] Rebind of session ${s.sessionId} failed while a row write waited on it: ${r(a)}`)}}oweSupersededRowReassert(s){this.host.superseded.owe(s,this.host.supersededRowReassertRetries)}async retryOwedSupersededRowReassert(s){let{session:n}=s,a=n.sessionId,d=()=>this.host.superseded.owed(a)===s;if(!d())return!1;if(!this.host.isCurrentSession(n))return this.host.superseded.drop(s),!1;let c;try{c=await this.host.readPersistedSession(a)}catch(p){return e.warn(`[SessionManager] Failed to read the row of live session ${a} before re-persisting it: ${r(p)}`,p),this.host.superseded.defer(s),!1}if(!d())return!1;if(!this.host.isCurrentSession(n))return this.host.superseded.drop(s),!1;if(this.supersededRowReassertMustStop(s,c))return this.host.superseded.drop(s),!1;if(this.host.sessionSlots.isReleasing(n)||this.isRebindUnderWay(n))return this.host.superseded.defer(s),!1;return await this.reassertSupersededLiveRow(n)}supersededRowReassertMustStop(s,n){if(!n)return!1;if(this.host.isRowOwnedByLivePeer(n))return e.warn(`[SessionManager] Dropping owed rewrite of session ${s.session.sessionId}: live peer ${n.daemon_session_id} owns its row`),!0;return this.host.terminalReleaseFromPersisted(s.session.sessionId,n)!==void 0}async reassertOwedLiveRowForActivity(s){let n=this.host.superseded.owed(s.sessionId);if(n?.session!==s||n.handle!==void 0)return!1;return await this.retryOwedSupersededRowReassert(n)}async retryOwedSupersededRowReassertDuringDrain(s){await this.waitOutRebindOf(s.session),await this.waitOutReleaseOf(s.session.sessionId),await this.retryOwedSupersededRowReassert(s)}}class Je extends _{}class dt{host;constructor(s){this.host=s}releaseRowGenerations=new WeakMap;releaseRowSessions=new WeakMap;captureReleaseRowGeneration(s,n){if(n!==void 0)this.releaseRowGenerations.set(s,n)}releaseWritePrecondition(s){let n=this.releaseRowGenerations.get(s);return{...n===void 0?{}:{expectedRowGeneration:n},...!s.terminal&&s.releaseReason!=="daemon-shutdown"?{unlessDaemonShutdown:!0}:{},unlessTerminalOrOwnedByLivePeer:{livePeerDaemonSessionIds:[],ownDaemonSessionId:this.host.daemonSessionId,reportRefusal:!0,supersededReasons:s.terminal?[...this.host.superseded.predecessors(s)]:[]}}}resolveTerminalReleaseWrite(s,n,a,d){let c=n.unlessTerminalOrOwnedByLivePeer;return this.host.retryRefusedRowWrite(d,s.sessionId,{...c,expectedRowGeneration:n.expectedRowGeneration},{write:(p)=>a({...n,expectedRowGeneration:p.expectedRowGeneration,unlessTerminalOrOwnedByLivePeer:p}),writingReleaseReason:s.releaseReason,unlessDaemonShutdown:n.unlessDaemonShutdown,incarnation:this.releaseRowSessions.get(s)?.deref(),resolveRowGeneration:(p)=>{let m=this.releaseRowSessions.get(s)?.deref(),S=this.host.sessions.get(s.sessionId);return m!==void 0&&(!S||S===m)&&!this.host.sessionSlots.hasCreation(s.sessionId)&&!this.host.sessionSlots.hasAssignment(s.sessionId)&&p?.stable_identity_generation!==void 0&&this.host.persistedRowGenerations.get(m)===p.stable_identity_generation?p.stable_identity_generation:n.expectedRowGeneration}})}releaseRowFallback(s,n,a){let d=n.unlessTerminalOrOwnedByLivePeer,c;return(p)=>{if(!(p instanceof _)||p instanceof Je)throw p;if(s.terminal)return c??=this.resolveTerminalReleaseWrite(s,n,a,p);if(d.ownDaemonSessionId===void 0)throw p;return c??=this.host.retryRefusedRowWrite(p,s.sessionId,{...d,expectedRowGeneration:n.expectedRowGeneration},{write:(m)=>a({...n,unlessTerminalOrOwnedByLivePeer:m}),writingReleaseReason:s.releaseReason,unlessDaemonShutdown:n.unlessDaemonShutdown})}}issueReleaseRow(s,n){if(this.host.sessionSlots.getTerminalSnapshot(s.sessionId)!==s&&!this.host.rowWriter.canIssueRelease(s))return Promise.reject(new Je(s.sessionId));return this.host.deviceSessionRepository.markReleased(s.sessionId,ov(s.releaseReason),s.releasedAtMs,{reason:s.releaseReason,...n})}handleReleaseWriteFailure(s,n,a){if(s instanceof _)return e.debug(`[SessionManager] Release row refused for ${n.sessionId}`),this.confirmReleaseWrite(n),!0;if(e.warn(`[SessionManager] Failed to mark session released (${n.releaseReason}): ${s}`),!n.terminal&&!this.host.sessions.has(n.sessionId)){if(this.recordPendingNonTerminalRelease(n),!this.shouldSurfaceReleasePersistenceFailure(n,a))this.trackReleaseDrainWrite(this.host.retryNonTerminalRowAfterRelease(n))}if(this.shouldSurfaceReleasePersistenceFailure(n,a))throw u(s,`Failed to persist ${n.terminal?"terminal":"non-terminal"} release for session ${n.sessionId}`);return!1}trackLateReleaseWrite(s,n){let a=s.then(()=>{this.confirmReleaseWrite(n)},(d)=>{if(d instanceof _){e.debug(`[SessionManager] Late release row refused for ${n.sessionId}`),this.confirmReleaseWrite(n);return}if(e.warn(`[SessionManager] Late session release write failed: ${r(d)}`),n.terminal)this.trackReleaseDrainWrite(this.host.retryTerminalRowAfterRelease(n.sessionId))});this.trackReleaseDrainWrite(a)}liftTerminalFence(s,n,a=!1,d){this.host.forcedStuckRelease.liftTerminalFence(s,n,a,d)}confirmReleaseWrite(s){if(s.terminal)this.liftTerminalFence(s.sessionId,s,!0);else if(this.host.rowWriter.pendingNonTerminalReleases().get(s.sessionId)===s)this.host.rowWriter.deletePendingNonTerminalRelease(s.sessionId);this.host.restartReleasePersistence.get(s)?.resolve()}dropReleaseRetry(s){if(this.host.rowWriter.cancelRetry(s),s.terminal)this.liftTerminalFence(s.sessionId,s,!0)}scheduleTerminalReleaseRetry(s){this.host.rowWriter.scheduleRetry(s,{isStillOwed:()=>this.host.isTerminalReleaseRetryCurrent(s),drop:()=>this.host.dropReleaseRetry(s),run:(n)=>this.host.retryTerminalReleaseWrite(n)})}trackReleaseDrainWrite(s){this.host.rowWriter.trackDrainWrite(s)}isTerminalReleaseRetryCurrent(s){if(!s.terminal)return this.host.rowWriter.pendingNonTerminalReleases().get(s.sessionId)===s;let n=this.host.sessionSlots.getTerminalSnapshot(s.sessionId);return n!==void 0&&n.releaseReason===s.releaseReason&&!this.isSessionBeingRecreated(s.sessionId)}async retryTerminalReleaseWrite(s){let{snapshot:n}=s;if(!await this.isReleaseRetryDue(s))return;try{let a=await this.prepareRetriedReleaseWrite(s);if(!a)return;let d=(w)=>this.issueReleaseRow(n,w),c=this.releaseRowFallback(n,a,d),p=()=>this.host.timer.monotonicNow?.()??this.host.timer.now(),m=p(),S=!1,R=d(a),g={timer:this.host.timer,timeoutMs:Os,unref:!0,label:"Session release retry",timeoutError:()=>new F(n.sessionId,n.releaseReason,Os),onTimeout:()=>{S=!0,R.catch(c).catch((w)=>{e.debug(`[SessionManager] Late release retry failed for ${n.sessionId}`,w)})}};try{await l(R,g)}catch(w){if(R=c(w),S)throw g.timeoutError();await l(R,{...g,timeoutMs:Math.max(0,Os-(p()-m)),onTimeout:void 0})}}catch(a){if(a instanceof _){if(await this.wasRetriedReleaseWriteSkipped(s)){this.scheduleTerminalReleaseRetry(n);return}e.debug(`[SessionManager] Retried release row refused for ${n.sessionId}`),this.confirmReleaseWrite(n),this.host.dropReleaseRetry(n);return}if(e.warn(`[SessionManager] Retrying the ${n.releaseReason} release write of session ${n.sessionId} failed: ${r(a)}`),s.isCurrent())this.scheduleTerminalReleaseRetry(n);return}if(await this.wasRetriedReleaseWriteSkipped(s)){this.scheduleTerminalReleaseRetry(n);return}if(this.confirmReleaseWrite(n),s.isCurrent())this.host.rowWriter.cancelRetry(n)}async wasRetriedReleaseWriteSkipped(s){let{snapshot:n}=s;if(n.terminal||!s.isCurrent())return!1;try{let a=await this.host.readSessionRow(n.sessionId);return a!==void 0&&a.release_reason!==n.releaseReason&&s.isCurrent()&&this.host.isRecoverablePersistedSession(a)&&!this.host.isRowOwnedByLivePeer(a)&&!this.isSessionBeingRecreated(n.sessionId)}catch(a){return e.warn(`[SessionManager] Failed to read the row of session ${n.sessionId} after retrying its ${n.releaseReason} release: ${r(a)}`,a),!1}}isReleaseRetryStillOwed(s){let{snapshot:n}=s;if(!s.isCurrent())return!1;if(!this.host.isTerminalReleaseRetryCurrent(n))return this.host.dropReleaseRetry(n),!1;return!0}async isReleaseRetryDue(s){let{snapshot:n}=s;if(!this.isReleaseRetryStillOwed(s))return!1;if(n.terminal||!this.isSessionBeingRecreated(n.sessionId))return!0;if(!s.shutdownAttempted)return this.scheduleTerminalReleaseRetry(n),!1;return await this.host.waitOutRecreationOf(n.sessionId),this.isReleaseRetryStillOwed(s)}async prepareRetriedReleaseWrite(s){let{snapshot:n}=s,a=await this.retriedReleaseWritePrecondition(n);return s.isCurrent()?a:void 0}async retriedReleaseWritePrecondition(s){let n=this.releaseWritePrecondition(s);if(n.expectedRowGeneration===void 0)return n;let a=await this.host.readSessionRow(s.sessionId);if(!a||a.stable_identity_generation===void 0||!this.host.isRecoverablePersistedSession(a)||this.host.isRowOwnedByLivePeer(a)||this.isSessionBeingRecreated(s.sessionId))return n;return{...n,expectedRowGeneration:a.stable_identity_generation}}retryPendingTerminalReleasesNow(){return this.host.rowWriter.retryPendingNow()}isSessionBeingRecreated(s){return Te(Re(this.host.getLegacyLifecycleView(),s))}shouldSurfaceReleasePersistenceFailure(s,n){return s.terminal||n||bo(s.releaseReason)}recordPendingNonTerminalRelease(s){this.host.rowWriter.recordPendingNonTerminalRelease(s)}fenceTerminalRelease(s){return this.host.sessionSlots.setTerminalSnapshot(s.sessionId,s),this.host.restartRecoveryActivityAt.delete(s.sessionId),this.host.recordTerminalReleaseIntent(s,!0)}async persistTerminalReleaseIfNeeded(s){if(!s.terminal)return;this.host.sessionSlots.setTerminalSnapshot(s.sessionId,s),this.host.restartRecoveryActivityAt.delete(s.sessionId),await this.host.persistSessionRelease(s)}}class ct{host;constructor(s){this.host=s}issuedActivityWrites=new WeakMap;persistedRowGenerations=new WeakMap;inFlightOwnRowWrites=new WeakMap;activityRowRePersists=new nt;async persistSession(s,n,a,d){let c=()=>{d?.(),d=void 0},p=(S)=>{let R=this.host.rowWriter.upsertLive({sessionUuid:s.sessionId,deviceId:s.assignedDevice,stableDeviceId:s.stableDeviceId,platform:s.platform,source:s.persistenceMetadata?.source??"session-manager",autolockEnabled:s.persistenceMetadata?.autolockEnabled,mcpSessionId:s.persistenceMetadata?.mcpSessionId,daemonSessionId:this.host.daemonSessionId??s.persistenceMetadata?.daemonSessionId,createdAtMs:s.createdAt,lastUsedAtMs:s.lastUsedAt,expiresAtMs:s.expiresAt,sessionTimeoutMs:s.sessionTimeoutMs,heartbeatTimeoutMs:s.heartbeatTimeoutMs,heartbeatTimeoutSource:s.heartbeatTimeoutSource,hasReceivedHeartbeat:s.hasReceivedHeartbeat,livenessPolicy:s.livenessPolicy,preCliHeartbeatTimeoutMs:s.preCliLiveness?.heartbeatTimeoutMs,preCliHeartbeatTimeoutSource:s.preCliLiveness?.heartbeatTimeoutSource,preCliSessionTimeoutMs:s.preCliLiveness?.sessionTimeoutMs},this.host.sessionNow(),S),g=this.inFlightOwnRowWrites.get(n)??new Set;this.inFlightOwnRowWrites.set(n,g),g.add(R);let w=()=>{if(g.delete(R),g.size===0)this.inFlightOwnRowWrites.delete(n);c()};return R.then((y)=>{this.recordPersistedRowGeneration(n,y),w()},w),R},m=a?.rewriteOverSupersededRelease;try{await p(a)}catch(S){if(!(S instanceof U)||m?.ownDaemonSessionId===void 0)throw S;await this.host.retryRefusedRowWrite(S,s.sessionId,m,{write:(R)=>p({...a,rewriteOverSupersededRelease:R})})}await this.host.rowWriter.replaceLiveOwnership(s.sessionId,s.livenessOwnerToken??null)}awaitInFlightOwnRowWrites(s,n,a){if(!s||n?.stable_identity_generation===a||this.persistedRowGenerations.get(s)===n?.stable_identity_generation)return;let d=this.inFlightOwnRowWrites.get(s);if(!d?.size)return;return Promise.allSettled(d).then((c)=>{for(let p of c)if(p.status==="rejected")e.debug("[SessionManager] Own row write rejected during terminal release",p.reason)})}recordPersistedRowGeneration(s,n){if(typeof n==="number")this.persistedRowGenerations.set(s,n)}async recordSessionActivity(s){let n=qs(s),a={key:Gs(n)};this.issuedActivityWrites.set(s,a);try{await this.persistSessionActivity(s,n)}catch(d){if(this.issuedActivityWrites.get(s)===a)this.issuedActivityWrites.delete(s);if(d instanceof Xt)throw d;throw new Ie(s.sessionId,d)}}async persistSessionActivity(s,n){try{await this.host.rowWriter.recordLiveActivity(s.sessionId,n);return}catch(d){if(!(d instanceof W))throw d}if(!this.host.isAdmittedForAutomation(s)){e.debug(`[SessionManager] Activity for released session ${s.sessionId} skipped`);return}e.warn(`[SessionManager] Session ${s.sessionId} is live but its row is not active; re-persisting it`);let a=this.rePersistSessionActivity(s);this.host.trackReleaseDrainWrite(a.then(()=>{},()=>{e.debug(`[SessionManager] Activity repair settled for ${s.sessionId}`)})),await a}async rePersistSessionActivity(s){try{let n=s.assignedDevice;if(await this.activityRowRePersists.run(s,()=>this.persistSession(s,s,{unlessTerminal:!0,rewriteOverSupersededRelease:{...this.host.guardedRowRewriteOptions(this.persistedRowGenerations.get(s)).rewriteOverSupersededRelease,unlessReleased:!0}},()=>this.activityRowRePersists.delete(s))),this.host.isCurrentSession(s)&&(this.host.isRebindUnderWay(s)||s.assignedDevice!==n))this.host.oweSupersededRowReassert(s);else if(this.host.sessions.get(s.sessionId)!==s&&!this.host.sessionSlots.hasTerminalSnapshot(s.sessionId))this.host.trackReleaseDrainWrite(this.host.restoreNonTerminalRowAfterReassert(s))}catch(n){if(!(n instanceof oe)&&!(n instanceof U))throw n;await this.handleActivityRowRefusal(s,n)}}async handleActivityRowRefusal(s,n){if(!this.host.isCurrentSession(s)){let d=this.host.sessionSlots.getTerminalSnapshot(s.sessionId);if(d)throw new Xt(s.sessionId,d);e.debug(`[SessionManager] Superseded activity row refused for ${s.sessionId}`);return}if(await this.host.reassertOwedLiveRowForActivity(s))return;let a=await this.endSessionTerminallyReleasedInRow(s);throw a instanceof Xt?a:n}async endSessionTerminallyReleasedInRow(s){let n=s.sessionId;if(this.host.superseded.isReassertPending(n))return new W(n);let a=await this.host.getPersistedTerminalRelease(n);if(!a||this.host.superseded.isReassertPending(n))return new W(n);let d=a.releaseReason;if(this.host.isAdmittedForAutomation(s)){if(e.warn(`[SessionManager] Session ${n} is live but its row was terminally released (${d}); releasing it`),Zi(d))this.host.cancelExecutionsCutByRelease(n,d);await this.host.releaseSessionForReason(n,d,{allowExpired:!0,expiryOrigin:"lazy-expiry"})}return new Xt(n,this.host.sessionSlots.getTerminalSnapshot(n)??a)}hasUnissuedActivity(s){return this.issuedActivityWrites.get(s)?.key!==Gs(qs(s))}}function ut(s){return Math.max(s.lastUsedAt,s.idleStallForgivenAt??Number.NEGATIVE_INFINITY)}function mh(s){if(s.livenessPolicy==="cli-idle")return ut(s)+s.heartbeatTimeoutMs;return s.expiresAt}class ht{host;constructor(s){this.host=s}expireIfDue(s,n,a,d=!0){if(this.host.stallProbe?.(),this.host.sessionSlots.hasTerminalSnapshot(s))return null;let c=this.host.sessions.get(s);if(!c)return null;let p=a&&this.executionOnSessionClock(a);if(n){if(this.isLateExecutionWhileEarlierWorkIsActive(c,p,"timely-control"))return c;if(this.isLateExecutionWhileEarlierWorkIsActive(c,p,"recovery"))throw new ge(s,c.assignedDevice)}if(this.shouldExpireSession(c,n,p)){if(!d)return null;return this.releaseExpiredSessionLazily(c,a?.executionId),null}return c}releaseExpiredSessionLazily(s,n){if(this.host.sessionSlots.isReleasing(s))return;let a=s.sessionId;e.info(`Session ${a} has expired, found by lookup, releasing`);let d=this.expiredSessionReleaseReason(s);this.cancelExecutionsOverriddenByExpiry(s,d,n);let c=this.host.releaseSession(a,d,{allowExpired:!0,expiryOrigin:"lazy-expiry"});this.host.getBarrier().trackExisting(c).catch((p)=>e.warn(`[SessionManager] Failed to release expired session ${a}: ${p}`))}releaseSessionPastIdleDeadline(s,n){let a=this.host.sessions.get(s);if(a&&!this.host.sessionSlots.hasTerminalSnapshot(s)&&this.isSessionExpired(a))this.releaseExpiredSessionLazily(a,n)}observeSessionForRead(s,n){if(this.host.deviceHeldForLateRead(s,n)!==void 0)return null;return this.host.unlessBaseEnded(this.expireIfDue(s,!0,n,!1))}deviceHeldForLateRead(s,n){let a=this.host.sessions.get(s);if(!a||this.host.sessionSlots.hasTerminalSnapshot(s))return;let d=n&&this.executionOnSessionClock(n);return this.isLateExecutionWhileEarlierWorkIsActive(a,d)?a.assignedDevice:void 0}executionOnSessionClock(s){return{...s,sessionClockStartTime:s.sessionClockStartTime??this.host.wallToSessionClock(s.startTime)}}shouldExpireSession(s,n,a){return n?this.isSessionExpiredForNewExecution(s,a):this.isSessionExpired(s)}ownershipSessionUuid(s){return KB(s,{getDeviceLabels:(n)=>this.host.peekSession(n)?.cacheData.deviceLabels})}livenessOwnerView(s){let n=s.livenessOwnerToken,a=n===void 0||s.livenessPolicy==="cli-idle"?"none":G(is(s,this.host.sessionNow(),Y(s)&&(this.host.livenessOwnerCallInFlightReader?.(n)??!1))).phase;return{ownerToken:n,hold:a}}getOwnerLeaseHold(s){let n=this.host.sessions.get(s),a=n?this.host.liveness.livenessBaseSession(n):void 0,d=n&&a&&Vi(this.livenessOwnerView(n),this.livenessOwnerView(a))==="base"?a:n;if(!d||d.livenessPolicy==="cli-idle")return;return Ft(is(d,this.host.sessionNow(),Y(d)&&(this.host.livenessOwnerCallInFlightReader?.(d.livenessOwnerToken)??!1)))}getSessionLeaseState(s){let n=this.host.sessions.get(s);if(!n||n.livenessPolicy==="cli-idle")return;return G(ce(n,this.host.sessionNow()))}isSessionSuspect(s){return ru(s.livenessPolicy)&&G(ce(s,this.host.sessionNow())).phase==="suspect"}assertSessionNotSuspect(s,n){if(n!=="read-only"&&this.isSessionSuspect(s)){let{remainingMs:a}=G(ce(s,this.host.sessionNow()));throw new Z(s.sessionId,a)}}isOwnerLeaseLapsed(s){return de(s)&&tv(s)>0&&bq(this.host.sessionNow(),this.host.judgedLeaseHeartbeat(s),s.heartbeatTimeoutMs,tv(s))}ownerLeaseAwaitsReap(s){let n=this.host.peekSession(s);return n!==null&&this.isOwnerLeaseLapsed(n)&&!this.host.activeSessionExecutionChecker(s,{excludeReads:!0})}judgedLeaseHeartbeat(s){let n=ev(s),a=this.host.ownershipSessionUuid(s.sessionId),d=a===s.sessionId?this.host.getBaseSessionOfDerivedLabel(s.sessionId):a,c=this.host.liveness.livenessBaseSession(s)??(d===void 0?void 0:this.host.getReleasingSession(d));if(!c||!de(c)||c.livenessOwnerToken===void 0||c.livenessOwnerToken!==s.livenessOwnerToken)return n;let p=this.host.sessionSlots.getReleaseOp(c.sessionId);return Math.max(n,ev(c),p?.session===c?p.ownerHeartbeatDuringRelease??Number.NEGATIVE_INFINITY:Number.NEGATIVE_INFINITY)}creditOwnerHeartbeatDuringRelease(s,n){let a=this.host.getReleasingSession(s),d=this.host.sessionSlots.getReleaseOp(s);if(!a||d?.session!==a||d.forced||d.judgeSuspectOwnerAtCommit!==!0||!E4(d.reason.value)||n.length===0||a.livenessOwnerToken!==n)return;let c=this.releaseOwnerLeaseSnapshot(a,d);if(c&&G(c).phase!=="lapsed")d.ownerHeartbeatDuringRelease=c.now}releaseOwnerLeaseSnapshot(s,n){if(!de(s)||tv(s)===0)return;let a=ce(s,this.host.sessionNow());return a.lastHeartbeat=Math.max(this.host.judgedLeaseHeartbeat(s),n?.ownerHeartbeatDuringRelease??Number.NEGATIVE_INFINITY),a}judgeOwnerLeaseForRelease(s,n,a,d){if(a==="commit"&&d?.judgeSuspectOwnerAtCommit!==!0||!E4(n.value))return!1;let c=this.releaseOwnerLeaseSnapshot(s,d);if(!c)return!1;let{phase:p}=G(c);if(p==="lapsed")this.host.upgradeReleaseReason(n,"heartbeat-timeout");return p==="suspect"}async refuseControlCallOnLapsedOwnerLease(s,n,a,d){if(n==="read-only"||!this.isOwnerLeaseLapsed(s))return;let c=a?.executionId??d,p={excludeReads:!0,...c===void 0?{}:{excludeExecutionId:c}};if(this.host.activeSessionExecutionChecker(s.sessionId,p))throw new Z(s.sessionId,0);e.info(`Session ${s.sessionId} lost its owner's heartbeat lease before this call; releasing`),this.host.cancelExecutionsCutByRelease(s.sessionId,"heartbeat-timeout",c),await this.host.releaseSession(s.sessionId,"heartbeat-timeout",{allowExpired:!0,expiryOrigin:"lazy-expiry"});let m=this.host.sessionSlots.getTerminalSnapshot(s.sessionId)??await this.host.getPersistedTerminalRelease(s.sessionId);if(m)throw new Xt(s.sessionId,m);throw new Z(s.sessionId,0)}async refuseLabelCallOnLapsedBaseLease(s,n,a,d){if(n==="read-only"||s.persistenceMetadata?.source!==_a)return;let c=this.host.getBaseSessionOfDerivedLabel(s.sessionId),p=c===void 0?void 0:this.host.sessions.get(c);if(!p||!this.isOwnerLeaseLapsed(p))return;try{await this.refuseControlCallOnLapsedOwnerLease(p,n,a,d)}catch(m){if(m instanceof Xt)throw new Xt(s.sessionId,this.host.terminalReleaseAsOfNow(s,m.release.releaseReason));throw m}}forgiveMintBoundClaimLease(s,n,a,d){if(Y(s)&&(d===void 0||KI(s.livenessOwnerBoundAt,s.heartbeatTimeoutMs,d)))s.livenessOwnerBoundAt=GI(s.livenessOwnerBoundAt,n,a)}isSessionExpired(s){if(Xd(s.livenessPolicy))return!1;if(s.livenessPolicy==="cli-idle")return!1;if(this.host.sessionNow()<=mh(s))return!1;return!Wt({hasActiveExecutions:this.host.activeSessionExecutionChecker(s.sessionId,{excludeReads:!0}),now:this.host.sessionNow(),...this.idleExecutionVetoBoundInput(s)})}idleExecutionVetoBoundInput(s){return{vetoedSince:mh(s),latestDeadlineMs:this.host.sessionExecutionDeadlineLookup(s.sessionId,{excludeReads:!0})}}getIdleReleaseExecutionVeto(s){if(!this.host.sessions.get(s))return;let a={excludeReads:!0};if(!this.host.activeSessionExecutionChecker(s,a))return;return{latestDeadlineMs:this.host.sessionExecutionDeadlineLookup(s,a)}}cancelExecutionsOverriddenByExpiry(s,n,a){return this.host.cancelExecutionsCutByRelease(s.sessionId,n,a)}cancelExecutionsCutByRelease(s,n,a){let d=a===void 0?{}:{excludeExecutionId:a};if(!this.host.activeSessionExecutionChecker(s,d))return!1;let c=this.host.sessions.get(s)??this.host.getReleasingSession(s);return this.host.expiryReleaseExecutionCanceller(s,new lc(s,n,c?me(c):void 0),d,c?.assignedDevice),!0}expiredSessionReleaseReason(s){if(tv(s)>0&&G(ce(s,this.host.sessionNow())).phase==="lapsed")return"heartbeat-timeout";return s.livenessPolicy==="cli-idle"?"cli-idle-timeout":l0}isSessionExpiredForNewExecution(s,n){if(Xd(s.livenessPolicy))return!1;if(n===void 0)return this.isSessionExpired(s);let a=mh(s);if(this.host.sessionNow()<=a)return!1;return n.sessionClockStartTime>a}isLateExecutionWhileEarlierWorkIsActive(s,n,a="any"){if(Xd(s.livenessPolicy))return!1;let d=mh(s);return n!==void 0&&this.host.sessionNow()>d&&n.sessionClockStartTime>d&&this.host.activeSessionExecutionChecker(s.sessionId,{...a==="timely-control"?{sessionClockStartedAtOrBefore:d,liveOnSessionClock:{at:this.host.sessionNow(),undatedForMs:rv}}:{},...a==="recovery"?{recoveryOnly:!0}:{},excludeExecutionId:n.executionId,excludeReads:!0})}}class pt{host;constructor(s){this.host=s}updateSessionCache(s,n){let a=this.host.findSession(s);if(!a){e.warn(`Cannot update cache for session ${s}: not found`);return}if(a.cacheData={...a.cacheData,...n},"deviceLabels"in n)_r.emit("tools");e.debug(`Updated cache for session ${s}`)}setLastHierarchy(s,n){this.host.updateSessionCache(s,{lastHierarchy:n,lastObserveTime:this.host.sessionNow()})}setLastRenderedObservation(s,n,a){this.host.updateSessionCache(s,{lastRenderedObservation:n,lastRenderedDisplayGeneration:n.display?.generation,lastRenderedDisplayKey:n.display?.key,...a===void 0?{}:{lastRenderedDisplayRevision:a}})}getLastActionMetadata(s,n){let a=this.host.findSession(s)?.cacheData.lastActionMetadata;return a?.deviceId===n?a.blocks:void 0}setLastActionMetadata(s,n,a){this.host.updateSessionCache(s,{lastActionMetadata:{deviceId:n,blocks:a}})}getLastRenderedObservation(s){return this.host.findSession(s)?.cacheData.lastRenderedObservation}setLastRenderedDisplayRevision(s,n,a,d){this.host.updateSessionCache(s,{lastRenderedDisplayRevision:n,lastRenderedDisplayGeneration:d,...a===void 0?{}:{lastRenderedDisplayKey:a}})}getLastRenderedDisplayGeneration(s){return this.host.findSession(s)?.cacheData.lastRenderedDisplayGeneration}setDisplayPin(s,n){if(this.host.updateSessionCache(s,{displayPin:n??void 0}),n===null){let a=this.host.findSession(s);if(a)delete a.cacheData.displayPin}}getDisplayPin(s){return this.host.findSession(s)?.cacheData.displayPin}getLastRenderedDisplayKey(s){return this.host.findSession(s)?.cacheData.lastRenderedDisplayKey}getLastRenderedDisplayRevision(s){return this.host.findSession(s)?.cacheData.lastRenderedDisplayRevision}getKeepScreenAwake(s){return this.host.findSession(s)?.cacheData.keepScreenAwake}setDeviceReadiness(s,n){let a=this.host.getDeviceReadiness(s);if(a!==void 0&&Jq(a)>=Jq(n))return;this.host.updateSessionCache(s,{deviceReadiness:n})}getDeviceReadiness(s){return this.host.findSession(s)?.cacheData.deviceReadiness}invalidateAutomationReadiness(s,n){if(!this.host.findSession(s)){e.debug(`[SessionManager] Cannot invalidate readiness for unknown session ${s}`);return}e.warn(`[SessionManager] Invalidating automation readiness for ${s}: ${n}`),this.host.updateSessionCache(s,{deviceReadiness:"booted"})}invalidateAutomationReadinessForDevice(s,n){let a=this.host.getSessionForDevice(s);if(a)this.host.invalidateAutomationReadiness(a,n)}resetDeviceReadinessForDevice(s){let n=this.host.getSessionForDevice(s);if(!n)return;this.host.updateSessionCache(n,{deviceReadiness:"booted"})}setClock(s,n){s.cacheData.clock??=n}getClock(s){return this.host.findSession(s)?.cacheData.clock}getKeepAwakeRestoreReport(s){return this.host.stateRestore.getKeepAwakeRestoreReport(s)}trackClockSessionSetup(s,n){return this.host.stateRestore.trackClockSessionSetup(s,n)}runClockMutationExclusive(s,n){return this.host.stateRestore.runClockMutationExclusive(s,n)}setRotation(s,n){s.cacheData.rotation??=n}getRotation(s){return this.host.findSession(s)?.cacheData.rotation}trackRotationSessionSetup(s,n){return this.host.stateRestore.trackRotationSessionSetup(s,n)}runRotationMutationExclusive(s,n){return this.host.stateRestore.runRotationMutationExclusive(s,n)}trackScreenReaderSessionSetup(s,n){return this.host.stateRestore.trackScreenReaderSessionSetup(s,n)}setScreenReader(s,n){s.cacheData.screenReader??=n}getScreenReader(s){return this.host.findSession(s)?.cacheData.screenReader}runScreenReaderMutationExclusive(s,n){return this.host.stateRestore.runScreenReaderMutationExclusive(s,n)}setBiometricEnrollment(s,n){if(this.host.getBiometricEnrollment(s))return;this.host.updateSessionCache(s,{biometricEnrollment:n})}getBiometricEnrollment(s){return this.host.findSession(s)?.cacheData.biometricEnrollment}setNetworkCondition(s,n){if(this.host.getNetworkCondition(s))return;this.host.updateSessionCache(s,{networkCondition:n})}bumpNetworkConditionGeneration(s){return this.host.stateRestore.bumpNetworkConditionGeneration(s)}runNetworkConditionMutationExclusive(s,n){return this.host.stateRestore.runNetworkConditionMutationExclusive(s,n)}getNetworkCondition(s){return this.host.findSession(s)?.cacheData.networkCondition}getDeviceLabels(s){return this.host.peekSession(s)?.cacheData.deviceLabels}getSessionCache(s){return this.host.findSession(s)?.cacheData??null}clearSessionCache(s,n){let a=this.host.findSession(s);if(!a)return;if(n)delete a.cacheData[n];else a.cacheData=a.cacheData.displayPin===void 0?{}:{displayPin:a.cacheData.displayPin};if(!n||n==="deviceLabels")_r.emit("tools");e.debug(`Cleared cache for session ${s}${n?` (key: ${n})`:" (all)"}`)}}class mt{host;constructor(s){this.host=s}creditControlCallFailedOnRestartRecovery(s,n){if(n==="acquire"&&!this.host.sessions.has(s)&&this.host.restartRecoveryActivityAt.has(s))this.host.recordRestartRecoveryActivity(s)}resolveSessionAcquisitionOptions(s){return typeof s==="string"?{access:s}:{...s,access:s.access??"acquire"}}async startOrJoinUnseenAssignment(s,n,a,d){try{return await this.joinOrStartUnseenAssignment(s,n,a,d)}catch(c){throw this.creditControlCallFailedOnRestartRecovery(s,d.access),c}}async joinOrStartUnseenAssignment(s,n,a,{requireIssuedSession:d,access:c,requestDeadlineMs:p,signal:m}){let S=this.host.sessionSlots.getAssignment(s);if(S){if(c==="acquire"&&this.host.restartRecoveryActivityAt.has(s))this.host.recordRestartRecoveryActivity(s);let y=this.host.sessionSlots.getShared(s);if(y?.controller.signal.aborted)return await this.waitForAbortedAssignment(S,y,p,m),await this.host.getOrCreateSession(s,n,a,{requireIssuedSession:d,access:c,requestDeadlineMs:p,signal:m});let b=await this.waitForSharedAssignment(s,S,p,m);if(c==="acquire"&&b.ownership==="awaiting-owner")b.ownership="owned",b.awaitingOwnerSince=void 0;return b}let R=this.host.sessionSlots.getCreation(s);if(R)return await R.promise;let g=this.newSharedAssignment(s),w=this.createUnseenSession(s,n,a,{requireIssuedSession:d,shared:g}).finally(()=>{if(g.recoveryWait.resolve(void 0),this.host.sessionSlots.getAssignment(s)===w)this.host.sessionSlots.deleteAssignment(s),this.host.sessionSlots.deleteShared(s),this.host.slotShadowProbe.check(s,"assignment-end")});return this.host.sessionSlots.setAssignment(s,w),this.host.slotShadowProbe.check(s,"assignment-start"),await this.waitForSharedAssignment(s,w,p,m)}newSharedAssignment(s){let n={controller:new AbortController,waiters:0,recoveryWait:Promise.withResolvers()};return this.host.sessionSlots.setShared(s,n),n}async waitForAbortedAssignment(s,n,a,d){let c=s.then(()=>{},(m)=>{e.debug("[SessionManager] Aborted session assignment settled",m)}),p=await n.recoveryWait.promise;await l(c,{timer:this.host.timer,timeoutMs:a!==void 0&&Number.isFinite(a)?Math.max(0,this.host.wallToSessionClock(a)-(p?.responseMarginMs??0)-this.host.sessionNow()):void 0,signal:d,label:"Session restart recovery",timeoutError:p?.timeoutError})}async waitForSharedAssignment(s,n,a,d){let c=this.host.sessionSlots.getShared(s);if(!c)return await n;c.waiters++;let p=!0,m=()=>{if(!p)return;if(p=!1,c.waiters--,c.waiters===0)c.controller.abort(new t("Session recovery has no remaining callers"))};try{if((a===void 0||!Number.isFinite(a))&&!d)return await n;let S=await l([c.recoveryWait.promise,n.then(()=>{return})],{timer:this.host.timer,label:"Session recovery wait configuration"});if(!S)return await n;let R=a!==void 0&&Number.isFinite(a)?this.host.wallToSessionClock(a)-S.responseMarginMs:void 0;return await l(n,{timer:this.host.timer,timeoutMs:R!==void 0&&R<(S.restartDeadlineMs??1/0)?Math.max(0,R-this.host.sessionNow()):void 0,signal:d,label:"Session restart recovery",timeoutError:S.timeoutError,onTimeout:m})}finally{m()}}async admitIssuedSessionForAutomation(s,n,a={}){let d;try{if(a.access==="read-only"){let m=this.host.observeSessionForRead(s,n);if(m)return m;if(this.host.sessions.has(s))return}return await this.host.getOrCreateSession(s,void 0,void 0,{...a,execution:n})}catch(m){if(!(m instanceof iv))throw m;d=m}let c=await this.host.readPersistedSession(s),p=c&&this.host.terminalReleaseFromPersisted(s,c);if(p)throw this.host.sessionSlots.setTerminalSnapshot(s,p),new Xt(s,p);if(c&&this.host.isReissuablePersistedSession(c))return;throw this.host.unadmittedSessionError(s,c,d,a.access)}isLapsedUnownedRestartRecovery(s){return Boolean(s&&Qy(s,this.host.sessionNow())==="restart-recovery-timeout"&&!this.host.isRowOwnedByLivePeer(s))}async admitPersistedSession(s,n){n=await this.host.terminalizeExpiredPersistedSession(n);let a=n&&this.host.terminalReleaseFromPersisted(s,n);if(a)throw this.host.sessionSlots.setTerminalSnapshot(s,a),new Xt(s,a);if(!this.host.isReissuablePersistedSession(n))throw this.host.unadmittedSessionError(s,n,new iv(`Session ${s} is not an active daemon session (not found). Acquire a device with getAndroid or getApple before using its sessionUuid.`));return n}async createUnseenSession(s,n,a,{requireIssuedSession:d,shared:c}){let p=await this.host.readPersistedSession(s);await this.host.refusePlanLabelSessionOutsideItsRun(s,p);let m=p?this.host.terminalReleaseFromPersisted(s,p):void 0;if(m)throw this.host.sessionSlots.setTerminalSnapshot(s,m),new Xt(s,m);let S=n&&this.isLapsedUnownedRestartRecovery(p);if((d||S)&&!this.host.isReissuablePersistedSession(p))p=await this.admitPersistedSession(s,p);if(!n)throw new iv(`Session ${s} is not an active daemon session (not found). Acquire a device with getAndroid or getApple before using its sessionUuid.`);if(p&&j(p))this.host.recordRestartRecoveryActivity(s);return await this.host.recoverPersistedSession(s,n,a,{listed:p,initialOwnership:"owned",shared:c})}}function Sn(s,n,a){let d=s.forcedStuckRelease.inFlightReleaseStillOwning(n);if(d)return{kind:"forced-in-flight",release:d};let c=s.sessionSlots.getTerminalSnapshot(n);if(c&&ir(a)){let g=s.sessionSlots.getTerminalReasonState(n);return{kind:"terminal-fenced",snapshot:c,reasonState:g}}let p=s.rowWriter.pendingNonTerminalReleases().get(n);if(p)return{kind:"row-pending",snapshot:p};let m=s.sessionSlots.getAssignment(n),S=s.sessionSlots.getCreation(n),R=m??S?.promise;return R?{kind:"pending-work",pendingSession:R}:{kind:"persisted-only"}}function Rn(s,n,a,d){let c=s.sessions.get(n);if(c===a&&c.assignedDevice===d)return"release";if(c)return"decline";if(s.sessionSlots.hasAssignment(n)||s.sessionSlots.hasCreation(n))return"decline";let p=s.sessionSlots.getReleaseOp(n);if(p)return p.session===a&&a.assignedDevice===d?"release":"decline";return"finalized"}function Mr(s){let n={...s};return delete n.expectedOwner,n}class St{host;constructor(s){this.host=s}releaseSession(s,n="explicit-release",a={}){if(a.expectedOwner){let{expectedOwner:d,...c}=a;return this.releaseIfOwned(s,d,n,c)}return this.releaseSessionForReason(s,n,a)}async releaseSessionForReason(s,n,a={}){let{allowExpired:d=!1,commitFence:c,...p}=a,m=Mr(p),S=()=>this.releaseSessionAttempt(s,n,{allowExpired:d,commitFence:c},m);if(t_(n)){let R=this.host.recoveryExpiryReleaseHandler?.release(s,n,S,m);if(R)return await R}return await S()}async releaseSessionAttempt(s,n,{allowExpired:a,commitFence:d},c={}){let p=a||this.host.sessionSlots.hasTerminalSnapshot(s)?this.host.sessions.get(s)??null:this.host.expireIfDue(s,!1);if(!p)return await this.releaseUnpublishedSession(s,n,a);let m=this.host.sessionSlots.getReleaseOp(s);if(m?.session===p)return this.host.upgradeReleaseReason(m.reason,n),this.host.markIdentityReplacedRelease(m,c,d),await m.promise;let S=this.host.releaseDeviceHold?.(s);this.host.sessionSlots.markReleasing(p),this.host.slotShadowProbe.check(s,"release-start");let R=this.host.sessionSlots.getRebind(s),g=this.host.createReleaseReasonState(s,n),w=this.host.judgeOwnerLeaseForRelease(p,g,"start"),y={session:p,options:{...c},commitFenced:d!==void 0,promise:Promise.resolve(null),reason:g,judgeSuspectOwnerAtCommit:w,startedAtMs:this.host.sessionNow(),stuckDeadlineMs:r0(p.cacheData),expiryOrigin:c.expiryOrigin,forcedAbort:new AbortController},b=()=>(this.host.flushDeferredRebindCleanups({sessionId:s}),y.forced?this.host.finishReleaseForcedBeforeStart(p):this.host.releaseSessionInternal({sessionId:s,session:p,reason:g,shouldCommit:d,options:y.options,operation:y}));try{return y.promise=this.startReleaseWithDeviceHold(y,S,R,b),this.host.sessionSlots.setReleaseOp(s,y),this.host.sessionSlots.addActiveRelease(y),await y.promise}finally{if(this.host.finishIdentityReplacedRelease(y),this.host.sessionSlots.deleteActiveRelease(y),this.host.sessionSlots.getReleaseOp(s)===y)this.host.sessionSlots.deleteReleaseOp(s),this.host.slotShadowProbe.check(s,"release-end")}}startReleaseWithDeviceHold(s,n,a,d){if(n&&"skipDeviceWrites"in n)s.options.deviceIdentityReplaced=!0;if(this.host.markIdentityReplacedRelease(s),n&&"settled"in n)return this.startReleaseAwaitingOwnership(s,n,a,d);if(a?.session===s.session)return s.stage="awaiting-rebind",a.promise.then(d,d);return d()}startReleaseAwaitingOwnership(s,n,a,d){let{session:c}=s,p=c.sessionId;s.stage="awaiting-ownership",s.teardownStartsByMs=this.host.sessionNow()+n.capMs;let m=(S)=>{if(s.teardownStartsByMs=this.host.sessionNow(),S!=="teardown")s.options.deviceIdentityReplaced=!0,this.host.markIdentityReplacedRelease(s)};return n.settled.then(m,(S)=>{e.warn(`[SessionManager] Release ownership hold failed for ${p}`,S),m("skip-device-writes")}).then(()=>{if(a?.session===c)return s.stage="awaiting-rebind",a.promise.then(d,d);return d()})}async releaseSessionUnlessSuperseded(s,n,a={}){let{commitFence:d,...c}=a,p=!1,m=d===void 0?void 0:()=>{if(p||d()===!1)return p=!0,!1;return!0},S=await this.host.releaseSession(s,n,{...c,commitFence:m});return p?{superseded:!0}:{superseded:!1,deviceId:S}}async releaseIfOwned(s,{session:n,deviceId:a},d="explicit-release",c={}){let p=Rn(this.host,s,n,a);switch(p){case"release":return await this.host.releaseSession(s,d,c);case"decline":return null;case"finalized":return await this.releaseFinalizedSessionIfOwned(s,n,a,d);default:return p}}async releaseFinalizedSessionIfOwned(s,n,a,d){let c=this.host.finalizedSessionReleases.get(n);if(c?.finalizedSnapshot?.sessionId===s&&c.finalizedSnapshot.deviceId===a&&ir(d))return await this.host.releaseFinalizedSession(c,d);return null}async releaseUnpublishedSession(s,n,a){let d=Sn(this.host,s,n);switch(d.kind){case"forced-in-flight":{let{release:c}=d;if(c.reason.finalizedSnapshot&&ir(n))return await this.host.releaseFinalizedSession(c.reason,n);return this.host.upgradeReleaseReason(c.reason,n),await c.promise}case"terminal-fenced":{let{snapshot:c,reasonState:p}=d;if(p)return await this.host.releaseFinalizedSession(p,n);return await this.host.persistSessionRelease(c),c.deviceId}case"row-pending":return await this.host.persistSessionRelease(d.snapshot,!0)?d.snapshot.deviceId:null;case"pending-work":return await this.releasePendingSessionWork(s,n,a,d.pendingSession);case"persisted-only":return await this.releasePersistedRestartRecovery(s,n);default:return d}}async releasePersistedRestartRecovery(s,n){if(ir(n)||n==="superseded"){let a=await this.host.readPersistedSession(s),d=a&&q(a);if(a&&this.host.isReissuablePersistedSession(a)&&d!==void 0&&this.host.sessionNow()<d){let c=this.host.terminalReleaseFromPersisted(s,{...a,release_reason:n==="superseded"?"identity-recovery-superseded":n,released_at_ms:this.host.sessionNow()});return await this.host.persistTerminalReleaseIfNeeded(c),this.host.notifySessionRelease(c,{upgradeOnly:!0}),c.deviceId}}if(n==="explicit-release"){let a=await this.releaseUnrecoveredReissuableRow(s);if(a!==void 0)return a}return e.warn(`Cannot release session ${s}: not found`),null}async releaseUnrecoveredReissuableRow(s){for(let n=0;n<2;n++){if(this.host.sessions.has(s))break;if(this.host.isSessionBeingRecreated(s))return await this.host.releaseSession(s,"explicit-release")??void 0;let a=await this.tryReleaseUnrecoveredReissuableRow(s);if(a!=="row-changed")return a}return}async tryReleaseUnrecoveredReissuableRow(s){let n=await this.host.readPersistedSession(s);if(!n?.release_reason||!this.host.isReissuablePersistedSession(n))return;if(this.isRowOwnedByLivePeer(n)){e.info(`[SessionManager] Not releasing session ${s}: another AutoMobile daemon (${n.daemon_session_id}) owns its row`);return}return await this.host.deviceSessionRepository.markReleased(s,ov("explicit-release"),this.host.sessionNow(),{reason:"explicit-release",...n.stable_identity_generation===void 0?{}:{expectedRowGeneration:n.stable_identity_generation}}),await this.fenceExplicitlyReleasedRow(s)??"row-changed"}isRowOwnedByLivePeer(s){let n=s.daemon_session_id??null;return n!==null&&n!==this.host.daemonSessionId&&this.host.isLiveDaemonSession(n)}async fenceExplicitlyReleasedRow(s){let n=await this.host.readPersistedSession(s),a=n&&this.host.terminalReleaseFromPersisted(s,n);if(a?.releaseReason!=="explicit-release"){e.info(`[SessionManager] Session ${s} was not released: its row changed first (now ${n?.status??"missing"}, ${n?.release_reason??"no release reason"})`);return}return this.host.sessionSlots.setTerminalSnapshot(s,a),this.host.restartRecoveryActivityAt.delete(s),this.host.notifySessionRelease(a,{upgradeOnly:!0}),e.info(`[SessionManager] Released unrecovered session ${s} (explicit-release)`),a.deviceId}async releasePendingSessionWork(s,n,a,d){let c=this.host.sessionSlots.getReleaseRequest(s);if(c)return this.host.upgradeReleaseReason(c.reason,n),await c.promise;let p={value:n},m={promise:this.releaseAfterPendingSessionWork(s,p,a,d),reason:p};this.host.sessionSlots.setReleaseRequest(s,m);try{return await m.promise}finally{if(this.host.sessionSlots.getReleaseRequest(s)===m)this.host.sessionSlots.deleteReleaseRequest(s)}}async releaseAfterPendingSessionWork(s,n,a,d){try{return await l(d,{timer:this.host.timer,timeoutMs:su,unref:!0,label:"Release of a session still being created"}),await this.releaseSessionForReason(s,n.value,{allowExpired:a})}catch(c){return e.warn(`Session ${s} assignment failed before release: ${c}`),null}}}class ft{host;constructor(s){this.host=s}openPlanLabelMints(s,n){return this.host.planLabels.openPlanLabelMints(s,n)}creatorSourceForCreation(s,n){return this.host.planLabels.creatorSource(s,n,_a)}liftPlanLabelFenceForMint(s){if(!this.host.planLabels.isMintableAndNotLive(s))return;this.host.planLabels.clearEndedBase(s),this.host.liftTerminalFence(s,void 0,!1,()=>{this.host.slotShadowProbe.check(s,"plan-label-fence-lifted"),this.host.sessionSlots.deleteTerminalReasonState(s)})}async refusePlanLabelSessionOutsideItsRun(s,n){if(n?.source!==_a)return;if((!n.release_reason||ra(n.release_reason))&&this.host.planLabels.isRunning(s))return;let d=Se(n)===void 0?await Ue(s,n,(c)=>this.host.readPersistedSession(c)):void 0;throw new Xt(s,{...this.host.releaseSnapshotFromPersisted(s,n,n.release_reason??i0),...ne(d),terminal:!0})}getBaseSessionOfDerivedLabel(s){return this.host.planLabels.getBaseSessionOfDerivedLabel(s)}liveBaseOfDerivedId(s){return this.host.planLabels.liveBaseOfDerivedId(s,(n)=>Boolean(this.host.peekSession(n)))}isLiveSessionOfSamePlan(s,n){return this.host.peekSession(s)!==null&&this.host.ownershipSessionUuid(s)===this.host.ownershipSessionUuid(n)||this.endedWithPlanOf(s,n)}endedWithPlanOf(s,n){let a=this.host.sessions.get(s),d=a&&this.host.endedBaseOfLabel(a);if(!d)return!1;let c=this.host.sessions.get(n);return n===d.baseSessionId||c!==void 0&&this.host.endedBaseOfLabel(c)?.baseSessionId===d.baseSessionId}takeDerivedLabelSessions(s,n){return this.host.planLabels.takeDerivedLabelSessions(s,n,ir,this.host.sessionSlots.getTerminalSnapshot(s)?.cliIdleTimeoutMs)}}class gt{host;constructor(s){this.host=s}retiredCreationRows=new WeakSet;async withinCreateDeadline(s,n,a,d){return await l(a,{timer:this.host.timer,timeoutMs:su,unref:!0,label:"Session creation",timeoutError:()=>new Sk(s,n,su),onTimeout:()=>{e.warn(`[SessionManager] Creating session ${s} did not finish within ${su}ms (reason=${n0}); refusing it so the device and the assignment mutex are freed`),d?.()}})}async persistCreatedSession(s,n){try{await this.host.persistSession(s,s,n&&{claimedRow:n})}catch(a){if(!(a instanceof re))throw a;let d=await this.host.readPersistedSession(s.sessionId),c=d&&this.host.terminalReleaseFromPersisted(s.sessionId,d);if(c)throw this.host.sessionSlots.setTerminalSnapshot(s.sessionId,c),new Xt(s.sessionId,c);let p=d?.daemon_session_id??null;if(p!==null&&p!==this.host.daemonSessionId)throw e.info(`[SessionManager] Not recovering session ${s.sessionId}: another AutoMobile daemon (${p}) took its row during the recovery`),new Yt(s.assignedDevice,void 0);throw a}}async persistAndPublishSession(s,n,a,d){try{return await this.publishSessionCreation(s,n,a,d)}catch(c){throw await this.rollBackFailedCreationRow(s,a),c}}async publishSessionCreation(s,n,a,d){let c=this.host.planLabels.isMinting(s.sessionId)?void 0:await this.host.getPersistedTerminalRelease(s.sessionId);if(c)throw this.host.sessionSlots.setTerminalSnapshot(s.sessionId,c),new Xt(s.sessionId,c);this.assertCreationNotAbandoned(s,n),await this.host.rejectCreationAfterShutdownFence(s,!1,a,d),await this.persistCreatedSession(s,a),await this.retireCreationIfAbandoned(s,n),await this.host.rejectCreationAfterShutdownFence(s,!0,a,d),this.host.assertTerminalReleaseAdmission(s.sessionId,s);let p=this.host.sessionSlots.getTerminalSnapshot(s.sessionId);if(p)throw await this.host.persistSessionRelease(p),new Xt(s.sessionId,p);this.host.invalidateFinalizedSessionIdentity(s.sessionId),this.host.rowWriter.deletePendingNonTerminalRelease(s.sessionId);let m=this.host.observerSessions?.list?.().find((S)=>S.sessionId===s.sessionId)?.clientName;if(m!==void 0&&s.clientName===void 0)s.clientName=m;if(this.host.observerSessions?.release(s.sessionId,"promotion"),s.persistenceMetadata?.source===_a)this.host.planLabels.markRunning(s.sessionId);return this.host.sessions.set(s.sessionId,s),this.host.rowWriter.noteLive(s.sessionId),this.host.slotShadowProbe.check(s.sessionId,"published"),this.host.deviceSessionMap.set(s.assignedDevice,s.sessionId),this.host.cancelSessionlessUseOnAcquisition(s.assignedDevice,s.sessionId),this.host.notifyDeviceOwnershipChange(s.assignedDevice),this.host.notifySessionCreated(s),e.info(`Created session ${s.sessionId} with device ${s.assignedDevice}`),s}async rollBackFailedCreationRow(s,n){let a=this.host.persistedRowGenerations.get(s);if(a===void 0||this.host.sessions.get(s.sessionId)===s||this.retiredCreationRows.has(s)||this.host.sessionSlots.hasTerminalSnapshot(s.sessionId))return;this.retiredCreationRows.add(s);let d=this.host.creationRowRollbackSnapshot(s,n?.releaseReason??"allocation-rollback",n?.releasedAtMs);this.host.captureReleaseRowGeneration(d,a),await this.persistCreationRollback(d)}async persistCreationRollback(s){try{await this.host.persistSessionRelease(s)}catch(n){e.debug(`[SessionManager] Creation rollback remains owed: ${r(n)}`),this.host.trackReleaseDrainWrite(this.host.retryNonTerminalRowAfterRelease(s))}}assertCreationNotAbandoned(s,n){if(n?.abandoned)throw new Sk(s.sessionId,s.assignedDevice,su)}async retireCreationIfAbandoned(s,n){if(n?.abandoned)await this.host.retireAbandonedCreation(s)}}class vt{host;constructor(s){this.host=s}async releaseSessionInternal(s){let{sessionId:n,session:a,reason:d,shouldCommit:c,options:p,operation:m}=s,S=(R)=>en(m,R);try{S("teardown"),this.host.stateRestore.cancelNetworkConditionExpiry(n),this.host.stateRestore.stopIosAppNetworkLease(n);let R=await this.host.stateRestore.drainReleaseTeardown(n,a,m,p);while(this.host.revokeSupersededIdentityReplacement(m))R=await this.host.stateRestore.drainReleaseTeardown(n,a,m,p);let g=a.assignedDevice;if(nu(m))return null;if(Ae(c))return m.commitDeclined=!0,this.host.abandonSupersededRelease(n,g,R);let w=this.host.sessionNow();this.host.judgeOwnerLeaseForRelease(a,d,"commit",m);let y=this.host.sessionSlots.hasTerminalSnapshot(n),b=this.host.sessionSlots.getTerminalSnapshot(n),A=this.buildReleaseSnapshot(a,g,d.value,w),k=this.fenceTerminal(A,d,a,S),T="then"in k?await k:k;A=T.snapshot;let I=T.intent;while(this.host.revokeSupersededIdentityReplacement(m))R=await this.host.stateRestore.drainReleaseTeardown(n,a,m,p);if(nu(m))return null;if(this.declinesAtFinalFence(I,c))return m.commitDeclined=!0,this.undoUncommittedFence(A,b,I,!1),this.host.abandonSupersededRelease(n,g,R,!y);if(!this.host.commitReleaseRemoval(n,a,g,R))return this.undoUncommittedFence(A,b,I,!0),null;this.host.commitReplacedDeviceTeardown(n,a,p,m),this.settleNonTerminalCommit(A);let O=this.startCommittedTerminalWrite(A,d,a,{intent:I,enter:S});this.host.notifySessionRelease(A,p),S("finalize-persist");let D;try{let C=O?await O:void 0,N=this.writtenOutcome(C,T);if(D=await this.host.completeReleasePersistence(N.snapshot,d,a,N.persisted),N.error!==void 0)throw N.error}catch(C){this.finalizeFailure(C,a,d,A)}return this.host.finishCommittedRelease(a,d,{releaseSnapshot:A,persistedSnapshot:D,pendingCleanup:R},p)}finally{this.host.sessionSlots.unmarkReleasing(a)}}startCommittedTerminalWrite(s,n,a,{intent:d,enter:c}){if(!s.terminal||d==="volatile")return;return c("terminal-persist"),this.persistCommittedTerminalRelease(s,n,a)}declinesAtFinalFence(s,n){return s!=="volatile"&&Ae(n)}writtenOutcome(s,n){return s??{snapshot:n.snapshot,persisted:n.persisted}}settleNonTerminalCommit(s){if(s.terminal)return;this.host.forcedStuckRelease.liftTerminalFenceIfPresent(s.sessionId),this.host.sessionSlots.deleteTerminalReasonState(s.sessionId)}finalizeFailure(s,n,a,d){throw a.finalizedSnapshot??=d,this.host.recordFinalizedSessionRelease(n,a),u(s,`Failed to finalize session ${n.sessionId} release`)}buildReleaseSnapshot(s,n,a,d){let{sessionId:c}=s,p={sessionId:c,deviceId:n,releaseReason:a,releasedAtMs:d,terminal:ir(a),...$e(s),...We(s,a,this.host.planLabels.retainedEndedBase(s.sessionId)),heartbeat:{lastHeartbeatMs:s.lastHeartbeat,hasReceivedHeartbeat:s.hasReceivedHeartbeat,timeoutMs:this.host.releaseHeartbeatTimeoutMs(a,s),ageMs:Math.max(0,d-s.lastHeartbeat)}};return this.host.releaseRowSessions.set(p,new WeakRef(s)),this.host.captureReleaseRowGeneration(p,this.host.persistedRowGenerations.get(s)),p}fenceTerminal(s,n,a,d){if(!s.terminal)return{snapshot:s,intent:void 0,persisted:!0};let c=this.host.fenceTerminalRelease(s);if(c!=="volatile")return{snapshot:s,intent:c,persisted:!0};return d("terminal-persist"),this.host.persistTerminalReleaseWithinDeadline(s,n,a).then((p)=>({snapshot:p.snapshot,intent:c,persisted:p.persisted}))}undoUncommittedFence(s,n,a,d){if(a!=="durable")return;if(n)this.restorePriorFence(s,n);else if(d&&this.host.sessionSlots.getTerminalSnapshot(s.sessionId)===s)this.host.liftTerminalFence(s.sessionId,s)}finishCommittedRelease(s,n,{releaseSnapshot:a,persistedSnapshot:d,pendingCleanup:c},p){let{sessionId:m,deviceId:S}=a;if(this.host.recordFinalizedSessionRelease(s,n),d!==a)this.host.notifySessionRelease(d,{...p,upgradeOnly:!0});return e.info(c.length>0?`Released session ${m}; device ${S} remains quarantined until teardown completes`:`Released session ${m}, freeing device ${S}`),S}commitReleaseRemoval(s,n,a,d){let c=this.host.removeSession(s,n);if(d.length>0)this.host.trackPendingTeardownCleanup(a,d);if(!c)e.warn(`Skipping release finalization for ${s}: session ownership changed`);return c}commitReplacedDeviceTeardown(s,n,a,d){if(!a.deviceIdentityReplaced)return;let c=d?.identityReplacement?.deviceId??n.assignedDevice;this.host.replacedRestoreGenerations.set(c,(this.host.replacedRestoreGenerations.get(c)??0)+1);let p=new Set;if(this.host.stateRestore.clockRestores.targets.has(c))p.add("clock");if(this.host.stateRestore.abandonedRotations.has(c)||this.host.stateRestore.rotationRestores.targets.has(c))p.add("rotation");if(this.host.stateRestore.abandonedScreenReaders.has(c)||this.host.stateRestore.screenReaderRestores.targets.has(c))p.add("screen-reader");if(this.host.dropReplacedDeviceRestoreState(n,p),this.host.retireRestorations(c,"removal"),p.size>0)e.warn(`Dropped restore state for session ${s} on replaced serial ${c}: ${[...p].join(", ")}`)}dropReplacedDeviceRestoreState(s,n){let a=[["keepScreenAwake","keep-awake"],["biometricEnrollment","biometric"],["networkCondition","network-condition"],["clock","clock"],["rotation","rotation"],["screenReader","screen-reader"]];for(let[d,c]of a)if(s.cacheData[d])n.add(c),delete s.cacheData[d]}async persistTerminalReleaseWithUpgrade(s,n,a,d=!1){if(await this.host.persistTerminalReleaseIfNeeded(s),n.value===s.releaseReason)return s;if(d&&this.host.sessionSlots.getTerminalSnapshot(s.sessionId)!==s)return s;let c=this.host.withReleaseReason(s,n.value,a);return await this.host.persistTerminalReleaseIfNeeded(c),c}async persistTerminalReleaseWithinDeadline(s,n,a,d=!1){try{return{snapshot:await this.host.persistTerminalReleaseWithUpgrade(s,n,a,d),persisted:!0}}catch(c){if(!(c instanceof F))throw c;let p=this.host.sessionSlots.getTerminalSnapshot(s.sessionId)??s;if(this.host.volatileTerminalReleaseIntents.get(p.sessionId)===p.releaseReason)e.warn(`Terminal release of session ${p.sessionId} has no crash-safe intent (volatile); freeing its device before the row lands can revive the UUID after a crash`,c);return e.warn(`Freeing device ${p.deviceId} of session ${p.sessionId} before its terminal release row was written (reason=${De}); the session stays fenced and the next release of it retries the write`,c),{snapshot:p,persisted:!1}}}async persistCommittedTerminalRelease(s,n,a){try{return await this.host.persistTerminalReleaseWithinDeadline(s,n,a,!0)}catch(d){let c=this.host.sessionSlots.getTerminalSnapshot(s.sessionId)??s;return e.warn(`Terminal release row of committed session ${c.sessionId} was not written; the device is freed and the row is retried`,d),this.host.scheduleTerminalReleaseRetry(c),{snapshot:c,persisted:!1,error:d}}}restorePriorFence(s,n){if(!n||this.host.sessionSlots.getTerminalSnapshot(s.sessionId)!==s)return;if(n.releaseReason!==s.releaseReason)this.host.liftTerminalFence(s.sessionId,s,!0);this.host.sessionSlots.setTerminalSnapshot(s.sessionId,n)}abandonSupersededRelease(s,n,a,d=!1){if(d)this.host.liftTerminalFence(s);if(a.length>0)this.host.trackPendingTeardownCleanup(n,a);return e.info(`Skipping release of ${s}: a newer identity confirmation superseded the eviction of ${n}`),null}upgradeReleaseReason(s,n){s.value=BZ(s.value,n)}createReleaseReasonState(s,n){let a={value:n},d=this.host.sessionSlots.getTerminalSnapshot(s)?.releaseReason;if(d)this.host.upgradeReleaseReason(a,d);return a}releaseHeartbeatTimeoutMs(s,n){return s==="missing-first-heartbeat"?LS():n.heartbeatTimeoutMs}withReleaseReason(s,n,a){let d={...s,releaseReason:n,terminal:ir(n),heartbeat:{...s.heartbeat,timeoutMs:a?this.host.releaseHeartbeatTimeoutMs(n,a):s.heartbeat.timeoutMs}},c=this.host.releaseRowSessions.get(s);if(c)this.host.releaseRowSessions.set(d,c);return this.host.captureReleaseRowGeneration(d,this.host.releaseRowGenerations.get(s)),this.host.superseded.notePredecessors(d,s),d}async completeReleasePersistence(s,n,a,d){if(s.terminal)return n.finalizedSnapshot=s,n.terminalPersisted=d,this.host.sessionSlots.setTerminalReasonState(s.sessionId,n),s;if(await this.host.persistSessionRelease(s),n.value===s.releaseReason)return n.finalizedSnapshot=s,s;let c=this.host.withReleaseReason(s,n.value,a);if(n.finalizedSnapshot=c,this.host.recordFinalizedSessionRelease(a,n),this.host.rowWriter.pendingNonTerminalReleases().get(s.sessionId)===s)this.host.rowWriter.deletePendingNonTerminalRelease(s.sessionId);if(this.host.dropReleaseRetry(s),c.terminal)this.host.sessionSlots.setTerminalReasonState(c.sessionId,n),await this.host.persistTerminalReleaseIfNeeded(c),n.terminalPersisted=!0;else await this.host.persistSessionRelease(c);return c}async releaseFinalizedSession(s,n){if(this.host.upgradeReleaseReason(s,n),s.lateTerminalRelease)return await s.lateTerminalRelease;let a=s.finalizedSnapshot;if(!a)return null;let d=this.host.sessionSlots.getTerminalReasonState(a.sessionId);if(d&&d!==s)return null;if(a.terminal&&s.terminalPersisted&&a.releaseReason===s.value)return a.deviceId;let c=this.host.withReleaseReason(a,s.value);s.finalizedSnapshot=c,s.terminalPersisted=!1,this.host.sessionSlots.setTerminalReasonState(c.sessionId,s);let p=(async()=>{if(await this.host.persistTerminalReleaseIfNeeded(c),s.value!==c.releaseReason)c=this.host.withReleaseReason(c,s.value),s.finalizedSnapshot=c,this.host.sessionSlots.setTerminalReasonState(c.sessionId,s),await this.host.persistTerminalReleaseIfNeeded(c);return s.terminalPersisted=!0,this.host.notifySessionRelease(c,{upgradeOnly:!0}),c.deviceId})();s.lateTerminalRelease=p;try{return await p}finally{s.lateTerminalRelease=void 0}}recordFinalizedSessionRelease(s,n){this.host.finalizedSessionReleases.set(s,n),this.host.sessionSlots.recordFinalizedIdentity(s)}invalidateFinalizedSessionIdentity(s){let n=this.host.sessionSlots.getFinalizedIdentity(s);if(!n)return;let a=n.deref();if(a)this.host.finalizedSessionReleases.delete(a);this.host.sessionSlots.deleteFinalizedIdentity(s)}}import{AsyncLocalStorage as Lr}from"async_hooks";function Tq(s,n,a=!1){return{session:s,deviceId:n,activityGeneration:s.activityGeneration,...a?{clientSuppliedId:a}:{}}}function FZ(s){return s??{}}var fn=new Lr;function s0(s,n){return fn.run(s,n)}function ta(){return fn.getStore()}function ZI(s){s.deferredRebindCleanup?.commit()}class wt{host;constructor(s){this.host=s}async createSession(s,n,a,d={}){let{timeoutMs:c,heartbeatTimeoutMs:p,stableDeviceId:m,recoveredLiveness:S,initialOwnership:R,persistenceSource:g,signal:w}=sn(d);if(w?.throwIfAborted(),!this.host.acceptingSessionCreations)throw new nv(s);this.host.assertTerminalReleaseAdmission(s,this.host.sessions.get(s)),this.host.liftPlanLabelFenceForMint(s);let y=this.host.sessionSlots.getTerminalSnapshot(s);if(y)throw new Xt(s,y);if(this.host.sessions.has(s))return e.warn(`Session ${s} already exists, returning existing session`),this.host.sessions.get(s);this.host.refuseLabelMintOutsidePlanAllocation(s,n);let b=Array.from(this.host.sessionSlots.activeReleases).filter((M)=>M.session.sessionId===s).map((M)=>M.promise);if(b.length>0){if(await this.host.withinCreateDeadline(s,n,Promise.all(b)),this.host.assertTerminalReleaseAdmission(s,this.host.sessions.get(s)),this.host.liftPlanLabelFenceForMint(s),y=this.host.sessionSlots.getTerminalSnapshot(s),y)throw new Xt(s,y)}let A=this.host.sessionSlots.getCreation(s);if(A)return await this.host.withinCreateDeadline(s,n,A.promise);this.host.stateRestore.forgetKeepAwakeRestoreReport(s);let k=this.host.sessionNow(),T=this.host.sessionSlots.getRecovery(s),I=this.host.creatorSourceForCreation(s,g),O=tn(c,p,S,this.host.SESSION_TIMEOUT_MS),D={sessionId:s,assignedDevice:n,stableDeviceId:m,platform:a,createdAt:k,lastUsedAt:k,activityGeneration:0,expiresAt:k+O.sessionTimeoutMs,cacheData:{},lastHeartbeat:k,...O,ownership:R,...I?{persistenceMetadata:{source:I,autolockEnabled:!1,mcpSessionId:null,daemonSessionId:null}}:{},...this.host.recoverySessionFields(T),...R==="awaiting-owner"?{awaitingOwnerSince:k,hasReceivedHeartbeat:!1}:{}},C={promise:Promise.resolve(D)},N=this.host.notifyManagedExecutionRecovery(D,T);C.promise=this.host.persistAndPublishSession(D,C,this.host.claimedIncarnation(T),w),N(C.promise),this.host.sessionSlots.setCreation(s,C),this.host.slotShadowProbe.check(s,"creation-start");try{let M=await this.host.withinCreateDeadline(s,n,C.promise,()=>{C.abandoned=!0});return await this.host.stateRestore.retryAbandonedRotationRestore(M.assignedDevice),await this.host.stateRestore.retryAbandonedScreenReaderRestore(M.assignedDevice),M}finally{if(this.host.sessionSlots.getCreation(s)===C)this.host.sessionSlots.deleteCreation(s),this.host.slotShadowProbe.check(s,"creation-end")}}claimedIncarnation(s){if(!s||!this.host.sessionSlots.isRowClaimed(s))return;return{rowGeneration:s.stable_identity_generation??0,daemonSessionId:s.daemon_session_id??null,releaseReason:s.release_reason??void 0,releasedAtMs:s.released_at_ms??void 0}}creationRowRollbackSnapshot(s,n,a=this.host.sessionNow()){return{sessionId:s.sessionId,deviceId:s.assignedDevice,releaseReason:n,releasedAtMs:a,terminal:!1,heartbeat:{lastHeartbeatMs:s.lastHeartbeat,hasReceivedHeartbeat:s.hasReceivedHeartbeat,timeoutMs:s.heartbeatTimeoutMs,ageMs:Math.max(0,a-s.lastHeartbeat)}}}async retireAbandonedCreation(s){this.host.retiredCreationRows.add(s);let n=this.host.sessionNow(),a={sessionId:s.sessionId,deviceId:s.assignedDevice,releaseReason:n0,releasedAtMs:n,terminal:!1,heartbeat:{lastHeartbeatMs:s.lastHeartbeat,hasReceivedHeartbeat:s.hasReceivedHeartbeat,timeoutMs:s.heartbeatTimeoutMs,ageMs:Math.max(0,n-s.lastHeartbeat)}};throw this.host.captureReleaseRowGeneration(a,this.host.persistedRowGenerations.get(s)),await this.host.persistSessionRelease(a,!0).catch((d)=>{e.warn(`[SessionManager] Failed to release abandoned creation of ${s.sessionId}: `+r(d))}),new Sk(s.sessionId,s.assignedDevice,su)}async rejectCreationAfterShutdownFence(s,n,a,d){if(this.host.acceptingSessionCreations&&!d?.aborted)return;if(d&&this.host.acceptingSessionCreations)await this.host.rollBackCancelledClientChosenCreation(s,n,d);let c=this.host.sessionNow(),p={sessionId:s.sessionId,deviceId:s.assignedDevice,releaseReason:d?.aborted?"session-creation-cancelled":"daemon-shutdown",releasedAtMs:c,terminal:!0,heartbeat:{lastHeartbeatMs:s.lastHeartbeat,hasReceivedHeartbeat:s.hasReceivedHeartbeat,timeoutMs:s.heartbeatTimeoutMs,ageMs:Math.max(0,c-s.lastHeartbeat)}};if(p.releaseReason==="session-creation-cancelled")await this.host.persistTerminalReleaseIfNeeded(p);else await this.host.persistRejectedCreationRow(s,p,n,a);if(this.host.notifySessionRelease(p),d?.aborted)d.throwIfAborted();throw new nv(s.sessionId,p)}async persistRejectedCreationRow(s,n,a,d){if(this.host.retiredCreationRows.add(s),this.host.sessionSlots.setTerminalSnapshot(s.sessionId,n),this.host.restartRecoveryActivityAt.delete(s.sessionId),!a){this.host.terminalReleaseJournal.record({sessionId:n.sessionId,reason:n.releaseReason,at:this.host.sessionClockToWall(n.releasedAtMs)}),this.host.liftTerminalFence(n.sessionId,n,!0);return}let c=d?.releaseReason,p=c&&_q(c)&&!ra(c)?c:n.releaseReason,m=p===n.releaseReason?n:this.host.creationRowRollbackSnapshot(s,p,d?.releasedAtMs);this.host.captureReleaseRowGeneration(m,this.host.persistedRowGenerations.get(s)),await this.host.persistCreationRollback(m)}async rollBackCancelledClientChosenCreation(s,n,a){if(ta()?.clientChosenSessionId!==s.sessionId)return;if(!n){a.throwIfAborted();return}this.host.retiredCreationRows.add(s);let d=this.host.sessionNow(),c={sessionId:s.sessionId,deviceId:s.assignedDevice,releaseReason:"allocation-rollback",releasedAtMs:d,terminal:!1,heartbeat:{lastHeartbeatMs:s.lastHeartbeat,hasReceivedHeartbeat:s.hasReceivedHeartbeat,timeoutMs:s.heartbeatTimeoutMs,ageMs:Math.max(0,d-s.lastHeartbeat)}};this.host.captureReleaseRowGeneration(c,this.host.persistedRowGenerations.get(s)),await this.host.persistSessionRelease(c),a.throwIfAborted()}}class yt{host;constructor(s){this.host=s}findSession(s){if(this.host.stallProbe?.(),this.host.sessionSlots.hasTerminalSnapshot(s))return null;let n=this.host.sessions.get(s);return n&&!this.host.isSessionExpired(n)?n:null}getSessionForNewExecution(s,n){return this.host.unlessBaseEnded(this.host.expireIfDue(s,!0,n))}async reclaimAndRefreshExistingSession(s){let n=this.host.sessionNow(),a={lastUsedAt:s.lastUsedAt,lastHeartbeat:s.lastHeartbeat,expiresAt:s.expiresAt,ownership:s.ownership,awaitingOwnerSince:s.awaitingOwnerSince};if(s.ownership==="awaiting-owner")s.ownership="owned",s.awaitingOwnerSince=void 0;s.lastUsedAt=n,s.lastHeartbeat=n,s.expiresAt=n+s.sessionTimeoutMs,s.activityGeneration++;let d=s.activityGeneration;try{await this.host.recordSessionActivity(s)}catch(c){if(s.activityGeneration===d)Object.assign(s,a);throw c}}async refreshExistingSessionForAccess(s,n){if(n!=="acquire")return;await this.host.reclaimAndRefreshExistingSession(s)}async getOrCreateSession(s,n,a,d={}){let{execution:c,requireIssuedSession:p=!1,...m}=d,{access:S,requestDeadlineMs:R,callerExecutionId:g,signal:w}=this.host.resolveSessionAcquisitionOptions(m),y=this.host.sessionSlots.getRebind(s);if(y)return await y.promise,await this.host.getOrCreateSession(s,n,a,d);let b=this.host.getSessionForNewExecution(s,c);if(b){let I=this.host.sessionSlots.getReleaseOp(s);if(this.host.sessionSlots.isReleasing(b)&&I?.session===b)return await I.promise,await this.host.getOrCreateSession(s,n,a,{...m,requireIssuedSession:p});return e.info(`[SessionManager] Found existing session ${s} with device ${b.assignedDevice}`),this.host.assertSessionNotSuspect(b,S),await this.host.refuseControlCallOnLapsedOwnerLease(b,S,c,g),await this.host.refuseLabelCallOnLapsedBaseLease(b,S,c,g),await this.host.refreshExistingSessionForAccess(b,S),b}this.host.refuseLabelOfEndedBase(s,S,c,g),this.host.assertTerminalReleaseAdmission(s);let A=this.host.sessionSlots.getTerminalSnapshot(s);if(A)throw new Xt(s,A);let k=this.host.forcedStuckRelease.inFlightReleaseStillOwning(s),T=this.host.sessions.get(s);if(k&&(T===void 0||k.session===T))return await k.promise,await this.host.getOrCreateSession(s,n,a,{...m,requireIssuedSession:p});return await this.host.startOrJoinUnseenAssignment(s,n,a,{requireIssuedSession:p,access:S,requestDeadlineMs:R,signal:w})}async getReleasedSessionReason(s){let n=this.host.sessions.get(s),a=this.host.sessionSlots.getTerminalSnapshot(s)?.releaseReason;if(n)return(()=>{let p=this.host.sessionSlots.getReleaseOp(s),m=p?.session===n?p:void 0;if(a===void 0)return this.host.preFenceIdleReleaseReason(s,m);let S=m?.reason.value??a;return!m?.commitFenced&&S!==void 0&&ir(S)&&!Cg(S)?S:void 0})()??this.host.endedBaseOfLabel(n)?.releaseReason;if(a)return a;let d=await this.host.readPersistedSession(s);if(!d)return;return this.host.expiredReleaseOfUnheldRow(s,d)?.releaseReason??d.release_reason??void 0}async getReleasedSessionIdleTimeoutMs(s){let n=this.host.sessionSlots.getTerminalSnapshot(s);if(n)return n.cliIdleTimeoutMs;let a=this.host.sessions.get(s);if(a)return me(a)??this.host.endedBaseOfLabel(a)?.cliIdleTimeoutMs;let d=await this.host.readPersistedSession(s);if(!d)return;return Se(d)??await Ue(s,d,(c)=>this.host.readPersistedSession(c))}preFenceIdleReleaseReason(s,n){if(n?.commitFenced||n&&!ir(n.reason.value))return;let a=this.host.peekTerminalAnswerForEndedSession(s)?.release.releaseReason;return a!==void 0&&r_(a)?a:void 0}expiredReleaseOfUnheldRow(s,n){if(this.host.sessions.has(s)||this.host.sessionSlots.hasAssignment(s)||this.host.sessionSlots.hasCreation(s)||this.host.sessionSlots.hasRecovery(s)||this.host.sessionSlots.hasReleaseOp(s))return;return this.host.expiredReleaseFromPersisted(s,n)}async getExpiredReleaseSnapshot(s){if(this.host.sessions.has(s)||this.host.sessionSlots.hasTerminalSnapshot(s))return;let n=await this.host.readPersistedSession(s);return n&&this.host.expiredReleaseOfUnheldRow(s,n)}reserveSessionForTerminalRelease(s,n){if(s.assignedDevice!==n)throw new gd(s.sessionId,n);if(this.host.sessionSlots.hasRebind(s.sessionId))throw new ve(s.sessionId);if(this.host.sessionSlots.getTerminalReservation(s.sessionId))throw new se(s.sessionId,n,"is already reserved for terminal release");let d={session:s,deviceId:n,owner:Symbol(s.sessionId)};return this.host.sessionSlots.setTerminalReservation(s.sessionId,d),()=>{if(this.host.sessionSlots.getTerminalReservation(s.sessionId)?.owner===d.owner)this.host.sessionSlots.deleteTerminalReservation(s.sessionId)}}assertTerminalReleaseAdmission(s,n){let a=this.host.sessionSlots.getTerminalReservation(s);if(a&&a.session!==n)throw new se(s,a.deviceId,xe)}assertTerminalRebindAdmission(s,n){let a=this.host.sessionSlots.getTerminalReservation(s);if(a&&a.owner!==n)throw new se(s,a.deviceId,xe)}endedBaseOfLabel(s){if(s.persistenceMetadata?.source!==_a)return;let n=this.host.planLabels.retainedEndedBase(s.sessionId);if(n)return n;for(let a=this.host.getBaseSessionOfDerivedLabel(s.sessionId);a!==void 0;a=this.host.getBaseSessionOfDerivedLabel(a)){let d=this.host.sessionEndReason(a);if(d!==void 0)return ms(a,d,this.sessionEndCliIdleWindowMs(a))}return}sessionEndReason(s){let n=this.host.sessionSlots.getTerminalSnapshot(s);if(n)return n.releaseReason;let a=this.host.sessions.get(s);if(!a)return;let d=this.host.sessionSlots.getReleaseOp(s);if(d?.session===a&&ir(d.reason.value))return d.reason.value;return this.host.isSessionExpired(a)?this.host.expiredSessionReleaseReason(a):void 0}sessionEndCliIdleWindowMs(s){let n=this.host.sessionSlots.getTerminalSnapshot(s);if(n)return n.cliIdleTimeoutMs;let a=this.host.sessions.get(s);return a&&me(a)}unlessBaseEnded(s){return s&&this.host.endedBaseOfLabel(s)?null:s}terminalReleaseAsOfNow(s,n,a){let d=this.host.sessionNow();return{sessionId:s.sessionId,deviceId:s.assignedDevice,releaseReason:n,releasedAtMs:d,terminal:!0,...a?ne(a.cliIdleTimeoutMs):Ks(s),heartbeat:{lastHeartbeatMs:s.lastHeartbeat,hasReceivedHeartbeat:s.hasReceivedHeartbeat,timeoutMs:s.heartbeatTimeoutMs,ageMs:Math.max(0,d-s.lastHeartbeat)}}}refuseLabelOfEndedBase(s,n,a,d){let c=this.host.sessions.get(s),p=c&&this.host.endedBaseOfLabel(c);if(!c||!p)return;if(n!=="read-only")this.host.releaseSessionPastIdleDeadline(p.baseSessionId,a?.executionId??d);throw new Xt(s,this.host.terminalReleaseAsOfNow(c,p.releaseReason,p))}terminalAnswerForEndedSession(s,n){let a=this.host.peekTerminalAnswerForEndedSession(s);if(a)this.host.releaseSessionPastIdleDeadline(s,n);return a}peekTerminalAnswerForEndedSession(s){let n=this.host.sessions.get(s),a=this.host.sessionEndReason(s),d=a===void 0&&n?this.host.endedBaseOfLabel(n):void 0,c=a??d?.releaseReason;if(c===void 0)return;let p=this.host.sessionSlots.getTerminalSnapshot(s);if(p||!n)return p&&new Xt(s,p);return new Xt(s,this.host.terminalReleaseAsOfNow(n,c,d))}refuseControlCallOnLapsedOwnerLease(s,n,a,d){return this.host.leaseExpiry.refuseControlCallOnLapsedOwnerLease(s,n,a,d)}refuseLabelCallOnLapsedBaseLease(s,n,a,d){return this.host.leaseExpiry.refuseLabelCallOnLapsedBaseLease(s,n,a,d)}refuseLabelMintOutsidePlanAllocation(s,n){if(this.host.planLabels.isMinting(s)||this.host.sessionSlots.hasRecovery(s))return;let a=this.host.liveBaseOfDerivedId(s);if(a===void 0)return;e.warn(`Refused to create session ${s} outside a plan allocation of its base ${a}`);let d=this.host.sessionNow();throw new Xt(s,{sessionId:s,deviceId:n,releaseReason:i0,releasedAtMs:d,terminal:!0,heartbeat:{lastHeartbeatMs:d,hasReceivedHeartbeat:!1,timeoutMs:QI.DEFAULT_HEARTBEAT_TIMEOUT_MS,ageMs:0}})}}class bt{host;constructor(s){this.host=s}trackSessionSetup(s,n){if(!this.host.canStartSessionSetup(s))return Promise.resolve();let a,d,c=new Promise((m,S)=>{a=m,d=S}),p={session:s,promise:c};this.host.sessionSetupPromises.add(p);try{n().then(a,d)}catch(m){e.warn(`Session setup factory failed for ${s.sessionId}: ${m}`),d(m)}return c.then(()=>this.host.clearSessionSetup(p),()=>this.host.clearSessionSetup(p)),c}canStartSessionSetup(s){return!this.host.sessionSlots.isReleasing(s)&&this.host.sessionSlots.getRebind(s.sessionId)?.session!==s&&this.host.sessions.get(s.sessionId)===s}async drainReleasePromises(s,n=[]){this.host.rowWriter.beginReleaseDrain();let a=[...Array.from(this.host.sessionSlots.activeReleases,(d)=>d.promise),...this.host.rowWriter.pendingDrainWrites(),...this.host.retryPendingTerminalReleasesNow(),...this.host.superseded.retryAllNow(),...n];try{if(a.length===0)return!0;let d=Error("Release drain timed out");try{return await l(this.host.settleReleaseDrain(a),{timer:this.host.timer,timeoutMs:s,label:"Release drain",timeoutError:()=>d})}catch(c){if(c===d)return!1;throw c}}finally{this.host.rowWriter.clearPendingNonTerminalReleases()}}async settleReleaseDrain(s){let n=s;while(n.length>0){let a=new Set(n);await Promise.allSettled(n),n=Array.from(this.host.rowWriter.pendingDrainWrites()).filter((d)=>!a.has(d))}return!0}async waitForSessionRelease(s){let n=this.host.sessionSlots.getReleaseRequest(s);if(n){await n.promise;return}let a=this.host.sessionSlots.getReleaseOp(s);if(a)await a.promise}async waitForSessionReleaseWithin(s,n){let a=this.host.sessionSlots.getReleaseRequest(s)??this.host.sessionSlots.getReleaseOp(s);if(!a)return!0;let d=Error("Session release wait timed out");try{return await l(Promise.allSettled([a.promise]).then(()=>!0),{timer:this.host.timer,timeoutMs:n,label:"Session release wait",timeoutError:()=>d})}catch(c){if(c===d)return e.debug(`Timed out after ${n}ms waiting for session ${s} release`),!1;throw c}}clearSessionSetup(s){this.host.sessionSetupPromises.delete(s)}async waitForSessionSetup(s,n,a="release"){let d=Promise.allSettled(n),c=Error("Session setup drain timed out"),p=await l(d,{timer:this.host.timer,timeoutMs:e0,label:"Session setup drain",timeoutError:()=>c}).catch((m)=>{if(m===c)return"timed-out";throw m});if(p==="timed-out")return e.warn(`Timed out after ${e0}ms waiting for session ${s} setup during ${a}`),{pending:d.then(()=>{return})};for(let m of p)if(m.status==="rejected")e.warn(`Failed session setup for ${s} before release: ${m.reason}`);return{pending:null}}getDeviceCleanupRetryAfterMs(s){let n=this.host.sessionNow(),a=Array.from(this.host.sessionSlots.activeReleases).filter((d)=>!d.forced&&!d.commitDeclined&&d.session.assignedDevice===s).map((d)=>(d.teardownStartsByMs??d.startedAtMs??n)+d.stuckDeadlineMs+2*yD()+wr);return this.host.deviceCleanupQuarantine.retryAfterMs(s,a)}hasDeviceCleanupInProgress(s){let n=ta(),a=n?.rebound?.fromDeviceId===s&&n.deferredRebindCleanup?.retained?n.deferredRebindCleanup?.settled:void 0;return this.host.getPendingDeviceCleanup(s,a)!==null||this.host.deviceCleanupQuarantine.hasAcquisitionWork(s)&&this.host.getSessionForDevice(s)===null||Array.from(this.host.sessionSlots.activeReleases).some((d)=>!d.forced&&d.session.assignedDevice===s)}getIdleReleasesInProgress(){return Array.from(this.host.sessionSlots.activeReleases).filter((s)=>s.expiryOrigin!==void 0&&!s.forced).map((s)=>({sessionId:s.session.sessionId,startedAtMs:s.startedAtMs??this.host.sessionNow()}))}getNonTerminalReleasesInProgress(){return Array.from(this.host.sessionSlots.releaseOps.values()).filter((s)=>this.host.sessionSlots.hasActiveRelease(s)&&!s.forced&&s.expiryOrigin===void 0&&!ir(s.reason.value)).map((s)=>({sessionId:s.session.sessionId,startedAtMs:s.startedAtMs??this.host.sessionNow(),session:s.session}))}getTerminalReleasesInProgress(){return Array.from(this.host.sessionSlots.activeReleases).filter((s)=>!s.forced&&!s.commitDeclined&&s.expiryOrigin===void 0&&ir(s.reason.value)).map((s)=>({sessionId:s.session.sessionId,startedAtMs:s.startedAtMs??this.host.sessionNow()}))}isReleaseInProgress(s,n){return Array.from(this.host.sessionSlots.activeReleases).some((a)=>!a.forced&&a.session.sessionId===s&&a.startedAtMs===n)}getReleaseStuckAtMs(s){let n=Array.from(this.host.sessionSlots.activeReleases).find((a)=>!a.forced&&!a.commitDeclined&&a.session.sessionId===s);return n?(n.teardownStartsByMs??n.startedAtMs??this.host.sessionNow())+n.stuckDeadlineMs:void 0}}class kt{host;constructor(s){this.host=s}onSessionRelease(s){this.host.releaseCallbacks.push(s)}onDeviceOwnershipChange(s){return this.host.deviceOwnershipCallbacks.add(s),()=>this.host.deviceOwnershipCallbacks.delete(s)}notifyDeviceOwnershipChange(s,n="generation-only"){this.host.armPendingDeviceCleanupCaps(s);for(let a of this.host.deviceOwnershipCallbacks)try{a(s,n)}catch(d){e.warn(`Device ownership callback failed for ${s}: ${d}`)}}onSessionCreated(s){this.host.createdCallbacks.push(s)}onSessionDeviceUnbound(s){this.host.deviceUnboundCallbacks.push(s)}notifyManagedExecutionRecovery(s,n){if(!n||s.livenessPolicy!==ni)return()=>{};let{sessionId:a}=s,d=Promise.withResolvers();this.host.managedExecutionRecoveries.set(a,d),d.promise.catch((c)=>{e.debug(`[SessionManager] Managed recovery ${a} did not complete`,c)});try{this.host.managedExecutionRecoveryListener?.(a,d.promise)}catch(c){e.warn(`[SessionManager] Managed recovery hook failed for ${a}`,c)}return(c)=>{c.then(void 0,d.reject)}}settleManagedExecutionRecovery(s,n){let a=this.host.managedExecutionRecoveries.get(s);if(this.host.managedExecutionRecoveries.delete(s),n)a?.resolve();else a?.reject(new Fg(s))}notifySessionRelease(s,n={}){if(bo(s.releaseReason)){let d=this.host.restartReleasePersistence.get(s)??Promise.withResolvers();this.host.restartReleasePersistence.set(s,d),n={...n,releasePersisted:d.promise}}let a={...n,snapshot:s};for(let d of this.host.releaseCallbacks)try{d(s.sessionId,s.deviceId,s.releaseReason,a)}catch(c){e.warn(`Session release callback failed for ${s.sessionId}: ${c}`)}}notifySessionDeviceUnbound(s,n,a){for(let d of this.host.deviceUnboundCallbacks)try{d(s,n,a)}catch(c){e.warn(`Session device-unbound callback failed for ${s}: ${c}`)}}notifySessionCreated(s){for(let n of this.host.createdCallbacks)try{n(s)}catch(a){e.warn(`Session creation callback failed for ${s.sessionId}: ${a}`)}}deferDeviceAcquisitionCancellation(s){if(!this.host.deferredAcquisitionCancellations.has(s))this.host.deferredAcquisitionCancellations.set(s,void 0)}settleDeviceAcquisitionCancellation(s,n){if(!this.host.deferredAcquisitionCancellations.has(s))return;let a=this.host.deferredAcquisitionCancellations.get(s);if(this.host.deferredAcquisitionCancellations.delete(s),n&&a!==void 0)this.host.deviceAcquisitionExecutionCanceller(a,s)}cancelSessionlessUseOnAcquisition(s,n){if(this.host.deferredAcquisitionCancellations.has(n)){this.host.deferredAcquisitionCancellations.set(n,s);return}this.host.deviceAcquisitionExecutionCanceller(s,n)}}var OA=30000,kq=2000;function Eq(s){let n=Math.min(s.wallElapsedMs,s.monotonicElapsedMs),a=n-s.scheduledMs,d=s.wallElapsedMs-n;if(s.monotonicIncludesHostSleep===!0&&a>s.maxCredibleStallMs)return{lateMs:0,sleptMs:d+a};return{lateMs:a,sleptMs:d}}class k4{histories=new WeakMap;connected(s,n){let a=this.histories.get(s)??{};a.current??={since:n},this.histories.set(s,a)}disconnected(s,n){let a=this.histories.get(s);if(a?.current)a.lastClosed={...a.current,closedAt:n},a.current=void 0}connectedAt(s,n){let a=this.histories.get(s);return[a?.current,a?.lastClosed].some((d)=>d!==void 0&&d.since<=n&&(d.closedAt===void 0||d.closedAt>n))}}var gn=new WeakMap,Nr=600000;function Fr(s,n,a,{gapBeganAt:d,reader:c}){if(a<=0||d===void 0||s.ownership!=="owned"||!(c?.(s,d)??!1))return 0;let p=s.lastOwnerHeartbeat??s.lastHeartbeat,m=gn.get(s),S=m?.heartbeat===p?m.creditedMs:0,R=c?.(s,n)?Nr:OA,g=Math.min(a,Math.max(0,R-S));return gn.set(s,{heartbeat:p,creditedMs:S+g}),g}function vn(s,n,a,d){let c=Ht(s,a.gapBeganAt),p=c?0:Fr(s,n,a.lostMs,{gapBeganAt:a.gapBeganAt,reader:d}),m=c?a.lostMs+a.sleptMs:p,S=ev(s),R=c||m>0?GI(S,n,m):void 0,g=Number(R!==void 0&&R>S);return{leaseStart:R,leaseExtended:c?g:0,connectedExtended:c?0:g,connectedCreditMs:p}}class Pt{host;constructor(s){this.host=s}restartMintBoundClaimLeases(s){let n=this.host.sessionNow();for(let a of this.host.sessions.values())if(a.livenessOwnerToken===s&&Y(a))a.livenessOwnerBoundAt=Math.max(a.livenessOwnerBoundAt,n)}recordToolCallEnded(s,n={admitted:!0}){if(!n.admitted)return;let a=this.host.sessions.get(s);if(!a&&this.host.restartRecoveryActivityAt.has(s)){this.host.recordRestartRecoveryActivity(s);return}if(!a||this.host.sessionSlots.isReleasing(a))return;let d=this.host.sessionNow();a.lastUsedAt=Math.max(a.lastUsedAt,d),a.lastHeartbeat=Math.max(a.lastHeartbeat,d),a.expiresAt=Math.max(a.expiresAt,d+a.sessionTimeoutMs),a.activityGeneration++,this.host.getBarrier().track(()=>this.host.recordSessionActivity(a)).catch((c)=>{e.warn(`[SessionManager] Failed to record tool-call end activity: ${r(c)}`)})}startRehydratedOwnerWindows(){let s=this.host.sessionNow(),n=0;for(let a of this.host.sessions.values())if(a.ownership==="awaiting-owner"&&a.awaitingOwnerSince!==void 0)a.awaitingOwnerSince=Math.max(a.awaitingOwnerSince,s),a.lastUsedAt=Math.max(a.lastUsedAt,s),a.expiresAt=Math.max(a.expiresAt,s+a.sessionTimeoutMs),n++;return n}forgiveDaemonStall(s,n,a=0,d){let c=n+a;this.host.observerSessions?.forgiveStall?.({lostMs:n,sleptMs:a,gapAgeMs:d===void 0?void 0:s-d});let p=0,m=0,S=0,R=0,g=0;for(let w of this.host.sessions.values()){if(w.livenessPolicy==="cli-idle"){let A=ut(w);if(w.idleStallForgivenAt=Math.max(A,Math.min(s,A+n)),g+=Number(w.idleStallForgivenAt>A),w.awaitingOwnerSince!==void 0)w.awaitingOwnerSince=Math.max(w.awaitingOwnerSince,Math.min(w.awaitingOwnerSince+n,s));p++;continue}this.host.forgiveMintBoundClaimLease(w,s,c,d);let y=vn(w,s,{lostMs:n,sleptMs:a,gapBeganAt:d},this.host.ownerConnectedAtReader);if(y.leaseStart!==void 0)w.stallForgivenAt=y.leaseStart;m+=y.leaseExtended,S+=y.connectedExtended,R+=y.connectedCreditMs;let b=w.expiresAt;if(w.expiresAt=Math.max(w.expiresAt,Math.min(w.expiresAt+n,s+w.sessionTimeoutMs)),g+=Number(w.expiresAt>b),w.awaitingOwnerSince!==void 0)w.awaitingOwnerSince=Math.max(w.awaitingOwnerSince,Math.min(w.awaitingOwnerSince+c,s));p++}if(p>0)e.info(`Stall forgiveness: ${m} session lease(s) extended by ${c}ms, ${S} connected-owner lease(s) extended by ${R}ms, ${g} idle deadline(s) extended by ${n}ms, of ${p} session(s)`);return p}cleanupExpiredSessions(){this.host.stallProbe?.();let s=[];for(let[n,a]of this.host.sessions)if(this.host.isSessionExpired(a)&&!this.host.sessionSlots.isReleasing(a))s.push(n);if(s.length===0)return;e.info(`Cleaning up ${s.length} expired sessions found by sweep: `+s.join(", "));for(let n of s){let a=this.host.sessions.get(n);if(!a)continue;let d=this.host.expiredSessionReleaseReason(a),c=this.host.activeSessionExecutionChecker(n,{excludeReads:!0});if(this.host.cancelExecutionsOverriddenByExpiry(a,d))if(c)e.warn(`Session ${n} was kept past its idle deadline by control calls that never settled; cancelling them and releasing it past their request deadline plus grace, or the unsettled-execution ceiling when a control call has no deadline`);else e.info(`Session ${n} idle release cut in-flight reads`);let p=this.host.releaseSession(n,d,{allowExpired:!0,expiryOrigin:"cleanup-expired"});this.host.getBarrier().trackExisting(p).catch((m)=>e.warn(`[SessionManager] Failed to release expired session ${n}: ${m}`))}}removeSession(s,n){let a=this.host.sessions.get(s);if(!a||n&&a!==n)return!1;let d=this.host.deviceSessionMap.get(a.assignedDevice)===s;if(d)this.host.deviceSessionMap.delete(a.assignedDevice);if(this.host.sessions.delete(s),this.host.slotShadowProbe.check(s,"unpublished"),this.host.planLabels.clearEndedBase(s),this.host.superseded.settle(a),this.host.stateRestore.forgetSession(s),d)this.host.notifyDeviceOwnershipChange(a.assignedDevice);return!0}}function a0(s){return{sessionUuid:s.sessionId,deviceId:s.assignedDevice,...s.stableDeviceId!==void 0?{stableDeviceId:s.stableDeviceId}:{},generation:s.deviceGeneration??0,...s.previousDeviceId!==void 0?{previousDeviceId:s.previousDeviceId}:{}}}function c0(s){let{stableDeviceId:n,generation:a,previousDeviceId:d}=a0(s);if(a===0)return{};return{deviceGeneration:a,...n!==void 0?{stableDeviceId:n}:{},...d!==void 0?{previousDeviceId:d}:{}}}var d0="notifications/automobile/sessionDeviceRebound";function Br(s,n){let{sessionUuid:a,...d}=a0(s);return{...d,sessionId:a,previousDeviceId:n,...s.platform==="android"&&d.stableDeviceId!==void 0?{avdName:d.stableDeviceId}:{}}}function yn(s,n,a){try{s?.emit(Br(n,a))}catch(d){e.warn("[SessionManager] Failed to announce rebound session device",d)}}class bn{listeners=new Set;subscribe(s){return this.listeners.add(s),()=>{this.listeners.delete(s)}}emit(s){for(let n of this.listeners)try{n(s)}catch(a){e.warn("[SessionDeviceReboundBroadcaster] listener failed",a)}}}var Iq=new bn;class At{host;constructor(s){this.host=s}async recoverPersistedRow(s,n,a,{persisted:d,initialOwnership:c,shared:p}){let m=await this.host.recoveryTargetFromPersisted(s,d,a,c==="owned");if(m&&c==="awaiting-owner")m.initialOwnership=c;if(e.info(`[SessionManager] Creating new session ${s}, calling devicePool.assignDeviceToSession()`),d&&(m||this.host.isNameReissueOnlyRow(d)))this.host.sessionSlots.setRecovery(s,d);try{let S=()=>this.host.assignUnseenSessionToDevicePool(s,n,a,{recoveryTarget:m,persisted:d});if(m?.restartRecoveryDeadlineMs!==void 0&&this.host.sessionNow()<m.restartRecoveryDeadlineMs)m.onRecoveryWait=(g)=>p.recoveryWait.resolve(g),await H(p.controller.signal,S);else p.recoveryWait.resolve(void 0),await S();let R=this.host.getSession(s);if(!R)throw new Fg(s);return this.host.restartRecoveryActivityAt.delete(s),e.info(`[SessionManager] Successfully created session ${s} with device ${R.assignedDevice}`),this.host.settleManagedExecutionRecovery(s,!0),R}finally{if(this.host.settleManagedExecutionRecovery(s,!1),this.host.sessionSlots.getRecovery(s)===d)this.host.sessionSlots.deleteRecovery(s)}}async rehydratePersistedRow(s,n,a){let d=s.session_uuid;if(!this.host.isRecoverablePersistedSession(s))return{kind:"skipped",reason:"not-recoverable"};let c=this.host.rehydrationSkipReason(d);if(c)return{kind:"skipped",reason:c};try{return await this.host.registerRehydrationRecovery(d,n,s,a),{kind:"rehydrated"}}catch(p){let m=this.host.getTerminalReleaseSnapshot(d);if(m)return{kind:"terminalized",reason:m.releaseReason};if(p instanceof Yt)return{kind:"skipped",reason:"owned-by-other-daemon"};let S=r(p);return e.warn(`[SessionManager] Failed to rehydrate session ${d}: ${S}`),{kind:"skipped",reason:S}}}async listRecoverableSessionsBeforeDeadline(s,n){let a=Symbol("startup-deadline"),d=this.host.deviceSessionRepository.listRecoverableSessions(this.host.sessionNow(),()=>this.host.rowWriteLivePeerDaemonSessionIds()),c;try{c=await l(d,{timer:this.host.timer,timeoutMs:Math.max(0,s-this.host.sessionNow()),label:"Recoverable session listing",timeoutError:()=>a})}catch(p){if(p!==a)throw p;c=a}if(typeof c!=="symbol")return c;return d.catch((p)=>e.warn(`[SessionManager] Recoverable-session list continued after startup deadline: ${r(p)}`)),n.timedOut=!0,e.warn("[SessionManager] Startup rehydration deadline reached while listing rows"),[]}async terminalizePersistedRecoveryFailure(s,n,a){let d=this.host.sessionNow();await this.host.persistTerminalReleaseIfNeeded({sessionId:s,deviceId:n.device_id,releaseReason:a.terminalReleaseReason,releasedAtMs:d,terminal:!0,...a.ownerPid===void 0?{}:{ownerPid:a.ownerPid},heartbeat:{lastHeartbeatMs:n.last_used_at_ms,hasReceivedHeartbeat:n.has_received_heartbeat===1,timeoutMs:n.heartbeat_timeout_ms,ageMs:Math.max(0,d-n.last_used_at_ms)}})}releaseSnapshotFromPersisted(s,n,a){let d=n.released_at_ms??n.last_used_at_ms,c={sessionId:s,deviceId:n.device_id,releaseReason:a,releasedAtMs:d,terminal:ir(a),...nn(n),heartbeat:{lastHeartbeatMs:n.last_used_at_ms,hasReceivedHeartbeat:n.has_received_heartbeat===1,timeoutMs:a==="missing-first-heartbeat"?LS():n.heartbeat_timeout_ms,ageMs:Math.max(0,d-n.last_used_at_ms)}};return this.host.captureReleaseRowGeneration(c,n.stable_identity_generation),c}publishReboundIfLive(s,n,a,d){if(d!==!0||this.host.sessions.get(s)!==n)return;yn(this.host.sessionDeviceReboundEmitter,n,a)}async persistAndPublishRebind(s,n,a,{stableDeviceId:d,deferCleanup:c,recovery:p}){let m=Array.from(this.host.sessionSetupPromises,(k)=>k.session===s?k.promise:null).filter((k)=>k!==null);if((await this.host.waitForSessionSetup(s.sessionId,m,"rebind")).pending)throw new t(`Session ${s.sessionId} setup is still running; retry the device rebind after it settles.`);if(await this.host.liveness.livenessOwnershipClaimMutexFor(s).runExclusive(async()=>{await this.host.persistSession(this.host.createReboundSession(s,n,a,{stableDeviceId:d,recovery:p}),s,this.host.guardedRowRewriteOptions()),this.host.superseded.settle(s)}),this.host.sessions.get(s.sessionId)!==s)await this.host.restoreReleasedRowAfterReassert(s);let R=s.assignedDevice,g=this.host.identityReplacementFences.get(R),w={...s,cacheData:{...s.cacheData}},y=this.host.stateRestore.peekNetworkConditionExpiry(s.sessionId),b=this.host.stateRestore.activeIosAppNetworkLease(s.sessionId);if(this.host.stateRestore.cancelNetworkConditionExpiry(s.sessionId),this.host.stateRestore.stopIosAppNetworkLease(s.sessionId),g){let k=this.host.replacedRestoreGenerations.get(R)??0,T=this.host.deviceHealth?.incarnation(R),I=[...g.releases],O=()=>{let C=this.host.getSessionForDevice(R);return(C===null||C===w.sessionId)&&this.host.restoreIncarnationIsCurrent({deviceId:R,incarnation:T,restoreGeneration:k})},D=Xe(async()=>{let N=!await this.host.waitForIdentityReplacement(R,k)||I.some(nu)||!O();if(this.host.notifySessionDeviceUnbound(w.sessionId,R,{deviceIdentityReplaced:N}),N)return;let M=await this.host.restoreRebindOverrides(w,O);this.host.trackPendingTeardownCleanup(R,M),await Promise.allSettled(M)}).catch((C)=>{e.warn(`Fenced rebind cleanup failed on ${R}: ${r(C)}`,C)});this.host.registerPendingDeviceCleanup(R,D)}else if(c){let k=this.host.deferRebindOverrides(w,()=>{if(y)this.host.stateRestore.rearmNetworkConditionExpiry(s,y);if(b)this.host.stateRestore.confirmIosAppNetworkRule(s,b)},b);c(k)}else{let k=await this.host.restoreRebindOverrides(s,()=>!this.host.identityReplacementFences.has(R));if(k.length>0)this.host.trackPendingTeardownCleanup(R,k)}Object.assign(s,this.host.createReboundSession(s,n,a,{stableDeviceId:d,recovery:p}));let A=s.sessionId;if(this.host.rowWriter.noteLive(A),this.host.deviceSessionMap.get(R)===s.sessionId)this.host.deviceSessionMap.delete(R);if(this.host.deviceSessionMap.set(n,s.sessionId),n!==R)this.host.cancelSessionlessUseOnAcquisition(n,s.sessionId);if(this.host.notifyDeviceOwnershipChange(R,"full"),n!==R)this.host.notifyDeviceOwnershipChange(n,"full"),this.publishReboundIfLive(A,s,R,p);if(!g)this.host.notifySessionDeviceUnbound(s.sessionId,R,{deviceIdentityReplaced:this.host.identityReplacementFences.has(R)});return s}async dispatchDeviceRestore(s,n,a=this.host.replacedRestoreGenerations.get(s)??0,d){if(this.host.identityReplacementFences.has(s)){if(!await this.host.waitForIdentityReplacement(s,a))return}else if((this.host.replacedRestoreGenerations.get(s)??0)!==a)return;let c=new AbortController,p=this.host.activeRestoreControllers.get(s);if(!p)p=new Set,this.host.activeRestoreControllers.set(s,p);p.add(c);let m=Array.from(this.host.sessionSlots.activeReleases).filter((S)=>d!==void 0&&S.teardownStep===d&&S.stage==="teardown"&&S.session.assignedDevice===s).map((S)=>({release:S,step:S.teardownStep}));try{let S=V(),R=S?AbortSignal.any([S,c.signal]):c.signal;await H(R,()=>n(R,c.signal,()=>{for(let{release:g,step:w}of m)if(g.identityReplacement&&w!==void 0)g.identityReplacement.resumeStep=Math.max(g.identityReplacement.resumeStep,w+1);c.signal.throwIfAborted()}))}finally{if(p.delete(c),p.size===0)this.host.activeRestoreControllers.delete(s)}}async rejectRefusedRebind(s,n,a){let d=s.sessionId;if(this.host.sessionSlots.getRebind(d)===n)this.host.sessionSlots.deleteRebind(d);let c=this.host.endSessionTerminallyReleasedInRow(s);this.host.trackReleaseDrainWrite(c.then(()=>{},(m)=>{e.warn(`[SessionManager] Rebind refusal adoption failed: ${r(m)}`)}));let p=await c;throw p instanceof Xt?p:a}}class Et{host;preRecorded=new WeakSet;constructor(s){this.host=s}recordTerminalIntent(s,n=!1){let a=this.host.terminalReleaseJournal.record({sessionId:s.sessionId,reason:s.releaseReason,at:this.host.sessionClockToWall(s.releasedAtMs)});if(a==="volatile")this.host.volatileTerminalReleaseIntents.set(s.sessionId,s.releaseReason);else this.host.volatileTerminalReleaseIntents.delete(s.sessionId);if(n)this.preRecorded.add(s);return a}async persistSessionRelease(s,n=!1,a){if(n&&this.host.isSessionBeingRecreated(s.sessionId))return!1;this.host.rowWriter.noteRelease(s);try{if(s.terminal&&!this.preRecorded.delete(s))this.recordTerminalIntent(s);let d={...this.host.releaseWritePrecondition(s),...a},c=(y)=>this.host.issueReleaseRow(s,y),p=this.host.releaseRowFallback(s,d,c),m=()=>this.host.timer.monotonicNow?.()??this.host.timer.now(),S=m(),R=!1,g=c(d),w={timer:this.host.timer,timeoutMs:Os,unref:!0,label:"Session release persistence",timeoutError:()=>new F(s.sessionId,s.releaseReason,Os),onTimeout:()=>{R=!0,this.host.trackLateReleaseWrite(g.catch(p),s)}};try{await l(g,w)}catch(y){if(g=p(y),R)throw w.timeoutError();await l(g,{...w,timeoutMs:Math.max(0,Os-(m()-S)),onTimeout:()=>this.host.trackLateReleaseWrite(g,s)})}return this.host.confirmReleaseWrite(s),!0}catch(d){return this.host.handleReleaseWriteFailure(d,s,n)}}}class Ct{facade;dependencies;host;restoreHealth;persistedAdmission;recovery;rehydration;rebinding;supersededRows;releasePersistence;activityPersistence;leaseExpiry;cache;acquisition;releaseRequests;planLabelsLifecycle;creation;releaseCommit;creationGuard;admission;bookkeeping;callbacks;activityClocks;recoveryPublication;releaseWrite;constructor(s,n){this.facade=s;this.dependencies=n;this.host=hn(this.createCollaboratorActions(),n),this.restoreHealth=new tt(this.host),this.persistedAdmission=new it(this.host),this.recovery=new rt(this.host),this.rehydration=new ot(this.host),this.rebinding=new at(this.host),this.supersededRows=new lt(this.host),this.releasePersistence=new dt(this.host),this.activityPersistence=new ct(this.host),this.leaseExpiry=new ht(this.host),this.cache=new pt(this.host),this.acquisition=new mt(this.host),this.releaseRequests=new St(this.host),this.planLabelsLifecycle=new ft(this.host),this.creation=new gt(this.host),this.releaseCommit=new vt(this.host),this.creationGuard=new wt(this.host),this.admission=new yt(this.host),this.bookkeeping=new bt(this.host),this.callbacks=new kt(this.host),this.activityClocks=new Pt(this.host),this.recoveryPublication=new At(this.host),this.releaseWrite=new Et(this.host)}createCollaboratorActions(){return{...this.createPersistenceCollaboratorActions(),refusePlanLabelSessionOutsideItsRun:(...s)=>this.planLabelsLifecycle.refusePlanLabelSessionOutsideItsRun(...s),expireIfDue:(...s)=>this.facade.expireIfDue(...s),markIdentityReplacedRelease:(...s)=>this.restoreHealth.markIdentityReplacedRelease(...s),createReleaseReasonState:(...s)=>this.releaseCommit.createReleaseReasonState(...s),judgeOwnerLeaseForRelease:(...s)=>this.leaseExpiry.judgeOwnerLeaseForRelease(...s),finishReleaseForcedBeforeStart:(...s)=>this.facade.finishReleaseForcedBeforeStart(...s),releaseSessionInternal:(s)=>this.releaseCommit.releaseSessionInternal(s),finishIdentityReplacedRelease:(...s)=>this.restoreHealth.finishIdentityReplacedRelease(...s),releaseFinalizedSession:(...s)=>this.releaseCommit.releaseFinalizedSession(...s),persistTerminalReleaseIfNeeded:(...s)=>this.releasePersistence.persistTerminalReleaseIfNeeded(...s),isLiveDaemonSession:(...s)=>this.recovery.isLiveDaemonSession(...s),liftTerminalFence:(...s)=>this.facade.liftTerminalFence(...s),endedBaseOfLabel:(...s)=>this.admission.endedBaseOfLabel(...s),rejectCreationAfterShutdownFence:(...s)=>this.creationGuard.rejectCreationAfterShutdownFence(...s),assertTerminalReleaseAdmission:(...s)=>this.admission.assertTerminalReleaseAdmission(...s),invalidateFinalizedSessionIdentity:(...s)=>this.releaseCommit.invalidateFinalizedSessionIdentity(...s),cancelSessionlessUseOnAcquisition:(...s)=>this.callbacks.cancelSessionlessUseOnAcquisition(...s),notifySessionCreated:(...s)=>this.callbacks.notifySessionCreated(...s),creationRowRollbackSnapshot:(...s)=>this.creationGuard.creationRowRollbackSnapshot(...s),retireAbandonedCreation:(...s)=>this.creationGuard.retireAbandonedCreation(...s),revokeSupersededIdentityReplacement:(...s)=>this.restoreHealth.revokeSupersededIdentityReplacement(...s),abandonSupersededRelease:(...s)=>this.releaseCommit.abandonSupersededRelease(...s),releaseHeartbeatTimeoutMs:(...s)=>this.releaseCommit.releaseHeartbeatTimeoutMs(...s),fenceTerminalRelease:(...s)=>this.releasePersistence.fenceTerminalRelease(...s),persistTerminalReleaseWithinDeadline:(...s)=>this.releaseCommit.persistTerminalReleaseWithinDeadline(...s),commitReleaseRemoval:(...s)=>this.releaseCommit.commitReleaseRemoval(...s),commitReplacedDeviceTeardown:(...s)=>this.releaseCommit.commitReplacedDeviceTeardown(...s),completeReleasePersistence:(...s)=>this.releaseCommit.completeReleasePersistence(...s),recordFinalizedSessionRelease:(...s)=>this.releaseCommit.recordFinalizedSessionRelease(...s),finishCommittedRelease:(...s)=>this.releaseCommit.finishCommittedRelease(...s),removeSession:(...s)=>this.activityClocks.removeSession(...s),dropReplacedDeviceRestoreState:(...s)=>this.releaseCommit.dropReplacedDeviceRestoreState(...s),retireRestorations:(...s)=>this.facade.retireRestorations(...s),withReleaseReason:(...s)=>this.facade.withReleaseReason(...s),persistTerminalReleaseWithUpgrade:(...s)=>this.releaseCommit.persistTerminalReleaseWithUpgrade(...s),liftPlanLabelFenceForMint:(...s)=>this.planLabelsLifecycle.liftPlanLabelFenceForMint(...s),withinCreateDeadline:(...s)=>this.creation.withinCreateDeadline(...s),creatorSourceForCreation:(...s)=>this.planLabelsLifecycle.creatorSourceForCreation(...s),recoverySessionFields:(...s)=>this.recovery.recoverySessionFields(...s),notifyManagedExecutionRecovery:(...s)=>this.callbacks.notifyManagedExecutionRecovery(...s),persistAndPublishSession:(...s)=>this.facade.persistAndPublishSession(...s),claimedIncarnation:(...s)=>this.creationGuard.claimedIncarnation(...s),rollBackCancelledClientChosenCreation:(...s)=>this.creationGuard.rollBackCancelledClientChosenCreation(...s),persistRejectedCreationRow:(...s)=>this.creationGuard.persistRejectedCreationRow(...s),persistCreationRollback:(...s)=>this.creation.persistCreationRollback(...s),isSessionExpired:(...s)=>this.facade.isSessionExpired(...s),recordSessionActivity:(...s)=>this.facade.recordSessionActivity(...s),resolveSessionAcquisitionOptions:(...s)=>this.acquisition.resolveSessionAcquisitionOptions(...s),getSessionForNewExecution:(...s)=>this.facade.getSessionForNewExecution(...s),assertSessionNotSuspect:(...s)=>this.leaseExpiry.assertSessionNotSuspect(...s),refuseControlCallOnLapsedOwnerLease:(...s)=>this.facade.refuseControlCallOnLapsedOwnerLease(...s),refuseLabelCallOnLapsedBaseLease:(...s)=>this.admission.refuseLabelCallOnLapsedBaseLease(...s),refreshExistingSessionForAccess:(...s)=>this.admission.refreshExistingSessionForAccess(...s),refuseLabelOfEndedBase:(...s)=>this.admission.refuseLabelOfEndedBase(...s),startOrJoinUnseenAssignment:(...s)=>this.acquisition.startOrJoinUnseenAssignment(...s),preFenceIdleReleaseReason:(...s)=>this.admission.preFenceIdleReleaseReason(...s),expiredReleaseOfUnheldRow:(...s)=>this.admission.expiredReleaseOfUnheldRow(...s),peekTerminalAnswerForEndedSession:(...s)=>this.facade.peekTerminalAnswerForEndedSession(...s),expiredReleaseFromPersisted:(...s)=>this.persistedAdmission.expiredReleaseFromPersisted(...s),sessionEndReason:(...s)=>this.admission.sessionEndReason(...s),expiredSessionReleaseReason:(...s)=>this.leaseExpiry.expiredSessionReleaseReason(...s),releaseSessionPastIdleDeadline:(...s)=>this.facade.releaseSessionPastIdleDeadline(...s),liveBaseOfDerivedId:(...s)=>this.facade.liveBaseOfDerivedId(...s),canStartSessionSetup:(...s)=>this.bookkeeping.canStartSessionSetup(...s),clearSessionSetup:(...s)=>this.bookkeeping.clearSessionSetup(...s),retryPendingTerminalReleasesNow:(...s)=>this.facade.retryPendingTerminalReleasesNow(...s),settleReleaseDrain:(...s)=>this.bookkeeping.settleReleaseDrain(...s),getPendingDeviceCleanup:(...s)=>this.facade.getPendingDeviceCleanup(...s),armPendingDeviceCleanupCaps:(...s)=>this.facade.armPendingDeviceCleanupCaps(...s),forgiveMintBoundClaimLease:(...s)=>this.leaseExpiry.forgiveMintBoundClaimLease(...s),cancelExecutionsOverriddenByExpiry:(...s)=>this.facade.cancelExecutionsOverriddenByExpiry(...s),recoveryTargetFromPersisted:(...s)=>this.recovery.recoveryTargetFromPersisted(...s),assignUnseenSessionToDevicePool:(...s)=>this.recovery.assignUnseenSessionToDevicePool(...s),getSession:(...s)=>this.facade.getSession(...s),settleManagedExecutionRecovery:(...s)=>this.callbacks.settleManagedExecutionRecovery(...s),rehydrationSkipReason:(...s)=>this.rehydration.rehydrationSkipReason(...s),registerRehydrationRecovery:(...s)=>this.rehydration.registerRehydrationRecovery(...s),getTerminalReleaseSnapshot:(...s)=>this.facade.getTerminalReleaseSnapshot(...s),waitForSessionSetup:(...s)=>this.facade.waitForSessionSetup(...s),createReboundSession:(...s)=>this.rebinding.createReboundSession(...s),restoreReleasedRowAfterReassert:(...s)=>this.supersededRows.restoreReleasedRowAfterReassert(...s),restoreIncarnationIsCurrent:(...s)=>this.facade.restoreIncarnationIsCurrent(...s),waitForIdentityReplacement:(...s)=>this.facade.waitForIdentityReplacement(...s),notifySessionDeviceUnbound:(...s)=>this.callbacks.notifySessionDeviceUnbound(...s),restoreRebindOverrides:(...s)=>this.rebinding.restoreRebindOverrides(...s),deferRebindOverrides:(...s)=>this.rebinding.deferRebindOverrides(...s),releaseWritePrecondition:(...s)=>this.releasePersistence.releaseWritePrecondition(...s),recordTerminalReleaseIntent:(...s)=>this.releaseWrite.recordTerminalIntent(...s),issueReleaseRow:(...s)=>this.releasePersistence.issueReleaseRow(...s),releaseRowFallback:(...s)=>this.releasePersistence.releaseRowFallback(...s),trackLateReleaseWrite:(...s)=>this.releasePersistence.trackLateReleaseWrite(...s),confirmReleaseWrite:(...s)=>this.releasePersistence.confirmReleaseWrite(...s),handleReleaseWriteFailure:(...s)=>this.releasePersistence.handleReleaseWriteFailure(...s)}}createPersistenceCollaboratorActions(){return{isTerminalReleaseRetryCurrent:(...s)=>this.facade.isTerminalReleaseRetryCurrent(...s),retryTerminalReleaseWrite:(...s)=>this.facade.retryTerminalReleaseWrite(...s),dropReleaseRetry:(...s)=>this.releasePersistence.dropReleaseRetry(...s),refuseLabelMintOutsidePlanAllocation:(...s)=>this.admission.refuseLabelMintOutsidePlanAllocation(...s),rejectRefusedRebind:(...s)=>this.recoveryPublication.rejectRefusedRebind(...s),readSessionRow:(s)=>this.dependencies.deviceSessionRepository().getSession(s),dispatchDeviceRestore:(...s)=>this.facade.dispatchDeviceRestore(...s),sessionNow:(...s)=>this.facade.sessionNow(...s),isRowOwnedByLivePeer:(...s)=>this.releaseRequests.isRowOwnedByLivePeer(...s),isSessionBeingRecreated:(...s)=>this.facade.isSessionBeingRecreated(...s),sessionClockToWall:(...s)=>this.facade.sessionClockToWall(...s),rowWriteLivePeerDaemonSessionIds:(...s)=>this.supersededRows.rowWriteLivePeerDaemonSessionIds(...s),releaseSnapshotFromPersisted:(...s)=>this.recoveryPublication.releaseSnapshotFromPersisted(...s),persistSessionRelease:(...s)=>this.facade.persistSessionRelease(...s),notifySessionRelease:(...s)=>this.callbacks.notifySessionRelease(...s),isLapsedUnownedRestartRecovery:(...s)=>this.acquisition.isLapsedUnownedRestartRecovery(...s),admitPersistedSession:(...s)=>this.acquisition.admitPersistedSession(...s),isReissuablePersistedSession:(...s)=>this.persistedAdmission.isReissuablePersistedSession(...s),recoverPersistedRow:(...s)=>this.facade.recoverPersistedRow(...s),readPersistedSession:(...s)=>this.persistedAdmission.readPersistedSession(...s),terminalReleaseFromPersisted:(...s)=>this.persistedAdmission.terminalReleaseFromPersisted(...s),recoveredRowOwner:(...s)=>this.facade.recoveredRowOwner(...s),isNameReissueOnlyRow:(...s)=>this.persistedAdmission.isNameReissueOnlyRow(...s),terminalizePersistedRecoveryFailure:(...s)=>this.recoveryPublication.terminalizePersistedRecoveryFailure(...s),recoveryLivenessFromPersisted:(...s)=>this.facade.recoveryLivenessFromPersisted(...s),newSharedAssignment:(...s)=>this.acquisition.newSharedAssignment(...s),recoverPersistedSession:(...s)=>this.recovery.recoverPersistedSession(...s),waitForSharedAssignment:(...s)=>this.acquisition.waitForSharedAssignment(...s),applyRecoveredTerminalReleaseIntents:(...s)=>this.facade.applyRecoveredTerminalReleaseIntents(...s),listRecoverableSessionsBeforeDeadline:(...s)=>this.recoveryPublication.listRecoverableSessionsBeforeDeadline(...s),rehydratePersistedRow:(...s)=>this.recoveryPublication.rehydratePersistedRow(...s),isRecoverablePersistedSession:(...s)=>this.persistedAdmission.isRecoverablePersistedSession(...s),assertTerminalRebindAdmission:(...s)=>this.admission.assertTerminalRebindAdmission(...s),createSession:(...s)=>this.facade.createSession(...s),notifyDeviceOwnershipChange:(...s)=>this.callbacks.notifyDeviceOwnershipChange(...s),rebindSession:(...s)=>this.facade.rebindSession(...s),flushDeferredRebindCleanups:(...s)=>this.facade.flushDeferredRebindCleanups(...s),persistAndPublishRebind:(...s)=>this.recoveryPublication.persistAndPublishRebind(...s),endSessionTerminallyReleasedInRow:(...s)=>this.activityPersistence.endSessionTerminallyReleasedInRow(...s),trackReleaseDrainWrite:(...s)=>this.facade.trackReleaseDrainWrite(...s),getSessionForDevice:(...s)=>this.facade.getSessionForDevice(...s),trackPendingTeardownCleanup:(...s)=>this.facade.trackPendingTeardownCleanup(...s),registerPendingDeviceCleanup:(...s)=>this.facade.registerPendingDeviceCleanup(...s),isCurrentSession:(...s)=>this.facade.isCurrentSession(...s),persistSession:(...s)=>this.facade.persistSession(...s),awaitInFlightOwnRowWrites:(...s)=>this.activityPersistence.awaitInFlightOwnRowWrites(...s),scheduleTerminalReleaseRetry:(...s)=>this.facade.scheduleTerminalReleaseRetry(...s),captureReleaseRowGeneration:(...s)=>this.releasePersistence.captureReleaseRowGeneration(...s),recordPendingNonTerminalRelease:(...s)=>this.facade.recordPendingNonTerminalRelease(...s),retryRefusedRowWrite:(...s)=>this.supersededRows.retryRefusedRowWrite(...s),retryNonTerminalRowAfterRelease:(...s)=>this.supersededRows.retryNonTerminalRowAfterRelease(...s),retryTerminalRowAfterRelease:(...s)=>this.supersededRows.retryTerminalRowAfterRelease(...s),waitOutRecreationOf:(...s)=>this.supersededRows.waitOutRecreationOf(...s),getLegacyLifecycleView:(...s)=>this.facade.getLegacyLifecycleView(...s),isAdmittedForAutomation:(...s)=>this.facade.isAdmittedForAutomation(...s),guardedRowRewriteOptions:(...s)=>this.supersededRows.guardedRowRewriteOptions(...s),isRebindUnderWay:(...s)=>this.supersededRows.isRebindUnderWay(...s),oweSupersededRowReassert:(...s)=>this.supersededRows.oweSupersededRowReassert(...s),restoreNonTerminalRowAfterReassert:(...s)=>this.supersededRows.restoreNonTerminalRowAfterReassert(...s),reassertOwedLiveRowForActivity:(...s)=>this.supersededRows.reassertOwedLiveRowForActivity(...s),getPersistedTerminalRelease:(...s)=>this.persistedAdmission.getPersistedTerminalRelease(...s),cancelExecutionsCutByRelease:(...s)=>this.facade.cancelExecutionsCutByRelease(...s),releaseSessionForReason:(...s)=>this.facade.releaseSessionForReason(...s),releaseSession:(...s)=>this.facade.releaseSession(...s),deviceHeldForLateRead:(...s)=>this.facade.deviceHeldForLateRead(...s),unlessBaseEnded:(...s)=>this.facade.unlessBaseEnded(...s),wallToSessionClock:(...s)=>this.facade.wallToSessionClock(...s),peekSession:(...s)=>this.facade.peekSession(...s),judgedLeaseHeartbeat:(...s)=>this.facade.judgedLeaseHeartbeat(...s),ownershipSessionUuid:(...s)=>this.facade.ownershipSessionUuid(...s),getBaseSessionOfDerivedLabel:(...s)=>this.facade.getBaseSessionOfDerivedLabel(...s),getReleasingSession:(...s)=>this.facade.getReleasingSession(...s),upgradeReleaseReason:(...s)=>this.releaseCommit.upgradeReleaseReason(...s),terminalReleaseAsOfNow:(...s)=>this.admission.terminalReleaseAsOfNow(...s),findSession:(...s)=>this.facade.findSession(...s),updateSessionCache:(...s)=>this.facade.updateSessionCache(...s),getDeviceReadiness:(...s)=>this.facade.getDeviceReadiness(...s),invalidateAutomationReadiness:(...s)=>this.facade.invalidateAutomationReadiness(...s),getBiometricEnrollment:(...s)=>this.facade.getBiometricEnrollment(...s),getNetworkCondition:(...s)=>this.facade.getNetworkCondition(...s),reclaimAndRefreshExistingSession:(...s)=>this.admission.reclaimAndRefreshExistingSession(...s),recordRestartRecoveryActivity:(...s)=>this.facade.recordRestartRecoveryActivity(...s),getOrCreateSession:(...s)=>this.facade.getOrCreateSession(...s),observeSessionForRead:(...s)=>this.leaseExpiry.observeSessionForRead(...s),unadmittedSessionError:(...s)=>this.persistedAdmission.unadmittedSessionError(...s),terminalizeExpiredPersistedSession:(...s)=>this.facade.terminalizeExpiredPersistedSession(...s)}}}var kn=256;class Qe{persistence;timer;backoff;static create(s){let{persistence:n,timer:a,backoff:d,logger:c,timeoutMs:p,timeoutError:m}=s;return new Qe(n,a,d,{logger:c,timeoutMs:p,timeoutError:(S)=>new m(S.sessionId,S.releaseReason,p)})}rows=new Map;listeners=new Set;work=new Set;drainWrites=new Set;retries=new Map;nonTerminalSnapshots=new Map;waiters=new Map;liveSequences=new Map;releaseSequences=new WeakMap;finalizedGenerations=new FinalizationRegistry(({uuid:s,ref:n})=>{if(this.liveSequences.get(s)===n)this.liveSequences.delete(s)});desireSeq=0;draining=!1;superseded;logger;options;constructor(s,n,a,{logger:d,...c}){this.persistence=s;this.timer=n;this.backoff=a;this.logger=d,this.options=c,this.superseded=new us({timer:n,logger:d,draining:()=>this.draining,trackDrainWrite:(p)=>this.trackDrainWrite(p)})}noteRelease(s){if(!this.releaseSequences.has(s)){let n=s.sessionId,a=this.liveSequences.get(n)?.deref()??{seq:0};if(!this.liveSequences.get(n)?.deref()){let d=new WeakRef(a);this.liveSequences.set(n,d),this.finalizedGenerations.register(a,{uuid:n,ref:d})}this.releaseSequences.set(s,{seq:++this.desireSeq,live:a})}}noteLive(s){let n=++this.desireSeq,a=this.liveSequences.get(s)?.deref();if(a)a.seq=n;let d=this.rows.get(s);if(d)d.liveSeq=n}upsertLive(s,n,a){return this.persistence.upsertActiveSession(s,n,a)}recordLiveActivity(s,n){return this.persistence.recordActivity(s,n)}replaceLiveOwnership(s,n){return this.persistence.replaceLivenessOwnership(s,n)}canIssueRelease(s){let n=this.releaseSequences.get(s);return!s.terminal||!n||n.seq>n.live.seq}desire(s,n){let a=this.rows.get(s)??{liveSeq:0,parked:0};if(a.desired?.desired.terminal&&!n.terminal)return;if(a.desired&&a.desired!==a.active)this.revoke(a.desired);let d={desired:n,desireSeq:++this.desireSeq,cancelled:!1,attempt:0,shutdownAttempted:!1,outcome:Promise.withResolvers()};d.outcome.promise.catch((c)=>{this.logger.warn(`Release row caller failed for ${s}: ${r(c)}`,c)}),a.desired=d,this.rows.set(s,a),this.evictNonTerminal(),this.start(s,a,d)}scheduleRetry(s,n){this.noteRelease(s);let a=s.sessionId,d=this.retries.get(a);if(!s.terminal&&d?.snapshot.terminal)return;if(!n.isStillOwed()){n.drop();return}let c=(d?.snapshot===s?d.attempt:0)+1;if(d?.handle!==void 0)this.timer.clearTimeout(d.handle);let p={snapshot:s,attempt:c,callbacks:n,shutdownAttempted:this.draining,isCurrent:()=>this.retries.get(a)===p};if(this.draining){this.retryDuringDrain(p,d);return}p.handle=this.timer.setTimeout(()=>{p.handle=void 0,n.run(p)},this.backoff.delayForAttempt(c)),p.handle.unref?.(),this.retries.set(a,p),this.logger.warn(`[SessionManager] The ${s.releaseReason} release of session ${a} is not persisted; retrying the write (attempt ${c})`)}retryDuringDrain(s,n){let{snapshot:a,attempt:d,callbacks:c}=s,p=a.sessionId;if(n?.snapshot===a&&n.shutdownAttempted){this.removeRetry(p),this.logger.warn(`[SessionManager] The ${a.releaseReason} release of session ${p} is still not persisted at shutdown`+(a.terminal?"; the session stays fenced only until this process exits":""));return}this.retries.set(p,s),this.logger.warn(`[SessionManager] The ${a.releaseReason} release of session ${p} is not persisted; retrying the write before shutdown (attempt ${d})`),this.trackDrainWrite(c.run(s))}cancelRetry(s){if(this.retries.get(s.sessionId)?.snapshot===s)this.removeRetry(s.sessionId)}removeRetry(s){let n=this.retries.get(s);if(n?.handle!==void 0)this.timer.clearTimeout(n.handle);this.retries.delete(s),this.resolveWaiters(s)}resolveWaiters(s){if(this.pending(s))return;for(let n of this.waiters.get(s)??[])n();this.waiters.delete(s)}beginReleaseDrain(){this.draining=!0}retryPendingNow(){return Array.from(this.retries.values(),(s)=>{if(s.handle!==void 0)this.timer.clearTimeout(s.handle),s.handle=void 0;return s.shutdownAttempted=!0,s.callbacks.run(s)})}stopRetryTimers(){for(let s of this.retries.values())if(s.handle!==void 0)this.timer.clearTimeout(s.handle),s.handle=void 0}setRetryBackoff(s){this.backoff=s}pendingNonTerminalReleases(){return this.nonTerminalSnapshots}recordPendingNonTerminalRelease(s){let n=this.nonTerminalSnapshots;if(!n.has(s.sessionId)&&n.size>=kn){let a=n.keys().next().value;if(a!==void 0)n.delete(a)}n.set(s.sessionId,s)}deletePendingNonTerminalRelease(s){this.nonTerminalSnapshots.delete(s)}clearPendingNonTerminalReleases(){this.nonTerminalSnapshots.clear()}evictNonTerminal(){let s=Array.from(this.rows.entries()).filter(([,d])=>d.desired&&!d.desired.desired.terminal);if(s.length<=kn)return;let[n,a]=s[0];this.cancel(n,a.desired.desired.snapshot)}pending(s){let n=this.rows.get(s);return this.retries.has(s)||n!==void 0&&(!!n.active||!!n.desired||n.parked>0)}pendingSnapshot(s){return this.rows.get(s)?.desired?.desired.snapshot}result(s){return this.rows.get(s)?.desired?.outcome.promise??Promise.resolve(!0)}settled(s){if(!this.pending(s))return Promise.resolve();let n=this.waiters.get(s)??new Set;return this.waiters.set(s,n),new Promise((a)=>n.add(a))}cancel(s,n){let a=this.rows.get(s);if(!a)return;if(a.desired?.desired.snapshot===n)this.revoke(a.desired),a.desired=void 0;if(a.active?.desired.snapshot===n)a.active.cancelled=!0;this.prune(s,a)}liftTerminal(s){let n=this.retries.get(s);if(n?.snapshot.terminal)this.cancelRetry(n.snapshot),this.cancel(s,n.snapshot);let a=this.rows.get(s);if(!a)return;if(a.liveSeq=++this.desireSeq,a.active?.desired.terminal)a.active.cancelled=!0;if(a.desired?.desired.terminal)this.cancel(s,a.desired.desired.snapshot)}revoke(s){if(s.cancelled=!0,s.handle!==void 0)this.timer.clearTimeout(s.handle);s.handle=void 0,s.outcome.resolve(!1)}current(s,n){return!n.cancelled&&(!n.desired.terminal||n.desireSeq>s.liveSeq)}start(s,n,a){if(n.active||a.handle!==void 0||n.desired!==a)return;if(!this.current(n,a)||!(a.desired.wanted?.()??!0)){this.cancel(s,a.desired.snapshot);return}n.active=a,this.track(this.run(s,n,a))}async run(s,n,a){let d=!1;try{let c=a.attempt>0;if(c&&!await this.prepare(n,a))return;let p=this.precondition(a),m=p instanceof Promise?await p:p;if(!this.current(n,a))throw new _(s);let S=this.issue(n,a,m),R=this.deadlineNow(),g=S.write(m),w=()=>{d=!0,n.parked++;let y=a.desired.parked?.();this.track(this.finishParked(s,n,a,{physical:g.catch(S.fallback),finish:y}))};try{await this.bounded(g,a,w)}catch(y){if(d)throw this.options.timeoutError(a.desired.snapshot);g=S.fallback(y);let b=this.deadlineNow()-R;await this.bounded(g,a,w,Math.max(0,this.options.timeoutMs-b))}if(c&&await a.desired.skipped?.())return;a.outcome.resolve(!0),await this.landed(a,!1,!1),this.complete(s,n,a)}catch(c){await this.failed(s,n,a,{error:c})}finally{this.unlock(s,n,a)}}deadlineNow(){return this.timer.monotonicNow?.()??this.timer.now()}precondition(s){return s.attempt===0&&s.desired.initialPrecondition?s.desired.initialPrecondition:s.desired.precondition()}async prepare(s,n){if(!this.current(s,n))throw new _(n.desired.snapshot.sessionId);if(n.desired.due&&!await n.desired.due(this.draining))return!1;if(await n.desired.beforeWrite?.(),!this.current(s,n))throw new _(n.desired.snapshot.sessionId);return!0}issue(s,n,a){let{snapshot:d}=n.desired,c=(S)=>{if(!this.current(s,n))return Promise.reject(new _(d.sessionId));return this.persistence.markReleased(d.sessionId,ov(d.releaseReason),d.releasedAtMs,{reason:d.releaseReason,...S})},p;return{write:c,fallback:(S)=>{if(!(S instanceof _)||!n.desired.fallback)throw S;return p??=n.desired.fallback(S,a,c)}}}bounded(s,n,a,d=this.options.timeoutMs){return l(s,{timer:this.timer,timeoutMs:d,unref:!0,label:"Session release persistence",timeoutError:()=>this.options.timeoutError(n.desired.snapshot),onTimeout:a})}async landed(s,n,a){for(let d of this.listeners)await d({snapshot:s.desired.snapshot,late:n,refused:a})}async failed(s,n,a,{error:d,late:c=!1}){if(d instanceof _){if(!a.desired.terminal&&await a.desired.skipped?.())return;this.logger.debug(`Release row refused for ${s}`),a.outcome.resolve(!0),await this.landed(a,c,!0),this.complete(s,n,a);return}this.logger.warn(`Release row write failed for ${s}: ${r(d)}`,d);try{a.outcome.resolve(a.desired.failure?.(d)??!1)}catch(p){a.outcome.reject(p)}}async finishParked(s,n,a,{physical:d,finish:c}){try{await d,await this.landed(a,!0,!1),this.complete(s,n,a)}catch(p){await this.failed(s,n,a,{error:p,late:!0})}finally{c?.(),n.parked--,this.prune(s,n)}}schedule(s,n,a){if(n.desired!==a||!this.current(n,a))return;if(this.draining&&a.shutdownAttempted){this.logger.warn(`Release row still not persisted at shutdown for ${s}`),this.complete(s,n,a);return}if(a.attempt++,this.draining){a.shutdownAttempted=!0,this.start(s,n,a);return}a.handle=this.timer.setTimeout(()=>{a.handle=void 0,this.start(s,n,a)},this.backoff.delayForAttempt(a.attempt)),a.handle.unref?.()}complete(s,n,a){if(n.desired===a)n.desired=void 0;if(a.handle!==void 0)this.timer.clearTimeout(a.handle);this.prune(s,n)}unlock(s,n,a){if(n.active===a)n.active=void 0;if(n.desired===a)this.schedule(s,n,a);else if(n.desired)this.start(s,n,n.desired);this.prune(s,n)}prune(s,n){if(n.active||n.desired||n.parked>0)return;this.rows.delete(s),this.resolveWaiters(s)}track(s){let n=s.catch((a)=>{this.logger.warn(`Release row listener failed: ${r(a)}`,a)});this.work.add(n),n.then(()=>this.work.delete(n))}trackDrainWrite(s){this.drainWrites.add(s),s.then(()=>this.drainWrites.delete(s))}pendingDrainWrites(){return this.drainWrites}async drain(){this.beginReleaseDrain();let s=this.retryPendingNow();for(let[n,a]of this.rows){if(!a.desired)continue;if(a.desired.handle!==void 0)this.timer.clearTimeout(a.desired.handle);if(a.desired.handle=void 0,!a.active)this.schedule(n,a,a.desired)}if(s.length>0)await Promise.allSettled(s);while(this.work.size||this.rows.size||this.drainWrites.size||this.retries.size)await Promise.all([...this.work,...this.drainWrites,...Array.from(new Set([...this.rows.keys(),...this.retries.keys()]),(n)=>this.settled(n))])}stop(){this.stopRetryTimers();for(let[s,n]of this.rows){if(n.desired?.handle!==void 0)this.timer.clearTimeout(n.desired.handle);if(n.desired)n.desired.handle=void 0;if(n.desired&&!n.desired.desired.terminal)this.cancel(s,n.desired.desired.snapshot)}}onRowLanded(s){this.listeners.add(s)}}class Ot{logger;illegalTransitionCount=0;positions=new Map;baselineAfterReset=!1;constructor(s){this.logger=s}reset(){this.positions.clear(),this.baselineAfterReset=!0}forget(s){this.positions.delete(s)}check(s,n,a,d){let c=this.positions.get(s)??(this.baselineAfterReset?a:{tag:"absent"});if(a.tag==="absent")this.positions.delete(s);else this.positions.set(s,{tag:a.tag,fence:a.fence});if(c.tag===a.tag&&c.fence===a.fence)return;let p=Ge(c,a);if(p.ok)return;let m=ln.has(`${n}:${c.tag}:${a.tag}`)||an.some((R)=>R.event===n&&R.from===c.tag&&R.to===a.tag&&Ge(c,{tag:R.via}).ok&&Ge({tag:R.via},a).ok);this.illegalTransitionCount++;let S=`[SlotTransitionGuard] uuid=${s} event=${n}: ${p.reason}`;if(m){this.logger.debug(S);return}if(d==="throw")throw new qe(c,a,S);this.logger.warn(S)}}class Dt{view;legacy;logger;notifySettled;currentMode="log";get mode(){return this.currentMode}set mode(s){if(s==="off")this.transitionGuard.reset();this.currentMode=s}transitionGuard;constructor(s,n,a,d){this.view=s;this.legacy=n;this.logger=a;this.notifySettled=d;this.transitionGuard=new Ot(a)}setReferencePredicates(s){this.legacy=s}check(s,n,a=[]){if(this.notifySettled?.(s),this.mode==="off")return;if(this.mode==="throw"){this.observe(s,n),this.compare(s,n,a);return}try{this.observe(s,n),this.compare(s,n,a)}catch(d){this.logger.warn(`[SessionSlotShadowProbe] uuid=${s} event=${n}: ${r(d)}`)}}observe(s,n){if(Hr.has(n))this.transitionGuard.check(s,n,Ke(this.view(),s),this.mode==="throw"?"throw":"log")}readIdentities(s,n,a){let d=ze(s,n);return[...new Set([s.sessions.get(n),s.releaseOps.get(n)?.session,s.latestFinalizedIdentities.get(n)?.deref(),...a])].filter((p)=>p!==void 0).map((p)=>({derived:d===p,legacy:this.legacy.isLatestSessionIdentity(p)}))}compare(s,n,a){if(!this.legacy)return;let d=this.view(),c=Ke(d,s),p=d.sessions.get(s),m=p!==void 0&&(c.tag==="live"||c.tag==="rebinding"||c.tag==="releasing"&&c.fence==="none"),S={current:m,admitted:m&&!d.isReleasing(p),recreated:Te(c.tag),known:Xs(c)},R={current:p!==void 0&&this.legacy.isCurrentSession(p),admitted:p!==void 0&&this.legacy.isAdmittedForAutomation(p),recreated:this.legacy.isSessionBeingRecreated(s),known:this.legacy.isKnownSessionId(s)},g=this.readIdentities(d,s,a);if(JSON.stringify(S)===JSON.stringify(R)&&g.every((y)=>y.derived===y.legacy))return;let w=`[SessionSlotShadowProbe] uuid=${s} event=${n} slot=${JSON.stringify(c)} derived=${JSON.stringify(S)} legacy=${JSON.stringify(R)} identities=${JSON.stringify(g)}`;if(this.mode==="throw")throw Error(w);this.logger.debug(w)}}var Hr=new Set(["creation-start","creation-end","assignment-start","assignment-end","published","rebind-start","rebind-end","release-start","release-end","unpublished","plan-label-fence-lifted","recovered-terminal-intent-deleted"]);class QI extends Qs{forwardersHost=this.createForwardersHost();createForwardersHost(){let s=this;return{get rowWriter(){return s.rowWriter},get configuration(){return s.configuration},get recoveredIntents(){return s.recoveredIntents},get restoreHealth(){return s.wiring.restoreHealth},get sessionClock(){return s.sessionClock},get callbacks(){return s.wiring.callbacks},get deviceCleanupQuarantine(){return s.deviceCleanupQuarantine},get bookkeeping(){return s.wiring.bookkeeping},get forcedStuckRelease(){return s.forcedStuckRelease},get activityClocks(){return s.wiring.activityClocks},get creationGuard(){return s.wiring.creationGuard},get persistedAdmission(){return s.wiring.persistedAdmission},get admission(){return s.wiring.admission},get leaseExpiry(){return s.wiring.leaseExpiry},get acquisition(){return s.wiring.acquisition},get rehydration(){return s.wiring.rehydration},get rebinding(){return s.wiring.rebinding},get queries(){return s.queries},get slotShadowProbe(){return s.slotShadowProbe},get releaseRequests(){return s.wiring.releaseRequests},get stateRestore(){return s.stateRestore},get cache(){return s.wiring.cache},get planLabelsLifecycle(){return s.wiring.planLabelsLifecycle},get liveness(){return s.liveness},get cleanup(){return s.cleanup}}}waitOutRebindOf(s){return this.wiring.supersededRows.waitOutRebindOf(s)}waitOutReleaseOf(s){return this.wiring.supersededRows.waitOutReleaseOf(s)}waitOutRecreationOf(s){return this.wiring.supersededRows.waitOutRecreationOf(s)}configuration=new gs;get stallProbe(){return this.configuration.stallProbe}set stallProbe(s){this.configuration.stallProbe=s}get daemonSessionId(){return this.configuration.daemonSessionId}set daemonSessionId(s){this.configuration.daemonSessionId=s}get liveDaemonSessionIds(){return this.configuration.liveDaemonSessionIds}set liveDaemonSessionIds(s){this.configuration.liveDaemonSessionIds=s}get acceptingSessionCreations(){return this.configuration.acceptingSessionCreations}set acceptingSessionCreations(s){this.configuration.acceptingSessionCreations=s}get observerSessions(){return this.configuration.observerSessions}set observerSessions(s){this.configuration.observerSessions=s}get activeSessionExecutionChecker(){return this.configuration.activeSessionExecutionChecker}set activeSessionExecutionChecker(s){this.configuration.activeSessionExecutionChecker=s}get livenessOwnerCallInFlightReader(){return this.configuration.livenessOwnerCallInFlightReader}set livenessOwnerCallInFlightReader(s){this.configuration.livenessOwnerCallInFlightReader=s}get ownerConnectedAtReader(){return this.configuration.ownerConnectedAtReader}set ownerConnectedAtReader(s){this.configuration.ownerConnectedAtReader=s}get sessionExecutionDeadlineLookup(){return this.configuration.sessionExecutionDeadlineLookup}set sessionExecutionDeadlineLookup(s){this.configuration.sessionExecutionDeadlineLookup=s}get expiryReleaseExecutionCanceller(){return this.configuration.expiryReleaseExecutionCanceller}set expiryReleaseExecutionCanceller(s){this.configuration.expiryReleaseExecutionCanceller=s}get deviceAcquisitionExecutionCanceller(){return this.configuration.deviceAcquisitionExecutionCanceller}set deviceAcquisitionExecutionCanceller(s){this.configuration.deviceAcquisitionExecutionCanceller=s}get recoveryExpiryReleaseHandler(){return this.configuration.recoveryExpiryReleaseHandler}set recoveryExpiryReleaseHandler(s){this.configuration.recoveryExpiryReleaseHandler=s}get managedExecutionRecoveryListener(){return this.configuration.managedExecutionRecoveryListener}set managedExecutionRecoveryListener(s){this.configuration.managedExecutionRecoveryListener=s}get lateRehydrationListener(){return this.configuration.lateRehydrationListener}set lateRehydrationListener(s){this.configuration.lateRehydrationListener=s}get releaseDeviceHold(){return this.configuration.releaseDeviceHold}set releaseDeviceHold(s){this.configuration.releaseDeviceHold=s}wiring=this.createCollaboratorHost();queries=new Zs(this.wiring.host,{getAllSessions:()=>this.getAllSessions(),getAssignedDevices:()=>this.getAssignedDevices()});cleanup=this.createCleanup();createCleanup(){let s=this;return new fs(this.wiring.host,{get CLEANUP_INTERVAL_MS(){return s.CLEANUP_INTERVAL_MS},cleanupExpiredSessions:()=>this.cleanupExpiredSessions(),get rehydrationFollowUpTimer(){return s.rehydrationFollowUpTimer},set rehydrationFollowUpTimer(n){s.rehydrationFollowUpTimer=n}})}createCollaboratorHost(){return new Ct({expireIfDue:(...a)=>this.expireIfDue(...a),finishReleaseForcedBeforeStart:(...a)=>this.finishReleaseForcedBeforeStart(...a),liftTerminalFence:(...a)=>this.liftTerminalFence(...a),retireRestorations:(...a)=>this.retireRestorations(...a),withReleaseReason:(...a)=>this.withReleaseReason(...a),persistAndPublishSession:(...a)=>this.persistAndPublishSession(...a),isSessionExpired:(...a)=>this.isSessionExpired(...a),recordSessionActivity:(...a)=>this.recordSessionActivity(...a),getSessionForNewExecution:(...a)=>this.getSessionForNewExecution(...a),refuseControlCallOnLapsedOwnerLease:(...a)=>this.refuseControlCallOnLapsedOwnerLease(...a),peekTerminalAnswerForEndedSession:(...a)=>this.peekTerminalAnswerForEndedSession(...a),releaseSessionPastIdleDeadline:(...a)=>this.releaseSessionPastIdleDeadline(...a),liveBaseOfDerivedId:(...a)=>this.liveBaseOfDerivedId(...a),retryPendingTerminalReleasesNow:(...a)=>this.retryPendingTerminalReleasesNow(...a),getPendingDeviceCleanup:(...a)=>this.getPendingDeviceCleanup(...a),armPendingDeviceCleanupCaps:(...a)=>this.armPendingDeviceCleanupCaps(...a),cancelExecutionsOverriddenByExpiry:(...a)=>this.cancelExecutionsOverriddenByExpiry(...a),getSession:(...a)=>this.getSession(...a),getTerminalReleaseSnapshot:(...a)=>this.getTerminalReleaseSnapshot(...a),waitForSessionSetup:(...a)=>this.waitForSessionSetup(...a),restoreIncarnationIsCurrent:(...a)=>this.restoreIncarnationIsCurrent(...a),waitForIdentityReplacement:(...a)=>this.waitForIdentityReplacement(...a),isTerminalReleaseRetryCurrent:(...a)=>this.isTerminalReleaseRetryCurrent(...a),retryTerminalReleaseWrite:(...a)=>this.retryTerminalReleaseWrite(...a),dispatchDeviceRestore:(...a)=>this.dispatchDeviceRestore(...a),sessionNow:(...a)=>this.sessionNow(...a),isSessionBeingRecreated:(...a)=>this.isSessionBeingRecreated(...a),sessionClockToWall:(...a)=>this.sessionClockToWall(...a),persistSessionRelease:(...a)=>this.persistSessionRelease(...a),recoverPersistedRow:(...a)=>this.recoverPersistedRow(...a),recoveredRowOwner:(...a)=>this.recoveredRowOwner(...a),recoveryLivenessFromPersisted:(...a)=>this.recoveryLivenessFromPersisted(...a),applyRecoveredTerminalReleaseIntents:(...a)=>this.applyRecoveredTerminalReleaseIntents(...a),createSession:(...a)=>this.createSession(...a),rebindSession:(...a)=>this.rebindSession(...a),flushDeferredRebindCleanups:(...a)=>this.flushDeferredRebindCleanups(...a),trackReleaseDrainWrite:(...a)=>this.trackReleaseDrainWrite(...a),getSessionForDevice:(...a)=>this.getSessionForDevice(...a),trackPendingTeardownCleanup:(...a)=>this.trackPendingTeardownCleanup(...a),registerPendingDeviceCleanup:(...a)=>this.registerPendingDeviceCleanup(...a),isCurrentSession:(...a)=>this.isCurrentSession(...a),persistSession:(...a)=>this.persistSession(...a),scheduleTerminalReleaseRetry:(...a)=>this.scheduleTerminalReleaseRetry(...a),recordPendingNonTerminalRelease:(...a)=>this.recordPendingNonTerminalRelease(...a),getLegacyLifecycleView:(...a)=>this.getLegacyLifecycleView(...a),isAdmittedForAutomation:(...a)=>this.isAdmittedForAutomation(...a),cancelExecutionsCutByRelease:(...a)=>this.cancelExecutionsCutByRelease(...a),releaseSessionForReason:(...a)=>this.releaseSessionForReason(...a),releaseSession:(...a)=>this.releaseSession(...a),deviceHeldForLateRead:(...a)=>this.deviceHeldForLateRead(...a),unlessBaseEnded:(...a)=>this.unlessBaseEnded(...a),wallToSessionClock:(...a)=>this.wallToSessionClock(...a),peekSession:(...a)=>this.peekSession(...a),judgedLeaseHeartbeat:(...a)=>this.judgedLeaseHeartbeat(...a),ownershipSessionUuid:(...a)=>this.ownershipSessionUuid(...a),getBaseSessionOfDerivedLabel:(...a)=>this.getBaseSessionOfDerivedLabel(...a),getReleasingSession:(...a)=>this.getReleasingSession(...a),findSession:(...a)=>this.findSession(...a),updateSessionCache:(...a)=>this.updateSessionCache(...a),getDeviceReadiness:(...a)=>this.getDeviceReadiness(...a),invalidateAutomationReadiness:(...a)=>this.invalidateAutomationReadiness(...a),getBiometricEnrollment:(...a)=>this.getBiometricEnrollment(...a),getNetworkCondition:(...a)=>this.getNetworkCondition(...a),recordRestartRecoveryActivity:(...a)=>this.recordRestartRecoveryActivity(...a),getOrCreateSession:(...a)=>this.getOrCreateSession(...a),terminalizeExpiredPersistedSession:(...a)=>this.terminalizeExpiredPersistedSession(...a)},{stateRestore:()=>this.stateRestore,timer:()=>this.timer,acceptingSessionCreations:()=>this.acceptingSessionCreations,deviceSessionRepository:()=>this.deviceSessionRepository,recoveredIntents:()=>this.recoveredIntents,getBarrier:()=>this.getBarrier?.bind(this),sessionSlots:()=>this.sessionSlots,daemonSessionId:()=>this.daemonSessionId,activeSessionExecutionChecker:()=>this.activeSessionExecutionChecker?.bind(this),sessions:()=>this.sessions,superseded:()=>this.superseded,liveDaemonSessionIds:()=>this.liveDaemonSessionIds?.bind(this),SESSION_TIMEOUT_MS:()=>this.SESSION_TIMEOUT_MS,lateRehydrationListener:()=>this.lateRehydrationListener,slotShadowProbe:()=>this.slotShadowProbe,deviceHealth:()=>this.deviceHealth,persistedRowGenerations:()=>this.persistedRowGenerations,releaseRowGenerations:()=>this.releaseRowGenerations,finalizedSessionReleases:()=>this.finalizedSessionReleases,supersededRowReassertRetries:()=>this.supersededRowReassertRetries,rowWriter:()=>this.rowWriter,forcedStuckRelease:()=>this.forcedStuckRelease,restartReleasePersistence:()=>this.restartReleasePersistence,restartRecoveryActivityAt:()=>this.restartRecoveryActivityAt,stallProbe:()=>this.stallProbe?.bind(this),livenessOwnerCallInFlightReader:()=>this.livenessOwnerCallInFlightReader,liveness:()=>this.liveness,sessionExecutionDeadlineLookup:()=>this.sessionExecutionDeadlineLookup?.bind(this),expiryReleaseExecutionCanceller:()=>this.expiryReleaseExecutionCanceller?.bind(this),recoveryExpiryReleaseHandler:()=>this.recoveryExpiryReleaseHandler,releaseDeviceHold:()=>this.releaseDeviceHold,planLabels:()=>this.planLabels,observerSessions:()=>this.observerSessions,deviceSessionMap:()=>this.deviceSessionMap,releaseRowSessions:()=>this.releaseRowSessions,replacedRestoreGenerations:()=>this.replacedRestoreGenerations,volatileTerminalReleaseIntents:()=>this.volatileTerminalReleaseIntents,retiredCreationRows:()=>this.retiredCreationRows,terminalReleaseJournal:()=>this.terminalReleaseJournal,leaseExpiry:()=>this.wiring.leaseExpiry,sessionSetupPromises:()=>this.sessionSetupPromises,deviceCleanupQuarantine:()=>this.deviceCleanupQuarantine,releaseCallbacks:()=>this.releaseCallbacks,sessionDeviceReboundEmitter:()=>this.sessionDeviceReboundEmitter,deviceOwnershipCallbacks:()=>this.deviceOwnershipCallbacks,createdCallbacks:()=>this.createdCallbacks,deviceUnboundCallbacks:()=>this.deviceUnboundCallbacks,managedExecutionRecoveryListener:()=>this.managedExecutionRecoveryListener?.bind(this),managedExecutionRecoveries:()=>this.managedExecutionRecoveries,deferredAcquisitionCancellations:()=>this.deferredAcquisitionCancellations,deviceAcquisitionExecutionCanceller:()=>this.deviceAcquisitionExecutionCanceller.bind(this),ownerConnectedAtReader:()=>this.ownerConnectedAtReader,identityReplacementFences:()=>this.identityReplacementFences,activeRestoreControllers:()=>this.activeRestoreControllers})}sessions=new Map;deviceSessionMap=new Map;get rehydrationFollowUpTimer(){return this.wiring.rehydration.rehydrationFollowUpTimer}set rehydrationFollowUpTimer(s){this.wiring.rehydration.rehydrationFollowUpTimer=s}timer;sessionClock;sessionDeviceReboundEmitter;releaseCallbacks=[];restartReleasePersistence=new WeakMap;planLabels=new Ss({hasSession:(s)=>this.sessions.has(s)});createdCallbacks=[];deviceUnboundCallbacks=[];deviceOwnershipCallbacks=new Set;rowWriter;terminalReleaseJournal=new hs;volatileTerminalReleaseIntents=new Map;finalizedSessionReleases=new WeakMap;liveness;recoveredIntents;forcedStuckRelease;get persistedRowGenerations(){return this.wiring.activityPersistence.persistedRowGenerations}get retiredCreationRows(){return this.wiring.creation.retiredCreationRows}get releaseRowGenerations(){return this.wiring.releasePersistence.releaseRowGenerations}get releaseRowSessions(){return this.wiring.releasePersistence.releaseRowSessions}sessionSetupPromises=new Set;deviceCleanupQuarantine;sessionSlots=new Ys({rowPending:{pending:(s)=>this.rowWriter.pending(s)},onFinalizedIdentityCollected:(s)=>this.slotShadowProbe.transitionGuard.forget(s)});get restartRecoveryActivityAt(){return this.wiring.persistedAdmission.restartRecoveryActivityAt}supersededRowReassertRetries={retry:(s)=>this.wiring.supersededRows.retryOwedSupersededRowReassert(s),retryDuringDrain:(s)=>this.wiring.supersededRows.retryOwedSupersededRowReassertDuringDrain(s)};deviceSessionRepository;getBarrier;stateRestore;setSupersededRowReassertBackoff(s){this.superseded.setBackoff(s)}get superseded(){return this.rowWriter.superseded}recoveredRowOwner(){return this.configuration.recoveredRowOwner()}recordSessionClientName(s,n){let a=this.sessions.get(s);if(a)a.clientName=n}get deviceHealth(){return this.wiring.restoreHealth.deviceHealth}set deviceHealth(s){this.wiring.restoreHealth.deviceHealth=s}get identityReplacementFences(){return this.wiring.restoreHealth.identityReplacementFences}get replacedRestoreGenerations(){return this.wiring.restoreHealth.replacedRestoreGenerations}get activeRestoreControllers(){return this.wiring.restoreHealth.activeRestoreControllers}waitForIdentityReplacement(s,n){return this.wiring.restoreHealth.waitForIdentityReplacement(s,n)}dispatchDeviceRestore(s,n,a=this.replacedRestoreGenerations.get(s)??0,d){return this.wiring.recoveryPublication.dispatchDeviceRestore(s,n,a,d)}restoreIncarnationIsCurrent(s){return this.wiring.restoreHealth.restoreIncarnationIsCurrent(s)}clearRestoreHealth(s,n){return this.wiring.restoreHealth.clearRestoreHealth(s,n)}abandonRestore(s,n,a,d=ou){return this.wiring.restoreHealth.abandonRestore(s,n,a,d)}deferredAcquisitionCancellations=new Map;SESSION_TIMEOUT_MS=wB();CLEANUP_INTERVAL_MS=300000;static DEFAULT_HEARTBEAT_TIMEOUT_MS=Pg;constructor(s=i,n=new MS({timer:s}),a={}){super();let d=new js(this.wiring.host,{trackSessionSetup:(...c)=>this.trackSessionSetup(...c),clearRestoreHealth:(...c)=>this.clearRestoreHealth(...c),abandonRestore:(...c)=>this.abandonRestore(...c),trackPendingDeviceCleanup:(...c)=>this.trackPendingDeviceCleanup(...c),livenessOwnerView:(...c)=>this.livenessOwnerView(...c),hasUnissuedActivity:(...c)=>this.hasUnissuedActivity(...c),getBarrier:()=>this.getBarrier(),setJournal:(c)=>{this.terminalReleaseJournal=c}});this.timer=s,this.sessionDeviceReboundEmitter=a.sessionDeviceReboundEmitter,this.sessionClock=new UP(s),this.deviceCleanupQuarantine=d.createDeviceCleanupQuarantine(s),this.deviceSessionRepository=Si(n,{toWall:(c)=>this.sessionClockToWall(c),toSessionClock:(c)=>this.wallToSessionClock(c)}),this.rowWriter=Qe.create({persistence:this.deviceSessionRepository,timer:s,backoff:ai,logger:e,timeoutMs:Os,timeoutError:F}),this.getBarrier=a.barrier??Jt,this.stateRestore=d.createStateRestore(s,a),this.recoveredIntents=d.createRecoveredIntents(s),this.forcedStuckRelease=d.createForcedStuckRelease(s),this.liveness=d.createLiveness(),this.startCleanupTimer()}setRowWriter(s){this.rowWriter=s}getTimer(){return this.timer}sessionClockToWall(s){return this.timer.now()+(s-this.sessionNow())}wallToSessionClock(s){return this.sessionNow()+(s-this.timer.now())}async drainPendingDeviceCleanups(s){return this.flushDeferredRebindCleanups(),await this.deviceCleanupQuarantine.drain(s)}armPendingDeviceCleanupCaps(s){this.deviceCleanupQuarantine.armCaps(s)}async finishReleaseForcedBeforeStart(s){return this.sessionSlots.unmarkReleasing(s),null}managedExecutionRecoveries=new Map;persistAndPublishSession(s,n,a,d){return this.wiring.creation.persistAndPublishSession(s,n,a,d)}recordRestartRecoveryActivity(s){return this.wiring.persistedAdmission.recordRestartRecoveryActivity(s)}terminalizeExpiredPersistedSession(s,n){return this.wiring.persistedAdmission.terminalizeExpiredPersistedSession(s,n)}getSession(s){return this.expireIfDue(s,!1)}expireIfDue(s,n,a,d=!0){return this.wiring.leaseExpiry.expireIfDue(s,n,a,d)}releaseSessionPastIdleDeadline(s,n){return this.wiring.leaseExpiry.releaseSessionPastIdleDeadline(s,n)}recoverPersistedRow(s,n,a,d){return this.wiring.recoveryPublication.recoverPersistedRow(s,n,a,d)}reserveDevicesForRehydration(s,n,a){return this.wiring.rehydration.reserveDevicesForRehydration(s,n,a)}releaseRehydrationReservation(s,n){return this.wiring.rehydration.releaseRehydrationReservation(s,n)}slotShadowProbe=new Dt(()=>this.getLegacyLifecycleView(),void 0,e,(s)=>this.sessionSlots.notifySettled(s));setSlotShadowProbeMode(s){this.slotShadowProbe.mode=s}releaseSessionForReason(s,n,a={}){return this.wiring.releaseRequests.releaseSessionForReason(s,n,a)}trackPendingTeardownCleanup(s,n){this.deviceCleanupQuarantine.trackTeardown(s,n)}withReleaseReason(s,n,a){return this.wiring.releaseCommit.withReleaseReason(s,n,a)}persistSessionRelease(s,n=!1,a){return this.wiring.releaseWrite.persistSessionRelease(s,n,a)}liftTerminalFence(s,n,a=!1,d){return this.wiring.releasePersistence.liftTerminalFence(s,n,a,d)}scheduleTerminalReleaseRetry(s){return this.wiring.releasePersistence.scheduleTerminalReleaseRetry(s)}trackReleaseDrainWrite(s){return this.wiring.releasePersistence.trackReleaseDrainWrite(s)}isTerminalReleaseRetryCurrent(s){return this.wiring.releasePersistence.isTerminalReleaseRetryCurrent(s)}retryTerminalReleaseWrite(s){return this.wiring.releasePersistence.retryTerminalReleaseWrite(s)}retriedReleaseWritePrecondition(s){return this.wiring.releasePersistence.retriedReleaseWritePrecondition(s)}retryPendingTerminalReleasesNow(){return this.wiring.releasePersistence.retryPendingTerminalReleasesNow()}isSessionBeingRecreated(s){return this.wiring.releasePersistence.isSessionBeingRecreated(s)}recordPendingNonTerminalRelease(s){return this.wiring.releasePersistence.recordPendingNonTerminalRelease(s)}waitForSessionSetup(s,n,a="release"){return this.wiring.bookkeeping.waitForSessionSetup(s,n,a)}retireRestorations(s,n){for(let a of[this.stateRestore.clockRestores,this.stateRestore.rotationRestores,this.stateRestore.screenReaderRestores])if(n==="removal"||a.policy.retiredOnIncarnationBump)a.retire(s)}trackPendingDeviceCleanup(s,n){this.deviceCleanupQuarantine.track(s,n)}updateSessionCache(s,n){return this.wiring.cache.updateSessionCache(s,n)}setLastHierarchy(s,n){return this.wiring.cache.setLastHierarchy(s,n)}setKeepScreenAwake(s,n){this.updateSessionCache(s,{keepScreenAwake:n})}invalidateAutomationReadinessForDevice(s,n){return this.wiring.cache.invalidateAutomationReadinessForDevice(s,n)}resetDeviceReadinessForDevice(s){return this.wiring.cache.resetDeviceReadinessForDevice(s)}setDeviceLabels(s,n){if(this.findSession(s))this.planLabels.indexDerivedLabels(s,n);this.updateSessionCache(s,{deviceLabels:n})}liveBaseOfDerivedId(s){return this.wiring.planLabelsLifecycle.liveBaseOfDerivedId(s)}getSessionCache(s){return this.wiring.cache.getSessionCache(s)}peekSession(s){return this.unlessBaseEnded(this.expireIfDue(s,!1,void 0,!1))}unlessBaseEnded(s){return this.wiring.admission.unlessBaseEnded(s)}livenessOwnerView(s){return this.wiring.leaseExpiry.livenessOwnerView(s)}refuseControlCallOnLapsedOwnerLease(s,n,a,d){return this.wiring.admission.refuseControlCallOnLapsedOwnerLease(s,n,a,d)}isSessionExpired(s){return this.wiring.leaseExpiry.isSessionExpired(s)}cancelExecutionsOverriddenByExpiry(s,n,a){return this.wiring.leaseExpiry.cancelExecutionsOverriddenByExpiry(s,n,a)}isSessionExpiredForNewExecution(s,n){return this.wiring.leaseExpiry.isSessionExpiredForNewExecution(s,n)}isLateExecutionWhileEarlierWorkIsActive(s,n,a="any"){return this.wiring.leaseExpiry.isLateExecutionWhileEarlierWorkIsActive(s,n,a)}startCleanupTimer(){this.cleanup.startCleanupTimer()}get testHooks(){return{sessions:this.sessions,wiring:this.wiring}}persistSession(s,n,a,d){return this.wiring.activityPersistence.persistSession(s,n,a,d)}recordPersistedRowGeneration(s,n){return this.wiring.activityPersistence.recordPersistedRowGeneration(s,n)}recoveryLivenessFromPersisted(s){return this.wiring.recovery.recoveryLivenessFromPersisted(s)}recordSessionActivity(s){return this.wiring.activityPersistence.recordSessionActivity(s)}persistSessionActivity(s,n){return this.wiring.activityPersistence.persistSessionActivity(s,n)}hasUnissuedActivity(s){return this.wiring.activityPersistence.hasUnissuedActivity(s)}recordHeartbeat(s){this.liveness.recordHeartbeat(s)}restartPreFirstHeartbeatGrace(s){this.liveness.restartPreFirstHeartbeatGrace(s)}claimLivenessOwnership(s,n){return this.liveness.claimLivenessOwnership(s,n)}releaseLivenessOwnership(s,n){return this.liveness.releaseLivenessOwnership(s,n)}hasLivenessOwnership(s,n){return this.liveness.hasLivenessOwnership(s,n)}claimUnownedLivenessOwnership(s,n){return this.liveness.claimUnownedLivenessOwnership(s,n)}bindAcquiredLivenessOwnerToken(s,n){return this.liveness.bindAcquiredLivenessOwnerToken(s,n)}adoptCliLivenessPolicy(s,n){return this.liveness.adoptCliLivenessPolicy(s,n)}adoptManagedExecutionLivenessPolicy(s,n={}){return this.liveness.adoptManagedExecutionLivenessPolicy(s,n)}restoreHeartbeatLivenessPolicy(s){return this.liveness.restoreHeartbeatLivenessPolicy(s)}}
4
+ export{ni,Xd,zI,bo,JN,Qy,MS,jI,ru,vq,KI,GI,bq,Sq,ev,tv,rv,wq,YI,nu,OZ,MZ,NZ,NS,FS,XN,_a,iu,ZN,QN,ou,Rq,DA,e0,wr,Os,t0,r0,su,n0,JI,A4,i0,cc,ym,LS,nv,Xt,au,iv,T4,ph,o0,XI,Pq,Zd,dc,Aq,mh,Tq,FZ,s0,ta,ZI,OA,kq,Eq,k4,a0,c0,d0,Iq,QI};
5
5
 
6
- //# debugId=006E5B2B9071AE8364756E2164756E21
6
+ //# debugId=1BB1C23DA881B30464756E2164756E21