@reason-machines/cli-linux-x64 0.2.419 → 0.2.420

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 (160) hide show
  1. package/THIRD_PARTY_NOTICES.txt +8 -7
  2. package/bin/reason +2 -2
  3. package/bin/runtime/srt/sandbox-runtime.mjs +52 -52
  4. package/bin/vm-hands/api-18d75dfn.js +2 -0
  5. package/bin/vm-hands/api-credentials-3vhge1ap.js +2 -0
  6. package/bin/vm-hands/connect-cli-s5smpb2n.js +2 -0
  7. package/bin/vm-hands/custom-endpoint-device-17t4efc4.js +2 -0
  8. package/bin/vm-hands/desktop-account-6sjrxy69.js +2 -0
  9. package/bin/vm-hands/device-workspace-s50q53sz.js +2 -0
  10. package/bin/vm-hands/fsevents-p3d8kd0p.js +2 -0
  11. package/bin/vm-hands/hands-worker-source-kddz4y15.js +2 -0
  12. package/bin/vm-hands/index-wrw65904.js +12818 -0
  13. package/bin/vm-hands/install-receipt-ysa70fvh.js +2 -0
  14. package/bin/vm-hands/local-automation-3amth2kd.js +2 -0
  15. package/bin/vm-hands/local-capabilities-hgmepv53.js +2 -0
  16. package/bin/vm-hands/local-desktop-users-cppjjr81.js +2 -0
  17. package/bin/vm-hands/local-display-mac-0qz3b627.js +2 -0
  18. package/bin/vm-hands/local-display-session-e4n5hx0v.js +2 -0
  19. package/bin/vm-hands/local-display-video-28gmymr4.js +2 -0
  20. package/bin/vm-hands/local-managed-process-2313kw42.js +2 -0
  21. package/bin/vm-hands/local-pty-session-rpk05ap5.js +2 -0
  22. package/bin/vm-hands/managed-runtime-3z71qd28.js +2 -0
  23. package/bin/vm-hands/network-contract-trkxqc0w.js +2 -0
  24. package/bin/vm-hands/package-xqbhdf15.js +2 -0
  25. package/bin/vm-hands/permissions-9yn6rcvc.js +2 -0
  26. package/bin/vm-hands/reason-hands-protocol-xn3ddz70.js +2 -0
  27. package/bin/vm-hands/serve-service-s57v1tq2.js +2 -0
  28. package/bin/vm-hands/status-grxd9vg7.js +10 -0
  29. package/bin/vm-hands/version-bqwnackx.js +2 -0
  30. package/bin/vm-hands/vm-hands-entry-lite-004yshd1.js +452 -0
  31. package/bin/vm-hands/vm-hands-entry-lite-1xwxazmz.js +3 -0
  32. package/bin/vm-hands/{vm-hands-entry-lite-agsp101y.js → vm-hands-entry-lite-21qpxvt8.js} +2 -2
  33. package/bin/vm-hands/vm-hands-entry-lite-2n4n9cs8.js +126 -0
  34. package/bin/vm-hands/vm-hands-entry-lite-2rd6t7ry.js +9 -0
  35. package/bin/vm-hands/vm-hands-entry-lite-37kgczw8.js +3 -0
  36. package/bin/vm-hands/vm-hands-entry-lite-3krzmhkk.js +3 -0
  37. package/bin/vm-hands/vm-hands-entry-lite-4vgwtn85.js +52 -0
  38. package/bin/vm-hands/vm-hands-entry-lite-4vks5phw.js +42 -0
  39. package/bin/vm-hands/vm-hands-entry-lite-50zbqwkv.js +3 -0
  40. package/bin/vm-hands/vm-hands-entry-lite-5dtfehjv.js +3 -0
  41. package/bin/vm-hands/vm-hands-entry-lite-60pg3wxj.js +3 -0
  42. package/bin/vm-hands/vm-hands-entry-lite-6b0dxpkm.js +5 -0
  43. package/bin/vm-hands/vm-hands-entry-lite-6c67a3jc.js +3 -0
  44. package/bin/vm-hands/vm-hands-entry-lite-8r31b0ps.js +5 -0
  45. package/bin/vm-hands/vm-hands-entry-lite-aj139v8j.js +3 -0
  46. package/bin/vm-hands/vm-hands-entry-lite-avc65bd7.js +65 -0
  47. package/bin/vm-hands/{vm-hands-entry-lite-vsa7t6m9.js → vm-hands-entry-lite-beyyy1gz.js} +54 -54
  48. package/bin/vm-hands/vm-hands-entry-lite-bx5zy5bd.js +2 -0
  49. package/bin/vm-hands/{vm-hands-entry-lite-fzkfajew.js → vm-hands-entry-lite-cbrtaz8j.js} +5 -9
  50. package/bin/vm-hands/vm-hands-entry-lite-dk79tnax.js +3 -0
  51. package/bin/vm-hands/vm-hands-entry-lite-ec9jemny.js +5 -0
  52. package/bin/vm-hands/vm-hands-entry-lite-ev1k9x73.js +539 -0
  53. package/bin/vm-hands/vm-hands-entry-lite-f2qkz14f.js +128 -0
  54. package/bin/vm-hands/vm-hands-entry-lite-fbhqfzbq.js +4 -0
  55. package/bin/vm-hands/{vm-hands-entry-lite-4k4h9rcq.js → vm-hands-entry-lite-fcvf8md1.js} +2 -2
  56. package/bin/vm-hands/vm-hands-entry-lite-g4zd2d5n.js +2 -0
  57. package/bin/vm-hands/vm-hands-entry-lite-hbs3tpdg.js +3 -0
  58. package/bin/vm-hands/vm-hands-entry-lite-hk6trmwa.js +4 -0
  59. package/bin/vm-hands/vm-hands-entry-lite-hqmyd73s.js +2 -0
  60. package/bin/vm-hands/vm-hands-entry-lite-jev771b3.js +3 -0
  61. package/bin/vm-hands/vm-hands-entry-lite-jzz73e3f.js +112 -0
  62. package/bin/vm-hands/vm-hands-entry-lite-m2bswqxe.js +4 -0
  63. package/bin/vm-hands/vm-hands-entry-lite-np07qyeq.js +3 -0
  64. package/bin/vm-hands/vm-hands-entry-lite-nzmkyezg.js +3 -0
  65. package/bin/vm-hands/vm-hands-entry-lite-pf5qtbj5.js +5 -0
  66. package/bin/vm-hands/vm-hands-entry-lite-qy9xg6em.js +3 -0
  67. package/bin/vm-hands/{vm-hands-entry-lite-6y6pz2yw.js → vm-hands-entry-lite-rfz60hb3.js} +2 -2
  68. package/bin/vm-hands/vm-hands-entry-lite-s4bharcb.js +9 -0
  69. package/bin/vm-hands/vm-hands-entry-lite-s5qkb1fk.js +6 -0
  70. package/bin/vm-hands/vm-hands-entry-lite-sbtjmy0e.js +14 -0
  71. package/bin/vm-hands/vm-hands-entry-lite-tdgtpx8e.js +2 -0
  72. package/bin/vm-hands/vm-hands-entry-lite-vpz54vwj.js +7 -0
  73. package/bin/vm-hands/vm-hands-entry-lite-wx4ax7wg.js +4 -0
  74. package/bin/vm-hands/vm-hands-entry-lite-yretc2th.js +3 -0
  75. package/bin/vm-hands/vm-hands-entry-lite-z76nfb19.js +3 -0
  76. package/bin/vm-hands/vm-hands-entry-lite-zjxzm61j.js +105 -0
  77. package/bin/vm-hands/vm-hands-entry-lite-zp6naptr.js +3 -0
  78. package/bin/vm-hands/vm-hands-entry-lite.js +3 -1
  79. package/bin/vm-hands/vm-hands-executor-p92kw8nz.js +11 -0
  80. package/bin/vm-hands/vm-hands-op-runner-ekgtqc07.js +2 -0
  81. package/bin/vm-hands/vm-hands-runtime-tj93a1pm.js +4 -0
  82. package/bin/vm-hands/worker-preview-readiness-w62n91kr.js +2 -0
  83. package/bin/vm-hands/worker-sandbox-2r5nseff.js +2 -0
  84. package/package.json +1 -1
  85. package/bin/vm-hands/api-credentials-s4897qxy.js +0 -2
  86. package/bin/vm-hands/api-m73x3da5.js +0 -2
  87. package/bin/vm-hands/ask-relay-4kwcx2b7.js +0 -8
  88. package/bin/vm-hands/connect-cli-34b18gjs.js +0 -2
  89. package/bin/vm-hands/custom-endpoint-device-j012b4bd.js +0 -2
  90. package/bin/vm-hands/desktop-account-0q0arpzk.js +0 -2
  91. package/bin/vm-hands/device-workspace-3jxhs54b.js +0 -2
  92. package/bin/vm-hands/hands-worker-source-y64axsw3.js +0 -2
  93. package/bin/vm-hands/index-194s4vz0.js +0 -12818
  94. package/bin/vm-hands/install-receipt-1g68b446.js +0 -2
  95. package/bin/vm-hands/local-automation-k2w46hn2.js +0 -2
  96. package/bin/vm-hands/local-capabilities-tdzbqmrb.js +0 -2
  97. package/bin/vm-hands/local-desktop-users-6thzvydd.js +0 -2
  98. package/bin/vm-hands/local-display-mac-59ma7sxa.js +0 -2
  99. package/bin/vm-hands/local-display-session-4833qq7h.js +0 -2
  100. package/bin/vm-hands/local-display-video-c1143mz6.js +0 -2
  101. package/bin/vm-hands/local-managed-process-mr0zpk7c.js +0 -2
  102. package/bin/vm-hands/local-pty-session-bwarwpsd.js +0 -2
  103. package/bin/vm-hands/managed-runtime-vz1wqwwg.js +0 -2
  104. package/bin/vm-hands/network-contract-gprc37sw.js +0 -2
  105. package/bin/vm-hands/package-ej9snd47.js +0 -2
  106. package/bin/vm-hands/permissions-7sfghef4.js +0 -2
  107. package/bin/vm-hands/reason-hands-protocol-jsrkawe2.js +0 -2
  108. package/bin/vm-hands/serve-service-kngyzh74.js +0 -2
  109. package/bin/vm-hands/status-jz29fb95.js +0 -96
  110. package/bin/vm-hands/version-g29vt13t.js +0 -2
  111. package/bin/vm-hands/vm-hands-entry-lite-0h4qmgm2.js +0 -9
  112. package/bin/vm-hands/vm-hands-entry-lite-0k13wmzm.js +0 -3
  113. package/bin/vm-hands/vm-hands-entry-lite-1exfjv79.js +0 -52
  114. package/bin/vm-hands/vm-hands-entry-lite-26q3hbdc.js +0 -3
  115. package/bin/vm-hands/vm-hands-entry-lite-28s7v15d.js +0 -4
  116. package/bin/vm-hands/vm-hands-entry-lite-2m5dwrdf.js +0 -6
  117. package/bin/vm-hands/vm-hands-entry-lite-37hvds7z.js +0 -5
  118. package/bin/vm-hands/vm-hands-entry-lite-3rqdzqhk.js +0 -112
  119. package/bin/vm-hands/vm-hands-entry-lite-4gh5kfr4.js +0 -3
  120. package/bin/vm-hands/vm-hands-entry-lite-6nwbqg37.js +0 -3
  121. package/bin/vm-hands/vm-hands-entry-lite-714wspqb.js +0 -3
  122. package/bin/vm-hands/vm-hands-entry-lite-7zk0r3p9.js +0 -5
  123. package/bin/vm-hands/vm-hands-entry-lite-9qep7pka.js +0 -4
  124. package/bin/vm-hands/vm-hands-entry-lite-am6kj1n1.js +0 -3
  125. package/bin/vm-hands/vm-hands-entry-lite-as1tkffn.js +0 -5
  126. package/bin/vm-hands/vm-hands-entry-lite-bxt4n1nj.js +0 -3
  127. package/bin/vm-hands/vm-hands-entry-lite-c2g3wmkp.js +0 -3
  128. package/bin/vm-hands/vm-hands-entry-lite-d2w8tghq.js +0 -3
  129. package/bin/vm-hands/vm-hands-entry-lite-d98m00b8.js +0 -3
  130. package/bin/vm-hands/vm-hands-entry-lite-daxcxjze.js +0 -344
  131. package/bin/vm-hands/vm-hands-entry-lite-dcnyve97.js +0 -3
  132. package/bin/vm-hands/vm-hands-entry-lite-e1b89x66.js +0 -3
  133. package/bin/vm-hands/vm-hands-entry-lite-ej5ffjck.js +0 -105
  134. package/bin/vm-hands/vm-hands-entry-lite-ejkba2nk.js +0 -3
  135. package/bin/vm-hands/vm-hands-entry-lite-f3wh0dza.js +0 -5
  136. package/bin/vm-hands/vm-hands-entry-lite-f5xb489y.js +0 -4
  137. package/bin/vm-hands/vm-hands-entry-lite-feybcq63.js +0 -3
  138. package/bin/vm-hands/vm-hands-entry-lite-fpp2bs9y.js +0 -452
  139. package/bin/vm-hands/vm-hands-entry-lite-gt497d5x.js +0 -3
  140. package/bin/vm-hands/vm-hands-entry-lite-gxper06w.js +0 -3
  141. package/bin/vm-hands/vm-hands-entry-lite-j2ng164q.js +0 -9
  142. package/bin/vm-hands/vm-hands-entry-lite-jp9q2vsx.js +0 -127
  143. package/bin/vm-hands/vm-hands-entry-lite-magmzx9c.js +0 -3
  144. package/bin/vm-hands/vm-hands-entry-lite-ntx8fdyq.js +0 -5
  145. package/bin/vm-hands/vm-hands-entry-lite-pfzczmaa.js +0 -4
  146. package/bin/vm-hands/vm-hands-entry-lite-pkc4ry5x.js +0 -539
  147. package/bin/vm-hands/vm-hands-entry-lite-pp7jfqzr.js +0 -3
  148. package/bin/vm-hands/vm-hands-entry-lite-q8wkrzer.js +0 -66
  149. package/bin/vm-hands/vm-hands-entry-lite-s823n1q9.js +0 -3
  150. package/bin/vm-hands/vm-hands-entry-lite-s9xf5z69.js +0 -7
  151. package/bin/vm-hands/vm-hands-entry-lite-tchc7z17.js +0 -128
  152. package/bin/vm-hands/vm-hands-entry-lite-tytfs183.js +0 -42
  153. package/bin/vm-hands/vm-hands-entry-lite-v4jtxgaj.js +0 -4
  154. package/bin/vm-hands/vm-hands-entry-lite-vgpt2n1v.js +0 -11
  155. package/bin/vm-hands/vm-hands-entry-lite-xp3qzxk5.js +0 -3
  156. package/bin/vm-hands/vm-hands-executor-epyhpjv3.js +0 -11
  157. package/bin/vm-hands/vm-hands-op-runner-fn1qph82.js +0 -2
  158. package/bin/vm-hands/vm-hands-runtime-8vt9etvv.js +0 -4
  159. package/bin/vm-hands/worker-preview-readiness-yfjgban2.js +0 -2
  160. package/bin/vm-hands/worker-sandbox-z0t69av8.js +0 -2
@@ -1,344 +0,0 @@
1
- // @bun
2
- import{y as J5}from"./vm-hands-entry-lite-f3wh0dza.js";import{z as m0}from"./vm-hands-entry-lite-pp7jfqzr.js";import{A as e1,C as g6,D as t9}from"./vm-hands-entry-lite-e1b89x66.js";import{F as B2,G as m6,H as V4,I as G4,J as D6,K as v0,O as W6,P as C$}from"./vm-hands-entry-lite-7zk0r3p9.js";import{Aa as _J,aa as s2,va as Z$,ya as c1}from"./vm-hands-entry-lite-vgpt2n1v.js";import{$a as kJ,Ia as G8,Ja as L0,Ka as x1,La as S1,Ma as E0,Na as l1,Oa as a5,Pa as i5,Qa as r8,Ra as t8,Sa as _5,Ta as f3,Ua as e8,Ya as $5,ab as hJ,hb as fJ,ib as vJ,jb as mJ,kb as gJ,lb as R9}from"./vm-hands-entry-lite-pkc4ry5x.js";import{mb as v9,nb as m9,ob as a8,pb as k1,qb as l6,tb as B8}from"./vm-hands-entry-lite-s9xf5z69.js";import{Ab as bJ,Jb as wJ,Kb as z9,wb as K8,xb as U8}from"./vm-hands-entry-lite-pfzczmaa.js";import{$b as I8,Cc as S2,Ec as n8,Fc as $9,Hc as y8,Lb as Z3,Mb as Q3,Nb as u6,Nc as SJ,Ob as d6,Oc as r3,Pb as p6,Qb as b0,Rb as $0,Sb as g,Tb as A9,Ub as O1,Vb as o1,Wb as K0,Zb as F8,cc as C8,hc as b8,ic as w8,jc as N8,kc as PJ,lc as IJ,nc as _8,oc as EJ,pc as M1,sc as xJ,xc as M5,zc as f4}from"./vm-hands-entry-lite-fpp2bs9y.js";import{$c as S8,Tc as E8,Uc as x8}from"./vm-hands-entry-lite-vsa7t6m9.js";import{cd as Y6,ld as i8}from"./vm-hands-entry-lite-j2ng164q.js";import{rd as s8}from"./vm-hands-entry-lite-2m5dwrdf.js";import{td as T$}from"./vm-hands-entry-lite-gt497d5x.js";import{Ad as c,xd as u,yd as o,zd as s}from"./vm-hands-entry-lite-f5xb489y.js";import{Pd as V8}from"./vm-hands-entry-lite-c2g3wmkp.js";import{_d as Y5,be as uJ,ee as o5,fe as e5}from"./vm-hands-entry-lite-fzkfajew.js";import{Ae as e2,ie as TJ,je as c$,le as V$,me as E$,ne as T1,pe as O6,qe as c6,re as s6,te as L1,ue as a6,ve as g9,we as i6,xe as o2,ye as G$,ze as x4}from"./vm-hands-entry-lite-ej5ffjck.js";import{Tf as X8,bg as T6,cg as o$,ef as D2,if as AJ,jf as RJ,mg as V2}from"./vm-hands-entry-lite-tytfs183.js";import{Bg as o8}from"./vm-hands-entry-lite-tchc7z17.js";import{Ig as p2,Jg as k6,Rg as yJ,Ug as f1,Wg as H7,Xg as q7}from"./vm-hands-entry-lite-jp9q2vsx.js";import{Yg as k8}from"./vm-hands-entry-lite-s823n1q9.js";import{hh as V0,ih as X2,jh as lJ,kh as cJ,lh as t$,mh as L3,nh as I2,oh as T4,qh as C2,rh as k$,sh as h0,th as e$,uh as E2,xh as h$}from"./vm-hands-entry-lite-ntx8fdyq.js";import{Ch as P8}from"./vm-hands-entry-lite-9qep7pka.js";import{Ci as s1,Di as p8}from"./vm-hands-entry-lite-28s7v15d.js";import{Yi as Y$,aj as R$,bj as C0,cj as $4,dj as h6,ej as f6,gj as F2,hj as v6,ij as W9,jj as C4,kj as E4,lj as $1}from"./vm-hands-entry-lite-26q3hbdc.js";import{mj as p1,nj as P1}from"./vm-hands-entry-lite-4k4h9rcq.js";import{Lj as x6,Tj as l8,Uj as D9,Wj as Y8}from"./vm-hands-entry-lite-0h4qmgm2.js";import{Yj as N0,_j as qJ}from"./vm-hands-entry-lite-6nwbqg37.js";import{wk as r}from"./vm-hands-entry-lite-am6kj1n1.js";import{Vk as K}from"./vm-hands-entry-lite-q8wkrzer.js";import{Yk as CJ}from"./vm-hands-entry-lite-v4jtxgaj.js";import{bl as c8,dl as Y1,hl as MJ}from"./vm-hands-entry-lite-gxper06w.js";import{ql as f0}from"./vm-hands-entry-lite-magmzx9c.js";import{wl as HG}from"./vm-hands-entry-lite-ejkba2nk.js";import{spawn as n6,spawnSync as qG}from"child_process";import{closeSync as r6,existsSync as MG,mkdirSync as TG,openSync as t6,readdirSync as LG,realpathSync as B$,rmSync as _1}from"fs";import{hostname as FG}from"os";import{dirname as u9,join as F0,resolve as _G}from"path";import{createHash as T7}from"crypto";import{unlinkSync as L7}from"fs";import{platform as F7}from"os";import{join as _7}from"path";var o9=K.discriminatedUnion("store",[K.strictObject({version:K.literal(1),store:K.literal("keychain")}),K.strictObject({version:K.literal(1),store:K.literal("file"),api_key:K.string().min(1).max(4096)})]),y$=($)=>_7($,"api-key.json");function W$($){let J=T7("sha256").update(`reason-connect-api-key
3
- ${$}`).digest("hex");return new t$(X2(),F7(),J)}function M3($,J,Z=W$($)){try{Z.deleteBinding(),Z.createBinding(new TextEncoder().encode(J)),c(y$($),{version:1,store:"keychain"});return}catch(Q){if(!(Q instanceof V0))throw Q}c(y$($),{version:1,store:"file",api_key:J})}function p0($,J=W$($)){if(!u(y$($)))return null;let Z=o9.parse(JSON.parse(s(y$($))));if(Z.store==="file")return Z.api_key;try{let Q=J.loadBinding();return Q?new TextDecoder().decode(Q):null}catch(Q){if(!(Q instanceof V0))throw Q;throw Error("worker_api_key_unreadable")}}function e9($,J=W$($)){if(!u(y$($)))return;if(o9.parse(JSON.parse(s(y$($)))).store==="keychain")try{J.deleteBinding()}catch(Z){if(!(Z instanceof V0))throw Z}L7(y$($))}async function T3($,J){let Z;try{Z=await t9({env:{REASON_API_KEY:J,REASON_API_URL:$.apiOrigin},fetchImpl:b0($.proxy)})}catch(Q){if(Q instanceof v0&&(Q.status===401||Q.status===403))throw Error("worker_api_key_rejected");throw Q}if(!Z)throw Error("worker_api_key_rejected");if(!Z.scopes.includes("devices:write"))throw Error("worker_api_key_devices_write_required");return Z}import{readdirSync as f7,renameSync as v7,rmSync as f$}from"fs";import{join as H0}from"path";import{createHash as j7}from"crypto";import{realpathSync as D7,statSync as W7,unlinkSync as Y2}from"fs";import{platform as O7}from"os";import{join as w0}from"path";function d($){return{state:w0(g($),"device.json"),control:w0(g($),"control.json"),lock:w0(g($),"lifecycle.lock"),socket:w0(g($),"control.sock"),daemon:w0(g($),"daemon.json"),releaseCheck:w0(g($),"release-check.json"),updateDeferral:w0(g($),"update-deferral.json"),firstHeartbeat:w0(g($),"first-heartbeat.json")}}var z7=K.object({version:K.literal(1),device_id:K.string().min(1).max(160),offer:K.unknown().optional(),enrollment_ms:K.number().int().nonnegative().max(o$).optional()});function J4($,J,Z){o(g($),!0),c(d($).firstHeartbeat,{version:1,device_id:J,...Z.offer?{offer:Z.offer}:{},...Z.enrollmentMs!==void 0?{enrollment_ms:Z.enrollmentMs}:{}})}function F3($,J){let Z=d($).firstHeartbeat;try{if(!u(Z))return null;let Q=z7.safeParse(JSON.parse(s(Z)));if(Y2(Z),!Q.success||Q.data.device_id!==J)return null;let X=V2(Q.data.offer);return{...X?{offer:X}:{},...Q.data.enrollment_ms!==void 0?{enrollmentMs:Q.data.enrollment_ms}:{}}}catch{return null}}function T0($,J=!1){o(g($),J);let Z=["local-device.key","local-device.binding","device.json"].filter((Q)=>{let X=w0(g($),Q);if(!u(X))return!1;return s(X),!0});return $.lifetime==="persistent"&&Z.join()==="device.json"?_3($):new L3(g($))}function G2($,J){T0($,!0),P7($);let Z=J??_3($),Q=new L3(g($));try{Z.deleteBinding(),Z.deleteKey(),Z.createFreshPublicKey()}catch(X){if(X instanceof V0)return Q;throw X}return Q.deleteBinding(),Q.deleteKey(),Z}function _3($){return new t$(X2(),O7(),A7($))}function A7($){let J=j3($);return j7("sha256").update(`reason-worker
4
- ${J?.directory??g($)}`).digest("hex")}function z1($,J){c(w0(g($),A1),{version:1,directory:j3($)?.directory??g($),devicePublicKey:J})}var A1="keychain-scope.json";function Z4($){return u(w0(g($),A1))}var R7=K.strictObject({version:K.literal(1),directory:K.string().min(1),devicePublicKey:K.string().min(1)});function j3($){let J=w0(g($),A1);if(!u(J))return null;let Z=R7.safeParse(JSON.parse(s(J))),Q=d($).state;if(!Z.success||!u(Q))return null;return JSON.parse(s(Q))?.devicePublicKey===Z.data.devicePublicKey?Z.data:null}function P7($){let J=w0(g($),A1);if(!u(J))return;if(j3($))try{let Z=_3($);Z.deleteBinding(),Z.deleteKey()}catch(Z){if(!(Z instanceof V0))throw Z}Y2(J)}function H$($){let J=D7($.workspaceRoot);if(J!==$.workspaceRoot||!W7(J).isDirectory()||!O1(J,$.stateDirectory))throw Error("worker_workspace_not_canonical_or_overlaps_state")}function t($){if(!u(g($)))return null;let J=k$(d($).state,{proofStore:T0($),repair:!1}),Z=J!==null&&$4($.apiOrigin,J.apiOrigin),Q=Z?[K0($),K0({...$,apiOrigin:J.apiOrigin})]:[K0($)];if(J&&(!Q.includes(J.worker?.configDigest??"")||J.worker.lifetime!==$.lifetime||J.apiOrigin!==$.apiOrigin&&!Z||J.roots.length>32||J.roots[0]?.path!==$.workspaceRoot||J.handsSlots!==$.slots))throw Error("worker_config_binding_mismatch");return J}var Q4=K.strictObject({version:K.literal(1),drained:K.boolean(),revoked:K.boolean()});function e($){let J=d($).control;return u(J)?Q4.parse(JSON.parse(s(J))):{version:1,drained:!1,revoked:!1}}function I0($,J){c(d($).control,Q4.parse(J))}function y0($){let J=T0($);J.deleteBinding(),J.deleteKey();let Z=w0(g($),A1);if(u(Z))Y2(Z);let Q=d($).state;if(u(Q))Y2(Q)}var I7=K.strictObject({read:K.boolean(),write:K.boolean(),execute:K.boolean(),discover_environment:K.boolean(),expose_mcp:K.literal(!1)}),D3=K.strictObject({version:K.literal(1),organization_id:K.string().min(1).max(160),enrollment_ticket:K.string().min(1).max(4096),code_verifier:K.string().regex(/^[A-Za-z0-9._~-]{43,128}$/),root_fingerprint_key:K.string().regex(/^[a-f0-9]{64}$/),root:K.strictObject({path_fingerprint:K.string().regex(/^[a-f0-9]{64}$/),permissions:I7,execution_mode:K.enum(["confined","host"]).default("confined")}),folders:K.array(K.strictObject({path_fingerprint:K.string().regex(/^[a-f0-9]{64}$/)})).min(1).max(31).optional()}),C7=K.object({device_id:K.string().min(1).max(160),organization_id:K.string().min(1).max(160),auth_scheme:K.literal("p256"),protocol_version:K.literal(2),roots:K.array(K.object({id:K.string().min(1),label:K.string(),path_fingerprint:K.string()})).min(1).max(32),headless:K.object({lifecycle:K.enum(["persistent","ephemeral"]),expires_at:K.iso.datetime({offset:!0})}),first_heartbeat:K.unknown().optional()}),W3=30000;class $$ extends Error{deviceRemoved;constructor($){super("worker_enrollment_rejected");this.deviceRemoved=$}}async function E7($,J,Z=fetch){let Q=await Z(`${$}/app/local-runtime/enroll`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(J),redirect:"error",signal:AbortSignal.timeout(W3)});if(!Q.ok){let X=Q.status===409?await Q.json().catch(()=>null):null;throw new $$(X?.error==="device_revoked")}return Q.json()}async function O3($,J,Z,Q){m0();let X=D3.parse(JSON.parse(s(J)));return J$($,X,Z,Q)}async function J$($,J,Z,Q=(Y,V)=>E7(Y,V,b0($.proxy)),X=performance.now()){let Y=Y4($,J,Z),V=await Q($.apiOrigin,{...Y.request,enrollment_ticket:J.enrollment_ticket,code_verifier:J.code_verifier});return Y.receipt(V,X)}async function X4($,J,Z,Q,X=performance.now()){let Y=Y4($,J,Z),V=await Q(Y.request,J.code_verifier);return V===null?null:Y.receipt(V,X)}function Y4($,J,Z){if(m0(),J.root.execution_mode!==$.executionMode)throw Error("worker_enrollment_mode_mismatch");let Q=h$([$.workspaceRoot],J.root.permissions,Buffer.from(J.root_fingerprint_key,"hex"))[0];if(Q.path!==$.workspaceRoot||Q.pathFingerprint!==J.root.path_fingerprint)throw Error("worker_enrollment_root_mismatch");let X=($.folders??[]).map((G,H)=>{let M=h$([G],J.root.permissions,Buffer.from(J.root_fingerprint_key,"hex"))[0];if(M.path!==G||M.pathFingerprint!==J.folders?.[H]?.path_fingerprint)throw Error("worker_enrollment_root_mismatch");return M});if((J.folders?.length??0)!==X.length)throw Error("worker_enrollment_root_mismatch");let Y=[{...Q,label:"workspace"},...X],V;try{V=Z.loadPublicKey()}catch{V=Z.createFreshPublicKey()}return{request:{device_public_key:V,name:$.name,os:process.platform,architecture:process.arch,reason_runtime_version:r,bridge_version:r,protocol_version:2,capabilities:{supported_operations:[]},roots:Y.map((G)=>({label:G.label,path_fingerprint:G.pathFingerprint,permissions:J.root.permissions}))},receipt(G,H){let M=C7.parse(G);if(M.organization_id!==J.organization_id||M.roots.length!==Y.length||M.roots.some((B,q)=>B.path_fingerprint!==Y[q].pathFingerprint)||M.headless.lifecycle!==$.lifetime||Date.parse(M.headless.expires_at)<=Date.now())throw Error("worker_enrollment_receipt_mismatch");let U=V2(M.first_heartbeat);try{J4($,M.device_id,{...U?{offer:U}:{},enrollmentMs:Math.min(o$,Math.max(0,Math.round(performance.now()-H)))})}catch{}return{version:4,apiOrigin:$.apiOrigin,orgId:M.organization_id,deviceId:M.device_id,devicePublicKey:V,displayName:$.name,registeredAt:new Date().toISOString(),handsSlots:$.slots,worker:{configDigest:K0($),lifetime:$.lifetime,expiresAt:M.headless.expires_at},roots:M.roots.map((B,q)=>({id:B.id,label:B.label,path:Y[q].path,pathFingerprint:B.path_fingerprint,permissions:J.root.permissions}))}}}}import{randomBytes as x7,randomUUID as S7}from"crypto";import{unlinkSync as b7}from"fs";import{join as w7}from"path";var B4=K.strictObject({version:K.literal(1),install_id:K.uuid(),fingerprint_key:K.string().regex(/^[a-f0-9]{64}$/)}),y7=K.object({enrollment_ticket:K.string().min(1).max(4096),expires_at:K.iso.datetime({offset:!0}),device_kind:K.literal("headless"),lifecycle:K.enum(["persistent","ephemeral"]),device_expires_at:K.iso.datetime({offset:!0})});function z3($){return y7.parse($)}var k7=K.object({credentialKind:K.enum(["oauth","api_key"]).optional(),apiOrigin:K.url(),clientId:K.string(),accessToken:K.string().min(1).max(32768),refreshToken:K.string().max(32768),expiresAt:K.iso.datetime({offset:!0}),scopes:K.array(K.string().max(128)).max(128),orgId:K.string().min(1).max(160)});function O$($){return B2(P1("REASON_CLI_CHANNEL",$.channel),N0())}async function z$($,J=O$($)){if(!u(J))return null;let Z=k7.parse(JSON.parse(s(J)));if(!C0(Z.apiOrigin,$.apiOrigin))throw Error("worker_session_origin_mismatch");if(Z.credentialKind==="api_key")return Date.parse(Z.expiresAt)>Date.now()?Z:null;let Q=b0($.proxy),X=Object.assign((V,N)=>Q(V,{...N,redirect:"error",signal:AbortSignal.timeout(30000)}),{preconnect:fetch.preconnect}),Y=await G4({path:J,fetchImpl:X});if(Y&&!C0(Y.apiOrigin,$.apiOrigin))throw Error("worker_session_origin_mismatch");return Y}async function K4($,J,Z){if(!C0(J.apiOrigin,$.apiOrigin))throw Error("worker_session_origin_mismatch");if(!J.scopes.includes("devices:write"))throw Error("worker_devices_write_scope_required");let Q=A$($);return Q.complete(J.orgId,await Z.createHeadlessDeviceEnrollmentTicket(Q.request))}async function U4($,J,Z,Q,X){let Y=performance.now();if(!C0(J.apiOrigin,$.apiOrigin))throw Error("worker_session_origin_mismatch");if(!J.scopes.includes("devices:write"))throw Error("worker_devices_write_scope_required");let V=A$($),N=X?void 0:Z.enrollHeadlessDevice?.bind(Z);if(N){let G=await X4($,V.direct(J.orgId),Q,(H,M)=>N({approval:V.request,code_verifier:M,registration:H}).catch((U)=>{throw h7(U)}),Y);if(G)return G}return J$($,V.complete(J.orgId,await Z.createHeadlessDeviceEnrollmentTicket(V.request)),Q,X,Y)}function h7($){if(!($ instanceof v0))return $;if($.status===409)return new $$($.code==="device_revoked");if($.status===410||$.status===401&&$.code==="invalid_enrollment_ticket"||$.status===403&&$.code==="grant_exceeded"||$.status===400&&$.code==="invalid_device_enrollment")return new $$(!1);return $}var R1=($)=>w7(g($),"enrollment-install.json");function N4($){if(u(R1($)))b7(R1($))}function A$($,{stored:J=!0}={}){m0();let Z=R1($),Q=J&&u(Z)?B4.parse(JSON.parse(s(Z))):{version:1,install_id:S7(),fingerprint_key:x7(32).toString("hex")};if(J&&!u(Z))c(Z,Q);let X={read:!0,write:!0,execute:!0,discover_environment:!0,expose_mcp:!1},Y=Buffer.from(Q.fingerprint_key,"hex"),V=h$([$.workspaceRoot],X,Y)[0];if(V.path!==$.workspaceRoot)throw Error("worker_workspace_not_canonical_or_overlaps_state");let N=($.folders??[]).map((U)=>{let B=h$([U],X,Y)[0];if(B.path!==U)throw Error("worker_workspace_not_canonical_or_overlaps_state");return{path_fingerprint:B.pathFingerprint}}),G=V4(),H={install_id:Q.install_id,code_challenge:G.challenge,lifecycle:$.lifetime,roots:[V.pathFingerprint,...N.map((U)=>U.path_fingerprint)].map((U)=>({path_fingerprint:U,permissions:X,execution_mode:$.executionMode}))},M=(U)=>({version:1,organization_id:U,code_verifier:G.verifier,root_fingerprint_key:Q.fingerprint_key,root:{path_fingerprint:V.pathFingerprint,permissions:X,execution_mode:$.executionMode},...N.length?{folders:N}:{}});return{request:H,saveInstall(U){o(g(U),!0),c(R1(U),Q)},complete(U,B){let q=z3(B);if(q.lifecycle!==$.lifetime||Date.parse(q.expires_at)<=Date.now()||Date.parse(q.device_expires_at)<=Date.now())throw Error("worker_ticket_receipt_mismatch");return{...M(U),enrollment_ticket:q.enrollment_ticket}},direct:M}}function H4($,J,Z){let Q=R1($);if(!u(Q))throw Error("worker_folders_unavailable");let X=B4.parse(JSON.parse(s(Q)));return h$([J],Z,Buffer.from(X.fingerprint_key,"hex"))[0]}var K2=8,L4=600000,F4=15000,q4=new Set(["device_revoked","invalid_device_credential"]),U2=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,q$=($)=>H0(g($),"workspaces"),_4="account.json",A3=($)=>u(H0($,_4));function k0($){let J;try{J=f7(q$($))}catch{return[]}return J.filter((Z)=>U2.test(Z)).sort().map((Z)=>{let Q=H0(q$($),Z),X=H0(Q,"worker.json"),Y=null;try{let V=$0.safeParse(JSON.parse(s(X)));if(V.success&&V.data.stateDirectory===Q)Y=V.data}catch{}return{organizationId:Z,directory:Q,configPath:X,config:Y,account:A3(Q)}})}function N2($,J){let Z=J.toLowerCase();if(!U2.test(Z))throw Error("worker_workspace_id_invalid");let Q=$0.parse({...$,stateDirectory:H0(q$($),Z)});return o(Q.stateDirectory,!0),c(H0(Q.stateDirectory,_4),{version:1}),{config:Q,configPath:H0(Q.stateDirectory,"worker.json")}}function H2($,J){try{let{config:Z,configPath:Q}=N2($,J);o(g(Z),!0),I0(Z,{version:1,drained:!0,revoked:!0}),c(Q,Z)}catch{}}function I1($,J){let Z=J.toLowerCase(),Q=null;try{Q=t($)?.orgId.toLowerCase()??null}catch{}return Q===Z||k0($).some((X)=>!X.account&&X.config!==null&&X.organizationId===Z)}var R3=["device.json","local-device.key","local-device.binding","keychain-scope.json","control.json","enrollment-install.json","first-heartbeat.json"];function M4($,J){let Z=t($);if(!Z?.worker)throw Error("worker_identity_missing");z1($,Z.devicePublicKey),o(g(J),!0);for(let Y of R3)f$(H0(g(J),Y),{force:!0});for(let Y of R3){let V=H0(g($),Y);if(u(V))v7(V,H0(g(J),Y))}let Q=T0(J),X=k$(d(J).state,{proofStore:Q,repair:!1});if(!X?.worker)throw Error("worker_identity_missing");h0({...X,worker:{...X.worker,configDigest:K0(J)}},d(J).state,{proofStore:Q})}function P3($){for(let J of k0($)){if(J.account)continue;try{if(J.config&&u(d(J.config).state))y0(J.config)}catch{}f$(J.directory,{recursive:!0,force:!0})}f$(C3($),{force:!0})}function q2($,{prefer:J,keep:Z,live:Q=!1}){let X=Date.now(),Y=(U)=>Number(Date.parse(U.worker?.expiresAt??"")>X+60000),N=k0($).flatMap((U)=>{if(!U.account||!U.config)return[];try{if(e(U.config).revoked)return[];let B=t(U.config);return B&&B.orgId.toLowerCase()===U.organizationId&&(!Q||Y(B))?[{...U,config:U.config,state:B}]:[]}catch{return[]}}).sort((U,B)=>Number(B.organizationId===J)-Number(U.organizationId===J)||Y(B.state)-Y(U.state))[0];if(!N)return null;let G=null;try{G=e($).revoked?null:t($)}catch{}let H=G?.orgId.toLowerCase()??"";if(Z&&G&&U2.test(H)&&H!==N.organizationId){let U=N2($,H);M4($,U.config),c(U.configPath,U.config)}else if(u(g($))){try{if(u(d($).state))y0($)}catch{}for(let U of R3)f$(H0(g($),U),{force:!0})}P3($);let M=$0.parse({...N.config,stateDirectory:$.stateDirectory});return M4(N.config,M),c(H0($.stateDirectory,"worker.json"),M),f$(N.directory,{recursive:!0,force:!0}),M}var I3={before($){for(let{config:J}of k0($))try{let Z=J?t(J):null;if(J&&Z)z1(J,Z.devicePublicKey)}catch{}},after($,J){for(let{organizationId:Z,directory:Q,configPath:X,config:Y}of k0(J)){if(Y)continue;try{let V=$0.parse(JSON.parse(s(X)));if(V.stateDirectory!==H0(q$($),Z))continue;let N=$0.parse({...V,stateDirectory:Q}),G=T0(N),H=k$(d(N).state,{proofStore:G,repair:!1});if(H?.worker?.configDigest===K0(V))h0({...H,worker:{...H.worker,configDigest:K0(N)}},d(N).state,{proofStore:G});c(X,N)}catch{}}}},C3=($)=>H0(q$($),"listed.json");function j4($){try{let J=JSON.parse(s(C3($))),Z=J.names&&typeof J.names==="object"&&!Array.isArray(J.names)?Object.fromEntries(Object.entries(J.names).filter((Q)=>typeof Q[1]==="string")):{};return{listed:J.listed===!0,reason:J.reason==="sign_in"?"sign_in":null,blocked:Array.isArray(J.blocked)?J.blocked.filter((Q)=>typeof Q==="string"):[],names:Z}}catch{return null}}function D4($,J){let Z=k0($),Q=Z.filter((G)=>G.account),X=Z.filter((G)=>!G.account),Y=j4($),V=Y&&!Y.listed?Y.reason:null,N=V||X.length===0&&Y&&!Y.listed?[]:X;if(Q.length===0&&N.length===0&&(V||Y&&!Y.listed))return{workspaces:null,off:V};return{off:V,workspaces:[...Q,...N].map(({organizationId:G,config:H,account:M})=>{let U=!1,B=null,q=!1,T=null;try{U=H?e(H).revoked:!1,B=H&&!U?t(H):null;let L=H?e$(d(H).daemon):null;q=J&&!!B&&L?.state==="connected",T=q?T4(L,B):null}catch{}return{...T?{permission_recovery:T}:{},organization_id:G,device_id:B?.deviceId??null,name:Y?.names?.[G]??null,root:B?.roots[0]?{id:B.roots[0].id,permissions:B.roots[0].permissions}:null,state:U?"removed":q?"connected":"not_running",blocked:!M&&!U&&!q&&(Y?.blocked.includes(G)??!1),...M?{account:!0}:{}}})}}function W4($){let{config:J,state:Z,client:Q,signal:X}=$,Y=$.log??(()=>{return}),V=new Map,N=null,G=!1,H=j4(J)??{listed:!1,reason:null,blocked:[]},M=(_)=>{let{folders:W,...P}=J,C=Z.roots.slice(1).map((R)=>R.path);return $0.parse({...P,...C.length?{folders:C}:{},stateDirectory:H0(q$(J),_)})},U=async(_)=>{let W=V.get(_);if(!W)return;W.controller.abort(),await W.done},B=(_,W=!1)=>{let P=new AbortController,C=()=>P.abort();if(X.addEventListener("abort",C,{once:!0}),X.aborted)P.abort();let R={..._,controller:P,claims:0,done:Promise.resolve(),account:W};R.done=$.serve(_,P.signal,(I)=>{R.claims=I}).then(()=>{return},(I)=>{if(W&&I instanceof L0&&I.status===401&&q4.has(I.code)){try{I0(_.config,{version:1,drained:!0,revoked:!0})}catch{}Y(`Reason worker: workspace ${_.organizationId} (another account's) no longer accepts this computer (${I.code}); run \`reason connect\` signed in as that account to connect it again
5
- `)}else if(I instanceof L0&&I.status===401&&q4.has(I.code)){try{y0(_.config)}catch{}Y(`Reason worker: workspace ${_.organizationId} no longer accepts this computer
6
- `)}else if(!P.signal.aborted)Y(`Reason worker: workspace ${_.organizationId} stopped (worker_workspace_failed); it starts again on the next check
7
- `)}).finally(()=>{if(P.abort(),X.removeEventListener("abort",C),R.claims=0,V.get(_.organizationId)===R)V.delete(_.organizationId);let I=_.config.stateDirectory;if(W&&!A3(I)&&!u(H0(I,"worker.json")))f$(I,{recursive:!0,force:!0})}),V.set(_.organizationId,R)},q=(_,W)=>{if(!W)return null;try{let P=M(_),C=t(W);if(!C||C.orgId!==_||Date.parse(C.worker?.expiresAt??"")<=Date.now()+60000||W.name!==P.name||W.executionMode!==P.executionMode||!C0(W.apiOrigin,P.apiOrigin)||C.roots.map((R)=>R.path).join(`
8
- `)!==Z.roots.map((R)=>R.path).join(`
9
- `))return null;return{organizationId:_,config:W,state:C,proofStore:T0(W)}}catch{return null}},T=(_,W)=>{if(!W)return null;try{if(e(W).revoked)return null;let P=t(W);if(!P||P.orgId.toLowerCase()!==_||Date.parse(P.worker?.expiresAt??"")<=Date.now()+60000||W.executionMode!==J.executionMode||!C0(W.apiOrigin,J.apiOrigin))return null;return{organizationId:_,config:W,state:P,proofStore:T0(W)}}catch{return null}},L=(_,W)=>_.deviceId===W.deviceId&&_.devicePublicKey===W.devicePublicKey&&JSON.stringify(_.roots.map((P)=>[P.id,P.path]))===JSON.stringify(W.roots.map((P)=>[P.id,P.path])),F=async(_)=>{for(let[W,P]of _){if(X.aborted)return;let C=V.get(W),R=T(W,P.config);if(C&&R&&L(C.state,R.state))continue;if(C){if(C.claims>0)continue;await U(W)}if(R&&!X.aborted)B(R,!0)}for(let[W,P]of V)if(P.account&&!_.has(W)&&P.claims===0)await U(W)},D=async(_)=>{let W=M(_),P=$0.parse({...W,stateDirectory:J.stateDirectory});if(!u(H0(g(J),"enrollment-install.json")))return null;let C=A$(P),R=await Q.ownerWorkspaceEnrollment(Z,{organization_id:_,install_id:C.request.install_id,code_challenge:C.request.code_challenge},X),I=C.complete(_,R);if(o(g(W),!0),u(d(W).state))y0(W);let f=G2(W);try{let S=await J$(W,I,f,$.enroll);return h0(S,d(W).state,{proofStore:f}),I0(W,{version:1,drained:!1,revoked:!1}),c(H0(W.stateDirectory,"worker.json"),W),{organizationId:_,config:W,state:S,proofStore:f}}catch(S){if(S instanceof $$&&S.deviceRemoved)return I0(W,{version:1,drained:!0,revoked:!0}),c(H0(W.stateDirectory,"worker.json"),W),null;throw S}},O=async()=>{let _=k0(J),W=new Map(_.filter((z)=>z.account).map((z)=>[z.organizationId,z]));await F(W);let P=new Map(_.filter((z)=>!z.account).map((z)=>[z.organizationId,z])),C=(z)=>W.has(z)||V.get(z)?.account===!0||A3(H0(q$(J),z)),R=(z)=>{let k=P.get(z)?.config;try{return k?e(k).revoked:!1}catch{return!1}};for(let[z,k]of P){if(V.has(z)||R(z)||H.blocked.includes(z))continue;let y=q(z,k.config);if(y&&!X.aborted)B(y)}let I;try{I=await Q.ownerWorkspaces(Z,X)}catch(z){return H={listed:!1,blocked:H.blocked,...H.names?{names:H.names}:{},reason:z instanceof L0&&z.status===403&&z.code==="sign_in_not_eligible"?"sign_in":null},!1}let f=new Map(I.map((z)=>[z.id.toLowerCase(),z.blocked]).filter(([z])=>U2.test(z)&&z!==Z.orgId.toLowerCase()&&!C(z))),S=[...f.keys()].filter((z)=>P.has(z)?!R(z):!f.get(z)).slice(0,K2),h=[...V.values()].filter((z)=>!z.account&&z.claims>0&&!S.includes(z.organizationId)).length,p=S.filter((z)=>!P.has(z)),b=p.slice(p.length-Math.min(Math.max(0,S.length+h-K2),p.length)),x=S.filter((z)=>!b.includes(z)),E=Object.fromEntries(I.flatMap((z)=>z.name&&x.includes(z.id.toLowerCase())?[[z.id.toLowerCase(),z.name]]:[]));H={listed:!0,reason:null,blocked:x.filter((z)=>f.get(z)),names:E};for(let z of new Set([...P.keys(),...V.keys()])){if(x.includes(z)||C(z))continue;if(f.has(z)&&R(z))continue;if((V.get(z)?.claims??0)>0)continue;await U(z);let k=P.get(z)?.config;try{if(k&&u(d(k).state))y0(k)}catch{}f$(H0(q$(J),z),{recursive:!0,force:!0}),Y(`Reason worker: left workspace ${z}
10
- `)}for(let z of x){if(X.aborted)return!0;if(C(z))continue;try{let k=V.get(z);if(f.get(z)){if(k&&k.claims===0)await U(z),Y(`Reason worker: offline in workspace ${z} (outside its allowed networks)
11
- `);continue}let y=q(z,P.get(z)?.config??null);if(y&&k)continue;if(!y){if(k&&k.claims>0)continue;if(await U(z),y=await D(z),y)Y(`Reason worker: connected in workspace ${z}
12
- `)}if(y&&!X.aborted)B(y)}catch{Y(`Reason worker: could not connect in workspace ${z} (worker_workspace_failed); it is tried again
13
- `)}}return!0},j=null,A=async()=>{let _=!1;do G=!1,_=await O().catch(()=>!1);while(G&&!X.aborted);let W=JSON.stringify({version:1,...H});if(j!==W)try{o(q$(J),!0),c(C3(J),JSON.parse(W)),j=W}catch{}return _};return{check(){if(N)G=!0;else N=A().finally(()=>{N=null});return N},claims:()=>[...V.values()].reduce((_,W)=>_+W.claims,0),async settled(){await N,await Promise.all([...V.values()].map((_)=>_.done))}}}import{dirname as m7}from"path";function A4($){let J={saved:$.saved,configPath:$.configPath};if(!$.saved||!g7($.saved))return J;let Z=$.saved,Q=(V,N)=>$.log(JSON.stringify({event:"worker.api_origin_move",outcome:V,...N?{code:`worker_api_origin_move_${V}:${N}`}:{},timestamp:new Date().toISOString()})),X=$.native===void 0?$1():$.native;if(!X)return J;let Y=[];try{let V=X.lock(m7($.configPath));if(!V)return J;if(Y.push(V),u(g(Z))){let M=Z$({path:d(Z).lock,runtimeVersion:r});if(!M.acquired)return J;Y.push(()=>M.release())}let N=$0.parse(JSON.parse(s($.configPath)));if(N.stateDirectory!==Z.stateDirectory)return J;let G=R4(N),H={saved:N,configPath:$.configPath};if(!M2(N)&&G.length===0)return Q("unchanged"),H;if(M2(N)){let M=O4(N);c($.configPath,M),H={saved:M,configPath:$.configPath}}for(let M of G)try{c(M.configPath,O4(M.config))}catch(U){Q("failed",`workspace:${z4(U)}`)}return Q("moved"),H}catch(V){return Q("failed",z4(V)),J}finally{for(let V of Y.reverse())V()}}function M2($){return R$($.apiOrigin)!==$.apiOrigin}function R4($){return k0($).filter((J)=>J.config!==null&&M2(J.config))}function g7($){return M2($)||R4($).length>0}function O4($){let J=$0.parse({...$,apiOrigin:R$($.apiOrigin)}),Z=t($);if(!Z)return J;if(!Z.worker)throw Error("worker_identity_missing");let Q=K0(J);if(Z.apiOrigin!==J.apiOrigin||Z.worker.configDigest!==Q)h0({...Z,apiOrigin:J.apiOrigin,worker:{...Z.worker,configDigest:Q}},d(J).state,{proofStore:T0(J)});return J}function z4($){if($ instanceof V0)return $.code;if($ instanceof Error&&/^worker_[a-z_]+$/.test($.message))return $.message;return $ instanceof Error&&"code"in $&&typeof $.code==="string"?$.code:"unexpected"}import{chmodSync as u7,lstatSync as S3,readdirSync as S4,readlinkSync as d7,unlinkSync as p7}from"fs";import{join as O0,sep as l7}from"path";var T2="rehome.json";class L2 extends Error{code;constructor($){super($);this.code=$}}function b4($){let J={saved:$.saved,configPath:$.configPath},Z=O0($.home,".config"),Q=O0(Z,"ara"),X=$.channel==="production"?["connect"]:[$.channel,"connect"],Y=O0(Q,...X),V=O0(Z,"reason",...X),N=(U,B)=>$.log(JSON.stringify({event:"worker.state_rehome",outcome:U,...B?{code:`worker_state_rehome_${U}:${B}`}:{},timestamp:new Date().toISOString()})),G=$.native===void 0?$1():$.native,H=$.saved,M=[];try{if(H&&I4(Q)&&H.stateDirectory===Y){let D={...H,stateDirectory:V};if(!E3(G,V,D,M))return J;return P4(H,D,$.host,N)}if(H&&I4(Q)&&H.stateDirectory===V&&Z4(H)&&E3(G,V,H,M))return w4({...H,stateDirectory:Y},H,$.host),J;if(!H||H.lifetime!=="persistent"||H.stateDirectory!==Y||!J1(Q)?.isDirectory())return J;if(r7(Y)===r)return J;let B=(D,O=!0)=>{if(O)c(O0(Y,T2),{version:r});return N("skipped",D),J},q=[Y];for(let D of s7(Q,Y)){if(D.config?.lifetime!=="ephemeral")return B("several_connections");if(!c7(D.directory,D.config,M))return B("once_running",!1);q.push(D.directory)}if(!G)return B("config_rename_unavailable:no_native");if(!E3(G,Y,H,M))return J;let T=t(H);if(!T||e(H).revoked)return J;if(C4(Z)!==null)return B("conflicting_identity");if(E4(Z)!==null)return B("conflicting_files");if(J1(V)&&(!J1(V).isDirectory()||S4(V).length>0))return B("connection_folder_taken");z1(H,T.devicePublicKey),I3.before(H);let L=p0(Y);if(L&&x3(Y))a7(V,L);let F=F2(Z,G,q);if(F.state!=="renamed"&&F.state!=="linked"){if(L&&x3(Y))y4(V);return B(F.problem??"config_folder_kept")}return P4(H,{...H,stateDirectory:V},$.host,N)}catch(U){try{if(J1(Y)?.isDirectory())c(O0(Y,T2),{version:r})}catch{}return N("failed",t7(U)),n7(H,Y,V,J)}finally{for(let U of M.reverse())U()}}function P4($,J,Z,Q){let X=S3(J.stateDirectory);if(X.isDirectory()&&X.uid===process.getuid?.()&&(X.mode&63)!==0)u7(J.stateDirectory,448);let Y=T0(J),V=k$(d(J).state,{proofStore:Y,repair:!1});if(!V?.worker)throw new L2("identity_missing");let N=K0(J);if(V.worker.configDigest===K0($))h0({...V,worker:{...V.worker,configDigest:N}},d(J).state,{proofStore:Y});else if(V.worker.configDigest!==N)throw new L2("worker_config_binding_mismatch");c(O0(J.stateDirectory,"worker.json"),J),I3.after($,J),w4($,J,Z);let G=O0(J.stateDirectory,T2);if(u(G))p7(G);return Q("moved"),{saved:J,configPath:O0(J.stateDirectory,"worker.json")}}function w4($,J,Z){if(x4($,J,Z,"connect"),!x3(J.stateDirectory))return;let Q=i7(W$($.stateDirectory));if(!Q)return;let X=W$(J.stateDirectory),Y;try{Y=X.loadBinding()}catch{return}if(!Y)X.createBinding(Q);y4($.stateDirectory)}function E3($,J,Z,Q){if($){let Y=$.lock(J);if(!Y)return!1;Q.push(Y)}if(!u(g(Z)))return!0;let X=Z$({path:d(Z).lock,runtimeVersion:r});if(!X.acquired)return!1;return Q.push(()=>X.release()),!0}function c7($,J,Z){if(u(g(J))){let X=Z$({path:d(J).lock,runtimeVersion:r});if(!X.acquired)return!1;return Z.push(()=>X.release()),!0}let Q=J1(O0($,"worker.json"));return Q!==null&&Date.now()-Q.mtimeMs>60000}function s7($,J){let Z=[$,...S4($,{withFileTypes:!0}).filter((X)=>X.isDirectory()&&!X.name.startsWith(".")).map((X)=>O0($,X.name))],Q=[];for(let X of Z)for(let Y of["connect","connect-once"]){let V=O0(X,Y);if(V===J||!J1(O0(V,"worker.json")))continue;let N=k4(V);if(!N||N.stateDirectory===$||N.stateDirectory.startsWith($+l7))Q.push({directory:V,config:N})}return Q}function x3($){try{return JSON.parse(s(O0($,"api-key.json"))).store==="keychain"}catch{return!1}}function a7($,J){let Z=W$($);Z.deleteBinding(),Z.createBinding(new TextEncoder().encode(J))}function y4($){try{W$($).deleteBinding()}catch(J){if(!(J instanceof V0))throw J}}function i7($){try{return $.loadBinding()}catch(J){if(J instanceof V0)return null;throw J}}function n7($,J,Z,Q){if($?.stateDirectory!==J)return Q;let X=k4(Z);return X?.stateDirectory===Z?{saved:X,configPath:O0(Z,"worker.json")}:Q}function I4($){try{return S3($).isSymbolicLink()&&d7($)==="reason"}catch{return!1}}function r7($){try{let J=JSON.parse(s(O0($,T2)));return typeof J.version==="string"?J.version:null}catch{return null}}function k4($){try{let J=O0($,"worker.json");return u(J)?$0.parse(JSON.parse(s(J))):null}catch{return null}}function J1($){try{return S3($)}catch{return null}}function t7($){if($ instanceof L2)return $.code;if($ instanceof Error&&/^worker_[a-z_]+$/.test($.message))return $.message;if($ instanceof V0)return $.code;return $ instanceof Error&&"code"in $&&typeof $.code==="string"?$.code:"unexpected"}import{readFileSync as o7}from"fs";function _2($){try{let J=JSON.parse(o7(`${$}.keep-awake.json`,"utf8"));return J!==null&&typeof J==="object"&&"version"in J&&J.version===1&&"enabled"in J&&J.enabled===!0?"battery_and_ac":void 0}catch(J){return J.code==="ENOENT"?"battery_and_ac":void 0}}function h4($,J){c(`${$}.keep-awake.json`,{version:1,enabled:J})}import{createHash as pV}from"crypto";import{readdirSync as lV,realpathSync as S9,statSync as cV}from"fs";import{hostname as sV}from"os";import{join as a$,resolve as aV}from"path";var j2="cloud",e7=/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$/;function C1($){return e7.test($)&&!f4.test($)}var $Z={worker_session_login_required:"You're not signed in. Run `reason login` first.",worker_session_origin_mismatch:"Your login is for an older endpoint. Run `reason login` to refresh it.",worker_devices_write_scope_required:"Your login can't add machines. Run `reason logout`, then `reason login` again.",worker_already_running_or_lifecycle_busy:"A worker for this machine is already running or still stopping.",worker_ephemeral_enrollment_required:'An ephemeral worker adds a new Device on every start; a stopped one can\'t be resumed. Pass a new --enrollment-file or run `reason login`. Use "lifetime": "persistent" to keep one Device across restarts.',worker_ephemeral_requires_start_enrollment_file:"Ephemeral workers enroll when they start: pass --enrollment-file to `reason worker start`.",worker_start_never_reenrolls_persistent_identity:"A persistent worker enrolls once: run `reason worker enroll --enrollment-file PATH`, then `reason worker start` without it.",worker_already_enrolled:"This machine is already set up. Start it instead of enrolling again.",worker_not_enrolled:"This machine isn't set up yet. Enroll it first.",worker_config_binding_mismatch:"This machine was set up with different settings. Use the original settings, or revoke it and set it up again.",worker_credential_expired:"This machine's enrollment expired. Revoke it and set it up again.",worker_revoked:"This machine was removed from Reason. Set it up again to use it. On your own computer, run `reason connect`; for a shared machine, an owner or admin runs `reason machines token NAME`.",worker_revoked_or_expired:"This machine was removed from Reason or its enrollment expired. Set it up again to use it. On your own computer, run `reason connect`; for a shared machine, an owner or admin runs `reason machines token NAME`.",worker_platform_unsupported:"Workers run on macOS and Linux only.",worker_workspace_not_canonical_or_overlaps_state:"The workspace folder must be a real directory (not a symlink) and must not contain the worker state folder.",worker_state_directory_not_private_or_canonical:"The worker state folder must be a real directory owned by you with mode 0700.",worker_file_not_private:"Worker files must be owned by you with mode 0600.",worker_enrollment_device_removed:"This machine was removed from Reason, and the enrollment was made for the removed one. Make a new enrollment and set it up again; on your own computer, run `reason connect`.",worker_enrollment_rejected:"Reason rejected the enrollment. Try again; if it keeps failing, run `reason logout` and `reason login`.",worker_machine_not_found:"That machine no longer exists. An owner or admin can add it again with `reason machines token NAME`.",worker_machine_admin_required:"Only workspace owners and admins can add machines or join them with a login. Ask one to run `reason machines token NAME` and give you the command it prints: curl -fsSL https://reasonmachines.com/install.sh | REASON_TOKEN=rmt_\u2026 bash (or, with Reason installed: reason serve --token rmt_\u2026)",worker_machine_token_invalid:"The machine token is invalid or revoked. Ask an owner or admin for a new one: reason machines token NAME",worker_machine_token_forbidden:"The machine token belongs to another machine or workspace.",worker_machine_token_owner_unauthorized:"Whoever created the machine token is no longer an owner or admin. Ask for a new token.",worker_api_key_rejected:"Reason rejected the API key. Check it (Settings > API) and pass it with --api-key or REASON_API_KEY.",worker_api_key_devices_write_required:"The API key can't add computers. Create one with the devices:write scope.",worker_api_key_unreadable:"This computer's API key could not be read from the Keychain. Run reason connect --api-key KEY again.",worker_folders_unavailable:"This workspace can't add folders to a computer yet. Use a folder in your home folder.",worker_unsafe_environment:"Unset credential or proxy override variables in this shell before starting a worker.",worker_ssh_version_mismatch:"The remote reason is another version than this one. Install this version there and attach with its new --artifact-sha256, or add the host as an SSH machine in Reason, which keeps its worker up to date."};function Z1($){return $Z[$]}import{randomUUID as JZ}from"crypto";import{chmodSync as ZZ,lstatSync as W2,mkdtempSync as QZ,realpathSync as u4,rmdirSync as XZ,rmSync as YZ,unlinkSync as VZ}from"fs";import{createConnection as GZ,createServer as BZ}from"net";import{basename as v4,dirname as m4,join as v$}from"path";var KZ=K.enum(["status","drain","resume","stop","reload_roots"]),UZ=K.strictObject({version:K.literal(1),instanceId:K.string(),deviceId:K.string(),phase:K.enum(["starting","running","reconnecting","stopping"]),drained:K.boolean(),activeClaims:K.number().int().nonnegative(),activeSessions:K.number().int().nonnegative().optional(),executionEligible:K.boolean(),supportedOperations:K.array(K.enum(D2)).max(D2.length).optional(),capabilityReadiness:K.partialRecord(K.enum(D2),K.boolean()).optional(),lastHeartbeat:K.string().nullable(),expiresAt:K.string()}),NZ=K.strictObject({nonce:K.string(),action:KZ}),HZ=K.object({nonce:K.uuid()}),d4=K.strictObject({version:K.literal(1),nonce:K.uuid(),socketPath:K.string().max(100)});function p4($){return v$(d($).lock,"control.json")}function O2($){return o(d($).lock),HZ.parse(JSON.parse(s(v$(d($).lock,"owner.json"))))}function g4($){if(!u($))return!1;let J=W2($);if(!J.isSocket()||J.uid!==process.getuid?.()||(J.mode&63)!==0)throw Error("worker_control_socket_not_private");return!0}function l4($,J){let Z=p4($);if(!u(Z)){let Y=d($).socket;if(!u(Y)||!W2(Y).isSocket())return null;return g4(Y)?Y:null}let Q=d4.parse(JSON.parse(s(Z)));if(Q.nonce!==J)throw Error("worker_instance_changed");if(process.platform==="win32"){if(!qZ.test(Q.socketPath))throw Error("worker_control_endpoint_invalid");return Q.socketPath}let X=m4(Q.socketPath);if(m4(X)!==u4("/tmp")||!/^(?:reason|ara)-worker-[A-Za-z0-9]{6}$/.test(v4(X))||v4(Q.socketPath)!=="control.sock"||Buffer.byteLength(Q.socketPath)>100)throw Error("worker_control_endpoint_invalid");if(!u(X))return null;return o(X),g4(Q.socketPath)?Q.socketPath:null}var qZ=/^\\\\\.\\pipe\\reason-worker-[0-9a-f-]{36}$/;async function z2($,J,Z){if(O2($).nonce!==J)throw Error("worker_instance_changed");let Q=p4($);if(u(Q))throw Error("worker_control_already_serving");let X=process.platform==="win32",Y=X?null:QZ(v$(u4("/tmp"),"ara-worker-")),V=Y?v$(Y,"control.sock"):`\\\\.\\pipe\\reason-worker-${JZ()}`;if(Y)o(Y);if(Buffer.byteLength(V)>100)throw Error("worker_socket_path_too_long");let N=new Set,G=BZ((B)=>{N.add(B),B.once("close",()=>N.delete(B)),B.setTimeout(2000,()=>B.destroy());let q="",T=!1;B.on("error",()=>B.destroy()),B.on("data",(L)=>{if(T)return;if(q+=L.toString(),Buffer.byteLength(q)>4096){B.destroy();return}if(!q.includes(`
14
- `))return;T=!0;try{let F=NZ.parse(JSON.parse(q));if(F.nonce!==J){B.destroy();return}B.end(JSON.stringify(Z(F.action))+`
15
- `)}catch{B.destroy()}})});G.maxConnections=32;let H,M=!1,U=async()=>{if(M)return;M=!0;for(let B of N)B.destroy();if(await new Promise((B)=>G.close(()=>B())),H&&u(Q)){let B=W2(Q);if(B.isFile()&&B.dev===H.dev&&B.ino===H.ino)try{let q=d4.parse(JSON.parse(s(Q)));if(q.nonce===J&&q.socketPath===V)VZ(Q)}catch{}}try{if(Y)XZ(Y)}catch{}};try{if(await new Promise((B,q)=>{G.once("error",q),G.listen(V,()=>{if(!X)ZZ(V,384);B()})}),O2($).nonce!==J)throw Error("worker_instance_changed");return c(Q,{version:1,nonce:J,socketPath:V}),H=W2(Q),U}catch(B){throw await U(),B}}function c4($,J){try{let Z=JSON.parse(s(v$(d($).lock,"owner.json"))),Q=Z&&typeof Z==="object"?Z[J]:void 0;return typeof Q==="string"?Q:null}catch{return null}}function E1($){return c4($,"runtime_version")}function MZ($){return c4($,"nonce")}function s4($,J){if(J)return J.message==="worker_control_timeout"?"socket_timeout":"bad_reply";try{if(!u(v$(d($).lock,"owner.json")))return"no_lock";return l4($,O2($).nonce)?"socket_refused":"no_socket"}catch{return"bad_reply"}}var TZ=21600000,LZ=K.strictObject({instance:K.string().nullable(),since:K.number().int().nonnegative()});function FZ($,J){let Z=d($).updateDeferral;try{if(!u(Z))return null;let Q=LZ.safeParse(JSON.parse(s(Z)));if(Q.success&&Q.data.instance===J)return Q.data.since;b3($)}catch{}return null}function b3($){try{YZ(d($).updateDeferral,{force:!0})}catch{}}async function A2($,J,Z=()=>!1){let Q=MZ($),X=FZ($,Q);if(J!==void 0){let H=E1($);if(H===null||H===J&&X===null&&!Z())return{state:"current"}}let Y;try{let H=await B0($,"status");Y=H?H.activeSessions??H.activeClaims:0}catch{Y=null}if(Y===0)return{state:"restarted"};let V=Date.now(),N=X;if(N===null){N=V;try{c(d($).updateDeferral,{instance:Q,since:N})}catch{}}let G=V-N;return{state:G<TZ?"busy":"drained",sessions:Y,waitedMs:G}}async function B0($,J){let Z=d($);if(!u(v$(Z.lock,"owner.json")))return null;let Q=O2($),X=l4($,Q.nonce);if(!X)return null;return new Promise((Y,V)=>{let N=GZ(X),G="",H=!1,M=(U,B)=>{if(H)return;if(H=!0,N.destroy(),B)V(B);else Y(U)};N.setTimeout(2000,()=>N.destroy(Error("worker_control_timeout"))),N.on("connect",()=>N.write(JSON.stringify({nonce:Q.nonce,action:J})+`
16
- `)),N.on("data",(U)=>{if(G+=U.toString(),Buffer.byteLength(G)>16384)N.destroy(Error("worker_control_oversize"))}),N.on("error",(U)=>{if("code"in U&&["ECONNREFUSED","ENOENT"].includes(String(U.code)))M(null);else M(null,U.message==="worker_control_timeout"?U:Error("worker_control_unavailable"))}),N.on("end",()=>{try{let U=UZ.parse(JSON.parse(G));if(U.instanceId!==Q.nonce)throw Error("worker_instance_changed");M(U)}catch{M(null,Error("worker_control_invalid_response"))}}),N.once("close",()=>M(null,Error("worker_control_unavailable")))})}import{randomUUID as PY}from"crypto";import{homedir as DJ}from"os";import{spawn as _Z}from"child_process";import{createRequire as jZ}from"module";var a4=2147483648,DZ=1;function WZ(){try{let $=jZ(import.meta.url)("bun:ffi"),J=$.dlopen("kernel32.dll",{SetThreadExecutionState:{args:[$.FFIType.u32],returns:$.FFIType.u32}});return(Z)=>J.symbols.SetThreadExecutionState(Z)}catch{return null}}function OZ($,J){if($==="ac_only"||!J)return{status:"unsupported",release:async()=>"unsupported"};let Z=J((a4|DZ)>>>0)===0?"failed":"held";return{get status(){return Z},async release(){if(Z==="held")J(a4);return Z="failed","released"}}}async function i4($,J={}){let Z=J.platform??process.platform;if(Z==="win32")return OZ($,J.setExecutionState??WZ());if(Z!=="darwin")return{status:"unsupported",release:async()=>"unsupported"};let Q,X="failed",Y=!1,V,N=Promise.resolve(),G=(B)=>{if(X===B)return;X=B,J.onStatusChange?.(B)},H=()=>{if(Y||V)return;V=setTimeout(()=>{V=void 0,N=M()},J.retryMs??5000),V.unref()},M=async()=>{try{let B=(J.spawn??_Z)("/usr/bin/caffeinate",[$==="ac_only"?"-s":"-i","-w",String(process.pid)],{stdio:"ignore",shell:!1});if(Q=B,B.once("exit",()=>{if(!Y&&Q===B)G("failed"),H()}),await new Promise((q,T)=>{B.once("spawn",q),B.once("error",T)}),B.exitCode===null&&B.signalCode===null)G("held")}catch{G("failed"),H()}};N=M(),await N;let U;return{get status(){return X},release(){return U??=(async()=>{Y=!0,clearTimeout(V),await N;let B=Q;if(!B||B.exitCode!==null||B.signalCode!==null||!B.pid)return X="failed","released";let q=await new Promise((T)=>{let L,F=setTimeout(()=>{try{B.kill("SIGKILL")}catch{}L=setTimeout(()=>T("failed"),1000)},1000);B.once("exit",()=>{clearTimeout(F),clearTimeout(L),T("released")});try{B.kill("SIGTERM")}catch{}});if(q==="released")X="failed";return q})()}}}class Q1 extends Error{constructor(){super("Reason Device operation lease expired.")}}class R2{now;onExpire;deadline=0;clockFloor;clockTick=performance.now();timer;closed=!1;constructor($,J,Z){this.now=J;this.onExpire=Z;this.clockFloor=J(),this.install($)}remainingMs(){if(this.closed)return 0;return Math.max(0,this.deadline-this.clockNow())}assertCurrent(){if(this.remainingMs()>0)return;let $=new Q1;if(!this.closed)this.close(),this.onExpire($);throw $}acknowledge($){this.assertCurrent(),this.install($)}close(){this.closed=!0,clearTimeout(this.timer)}install($){let J=Date.parse($);if(!Number.isFinite(J))throw Error("Reason returned an invalid operation lease deadline.");if(J-this.clockNow()<=0)throw new Q1;this.deadline=J,clearTimeout(this.timer),this.arm()}clockNow(){let $=performance.now();return this.clockFloor=Math.max(this.now(),this.clockFloor+Math.max(0,$-this.clockTick)),this.clockTick=$,this.clockFloor}arm(){this.timer=setTimeout(()=>{if(this.remainingMs()>0){this.arm();return}this.close(),this.onExpire(new Q1)},Math.min(this.remainingMs(),2147483647))}}import{realpathSync as IZ}from"fs";import{randomUUID as CZ}from"crypto";import{constants as w3}from"fs";import{open as zZ}from"fs/promises";import{join as AZ}from"path";var RZ={platform:process.platform,home:N0,async openFile($){let J=await zZ($,w3.O_RDONLY|w3.O_NOFOLLOW|w3.O_NONBLOCK);return{isFile:async()=>(await J.stat()).isFile(),close:()=>J.close()}}};async function n4($=RZ){if($.platform!=="darwin")return"unknown";try{let J=await $.openFile(AZ($.home(),"Library/Application Support/com.apple.TCC/TCC.db"));try{return await J.isFile()?"granted":"unknown"}finally{await J.close()}}catch(J){return J instanceof Error&&"code"in J&&["EACCES","EPERM"].includes(String(J.code))?"not_granted":"unknown"}}class y3 extends Error{constructor(){super("Hands generation receipt attempt timed out.")}}async function PZ($,J,Z){J.throwIfAborted();let Q=new AbortController,X=()=>{},Y,V=new Promise((N,G)=>{X=()=>{Q.abort(J.reason),G(J.reason)},J.addEventListener("abort",X,{once:!0}),Y=setTimeout(()=>{let H=new y3;Q.abort(H),G(H)},Z)});try{return await Promise.race([$(Q.signal),V])}finally{clearTimeout(Y),J.removeEventListener("abort",X),Q.abort()}}function r4($){let J=0,Z=0;return async(Q)=>{for(;;){Q.throwIfAborted(),$.lease.assertCurrent();while(performance.now()<Z)await $.sleep(Math.min(Z-performance.now(),$.lease.remainingMs()),Q),Q.throwIfAborted(),$.lease.assertCurrent();try{let X=await PZ($.send,Q,Math.min(8000,$.lease.remainingMs()));return Q.throwIfAborted(),$.lease.assertCurrent(),X}catch(X){let Y=X instanceof y3||(X instanceof L0?x1(X.status):S1(X));if(Y){let V=Math.max(Math.min(500*2**Math.min(J++,4),5000),$.retryAfterMs(X));Z=performance.now()+V}if(Q.throwIfAborted(),$.lease.assertCurrent(),!Y)throw X}}}}function l3($,J=process.env){return!$.proxied&&J.REASON_DEVICE_SESSION!=="0"}function H8($,J,Z){let Q=$?.permissionRecovery;return I2(Q,Z)&&Q.deviceId===J.deviceId&&Q.organizationId===J.orgId?{permissionRecovery:Q}:{}}var EZ=1000,xZ=250,SZ=16,bZ=5000,wZ=Y8(IZ(process.execPath)),t4=null,o4=null;function q8($){if(process.platform!=="darwin")return{};return o4??=n4().then((J)=>{t4={status:J,checkedAt:$().getTime()}}).finally(()=>{o4=null}),{fullDiskAccess:{...t4??{status:"unknown",checkedAt:$().getTime()},executablePath:wZ}}}var yZ=8,kZ=64,hZ=2000,fZ=2000,c3=8000,e4=3,vZ=250,$8=1000,J8=30000,mZ=0.2,gZ=30000,uZ=21600000,dZ=300000,pZ=3600000,lZ=0.1,M8=new Set(["run_finished","run_cancelled","driver_handoff","driver_stopped"]);function cZ($){return Math.min(e4,Math.max(1,$??e4))}function sZ($){return typeof $.reason_code==="string"&&M8.has($.reason_code)?$.reason_code:"cancelled"}function k3($){return $.reason instanceof f0&&($.reason.code==="cancelled"||M8.has($.reason.code))?$.reason.code:"cancelled"}function Z8($){return $ instanceof f0&&/^[A-Za-z0-9._:-]{1,160}$/.test($.code)?$.code:"capability_failed"}function T8($){return $.capability==="hands.connect"&&N8($.payload)}function h3($,J=Math.random){let Z=Math.min(Math.max(J(),0),1);return Math.max(0,Math.floor($*(1+Z*lZ)))}function aZ($,J=Math.random){let Z=Math.min(J8,$8*2**Math.max(0,$-1)),Q=Math.min(Math.max(J(),0),1),X=Z*mZ*(Q*2-1);return Math.min(J8,Math.max($8,Math.round(Z+X)))}function s3($,J){return new Promise((Z,Q)=>{if(J.aborted){Q(J.reason??new DOMException("Aborted","AbortError"));return}let X=()=>{clearTimeout(Y),Q(J.reason??new DOMException("Aborted","AbortError"))},Y=setTimeout(()=>{J.removeEventListener("abort",X),Z()},$);J.addEventListener("abort",X,{once:!0})})}class v3 extends Error{updateError;constructor($){super("Managed runtime update check failed.");this.updateError=$;this.name="RuntimeUpdateCheckError"}}async function iZ($,J,Z,Q){let X=new AbortController,Y=()=>X.abort(Z.reason);if(Z.aborted)Y();else Z.addEventListener("abort",Y,{once:!0});try{return await Promise.race([$,Q(J,X.signal).then(()=>({kind:"heartbeat"}))])}finally{X.abort(),Z.removeEventListener("abort",Y)}}function m3($){return $ instanceof Error?$.message:String($)}function g3($,J){return J.aborted||$ instanceof DOMException&&$.name==="AbortError"||$ instanceof Error&&$.name==="AbortError"}function n0($){return $ instanceof L0&&$.status===409&&$.code==="attempt_fenced"}function u3($){return $.capability==="environment.install"}function nZ($){if($ instanceof x2||$ instanceof Q1||$ instanceof w1)return"timeout";if(!($ instanceof Error)||$ instanceof L0)return"transport_unknown";for(let J of[$,$.cause]){if(!(J instanceof Error)||J instanceof L0||!("code"in J))continue;switch(J.code){case"ConnectionClosed":case"ECONNRESET":return"connection_closed";case"ConnectionRefused":case"ECONNREFUSED":return"connection_refused";case"ETIMEDOUT":return"timeout"}}return"transport_unknown"}function b1($,J,Z){if(!$.state.worker&&!$.connectionDiagnostics)return;if(n0(Z))return;let Q=Z instanceof L0&&Number.isInteger(Z.status)&&Z.status>=100&&Z.status<=599?{stage:J,category:"http",httpStatus:Z.status}:{stage:J,category:nZ(Z)};$.onEvent?.({type:"error",message:"worker_connection_failed",diagnostic:Q})}async function X1($,J,Z){try{return await Z()}catch(Q){if(!$.signal.aborted)b1($,J,Q);throw Q}}class w1 extends Error{constructor(){super("Reason Device operation completion timed out.")}}async function d3($,J,Z,Q){let X=J.capability==="inference.custom.v1"&&Z.status!=="succeeded"?{status:Z.status,error_code:Z.status==="cancelled"?"operation_cancelled":V8(Z.error_code)?Z.error_code:"custom_endpoint_unavailable"}:u3(J)&&Z.status!=="succeeded"?{status:Z.status,error_code:Z.status==="cancelled"?"operation_cancelled":Z.error_code==="environment_unavailable"?"environment_unavailable":"environment_install_failed"}:Z,Y=new AbortController,V=Q?AbortSignal.any([Q,Y.signal]):Y.signal,N=$.sleep??s3,G=$.operationCompletionTimeoutMs??c3,H=performance.now()+G,M,U,B=new Promise((L,F)=>{let D=()=>{let j=new w1;Y.abort(j),F(j)},O=(j)=>{clearTimeout(M),M=setTimeout(D,j)};if(U=()=>O(Math.max(0,Math.min(H-performance.now(),hZ))),O(G),$.signal.addEventListener("abort",U,{once:!0}),$.signal.aborted)U()}),q,T=0;try{while(!0)try{q=await Promise.race([$.client.completeOperation($.state,J,X,V),B]);break}catch(L){if(V.aborted||$.signal.aborted||E0(L)||n0(L)||!rZ(L)||performance.now()>=H)throw b1($,"completion",L),L;T+=1;let F=Math.min(500*2**Math.min(T-1,4),Math.max(0,H-performance.now()));if(F<=0)throw b1($,"completion",L),L;try{await N(F,V)}catch{throw b1($,"completion",L),L}}}finally{clearTimeout(M),$.signal.removeEventListener("abort",U),Y.abort()}$.onEvent?.({type:"completed",operationId:J.operation_id,status:q.status})}function rZ($){if(E0($))return!1;if(n0($))return!1;if($ instanceof L0)return $.status===408||$.status===429||$.status>=500&&$.status<=504;if($ instanceof Error){if($.name==="AbortError"||$ instanceof w1)return!1;return!0}return!1}class x2 extends Error{constructor(){super("Reason Device operation heartbeat timed out.");this.name="OperationHeartbeatAttemptTimeoutError"}}function P2($){if($ instanceof x2)return!0;return $ instanceof L0?x1($.status):S1($)}function p3($,J){if(!($ instanceof L0)||!$.retryAfter)return 0;let Z=$.retryAfter.trim(),Q=/^\d+(?:\.\d+)?$/.test(Z)?Number(Z)*1000:Date.parse(Z)-J;return Number.isNaN(Q)?0:Math.max(0,Q)}async function tZ($,J,Z,Q,X){let Y=new AbortController,V,N=()=>{return},G=new Promise((M,U)=>{let B=()=>{let q=Q.reason??new DOMException("Aborted","AbortError");Y.abort(q),U(q)};if(N=()=>Q.removeEventListener("abort",B),Q.aborted)B();else Q.addEventListener("abort",B,{once:!0})}),H=new Promise((M,U)=>{V=setTimeout(()=>{let B=new x2;Y.abort(B),U(B)},X)});try{return await Promise.race([$.client.operationHeartbeat($.state,J,{transientRetryOwner:"caller",...Z.controlAckSeq===void 0?{}:{controlAckSeq:Z.controlAckSeq},clientRetryCount:Z.clientRetryCount,...Z.waitMs===void 0?{}:{waitMs:Z.waitMs},signal:Y.signal}),G,H])}finally{if(V!==void 0)clearTimeout(V);N()}}async function Q8($,J,Z,Q,X,Y){let V=cZ($.operationHeartbeatMaxAttempts),N=$.operationHeartbeatAttemptTimeoutMs??c3,G=$.operationHeartbeatRetryDelayMs??vZ,H=Y.remainingMs(),M=Math.min(H,V*N+G*V*(V-1)/2);for(let U=0;U<V;U+=1)try{Q.throwIfAborted(),Y.assertCurrent();let B=Math.min(N,Y.remainingMs()),q=await tZ($,J,{...Z,waitMs:Z.waitMs===void 0?void 0:Math.min(Z.waitMs,Math.max(0,Math.floor(B-1000))),clientRetryCount:U},Q,B);return Q.throwIfAborted(),Y.acknowledge(q.lease_until),q}catch(B){if(Q.aborted||U+1>=V||n0(B)||E0(B)||!P2(B)){if(!Q.aborted)b1($,"operation_heartbeat",B);throw B}let q=H-Y.remainingMs(),T=p3(B,($.now?.()??new Date).getTime()),L=Math.max(G*(U+1),M*(U+1)/V-q,T);await X(Math.min(Y.remainingMs(),L),Q),Y.assertCurrent()}throw Error("Reason Device operation heartbeat retries were exhausted.")}async function oZ($,J,Z,Q,X){let Y=T8(J),V=new AbortController,N=new AbortController,G=()=>{V.abort($.signal.reason),N.abort($.signal.reason)};if($.signal.aborted)G();else $.signal.addEventListener("abort",G,{once:!0});let H=null,M,U,B=-1,q=0,T=Promise.resolve(),L=[],F=new AbortController,D=!1,O,j=null,A=!1,_,W,P={},C=(S)=>{D=!0,F.abort(S),V.abort(S),N.abort(S)},R=(S)=>{if(O)return O;let h=structuredClone(S),p=q;return O=(async()=>{let b=new AbortController,x=b.signal;x.throwIfAborted();let E,z=()=>{},k=new Promise((y,i)=>{if(z=()=>i(x.reason),x.addEventListener("abort",z,{once:!0}),E=setTimeout(()=>b.abort(Error("Hands stop receipt delivery timed out.")),4000),x.aborted)z()});try{for(let y=0;y<3;y+=1){x.throwIfAborted();try{let i=await Promise.race([X1($,"event",()=>$.client.operationEvents($.state,J,{eventSeqStart:p,events:[h],signal:x,transientRetryOwner:"caller"})),k]);if(x.throwIfAborted(),i.next_event_seq!==p+1)throw Error("Hands stop receipt acknowledgement sequence mismatch.");q=i.next_event_seq;return}catch(i){if(E0(i))X(i);let n=i instanceof L0?x1(i.status):S1(i);if(x.aborted||!n||y===2)throw i;let Y0=Math.max(500*2**y,p3(i,($.now?.()??new Date).getTime()));await Promise.race([Z(Y0,x),k])}}}finally{clearTimeout(E),x.removeEventListener("abort",z),b.abort()}})(),O},I=(S,h,p)=>{let b=(E)=>X1($,"event",()=>$.client.operationEvents($.state,J,{eventSeqStart:h,events:S,signal:E,...p?{transientRetryOwner:"caller"}:{}})).catch((z)=>{if(J.capability==="hands.connect"&&n0(z))C(z);if(p&&(E0(z)||n0(z))){if(E0(z))X(z);V.abort(z),N.abort(z),F.abort(z)}throw z});if(!p)return async(E)=>{if(J.capability!=="hands.connect"&&J.capability!=="inference.custom.v1"){q=(await b(E)).next_event_seq;return}E.throwIfAborted();let z=()=>{},k=new Promise((y,i)=>{z=()=>i(E.reason),E.addEventListener("abort",z,{once:!0})});try{let y=await Promise.race([b(E),k]);E.throwIfAborted(),q=y.next_event_seq}finally{E.removeEventListener("abort",z)}};let x=r4({send:b,lease:W,sleep:Z,retryAfterMs:(E)=>p3(E,($.now?.()??new Date).getTime())});return async(E)=>{let z=await x(E);if(z.next_event_seq!==h+S.length)throw Error("Hands generation receipt acknowledgement sequence mismatch.");q=z.next_event_seq}},f=async(S,h)=>{let p=S??await Q8($,J,{controlAckSeq:B,waitMs:h},N.signal,Z,W),b=null,x=!1;for(let E=0;E<10;E+=1){let z=B+1;for(let k of p.controls){if(k.seq!==z)throw Error("Reason returned an out-of-order Device operation control.");if(k.kind==="cancel"||k.kind==="operation.cancel")b??=sZ(k.payload),V.abort(new f0(b,"Reason closed the Device operation."));if(k.kind!=="cancel"&&k.kind!=="operation.cancel"){if(["browser.recording.v1","browser.pr-proof.v1","process.run.v1","process.full.v1"].includes(J.capability)){let y,i,n=new Promise((Y0,q0)=>{y=Y0,i=q0});n.catch(()=>{}),P.current={promise:n,resolve:y,reject:i}}try{x||=!await $.onControl?.(J,k)}catch(y){if(y instanceof f0)M??=Z8(y);throw P.current?.reject(y),y}}B=k.seq,z+=1}if(p.controls.length===0){if(p.next_control_seq!==B+1)throw Error("Reason returned a Device operation control sequence gap.");return{cancellationReason:b,unsupported:x}}try{p=await Q8($,J,{controlAckSeq:B},N.signal,Z,W),P.current?.resolve()}catch(k){if(P.current?.reject(k),!b||n0(k)||E0(k))throw k;return{cancellationReason:b,unsupported:x}}}throw Error("Reason returned too many Device operation control batches.")};try{let S;try{if(!Y)W=new R2(J.lease_until,()=>($.now?.()??new Date).getTime(),(h)=>{if(!V.signal.aborted)H=h;V.abort(h),N.abort(h)});S=Y||J.capability==="hands.connect"||J.capability==="display.stream.v1"||J.capability==="simulator.stream.v1"||f3.has(J.capability)||J.capability==="pty.start"?{cancellationReason:null,unsupported:!1}:await f()}catch(h){if(!u3(J)||n0(h)||E0(h))throw h;await d3($,J,{status:$.signal.aborted?"cancelled":"failed"});return}if(S.cancellationReason||$.signal.aborted){let h=S.cancellationReason??k3($.signal);V.abort(new f0(h,"Reason closed the Device operation.")),U={status:"cancelled",error_code:h}}else if(S.unsupported)V.abort(),U={status:"failed",error_code:"control_unsupported"};else{let h=Y?Promise.resolve():(async()=>{let b=$.operationHeartbeatIntervalMs??$.heartbeatIntervalMs??(["hands.connect","browser.recording.v1","browser.pr-proof.v1","process.run.v1","process.full.v1","preview.serve.v1"].includes(J.capability)?fZ:15000),x=Math.min(b,Math.max(0,($.operationHeartbeatAttemptTimeoutMs??c3)-1000)),E=J.capability==="hands.connect"||J.capability==="pty.start"||J.capability==="display.stream.v1"||J.capability==="simulator.stream.v1"||J.capability==="browser.recording.v1"||J.capability==="browser.pr-proof.v1"||J.capability==="process.run.v1"||J.capability==="process.full.v1"||J.capability==="preview.serve.v1"||J.capability==="inference.custom.v1";while(!N.signal.aborted)try{if(!E){if(await Z(b,N.signal),N.signal.aborted)return}let z=await f(void 0,E?x:void 0);if(z.cancellationReason||z.unsupported){if(z.unsupported)H=Error("Reason requested an unsupported Device operation control.");V.abort(z.cancellationReason?new f0(z.cancellationReason,"Reason closed the Device operation."):void 0);return}}catch(z){if(E0(z))X(z);if(n0(z))H=z,C(z);if(!N.signal.aborted)H=z,V.abort();return}})();try{if(W?.assertCurrent(),V.signal.throwIfAborted(),Q.authorized=()=>!V.signal.aborted&&(Y||(W?.remainingMs()??0)>0),U=await $.onClaim(J,V.signal,async(b)=>{if(u3(J))return;if(b.kind==="permission.denied"){if(!Q.authorized())return;let n=b.data,Y0=($.now??(()=>new Date))().getTime(),q0=$.statusPath??C2(),u0=($.loadStatus??e$)(q0),x0={id:CZ(),kind:"permission_denied",operation:n?.operation,provenance:n?.provenance,occurredAt:new Date(Y0).toISOString(),expiresAt:new Date(Y0+600000).toISOString(),sessionId:J.run_id,deviceId:$.state.deviceId,organizationId:$.state.orgId};if(u0&&I2(x0,Y0)){let s0=u0.permissionRecovery;if(!s0||!I2(s0,Y0)||s0.sessionId!==x0.sessionId||s0.operation!==x0.operation||s0.provenance!==x0.provenance)($.saveStatus??E2)({...u0,permissionRecovery:x0},q0)}return}let x=J.capability==="hands.connect"&&b.capability==="hands.connect"&&b.kind==="hands.stopped",E=J.capability==="hands.connect"&&b.kind==="hands.reconnected",z=E||J.capability==="inference.custom.v1"?AbortSignal.any([V.signal,F.signal,...b.deliverySignal?[b.deliverySignal]:[]]):J.capability==="hands.connect"?AbortSignal.any([$.signal,F.signal]):$.signal,k={kind:b.kind,payload:{sequence:b.sequence,capability:b.capability,...b.data?{data:E?structuredClone(b.data):b.data}:{}}};if(J.capability==="hands.connect"&&b.capability==="hands.connect"&&(b.kind==="started"||b.kind==="hands.started")||(f3.has(J.capability)||J.capability==="pty.start")&&b.kind==="started")return new Promise((n,Y0)=>{L.push({wireEvent:k,settle:(q0)=>q0===void 0?n():Y0(q0)})});let y=L;L=[];let i=T.then(async()=>{if((D||$.signal.aborted)&&J.capability==="hands.connect"&&!Y){if(x)await R(k);return}if(j!==null){if(b.kind!=="hands.stopped"||!A||!_)throw j;let Y0=new AbortController,q0=AbortSignal.any([$.signal,F.signal,Y0.signal]),u0=setTimeout(()=>Y0.abort(Error("Hands stop receipt reconciliation timed out.")),4000);A=!1;try{await _(q0),_=void 0,await I([k],q,!0)(q0),j=null}catch(x0){throw j=x0??Error("Hands stop receipt could not be confirmed."),x0}finally{clearTimeout(u0),Y0.abort()}return}if(E&&!W){let Y0=Math.min(Date.parse(J.lease_until),Date.parse(String(J.payload.expires_at)));W=new R2(new Date(Y0).toISOString(),()=>($.now?.()??new Date).getTime(),(q0)=>{V.abort(q0),N.abort(q0)})}let n=q;if(E)_=I([...y.map((Y0)=>Y0.wireEvent),k],n,!0),await _(z),_=void 0;else await I([...y.map((Y0)=>Y0.wireEvent),k],n,!1)(z)});i.then(()=>{for(let n of y)n.settle()},(n)=>{for(let Y0 of y)Y0.settle(n??Error("Hands event delivery failed."))}),T=i.catch((n)=>{if(E0(n))X(n);if(E){if(j===null)A=z.aborted&&!F.signal.aborted,j=n??Error("Hands generation receipt delivery failed.");if(!z.aborted)V.abort(n),N.abort(n)}}),await i}),["browser.recording.v1","browser.pr-proof.v1","process.run.v1","process.full.v1"].includes(J.capability))await P.current?.promise}catch(b){U=V.signal.aborted?{status:"cancelled",error_code:k3(V.signal)}:{status:"failed",error_code:Z8(b)}}finally{Q.authorized=()=>!1,F.abort();for(let b of L.splice(0))b.settle();N.abort(),await h}let p=K8(J.capability)?U8(U.result,J.operation_id):null;if(H){if(E0(H))throw H;U={status:"failed",error_code:M??"control_or_heartbeat_failed",...p?{result:p}:{}}}else if(V.signal.aborted&&U.status==="succeeded")U={status:"cancelled",error_code:k3(V.signal),...p?{result:p}:{}}}if(W?.close(),E0($.signal.reason))throw $.signal.reason;await d3($,J,U)}finally{W?.close(),F.abort(),N.abort(),$.signal.removeEventListener("abort",G)}}async function a3($){let J=$.now??(()=>new Date),Z=$.sleep??s3,Q=$.saveStatus??E2,X=$.loadStatus??e$,Y=$.statusPath??C2(),V=J().toISOString(),N=X(Y)?.lastUsedAt,G=!1,H=()=>({version:1,pid:process.pid,startedAt:V,...q8(J),...H8(X(Y),$.state,J().getTime()),deviceId:$.state.deviceId,...$.idleSleepPolicy||$.readIdleSleepPolicy?{idleSleepHold:G}:{},...N?{lastUsedAt:N}:{}}),M=0,U,B=!1,q,T,L,F=Promise.resolve();Q({...H(),state:"starting"},Y),$.onEvent?.({type:"started",deviceId:$.state.deviceId}),B8();try{let D=async()=>{let O=$.readIdleSleepPolicy?$.readIdleSleepPolicy():$.idleSleepPolicy;if($.signal.aborted||O===T)return;if(q&&T){let _=await q.release();if($.onEvent?.({type:"idle_sleep",status:_,policy:T}),_==="failed")return;q=void 0,T=void 0,G=!1;let W=X(Y);if(W)Q({...W,idleSleepHold:G},Y)}if(!O)return;T=O;let j=!0;q=await($.acquireAwakeHold??i4)(O,{onStatusChange:(_)=>{if(j)return;G=_==="held";let W=X(Y);if(W)Q({...W,idleSleepHold:G},Y);$.onEvent?.({type:"idle_sleep",status:_,policy:O})}}),j=!1,G=q.status==="held";let A=X(Y);if(A)Q({...A,idleSleepHold:G},Y);$.onEvent?.({type:"idle_sleep",status:q.status,policy:O})};if(await D(),$.readIdleSleepPolicy)L=setInterval(()=>{F=F.then(D).catch(()=>{$.onEvent?.({type:"idle_sleep",status:"failed",policy:T??"battery_and_ac"})})},$.idleSleepPollMs??1000),L.unref();while(!$.signal.aborted){let O=!1;try{await eZ({...$,saveStatus:(j,A)=>{if(j.state==="starting"||j.state==="error"||j.state==="stopped")return;N=j.lastUsedAt??N,Q({...j,startedAt:V,...$.idleSleepPolicy||$.readIdleSleepPolicy?{idleSleepHold:G}:{}},A)},onEvent:(j)=>{if(j.type==="error"&&j.diagnostic){$.onEvent?.(j);return}if(j.type==="started"||j.type==="error"||j.type==="stopped")return;if(j.type==="heartbeat"&&M>0&&!O){O=!0;let A=M;M=0,U=void 0,$.onEvent?.({type:"reconnected",attempts:A})}$.onEvent?.(j)}});return}catch(j){if(g3(j,$.signal))return;if(E0(j)){B=!0;let _=$.state.worker?"worker_connection_failed":m3(j);throw Q({...H(),state:"error",error:_},Y),$.onEvent?.({type:"error",message:_}),j}M+=1;let A=aZ(M,$.reconnectRandom);U??=J().toISOString(),Q({...H(),state:"starting",reconnectingSince:U},Y),$.onEvent?.({type:"reconnecting",message:$.state.worker?"worker_connection_failed":m3(j),attempt:M,retryInMs:A}),await Z(A,$.signal)}}}catch(D){if(!g3(D,$.signal))throw D}finally{if($.client.close?.(),clearInterval(L),await F,q&&T){let D=await q.release();G=D==="failed"&&q.status==="held",$.onEvent?.({type:"idle_sleep",status:D,policy:T})}if(!B)Q({...H(),state:"stopped"},Y);else{let D=X(Y);if(D)Q({...D,idleSleepHold:G},Y)}$.onEvent?.({type:"stopped"})}}async function eZ($){let J=$.now??(()=>new Date),Z=$.sleep??s3,Q=$.statusPath??C2(),X=$.saveStatus??E2,Y=$.loadStatus??e$,V=J().toISOString(),N=Y(Q)?.lastUsedAt,G=$.runtimeUpdate,H=new AbortController,M=()=>H.abort($.signal.reason);if($.signal.aborted)M();else $.signal.addEventListener("abort",M,{once:!0});let U=G?.random??Math.random,B=$.maxConcurrentClaims,q=typeof B==="number"&&Number.isSafeInteger(B)&&B>0?Math.min(kZ,B):yZ,T=0,L=!1,F=null,D=(m)=>{F??=m,H.abort(m)},O=new Map,j=()=>{let m=new Set,J0=0;for(let{claim:_$}of O.values()){let N$=_$.capability==="hands.connect"?_$.payload[X8]:void 0;if(typeof N$==="string"){if(m.has(N$))continue;m.add(N$)}J0+=1}return J0},A=null,_=()=>[...O.values()].some((m)=>m.authorized()),W=()=>[...O.values()].every((m)=>m.claim.capability==="preview.serve.v1"),P=G?new Date(V).getTime()+h3(G.initialDelayMs??gZ,U):Number.POSITIVE_INFINITY,C=null,R=!1,I=$.firstHeartbeat,f=I?.account_root_metadata_supported===!0,S=I?.workspace_root_metadata_supported===!0,h=I?.account_root_path_supported===!0,p=I?.home_contained_roots_supported===!0,b=I?.root_paths_supported===!0,x=I?.startup_supported===!0,E=I!==void 0,z=I?{challenge:I.challenge,expires_at:I.expires_at}:void 0,k,y=!$.startup,i=()=>({version:1,pid:process.pid,startedAt:V,...q8(J),...H8(Y(Q),$.state,J().getTime()),...N?{lastUsedAt:N}:{},deviceId:$.state.deviceId,...C?{organizationId:C.organization_id,organizationName:C.organization_name,organizationSlug:C.organization_slug}:{}}),n=()=>{let m=($.advertised??$.claimable)?.()!==!1;if(!y)k??=$.startup?.();return{...$.deviceMetadata?.device_model!=null?{device_model:$.deviceMetadata.device_model}:{},...$.deviceMetadata?.device_chip!=null?{device_chip:$.deviceMetadata.device_chip}:{},...$.deviceMetadata?.device_location!=null?{device_location:$.deviceMetadata.device_location}:{},reason_runtime_version:$.runtimeVersion,bridge_version:$.bridgeVersion,protocol_version:$.protocolVersion,execution_eligible:m,...x&&!y&&k?{startup:k}:{},capabilities:m?G8($.capabilities,{accountRootMetadataSupported:f,workspaceRootMetadataSupported:S,accountRootPathSupported:h,homeContainedRootsSupported:p,rootPathsSupported:b}):{supported_operations:[]}}},Y0=()=>{if(R||!$.client.identity)return;R=!0,$.client.identity($.state,$.signal).then((m)=>{if(m.organization_id!==$.state.orgId)return;C=m;let J0=Y(Q);if(!J0)return;X({...J0,organizationId:m.organization_id,organizationName:m.organization_name,organizationSlug:m.organization_slug},Q)}).catch(()=>{return})},q0=(m)=>{f=m.account_root_metadata_supported===!0,S=m.workspace_root_metadata_supported===!0,h=m.account_root_path_supported===!0,p=m.home_contained_roots_supported===!0,b=m.root_paths_supported===!0,x=m.startup_supported===!0,E=!1},u0=(m)=>{if(m.startup)y=!0},x0=(m,J0)=>{if(!(J0 instanceof L0&&J0.status===400&&J0.code==="invalid_heartbeat")||!m.startup&&!E)throw J0;if(y=!0,E)f=S=h=!1,p=b=x=E=!1;return null},s0=(m)=>{q0(m),X({...i(),state:"connected",lastHeartbeatAt:J().toISOString()},Q),Y0(),$.onEvent?.({type:"heartbeat",serverTime:m.server_time,drain:m.drain,...m.latest_cli_versions?{latestCliVersions:m.latest_cli_versions}:{},...m.hands_prespawn?{handsPrespawn:!0}:{}})},S$=!1,i$=!1;$.registerHeartbeatNow?.(()=>{if($.signal.aborted)return;if(S$)i$=!0;let m=n();X1($,"heartbeat",()=>$.client.heartbeat($.state,m,H.signal).catch((J0)=>x0(m,J0))).then((J0)=>{if(!J0)return;u0(m),q0(J0),s0(J0)},()=>{return})});let F$=(m)=>Z(m,$.signal);X({...i(),state:"starting"},Q),$.onEvent?.({type:"started",deviceId:$.state.deviceId});let K$=!1,b$=$.maxConsecutiveHeartbeatFailures??3,U$=0,d0=0,j1=0,n$=null;try{while(!$.signal.aborted){if(F)throw F;if(L&&W())break;let m,J0=d0>0&&d0<SZ&&performance.now()-j1<bZ&&n$!==null;if(!J0)d0=0;$:{if(J0&&n$){m=n$;break $}let Q0=n(),a0=z;z=void 0,S$=!0,i$=!1;try{let D0=await X1($,"heartbeat",()=>$.client.heartbeat($.state,Q0,H.signal,...a0?[a0]:[]).catch((o0)=>x0(Q0,o0)));if(S$=!1,!D0)continue;m=D0,u0(Q0),j1=performance.now(),U$=0}catch(D0){if(S$=!1,$.signal.aborted)break;if(!P2(D0))throw D0;if(U$+=1,U$>=b$&&!_())throw D0;await Z(Math.min($.heartbeatRetryDelayMs??2000,$.heartbeatIntervalMs??15000),$.signal);continue}if(q0(m),Object.keys(n().capabilities).length>Object.keys(Q0.capabilities).length)continue;if(i$)continue;if(s0(m),F)throw F;if($.signal.aborted)break;if(G&&["available","required"].includes(m.update_policy??""))P=Math.min(P,J().getTime());if(G&&J().getTime()>=P)try{let D0=new AbortController,o0=()=>D0.abort($.signal.reason);if($.signal.aborted)o0();else $.signal.addEventListener("abort",o0,{once:!0});let j$;try{j$=G.check(D0.signal)}catch(A0){j$=Promise.reject(A0)}let w$=j$.then((A0)=>({kind:"completed",result:A0}),(A0)=>({kind:"failed",error:A0})),r$;try{while(!0){let A0=await iZ(w$,$.heartbeatIntervalMs??15000,$.signal,Z);if($.signal.aborted)throw $.signal.reason??new DOMException("Aborted","AbortError");if(A0.kind==="failed")throw new v3(A0.error);if(A0.kind==="completed"){r$=A0.result;break}try{let W0=n(),D1=await X1($,"heartbeat",()=>$.client.heartbeat($.state,W0,H.signal).catch((J2)=>x0(W0,J2)));if(!D1)continue;m=D1,u0(W0),s0(m),U$=0}catch(W0){if($.signal.aborted)throw W0;if(!P2(W0))throw W0;if(U$+=1,U$>=b$&&!_())throw W0}}}catch(A0){D0.abort(A0);let W0=await w$;if(W0.kind==="completed"&&W0.result==="activated")r$="activated";else throw A0}finally{$.signal.removeEventListener("abort",o0)}if($.signal.aborted)throw $.signal.reason??new DOMException("Aborted","AbortError");if(T=0,r$==="activated"){if($.signal.aborted)throw $.signal.reason??new DOMException("Aborted","AbortError");$.onEvent?.({type:"runtime_updated"}),L=!0}P=J().getTime()+h3(G.intervalMs??uZ,U)}catch(D0){if(!(D0 instanceof v3))throw D0;T+=1;let o0=G.retryBaseMs??dZ,j$=G.retryMaxMs??pZ,w$=Math.min(j$,o0*2**Math.min(T-1,8));P=J().getTime()+h3(w$,U)}}if(n$=m,$.signal.aborted)break;if(L&&W())break;if(L){await F$($.heartbeatIntervalMs??15000);continue}let _$=$.client.sessionCadence?.($.state)??null,N$=_$?.presenceIntervalMs??$.heartbeatIntervalMs??15000;if(m.drain||$.claimable?.()===!1){d0=0,await F$(N$);continue}if(j()>=q){d0=0;let Q0=new AbortController;A=Q0;try{await Z(N$,AbortSignal.any([$.signal,Q0.signal]))}catch(a0){if(!Q0.signal.aborted)throw a0}finally{if(A===Q0)A=null}continue}let w,a=J0?0:_$?.claimWaitMs??Math.min($.heartbeatIntervalMs??15000,30000),M0=performance.now();try{w=await X1($,"claim",()=>$.client.claimOperation($.state,{waitMs:a,signal:H.signal}))}catch(Q0){if(d0=0,$.signal.aborted||!P2(Q0)||!_())throw Q0;await F$(Math.min($.heartbeatRetryDelayMs??2000,$.heartbeatIntervalMs??15000));continue}if(F)throw F;if(!w){if(J0){d0=0;continue}if(performance.now()-M0<a-xZ)await F$(EZ);continue}if($.claimable?.()===!1){d0=0,await d3($,w,{status:"cancelled",error_code:"execution_authority_withdrawn"},$.signal);continue}N=J().toISOString(),X({...i(),state:"connected",lastHeartbeatAt:J().toISOString()},Q),$.onEvent?.({type:"claim",operationId:w.operation_id,runId:w.run_id,attemptId:w.attempt_id,capability:w.capability});let j0,S0={authorized:()=>!1,claim:w};if(j0=oZ({...$,signal:H.signal},w,Z,S0,D).catch((Q0)=>{if(E0(Q0))D(Q0);else if(!n0(Q0)&&[...O].some(([a0,D0])=>a0!==j0&&D0.authorized())){if(Q0 instanceof w1)$.onEvent?.({type:"error",message:"operation_completion_timeout",diagnostic:{stage:"completion",category:"timeout"}});return}if(!n0(Q0)&&F===null)F=Q0}).finally(()=>{O.delete(j0),A?.abort(),$.onEvent?.({type:"claims_changed",activeClaims:O.size})}),O.set(j0,S0),$.onEvent?.({type:"claims_changed",activeClaims:O.size}),d0+=1,T8(w)){if(d0=0,await j0,F)throw F}}}catch(m){if(!g3(m,$.signal)){H.abort(m),K$=!0;let J0=$.state.worker?"worker_connection_failed":m3(m);throw X({...i(),state:"error",error:J0},Q),$.onEvent?.({type:"error",message:J0}),m}}finally{if(H.abort(),await Promise.allSettled(O.keys()),$.signal.removeEventListener("abort",M),!K$)X({...i(),state:"stopped"},Q);$.onEvent?.({type:"stopped"})}}import{execFile as PQ}from"child_process";import{constants as m8,existsSync as IQ,mkdtempSync as o3,rmSync as Z5}from"fs";import{access as g8,open as CQ,readFile as u8,readlink as EQ,readdir as d8,unlink as xQ,rmdir as SQ}from"fs/promises";import{tmpdir as bQ}from"os";import{basename as e3,join as y2}from"path";import{randomUUID as m$}from"crypto";import{chmodSync as $Q,closeSync as JQ,fsyncSync as ZQ,openSync as QQ,readFileSync as XQ,rmdirSync as L8,unlinkSync as j8,writeFileSync as YQ}from"fs";import{createConnection as VQ,createServer as GQ}from"net";import{dirname as BQ,join as KQ}from"path";var UQ=5000;async function D8($,J,Z){if(Z.aborted)return!1;let Q={generation:1,fenceId:m$()},X={runId:m$(),deviceId:m$(),rootId:m$(),apiOrigin:$.apiOrigin,binding:{kind:"workspace_source",target_revision:1,root_grant_revision:1},expiresAtMs:Date.now()+30000,identity:()=>Q},Y=_8(J,X),V={version:1,snapshot_id:m$(),revision:1,run_id:X.runId,device_id:X.deviceId,root_id:X.rootId,binding:{...X.binding,target_generation:Q.generation,target_fence_id:Q.fenceId},expires_at:new Date(X.expiresAtMs).toISOString(),variables:{WORKER_PROBE:"synthetic-readiness"},git:null};try{return Y.install(V).installed&&Y.current().snapshot_id===V.snapshot_id&&!Z.aborted}catch{return!1}finally{try{j8(Y.path)}catch{}}}async function W8($,J,Z=F8){if(J.aborted)return!1;let Q,X,Y=new Set,V=m$(),N=GQ((B)=>{Y.add(B),B.once("close",()=>Y.delete(B)),B.on("error",()=>B.destroy()),B.end(V)});N.maxConnections=1;let G,H,M=new Promise((B)=>{H=()=>B(!1)}),U=setTimeout(H,UQ);J.addEventListener("abort",H,{once:!0});try{Q=Z({runtimeDirectory:g($),root:$.workspaceRoot,runId:`readiness-${m$()}`}),X=KQ(Q.journalDirectory,"readiness.json");let B=QQ(X,"wx",384);try{YQ(B,V),ZQ(B)}finally{JQ(B)}if(XQ(X,"utf8")!==V||J.aborted)return!1;let q=new Promise((T)=>{N.once("error",()=>T(!1)),N.listen(Q.socketPath,()=>{try{if(process.platform!=="win32")$Q(Q.socketPath,384)}catch{T(!1);return}G=VQ(Q.socketPath);let L="";G.setEncoding("utf8"),G.once("error",()=>T(!1)),G.on("data",(F)=>{if(L+=F,L.length>V.length)G?.destroy(),T(!1)}),G.once("end",()=>T(L===V)),G.once("close",()=>T(!1))})});return await Promise.race([q,M])&&!J.aborted}catch{return!1}finally{clearTimeout(U),J.removeEventListener("abort",H),G?.destroy();for(let B of Y)B.destroy();if(await new Promise((B)=>N.close(()=>B())),Q?.disposeSocket(),X)try{j8(X)}catch{}if(Q){try{L8(Q.journalDirectory)}catch{}try{L8(BQ(Q.journalDirectory))}catch{}}}}import{execFileSync as b2}from"child_process";import{randomUUID as l0}from"crypto";import{chmodSync as O8,chownSync as h8,closeSync as i3,constants as M$,existsSync as NQ,fstatSync as f8,mkdirSync as z8,mkdtempSync as HQ,openSync as n3,readFileSync as qQ,readSync as MQ,realpathSync as TQ,rmdirSync as LQ,rmSync as FQ}from"fs";import{join as g$}from"path";import{fileURLToPath as _Q}from"url";var A8=1e4,jQ=!1;function w2(){if(process.platform!=="linux")return!1;return jQ||=["/usr/bin/tmux","/usr/local/bin/tmux","/bin/tmux"].some(($)=>{try{let J=b2($,["-V"],{encoding:"utf8",timeout:2000,env:{PATH:"/usr/bin:/bin"},stdio:["ignore","pipe","ignore"]}),Z=/^tmux (?:next-)?([0-9]+)\.([0-9]+)/.exec(J);return Z!==null&&Number(Z[1])*100+Number(Z[2])>=302}catch{return!1}})}var DQ=Buffer.from([0,255,3,4]);function R8($){return`printf "%s\\n" ${$==="foreground"?"$$":"$!"} > ${$}.pid.tmp; /bin/mv ${$}.pid.tmp ${$}.pid`}function WQ($,J,Z){if(!Number.isSafeInteger(J)||J<2||!Number.isSafeInteger(Z)||Z<2||$.length>4096||!$.startsWith(`${J} (`))return!1;let Q=$.lastIndexOf(") ");if(Q<0)return!1;let X=$.slice(Q+2).trim().split(/\s+/);return X.length>=20&&/^[A-Za-z]$/.test(X[0])&&/^\d+$/.test(X[1])&&X[2]===String(J)&&X[3]===String(Z)&&/^[1-9][0-9]*$/.test(X[19])}async function y1($,J={}){if(process.platform==="win32")return!$.aborted&&k8();if($.aborted||!["darwin","linux"].includes(process.platform)||typeof Bun>"u")return!1;let Z=S2(),{directory:Q,root:X,runtimeDirectory:Y}=AQ(Z),V=new AbortController,N=()=>V.abort();$.addEventListener("abort",N,{once:!0});let G;V.signal.addEventListener("abort",()=>G?.close(),{once:!0});let H=setTimeout(N,A8),M={organization_id:l0(),user_id:l0(),device_id:l0()},U=l0(),B=l0(),q=l0(),T=l0(),L=Date.now()+A8,F={kind:"workspace_source",target_revision:0,root_grant_revision:1},D=l0().replaceAll("-",""),O,j=Buffer.alloc(0),A,_=!1,W=!1,P=!1,C=!1,R,I,f,S=async(p)=>{while(!p()){if(V.signal.aborted)throw Error("pty_probe_cancelled");await new Promise((b)=>setTimeout(b,20))}if(V.signal.aborted)throw Error("pty_probe_cancelled")},h=!1;try{G=OQ(Q,Z),R=Bun.serve({hostname:"127.0.0.1",port:0,fetch(x,E){let z=new URL(x.url).pathname,k=z===`/device/hands/${D}`?"hands":z===`/device/pty/${D}`?"pty":null;if(k&&E.upgrade(x,{data:{lane:k}}))return;return new Response(null,{status:404})},websocket:{maxPayloadLength:8192,open(x){if(x.data.lane==="pty")O=x},message(x,E){if(x.data.lane!=="pty")return;if(typeof E==="string"){try{if(JSON.parse(E).t==="open")_=!0}catch{N()}return}if(j.length+E.length>8192){N();return}j=Buffer.concat([j,E])}}});let p=`ws://127.0.0.1:${R.port}`;if(I=r3({headless:!0,managedPty:{version:1},root:X,runtimeDirectory:Y,runId:U,operationId:l0(),attemptId:l0(),claimOwner:M,deviceIdentity:{deviceId:M.device_id,rootId:B,apiOrigin:"https://worker-probe.invalid"},signal:V.signal,payload:{relay_url:`${p}/device/hands/${D}`,session_id:"pty-readiness",environment_id:"pty-readiness",expires_at:new Date(L).toISOString(),policy_mode:"full_access",policy_version:1,hands_protocol_version:P8,hands_worker_version:E8,hands_worker_artifact_sha256:S8,hands_worker_entrypoint:x8,target_generation:1,target_fence_id:q,environment_binding:F,[b8]:w8},emitEvent:async(x)=>{if(x==="hands.started")C=!0;if(x==="hands.ready")W=!0;if(x==="hands.stopped")P=!0}},{browserExecutablePath:null,slot:y8(),readyTimeoutMs:3000,logDiagnostic:()=>{return},resolvePathEnvironment:async()=>({path:"/usr/bin:/bin:/usr/sbin:/sbin",source:"fallback"}),sourceEntrypoint:_Q(new URL("./worker-candidate-entry.ts",import.meta.url)),...J}).catch(()=>{if(!W)N()}),await S(()=>W),I8({root:X,runId:U,payload:{version:1,snapshot_id:T,revision:1,run_id:U,root_id:B,device_id:M.device_id,binding:{...F,target_generation:1,target_fence_id:q},expires_at:new Date(L).toISOString(),variables:{PTY_PROBE_VALUE:D},git:null}}),f=C8({root:X,runId:U,rootId:B,deviceId:M.device_id,owner:M,workspace:{kind:"root"},authority:{device_id:M.device_id,binding:F.kind,target_revision:0,root_grant_revision:1,target_generation:1,target_fence_id:q},signal:V.signal,session:{jobId:`pty-${l0()}`,sessionId:"pty-readiness",operationId:l0(),cols:80,rows:24,leaseExpiresAtMs:L,relayUrl:`${p}/device/pty/${D}`},emit:async(x,E)=>{if(x==="pty.ready")A=E}}).catch(()=>{N()}),await S(()=>Boolean(A&&O&&_)),O.send(JSON.stringify({t:"resize",cols:100,rows:30})),O.send(Buffer.from(`stty -echo; test "$PTY_PROBE_VALUE" = '${D}' || exit 19; stty size; printf '\\000\\377\\003\\004'; (trap '' TERM HUP; ${G.wait("background")}) & ${R8("background")}; /bin/bash --noprofile --norc -c 'trap "" TERM HUP; ${R8("foreground")}; ${G.wait("foreground")}'
17
- `)),await S(()=>NQ(g$(X,"foreground.pid"))&&j.includes(DQ)),!j.includes("30 100")||A.job.environmentSnapshotId!==T||A.job.environmentRevision!==1)return!1;let b=["background.pid","foreground.pid"].map((x)=>zQ(g$(X,x)));if(new Set(b).size!==2||b.some((x)=>!Number.isSafeInteger(x)||x<2||x===A.job.process.pid))return!1;if(process.platform==="linux"){if(!b.every((x)=>WQ(qQ(`/proc/${x}/stat`,"utf8"),x,A.job.process.pid)))return!1}else{let E=b2("/bin/ps",["-o","pid=,pgid=","-p",b.join(",")],{env:{PATH:"/usr/bin:/bin"},encoding:"utf8",timeout:1000,maxBuffer:1024}).trim().split(`
18
- `).map((z)=>z.trim().split(/\s+/).map(Number));if(E.length!==2||new Set(E.map(([z])=>z)).size!==2||E.some((z)=>z.length!==2||!b.includes(z[0])||z[0]!==z[1]))return!1}if(O.send(JSON.stringify({t:"close"})),await f,V.signal.aborted)return!1;for(let x of[A.job.process.pid,...b])try{return process.kill(x,0),!1}catch(E){if(!(E instanceof Error&&("code"in E)&&E.code==="ESRCH"))return!1}h=!0}catch{h=!1}finally{if(clearTimeout(H),$.removeEventListener("abort",N),N(),G?.close(),await f,await I,await R?.stop(!0),!C||P)RQ({directory:Q,root:X},Z)}return h&&P&&!$.aborted}function OQ($,J){let Z={foreground:g$($,"foreground.lifeline"),background:g$($,"background.lifeline")};if(!Object.values(Z).every((Y)=>/^\/[A-Za-z0-9/._-]+$/.test(Y)))throw Error("pty_probe_path");b2("/usr/bin/mkfifo",["-m","0600",...Object.values(Z)],{env:{PATH:"/usr/bin:/bin"},stdio:"ignore",timeout:1000});let Q=[],X=()=>{for(let Y of Q.splice(0))i3(Y)};try{for(let Y of Object.values(Z)){let V=n3(Y,M$.O_RDONLY|M$.O_NONBLOCK|M$.O_NOFOLLOW);try{if(Q.push(n3(Y,M$.O_WRONLY|M$.O_NONBLOCK|M$.O_NOFOLLOW)),!f8(Q.at(-1)).isFIFO())throw Error("pty_probe_lifeline")}finally{i3(V)}if(J)h8(Y,J.uid,J.gid)}}catch(Y){throw X(),Y}return{wait:(Y)=>`exec 3<>${Z[Y]} <${Z[Y]} 3>&-; exec /bin/cat`,close:X}}function v8($=(J)=>y1(J)){let J=new AbortController,Z=JSON.stringify(S2()),Q=(async()=>{try{return await $(J.signal)===!0&&!J.signal.aborted}catch{return!1}})();return{result:Q,matches:(X)=>X.executionMode==="host"&&JSON.stringify(S2())===Z,stop:async(X=1500)=>{J.abort();let Y;await Promise.race([Q,new Promise((V)=>{Y=setTimeout(V,X)})]),clearTimeout(Y)}}}function zQ($){let J;try{J=n3($,M$.O_RDONLY|M$.O_NOFOLLOW|M$.O_NONBLOCK)}catch{return Number.NaN}try{let Z=f8(J);if(!Z.isFile()||Z.size>32)return Number.NaN;let Q=Buffer.alloc(32),X=MQ(J,Q,0,Q.length,0),Y=Q.subarray(0,X).toString("utf8").trim();return/^[0-9]{1,10}$/.test(Y)?Number(Y):Number.NaN}catch{return Number.NaN}finally{i3(J)}}function AQ($,J=TQ("/tmp")){let Z=HQ(g$(J,"reason-pty-probe-")),Q=g$(Z,"workspace"),X=g$(Z,"private");if(z8(Q,{mode:448}),z8(X,{mode:448}),$)O8(Z,493),O8(Q,493),h8(Q,$.uid,$.gid);return{directory:Z,root:Q,runtimeDirectory:X}}function RQ($,J){if(J)try{b2("/usr/bin/setpriv",[`--reuid=${J.uid}`,`--regid=${J.gid}`,"--clear-groups","--no-new-privs","--","/usr/bin/find",$.root,"-mindepth","1","-delete"],{env:{PATH:"/usr/bin:/bin"},stdio:"ignore",timeout:2000}),LQ($.root)}catch{return}FQ($.directory,{recursive:!0,force:!0})}var Q5=5000,u$="ARA_WORKER_PROBE_READY";function wQ($,J,Z,Q,X){if(X.aborted)return Promise.resolve(!1);return new Promise((Y)=>{PQ($,J,{cwd:Z,env:Q,signal:X,timeout:Q5,killSignal:"SIGKILL",maxBuffer:4096,encoding:"utf8",windowsHide:!0},(V,N)=>Y(!V&&!X.aborted&&N===u$))})}function yQ($,J){let Z=e3($).replace(/\.exe$/i,"");if(Z==="bash")return["--noprofile","--norc","-c",J];if(Z==="zsh"||Z==="sh")return["-f","-c",J];return null}function kQ($,J){let Z=s8({home:J,temporaryDirectory:J}),Q=(Y,V,N)=>wQ(Y,V,$.workspaceRoot,Z,N),X=async(Y,V,N,G=(M)=>M===u$,H=!1)=>{let M=process.platform==="win32"?o3(y2(bQ(),"reason-device-probe-")):$.workspaceRoot;try{let U=await $5(Y,V,{cwd:M,root:M,allowWrite:!1,allowProcessInspection:H,timeoutMs:Q5,signal:N,workerProbe:!0}),B=!N.aborted&&!U.timedOut&&!U.truncated&&U.exitCode===0&&G(U.stdout);if(!B&&process.platform==="win32")process.stderr.write(`Reason worker: confined ${e3(Y)} probe failed (exit ${U.exitCode}${U.timedOut?", timed out":""}): ${U.stderr.slice(-300).trim()}
19
- `);return B}catch(U){if(process.platform==="win32")process.stderr.write(`Reason worker: confined ${e3(Y)} probe failed: ${String(U)}
20
- `);throw U}finally{if(M!==$.workspaceRoot)Z5(M,{recursive:!0,force:!0})}};return{workspaceRead:async(Y)=>{return await g8($.workspaceRoot,m8.R_OK),await d8($.workspaceRoot),!Y.aborted},workspaceWrite:async(Y)=>{if(await g8($.workspaceRoot,m8.W_OK),Y.aborted)return!1;let V=o3(y2($.workspaceRoot,".ara-worker-probe-")),N=y2(V,"receipt");try{let G=await CQ(N,"wx",384);try{await G.writeFile(u$),await G.sync()}finally{await G.close()}return await u8(N,"utf8")===u$&&!Y.aborted}finally{await xQ(N).catch(()=>{}),await SQ(V).catch(()=>{})}},confinedShell:(Y)=>{if(process.platform==="win32"&&!k1())return process.stderr.write(`Reason worker: ${a8}
21
- `),Promise.resolve(!1);return X(e8(),["-c",`printf ${u$}`],Y)},confinedGit:(Y)=>X("git",["--version"],Y,(V)=>/^git version \S+/.test(V)),processInspection:async(Y)=>{if(process.platform==="darwin")return X("/usr/sbin/lsof",["-a","-p",String(process.pid),"-d","cwd","-Fn"],Y,(H)=>H.includes(`p${process.pid}
22
- `)&&/^n\//m.test(H),!0);if(process.platform==="win32")return i8(Y);if(process.platform!=="linux")return!1;let[V,N,G]=await Promise.all([EQ("/proc/self/cwd"),d8("/proc/self/fd"),u8("/proc/net/tcp","utf8")]);return!Y.aborted&&V.length>0&&N.length>0&&G.includes("local_address")},bash:async(Y)=>{let V=process.platform==="win32"?Y1():"/bin/bash";if(!V)return process.stderr.write(`Reason worker: ${process.platform==="win32"?c8:"bash is unavailable"}
23
- `),!1;return Q(V,["--noprofile","--norc","-c",`printf ${u$}`],Y)},jobs:(Y)=>W8($,Y),environment:(Y)=>D8($,J,Y),preview:(Y)=>J5(J,Y),boundPty:(Y)=>y1(Y),desktopDisplay:()=>o8(),desktopAutomation:async()=>{let Y=J9();if(Y)process.stderr.write(`Reason worker: computer and browser use need setup (${Y})
24
- `);return Y5()},desktopBrowser:async()=>f1()?.features.browser===!0,fullControlShell:(Y)=>{let V=t8(),N=yQ(V,`printf ${u$}`);return N?Q(V,N,Y):Promise.resolve(!1)}}}function J9(){return process.platform==="darwin"&&f1()?.features.computer===!0?l8():null}var Z9=["pty.start","tunnel.open","tunnel.close","preview.serve.v1","display.stream.v1","automation.call.v1","browser.pr-proof.v1"];async function hQ($,J,Z=new AbortController().signal,Q={read:!0,write:!1},X=$9()){return h1($,J,Z,Q,X).final}function h1($,J,Z=new AbortController().signal,Q={read:!0,write:!1},X=$9(),Y,V){let N,G;try{if(H$($),m0(),!J)o(g($),!0),N=o3(y2(g($),"probe-")),J=kQ($,N);G=J}catch(O){let j=Promise.reject(O);return j.catch(()=>{}),{initial:j,final:j,pty:j}}let H=async(O,j)=>{if(Z.aborted||!j&&!G[O])return!1;let A,_=new Promise((W)=>{A=()=>W(!1)});Z.addEventListener("abort",A,{once:!0});try{return await Promise.race([j??G[O](Z),_])===!0&&!Z.aborted}catch{return!1}finally{Z.removeEventListener("abort",A)}},M=$.executionMode==="host",U=M?H("boundPty",Y):Promise.resolve(!1),B=Promise.resolve(V).then(()=>Promise.all(M?[H("preview"),U,H("desktopDisplay"),H("desktopAutomation"),H("desktopBrowser")]:[!1,!1,!1,!1,!1]),()=>[!1,!1,!1,!1,!1]),q=(async()=>{let[O,j,A,_,W,P,C,R,I]=await Promise.all([Promise.resolve(Q).then((f)=>f.read?H("workspaceRead"):!1,()=>!1),Promise.resolve(Q).then((f)=>f.write?H("workspaceWrite"):!1,()=>!1),X?H("confinedShell"):!1,X?H("confinedGit"):!1,H("processInspection"),...M?[H("bash"),H("jobs"),H("environment"),H("fullControlShell")]:[!1,!1,!1,!1]]);if(M&&(!P||!C||!R)&&!V)await B;if(M){if(!P)P=await H("bash");if(!C)C=await H("jobs");if(!R)R=await H("environment")}return{read:O,write:j,shell:A,git:_,processes:W,bash:P,jobs:C,environment:R,full:I}})(),T=(O,j)=>{let{read:A,write:_,shell:W,git:P,processes:C,bash:R,jobs:I,environment:f,full:S}=O,{preview:h,boundPty:p,desktopDisplay:b,desktopAutomation:x,desktopBrowser:E}=j,z=n8(),k=M&&process.platform==="darwin"&&S&&IQ("/Library/Developer/PrivateFrameworks/CoreSimulator.framework");return Object.freeze({"fs.read":A,"fs.write":_,"inference.custom.v1":M&&A,"fs.export":A&&z,"fs.import":_&&z,"exec.run":W&&X,"git.run":W&&P&&X,"process.list":(process.platform==="linux"||process.platform==="win32"||W)&&C,"ports.list":(process.platform==="linux"||process.platform==="win32"||W)&&C,"exec.full":R&&S&&X,"hands.connect":A&&_&&R&&I,"jobs.control":A&&_&&R&&I,"pty.start":A&&_&&R&&I&&f&&p,"environment.install":A&&_&&R&&I&&f,"github.local.v1":(process.platform==="darwin"||process.platform==="win32"||process.platform==="linux"&&process.geteuid?.()!==0)&&A&&_&&R&&I&&f,"tunnel.open":A&&_&&R&&I&&f&&h,"tunnel.close":A&&_&&R&&I&&f&&h,"preview.serve.v1":A&&R&&I&&h&&S,"display.stream.v1":b,"automation.call.v1":x,"simulator.call.v1":k,"simulator.stream.v1":k,"browser.pr-proof.v1":x&&E&&p8()===null&&process.platform!=="win32","workspace.setup.v1":M&&r8()})},L=q.then(async(O)=>T(O,{preview:!1,boundPty:await Promise.race([U,new Promise((j)=>setImmediate(()=>j(!1)))]),desktopDisplay:!1,desktopAutomation:!1,desktopBrowser:!1})),F=(async()=>{try{let O=await q,[j,A,_,W,P]=await B;if(M&&!A&&O.read&&O.write&&O.bash&&O.jobs&&O.environment)A=await H("boundPty");return T(O,{preview:j,boundPty:A,desktopDisplay:_,desktopAutomation:W,desktopBrowser:P})}finally{if(N)Z5(N,{recursive:!0,force:!0})}})();L.catch(()=>{});let D=(async()=>{let O=await q;if(!(O.read&&O.write&&O.bash&&O.jobs&&O.environment))return!1;return await U||(await F)["pty.start"]===!0})();return D.catch(()=>{}),{initial:L,final:F,pty:D}}var fQ=["hands.connect","jobs.control","pty.start","environment.install","tunnel.open","tunnel.close","preview.serve.v1"],vQ=[60000,300000,900000];function t3($,J){if($.executionMode!=="host"||J["fs.read"]!==!0)return[];return fQ.filter((Z)=>J[Z]!==!0)}function X5($){let J=$.log??((Y)=>{process.stderr.write(Y)}),Z=$.resolve??((Y)=>hQ($.config,void 0,Y,$.permissions)),Q=$.readiness,X=t3($.config,Q);if(X.length===0)return Promise.resolve();return J(`Reason worker: withheld at start (${X.join(", ")}); probing them again while idle.
25
- `),(async()=>{for(let Y of $.delaysMs??vQ){if(await new Promise((G)=>{let H=setTimeout(G,Y);$.signal.addEventListener("abort",()=>{clearTimeout(H),G()},{once:!0})}),$.signal.aborted)return;if(!$.idle())continue;let V;try{V=await Z(AbortSignal.any([$.signal,AbortSignal.timeout(30000)]))}catch{continue}if($.signal.aborted)return;let N=t3($.config,Q).filter((G)=>V[G]===!0);if(N.length>0)Q=Object.freeze({...Q,...Object.fromEntries(N.map((G)=>[G,!0]))}),J(`Reason worker: ready after probing again (${N.join(", ")}).
26
- `),$.onReady(Q,N);if(t3($.config,Q).length===0)return}})()}import{execFile as hX}from"child_process";import{createHash as fX,randomUUID as _9}from"crypto";import{lstat as vX,readdir as l5,readFile as n5,realpath as mX,stat as gX}from"fs/promises";import{basename as uX,join as L9}from"path";import{promisify as dX}from"util";import{createConnection as mQ}from"net";import{endianness as B5}from"os";var v1=4,Q9=1e4;class P${socketPath;sessionId;turnId;timeoutMs;#J=null;#$=Buffer.alloc(0);#Y=1;#Z=new Map;#Q=new Set;constructor($){this.socketPath=$.socketPath,this.sessionId=$.sessionId??"open-browser-use-js",this.turnId=$.turnId??`turn-${Date.now()}`,this.timeoutMs=$.timeoutMs??1e4}async connect(){if(this.#J)return this;let $=mQ(this.socketPath);return this.#J=$,$.on("data",(J)=>this.#V(Buffer.from(J))),$.on("close",()=>this.#X(Error("Open Browser Use socket closed"))),$.on("error",(J)=>this.#X(J)),await new Promise((J,Z)=>{$.once("connect",J),$.once("error",Z)}),this}close(){this.#J?.end(),this.#J=null}onNotification($){return this.#Q.add($),()=>{this.#Q.delete($)}}async request($,J={}){await this.connect();let Z=this.#J;if(!Z)throw Error("Open Browser Use socket is not connected");let Q=String(this.#Y++),X={session_id:this.sessionId,turn_id:this.turnId,...J},V=gQ({jsonrpc:"2.0",id:Q,method:$,params:X}),N=new Promise((G,H)=>{let M=setTimeout(()=>{this.#Z.delete(Q),H(Error(`Open Browser Use request timed out: ${$}`))},this.timeoutMs);this.#Z.set(Q,{resolve:G,reject:H,timeout:M})});return Z.write(V),await N}getInfo(){return this.request("getInfo")}createTab(){return this.request("createTab")}getTabs(){return this.request("getTabs")}getUserTabs(){return this.request("getUserTabs")}getUserHistory($={}){return this.request("getUserHistory",$)}claimUserTab($){return this.request("claimUserTab",{tabId:$})}finalizeTabs($){return this.request("finalizeTabs",{keep:$})}nameSession($){return this.request("nameSession",{name:$})}attach($){return this.request("attach",{tabId:$})}detach($){return this.request("detach",{tabId:$})}executeCdp($,J,Z={}){return this.request("executeCdp",{target:{tabId:$},method:J,commandParams:Z})}moveMouse($,J,Z,Q=!0){return this.request("moveMouse",{tabId:$,x:J,y:Z,waitForArrival:Q})}waitForFileChooser($,J){return this.request("waitForFileChooser",{tabId:$,...J===void 0?{}:{timeoutMs:J}})}setFileChooserFiles($,J){return this.request("setFileChooserFiles",{fileChooserId:$,files:J})}waitForDownload($,J){return this.request("waitForDownload",{tabId:$,...J===void 0?{}:{timeoutMs:J}})}downloadPath($,J){return this.request("downloadPath",{downloadId:$,...J===void 0?{}:{timeoutMs:J}})}browserUserHistory($={}){return this.getUserHistory($)}readClipboardText($){return this.request("readClipboardText",{tabId:$})}writeClipboardText($,J){return this.request("writeClipboardText",{tabId:$,text:J})}readClipboard($){return this.request("readClipboard",{tabId:$})}writeClipboard($,J){return this.request("writeClipboard",{tabId:$,items:J})}turnEnded(){return this.request("turnEnded")}#V($){this.#$=Buffer.concat([this.#$,$]);while(this.#$.length>=v1){let J=B5()==="LE"?this.#$.readUInt32LE(0):this.#$.readUInt32BE(0),Z=v1+J;if(this.#$.length<Z)return;let Q=this.#$.subarray(v1,Z);this.#$=this.#$.subarray(Z),this.#G(JSON.parse(Q.toString("utf8")))}}#G($){if(!r0($))return;let J=typeof $.id==="string"||typeof $.id==="number"?String($.id):null;if(!J&&typeof $.method==="string"){let Q={method:$.method,params:$.params};for(let X of this.#Q)X(Q);return}if(!J)return;let Z=this.#Z.get(J);if(!Z)return;if(this.#Z.delete(J),clearTimeout(Z.timeout),r0($.error)){Z.reject(Error(String($.error.message??"Open Browser Use request failed")));return}Z.resolve($.result??null)}#X($){for(let[J,Z]of this.#Z)this.#Z.delete(J),clearTimeout(Z.timeout),Z.reject($)}}class k2{client;cdp;constructor($){this.client="client"in $?$.client:new P$($),this.cdp=new N5(this.client)}async connect(){return await this.client.connect(),this}close(){this.client.close()}async newTab($={}){let J=await this.client.createTab(),Z=uQ(J,"createTab response"),Q=this.tab(Z);if($.url)await Q.goto($.url,$);return Q}tab($){return new K5(this,$)}getTabs(){return this.client.getTabs()}}class K5{browser;id;playwright;constructor($,J){this.browser=$,this.id=J,this.playwright=new U5(this)}goto($,J={}){return this.browser.cdp.navigate(this.id,$,J)}waitForLoadState($={}){return this.browser.cdp.waitForLoadState(this.id,$)}domSnapshot(){return this.browser.cdp.evaluate(this.id,"document.body?.innerText ?? ''").then(($)=>String($??""))}evaluate($,J={}){return this.browser.cdp.evaluate(this.id,$,J)}close(){return this.browser.cdp.call(this.id,"Page.close")}}class U5{tab;constructor($){this.tab=$}waitForLoadState($={}){return this.tab.waitForLoadState($)}domSnapshot(){return this.tab.domSnapshot()}}class N5{client;#J=new Set;constructor($){this.client=$}async call($,J,Z={},Q={}){return await this.ensureAttached($),this.client.request("executeCdp",{target:{tabId:$},method:J,commandParams:Z,...Q.timeoutMs===void 0?{}:{timeoutMs:Q.timeoutMs}})}async evaluate($,J,Z={}){let Q=await this.call($,"Runtime.evaluate",{expression:J,returnByValue:!0,...Z.awaitPromise===void 0?{}:{awaitPromise:Z.awaitPromise}});if(r0(Q)&&r0(Q.exceptionDetails))throw Error(String(Q.exceptionDetails.text??"Open Browser Use evaluation failed"));return r0(Q)&&r0(Q.result)?Q.result.value??null:null}async navigate($,J,Z={}){if(!J)throw Error("goto requires a URL");let Q=Z.waitUntil??"load";V5(Q);let X=Z.timeoutMs??Q9;await this.call($,"Page.enable");let Y=this.waitForLoadEvent($,Q,X),V=await this.call($,"Page.navigate",{url:J},{timeoutMs:X});if(r0(V)&&typeof V.errorText==="string"&&V.errorText)throw Error(`Browser failed to navigate tab ${$}: ${V.errorText}`);return await Y.catch(async(N)=>{let G=await this.readDocumentState($);if(G5(G,Q))return;throw N}),V}async waitForLoadState($,J={}){let Z=J.state??"load";V5(Z),await this.call($,"Page.enable");let Q=await this.readDocumentState($);if(G5(Q,Z))return;await this.waitForLoadEvent($,Z,J.timeoutMs??Q9)}async readDocumentState($){try{let J=await this.evaluate($,"({ href: window.location.href, readyState: document.readyState })");return r0(J)?{href:X9(J.href),readyState:X9(J.readyState)}:void 0}catch{return}}waitForEvent($,J,Z={}){let Q=Z.timeoutMs??Q9;return new Promise((X,Y)=>{let V=!1,N=null,G,H=()=>{if(V)return!1;return V=!0,clearTimeout(G),N?.(),!0};G=setTimeout(()=>{if(H())Y(Error(Z.timeoutMessage??`Timed out waiting for tab ${$} event`))},Q),N=this.client.onNotification((M)=>{try{if(J(M)){if(H())X(M)}}catch(U){if(H())Y(U instanceof Error?U:Error(String(U)))}})})}waitForLoadEvent($,J,Z){return this.waitForEvent($,(Q)=>{let X=dQ(Q,$);if(!X)return!1;if(X.method==="Page.navigationBlocked")throw Error(`Navigation was blocked in tab ${$}`);return J==="domcontentloaded"?X.method==="Page.domContentEventFired":X.method==="Page.loadEventFired"},{timeoutMs:Z,timeoutMessage:`Timed out waiting for ${J} in tab ${$}`}).then(()=>{return})}async ensureAttached($){if(this.#J.has($))return;await this.client.attach($),this.#J.add($)}}function gQ($){let J=Buffer.from(JSON.stringify($),"utf8"),Z=Buffer.alloc(v1+J.length);if(B5()==="LE")Z.writeUInt32LE(J.length,0);else Z.writeUInt32BE(J.length,0);return J.copy(Z,v1),Z}function r0($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function uQ($,J){if(!r0($))throw Error(`${J} did not include a tab object`);let Z=$.id;if(typeof Z==="number"&&Number.isInteger(Z)&&Z>0)return Z;if(typeof Z==="string"){let Q=Number(Z);if(Number.isInteger(Q)&&Q>0)return Q}throw Error(`${J} did not include a numeric tab id`)}function V5($){if($!=="domcontentloaded"&&$!=="load")throw Error(`Unsupported load state "${$}". Use "domcontentloaded" or "load".`)}function G5($,J){if($?.readyState==="complete")return!0;return J==="domcontentloaded"&&$?.readyState==="interactive"}function dQ($,J){if($.method!=="onCDPEvent"||!r0($.params))return null;let Z=$.params.source;if(!r0(Z)||Z.tabId!==J)return null;return{method:X9($.params.method)}}function X9($){return typeof $==="string"?$:void 0}import{createHash as pQ}from"crypto";function H5($,J,Z,Q){let X=JSON.stringify([$.trim().toLowerCase(),J.trim().toLowerCase(),Z,Q]);return`reason-cloud-${pQ("sha256").update(X).digest("hex")}`}import{AsyncLocalStorage as wX}from"async_hooks";import{isDeepStrictEqual as d5}from"util";import{createHash as yX}from"crypto";var lQ=new RegExp("^/media/pr-screenshots/([0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/([0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/([a-z0-9][a-z0-9._-]*)\\.(png|jpe?g|gif|webp|webm|mp4)$","i");var cQ=new Set(["png","jpg","jpeg","gif","webp"]),sQ=new Set(["webm","mp4"]);function aQ($){if(!$)return null;try{return new URL($).origin}catch{return null}}function q5($,J){let Z;try{Z=new URL($)}catch{return null}let Q=aQ(J),X=Z.hostname==="ara.so"||Z.hostname.endsWith(".ara.so")||Z.hostname==="reasonmachines.ai"||Z.hostname.endsWith(".reasonmachines.ai")||Z.hostname==="reasonmachines.com"||Z.hostname.endsWith(".reasonmachines.com");if(Z.protocol!=="https:"||!X&&Z.origin!==Q||Z.username||Z.password||Z.port||Z.search||Z.hash)return null;let Y=lQ.exec(Z.pathname);if(!Y)return null;let V=Y[1]?.toLowerCase(),N=Y[2]?.toLowerCase(),G=Y[3]?.toLowerCase(),H=Y[4]?.toLowerCase();if(!V||!N||!G||!H)return null;let M=cQ.has(H)?"image":sQ.has(H)?"video":null;if(!M)return null;let U=/^(before|after)[\s:_-]+/.exec(G),B=Z.pathname.replace(/^\/media\//,"");return{url:Z.toString(),storagePath:B,runId:V,artifactId:N,fileName:`${G}.${H}`,kind:M,phase:U?.[1]==="before"||U?.[1]==="after"?U[1]:null}}var iQ=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,h2=($)=>Boolean($&&typeof $==="object"&&!Array.isArray($)),d$=()=>{throw Error("cloud_browser_media_request_invalid")};function f2($){if(!h2($)||Object.keys($).some((Y)=>!["runId","configuredMediaOrigin","media"].includes(Y))||typeof $.runId!=="string"||!iQ.test($.runId)||typeof $.configuredMediaOrigin!=="string"||$.configuredMediaOrigin.length>2048||!Array.isArray($.media)||$.media.length<1||$.media.length>8)return d$();let J;try{J=new URL($.configuredMediaOrigin)}catch{return d$()}if(J.protocol!=="https:"||J.username||J.password||J.port||!M5(J.origin,{mode:"public_web"}).allowed)return d$();let Z=$.runId.toLowerCase(),Q=new Set,X=$.media.map((Y)=>{if(!h2(Y)||Object.keys(Y).some((N)=>!["url","sourceUrl","kind"].includes(N))||typeof Y.url!=="string"||Y.url.length>2048||typeof Y.sourceUrl!=="string"||Y.sourceUrl.length>8192||!["image","video"].includes(String(Y.kind)))return d$();let V=q5(Y.url,J.origin);if(!V||new URL(V.url).origin!==J.origin||V.runId!==Z||V.kind!==Y.kind||V.url!==Y.url||Q.has(Y.url))return d$();if(Q.add(Y.url),Y.sourceUrl!==Y.url){let N;try{N=new URL(Y.sourceUrl)}catch{return d$()}let G=/^\/(?:[a-f0-9]{40}|[a-f0-9]{64})\/([a-f0-9]+)$/.exec(N.pathname)?.[1];if(Y.kind!=="image"||N.origin!=="https://camo.githubusercontent.com"||N.username||N.password||N.search||N.hash||!G||G.length%2!==0||Buffer.from(G,"hex").toString("utf8")!==Y.url)return d$()}return{url:Y.url,sourceUrl:Y.sourceUrl,kind:Y.kind}});return{runId:$.runId,configuredMediaOrigin:J.origin,media:X}}function T5($,J){let Z=()=>{throw Error("cloud_browser_media_verification_failed")};if(!h2($)||$.verified!==!0||!Array.isArray($.items)||$.items.length!==J.media.length)return Z();return{verified:!0,items:$.items.map((X,Y)=>{let V=J.media[Y];if(!h2(X)||X.url!==V.url||X.sourceUrl!==V.sourceUrl||X.kind!==V.kind||typeof X.sourceSha256!=="string"||!/^[a-f0-9]{64}$/.test(X.sourceSha256)||!Number.isSafeInteger(X.width)||!Number.isSafeInteger(X.height)||Number(X.width)<1||Number(X.height)<1||Number(X.width)>16384||Number(X.height)>16384||V.kind==="video"&&(typeof X.advancedSeconds!=="number"||!Number.isFinite(X.advancedSeconds)||X.advancedSeconds<0.05||X.advancedSeconds>30))return Z();return{...V,width:Number(X.width),height:Number(X.height),sourceSha256:X.sourceSha256,...V.kind==="video"?{advancedSeconds:X.advancedSeconds}:{}}})}}var V9="browser.pr-proof.v1",_0=K.string().uuid(),V1=K.string().regex(/^[a-f0-9]{64}$/),l$=K.iso.datetime({precision:3}),Y9=K.string().regex(/^[a-zA-Z0-9_-]{1,160}$/),j5=K.string().max(2048).regex(/^https:\/\/github\.com\/[A-Za-z0-9_-]+\/[A-Za-z0-9_.-]+\/pull\/[1-9][0-9]*$/).refine(($)=>![".",".."].includes($.split("/")[4])),c0=K.object({kind:K.literal("primary_mac"),version:K.literal(1),organizationId:Y9,userId:Y9,sessionId:Y9,runId:_0,deviceId:_0,rootId:_0,rootRevision:K.string().min(1).max(64),binding:K.enum(["workspace_source","mcp_control"]),targetRevision:K.number().int().nonnegative(),generation:_0,profile:K.string().regex(/^(Default|Profile [0-9]+)$/),extensionInstanceId:K.string().min(1).max(1024)}).strict().refine(($)=>$.binding!=="workspace_source"||$.targetRevision===0),nQ=K.custom().transform(($,J)=>{try{return _5($)}catch{return J.addIssue({code:"custom",message:"proof_visual_contract_invalid"}),K.NEVER}}),G1=K.object({version:K.literal(1),owner:c0,contextId:_0,preparedAt:l$,expiresAt:l$,prUrl:j5,headSha:K.string().regex(/^[a-f0-9]{40}$/),skillDigest:V1,evidenceKind:K.enum(["image","video"]),visualPlan:nQ.optional(),uploadOrigin:K.string().url().refine(($)=>{let J=new URL($);return J.protocol==="https:"&&J.origin===$&&!J.username&&!J.password}).optional()}).strict().refine(($)=>Date.parse($.expiresAt)>Date.parse($.preparedAt)&&Date.parse($.expiresAt)-Date.parse($.preparedAt)<=300000),G9=K.object({version:K.literal(1),producer:K.literal("primary_mac"),context:G1,captureId:_0,operationId:_0,attemptId:_0,tabId:K.number().int().positive(),startedAt:l$,finishedAt:l$,sha256:V1,media:K.discriminatedUnion("contentType",[K.object({contentType:K.literal("image/png"),sizeBytes:K.number().int().min(24).max(8388608),width:K.number().int().min(1).max(4096),height:K.number().int().min(1).max(4096)}).strict(),K.object({contentType:K.literal("video/webm"),sizeBytes:K.number().int().min(128).max(10485760),durationSeconds:K.number().min(0.05).max(15),frameCount:K.number().int().min(1).max(450),receivedFrameCount:K.number().int().min(1).max(2000)}).strict()])}).strict().superRefine(($,J)=>{let Z=Date.parse($.startedAt),Q=Date.parse($.finishedAt);if(Z<Date.parse($.context.preparedAt)||Q<Z||Q>Date.parse($.context.expiresAt)||Q-Z>30000||$.media.contentType==="video/webm"&&($.media.receivedFrameCount<$.media.frameCount||Math.abs((Q-Z)/1000-$.media.durationSeconds)>0.1))J.addIssue({code:"custom",message:"mac_pr_proof_capture_chronology_invalid"})}),MN=K.discriminatedUnion("action",[K.object({action:K.literal("screenshot"),context_id:_0,tab_id:K.number().int().positive()}).strict(),K.object({action:K.literal("start_video"),context_id:_0,tab_id:K.number().int().positive(),seconds:K.number().int().min(1).max(15)}).strict(),K.object({action:K.literal("stop_video"),recording_operation_id:_0}).strict()]),m2=K.object({login:K.string().regex(/^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?$/),id:K.string().regex(/^[1-9][0-9]{0,19}$/).nullable()}).strict(),v2=K.string().regex(/^[1-9][0-9]{0,19}$/),m1=K.object({version:K.literal(1),owner:c0,expectedActorId:v2.nullable(),repositoryId:v2,repositoryFullName:K.string().max(200).regex(/^[A-Za-z0-9_-]+\/[A-Za-z0-9_.-]+$/).refine(($)=>![".",".."].includes($.split("/")[1]))}).strict(),rQ=["browser_unavailable","github_page_unavailable","identity_check_failed","operation_incomplete","attachment_unavailable"],B9=K.discriminatedUnion("status",[m1.extend({status:K.literal("ready"),observedActor:m2,checkedAt:l$}),m1.extend({status:K.literal("not_ready"),reason:K.enum(["authentication_required","identity_mismatch","authority_lost","unavailable"]),cause:K.enum(rQ).optional()})]).refine(($)=>$.status!=="ready"||$.expectedActorId===null||$.observedActor.id===$.expectedActorId),p$=K.object({version:K.literal(1),owner:c0,expectedActorId:v2.nullable(),authenticatedActor:m2,attemptId:_0,captureId:_0,prUrl:j5,repositoryId:v2,headSha:K.string().regex(/^[a-f0-9]{40}$/),sha256:V1,sizeBytes:K.number().int().min(128).max(10485760),contentType:K.literal("video/webm")}).strict(),D5=K.string().regex(/^https:\/\/github\.com\/user-attachments\/assets\/[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/),B1=K.discriminatedUnion("status",[p$.extend({status:K.literal("not_attempted"),reason:K.enum(["authentication_required","attachment_unavailable","identity_mismatch","capture_invalid","authority_lost"])}),p$.extend({status:K.literal("uncertain"),reason:K.literal("upload_outcome_unknown")}),p$.extend({status:K.literal("uploaded"),observedActor:m2,nativeUrl:D5,uploadedAt:l$})]).refine(($)=>($.expectedActorId===null||$.authenticatedActor.id===$.expectedActorId)&&($.status!=="uploaded"||$.observedActor.id===$.authenticatedActor.id&&$.observedActor.login===$.authenticatedActor.login)),g1=p$.extend({nativeUrl:D5,observedActor:m2,bodySha256:V1}),K9=K.discriminatedUnion("status",[g1.extend({status:K.literal("incomplete"),reason:K.enum(["authentication_required","identity_mismatch","playback_unverified","authority_lost"])}),g1.extend({status:K.literal("verified"),sourceSha256:V1,width:K.number().int().min(1).max(4096),height:K.number().int().min(1).max(4096),durationSeconds:K.number().positive().max(30),advancedSeconds:K.number().min(0.05).max(10),advancedFrames:K.number().int().positive(),playbackRestored:K.literal(!0),verifiedAt:l$})]).refine(($)=>($.expectedActorId===null||$.authenticatedActor.id===$.expectedActorId)&&$.observedActor.id===$.authenticatedActor.id&&$.observedActor.login===$.authenticatedActor.login&&($.status!=="verified"||$.sourceSha256===$.sha256)),tQ=K.custom().transform(($,J)=>{try{let Z=f2($);if(Z.media.some((Q)=>Q.kind!=="image"))throw Error();return Z}catch{return J.addIssue({code:"custom",message:"proof_media_request_invalid"}),K.NEVER}}),oQ=K.discriminatedUnion("action",[K.object({action:K.literal("auth_check"),input:m1}).strict(),K.object({action:K.literal("prepare"),context:G1}).strict(),K.object({action:K.literal("capture_png"),owner:c0,contextId:_0,tabId:K.number().int().positive()}).strict(),K.object({action:K.literal("start_video"),owner:c0,contextId:_0,tabId:K.number().int().positive(),seconds:K.number().int().min(1).max(15)}).strict(),K.object({action:K.literal("inspect_capture"),owner:c0,captureId:_0}).strict(),K.object({action:K.literal("publish_video"),input:p$}).strict(),K.object({action:K.literal("verify_png_media"),owner:c0,media:tQ}).strict().refine(($)=>$.media.runId===$.owner.runId),K.object({action:K.literal("verify_saved_media"),input:g1}).strict(),K.object({action:K.literal("publish_png"),owner:c0,attemptId:_0,captureId:_0,sha256:V1,sizeBytes:K.number().int().min(24).max(8388608),storagePath:K.string().max(512),uploadUrl:K.string().url().max(8192)}).strict()]);var W5="pr-proof.stop.v1",U9=K.object({requestId:_0,command:oQ}).strict();var eQ={type:"object",required:["action"],properties:{action:{type:"string",enum:["screenshot","start_video","stop_video"]},context_id:{type:"string",format:"uuid"},tab_id:{type:"integer",minimum:1},seconds:{type:"integer",minimum:1,maximum:15},recording_operation_id:{type:"string",format:"uuid"}},additionalProperties:!1},L5={type:"string",format:"uuid",description:"capture_context_id from tools.pr.prepareProof."},F5={type:"integer",minimum:1,description:"An already-owned tab's id."},TN={...eQ,oneOf:[{type:"object",required:["action","context_id","tab_id"],additionalProperties:!1,properties:{action:{type:"string",const:"screenshot"},context_id:L5,tab_id:F5}},{type:"object",required:["action","context_id","tab_id","seconds"],additionalProperties:!1,properties:{action:{type:"string",const:"start_video"},context_id:L5,tab_id:F5,seconds:{type:"integer",minimum:1,maximum:15}}},{type:"object",required:["action","recording_operation_id"],additionalProperties:!1,properties:{action:{type:"string",const:"stop_video"},recording_operation_id:{type:"string",format:"uuid",description:"The recording_operation_id start_video returned."}}}]};import{createHash as $X,randomUUID as JX}from"crypto";import{isDeepStrictEqual as K1}from"util";var O5=K.object({operationId:K.string().uuid(),attemptId:K.string().uuid(),contextId:K.string().uuid(),tabId:K.number().int().positive()}).strict(),G0=()=>Error("mac_pr_proof_capture_unavailable"),N9=($)=>$X("sha256").update($).digest("hex");function z5($){let J=c0.parse($.owner),Z=new Map,Q=new Map,X=!1,Y=async()=>{if(X)throw G0();if(await $.assertCurrent(),X)throw G0()},V=(B)=>{let q=Z.get(B);if(!q||Date.parse(q.expiresAt)<=Date.now())throw G0();return q},N=(B)=>B.disposal??=(async()=>{B.controller.abort(),B.bytes?.fill(0),B.bytes=void 0,B.receipt=void 0;try{await B.host?.close()}catch{throw X=!0,G0()}})(),G=async()=>{for(let[B,q]of Z){if(Date.parse(q.expiresAt)>Date.now())continue;let T=[...Q.entries()].filter(([,F])=>F.claim.contextId===B);if((await Promise.allSettled(T.map(([,F])=>N(F)))).some((F)=>F.status==="rejected"))throw G0();for(let[F]of T)Q.delete(F);Z.delete(B)}},H=setInterval(()=>{G().catch(()=>{X=!0})},1000);H.unref();let M=(B)=>{if(B.stopRequested=!0,B.started&&B.host&&!B.stop)B.stop=B.host.stop(),B.stop.catch(()=>B.controller.abort())};async function U(B,q){let T=O5.parse(B.claim);if(q==="video"&&(!Number.isInteger(B.seconds)||B.seconds<1||B.seconds>15))throw G0();await Y(),B.signal.throwIfAborted(),await G();let L=V(T.contextId);if(q==="video"&&L.evidenceKind!=="video")throw G0();let F=Q.get(T.operationId);if(F){if(!K1(F.claim,T)||F.kind!==q||F.seconds!==B.seconds||F.controller.signal.aborted)throw G0();let C=await F.completion;if(await Y(),V(T.contextId),F.controller.signal.aborted)throw G0();return structuredClone(C)}if(Q.size>=16||[...Q.values()].some((C)=>!C.receipt&&!C.controller.signal.aborted&&C.claim.tabId===T.tabId))throw G0();let D,O,j=new Promise((C,R)=>{D=C,O=R});j.catch(()=>{});let A={claim:T,kind:q,seconds:B.seconds,controller:new AbortController,completion:j,stopRequested:!1,started:!1};Q.set(T.operationId,A);let _=()=>{N(A).catch(()=>{})};B.signal.addEventListener("abort",_,{once:!0});let W=async()=>{await Y(),V(T.contextId),B.signal.throwIfAborted(),A.controller.signal.throwIfAborted()},P;try{await W();let C;if(q==="image"){let R=new Date().toISOString();P=await $.screenshot(structuredClone(L),T.tabId,A.controller.signal);let I=new Date().toISOString();if(await W(),P.length<24||P.length>8388608||!P.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))||P.readUInt32BE(8)!==13||P.toString("ascii",12,16)!=="IHDR")throw G0();C=G9.parse({version:1,producer:"primary_mac",context:L,captureId:JX(),operationId:T.operationId,attemptId:T.attemptId,tabId:T.tabId,startedAt:R,finishedAt:I,sha256:N9(P),media:{contentType:"image/png",sizeBytes:P.length,width:P.readUInt32BE(16),height:P.readUInt32BE(20)}})}else{if(A.host=await $.createVideo(structuredClone(L),T.tabId,B.seconds,A.controller.signal),A.controller.signal.aborted||B.signal.aborted||X)throw await A.host.close(),G0();await A.host.start(),A.started=!0;let R=A.host.completed();if(R.catch(()=>{}),await W(),await B.started?.(),A.stopRequested)M(A);let I=await R;if(A.stop)await A.stop;await W();let f=await A.host.read(I.captureId);P=f.bytes;let S={runId:J.runId,deviceId:J.deviceId,rootId:J.rootId,rootRevision:J.rootRevision,generation:J.generation,profile:J.profile,extensionInstanceId:J.extensionInstanceId,browserScope:$.browserScope,tabId:T.tabId};if(!K1(I,f.capture)||!K1(I.owner,S)||P.length!==I.sizeBytes||N9(P)!==I.sha256||P.length<128||P.readUInt32BE(0)!==440786851)throw G0();await A.host.close(),await W(),C=G9.parse({version:1,producer:"primary_mac",context:L,captureId:I.captureId,operationId:T.operationId,attemptId:T.attemptId,tabId:T.tabId,startedAt:I.startedAt,finishedAt:I.finishedAt,sha256:I.sha256,media:{contentType:"video/webm",sizeBytes:I.sizeBytes,durationSeconds:I.durationSeconds,frameCount:I.frameCount,receivedFrameCount:I.receivedFrameCount}})}if(await W(),[...Q.values()].reduce((R,I)=>R+(I.bytes?.length??0),P.length)>20971520)throw G0();return A.bytes=Buffer.from(P),A.receipt=C,D(C),structuredClone(C)}catch(C){let R=q==="video"&&!B.signal.aborted&&!A.controller.signal.aborted&&C instanceof Error&&C.message==="mac_recording_worker_failed:no_frames"?new f0("proof_capture_no_frames","The owned tab emitted no recording frames."):G0();throw await N(A).catch(()=>{}),O(R),R}finally{P?.fill(0),B.signal.removeEventListener("abort",_)}}return{async prepare(B){let q=G1.parse(B);if(!K1(q.owner,J))throw G0();if(await Y(),await G(),Date.parse(q.preparedAt)>Date.now()||Date.parse(q.expiresAt)<=Date.now())throw G0();let T=Z.get(q.contextId);if(T){if(!K1(T,q))throw G0();return structuredClone(T)}if(Z.size>=4)throw G0();return Z.set(q.contextId,q),structuredClone(q)},screenshot:(B)=>U(B,"image"),record:(B)=>U(B,"video"),async stop(B){let q=O5.parse(B);await Y(),V(q.contextId);let T=Q.get(q.operationId);if(!T||T.kind!=="video"||!K1(q,T.claim)||T.controller.signal.aborted)throw G0();M(T)},async publicationCapture(B){await Y(),await G();let q=[...Q.values()].find((T)=>T.receipt?.captureId===B);if(!q?.receipt||!q.bytes||q.controller.signal.aborted)throw G0();if(V(q.claim.contextId),q.bytes.length!==q.receipt.media.sizeBytes||N9(q.bytes)!==q.receipt.sha256)throw G0();return{capture:structuredClone(q.receipt),bytes:Buffer.from(q.bytes)}},async inspect(B){await Y(),await G();let q=[...Q.values()].find((T)=>T.receipt?.captureId===B);if(!q?.receipt||q.controller.signal.aborted)throw G0();return V(q.claim.contextId),structuredClone(q.receipt)},async close(){X=!0,clearInterval(H);let B=await Promise.allSettled([...Q.values()].map(N));if(Q.clear(),Z.clear(),B.some((q)=>q.status==="rejected"))throw G0()}}}import{createHash as I5,randomUUID as UX}from"crypto";import{isDeepStrictEqual as u1}from"util";import{realpath as NX}from"fs/promises";var A5=String.raw`async (media) => {
27
- const deadline = (promise) => {
28
- let timer;
29
- return Promise.race([promise, new Promise((_, reject) => {
30
- timer = setTimeout(() => reject(new Error("media_decode_timeout")), 12000);
31
- })]).finally(() => clearTimeout(timer));
32
- };
33
- const items = await Promise.all(media.map(async (item) => {
34
- const element = document.createElement(item.kind === "image" ? "img" : "video");
35
- document.body.append(element);
36
- try {
37
- if (item.kind === "image") {
38
- element.src = item.sourceUrl;
39
- await deadline(element.decode());
40
- if (!element.complete || !element.naturalWidth || !element.naturalHeight) throw new Error("media_image_not_decoded");
41
- return { ...item, width: element.naturalWidth, height: element.naturalHeight };
42
- }
43
- element.muted = true;
44
- element.playsInline = true;
45
- element.preload = "auto";
46
- const loaded = new Promise((resolve, reject) => {
47
- element.addEventListener("loadeddata", resolve, { once: true });
48
- element.addEventListener("error", () => reject(new Error("media_video_not_decoded")), { once: true });
49
- });
50
- element.src = item.sourceUrl;
51
- await deadline(loaded);
52
- if (!element.videoWidth || !element.videoHeight || !Number.isFinite(element.duration) || element.duration <= 0) throw new Error("media_video_not_decoded");
53
- const initial = element.currentTime;
54
- await deadline(element.play());
55
- await deadline(new Promise((resolve, reject) => {
56
- let timer;
57
- const check = () => {
58
- if (element.error) { clearTimeout(timer); reject(new Error("media_video_not_decoded")); return; }
59
- if (element.currentTime - initial >= 0.05) { clearTimeout(timer); resolve(); return; }
60
- timer = setTimeout(check, 25);
61
- };
62
- element.addEventListener("pause", () => { clearTimeout(timer); reject(new Error("media_video_not_advancing")); }, { once: true });
63
- check();
64
- }));
65
- return { ...item, width: element.videoWidth, height: element.videoHeight, advancedSeconds: element.currentTime - initial };
66
- } finally {
67
- if (item.kind === "video") element.pause();
68
- element.removeAttribute("src");
69
- element.remove();
70
- }
71
- }));
72
- return { verified: true, items };
73
- }`;var R5=function($){let J=this??globalThis,Z=10485760,Q=(V,N)=>{if(J.location.origin!=="https://github.com")return{ok:!1,reason:"identity_mismatch"};let G=J.document.querySelector('meta[name="user-login"]')?.getAttribute("content");if(!G&&(J.location.href===V.prUrl||/^\/(?:login|session)(?:[/?]|$)/.test(J.location.pathname)))return{ok:!1,reason:"authentication_required"};if(J.location.href!==V.prUrl||!G)return{ok:!1,reason:"identity_mismatch"};if(!/^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?$/.test(G))return{ok:!1,reason:"identity_mismatch"};let H=J.document.querySelector('meta[name="octolytics-actor-id"]')?.getAttribute("content"),M=/^[1-9][0-9]{0,19}$/.test(H||"")?H:null,U={login:G,id:M};if(V.expectedActorId!==null&&M!==V.expectedActorId||V.authenticatedActor&&(G!==V.authenticatedActor.login||M!==V.authenticatedActor.id)||V.observedActor&&(G!==V.observedActor.login||M!==V.observedActor.id)||J.document.querySelector('meta[name="octolytics-dimension-repository_id"]')?.getAttribute("content")!==V.repositoryId)return{ok:!1,reason:"identity_mismatch"};let B=J.document.querySelector('link[rel="canonical"]');if(B&&B.href!==V.prUrl)return{ok:!1,reason:"identity_mismatch"};if(N){let q=J.document.querySelector("#new_comment_field"),T=J.document.querySelector("#fc-new_comment_field"),L=q?.closest("file-attachment"),F=q?.closest("form"),D=new J.URL(V.prUrl).pathname+"/comment";if(!q||q.value!==""||!T||T.type!=="file"||T.disabled||!L||L.getAttribute("input")!==T.id||L.getAttribute("data-upload-repository-id")!==V.repositoryId||!F||new J.URL(F.action,J.location.href).origin!=="https://github.com"||new J.URL(F.action,J.location.href).pathname!==D)return{ok:!1,reason:"attachment_unavailable"};let O=L.getAttribute("data-upload-policy-url");if(!O||new J.URL(O,J.location.href).href!=="https://github.com/upload/policies/assets")return{ok:!1,reason:"attachment_unavailable"}}return{ok:!0,actor:U}};if($.operation==="preflight")return Q($.expected,!1);if($.operation==="identity")return Q($.expected,!0);if($.operation==="upload"){let V=$.expected,N=Q(V,!0);if(!N.ok)return{dispatched:!1,reason:N.reason};let G=J.Uint8Array.from(J.atob($.base64||""),(B)=>B.charCodeAt(0));if(G.length!==V.sizeBytes||G.length>10485760)return{dispatched:!1,reason:"capture_invalid"};let H=new J.File([G],V.captureId+".webm",{type:"video/webm"}),M=new J.DataTransfer;M.items.add(H);let U=J.document.querySelector("#fc-new_comment_field");if(!U)return{dispatched:!1,reason:"attachment_unavailable"};return U.files=M.files,U.dispatchEvent(new J.Event("change",{bubbles:!0})),{dispatched:!0,actor:N.actor}}if($.operation==="upload_result"){let V=Q($.expected,!1);if(!V.ok)throw Error("github_video_identity_changed");let N=J.document.querySelector("#new_comment_field")?.value?.trim(),G="["+$.expected.captureId+".webm](",H=N?.startsWith(G)&&N.endsWith(")")?N.slice(G.length,-1):N;if(!H||!/^https:\/\/github\.com\/user-attachments\/assets\/[0-9a-f-]{36}$/.test(H))return null;return{nativeUrl:H,actor:V.actor}}let X=$.expected,Y=Q(X,!1);if(!Y.ok)return{status:"incomplete",reason:Y.reason};return(async()=>{let V=X.nativeUrl.split("/").pop(),N=(D)=>{try{let O=new J.URL(D,J.location.href);if(O.protocol!=="https:"||O.username||O.password||O.port||O.hash)return!1;if(O.origin==="https://github.com")return O.href===X.nativeUrl;return["private-user-images.githubusercontent.com","user-images.githubusercontent.com"].includes(O.hostname)&&new RegExp("/[0-9]+/[0-9]+-"+V+"\\.(webm|mp4)$").test(O.pathname)}catch{return!1}},G=[...J.document.querySelectorAll('[id^="issue-"] .js-comment-body')].filter((D)=>/^issue-[1-9][0-9]*$/.test(D.closest('[id^="issue-"]')?.id||"")&&!D.closest("form")&&!D.closest(".preview-content"));if(G.length!==1)throw Error("saved_body_missing");let H=G[0],M=[...H.querySelectorAll("video")].filter((D)=>[D.currentSrc,D.src,...[...D.querySelectorAll("source")].map((O)=>O.src)].some(N));if(M.length!==1)throw Error("saved_player_missing");let U=M[0],B={muted:U.muted,volume:U.volume,rate:U.playbackRate,preload:U.preload},q=new J.AbortController,T=J.setTimeout(()=>q.abort(),12000),L=(D)=>J.Promise.race([D,new J.Promise((O,j)=>{if(q.signal.aborted)j(Error("playback_timeout"));else q.signal.addEventListener("abort",()=>j(Error("playback_timeout")),{once:!0})})]),F=async(D)=>{while(!D()){if(U.error||q.signal.aborted)throw Error("playback_unverified");await new J.Promise((O)=>J.setTimeout(O,25))}};try{if(U.muted=!0,U.playbackRate=1,U.currentTime=0,U.readyState<2)U.preload="auto",U.load();await F(()=>U.readyState>=2&&U.videoWidth>0&&U.videoHeight>0);let D=U.currentSrc;if(!N(D))throw Error("source_unbound");let O=await L(J.fetch(D,{credentials:"same-origin",redirect:"error",signal:q.signal}));if(O.status!==200||!N(O.url)||O.headers.get("content-range")||!/^video\/webm(?:;|$)/i.test(O.headers.get("content-type")||"")||!O.body)throw Error("source_unverifiable");let j=O.headers.get("content-length");if(j!==null&&(!/^[1-9][0-9]*$/.test(j)||Number(j)!==X.sizeBytes))throw Error("source_size_mismatch");let A=O.body.getReader(),_=[],W=0;try{for(;;){let h=await L(A.read());if(h.done)break;if(W+=h.value.length,W>10485760||W>X.sizeBytes)throw Error("source_too_large");_.push(h.value)}}finally{await A.cancel().catch(()=>{}),A.releaseLock()}if(W!==X.sizeBytes)throw Error("source_size_mismatch");let P=new J.Uint8Array(W),C=0;for(let h of _)P.set(h,C),C+=h.length;let R=[...new J.Uint8Array(await L(J.crypto.subtle.digest("SHA-256",P)))].map((h)=>h.toString(16).padStart(2,"0")).join("");if(R!==X.sha256||U.currentSrc!==D||!H.contains(U))throw Error("source_changed");let I=U.currentTime,f=U.getVideoPlaybackQuality().totalVideoFrames;if(await L(U.play()),await F(()=>U.currentTime-I>=0.05&&U.getVideoPlaybackQuality().totalVideoFrames>f),!Q(X,!1).ok||U.currentSrc!==D||!H.contains(U)||U.error)throw Error("player_changed");return{status:"verified",sourceSha256:R,width:U.videoWidth,height:U.videoHeight,durationSeconds:U.duration,advancedSeconds:U.currentTime-I,advancedFrames:U.getVideoPlaybackQuality().totalVideoFrames-f,playbackRestored:!0}}finally{if(J.clearTimeout(T),q.abort(),U.pause(),U.currentTime=0,U.muted=B.muted,U.volume=B.volume,U.playbackRate=B.rate,U.preload=B.preload,!U.paused||U.currentTime!==0)throw Error("playback_restore_failed")}})()};import{execFile as ZX}from"child_process";import{lstat as QX,realpath as XX}from"fs/promises";import{join as P5,resolve as YX}from"path";import{promisify as VX}from"util";var GX=VX(ZX);async function BX($,J){let Z=await XX($),{stdout:Q}=await GX(P5(Z,"reason-browser-use"),["profiles","--connected","--json"],{timeout:5000,maxBuffer:65536,signal:J});return K.array(K.object({browser:K.string(),directory:K.string(),connected:K.boolean().optional(),source:K.string(),socketPath:K.string().optional(),instanceId:K.string().optional(),extensionId:K.string().regex(/^[a-p]{32}$/)})).max(256).parse(JSON.parse(Q)).filter((Y)=>Y.browser==="chrome"&&Y.connected===!0&&/^(Default|Profile [0-9]+)$/.test(Y.directory)&&YX(Y.source)===P5(Z,"Reason Browser Use","manifest.json"))}async function g2($,J,Z){if(!/^(Default|Profile [0-9]+)$/.test(J))throw Error("mac_recording_profile_unavailable");let Q=(await BX($,Z)).filter((V)=>V.directory===J),X=Q[0];if(Q.length!==1||!X?.socketPath||!X.instanceId)throw Error("mac_recording_profile_unavailable");let Y=await QX(X.socketPath);if(!Y.isSocket()||Y.uid!==process.getuid?.()||Y.mode&63)throw Error("mac_recording_socket_invalid");return{socketPath:X.socketPath,instanceId:X.instanceId,extensionId:X.extensionId}}import{createHash as KX}from"crypto";function U1($){return`reason-browser-${KX("sha256").update(`reason:mac-browser:v1:${$}`).digest("hex")}`}var C5=K.discriminatedUnion("ok",[K.object({ok:K.literal(!0),actor:K.object({login:K.string(),id:K.string().nullable()}).strict()}).strict(),K.object({ok:K.literal(!1),reason:K.enum(["authentication_required","identity_mismatch","attachment_unavailable"])}).strict()]),E5=K.object({version:K.literal("0.1.42"),metadata:K.object({extensionId:K.string(),extensionInstanceId:K.string(),nativeHostName:K.string()})}),Z0=()=>Error("mac_pr_proof_browser_unavailable");async function H9($){let J=c0.parse($.owner),Z="endpoint"in $?$.endpoint(J):await HX($.automationDirectory,J),Q=new Map,X=`reason-pr-proof-${UX()}`,Y=!1,V=async()=>{if(Y)throw Z0();if(await $.assertCurrent(),Y)throw Z0()},N=async(M)=>{if(!u1(J,M.owner))throw Z0();await V()},G=async(M)=>{await N(M);let U=await $.readVideo(M.captureId);try{await V();let B=U.capture;if(!u1(B.context.owner,J)||B.captureId!==M.captureId||B.context.prUrl!==M.prUrl||B.context.headSha!==M.headSha||B.media.contentType!=="video/webm"||B.media.sizeBytes!==M.sizeBytes||B.sha256!==M.sha256||U.bytes.length!==M.sizeBytes||U.bytes.length<128||U.bytes.length>10485760||U.bytes.readUInt32BE(0)!==440786851||I5("sha256").update(U.bytes).digest("hex")!==M.sha256)throw Z0();return U}catch(B){throw U.bytes.fill(0),B}};async function H(M,U,B){await V();let q=await Z.discover(AbortSignal.timeout(5000)),T=new k2({socketPath:q.socketPath,sessionId:X,timeoutMs:5000}),L,F=!1,D,O=new Promise((_,W)=>{D=setTimeout(()=>{F=!0,W(Z0())},60000)});O.catch(()=>{});let j=(_)=>Promise.race([_,O]),A=async()=>{if(F)throw Z0();if(await V(),F)throw Z0()};try{await j(T.connect());let _=E5.parse(await j(T.client.getInfo()));if(_.metadata.extensionId!==q.extensionId||_.metadata.extensionInstanceId!==q.instanceId||!_.metadata.nativeHostName)throw Z0();await A(),B?.("connected");let W=T.newTab();W.then((R)=>{if(F)R.close().catch(()=>{Y=!0})},()=>{}),L=await j(W),await A(),await j(L.goto(M,{waitUntil:"domcontentloaded",timeoutMs:15000})),await A(),B?.("loaded");let C=await j(U(L,async(R)=>{await A();let I=await j(L.evaluate(`(${R5.toString()})(${JSON.stringify(R)})`,{awaitPromise:!0}));return await A(),I},A));return await A(),C}finally{F=!0,clearTimeout(D);try{if(L){let _;try{await Promise.race([L.close(),new Promise((W,P)=>{_=setTimeout(()=>P(Z0()),5000)})])}finally{clearTimeout(_)}}}catch{throw Y=!0,Z0()}finally{T.close()}await V()}}return{async screenshot(M,U,B){let q=G1.parse(M);if(await N(q),!Number.isSafeInteger(U)||U<1||Date.parse(q.expiresAt)<=Date.now())throw Z0();B.throwIfAborted();let T=await Z.discover(B),L=new k2({socketPath:T.socketPath,sessionId:Z.tabScope,timeoutMs:5000}),F;try{await L.connect();let D=E5.parse(await L.client.getInfo());if(D.metadata.extensionId!==T.extensionId||D.metadata.extensionInstanceId!==T.instanceId)throw Z0();if(!K.array(K.object({id:K.number()})).max(256).parse(await L.getTabs()).some((A)=>A.id===U))throw Z0();await V(),B.throwIfAborted();let j=K.object({data:K.string().max(Math.ceil(2796202.6666666665)*4)}).strict().parse(await L.cdp.call(U,"Page.captureScreenshot",{format:"png",fromSurface:!0,captureBeyondViewport:!1}));if(!/^[A-Za-z0-9+/]+={0,2}$/.test(j.data)||j.data.length%4)throw Z0();if(F=Buffer.from(j.data,"base64"),F.toString("base64")!==j.data||F.length>8388608)throw Z0();if(await V(),B.throwIfAborted(),Date.parse(q.expiresAt)<=Date.now())throw Z0();return F}catch{throw F?.fill(0),Z0()}finally{L.close()}},async verifyImages(M){let U=f2(M);if(U.runId!==J.runId||U.media.some((B)=>B.kind!=="image"))throw Z0();return H("about:blank",async(B,q,T)=>{let L=B.browser.client,F=new Set(U.media.map((R)=>R.sourceUrl)),D=new Map,O=new Set,j=!1,A=0,_=!1,W=new Set,P=(R,I)=>{if(W.size>=32){j=!0;return}let f=L.executeCdp(B.id,R,I);W.add(f),f.catch(()=>{j=!0}).finally(()=>W.delete(f))},C=L.onNotification((R)=>{if(R.method!=="onCDPEvent"||!T$(R.params)||!T$(R.params.source)||R.params.source.tabId!==B.id||!T$(R.params.params))return;let I=R.params.params;if(++A>512){j=!0;return}if(R.params.method==="Fetch.requestPaused"){let h=typeof I.requestId==="string"&&T$(I.request)&&I.request.method==="GET"&&typeof I.request.url==="string"&&F.has(I.request.url)&&I.resourceType==="Image";if(typeof I.requestId!=="string"){j=!0;return}if(!h)j=!0;P(h?"Fetch.continueRequest":"Fetch.failRequest",{requestId:I.requestId,...h?{}:{errorReason:"BlockedByClient"}})}if(R.params.method==="Network.requestWillBeSent"&&I.redirectResponse)j=!0;if(R.params.method==="Network.loadingFailed")j=!0;if(R.params.method==="Network.loadingFinished"&&typeof I.requestId==="string")O.add(I.requestId);if(R.params.method!=="Network.responseReceived")return;if(!T$(I.response)||typeof I.response.url!=="string"||!F.has(I.response.url)||typeof I.requestId!=="string"||!T$(I.response.headers)||I.type!=="Image"){j=!0;return}let f=Object.fromEntries(Object.entries(I.response.headers).map(([h,p])=>[h.toLowerCase(),p])),S=Number(f["content-length"]);if(D.has(I.response.url)||I.response.status!==200||I.response.fromServiceWorker===!0||typeof f["content-length"]!=="string"||!/^[1-9][0-9]*$/.test(f["content-length"])||!Number.isSafeInteger(S)||S>8388608||f["content-range"]||f["content-encoding"]&&f["content-encoding"]!=="identity"){j=!0;return}D.set(I.response.url,{id:I.requestId,length:S})});try{await L.executeCdp(B.id,"Network.enable",{maxTotalBufferSize:67108864,maxResourceBufferSize:8388608}),await L.executeCdp(B.id,"Network.setBypassServiceWorker",{bypass:!0}),await L.executeCdp(B.id,"Network.setCacheDisabled",{cacheDisabled:!0}),await L.executeCdp(B.id,"Fetch.enable",{patterns:[{urlPattern:"*",requestStage:"Request"}]});let R=K.object({frameTree:K.object({frame:K.object({id:K.string().min(1).max(256)})})}).parse(await L.executeCdp(B.id,"Page.getFrameTree",{})),I=[...new Set(U.media.map((h)=>new URL(h.sourceUrl).origin))].join(" ");await L.executeCdp(B.id,"Page.setDocumentContent",{frameId:R.frameTree.frame.id,html:`<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src ${I}; style-src 'none'"><body></body>`}),await T(),_=!0;try{await L.executeCdp(B.id,"Emulation.setFocusEmulationEnabled",{enabled:!0})}catch{throw new f0("mac_pr_proof_png_render_failed","mac_pr_proof_png_render_failed")}await T();let f;try{f=await B.evaluate(`(${A5})(${JSON.stringify(U.media)})`,{awaitPromise:!0})}catch{throw new f0("mac_pr_proof_png_decode_failed","mac_pr_proof_png_decode_failed")}if(await T(),!T$(f)||!Array.isArray(f.items)||f.items.length!==U.media.length)throw Z0();await Promise.all(W);let S=[];for(let h=0;h<U.media.length;h++){await V();let p=D.get(U.media[h].sourceUrl);if(j||!p||!O.has(p.id))throw Z0();let b=K.object({base64Encoded:K.literal(!0),body:K.string().max(Math.ceil(2796202.6666666665)*4)}).strict().parse(await L.executeCdp(B.id,"Network.getResponseBody",{requestId:p.id})),x=Buffer.from(b.body,"base64");try{let E=f.items[h];if(x.length!==p.length||x.toString("base64")!==b.body||!T$(E))throw Z0();S.push({...E,sourceSha256:I5("sha256").update(x).digest("hex")})}finally{x.fill(0)}}if(j)throw Z0();return T5({verified:!0,items:S},U)}finally{if(C(),await Promise.allSettled(W),_)try{await L.executeCdp(B.id,"Emulation.setFocusEmulationEnabled",{enabled:!1})}catch{throw new f0("mac_pr_proof_png_render_cleanup_failed","mac_pr_proof_png_render_cleanup_failed")}}})},async preflight(M){let U=m1.parse(M);await N(U);let B="browser_unavailable";try{return await H(`https://github.com/${U.repositoryFullName}`,async(q,T)=>{let L=C5.parse(await T({operation:"preflight",expected:{...U,prUrl:`https://github.com/${U.repositoryFullName}`}}));return B9.parse(L.ok?{...U,status:"ready",observedActor:L.actor,checkedAt:new Date().toISOString()}:L.reason==="attachment_unavailable"?{...U,status:"not_ready",reason:"unavailable",cause:"attachment_unavailable"}:{...U,status:"not_ready",reason:L.reason})},(q)=>{B=q==="connected"?"github_page_unavailable":"identity_check_failed"})}catch{return B9.parse({...U,status:"not_ready",reason:"unavailable",cause:B})}},async publish(M){let U=p$.parse(M);if(await N(U),U.expectedActorId!==null&&U.authenticatedActor.id!==U.expectedActorId)throw Z0();let B=Q.get(U.attemptId);if(B){if(!u1(B.binding,U))throw Z0();return structuredClone(B.result)}if(Q.size>=3)throw Error("proof_native_publication_limit");let q={binding:structuredClone(U),result:B1.parse({...U,status:"uncertain",reason:"upload_outcome_unknown"})};Q.set(U.attemptId,q);let T=!1,L="dispatch";try{(await G(U)).bytes.fill(0),q.result=await H(U.prUrl,async(F,D)=>{let O=C5.parse(await D({operation:"identity",expected:U}));if(!O.ok)return B1.parse({...U,status:"not_attempted",reason:O.reason});let j=await G(U),A;try{T=!0,A=K.discriminatedUnion("dispatched",[K.object({dispatched:K.literal(!0),actor:K.object({login:K.string(),id:K.string().nullable()}).strict()}).strict(),K.object({dispatched:K.literal(!1),reason:K.enum(["authentication_required","identity_mismatch","attachment_unavailable","capture_invalid"])}).strict()]).parse(await D({operation:"upload",expected:U,base64:j.bytes.toString("base64")}))}finally{j.bytes.fill(0)}if(!A.dispatched)return T=!1,B1.parse({...U,status:"not_attempted",reason:A.reason});if(!u1(A.actor,O.actor))throw L="actor_changed",Z0();L="result";let _=performance.now();while(performance.now()-_<30000){let W=await D({operation:"upload_result",expected:{...U,observedActor:O.actor}});if(W!==null){let P=K.object({nativeUrl:K.string(),actor:K.object({login:K.string(),id:K.string().nullable()}).strict()}).strict().parse(W);return L="finalize",await V(),B1.parse({...U,status:"uploaded",nativeUrl:P.nativeUrl,observedActor:P.actor,uploadedAt:new Date().toISOString()})}await new Promise((P)=>setTimeout(P,100))}throw L="result_timeout",Z0()})}catch{if(T)process.stderr.write(`Reason PR proof: video upload outcome unknown (stage=${L})
74
- `);q.result=B1.parse({...U,...T?{status:"uncertain",reason:"upload_outcome_unknown"}:{status:"not_attempted",reason:"capture_invalid"}})}return structuredClone(q.result)},async verify(M){let U=g1.parse(M);await N(U);try{return(await G(U)).bytes.fill(0),await H(U.prUrl,async(B,q)=>{await B.browser.client.executeCdp(B.id,"Emulation.setFocusEmulationEnabled",{enabled:!0});try{let T=await q({operation:"saved_player",expected:U});if(!T||typeof T!=="object"||Array.isArray(T))throw Z0();let L=K9.parse({...U,...T,..."status"in T&&T.status==="verified"?{verifiedAt:new Date().toISOString()}:{}});if(Object.entries(U).some(([F,D])=>!u1(D,L[F])))throw Z0();return L}finally{await B.browser.client.executeCdp(B.id,"Emulation.setFocusEmulationEnabled",{enabled:!1})}})}catch{return K9.parse({...U,status:"incomplete",reason:"playback_unverified"})}},close(){Y=!0}}}async function HX($,J){let Z=await NX($);return{async discover(Q){let X=await g2(Z,J.profile,Q);if(X.instanceId!==J.extensionInstanceId)throw Z0();return X},tabScope:U1(J.runId)}}import{realpath as bX}from"fs/promises";var iN=K.object({version:K.literal(1),recording_operation_id:K.string().uuid(),proof_ready:K.literal(!1),acknowledged_at:K.iso.datetime()}).strict(),u2=K.object({action:K.literal("start"),request_id:K.string().uuid(),profile:K.string().regex(/^(Default|Profile [0-9]+)$/),tab_id:K.number().int().positive(),seconds:K.number().int().min(1).max(15)}).strict(),x5=K.object({action:K.literal("inspect"),recording_operation_id:K.string().uuid()}).strict(),nN=K.discriminatedUnion("action",[u2,x5]),S5=K.object({recording_operation_id:K.string().uuid()}).strict(),q9={device_id:K.string().uuid(),root_id:K.string().uuid()},qX=K.discriminatedUnion("action",[u2.extend(q9),x5.extend(q9),S5.extend({...q9,action:K.literal("stop")})]),rN=K.toJSONSchema(qX),tN=K.object({version:K.literal(1),recordingId:K.string().uuid(),proofReady:K.literal(!1),capture:K.object({captureId:K.string().uuid(),contentType:K.literal("video/webm"),sha256:K.string().regex(/^[a-f0-9]{64}$/),sizeBytes:K.number().int().min(128).max(10485760),startedAt:K.iso.datetime(),finishedAt:K.iso.datetime(),durationSeconds:K.number().min(0.05).max(15),frameCount:K.number().int().min(1).max(450),receivedFrameCount:K.number().int().min(1).max(2000),owner:K.object({runId:K.string().uuid(),deviceId:K.string().uuid(),rootId:K.string().uuid(),rootRevision:K.string().max(64),profile:K.string().regex(/^(Default|Profile [0-9]+)$/),extensionInstanceId:K.string().min(1).max(1024),generation:K.string().uuid(),browserScope:K.string().max(128),tabId:K.number().int().positive()}).strict()}).strict().refine(($)=>$.receivedFrameCount>=$.frameCount&&Math.abs((Date.parse($.finishedAt)-Date.parse($.startedAt))/1000-$.durationSeconds)<=0.1)}).strict();var GH=u2.extend({action:K.enum(["start","inspect"]),recording_boot_generation:K.string().uuid(),recording_operation_id:K.string().uuid().optional(),recording_attempt_id:K.string().uuid().optional()}).strict();import{createHash as zX,randomUUID as AX}from"crypto";import{mkdtemp as RX,realpath as PX,rm as m5}from"fs/promises";import{tmpdir as IX}from"os";import{join as CX}from"path";import{spawn as EX}from"child_process";import{isDeepStrictEqual as xX}from"util";import{createHash as MX}from"crypto";import{execFile as TX}from"child_process";import{chmod as LX,lstat as w5,mkdtemp as FX,readFile as y5,realpath as k5,rm as _X,writeFile as b5}from"fs/promises";import{tmpdir as jX}from"os";import{isAbsolute as DX,join as d2}from"path";import{promisify as WX}from"util";var M9=WX(TX),OX=($)=>MX("sha256").update($).digest("hex");async function Q$($){if(!DX($.path)||!/^[a-f0-9]{64}$/.test($.sha256)||await k5($.path)!==$.path)throw Error("mac_recording_encoder_unqualified");let J=await w5($.path);if(!J.isFile()||!(J.mode&73)||J.mode&18||J.size>134217728||OX(await y5($.path))!==$.sha256)throw Error("mac_recording_encoder_unqualified")}async function d1($,J){if(!$)return null;let Z=structuredClone($);try{await Promise.all([Q$(Z.ffmpeg),Q$(Z.ffprobe)])}catch{return null}return{async encode(Q,X,Y){if(Y.aborted||!Q.length||!Number.isFinite(X)||X<0.05||X>15)throw Error("mac_recording_encoding_invalid");await Promise.all([Q$(Z.ffmpeg),Q$(Z.ffprobe)]);let V=await k5(await FX(d2(J??jX(),"reason-owned-recording-")));await LX(V,448);let N=d2(V,"capture.webm"),G="frames";try{let H=["ffconcat version 1.0"];for(let[F,D]of Q.entries()){let O=`${F}.jpg`;await b5(d2(V,O),D.jpeg,{mode:384,flag:"wx"});let j=Q[F+1]?.timestamp??Q[0].timestamp+X;H.push(`file '${O}'`,`duration ${Math.max(0.001,j-D.timestamp).toFixed(6)}`)}H.push(`file '${Q.length-1}.jpg'`),await b5(d2(V,"frames.ffconcat"),H.join(`
75
- `)+`
76
- `,{mode:384,flag:"wx"});let M={cwd:V,signal:Y,timeout:15000,maxBuffer:16384,env:{PATH:"/usr/bin:/bin"}};G="encode",await M9(Z.ffmpeg.path,["-nostdin","-hide_banner","-loglevel","error","-protocol_whitelist","file,pipe","-max_pixels","1600000","-threads","1","-f","concat","-safe","1","-i","frames.ffconcat","-t",String(X),"-an","-map_metadata","-1","-vf",`scale=trunc(iw/2)*2:trunc(ih/2)*2,tpad=stop_mode=clone:stop_duration=${X},fps=12`,"-c:v","libvpx","-deadline","realtime","-cpu-used","6","-threads","1","-b:v","1000k","-r","12","-fps_mode","cfr","-fs",String(10485760),"-f","webm",N],M),G="output";let U=await w5(N);if(!U.isFile()||U.isSymbolicLink()||U.nlink!==1||U.size<128||U.size>10485760)throw Error();G="probe";let{stdout:B}=await M9(Z.ffprobe.path,["-v","error","-count_frames","-show_entries","stream=codec_type,codec_name,width,height,nb_read_frames:format=format_name,duration","-of","json",N],M),q=JSON.parse(B),T=q.streams,L=Number(q.format?.duration);if(G="probe_streams",!Array.isArray(T)||T.length!==1||T[0]?.codec_type!=="video"||T[0]?.codec_name!=="vp8")throw Error();if(G="probe_dimensions",!Number.isSafeInteger(T[0].width)||T[0].width<2||T[0].width>1600||!Number.isSafeInteger(T[0].height)||T[0].height<2||T[0].height>1000)throw Error();if(G="probe_duration",!Number.isFinite(L)||Math.abs(L-X)>0.25)throw Error();if(G="probe_frames",!Number.isSafeInteger(Number(T[0].nb_read_frames))||Number(T[0].nb_read_frames)<1)throw Error();if(G="probe_format",q.format?.format_name!=="matroska,webm")throw Error();return G="decode",await M9(Z.ffmpeg.path,["-nostdin","-v","error","-xerror","-max_pixels","1600000","-threads","1","-i",N,"-f","null","-"],M),G="pin",await Promise.all([Q$(Z.ffmpeg),Q$(Z.ffprobe)]),await y5(N)}catch{throw Error(Y.aborted?"mac_recording_cancelled":`mac_recording_encoding_${G}_failed`)}finally{await _X(V,{recursive:!0,force:!0})}}}}var f5=K.enum(["recording_failed","authority_lost","browser_timeout","cleanup_failed","no_frames","encoding_invalid","frame_invalid","timestamp_invalid","capture_bound","ack_failed","cancelled","detached","browser_changed","tab_not_owned","encoding_frames_failed","encoding_encode_failed","encoding_output_failed","encoding_probe_failed","encoding_probe_streams_failed","encoding_probe_dimensions_failed","encoding_probe_duration_failed","encoding_probe_frames_failed","encoding_probe_format_failed","encoding_decode_failed","encoding_pin_failed"]);var X$=K.string().min(1).max(1024),h5=K.object({path:X$,sha256:K.string().regex(/^[a-f0-9]{64}$/)}).strict(),v5=K.object({owner:K.object({runId:X$,deviceId:X$,rootId:X$,rootRevision:X$,profile:K.string().regex(/^(Default|Profile [0-9]+)$/),extensionInstanceId:X$,generation:X$,browserScope:X$,tabId:K.number().int().positive()}).strict(),socketPath:X$,extensionId:K.string().regex(/^[a-p]{32}$/),nativeHostName:X$,seconds:K.number().int().min(1).max(15),encoder:K.object({ffmpeg:h5,ffprobe:h5}).strict()}).strict();var SX=15728640,I$=()=>Error("mac_recording_worker_failed");function g5($){let J=v5.parse($.configuration),Z={...$.worker},Q=new Map,X=!1,Y=!1,V=null,N=async()=>{},G=async(B,q=3000)=>{let T;try{return await Promise.race([B,new Promise((L,F)=>{T=setTimeout(()=>F(I$()),q)})])}finally{clearTimeout(T)}},H=()=>V??=G((async()=>{let q=(await Promise.allSettled([N(),$.cleanup()])).find((T)=>T.status==="rejected");if(q?.status==="rejected")throw q.reason})(),5000).catch((B)=>{X=!0;let q=B&&typeof B==="object"&&"code"in B?B.code:null,T=typeof q==="string"&&["ESRCH","EPERM","EACCES","ENOTEMPTY","ENOENT","EBUSY"].includes(q)?q:"unknown";throw Error(`mac_recording_cleanup_failed:${T}`)}),M=null,U=async()=>{if(X)throw I$();if(await G($.assertCurrent()),X)throw I$()};return{async start(){if(Y||M)throw Error("mac_recording_already_active");Y=!0;try{await U(),await Q$({path:Z.path,sha256:Z.sha256}),await U(),V=null;let B=await PX(await RX(CX(IX(),"reason-recording-host-")));try{await U()}catch(x){throw await m5(B,{recursive:!0,force:!0}),x}let q=EX(Z.path,[...Z.args??[]],{detached:!0,stdio:["pipe","pipe","ignore"],env:{PATH:"/usr/bin:/bin"}}),T=new Promise((x)=>q.once("close",()=>x())),L=()=>{if(q.pid)try{process.kill(-q.pid,"SIGKILL")}catch(x){if(x.code!=="ESRCH")throw x}},F=null;N=()=>F??=(async()=>{try{L()}catch(x){if(x.code!=="EPERM")throw x}await T;try{for(let x=0;;x++)try{L();break}catch(E){if(E.code!=="EPERM"||x>=20)throw E;await new Promise((z)=>setTimeout(z,25))}}finally{await m5(B,{recursive:!0,force:!0})}})();let D="",O=0,j=!1,A=!1,_=null,W,P,C=new Promise((x,E)=>{W=x,P=E}),R,I,f=new Promise((x,E)=>{R=x,I=E});f.catch(()=>{});let S=(x=I$())=>{if(j)return;j=!0,clearTimeout(h),clearInterval(b),H().then(()=>{P(x),I(x)},(E)=>{P(E),I(E)})},h=setTimeout(()=>S(),(J.seconds+25)*1000),p=!1,b=setInterval(()=>{if(p||j)return;p=!0,U().catch(()=>S()).finally(()=>{p=!1})},250);M={completion:f,stop:()=>{if(!j)q.stdin.write(`{"type":"stop"}
77
- `)},cancel:()=>S()},q.on("error",()=>S()),q.stdin.on("error",()=>S()),q.stdout.on("data",(x)=>{if(j)return;if(O+=x.length,O>SX){S();return}D+=x.toString("utf8");let E;while((E=D.indexOf(`
78
- `))!==-1){let z=D.slice(0,E);D=D.slice(E+1);try{let k=JSON.parse(z);if(k.type==="failed"&&Object.keys(k).sort().join(",")==="reason,type"){let n=f5.safeParse(k.reason);S(n.success?Error(`mac_recording_worker_failed:${n.data}`):I$());return}if(k.type==="unsupported"&&!A){S(Error("mac_recording_encoder_unavailable"));return}if(k.type==="started"&&!A&&Object.keys(k).length===1){A=!0,W({recording:!0});continue}if(!A||k.type!=="capture"||_||Object.keys(k).sort().join(",")!=="bytes,capture,type")throw I$();let y=k.capture;if(!y||Object.keys(y).sort().join(",")!=="captureId,contentType,durationSeconds,finishedAt,frameCount,owner,receivedFrameCount,sha256,sizeBytes,startedAt"||typeof y.sha256!=="string"||typeof y.startedAt!=="string"||typeof y.finishedAt!=="string"||!xX(y.owner,J.owner)||y.contentType!=="video/webm"||!/^[a-f0-9]{64}$/.test(y.sha256)||!Number.isSafeInteger(y.sizeBytes)||y.sizeBytes<128||y.sizeBytes>10485760||!Number.isSafeInteger(y.frameCount)||y.frameCount<1||y.frameCount>450||!Number.isSafeInteger(y.receivedFrameCount)||y.receivedFrameCount<y.frameCount||y.receivedFrameCount>2000||!Number.isFinite(y.durationSeconds)||y.durationSeconds<0.05||y.durationSeconds>J.seconds||!Number.isFinite(Date.parse(y.startedAt))||!Number.isFinite(Date.parse(y.finishedAt))||Math.abs((Date.parse(y.finishedAt)-Date.parse(y.startedAt))/1000-y.durationSeconds)>0.1||typeof k.bytes!=="string"||k.bytes.length%4!==0||!/^[A-Za-z0-9+/]+={0,2}$/.test(k.bytes))throw I$();let i=Buffer.from(k.bytes,"base64");if(i.length!==y.sizeBytes||zX("sha256").update(i).digest("hex")!==y.sha256||!i.subarray(0,4).equals(Buffer.from([26,69,223,163])))throw I$();_={capture:Object.freeze({...y,captureId:AX(),owner:Object.freeze({...J.owner})}),bytes:i}}catch{S();return}}}),q.once("close",(x)=>{if(j)return;if(x!==0||!_||D.trim()){S();return}let E=_;U().then(async()=>{if(await N(),j)return;j=!0,clearTimeout(h),clearInterval(b),Q.set(E.capture.captureId,E);while(Q.size>2)Q.delete(Q.keys().next().value);R(E.capture)}).catch(()=>S())}),q.stdin.write(JSON.stringify({...J,scratchDirectory:B})+`
79
- `);try{return await C}catch(x){throw M=null,x}}finally{Y=!1}},async completed(){if(await U(),!M)throw Error("mac_recording_not_active");return M.completion},async stop(){await U();let B=M;if(!B)throw Error("mac_recording_not_started");B.stop();try{return await B.completion}finally{if(M===B)M=null}},async read(B){await U();let q=Q.get(B);if(!q)throw Error("mac_recording_capture_unavailable");return{capture:structuredClone(q.capture),bytes:Buffer.from(q.bytes)}},async close(){if(X)return;X=!0;let B=M;B?.cancel(),Q.clear();try{await H(),await B?.completion.catch(()=>{})}finally{M=null}}}}var u5=K.object({version:K.literal("0.1.42"),metadata:K.object({extensionId:K.string(),extensionInstanceId:K.string(),nativeHostName:K.string()})});async function T9($){await $.assertCurrent();let J;if("discover"in $)J=$.discover;else{let Z=await bX($.automationDirectory);J=(Q,X)=>g2(Z,Q,X)}if(await Q$({path:$.worker.path,sha256:$.worker.sha256}),!await d1($.encoder))throw Error("mac_recording_encoder_unavailable");return async(Z,Q,X,Y)=>{Y.throwIfAborted(),await $.assertCurrent();let V=await J(Z,Y),N=new P$({socketPath:V.socketPath,sessionId:X,timeoutMs:2000}),G;try{if(await N.connect(),G=u5.parse(await N.getInfo()),G.metadata.extensionId!==V.extensionId||G.metadata.extensionInstanceId!==V.instanceId)throw Error("mac_recording_profile_changed");if(!K.array(K.object({id:K.number()})).parse(await N.getTabs()).some((M)=>M.id===Q))throw Error("mac_recording_tab_not_owned");await $.assertCurrent(),Y.throwIfAborted()}finally{N.close()}return{extensionInstanceId:V.instanceId,async createHost(H,M,U){let B=new P$({socketPath:V.socketPath,sessionId:H.browser.browserScope,timeoutMs:2000});return g5({worker:$.worker,configuration:{owner:H.browser,seconds:M,encoder:$.encoder,socketPath:V.socketPath,extensionId:V.extensionId,nativeHostName:G.metadata.nativeHostName},async assertCurrent(){U.throwIfAborted(),Y.throwIfAborted(),await $.assertCurrent()},async cleanup(){try{await B.connect();let T=u5.parse(await B.getInfo());if(T.metadata.extensionInstanceId!==H.browser.extensionInstanceId||T.metadata.extensionId!==V.extensionId||T.metadata.nativeHostName!==G.metadata.nativeHostName)throw Error("mac_recording_profile_changed");await B.executeCdp(Q,"Page.stopScreencast",{})}finally{B.close()}}})}}}}var z0=()=>Error("mac_pr_proof_unavailable"),kX=K.object({operationId:K.string().uuid()}).strict();function p5($){let J=$.qualifiedProfiles??[{profile:$.profile,extension_instance_id:$.extensionInstanceId}],Z=K.array(K.object({profile:K.string().regex(/^(Default|Profile [0-9]+)$/),extension_instance_id:K.string().min(1).max(1024)}).strict()).min(1).max(16).parse(J);if(!K.string().uuid().safeParse($.generation).success||new Set(Z.map((B)=>B.profile)).size!==Z.length)throw z0();if(!$.qualifiedProfiles){let B=new URL($.uploadOrigin);if(!$.resolveBrowser||B.protocol!=="https:"||B.origin!==$.uploadOrigin||B.username||B.password)throw z0()}let Q=new Map,X=new Map,Y=new Map,V=!1,N=new wX,G=async(B)=>{let q=N.getStore();if(V||!B&&!q)throw z0();if(q?.signal.throwIfAborted(),await $.assertCurrent(B??q.claim),V)throw z0();q?.signal.throwIfAborted()},H=(B,q)=>{let T="owner"in q?q.owner:("context"in q)?q.context.owner:q.input.owner;if(B.capability!==V9||!B.owner||T.generation!==$.generation||!Z.some((L)=>L.profile===T.profile&&L.extension_instance_id===T.extensionInstanceId)||T.organizationId!==B.owner.organization_id||T.userId!==B.owner.user_id||T.deviceId!==B.owner.device_id||T.rootId!==B.root_id||T.runId!==B.run_id)throw z0();return T},M=async(B)=>{await G();let q=JSON.stringify([B.runId,B.profile]),T=Q.get(q);if(!T){if(Q.size>=4)throw z0();T=(async()=>{let F,D=$.browserScope?.(B)??U1(B.runId),O=await $.createBrowser({owner:B,assertCurrent:()=>G(),readVideo:(j)=>F.publicationCapture(j)});if(F=z5({owner:B,browserScope:D,assertCurrent:()=>G(),screenshot:O.screenshot,async createVideo(j,A,_,W){if(!$.resolveBrowser)throw z0();let P=await $.resolveBrowser(B.profile,A,D,W);if(P.extensionInstanceId!==B.extensionInstanceId)throw z0();return P.createHost({organizationId:B.organizationId,userId:B.userId,operationId:j.contextId,attemptId:j.contextId,recordingId:j.contextId,browser:{runId:B.runId,deviceId:B.deviceId,rootId:B.rootId,rootRevision:B.rootRevision,generation:B.generation,profile:B.profile,extensionInstanceId:B.extensionInstanceId,browserScope:D,tabId:A}},_,W)}}),V)throw O.close(),await F.close(),z0();return{owner:structuredClone(B),browser:O,capture:F,expiresAt:Date.now()+300000}})(),Q.set(q,T)}let L=await T;if(!d5(L.owner,B)||L.expiresAt<=Date.now())throw z0();return L},U=setInterval(()=>{for(let[B,q]of Q)q.then(async(T)=>{if(T.expiresAt>Date.now()||[...X.values()].some((L)=>L.runtime===T))return;if(T.browser.close(),await T.capture.close(),Q.get(B)===q)Q.delete(B)}).catch(()=>{V=!0})},1000);return U.unref(),{generation:$.generation,async execute(B,q,T){return N.run({claim:B,signal:q},async()=>{let L=U9.parse(B.payload).command,F=H(B,L);if(await G(B),q.throwIfAborted(),$.qualifiedProfiles&&!$.resolveBrowser&&(L.action==="prepare"?L.context.evidenceKind!=="image"||Boolean(L.context.visualPlan)||!L.context.uploadOrigin:!["capture_png","inspect_capture","verify_png_media","publish_png"].includes(L.action)))throw Error("proof_png_only");let D=await M(F),O=async()=>{await G(B),q.throwIfAborted()},j;switch(L.action){case"auth_check":j=await D.browser.preflight(L.input);break;case"prepare":if(L.context.visualPlan)throw Error("proof_source_unavailable");if($.qualifiedProfiles&&!L.context.uploadOrigin)throw z0();j=await D.capture.prepare(L.context);break;case"capture_png":j=await D.capture.screenshot({claim:{operationId:B.operation_id,attemptId:B.attempt_id,contextId:L.contextId,tabId:L.tabId},signal:q});break;case"start_video":{let A={runtime:D,contextId:L.contextId,attemptId:B.attempt_id,tabId:L.tabId,signal:q};if(X.has(B.operation_id))throw z0();X.set(B.operation_id,A);try{j=await D.capture.record({claim:{operationId:B.operation_id,attemptId:B.attempt_id,contextId:L.contextId,tabId:L.tabId},signal:q,seconds:L.seconds,started:async()=>{await O(),await T({version:1,operationId:B.operation_id,contextId:L.contextId,acknowledgedAt:new Date().toISOString()})}})}finally{X.delete(B.operation_id)}break}case"inspect_capture":j=await D.capture.inspect(L.captureId);break;case"publish_video":j=await D.browser.publish(L.input);break;case"verify_saved_media":j=await D.browser.verify(L.input);break;case"verify_png_media":j=await D.browser.verifyImages(L.media);break;case"publish_png":{let A=`${F.runId}:${L.attemptId}`,_=Y.get(A);if(_){if(!d5(_.request,L))throw z0();j=_.result;break}if(Y.size>=16)throw z0();let W=new URL(L.uploadUrl);if(W.protocol!=="https:"||W.username||W.password||W.hash||W.pathname!==`/${L.storagePath}`||!L.storagePath.startsWith(`pr-screenshots/${F.runId}/${L.captureId}/`)||!/^[a-zA-Z0-9._-]+\.png$/.test(L.storagePath.split("/").at(-1))||L.storagePath.split("/").length!==4)throw z0();let P=await D.capture.publicationCapture(L.captureId);try{if(W.origin!==($.qualifiedProfiles?P.capture.context.uploadOrigin:$.uploadOrigin)||P.capture.media.contentType!=="image/png"||P.capture.sha256!==L.sha256||P.bytes.length!==L.sizeBytes||yX("sha256").update(P.bytes).digest("hex")!==L.sha256)throw z0();await O();let C={request:structuredClone(L),result:{status:"uncertain",sha256:L.sha256,sizeBytes:L.sizeBytes}};Y.set(A,C);try{let R=await fetch(W,{method:"PUT",body:P.bytes,headers:{"Content-Type":"image/png"},redirect:"error",signal:AbortSignal.any([q,AbortSignal.timeout(20000)])});if(await R.body?.cancel(),await O(),R.ok)C.result={...C.result,status:"uploaded"}}catch{}j=C.result}finally{P.bytes.fill(0)}break}}return await O(),structuredClone(j)})},async control(B,q){if(B.capability!==V9||q.kind!==W5)return!1;let T=kX.safeParse(q.payload),L=X.get(B.operation_id);if(!T.success||T.data.operationId!==B.operation_id||!L||L.attemptId!==B.attempt_id)return!1;let F=U9.parse(B.payload).command;return H(B,F),await G(B),await N.run({claim:B,signal:L.signal},()=>L.runtime.capture.stop({operationId:B.operation_id,attemptId:B.attempt_id,contextId:L.contextId,tabId:L.tabId})),!0},async close(){V=!0,clearInterval(U);let B=await Promise.allSettled([...Q.values()].map(async(q)=>{let T=await q;T.browser.close(),await T.capture.close()}));if(Q.clear(),X.clear(),Y.clear(),B.some((q)=>q.status==="rejected"))throw z0()}}}var pX="__browser-recorder",lX=dX(hX),cX="/tmp/open-browser-use",sX=33554432,aX=K.object({version:K.literal("0.1.42"),metadata:K.object({extensionId:K.literal(p2),extensionInstanceId:K.string().min(1).max(1024)})}),c5=()=>Error("worker_pr_proof_browser_unavailable"),j9={components:f1,ensureBrowser:o5,socketDirectory:cX,async identity($){let J=new P$({socketPath:$,sessionId:`reason-proof-qualification-${_9()}`,timeoutMs:2000});try{return await J.connect(),await J.getInfo()}finally{J.close()}}};async function s5($,J=j9){let Z=J.components();if(!Z?.features.browser)throw c5();await J.ensureBrowser(Z),$.throwIfAborted();let Q=L9(e5(Z),"Default","Local Extension Settings",p2),X=(await l5(Q)).filter((Y)=>Y.endsWith(".log")||Y.endsWith(".ldb")).map((Y)=>L9(Q,Y));for(let Y of(await l5(J.socketDirectory)).filter((V)=>V.endsWith(".sock"))){$.throwIfAborted();let V=L9(J.socketDirectory,Y);try{let N=await vX(V);if(!N.isSocket()||N.uid!==process.getuid?.())continue;let G=aX.parse(await J.identity(V)).metadata.extensionInstanceId;for(let H of X)if((await gX(H)).size<=sX&&(await n5(H)).includes(G))return{socketPath:V,instanceId:G,extensionId:p2}}catch{}}throw c5()}async function F9($){let J=await mX($);return{path:J,sha256:fX("sha256").update(await n5(J)).digest("hex")}}async function r5($={}){let J={...j9,...$};try{let Z=J.components();if(!Z?.ffmpeg)return{error:"worker_recording_ffmpeg_unavailable"};if(!Z.ffprobe)return{error:"worker_recording_ffprobe_unavailable"};let Q=await F9(Z.ffmpeg),{stdout:X}=await lX(Q.path,["-hide_banner","-encoders"],{timeout:1e4,maxBuffer:1048576,env:{PATH:"/usr/bin:/bin"}});if(!/^\s*V\S*\s+libvpx\s/m.test(X))return{error:"worker_recording_libvpx_unavailable"};let Y={ffmpeg:Q,ffprobe:await F9(Z.ffprobe)};if(!await d1(Y))return{error:"worker_recording_encoder_unqualified"};let V=$.recorder??{path:process.execPath,args:[...uX(process.execPath).startsWith("bun")&&process.argv[1]?[process.argv[1]]:[],pX]};return{worker:{...await F9(V.path),args:V.args},encoder:Y}}catch{return{error:"worker_recording_unqualified"}}}function t5($,J={}){let Z={...j9,...J},Q=_9(),X=_9(),Y=a5.parse({version:2,ready:!0,development_only:!1,proof_ready:!1,result:"metadata_only",boot_generation:Q,profiles:["Default"],extension_instance_ids:[X],image:!0,video:!1,source_bound:!1}),V=$.recording?i5.parse({...Y,version:3,video:!0,max_seconds:15}):Y,N=(U)=>H5(U.organizationId,U.sessionId,U.deviceId,1),G=$.recording,H,M=p5({generation:Q,qualifiedProfiles:[{profile:"Default",extension_instance_id:X}],assertCurrent:$.assertCurrent,browserScope:N,...G?{resolveBrowser:async(U,B,q,T)=>{H??=T9({...G,assertCurrent:()=>$.assertCurrent(),discover:(F,D)=>s5(D,Z)}),H.catch(()=>{H=void 0});let L=await(await H)(U,B,q,T);return{extensionInstanceId:X,createHost:async(F,D,O)=>iX(await L.createHost({...F,browser:{...F.browser,extensionInstanceId:L.extensionInstanceId}},D,O),X)}}}:{},createBrowser:(U)=>H9({...U,endpoint:(B)=>({discover:(q)=>s5(q,Z),tabScope:N(B)})})});return{capability:V,broker:M}}function iX($,J){let Z=(Q)=>({...Q,owner:{...Q.owner,extensionInstanceId:J}});return{start:()=>$.start(),close:()=>$.close(),completed:async()=>Z(await $.completed()),stop:async()=>Z(await $.stop()),read:async(Q)=>{let X=await $.read(Q);return{capture:Z(X.capture),bytes:X.bytes}}}}import{execFile as NY}from"child_process";import{execFile as nX}from"child_process";import{readFile as rX}from"fs/promises";import{join as t0}from"path";var tX="Claude Code-credentials",oX="/usr/bin/security",eX=120000,$Y=8192,l2={exec:($,J,Z)=>new Promise((Q)=>{nX($,J,{timeout:Z,maxBuffer:8388608},(X,Y)=>{let V=X?typeof X.code==="number"?X.code:1:0;Q({code:V,stdout:String(Y??"")})})}),readText:async($)=>{try{return await rX($,"utf8")}catch{return null}}};function N1($){return typeof $==="string"&&$.length>0&&$.length<=$Y?$:null}function JY($,J){return $.CLAUDE_CONFIG_DIR||t0(J,".claude")}function ZY($,J){return $.CODEX_HOME||t0(J,".codex")}function $J($){if(!$)return null;try{let J=JSON.parse($).claudeAiOauth,Z=N1(J?.accessToken),Q=N1(J?.refreshToken),X=typeof J?.expiresAt==="number"&&Number.isFinite(J.expiresAt)?J.expiresAt:null;return Z&&Q&&X!==null?{provider:"anthropic",access:Z,refresh:Q,expires:X}:null}catch{return null}}function QY($){try{let J=JSON.parse(Buffer.from($.split(".")[1]??"","base64url").toString("utf8"));return typeof J.exp==="number"?J.exp*1000:null}catch{return null}}function XY($){if(!$)return null;try{let J=JSON.parse($);if(J.auth_mode!==void 0&&J.auth_mode!=="chatgpt")return null;let Z=N1(J.tokens?.access_token),Q=N1(J.tokens?.refresh_token);if(!Z||!Q)return null;return{provider:"openai-codex",access:Z,refresh:Q,expires:QY(Z)??Date.now()}}catch{return null}}function YY($,J){return t0($.XDG_DATA_HOME||t0(J,".local","share"),"opencode","auth.json")}var VY={anthropic:"anthropic",openai:"openai-codex"};function GY($){return XJ($,VY)}function XJ($,J){if(!$)return[];try{let Z=JSON.parse($),Q=[];for(let[X,Y]of Object.entries(J)){let V=Z[X];if(V?.type!=="oauth")continue;let N=N1(V.access),G=N1(V.refresh),H=typeof V.expires==="number"&&Number.isFinite(V.expires)?V.expires:null;if(N&&G&&H!==null)Q.push({provider:Y,access:N,refresh:G,expires:H})}return Q}catch{return[]}}function BY($){return XJ($,{anthropic:"anthropic","openai-codex":"openai-codex"})}function KY($,J){let Z=$.PI_CODING_AGENT_DIR;return Z==="~"?J:Z?.startsWith("~/")?t0(J,Z.slice(2)):Z||t0(J,".pi","agent")}async function YJ($,J,Z=l2){let Q=[],X=await Z.exec(oX,["find-generic-password","-s",tX,"-w"],eX),Y=Date.now()+300000,V=(G)=>{if(!G)return;let H=Q.findIndex((M)=>M.provider===G.provider);if(H<0)Q.push(G);else if(Q[H].expires<=Y&&G.expires>Y)Q[H]=G};if(V(X.code===0?$J(X.stdout.trim()):null),!Q.some((G)=>G.provider==="anthropic"&&G.expires>Y))V($J(await Z.readText(t0(JY($,J),".credentials.json"))));let N=XY(await Z.readText(t0(ZY($,J),"auth.json")));V(N),V(UY(await Z.readText(t0($.GROK_HOME||t0(J,".grok"),"auth.json"))));for(let G of GY(await Z.readText(YY($,J))))V(G);for(let G of BY(await Z.readText(t0(KY($,J),"auth.json"))))V(G);return Q}function VJ($){return $.map(({provider:J,access:Z,expires:Q})=>({provider:J,access:Z,expires:Q}))}var JJ="https://auth.x.ai",ZJ="b1a00492-073a-47ea-816f-4c329264a828",QJ=($)=>typeof $==="string"&&$.length>0&&$.length<=8192&&$.trim()===$;function UY($){if(!$)return null;try{let J=JSON.parse($);if(!J||typeof J!=="object"||Array.isArray(J))return null;let Z=J[`${JJ}::${ZJ}`];if(!Z||typeof Z!=="object"||Array.isArray(Z))return null;let Q=Z;if(Q.auth_mode!=="oidc"||Q.oidc_issuer!==JJ||Q.oidc_client_id!==ZJ||!QJ(Q.key)||!QJ(Q.refresh_token)||typeof Q.expires_at!=="string")return null;let X=Date.parse(Q.expires_at);if(!Number.isFinite(X)||X<=0)return null;return{provider:"xai",access:Q.key,refresh:Q.refresh_token,expires:X}}catch{return null}}var GJ=330000,HY=300000,qY=60000;function MY($,J,Z=Date.now()){return $.filter((Q)=>{if(!Number.isFinite(Q.expires)||Q.expires<=Z+GJ)return!1;let X=J.get(Q.provider);return!X||X.access!==Q.access||X.expires!==Q.expires})}function TY($,J=Date.now()){return[...$.values()].some((Q)=>Q.expires<=J+2*GJ)?qY:HY}var LY=($,J)=>new Promise((Z)=>{if(J.aborted)return Z();let Q=setTimeout(X,$);function X(){clearTimeout(Q),J.removeEventListener("abort",X),Z()}J.addEventListener("abort",X,{once:!0})});async function BJ($){let J=new Map,Z=$.wait??LY,Q=$.stores??(process.platform==="darwin"?l2:{...l2,exec:async()=>({code:1,stdout:""})});while(!$.signal.aborted){try{let X=VJ(await YJ($.environment??process.env,$.home,Q));for(let Y of MY(X,J)){if($.signal.aborted)return;let V=await $.client.localSubscription($.state,Y,AbortSignal.any([$.signal,AbortSignal.timeout(30000)]));J.set(Y.provider,{access:Y.access,expires:Y.expires}),$.onOutcome?.({provider:Y.provider,ok:V.ok,...V.ok?{}:{error:V.error}})}}catch{}await Z(TY(J),$.signal)}}function KJ($=process.env){return new Promise((J)=>{NY("gh",["auth","status","--hostname","github.com"],{env:$,timeout:8000,maxBuffer:65536},(Z)=>J(!Z))})}import{execFile as FY,spawn as hq,spawnSync as fq}from"child_process";import{chmodSync as mq,existsSync as _Y,mkdirSync as gq,readFileSync as uq,renameSync as dq,rmSync as pq,statSync as lq,writeFileSync as cq}from"fs";import{dirname as aq,isAbsolute as iq,join as c2}from"path";var UJ=/^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$/;function NJ($,J){if(!UJ.test($)||!UJ.test(J))throw Error("Invalid CLI version");let Z=$.split(".").map(BigInt),Q=J.split(".").map(BigInt);for(let X=0;X<3;X++){if(Z[X]<Q[X])return-1;if(Z[X]>Q[X])return 1}return 0}var jY="com.reasonmachines.updater",DY=["so.ara.updater","so.reason.updater"];function WY($){let J=$==="staging"?".staging":"";return{label:`${jY}${J}`,legacyLabels:[...DY].reverse().map((Z)=>`${Z}${J}`)}}function OY($,J){return J==="darwin"?$.launchAgent:J==="win32"?$.scheduledTask:$.systemdService}function zY($,J,Z){return{launchAgent:c2(J,"Library","LaunchAgents",`${$}.plist`),systemdService:c2(Z,"systemd","user",`${$}.service`),systemdTimer:c2(Z,"systemd","user",`${$}.timer`),scheduledTask:c2(TJ(J),`${$}.xml`)}}function AY($,J){return new Promise((Z)=>{FY(MJ($),[...J],{timeout:1e4},(Q)=>{Z(Q?typeof Q.code==="number"?Q.code:1:0)})})}async function LJ($){let J=$.runtimePlatform??process.platform;if(J!=="darwin"&&J!=="linux"&&J!=="win32")return"absent";let Z=$.uid??process.getuid?.();if(J!=="win32"&&(typeof Z!=="number"||!Number.isSafeInteger(Z)||Z<=0))return"absent";let Q=$.home??N0(),{label:X,legacyLabels:Y}=WY($.channel),V=$.configHome??qJ(Q),N=[X,...Y].filter((U)=>{return _Y(OY(zY(U,Q,V),J))});if(N.length===0)return"absent";let G=$.command??AY,H=N[0];if(N.length>1){for(let U of N)if((J==="darwin"?await G("/bin/launchctl",["print",`gui/${Z}/${U}`]):J==="win32"?await G("schtasks",["/Query","/TN",U]):await G("systemctl",["--user","is-enabled",`${U}.timer`]))===0){H=U;break}}return(J==="darwin"?await G("/bin/launchctl",["kickstart",`gui/${Z}/${H}`]):J==="win32"?await G("schtasks",["/Run","/TN",H]):await G("systemctl",["--user","start","--no-block",`${H}.service`]))===0?"started":"failed"}var HJ=60000;function FJ($){let J=(X,Y)=>{try{return NJ(X,Y)>0}catch{return!1}},Z=$.actedOn&&J($.actedOn,"0.0.0")?$.actedOn:null,Q=$.schedule??((X,Y)=>{let V=setTimeout(X,Y);V.unref?.(),$.signal.addEventListener("abort",()=>clearTimeout(V),{once:!0})});return(X)=>{if($.signal.aborted||X===void 0||!J(X,$.currentVersion))return;if(Z!==null&&!J(X,Z))return;Z=X;let Y=($.random??Math.random)(),V=Number.isFinite(Y)?Math.min(Math.max(Y,0),1):0;Q(()=>{if(!$.signal.aborted)$.check(X).catch(()=>{return})},Math.min(HJ-1,Math.floor(V*HJ)))}}var RY=30000;async function jJ($){return($.flush??_J)($.paths,async(J)=>{let{schema_version:Z,...Q}=J,X=AbortSignal.timeout(RY);try{await $.client.deviceLifecycle($.device,Q,$.signal?AbortSignal.any([$.signal,X]):X)}catch(Y){if(Y instanceof L0&&Y.status===400&&Y.code==="invalid_device_lifecycle_event")return;throw Y}},$.accept)}var WJ=25000,IY=5000,CY=600000,EY=["display.stream.v1","pty.start"],xY=64;function O9($,J,Z=A9($),Q){return m0(),vJ(J.roots,{...Z,...Q?{productionProof:Q}:{}})}var OJ=5000,SY=600000;function bY($,J){if($.lifetime!=="persistent"||J!=="darwin"||!process.env[c$])return null;try{return s2({platform:J})}catch{return null}}function wY($){return $.event.startsWith("update.")||$.event.startsWith("executor.update.")||$.event.startsWith("identity.")||$.event.startsWith("worker.")}function yY($,J){let Z=Object.keys(J).filter((Q)=>J[Q]!==!0).sort();try{let Q=J9();if(Z.length>0)c1($,{event:"worker.capabilities_withheld",runtime_version:r,capabilities:Z});if(Q)c1($,{event:"identity.computer_use_unavailable",runtime_version:r,reason_code:Q})}catch{}}async function a1($,J,Z,Q,X={}){if(m0(),$.executionMode==="host")s1();let Y=J.worker?.expiresAt;if(!Y||Date.parse(Y)<=Date.now())throw Error("worker_credential_expired");let V=e($);if(V.revoked)throw Error("worker_revoked");let N=AbortSignal.any([...X.signal?[X.signal]:[],AbortSignal.timeout(Math.max(1,Math.min(15000,Date.parse(Y)-Date.now())))]);if(!X.prestartedReadiness)X.onStartup?.("readiness_started");let G,H=()=>G??=$.executionMode==="host"?yJ():Promise.resolve(!1),M=xJ(),U=X.prestartedReadiness??h1($,X.readinessProbes,N,J.roots[0].permissions),B=X.deferOptionalLanes===!0,q=await(B?U.initial:U.final);if(X.signal?.aborted)throw Error("worker_start_cancelled");if(X.onStartup?.("readiness_completed"),Date.parse(Y)<=Date.now())throw Error("worker_credential_expired");let T,L=q["github.local.v1"]===!0?(X.probeGithubSignedIn??KJ)().catch(()=>!1):null,F=new AbortController,D=null,O=async(w,a)=>{let j0=($.userChrome??X.ownComputer===!0)&&w["automation.call.v1"]===!0?uJ():null;if(j0&&"code"in j0)process.stderr.write(`Reason worker: your own Chrome unavailable (${j0.code})
80
- `);let S0=A9($,w,{displayVideo:w["display.stream.v1"]===!0&&await H(),handsBrowser:w["hands.connect"]===!0&&M,userChrome:j0&&"host"in j0?j0.host:null,...T===void 0?{}:{githubSignedIn:T},persistentTerminals:w["pty.start"]===!0&&w2(),probing:a,ownComputer:X.ownComputer===!0});if(!D&&S0.worker.readiness?.["browser.pr-proof.v1"]===!0){let Q0=await r5();if(D||F.signal.aborted)return S0;process.stderr.write("error"in Q0?`Reason worker: PR video proof unavailable (${Q0.error})
81
- `:`Reason worker: PR video proof ready (ffmpeg ${Q0.encoder.ffmpeg.path})
82
- `),D=t5({assertCurrent:async()=>{if(!b())throw Error("proof_authority_lost")},...!("error"in Q0)?{recording:Q0}:{}})}return S0},j=await O(q,B?Z9.filter((w)=>q[w]!==!0):[]),A=O9($,J,j,D?.capability);X.onStartup?.("inventory_completed");let _=!1,W=0,P=0,C="starting",R=null,I=!1,f=!1,S=null,h,p=()=>!V.drained&&Date.parse(Y)>Date.now()&&A.supported_operations.some((w)=>j.worker.readiness?.[w]===!0),b=()=>!_&&p(),x=null,E=()=>W+(x?.claims()??0),z=null,k=new Set,y=(w)=>{let a=w.capabilities.root_paths;if(Object.assign(w.capabilities,O9(w.config,w.state,j,D?.capability)),a)w.capabilities.root_paths=a},i=(w)=>{j=w,y({config:$,state:J,capabilities:A}),z?.();for(let a of k)y(a),a.heartbeatNow?.()},n=new Set,Y0=new Set,q0=setInterval(()=>{let w=new Set;for(let a of[{state:J,capabilities:A},...k])for(let M0 of EY){if(a.capabilities.operation_constraints?.[M0]?.probing!==!0)continue;let S0=`${a.state.deviceId} ${M0}`;if(w.add(S0),!n.has(S0)||Y0.has(S0))continue;Y0.add(S0),process.stderr.write(`${JSON.stringify({event:"worker.readiness_probing_stale",device_id:a.state.deviceId,lane:M0,login_device:a.state===J,timestamp:new Date().toISOString()})}
83
- `)}n.clear();for(let a of w)n.add(a)},CY);q0.unref();let u0=(w)=>{if(!X.readinessProbes)X5({config:$,readiness:w,signal:F.signal,idle:()=>E()===0,permissions:J.roots[0].permissions,onReady:(a)=>{O(a,[]).then(i)}})},x0=B?U.final.then(async(w)=>{if(F.signal.aborted)return;i(await O(w,[]));let a=Z9.filter((M0)=>w[M0]===!0);process.stderr.write(`Reason worker: deferred lanes decided (${a.length?`ready: ${a.join(", ")}`:"none ready"}).
84
- `),u0(w)},()=>{}):Promise.resolve();if(!B)u0(q);L?.then(async(w)=>{T=w;for(;;){let a=j,M0=await O(a.worker.readiness??{},a.worker.probing??[]);if(F.signal.aborted)return;if(j!==a)continue;i(M0);return}});let s0=B&&j.worker.probing?.includes("pty.start")?U.pty.then(async(w)=>{let a=()=>j.worker.probing?.includes("pty.start")===!0;if(F.signal.aborted||!a())return;let M0=await O({...j.worker.readiness,"pty.start":w},(j.worker.probing??[]).filter((j0)=>j0!=="pty.start"));if(F.signal.aborted||!a())return;i(M0)},()=>{}):Promise.resolve(),S$=()=>({version:1,instanceId:Q,deviceId:J.deviceId,phase:C,drained:V.drained||_||I,activeClaims:E(),activeSessions:P,lastHeartbeat:R,expiresAt:Y,supportedOperations:[...A.supported_operations],capabilityReadiness:j.worker.readiness,executionEligible:b()&&!I&&C==="running"}),i$=!1,F$=()=>{i$=!0,K$()},K$=()=>{if(_)return;if(_=!0,C="stopping",S?.close(),E()===0)F.abort();else h=setTimeout(()=>F.abort(),$.shutdownGraceMs)},b$=$.channel==="production"||$.channel==="staging"?$.channel:null,U$=d($).releaseCheck,d0=X.publishedRelease??(b$&&$.lifetime==="persistent"?FJ({currentVersion:r,signal:F.signal,actedOn:(()=>{try{let w=JSON.parse(s(U$));return typeof w==="string"?w:null}catch{return null}})(),check:async(w)=>{try{c(U$,w)}catch{}let a=await LJ({channel:b$});process.stderr.write(a==="started"?`Reason worker: CLI ${w} is published; the updater is checking now.
85
- `:a==="absent"?`Reason worker: CLI ${w} is published; no updater is installed for it here.
86
- `:`Reason worker: CLI ${w} is published; the updater did not start, so its next scheduled check takes it.
87
- `)}}):void 0),j1=(w)=>{if(w==="stop")F$();if(w==="reload_roots"){let a=t($);if(!a||a.deviceId!==J.deviceId)throw Error("worker_identity_changed");J.roots=a.roots;let M0=fJ(J.roots,DJ());if(M0)A.root_paths=M0;else delete A.root_paths;x?.check()}if(w==="drain"||w==="resume"){if(_||Date.parse(Y)<=Date.now())throw Error("worker_stopping_or_expired");V={...V,drained:w==="drain"},I0($,V)}return S$()};X.prestartedControl?.handle(j1);let n$=X.prestartedControl?await X.prestartedControl.closed:await z2($,Q,j1),m,J0=!1,_$=()=>{let w=Date.parse(Y)-Date.now();if(w>0){m=setTimeout(_$,Math.min(w,2147483647));return}_=!0,S?.close(),J0=!0,C="stopping",F.abort(Error("worker_credential_expired"))};_$(),X.signal?.addEventListener("abort",K$,{once:!0});let N$=X.processSignals!==!1;if(N$)process.once("SIGTERM",K$),process.once("SIGINT",F$);if(X.signal?.aborted)K$();try{X.onStartup?.("control_ready");let w=X.client??new l1(R$($.apiOrigin),b0($.proxy,zJ()),Z,{deviceSession:l3({proxied:Boolean($.proxy)||process.env.REASON_RELAY_CUSTOM_DOMAIN==="1"}),prefetchEventChallenges:!0}),a=d($).daemon,M0=F3($,J.deviceId),j0=X.startupTiming,S0=j0?()=>({...j0(),...M0?.enrollmentMs!==void 0?{enrollment_ms:M0.enrollmentMs}:{}}):void 0,Q0=(v)=>{let i0=v.client.localSubscription?.bind(v.client);if($.localLogins===!0&&i0)(X.handOverLocalLogins??BJ)({state:v.state,client:{localSubscription:i0},signal:v.signal,home:N0()}).catch(()=>{return});let U0=DJ(),P0=v.client.liveSessionWorktrees?.bind(v.client);if(P0)IJ(()=>PJ({home:U0,deviceId:v.state.deviceId,liveIds:(D$)=>P0(v.state,D$,v.signal)}),v.signal)};Q0({state:J,client:w,signal:F.signal});let a0=bY($,X.platform??process.platform),D0=w.deviceLifecycle?.bind(w),o0=Promise.resolve(),j$=0,w$=()=>{if(!a0||!D0||_||Date.now()<j$)return;j$=Date.now()+SY,o0=o0.then(()=>jJ({paths:a0,device:J,client:{deviceLifecycle:D0},accept:wY,signal:F.signal})).catch(()=>{return})};if(w$(),a0)U.final.then((v)=>yY(a0,v),()=>{});let r$=(v,i0)=>({state:v.state,client:v.client,...v.firstHeartbeat?{firstHeartbeat:v.firstHeartbeat}:{},runtimeVersion:r,bridgeVersion:r,protocolVersion:2,capabilities:v.capabilities,signal:v.signal,statusPath:v.statusPath,maxConcurrentClaims:X.ownComputer===!0?xY:4*$.slots+bJ,heartbeatIntervalMs:X.heartbeatIntervalMs,operationHeartbeatAttemptTimeoutMs:WJ,operationCompletionTimeoutMs:WJ,maxConsecutiveHeartbeatFailures:3,claimable:b,advertised:p,onClaim:async(U0,P0,D$)=>{let W1=kJ(U0);try{return await(async()=>{let e0=Date.now();if(!v.capabilities.supported_operations.includes(U0.capability))return{status:"failed",error_code:"unsupported_capability"};let i9=j.worker.probing??[],n9=i9.includes(U0.capability)?x0:U0.capability==="hands.connect"&&$.executionMode==="host"&&i9.includes("pty.start")?s0:null;if(n9){let Q2,q3=()=>{};await Promise.race([n9,new Promise((r9)=>{Q2=setTimeout(r9,IY),q3=()=>r9(),P0.addEventListener("abort",q3,{once:!0})})]),clearTimeout(Q2),P0.removeEventListener("abort",q3)}let Z2=U0.capability==="hands.connect",H3=Z2?S:null,M7={signal:P0,emit:D$,...j,...D?{proveMac:D.broker.execute}:{},...U0.capability==="inference.custom.v1"&&v.client.operationCustomEndpointCredential?{customEndpointCredential:(Q2)=>v.client.operationCustomEndpointCredential(v.state,U0,Q2)}:{},...Z2?{handsLaunch:{claimedAtMs:e0,...H3?{takePrespawnedWorker:H3.take,adoptSpawnedWorker:H3.adopt}:{}}}:{}};if(Z2)P+=1;try{return await(X.execute??R9)(v.state,U0,M7)}finally{if(Z2)P-=1}})()}finally{W1()}},onControl:async(U0,P0)=>await mJ(v.state,U0,P0,v.client)||await gJ(v.state,U0,P0)||hJ(U0,P0)||await wJ(U0,P0)||await D?.broker.control(U0,P0)||!1,onEvent:i0}),A0=async(v)=>{await v.client.deviceLifecycle?.(v.state,{event_id:PY(),event:"service.stopped",occurred_at:new Date().toISOString(),runtime_version:r,reason_code:"worker_stopped"},AbortSignal.timeout(OJ)).catch(()=>{return})},W0=$.lifetime==="persistent"?X.ownerWorkspaces:void 0,D1=w.ownerWorkspaces?.bind(w),J2=w.ownerWorkspaceEnrollment?.bind(w);if(W0&&D1&&J2)x=W4({config:$,state:J,signal:F.signal,client:{ownerWorkspaces:D1,ownerWorkspaceEnrollment:J2},...W0.enroll?{enroll:W0.enroll}:{},log:(v)=>{process.stderr.write(v)},serve:async(v,i0,U0)=>{let P0=F3(v.config,v.state.deviceId),D$={config:v.config,state:v.state,signal:i0,statusPath:d(v.config).daemon,...P0?.offer?{firstHeartbeat:P0.offer}:{},capabilities:O9(v.config,v.state,j,D?.capability),client:W0.client?.(v)??new l1(R$($.apiOrigin),b0($.proxy,zJ()),v.proofStore,{deviceSession:l3({proxied:Boolean($.proxy)||process.env.REASON_RELAY_CUSTOM_DOMAIN==="1"}),prefetchEventChallenges:!0})};Q0(D$);let W1={...D$,heartbeatNow:null};k.add(W1);try{await a3({registerHeartbeatNow:(e0)=>{W1.heartbeatNow=e0},...r$(D$,(e0)=>{if(e0.type==="completed")z9(e0.operationId,e0.status);if(e0.type==="claims_changed"){if(U0(e0.activeClaims),_&&E()===0)F.abort()}if(e0.type==="stopped")U0(0)})})}finally{k.delete(W1)}if(_&&!J0)await A0(D$)}});let K3=0,U3=0,N3=W0?.intervalMs??L4;if(await a3({...(X.platform??process.platform)==="darwin"?{readIdleSleepPolicy:()=>E()>0?_2(a):void 0,...X.acquireAwakeHold?{acquireAwakeHold:X.acquireAwakeHold}:{}}:{},registerHeartbeatNow:(v)=>{z=v},...S0?{startup:S0}:{},...r$({state:J,client:w,capabilities:A,signal:F.signal,statusPath:a,...M0?.offer?{firstHeartbeat:M0.offer}:{}},(v)=>{if(v.type==="completed")z9(v.operationId,v.status);if(v.type==="claims_changed"){if(W=v.activeClaims,_&&E()===0)F.abort()}if(v.type==="heartbeat"&&!_){if(v.handsPrespawn&&$.lifetime==="ephemeral"&&!S)S=EJ({log:(i0,U0)=>{process.stderr.write(`${JSON.stringify({event:i0,...U0})}
88
- `)}}),S.arm(),setTimeout(SJ,0);else if(!v.handsPrespawn&&S)S.close(),S=null}if(v.type==="heartbeat"){if(x&&!_&&Date.now()>=K3)K3=Date.now()+N3,x.check().then((i0)=>{U3=i0?0:U3+1,K3=Date.now()+(i0?N3:Math.min(N3,F4*2**Math.min(U3-1,10)))});if(R=v.serverTime,I=v.drain,w$(),!_&&b$)d0?.(v.latestCliVersions?.[b$]);if(!_)C="running";if(!_&&!f&&S$().executionEligible){if(f=!0,X.onStartup?.("ready"),(X.platform??process.platform)==="darwin")setTimeout(()=>{try{D9({skipWhenSettled:!0})}catch{}},0)}}if(v.type==="reconnecting"&&!_)C="reconnecting";if(v.type==="stopped")W=0;X.onEvent?.(v)})}),await x?.settled(),_&&!J0&&$.lifetime==="ephemeral")await w.disconnect?.(J,AbortSignal.timeout(OJ)).catch(()=>{process.stderr.write(`Reason worker: could not remove this computer from Reason (worker_disconnect_failed); it expires on its own.
89
- `)});else if(_&&!J0)await A0({state:J,client:w});if(i$)await CJ().catch(()=>{return})}catch(w){if(!(w instanceof L0&&w.status===401))throw w;if(I0($,{...V,revoked:!0}),w.code==="device_revoked")X.onDeviceRevoked?.();throw Error("worker_revoked")}finally{if(clearTimeout(m),clearInterval(q0),h)clearTimeout(h);if(N$)process.removeListener("SIGTERM",K$),process.removeListener("SIGINT",F$);X.signal?.removeEventListener("abort",K$),F.abort(),S?.close(),await x?.settled().catch(()=>{return}),await D?.broker.close().catch(()=>{return}),await n$()}}function zJ($=process.env){if($.REASON_RELAY_CUSTOM_DOMAIN!=="1")return fetch;return Object.assign((Z,Q)=>{let X=new Headers(Q?.headers);return X.set(AJ,RJ),fetch(Z,{...Q,headers:X})},{preconnect:fetch.preconnect})}import{generateKeyPairSync as kY,sign as hY}from"crypto";var dJ=65536,fY=65536;function vY($){let J=$.export({format:"jwk"});if(J.crv!=="P-256"||typeof J.x!=="string"||typeof J.y!=="string")throw new V0("invalid_public_key");let Z=Buffer.from(J.x,"base64url"),Q=Buffer.from(J.y,"base64url");if(Z.byteLength!==32||Q.byteLength!==32)throw new V0("invalid_public_key");let X=Buffer.concat([Buffer.of(4),Z,Q]).toString("base64url");if(!lJ(X))throw new V0("invalid_public_key");return X}function pJ(){try{let{privateKey:$,publicKey:J}=kY("ec",{namedCurve:"P-256"});return{privateKey:$,publicPoint:vY(J)}}catch($){if($ instanceof V0)throw $;throw new V0("proof_key_generation_failed")}}class i1{keyPair=pJ();binding=null;loadPublicKey(){if(!this.keyPair)throw new V0("proof_key_read_failed");return this.keyPair.publicPoint}createFreshPublicKey(){return this.keyPair=pJ(),this.keyPair.publicPoint}sign($){if(!this.keyPair||$.byteLength<1||$.byteLength>fY)throw new V0("proof_sign_failed");let J;try{J=hY("sha256",$,this.keyPair.privateKey)}catch{throw new V0("proof_sign_failed")}if(!cJ(J))throw new V0("invalid_signature");return J.toString("base64url")}privateKeyIsNonExtractable(){return!1}deleteKey(){if(!this.keyPair)return!1;return this.keyPair=null,!0}loadBinding(){return this.binding?Uint8Array.from(this.binding):null}createBinding($){if($.byteLength<1||$.byteLength>dJ)throw new V0("invalid_binding");if(this.binding)throw new V0("binding_create_failed");this.binding=Uint8Array.from($)}updateBinding($){if($.byteLength<1||$.byteLength>dJ)throw new V0("invalid_binding");if(!this.binding)throw new V0("binding_update_failed");this.binding=Uint8Array.from($)}deleteBinding(){if(!this.binding)return!1;return this.binding=null,!0}loadLegacyCredential(){return null}deleteLegacyCredential(){return!1}}import{execFile as cY,spawn as sY}from"child_process";import{isAbsolute as aY}from"path";import{promisify as iY}from"util";var n1={now:()=>Date.now(),after($,J){let Z=setTimeout(J,$);return()=>clearTimeout(Z)},every($,J){let Z=setInterval(J,$);return()=>clearInterval(Z)}};class r1{input;output;clock;lifetime=new AbortController;signal=this.lifetime.signal;buffer=Buffer.alloc(0);queue=[];failure;waiter;onData=($)=>{let J=Buffer.isBuffer($)?$:Buffer.from($),Z=0;while(Z<J.length&&!this.failure){let Q=J.indexOf(10,Z),X=Q<0?J.length:Q;if(this.buffer.length+X-Z+1>65536){this.fail(Error("worker_ssh_frame_too_large"));return}if(this.buffer=Buffer.concat([this.buffer,J.subarray(Z,X)]),Q<0)return;try{let Y=JSON.parse(this.buffer.toString("utf8"));if(this.buffer=Buffer.alloc(0),this.waiter){let V=this.waiter;this.waiter=void 0,V.resolve(Y)}else if(this.queue.length<4)this.queue.push(Y);else{this.fail(Error("worker_ssh_protocol_flood"));return}}catch{this.fail(Error("worker_ssh_invalid_frame"));return}Z=X+1}};onEnd=()=>this.fail(Error("worker_ssh_connection_closed"),!0);onError=()=>this.fail(Error("worker_ssh_connection_failed"));constructor($,J,Z=n1){this.input=$;this.output=J;this.clock=Z;$.on("data",this.onData),$.on("end",this.onEnd),$.on("close",this.onEnd),$.on("error",this.onError),J.on("error",this.onError)}fail($,J=!1){if(this.failure??=$,this.buffer=Buffer.alloc(0),!J)this.queue=[];this.lifetime.abort();let Z=this.waiter;this.waiter=void 0,Z?.reject(this.failure)}async send($,J=1e4){if(this.failure||this.output.destroyed)throw this.failure??Error("worker_ssh_connection_closed");let Z=JSON.stringify($)+`
90
- `;if(Buffer.byteLength(Z)>65536)throw Error("worker_ssh_frame_too_large");let Q;try{await new Promise((X,Y)=>{Q=this.clock.after(J,()=>Y(Error("worker_ssh_write_timeout"))),this.output.write(Z,(V)=>V?Y(Error("worker_ssh_connection_failed")):X())})}finally{Q?.()}}async receive($=30000,J){if(J?.aborted)throw Error("worker_ssh_cancelled");if(this.queue.length)return this.queue.shift();if(this.failure)throw this.failure;if(this.waiter)throw Error("worker_ssh_concurrent_read");let Z,Q;try{return await new Promise((X,Y)=>{this.waiter={resolve:X,reject:Y},Q=()=>{this.waiter=void 0,Y(Error("worker_ssh_cancelled"))},Z=this.clock.after($,()=>{this.waiter=void 0,Y(Error("worker_ssh_handshake_timeout"))}),J?.addEventListener("abort",Q,{once:!0})})}finally{Z?.(),J?.removeEventListener("abort",Q)}}dispose(){this.input.pause(),this.input.removeListener("data",this.onData),this.input.removeListener("end",this.onEnd),this.input.removeListener("close",this.onEnd),this.input.removeListener("error",this.onError),this.output.removeListener("error",this.onError),this.fail(Error("worker_ssh_connection_closed")),this.queue=[]}}import{randomUUID as mY}from"crypto";import{unlinkSync as gY}from"fs";import{join as uY}from"path";var t1=1,a2=45000,dY=K.strictObject({type:K.literal("configure"),protocol:K.literal(t1),version:K.string(),config:$0}),pY=K.strictObject({type:K.literal("ticket"),organizationId:K.string().min(1).max(160),receipt:K.unknown()}),lY=K.strictObject({type:K.enum(["ping","stop"])});async function sJ($={}){let J=$.clock??n1,Z=new r1($.input??process.stdin,$.output??process.stdout,J),Q=new AbortController,X=new AbortController,Y=()=>Q.abort(),V,N,G,H,M=!1;process.once("SIGHUP",Y),Z.signal.addEventListener("abort",Y,{once:!0}),$.signal?.addEventListener("abort",Y,{once:!0});try{if($.signal?.aborted)throw Error("worker_ssh_cancelled");let{config:U,version:B}=dY.parse(await Z.receive(30000,Q.signal));if(B!==r)throw Error("worker_ssh_version_mismatch");if(!["darwin","linux"].includes(process.platform)||!["arm64","x64"].includes(process.arch))throw Error("worker_ssh_platform_unsupported");if(H$(U),o(g(U),!0),N=Z$({path:d(U).lock,runtimeVersion:r}),!N.acquired)throw Error("worker_already_running_or_lifecycle_busy");let q=uY(g(U),`ssh-preflight-${mY()}.json`);try{c(q,{version:1}),s(q)}finally{try{gY(q)}catch{}}let T=t(U),L=e(U);if(L.revoked||L.drained)throw Error("worker_ssh_revoked_or_drained");if(T&&Date.parse(T.worker.expiresAt)<=Date.now())throw Error("worker_credential_expired");if(T&&U.lifetime==="ephemeral")throw Error("worker_ephemeral_requires_fresh_enrollment");await Z.send({type:"hello",protocol:t1,version:r,platform:process.platform,architecture:process.arch,enrolled:!!T});let F=U.lifetime==="ephemeral"?G=new i1:T0(U,!0);if(!T){let _=A$(U);await Z.send({type:"ticket-request",request:_.request});let W=pY.parse(await Z.receive(70000,Q.signal)),P=_.complete(W.organizationId,W.receipt);if(T=await J$(U,P,F,$.enroll),U.lifetime==="persistent")h0(T,d(U).state,{proofStore:F});I0(U,{version:1,drained:!1,revoked:!1})}if(Q.signal.aborted)throw Error("worker_ssh_cancelled");V=(async()=>{try{while(!X.signal.aborted){if(lY.parse(await Z.receive(35000,X.signal)).type==="stop"){Y();return}await Z.send({type:"pong"})}}catch{if(!X.signal.aborted)Y()}})();let D=!1,O,j=!1;H=J.after(Math.max(1,Math.min(a2,$.startupTimeoutMs??a2)),()=>{j=!0,Y()});let A=N.owner.nonce;if(await a1(U,T,F,A,{...$,signal:Q.signal,onEvent(_){if($.onEvent?.(_),_.type==="heartbeat"&&!D&&!O)O=(async()=>{let W=await B0(U,"status");if(!W?.executionEligible)throw Error("worker_ssh_no_ready_capabilities");await Z.send({type:"running",deviceId:W.deviceId,expiresAt:W.expiresAt,lifetime:U.lifetime,supervision:"ssh-foreground"}),D=!0,H?.()})().catch(()=>{j=!0,Y()})}}),await O,j||!D)throw Error("worker_ssh_outbound_or_readiness_failed");return M=!0,0}catch(U){let B=U instanceof Error&&/^worker_[a-z_]+$/.test(U.message)?U.message:"worker_ssh_bootstrap_failed";try{await Z.send({type:"error",code:B})}catch{}return 1}finally{if(H?.(),Y(),X.abort(),await V,G?.deleteBinding(),G?.deleteKey(),N?.acquired)N.release();if(process.removeListener("SIGHUP",Y),$.signal?.removeEventListener("abort",Y),Z.signal.removeEventListener("abort",Y),M)try{await Z.send({type:"stopped"})}catch{}Z.dispose()}}var I9=($)=>aY($)&&$.length<=4096&&!/[\x00-\x1f\x7f]/.test($),P9=($)=>`'${$.replaceAll("'","'\\''")}'`,nY=K.strictObject({type:K.literal("hello"),protocol:K.literal(t1),version:K.string(),platform:K.enum(["linux","darwin"]),architecture:K.enum(["arm64","x64"]),enrolled:K.boolean()}),rY=K.strictObject({type:K.literal("ticket-request"),request:K.strictObject({install_id:K.uuid(),code_challenge:K.string().regex(/^[A-Za-z0-9_-]{43}$/),lifecycle:K.enum(["persistent","ephemeral"]),roots:K.array(K.strictObject({path_fingerprint:K.string().regex(/^[a-f0-9]{64}$/),execution_mode:K.enum(["confined","host"]),permissions:K.strictObject({read:K.literal(!0),write:K.literal(!0),execute:K.literal(!0),discover_environment:K.literal(!0),expose_mcp:K.literal(!1)})})).length(1)})}),aJ=K.discriminatedUnion("type",[K.strictObject({type:K.literal("running"),deviceId:K.string().min(1).max(160),expiresAt:K.iso.datetime({offset:!0}),lifetime:K.enum(["persistent","ephemeral"]),supervision:K.literal("ssh-foreground")}),K.strictObject({type:K.literal("pong")}),K.strictObject({type:K.literal("stopped")})]),tY=new Set(["worker_already_running_or_lifecycle_busy","worker_ssh_revoked_or_drained","worker_credential_expired","worker_config_binding_mismatch","worker_workspace_not_canonical_or_overlaps_state","worker_state_directory_not_private_or_canonical","worker_parent_not_canonical","worker_file_not_private","worker_ssh_platform_unsupported","worker_ssh_outbound_or_readiness_failed","worker_enrollment_rejected","worker_enrollment_receipt_mismatch","worker_ticket_receipt_mismatch","worker_ssh_version_mismatch"]);function i2($){if($&&typeof $==="object"&&"type"in $&&$.type==="error"){let J="code"in $&&typeof $.code==="string"&&tY.has($.code)?$.code:"worker_ssh_remote_failed";throw Error(J)}return $}function iJ($){if(!I9($.remoteCli)||!/^[a-f0-9]{64}$/.test($.sha256))throw Error("worker_ssh_invalid_target");let J=`set -eu
91
- a=${P9($.remoteCli)}
92
- [ -f "$a" ] && [ ! -L "$a" ] && [ -x "$a" ] || { echo worker_ssh_artifact_unavailable >&2; exit 72; }
93
- p=\${a%/*}; f=\${a##*/}; p=\${p:-/}
94
- p=$(cd -P "$p" && pwd -P)
95
- [ "\${p%/}/$f" = "$a" ] || { echo worker_ssh_artifact_unavailable >&2; exit 72; }
96
- if [ -x /usr/bin/sha256sum ]; then h=$(/usr/bin/sha256sum < "$a");
97
- elif [ -x /usr/bin/shasum ]; then h=$(/usr/bin/shasum -a 256 < "$a");
98
- else echo worker_ssh_hash_tool_unavailable >&2; exit 72; fi
99
- h=\${h%% *}
100
- [ "$h" = ${P9($.sha256)} ] || { echo worker_ssh_artifact_mismatch >&2; exit 72; }
101
- exec "$a" worker __ssh-bootstrap`;return`exec /usr/bin/env -i PATH=/usr/bin:/bin:/usr/sbin:/sbin /bin/sh -c ${P9(J)}`}function nJ($,J){if(!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/.test($.alias)||!I9($.sshConfig))throw Error("worker_ssh_invalid_target");return["-T","-a","-F",$.sshConfig,"-o","BatchMode=yes","-o","StrictHostKeyChecking=yes","-o","UpdateHostKeys=no","-o","ForwardAgent=no","-o","ClearAllForwardings=yes","-o","PermitLocalCommand=no","-o","GSSAPIDelegateCredentials=no","-o","SessionType=default","-o","StdinNull=no","-o","ForkAfterAuthentication=no","-o","ControlMaster=no","-o","ControlPath=none","-o","ControlPersist=no",...J?[]:["-o","ProxyJump=none","-o","ProxyCommand=none"],"-o","ConnectTimeout=10","-o","ConnectionAttempts=1","-o","ServerAliveInterval=10","-o","ServerAliveCountMax=3","-o","LogLevel=ERROR","--",$.alias,iJ($)]}function oY($){return nJ($,!1)}function rJ(){return{PATH:"/usr/bin:/bin:/usr/sbin:/sbin",HOME:N0(),...process.env.SSH_AUTH_SOCK?{SSH_AUTH_SOCK:process.env.SSH_AUTH_SOCK}:{}}}async function eY($){let J;try{({stdout:J}=await iY(cY)("/usr/bin/ssh",["-G",...nJ($,!0)],{env:rJ(),timeout:5000,maxBuffer:65536,encoding:"utf8"}))}catch{throw Error("worker_ssh_config_invalid")}for(let Z of J.split(`
102
- `)){let[Q,...X]=Z.trim().split(/\s+/);if(["proxyjump","proxycommand"].includes(Q??"")&&X.join(" ").toLowerCase()!=="none")throw Error("worker_ssh_proxy_unsupported")}}function $V($){let J=["artifact_unavailable","hash_tool_unavailable","artifact_mismatch"].find((Z)=>$.includes(`worker_ssh_${Z}`));return J?`worker_ssh_${J}`:/HOST IDENTIFICATION HAS CHANGED|Host key verification failed|No .*host key is known/i.test($)?"worker_ssh_host_key_rejected":/Permission denied|authentication failed|expired/i.test($)?"worker_ssh_authentication_failed":"worker_ssh_connection_failed"}async function JV($){await eY($);let J=sY("/usr/bin/ssh",oY($),{stdio:["pipe","pipe","pipe"],env:rJ()}),Z="";J.stderr.on("data",(X)=>{if(Buffer.byteLength(Z)+X.length<=65536)Z+=X.toString("utf8");else J.kill("SIGKILL")});let Q=new Promise((X)=>{J.once("error",()=>X({exitCode:1,errorCode:"worker_ssh_client_unavailable"})),J.once("close",(Y)=>{let V=$V(Z);Z="",X({exitCode:Y??1,errorCode:V})})});return{input:J.stdin,output:J.stdout,result:Q,close(){if(J.stdin.destroy(),J.exitCode===null&&J.signalCode===null){J.kill("SIGTERM");let X=setTimeout(()=>J.kill("SIGKILL"),2000);X.unref(),Q.finally(()=>clearTimeout(X))}}}}function ZV($){let J=new Map,Z=!1;for(let V=0;V<$.length;V++){let N=$[V];if(N==="--foreground"&&!Z){Z=!0;continue}if(!["--ssh","--ssh-config","--remote-cli","--artifact-sha256","--config","--credential-file"].includes(N)||J.has(N))throw Error("worker_unknown_or_duplicate_flag");let G=$[++V];if(!G||G.startsWith("--"))throw Error("worker_missing_flag_value");J.set(N,G)}if(!Z)throw Error("worker_ssh_foreground_required");let Q=(V)=>{let N=J.get(V);if(!N)throw Error("worker_required_input_missing");return N},X={alias:Q("--ssh"),sshConfig:Q("--ssh-config"),remoteCli:Q("--remote-cli"),sha256:Q("--artifact-sha256")};if(!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/.test(X.alias)||!I9(X.sshConfig))throw Error("worker_ssh_invalid_target");iJ(X),s(X.sshConfig);let Y=$0.parse(JSON.parse(s(Q("--config"))));if(o1(Y.workspaceRoot,X.remoteCli))throw Error("worker_ssh_artifact_inside_workspace");return{target:X,config:Y,credentialPath:J.get("--credential-file")}}async function QV($,J,Z,Q,X){let{request:Y}=rY.parse(i2(await $.receive(30000,X)));if(Y.lifecycle!==J.lifetime||Y.roots[0].execution_mode!==J.executionMode)throw Error("worker_ticket_receipt_mismatch");let V=()=>{if(X.aborted)throw Error("worker_ssh_cancelled")},N=(async()=>{V();let H=Z??O$(J),M=await(Q.enrollmentCredentials??z$)(J,H);if(V(),!M)throw Error("worker_session_login_required");if(!C0(M.apiOrigin,J.apiOrigin))throw Error("worker_session_origin_mismatch");if(!M.scopes.includes("devices:write"))throw Error("worker_devices_write_scope_required");let U=Q.createTicketClient?.(M)??new C$(M,{credentialsPath:H}),B=z3(await U.createHeadlessDeviceEnrollmentTicket(Y));return V(),{type:"ticket",organizationId:M.orgId,receipt:B}})(),G;try{let H=await Promise.race([N,new Promise((M,U)=>{if(G=()=>U(Error("worker_ssh_cancelled")),X.aborted)G();else X.addEventListener("abort",G,{once:!0})})]);V(),await $.send(H)}finally{X.removeEventListener("abort",G)}}async function tJ($,J={}){let{config:Z,target:Q,credentialPath:X}=ZV($);if(J.signal?.aborted)throw Error("worker_ssh_cancelled");let Y=J.clock??n1,V=await(J.sshTransport??JV)(Q),N=new r1(V.output,V.input,Y),G=new AbortController,H=()=>G.abort(),M,U;if(V.result.then((B)=>{U=B}),process.once("SIGINT",H),process.once("SIGTERM",H),J.signal?.addEventListener("abort",H,{once:!0}),J.signal?.aborted)H();try{if(G.signal.aborted)throw Error("worker_ssh_cancelled");await N.send({type:"configure",protocol:t1,version:r,config:Z});let B=nY.parse(i2(await N.receive(30000,G.signal)));if(B.version!==r)throw Error("worker_ssh_version_mismatch");if(!B.enrolled)await QV(N,Z,X,J,AbortSignal.any([G.signal,N.signal]));M=Y.every(1e4,()=>{N.send({type:"ping"}).catch(H)});let q=!1,T=Y.now()+(B.enrolled?0:W3)+a2+5000;while(!0){let L=q?35000:Math.max(1,T-Y.now()),F=aJ.parse(i2(await N.receive(L,G.signal)));if(F.type==="running"){if(q||F.lifetime!==Z.lifetime||Date.parse(F.expiresAt)<=Date.now())throw Error("worker_ssh_invalid_readiness");q=!0,(J.io??process).stdout.write(JSON.stringify(F)+`
103
- `)}if(F.type==="stopped"){if(!q)throw Error("worker_ssh_invalid_readiness");return 0}}}catch(B){if(G.signal.aborted){M?.();try{await N.send({type:"stop"});let q=Y.now()+Z.shutdownGraceMs+1e4;while(Y.now()<q)if(aJ.parse(i2(await N.receive(Math.max(1,q-Y.now())))).type==="stopped")return 0}catch{}throw Error("worker_ssh_stop_unconfirmed")}if(B instanceof Error&&B.message==="worker_ssh_connection_closed"){let q=U??await Promise.race([V.result,new Promise((T)=>setTimeout(T,100))]);if(q?.exitCode)throw Error(q.errorCode)}throw B}finally{M?.(),process.removeListener("SIGINT",H),process.removeListener("SIGTERM",H),J.signal?.removeEventListener("abort",H),V.close(),N.dispose()}}import{createConnection as BV}from"net";import{WebSocket as n2}from"ws";var XV=1,q1=65536,oJ=4096,eJ=67108864,$6=4194304,H1=K.uuid(),YV=K.strictObject({kind:K.literal("install_only"),authorityId:H1,organizationId:H1,userId:H1,connectionId:H1,attemptId:H1,purpose:K.literal("install"),generation:K.number().int().positive(),transport:K.literal("reverse_ssh"),expiresAt:K.iso.datetime({offset:!0}),maxDurationMs:K.literal(300000),maxChannels:K.literal(1),allowTcpForwarding:K.literal(!1),allowPty:K.literal(!1)}),VV=K.string().max(2048).superRefine(($,J)=>{let Z;try{Z=new URL($)}catch{J.addIssue({code:"custom",message:"invalid relay url"});return}if(Z.protocol!=="ws:"&&Z.protocol!=="wss:"){J.addIssue({code:"custom",message:"invalid relay protocol"});return}if(Z.username||Z.password||Z.search||Z.hash){J.addIssue({code:"custom",message:"relay credentials or modifiers are not allowed"});return}let Q=Z.pathname.split("/");if(Q.length!==4||Q[1]!=="device"||!H1.safeParse(Q[2]).success||!/^[a-f0-9]{64}$/.test(Q[3]??""))J.addIssue({code:"custom",message:"invalid device relay path"});if(Z.protocol==="ws:"&&!["127.0.0.1","[::1]"].includes(Z.hostname))J.addIssue({code:"custom",message:"plaintext relay must be loopback"})});var GV=K.strictObject({protocol:K.literal(XV),type:K.literal("ssh_install_relay"),authorityToken:K.string().regex(/^(?:reason|ara)_ssh_install_[A-Za-z0-9_-]{43}$/),authority:YV,relayUrl:VV,endpoint:K.strictObject({host:K.literal("127.0.0.1"),port:K.literal(22)})});function C9($,J=Date.now()){let Z=GV.parse($),Q=Date.parse(Z.authority.expiresAt);if(!Number.isFinite(Q)||Q<=J)throw Error("ssh_install_relay_expired");if(Q>J+Z.authority.maxDurationMs)throw Error("ssh_install_relay_expiry_invalid");return Z}function J6($){let J=JSON.stringify($);if(Buffer.byteLength(J)>q1)throw Error("ssh_install_relay_frame_too_large");return J}function Z6($){if(!$||typeof $!=="object"||Array.isArray($))throw Error("ssh_install_relay_control_invalid");let J=$;if(J.type==="ssh_install_relay_receipt")return{type:J.type,receipt:C9(J.receipt)};if(J.type==="ssh_install_relay_ready"&&typeof J.authorityId==="string")return{type:J.type,authorityId:J.authorityId};throw Error("ssh_install_relay_control_invalid")}var Q6="ssh_install_relay_closed";function KV($){if(typeof $==="string")return Buffer.byteLength($,"utf8");if(Buffer.isBuffer($))return $.length;if($ instanceof ArrayBuffer)return $.byteLength;if(ArrayBuffer.isView($))return $.byteLength;return Number.POSITIVE_INFINITY}function UV($){if(Buffer.isBuffer($))return $;if($ instanceof ArrayBuffer)return Buffer.from($);if(ArrayBuffer.isView($))return Buffer.from($.buffer,$.byteOffset,$.byteLength);return null}function NV($,J=Q6){try{$.close(1000,J)}catch{$.terminate()}}async function HV($){let J=$.now??(()=>Date.now()),Z=C9($.receipt,J()),X=($.createWebSocket??((_)=>new n2(_,{followRedirects:!1,perMessageDeflate:!1,maxPayload:q1})))(Z.relayUrl),Y=$.connectLocal??(()=>BV({host:"127.0.0.1",port:22})),V,N=!1,G=!1,H=0,M=0,U,B=(_)=>{if(U)clearTimeout(U);U=setTimeout(()=>L("ssh_install_relay_expired"),Math.max(1,_)),U.unref?.()},q,T=new Promise((_)=>{q=_}),L=(_=Q6)=>{if(G)return;if(G=!0,U)clearTimeout(U);if($.signal?.removeEventListener("abort",F),V?.destroy(),X.readyState===n2.OPEN)NV(X,_);else if(X.readyState!==n2.CLOSED)X.terminate();q()},F=()=>L("ssh_install_relay_aborted"),D=()=>L("ssh_install_relay_protocol_error"),O=(_)=>{return H+=1,M+=_,_<=q1&&H<=oJ&&M<=eJ},j=(_)=>{if(G||!N||X.readyState!==n2.OPEN||X.bufferedAmount>$6||!O(_.length)){D();return}X.send(_,{binary:!0},(W)=>{if(W)D()})};X.on("open",()=>{if(G)return;try{let _=J6({type:"ssh_install_relay_receipt",receipt:Z});X.send(_,{binary:!1},(W)=>{if(W)D()})}catch{D()}}),X.on("message",(_,W)=>{if(G)return;let P=KV(_);if(P>q1||!O(P))return D();if(!N){if(W)return D();try{let R=Z6(JSON.parse(String(_)));if(R.type!=="ssh_install_relay_ready"||R.authorityId!==Z.authority.authorityId)return D();N=!0,B(Z.authority.maxDurationMs),V=Y(),V.setNoDelay(!0),V.on("data",j),V.on("error",D),V.on("close",()=>L("ssh_install_relay_peer_closed")),V.on("drain",()=>X._socket?.resume()),V.on("connect",()=>{})}catch{D()}return}if(!W)return D();let C=UV(_);if(!C||!V||V.destroyed||!V.write(C))X._socket?.pause()}),X.on("error",D),X.on("close",()=>L("ssh_install_relay_peer_closed"));let A=Math.max(1,Math.min(Z.authority.maxDurationMs,Date.parse(Z.authority.expiresAt)-J()));if(B(A),$.signal?.addEventListener("abort",F,{once:!0}),$.signal?.aborted)F();return{receipt:Z,closed:T,close:()=>L()}}async function X6($=process.stdin){let J=[],Z=0;for await(let Q of $){let X=Buffer.isBuffer(Q)?Q:Buffer.from(Q);if(Z+=X.length,Z>q1)return 1;J.push(X)}try{let Q=JSON.parse(Buffer.concat(J).toString("utf8"));return await(await HV({receipt:Q})).closed,0}catch{return 1}}import{randomBytes as qV}from"crypto";var s$="ARA_WORKER_PREVIEW_PROBE";async function V6(){if(typeof Bun>"u")return 1;let $=qV(32).toString("base64url"),J,Z=new Promise((V)=>{J=V}),Q=setTimeout(()=>J(1),5000),X=()=>J(0);process.stdin.once("end",X),process.stdin.resume();let Y=Bun.serve({hostname:"127.0.0.1",port:0,fetch(V,N){let G=new URL(V.url).pathname;if(V.method!=="GET")return new Response(null,{status:405});if(G==="/readiness")return new Response(s$);if((G==="/readiness-ws"||G===`/device/readiness/${$}`)&&N.upgrade(V,{data:{relay:G.startsWith("/device/"),http:"",reported:!1}}))return;return new Response(null,{status:404})},websocket:{maxPayloadLength:8192,message(V,N){if(typeof N!=="string"||N.length>8192){V.close();return}if(!V.data.relay){if(N===s$)V.send(s$);else V.close();return}try{let G=Y6(N),H=(M)=>V.send(JSON.stringify(M));if(G.type==="hello")H(G),H({type:"request",id:"http",method:"GET",path:"/readiness",headers:[],body:"",upgrade:!1});else if(G.type==="head"&&G.id==="http"&&G.status===200)H({type:"credit",id:"http"});else if(G.type==="data"&&G.id==="http"){if(V.data.http+=Buffer.from(G.data,"base64").toString(),V.data.http.length>s$.length)throw Error("probe_overflow");H({type:"credit",id:"http"})}else if(G.type==="end"&&G.id==="http"&&V.data.http===s$)H({type:"request",id:"ws",method:"GET",path:"/readiness-ws",headers:[],body:"",upgrade:!0});else if(G.type==="ws"&&G.id==="ws")H({type:"data",id:"ws",data:Buffer.from(s$).toString("base64"),binary:!1});else if(G.type==="data"&&G.id==="ws"&&!G.binary&&Buffer.from(G.data,"base64").toString()===s$&&!V.data.reported)V.data.reported=!0,process.stdout.write(`ready
104
- `);else throw Error("probe_protocol_failed")}catch{V.close(),J(1)}}}});try{return process.stdout.write(JSON.stringify({port:Y.port,token:$})+`
105
- `),await Z}finally{clearTimeout(Q),Y.stop(!0),process.stdin.removeListener("end",X),process.stdin.pause()}}import{closeSync as LV,createReadStream as FV,fstatSync as _V,readFileSync as jV}from"fs";var G6="/run/sc/instance-generation";var MV=/^[1-9][0-9]{0,15}\n?$/;function TV($){return typeof $==="number"&&Number.isSafeInteger($)&&$>0}function B6($){if(typeof $!=="string"||!MV.test($))return null;let J=Number($.trim());return TV(J)?J:null}var K6=3,DV=600000,WV=65536,OV=500;function U6($){if($.length!==3||$[0]!=="standby"||$[1]!=="--handoff-fd"||$[2]!==String(K6))throw Error("worker_standby_invalid_invocation");return{handoffFd:K6}}function zV($=(J)=>jV(J,"utf8")){try{return B6($(G6))}catch{return null}}function AV($){let J;try{J=JSON.parse($)}catch{throw Error("worker_standby_handoff_invalid")}if(!J||typeof J!=="object"||Array.isArray(J))throw Error("worker_standby_handoff_invalid");let Z=Object.keys(J).sort();if(Z.length!==2||Z[0]!=="config"||Z[1]!=="enrollment")throw Error("worker_standby_handoff_invalid");let Q=J,X=$0.safeParse(Q.config),Y=D3.safeParse(Q.enrollment);if(!X.success||!Y.success)throw Error("worker_standby_handoff_invalid");if(X.data.lifetime!=="ephemeral")throw Error("worker_standby_handoff_invalid");return{config:X.data,enrollment:Y.data}}var N6={isPipe:($)=>_V($).isFIFO(),stream:($)=>{let J=FV("",{fd:$,autoClose:!0,highWaterMark:16384});return{chunks:J,close:()=>J.destroy()}},parentPid:()=>process.ppid,now:()=>Date.now(),every:($,J)=>{let Z=setInterval(J,$);return Z.unref?.(),()=>clearInterval(Z)}};async function RV($,J=N6){if(!J.isPipe($.fd)){try{LV($.fd)}catch{}throw Error("worker_standby_handoff_not_pipe")}let Z=J.now()+($.armMs??DV),Q=J.stream($.fd),X=null,Y=()=>{},V=new Promise((G,H)=>{Y=(M)=>{X??=M,H(M)}});V.catch(()=>{});let N=J.every(OV,()=>{if(J.parentPid()!==$.parentPid)Y(Error("worker_standby_parent_changed"));else if(J.now()>=Z)Y(Error("worker_standby_arm_expired"))});try{let G=(async()=>{let M=[],U=0;for await(let B of Q.chunks){if(X)throw X;if(U===0)$.onArriving?.();if(U+=B.length,U>WV)throw Error("worker_standby_handoff_too_large");M.push(B)}return Buffer.concat(M).toString("utf8")})(),H=await Promise.race([G,V]);if(J.parentPid()!==$.parentPid)throw Error("worker_standby_parent_changed");return H}finally{N(),Q.close()}}async function H6($,J=N6){let Z=$.readGeneration??(()=>zV()),Q=J.parentPid(),X=Z();if(X===null)throw Error("worker_standby_no_instance_generation");$.onBooted?.();let Y=await RV({fd:$.fd,parentPid:Q,armMs:$.armMs,onArriving:$.onArriving},J);if(Z()!==X)throw Error("worker_standby_generation_changed");return AV(Y)}var PV=`Usage: reason worker <command> --config PATH [--json]
106
-
107
- enroll Obtain/redeem a ticket using the current Reason login
108
- start Run the existing Device daemon in the foreground
109
- status Read enrollment and live local control state
110
- doctor Read local prerequisites; never enroll or repair
111
- drain Persist withdrawal of new claims; keep current work
112
- resume Explicitly clear persistent drain
113
- stop Drain, then cancel at shutdownGraceMs (ephemeral: ends its Device)
114
- revoke Revoke an offline Device and remove its local key
115
- attach Start this same worker over verified system SSH
116
-
117
- Config: version 1; apiOrigin, channel, stateDirectory, workspaceRoot, lifetime
118
- (persistent|ephemeral); executionMode defaults confined (host is explicit consent);
119
- slots (Sessions at once, 1-4) defaults 1 and a Machine worker runs one;
120
- shutdownGraceMs defaults 30000. Paths must be absolute and canonical.
121
- Config and enrollment files must be owned by the current user with mode 0600.
122
- Enroll: --enrollment-file PATH redeems a platform-provided ticket instead.
123
- Enroll: --credential-file PATH selects a protected Reason credentials JSON file
124
- (including credentialKind: api_key). Credentials never belong in argv or worker state.
125
- The current login needs devices:write; enrollment never opens a browser or starts work.
126
- Ephemeral: start keeps its proof key only in this process. It redeems
127
- --enrollment-file PATH, or else obtains a ticket with the current login.
128
- Its Device ends when the process exits; every start enrolls a new Device.
129
- Use lifetime persistent to stop and start the same Device.
130
- Simple setup: \`reason serve NAME\` writes this config and enrolls for you.
131
- State is isolated under stateDirectory/headless-<channel>, never Desktop identity.
132
- Persistent keys: a new identity's is a non-extractable login Keychain key on a Mac
133
- where the CLI can create one there, otherwise an extractable owner-only file.
134
- proxy {version 1, url, caFile?} carries enrollment, control, Hands and desktop relay
135
- traffic (not yet previews or kept terminals); proxy environment variables stay refused.
136
- No service is installed, no update is performed, and no desktop/VNC is enabled.
137
- SSH: attach --ssh ALIAS --ssh-config PATH --remote-cli /absolute/path/reason
138
- --artifact-sha256 HASH --config PATH --foreground [--credential-file PATH]
139
- The config describes remote paths. An existing, SHA-256-pinned CLI is required.
140
- SSH config must be protected (0600); it explicitly owns IdentityFile and host trust.
141
- ProxyJump/ProxyCommand are unsupported; configure a directly reachable alias.
142
- Pretrust known_hosts. No agent forwarding, automatic installation or detached service.
143
- SSH starts with a clean environment. Custom PLAYWRIGHT_BROWSERS_PATH locations
144
- are not forwarded/supported; running is not a browser-readiness receipt.
145
- Closing SSH stops foreground work; persistent enrollment remains for restart/revoke.
146
- `;function IV($){let[J,...Z]=$;if(!J||J==="help"||J==="--help"||J==="-h")return null;if(!["enroll","start","status","doctor","drain","resume","stop","revoke"].includes(J))throw Error("worker_unknown_command");let Q,X,Y,V=!1;for(let N=0;N<Z.length;N++){let G=Z[N];if(G==="--json"&&!V){V=!0;continue}if(G!=="--config"&&G!=="--enrollment-file"&&G!=="--credential-file")throw Error("worker_unknown_or_duplicate_flag");let H=Z[++N];if(!H||H.startsWith("--"))throw Error("worker_missing_flag_value");if(G==="--config"&&!Q)Q=H;else if(G==="--enrollment-file"&&!X&&["enroll","start"].includes(J))X=H;else if(G==="--credential-file"&&!Y&&J==="enroll")Y=H;else throw Error("worker_unknown_or_duplicate_flag")}if(!Q)throw Error("worker_required_input_missing");if(Y&&X)throw Error("worker_enrollment_inputs_conflict");return{action:J,configPath:Q,enrollmentPath:X,credentialPath:Y,json:V}}var CV=1e4,EV=2000,q6=15000,xV=50;async function L6($,J,Z,Q,X,Y){let V=new i1,N=new AbortController,G,H,M=new Promise((C,R)=>{G=C,H=R});if(M.catch(()=>{}),m0(),$.executionMode==="host")s1();Z("enrollment_started");let U=X(V);U.catch(()=>{});let B=null,q=z2($,J,(C)=>{if(!B)throw Error("worker_starting");return B(C)});q.catch(()=>{}),Z("readiness_started");let T=new AbortController,L,F=AbortSignal.any([N.signal,T.signal,...Q.signal?[Q.signal]:[]]),D=Y?.matches($)?Y.result:void 0;if(Y&&!D)await Y.stop();if(D)F.addEventListener("abort",()=>void Y.stop(),{once:!0});let O,j=new Promise((C)=>{O=C}),A=setTimeout(()=>O(),CV);F.addEventListener("abort",()=>O(),{once:!0});let _,W=(C)=>{if(C==="ready")_=setTimeout(()=>O(),EV);Q.onStartup?.(C)},P=h1($,Q.readinessProbes,F,M,void 0,D,j);P.final.catch(()=>{});try{let C;try{C=await U}catch(R){throw N.abort(),H(Error("worker_enrollment_failed")),await P.final.catch(()=>{}),await q.then((I)=>I(),()=>{}),R}Z("enrollment_completed"),L=setTimeout(()=>T.abort(),Math.max(1,Math.min(q6,Date.parse(C.worker?.expiresAt??"")-Date.now()||q6))),G(C.roots[0].permissions),I0($,{version:1,drained:!1,revoked:!1}),await a1($,C,V,J,{...Q,onStartup:W,prestartedReadiness:P,prestartedControl:{closed:q,handle:(R)=>{B=R}},deferOptionalLanes:!0})}finally{clearTimeout(L),clearTimeout(A),clearTimeout(_),N.abort(),V.deleteBinding(),V.deleteKey(),await q.then((C)=>C(),()=>{})}}async function SV($,J,Z,Q){let{handoffFd:X}=U6($);if(M1(J.environment??process.env).length>0)throw Error("worker_unsafe_environment");if((J.platform??process.platform)!=="linux")throw Error("worker_platform_unsupported");let Y,V,N=()=>{let q=Z.readinessProbes?Z.readinessProbes.boundPty:(T)=>y1(T);if(G||!q)return;try{m0(),s1()}catch{return}if(Y=v8(q),!Z.readinessProbes)setImmediate(()=>{if(G)return;try{w2()}catch{}})},G=!1,H=()=>{G=!0,clearTimeout(V),(Y?.stop()??Promise.resolve()).finally(()=>process.exit(0))};process.once("SIGTERM",H),process.once("SIGINT",H);let M;try{M=await(J.receiveStandbyHandoff??H6)({fd:X,onBooted:()=>{Q("standby_booted"),V=setTimeout(N,xV)},onArriving:()=>clearTimeout(V)})}catch(q){clearTimeout(V);let T=q instanceof Error&&/^worker_standby_[a-z_]+$/.test(q.message)?q.message:"worker_standby_failed";return(J.io??process).stderr.write(`Reason worker: ${T}.
147
- `),await Y?.stop(),(J.exitProcess??((L)=>process.exit(L)))(1),1}finally{clearTimeout(V),process.off("SIGTERM",H),process.off("SIGINT",H)}if(G)return 0;Q("handoff_received");let{config:U,enrollment:B}=M;try{o(g(U),!0);let q=await F6(U,()=>{});try{if(Q("lock_acquired"),t(U))throw Error("worker_ephemeral_requires_fresh_enrollment");return H$(U),await L6(U,q.owner.nonce,Q,Z,(T)=>J$(U,B,T,J.enroll),Y),0}finally{q.release()}}finally{await Y?.stop()}}async function L$($,J={}){let Z=J.io??process,Q=!1,X=!1,Y=new Map,V=(G)=>{Y.set(G,performance.now()),Z.stderr.write(JSON.stringify({event:"worker.startup",stage:G,pid:process.pid,timestamp:new Date().toISOString()})+`
148
- `),J.onStartup?.(G)},N={...J,onStartup:V,onDeviceRevoked:()=>{X=!0,J.onDeviceRevoked?.()},startupTiming:()=>{let G=(q)=>Math.min(o$,Math.max(0,Math.round(q))),H=Y.get("readiness_started"),M=Y.get("readiness_completed"),U=Y.get("handoff_received")??0,B=Object.fromEntries(T6.flatMap((q)=>{let T=Y.get(q);return T===void 0?[]:[[q,G(T-U)]]}));return{service_start_to_heartbeat_ms:G(performance.now()-U),stage_ms:B,...H!==void 0&&M!==void 0?{readiness_ms:G(M-H)}:{}}},onEvent:(G)=>{if(G.type==="error"&&G.diagnostic){Q=!0;let H=G.diagnostic;Z.stderr.write(JSON.stringify({event:"worker.connection_failed",timestamp:new Date().toISOString(),stage:H.stage,category:H.category,httpStatus:H.category==="http"?H.httpStatus:void 0})+`
149
- `)}J.onEvent?.(G)}};try{if($[0]==="__preview-probe"){if($.length!==1||M1(J.environment??process.env).length>0)throw Error("worker_invalid_probe_invocation");return await V6()}if($[0]==="attach"||$[0]==="__ssh-bootstrap"||$[0]==="__ssh-reverse"){if(M1(J.environment??process.env).length>0)throw Error("worker_unsafe_environment");if($[0]==="attach")return await tJ($.slice(1),J);if($.length!==1)throw Error("worker_unknown_or_duplicate_flag");if($[0]==="__ssh-reverse")return await X6();return await sJ(J)}if($[0]==="__update-restart"){let q=$.length===4&&$[3]==="--changed";if($[1]!=="--config"||!$[2]||$.length!==3&&!q)throw Error("worker_unknown_or_duplicate_flag");if(M1(J.environment??process.env).length>0)throw Error("worker_unsafe_environment");let T=$0.parse(JSON.parse(s($[2]))),L=await A2(T,q?void 0:r);return Z.stdout.write(JSON.stringify(L)+`
150
- `),L.state==="current"?3:L.state==="busy"?75:0}if($[0]==="standby")return await SV($,J,N,V);let G=IV($);if(!G)return Z.stdout.write(PV),0;if(M1(J.environment??process.env).length>0)throw Error("worker_unsafe_environment");if(!["darwin","linux","win32"].includes(process.platform))throw Error("worker_platform_unsupported");let H=$0.parse(JSON.parse(s(G.configPath))),M=(q)=>Z.stdout.write(JSON.stringify(q)+`
151
- `),U=t(H);if(G.action==="status"||G.action==="doctor"){let q=await B0(H,"status"),T=e(H),L={enrolled:!!U||!!q,deviceId:U?.deviceId??q?.deviceId??null,lifetime:H.lifetime,expired:U||q?Date.parse(U?.worker?.expiresAt??q.expiresAt)<=Date.now():null,drained:T.drained,revoked:T.revoked,live:q};if(G.action==="status")return M(L),0;let F=!0;try{H$(H)}catch{F=!1}return M({...L,workspace:F,platform:process.platform,executionMode:H.executionMode,proofStorage:H.lifetime==="ephemeral"?"process-memory":U&&T0(H)instanceof t$?"login-keychain":"owner-only-file",confinement:H.executionMode==="host"?"explicitly-disabled":"verified-on-start-not-by-doctor",capabilitySource:q?.supportedOperations?"live-worker":"unavailable",reportedOperations:q?.supportedOperations??null,capabilityReadiness:q?.capabilityReadiness??null,ready:q?.executionEligible===!0&&!L.expired}),F&&(U||q)&&!L.revoked&&!L.expired?0:1}if(["drain","resume","stop"].includes(G.action)){let q=G.action==="drain"?"drain":G.action==="resume"?"resume":"stop",T=await B0(H,q);if(T){if(M(T),q==="stop"&&H.lifetime==="ephemeral"&&!G.json)Z.stderr.write(wV);return 0}}o(g(H),!0);let B=await F6(H,()=>{if(!G.json)Z.stderr.write(`Waiting for the previous worker to stop\u2026
152
- `)});try{if(G.action==="start")V("lock_acquired");let q=t(H);if(["drain","resume","stop"].includes(G.action)){if(!q)throw Error("worker_not_enrolled");let T=e(H);if(T.revoked||Date.parse(q.worker.expiresAt)<=Date.now())throw Error("worker_revoked_or_expired");if(G.action!=="stop")I0(H,{...T,drained:G.action==="drain"});return M({running:!1,drained:G.action==="stop"?T.drained:G.action==="drain"}),0}if(G.action==="enroll"){if(H.lifetime!=="persistent")throw Error("worker_ephemeral_requires_start_enrollment_file");let T=G.enrollmentPath,L=!T&&e(H).revoked;if(q&&!L)throw Error("worker_already_enrolled");H$(H);let F=()=>{y0(H),N4(H)};if(L)F();let D=async()=>{let A=G2(H),_=T?await O3(H,T,A,J.enroll):await M6(H,G.credentialPath,J,A);return{proof:A,enrolled:_}},{proof:O,enrolled:j}=await D().catch((A)=>{if(T||!(A instanceof $$)||!A.deviceRemoved)throw A;return F(),D()});return h0(j,d(H).state,{proofStore:O}),I0(H,{version:1,drained:!1,revoked:!1}),M({enrolled:!0,deviceId:j.deviceId,lifetime:H.lifetime}),0}if(G.action==="revoke"){if(!q)throw Error("worker_not_enrolled");let T=T0(H),L=new l1(R$(H.apiOrigin),b0(H.proxy),T);if(I0(H,{version:1,drained:!0,revoked:!0}),J.revoke)await J.revoke(q,L);else await L.disconnect(q,AbortSignal.timeout(30000));return y0(H),M({revoked:!0,localKeyRemoved:!0}),0}if(H$(H),H.lifetime==="ephemeral"){if(q)throw Error("worker_ephemeral_requires_fresh_enrollment");await L6(H,B.owner.nonce,V,N,async(T)=>G.enrollmentPath?O3(H,G.enrollmentPath,T,J.enroll):M6(H,void 0,J,T,"worker_ephemeral_enrollment_required"))}else{if(G.enrollmentPath)throw Error("worker_start_never_reenrolls_persistent_identity");if(!q)throw Error("worker_not_enrolled");if(e(H).revoked)X=!0;await a1(H,q,T0(H),B.owner.nonce,N)}return 0}finally{B.release()}}catch(G){let H=G instanceof Error&&(G.message==="worker_revoked"||!Q&&/^worker_[a-z_]+$/.test(G.message))?G.message:"worker_command_failed";Z.stderr.write(`Reason worker: ${H}.
153
- `);let M=$.includes("--json")?void 0:Z1(G instanceof $$&&G.deviceRemoved?"worker_enrollment_device_removed":H);if(M)Z.stderr.write(`${M}
154
- `);return H==="worker_revoked"&&X?0:1}}var bV=60000;async function F6($,J){let Z=Date.now()+$.shutdownGraceMs+bV,Q=!1;for(;;){let X=Z$({path:d($).lock,runtimeVersion:r});if(X.acquired)return X;let Y=await B0($,"status").catch(()=>null);if(!(Y?Y.phase==="stopping":Q)||Date.now()>=Z)throw Error("worker_already_running_or_lifecycle_busy");if(!Q)Q=!0,J();await new Promise((N)=>setTimeout(N,250))}}var wV='This ephemeral worker\'s Device ends when it exits; starting it again needs a new --enrollment-file (or `reason login`) and adds a new Device. Use "lifetime": "persistent" to keep one Device across restarts.\n';async function M6($,J,Z,Q,X="worker_session_login_required"){if(Z.enrollmentInput&&!J){let G=performance.now();return J$($,await Z.enrollmentInput($),Q,Z.enroll,G)}let Y=J??O$($),V=await(Z.enrollmentCredentials??z$)($,Y);if(!V)throw Error(X);let N=Z.createTicketClient?.(V)??new C$(V,{credentialsPath:Y,fetchImpl:b0($.proxy)});return U4($,V,N,Q,Z.enroll)}import{spawn as yV}from"child_process";import{readFileSync as kV,unlinkSync as hV}from"fs";import{join as fV}from"path";var vV=120,mV=15,gV=5000;function r2($={}){let J=$.stateDirectory?fV($.stateDirectory,uV):null;if(J)dV(J);let Z=Y1();if(!Z)return null;let Q=process.platform==="win32",X=Math.max(1,Math.floor($.limitSeconds??vV)),Y=$.pid??process.pid,V=Math.min(mV,X),N=J?`printf '%s %s %s\\n' "$(date +%s)" ${X+V} ${_6(r)} > ${_6(J)} 2>/dev/null
155
- `:"",G=(T)=>`[ $((SECONDS - started)) -ge ${Math.max(1,T-1)} ]`,H=Q?":":`[ "$(ps -o ppid= -p $$ | tr -d ' ')" = "${Y}" ]`,M=Q?`"$SYSTEMROOT/System32/taskkill.exe" /PID ${Y} /F >/dev/null`:`kill -KILL ${Y}`,U=`parent_is_worker() { ${H}; }
156
- while :; do started=$SECONDS
157
- IFS= read -r -t ${X} pulse && continue
158
- ${G(X)} && parent_is_worker || exit 0
159
- started=$SECONDS
160
- IFS= read -r -t ${V} pulse && continue
161
- if ${G(V)} && parent_is_worker; then
162
- echo "Reason: worker_event_loop_stalled; no progress for ${X+V}s, restarting the worker." >&2
163
- ${N}${M}
164
- fi
165
- exit 0
166
- done`,B=yV(Z,["-c",U],{stdio:["pipe","ignore","inherit"],windowsHide:!0,...Q?{env:{...process.env,MSYS_NO_PATHCONV:"1"}}:{}});B.on("error",()=>{}),B.stdin.on("error",()=>{});let q=setInterval(()=>B.stdin.write(`
167
- `),Math.min(gV,X*1000/4));return q.unref(),B.unref(),{stop(){clearInterval(q),B.stdin.end()}}}var uV="worker-stalled";function _6($){return`'${$.replaceAll("'","'\\''")}'`}function dV($){let J;try{J=kV($,"utf8"),hV($)}catch{return}let Z=/^(\d{1,12}) (\d{1,6}) ([0-9A-Za-z.+-]{1,64})\n?$/.exec(J);if(!Z)return;try{c1(s2(),{event:"worker.previous_exit",runtime_version:Z[3],reason_code:"worker_event_loop_stalled",duration_ms:Math.min(86400000,Number(Z[2])*1000)},{now:()=>new Date(Number(Z[1])*1000)})}catch{}}var iV=`Share this computer as a machine
168
-
169
- Usage:
170
- reason serve This computer, signed in (machine name: its hostname)
171
- reason serve --token rmt_\u2026 Any server, no login: the token names the machine
172
- reason serve NAME [--dir PATH] [--once] [--sandbox] [--yes]
173
- reason serve [NAME | --token rmt_\u2026] [--dir PATH] --service
174
- reason serve NAME --stop [--json] (same as: reason stop NAME)
175
-
176
- Adds this computer as a worker of a machine and waits for sessions. Start one
177
- from anywhere with: reason "fix the flaky test" --on NAME
178
- (To run one session here yourself, run \`reason "PROMPT"\` in the folder; it
179
- needs no machine and serves only while that command runs.)
180
- Sessions queue on the machine until one of its workers is free. Run
181
- \`reason serve\` on more computers, or in more folders, to add workers.
182
-
183
- Signed in, the machine is created if it doesn't exist (owners and admins).
184
- Without a login, use a token from \`reason machines token NAME\`: --token, or
185
- REASON_TOKEN. The token is used once to join and is never saved. Reconnect
186
- later with \`reason serve NAME\` or the same command. Press Ctrl-C to stop.
187
-
188
- With --service (macOS and Linux), this computer joins in the foreground, then
189
- keeps the worker running in the background: it starts again at login (Linux:
190
- at boot, when user lingering is allowed) and restarts if it fails. The service
191
- runs \`reason serve NAME --dir PATH\` with this worker's saved identity; the
192
- token is never saved. \`reason stop NAME\` stops and removes it.
193
-
194
- Options:
195
- --dir PATH Folder sessions work in (default: the current directory)
196
- --once Keep the worker only while this command runs; nothing is saved
197
- --sandbox Run confined. Sandboxed machines can't host sessions yet.
198
- --yes Accept the first-run confirmation (required without a terminal;
199
- a token already carries it)
200
- --service Keep this worker running as a background service (see above)
201
- --stop Stop this computer's running workers for NAME and remove
202
- their background services. They stay in Reason and can
203
- start again; \`reason disconnect NAME\` removes them.
204
-
205
- Sessions run commands in the folder with the permissions of the user who runs
206
- the worker unless --sandbox is set. Settings live in
207
- ~/.reason/workers/NAME@<folder hash>/worker.json, one per folder, so every
208
- folder served for NAME is its own worker. Use
209
- \`reason worker status|revoke --config <that file>\` for advanced control.
210
- `,nV=/^[A-Za-z0-9][A-Za-z0-9._-]{0,31}$/,rV=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,z6="Machine NAME must start with a letter or digit and use only letters, digits or hyphens (max 63).",j6=["REASON_TOKEN","REASON_MACHINE_TOKEN"],A6="my-computer";function b9($){let J=($.trim().split(".")[0]??"").toLowerCase().replace(/[^a-z0-9-]+/g,"-").replace(/-{2,}/g,"-").slice(0,63).replace(/^-+|-+$/g,"");return J&&C1(J)&&J!==j2?J:A6}class X0 extends Error{}function tV($,J){let Z,Q=new Map,X=new Set;for(let H=0;H<$.length;H+=1){let M=$[H];if(M==="--help"||M==="-h"||M==="help")return null;if(M==="--dir"||M==="--token"||M==="--org"){let U=$[H+1];if(!U||U.startsWith("-"))throw new X0(`Missing value after ${M}.`);if(Q.has(M))throw new X0(`${M} may be specified only once.`);Q.set(M,U),H+=1;continue}if(["--once","--sandbox","--yes","-y","--stop","--json","--service"].includes(M)){X.add(M==="-y"?"--yes":M);continue}if(M.startsWith("-"))throw new X0(`Unknown option: ${M}. Run \`reason serve --help\`.`);if(Z!==void 0)throw new X0("Expected one machine NAME.");Z=M}let Y=X.has("--stop");if(Z===void 0&&Y)throw new X0("Missing machine NAME. Usage: reason stop NAME");if(Z!==void 0){if(!C1(Z)&&!nV.test(Z))throw new X0(z6);if(Z.toLowerCase()===j2)throw new X0(`"${j2}" is reserved for Reason's cloud. Choose another NAME.`)}if(Y&&(Q.size>0||[...X].some((H)=>H!=="--stop"&&H!=="--json")))throw new X0("--stop takes only NAME and --json.");if(!Y&&X.has("--json"))throw new X0("--json is only used with --stop.");if(X.has("--service")&&X.has("--once"))throw new X0("--service keeps the worker running; it cannot be combined with --once.");let V=Y?void 0:Q.get("--token")??J,N=Q.get("--org");if(V!==void 0){if(!V.startsWith("rmt_"))throw new X0("That is not a machine token (they start with rmt_). Create one with: reason machines token NAME");if(N!==void 0&&!rV.test(N))throw new X0("--org must be a workspace id.")}else if(N!==void 0)throw new X0("--org is only used with --token.");let G=Q.get("--dir");return{...Z===void 0?{}:{name:Z},...G===void 0?{}:{dir:G},once:X.has("--once"),sandbox:X.has("--sandbox"),yes:X.has("--yes"),stop:Y,json:X.has("--json"),service:X.has("--service"),...V===void 0?{}:{token:V},...N===void 0?{}:{org:N.toLowerCase()}}}function $3($,J){let Z=aV($,J??"."),Q;try{Q=process.platform==="win32"?S9.native(Z):S9(Z)}catch{throw new X0(`Folder not found: ${Z}`)}if(!cV(Q).isDirectory())throw new X0(`Not a folder: ${Q}`);return Q}var t2=($)=>a$($,".reason","workers"),E9=($)=>u(d($).state);function oV($,J,Z){let Q=a$(t2($),J);if(R0(a$(Q,"worker.json"))?.workspaceRoot===Z)return Q;return a$(t2($),`${J}@${pV("sha256").update(Z).digest("hex").slice(0,8)}`)}function R6($){let{stateDirectory:J}=$;if(o1($.workspaceRoot,J)||o1(J,$.workspaceRoot))throw new X0(`${$.workspaceRoot} contains Reason's machine settings (~/.reason). Pick a project folder with --dir.`);return $0.parse({version:1,apiOrigin:$.apiOrigin,channel:$.channel,stateDirectory:J,workspaceRoot:$.workspaceRoot,lifetime:$.once?"ephemeral":"persistent",executionMode:$.sandbox?"confined":"host",name:$.name})}function R0($){if(!u($))return null;let J=new X0(`${$} is not a valid worker config. Remove it to start over.`),Z;try{Z=JSON.parse(s($))}catch(X){if(X instanceof SyntaxError)throw J;throw X}let Q=$0.safeParse(Z);if(!Q.success)throw J;return Q.data}function x9($){return[`--dir ${$.workspaceRoot}`,...$.executionMode==="confined"?["--sandbox"]:[]].join(" ")}async function eV($,J){$.stdout.write(`${J} [y/N] `);let Z=await D6($.stdin,new AbortController().signal);return/^(y|yes)$/i.test(Z?.trim()??"")}function J3($){return{write(J){if(J.startsWith('{"event":"worker.startup"'))return!0;return $.write(J)}}}var $G={machine_not_found:"worker_machine_not_found",machine_admin_required:"worker_machine_admin_required",invalid_token:"worker_machine_token_invalid",machine_token_forbidden:"worker_machine_token_forbidden",machine_token_owner_unauthorized:"worker_machine_token_owner_unauthorized"};async function P6($){try{return await $()}catch(J){let Z=J instanceof v0?$G[J.code]:void 0;throw Z?Error(Z):J}}async function JG($,J,Z,Q){let X=R6({...J,name:$.name??A6,stateDirectory:a$(t2(Z),".token-enrollment")}),Y=A$(X,{stored:!1}),V=await P6(()=>W6({apiOrigin:X.apiOrigin,token:$.token,body:Y.request,...Q.fetchImpl?{fetchImpl:Q.fetchImpl}:{}}));if(!C1(V.machine_name))throw Error("worker_ticket_receipt_mismatch");if($.name!==void 0&&$.name.toLowerCase()!==V.machine_name.toLowerCase())throw new X0(`This token is for machine "${V.machine_name}", not "${$.name}". `+"Run `reason serve --token \u2026` without a NAME, or ask for a token for that machine.");if($.org!==void 0&&$.org!==V.organization_id.toLowerCase())throw new X0(`This token is for workspace ${V.organization_id}, not ${$.org}. Drop --org; the token names its workspace.`);let N=!1;return{name:$.name??V.machine_name,input:(G)=>{if(N)throw Error("worker_ticket_receipt_mismatch");return N=!0,Y.saveInstall(G),Y.complete(V.organization_id,V)}}}function ZG($,J,Z,Q){return async(X)=>{if(J)return J.input(X);let Y=await(Z.worker?.enrollmentCredentials??z$)(X);if(!Y)throw Error("worker_session_login_required");let V=(Z.createApi??((N)=>new C$(N)))(Y);return K4(X,Y,{createHeadlessDeviceEnrollmentTicket:(N)=>P6(async()=>{try{return await V.createMachineEnrollmentTicket($,N)}catch(G){if(!(G instanceof v0)||G.code!=="machine_not_found")throw G}try{await V.createMachine({name:$}),Q.stdout.write(`Created machine "${$}".
211
- `)}catch(G){if(!(G instanceof v0)||G.status!==409)throw G}return V.createMachineEnrollmentTicket($,N)})})}}async function I6($,J,Z,Q){let X=await A2($,Q,()=>O6($,J,Z));if(X.state==="current"||X.state==="busy")return X;if(!G$($,J,Z))return null;return b3($),X}function w9($,J){let Z=t2($);if(!u(Z))return[];let Q=J.toLowerCase();return lV(Z).sort().flatMap((X)=>{let Y=X.toLowerCase();if(Y!==Q&&!Y.startsWith(`${Q}@`))return[];let V=a$(Z,X,"worker.json"),N=R0(V);return N?[{path:V,config:N}]:[]})}async function QG($,J,Z,Q,X){let Y=w9(J,$.name);if(Y.length===0)throw new X0(`No worker for machine "${$.name}" on this computer.`);let V=Q.controlWorker??B0,N=[];for(let G of Y){let H=await V(G.config,"stop")!==null,M=e2(G.config,X),U=H||M!==null;if(N.push({config:G.path,folder:G.config.workspaceRoot,running:U,service:M?.label??null}),!$.json&&M)Z.stdout.write(`Removed background service ${M.label} (${G.config.workspaceRoot}); it won't start again.
212
- `);if(!$.json)Z.stdout.write(U?`Stopping machine "${$.name}" in ${G.config.workspaceRoot}; current work finishes first.
213
- `:`Machine "${$.name}" in ${G.config.workspaceRoot} is not running.
214
- `)}if($.json)Z.stdout.write(`${JSON.stringify({machine:$.name,workers:N})}
215
- `);return 0}async function C6($,J={}){let Z=J.io??{stdout:process.stdout,stderr:process.stderr,stdin:process.stdin,stdinIsTty:Boolean(process.stdin.isTTY),stdoutIsTty:Boolean(process.stdout.isTTY)},Q=J.runWorker??L$,X=J.env??process.env,Y=j6.map((V)=>X[V]?.trim()).find(Boolean)||void 0;if(!J.env)for(let V of j6)delete process.env[V];try{let V=tV($,Y);if(!V)return Z.stdout.write(iV),0;let N=S9(J.home??N0()),G=J.serviceHost??V$(N);if(V.stop)return await QG({...V,name:V.name},N,Z,J,G);let H=J.channel??Y$(),M=$3(J.cwd??process.cwd(),V.dir),U=V.service?T1(G,X):void 0,B={channel:H,apiOrigin:e1(X,H),workspaceRoot:M,once:V.once,sandbox:V.sandbox},q=V.token?await JG({...V,token:V.token},B,N,J):void 0,T=q?.name??V.name??b9((J.hostname??sV)()),L=oV(N,T,M),F=a$(L,"worker.json"),D=R0(F);if(q&&D&&E9(D)&&e(D).revoked)y0(D);let O=!q&&D!==null&&E9(D)&&(!p1(X,"REASON_API_URL")?.trim()||C0(B.apiOrigin,D.apiOrigin))?D.apiOrigin:void 0,j=R6({...B,...O?{apiOrigin:O}:{},name:T,stateDirectory:L}),A=D!==null&&E9(D);if(A&&K0(D)!==K0(j)){if(j.lifetime==="ephemeral")throw new X0(`Machine "${T}" is already saved for this folder; --once needs another folder or NAME.`);throw new X0(`Machine "${T}" is already set up with different settings (${D.workspaceRoot}, ${D.executionMode==="host"?"your user permissions":"sandboxed"}).
216
- Run it with: reason serve ${T} ${x9(D)}
217
- Or remove it first: reason worker revoke --config ${F}`)}let _=j.lifetime==="persistent"?L1(j,G):null;if(_&&!V.service&&X[c$]!==_.label)return Z.stdout.write(`Machine "${T}" in ${M} already runs as a background service (${_.label}).
218
- Logs: ${_.logs}
219
- Stop it with: reason stop ${T}
220
- `),0;if(V.service&&A&&!_&&await(J.controlWorker??B0)(j,"status")!==null)throw new X0(`Machine "${T}" is already running in ${M}. Stop it first (Ctrl-C, or reason stop ${T}), then run this again.`);let W=j.lifetime==="ephemeral"||!A;if(W&&!C1(T))throw new X0(z6);if(j.executionMode==="confined")Z.stderr.write(`Note: sandboxed machines can't host sessions yet. Drop --sandbox to run sessions here.
221
- `);else if(W&&!V.yes&&!q){let R=`Sessions on "${T}" will run commands in ${M} with your user permissions (no sandbox). Continue?`,I=Boolean(Z.stdin&&Z.stdinIsTty);if(!J.confirm&&!I)throw new X0(`${R.replace(/ Continue\?$/,"")}
222
- Re-run with --yes to confirm.`);if(!await(J.confirm??((f)=>eV(Z,f)))(R))return Z.stderr.write(`Cancelled. Nothing was added.
223
- `),1}if(!A)o(j.stateDirectory,!0),c(F,j);let P={...J.worker,enrollmentInput:ZG(T,q,J,Z)};if(j.lifetime==="persistent"&&!A){Z.stdout.write(`Adding this computer to machine "${T}"\u2026
224
- `);let I=await Q(["enroll","--config",F],{...P,io:{stdout:{write:()=>!0},stderr:Z.stderr}});if(I!==0)return I}if(U){let R;try{R=o2({config:j,launcher:U,path:X.PATH||"/usr/local/bin:/usr/bin:/bin",host:G})}catch(I){if(!(I instanceof E$))throw I;throw new X0(`${I.message}
225
- This computer is added to machine "${T}". Run it in this terminal with: reason serve ${T} ${x9(j)}
226
- Or try the background service again with: reason serve ${T} ${x9(j)} --service`)}return Z.stdout.write([`Reason machine "${T}" runs in the background`,` Folder: ${M}`,` Mode: ${j.executionMode==="host"?"runs with your user permissions":"sandboxed (can't host sessions yet)"}`,` Service: ${R.label} (starts at ${R.lingering?"boot":"login"}, restarts if it fails)`,` Logs: ${R.logs}`,`Start a session with: reason "\u2026" --on ${T}`,`Stop it with: reason stop ${T}`,...R.lingering===!1?["Note: it stops when you log out. To keep it running and start it at boot, run: sudo loginctl enable-linger $USER"]:[],""].join(`
227
- `)),0}Z.stdout.write([`Reason machine "${T}"`,` Folder: ${M}`,` Mode: ${j.executionMode==="host"?"runs with your user permissions":"sandboxed (can't host sessions yet)"}`,` Lifetime: ${j.lifetime==="persistent"?`saved; run \`reason serve ${T}\` again to reconnect`:"this run only (--once)"}`,"Connecting\u2026",""].join(`
228
- `));let C=_&&X[c$]===_.label&&!J.runWorker?r2({stateDirectory:j.stateDirectory}):null;try{return await Q(["start","--config",F],{...P,io:{stdout:Z.stdout,stderr:J3(Z.stderr)},onStartup:(R)=>{if(R==="ready")Z.stdout.write(`Waiting for sessions\u2026 start one with: reason "\u2026" --on ${T}
229
- `);J.worker?.onStartup?.(R)}})}finally{C?.stop()}}catch(V){if(V instanceof X0||V instanceof E$){let H=V instanceof E$&&V.code?` (${V.code})`:"";return Z.stderr.write(`Reason: ${V.message}${H}
230
- `),2}let N=V instanceof Error&&/^worker_[a-z_]+$/.test(V.message)?V.message:null,G=N?Z1(N):void 0;return Z.stderr.write(`Reason: ${N?G?`${G} (${N})`:N:"could not prepare this machine."}
231
- `),1}}var XG=200;var YF=K.strictObject({version:K.literal(1),session_ids:K.array(K.string().min(1).max(200)).max(XG)});function F1($){let J=t($);return J!==null&&Date.parse(J.worker?.expiresAt??"")>Date.now()&&!e($).revoked}import{spawnSync as E6}from"child_process";import{readFileSync as YG,rmdirSync as VG,rmSync as GG}from"fs";import{join as y9}from"path";var BG=["Reason.app","Ara Sidecar.app","Ara Device.app"],KG="sidecar_retire_failed";function UG($){return y9($,"Library","Application Support","Ara","Sidecar")}function NG($){try{let J=YG(y9($,"Contents","Info.plist"),"utf8");return/<key>CFBundleIdentifier<\/key>\s*<string>so\.ara\.sidecar<\/string>/.test(J)}catch{return!1}}function S6($,J={}){let Z=UG($),Q=BG.map((N)=>y9(Z,N)).filter(NG);if(Q.length===0)return{status:"absent"};let X=J.processTable??(()=>E6("/bin/ps",["-xo","pid=,command="],{encoding:"utf8",timeout:5000}).stdout??""),Y=J.signal??((N)=>process.kill(N,"SIGTERM")),V=J.command??((N,G)=>E6(N,[...G],{stdio:"ignore",timeout:1e4}).status??1);try{for(let N of X().split(`
232
- `)){let G=N.trim().match(/^(\d+)\s+(.+)$/);if(!G)continue;if(!Q.some((H)=>G[2].startsWith(`${H}/Contents/MacOS/`)))continue;try{Y(Number(G[1]))}catch{}}for(let N of Q)V(x6,["-u",N]),GG(N,{recursive:!0,force:!0});try{VG(Z)}catch{}}catch{return{status:"failed",code:KG}}return{status:"removed",bundles:Q}}var jG=`Connect this computer to Reason
233
-
234
- Usage:
235
- reason connect Your computer, kept connected in the background
236
- reason connect --to NAME Add it to team machine NAME (as reason serve NAME --service)
237
- reason connect --token rmt_\u2026 Join a machine with no login (as reason serve --token \u2026 --service)
238
- reason connect --once Only while this command runs; nothing is saved
239
- reason connect --api-key KEY Without reason login: a headless box, with an API key that has
240
- devices:write (or set REASON_API_KEY, which keeps it out of ps).
241
- The connection keeps the key to renew itself (macOS: Keychain).
242
- reason disconnect [NAME] Stop and remove it (NAME: this computer's workers for machine NAME);
243
- it stays disconnected until you run reason connect
244
-
245
- Settings, saved; run reason connect again to change them:
246
- --folder PATH Where Sessions may run (yours: your home folder; a machine: the current folder)
247
- --sessions N No longer needed: your computer runs every Session you start
248
- --name NAME This computer's name in Reason (default: its hostname)
249
- --api-url URL The Reason API to connect to (as REASON_API_URL)
250
- --proxy URL Reach Reason through this proxy (HTTPS_PROXY is not used)
251
- --proxy-ca-file PATH The proxy's PEM CA bundle
252
- --user-chrome on|off Your Sessions may use your own Chrome and its signed-in profiles
253
- (macOS, through the Reason extension; on by default)
254
- --cloud-sessions on|off No longer needed: Reason does not read it
255
- --minimal Keep this computer minimal: files, shell and terminal, no desktop,
256
- computer use or browser use (reason desktop install adds them)
257
- --local-logins on|off Your Sessions run on the Claude Code, Codex and Grok logins
258
- on this computer (on by default; off with an API key).
259
- Reason gets each login's current access token, never
260
- its refresh token.
261
-
262
- --keep-awake on|off macOS: keep this Mac awake while it runs Sessions (default on).
263
- Applies at once, without reconnecting.
264
- --add-folder PATH Let Sessions run in another folder too, on the same computer in
265
- --remove-folder PATH Reason; or stop that. Applies at once; running Sessions in other
266
- folders keep running. \`reason status --json\` lists the folders.
267
-
268
- Your computer is Personal: it needs no machine and no admin role, and only you
269
- start Sessions on it until you make it Team in Settings \u203A Computers. They run commands
270
- with your user permissions (there is no sandbox mode). It starts again at login (Linux:
271
- at boot, when lingering is allowed), restarts if it fails, and \`reason update\`
272
- restarts it on the new version. \`reason status\` shows it.
273
-
274
- It is connected in the workspace you signed in to. It is also connected, by
275
- itself, in up to 8 other workspaces you belong to, as each one's own computer,
276
- when this computer was signed in with the setup command Reason shows you (it
277
- ends in --pair CODE, a one-time code from your signed-in Reason) or by the
278
- Reason app, and was connected after that. Signed in with \`reason login\`
279
- alone, or connected with --api-key or --once, it stays in the one workspace:
280
- run the setup command from Reason here, then \`reason disconnect\` and
281
- \`reason connect\` if it was connected before. One sign-in covers one computer;
282
- a second computer needs its own. \`reason status\` says when this applies.
283
-
284
- One computer serves several Reason accounts. Signed in as another account than
285
- the one it is connected for, reason connect connects it for that account too,
286
- as that account's own computer in the workspace it signed in to; the other
287
- accounts stay connected. That account's \`reason logout\` removes only its own.
288
- `,DG=`Disconnect this computer from Reason
289
-
290
- Usage:
291
- reason disconnect Stop your computer's connection and remove it from Reason, in every
292
- workspace and for every Reason account it is connected for. It stays
293
- disconnected (reason "\u2026" won't connect it) until you run reason connect
294
- reason disconnect NAME Stop this computer's workers for machine NAME and remove them from Reason
295
-
296
- --account Only the signed-in account's computer leaves Reason (all of it when it is
297
- the only account here); it stays disconnected for that account until
298
- its reason connect (the Reason app's Disconnect)
299
- --temporary The Reason app's sign-out: only the signed-in account's computer leaves
300
- Reason (all of it when it is the only account here), and it is not kept
301
- disconnected: the next reason "\u2026" connects it again
302
- --yes, -y Accepted for scripts; disconnect never asks
303
- `;class l extends Error{code;constructor($,J="worker_connect_refused"){super($);this.code=J}}var WG=4,X3={write:()=>!0};function g0($,J,Z=!1){let Q=e6($,J,Z);return Q.length===1?Q[0]:F0(v6(F0($,".config")),...o6(J,Z))}var o6=($,J)=>[...$==="production"?[]:[$],J?"connect-once":"connect"];function e6($,J,Z=!1){let Q=$;try{Q=B$($)}catch{}return["ara","reason"].map((X)=>F0(Q,".config",X,...o6(J,Z))).filter(OG)}function OG($){try{if(B$($)!==$)return!1;return R0(F0($,"worker.json"))?.stateDirectory===$}catch{return!1}}var $7="disconnected.json";function iF($,J){return u(F0(g0($,J),$7))}function Y3($,J,Z){let Q=F0(g0($,J),$7);if(!Z){_1(Q,{force:!0});return}o(u9(Q),!0),c(Q,{version:1,disconnected_at:new Date().toISOString()})}function zG($){let J=new Map,Z=new Set;for(let U=0;U<$.length;U+=1){let B=$[U];if(B==="--help"||B==="-h"||B==="help")return null;if(["--to","--token","--folder","--sessions",Z3,Q3,"--keep-awake","--user-chrome","--cloud-sessions","--local-logins","--api-key","--name","--api-url","--add-folder","--remove-folder"].includes(B)){let q=$[U+1];if(!q||q.startsWith("-"))throw new l(`Missing value after ${B}.`);if(J.has(B))throw new l(`${B} may be specified only once.`);J.set(B,q),U+=1;continue}if(["--once","--yes","-y","--minimal"].includes(B)){Z.add(B==="-y"?"--yes":B);continue}if(B.startsWith("-"))throw new l(`Unknown option: ${B}. Run \`reason connect --help\`.`);throw new l(`Unexpected argument: ${B}. To add this computer to a team machine, use --to ${B}.`)}let Q=J.get("--sessions");if(Q!==void 0&&!/^[1-4]$/.test(Q))throw new l("--sessions takes a number from 1 to 4.");if(J.has(Q3)&&!J.has(Z3))throw new l("--proxy-ca-file requires --proxy.");let X=J.get("--keep-awake");if(X!==void 0&&!["on","off"].includes(X))throw new l("--keep-awake takes on or off.");if(X!==void 0&&(J.size>1||[...Z].some((U)=>U!=="--yes")))throw new l("Run reason connect --keep-awake on|off on its own.");let Y=["--add-folder","--remove-folder"].filter((U)=>J.has(U));if(Y.length>0&&(J.size>1||[...Z].some((U)=>U!=="--yes")))throw new l(`Run reason connect ${Y[0]} PATH on its own.`);let V=J.get("--user-chrome");if(V!==void 0&&V!=="on"&&V!=="off")throw new l("--user-chrome takes on or off.");let N=J.get("--cloud-sessions");if(N!==void 0&&N!=="on"&&N!=="off")throw new l("--cloud-sessions takes on or off.");let G=J.get("--local-logins");if(G!==void 0&&G!=="on"&&G!=="off")throw new l("--local-logins takes on or off.");let H=J.get("--name")?.trim();if(H!==void 0&&(H.length===0||H.length>160))throw new l("--name takes a name of 1 to 160 characters.");let M=(U,B)=>B===void 0?{}:{[U]:B};return{...M("to",J.get("--to")),...M("token",J.get("--token")),...M("folder",J.get("--folder")),...M("sessions",Q===void 0?void 0:Number(Q)),...M("keepAwake",X===void 0?void 0:X==="on"),...M("userChrome",V===void 0?void 0:V==="on"),...M("cloudSessions",N===void 0?void 0:N==="on"),...M("localLogins",G===void 0?void 0:G==="on"),once:Z.has("--once"),yes:Z.has("--yes"),minimal:Z.has("--minimal"),...M("proxy",J.get(Z3)),...M("proxyCaFile",J.get(Q3)),...M("apiKey",J.get("--api-key")),...M("name",H),...M("apiUrl",J.get("--api-url")),...M("addFolder",J.get("--add-folder")),...M("removeFolder",J.get("--remove-folder"))}}var x$=($)=>u(d($).state),J7=`Reason: this computer now runs Sessions with your user permissions (its sandbox is gone).
304
- `;function Z7($){return $.executionMode==="host"?"runs with your user permissions":"sandboxed (can't host Sessions yet)"}function Q7($){let{parsed:J,saved:Z}=$,Q=Z?.workspaceRoot??$.home;if(J.folder!==void 0)try{Q=$3($.options.cwd??process.cwd(),J.folder)}catch(N){throw new l(N instanceof Error?N.message:String(N))}if(!O1(Q,$.stateDirectory))throw new l(`${Q} holds Reason's own settings. Pick another folder with --folder.`);let X;try{X=J.apiUrl!==void 0?e1({REASON_API_URL:J.apiUrl},$.channel):Z&&!p1($.environment,"REASON_API_URL")?.trim()?Z.apiOrigin:e1($.environment,$.channel)}catch(N){throw new l(`${J.apiUrl===void 0?"REASON_API_URL":"--api-url"} must be an HTTPS URL (HTTP only on this computer): ${N instanceof Error?N.message:String(N)}`)}if(Z&&X!==Z.apiOrigin&&C0(X,Z.apiOrigin))X=Z.apiOrigin;if(!f6(X)&&!h6($.channel,X))throw new l(`${X} is not the ${$.channel} Reason API this CLI connects to.`+($.channel==="production"?" For staging, use the staging CLI (REASON_CLI_CHANNEL=staging).":""));let Y=Z?.proxy;if(J.proxy!==void 0)try{Y=p6({proxyUrl:J.proxy,caFile:J.proxyCaFile},{home:$.home,statePath:$.stateDirectory})}catch(N){if(!(N instanceof u6))throw N;throw new l(N.message)}let V=(Z?.folders??[]).filter((N)=>N!==Q);return $0.parse({...V.length?{folders:V}:{},version:1,apiOrigin:X,channel:$.channel,stateDirectory:$.stateDirectory,workspaceRoot:Q,lifetime:$.lifetime,executionMode:"host",name:J.name??Z?.name??b9(($.options.hostname??FG)()),slots:J.sessions??Z?.slots??WG,...Y?{proxy:Y}:{},...(J.userChrome??Z?.userChrome)===void 0?{}:{userChrome:J.userChrome??Z?.userChrome},...J.cloudSessions??Z?.cloudSessions?{cloudSessions:!0}:{},...(J.localLogins??Z?.localLogins)===void 0?{}:{localLogins:J.localLogins??Z?.localLogins}})}function X7($,J){if($.localLogins!==void 0||J)return $;return $0.parse({...$,localLogins:!0})}async function d9($,J,Z,Q,X){if(e($).revoked){if(x$($))try{y0($)}catch{}P3($);let N=[];try{N=LG(g($))}catch{}for(let G of N)if(G!=="workspaces")_1(F0(g($),G),{recursive:!0,force:!0})}else if(x$($))y0($);o($.stateDirectory,!0),c(J,$);let Y=AG(Z.stderr),V=await(Q.runWorker??L$)(["enroll","--config",J],{...p9(Q.worker,X),io:{stdout:X3,stderr:Y}});if(V!==0)Z.stderr.write(`Reason: this computer was not connected. (${Y.code()??"worker_command_failed"})
305
- `);return V}function AG($){let J=null;return{write:(Z)=>{for(let Q of Z.matchAll(/^Reason worker: (worker_[a-z_]{1,70})\.$/gm))J=Q[1];return $.write(Z)},code:()=>J}}function $2($,J,Z){let Q=m6(B2(P1("REASON_CLI_CHANNEL",J),$));return Q&&C0(Q.apiOrigin,Z.apiOrigin)?Q.orgId.toLowerCase():null}async function RG($,J,Z,Q){let{config:X,configPath:Y}=N2($,J),V=(H)=>{try{return H!==null&&F1(H)&&t(H)?.orgId.toLowerCase()===J}catch{return!1}},N=null;try{N=R0(Y)}catch{}if(V(N))return 0;Z.stdout.write(`Connecting this computer for your account too, beside the account it is already connected for\u2026
306
- `);let G=await d9(X,Y,Z,Q,void 0);if(G===0&&V(X))return 0;if(G===0&&x$(X))await V3(X,Y,Z,Q);if(_1(X.stateDirectory,{recursive:!0,force:!0}),G!==0)return G;throw new l("Your sign-in changed while this computer was connecting for it. Run reason connect again.","worker_sign_in_changed")}function p9($,J){return J?{...$,enrollmentCredentials:(Z)=>T3(Z,J)}:{...$}}async function l9($,J,Z,Q,X,Y="connect"){if(await c9($,Q,X,Y),Y==="connect"&&!await U7($,Z,Q))return!1;if(!await V3($,J,Z,Q))return!1;return e9($.stateDirectory),_1($.stateDirectory,{recursive:!0,force:!0}),!0}async function V3($,J,Z,Q){if(!x$($)||e($).revoked)return!0;for(let X=1;;X+=1){let Y=X===3;if(await(Q.runWorker??L$)(["revoke","--config",J],{...Q.worker,io:{stdout:X3,stderr:Y?Z.stderr:X3}})===0)return!0;if(Y)return!1;await new Promise((N)=>setTimeout(N,1000))}}async function c9($,J,Z,Q="connect",X=!1){let Y=J.controlWorker??B0,V=async()=>Y($,"status").catch(()=>null),N=await Y($,"stop").catch(()=>null)!==null,G=!X&&e2($,Z,Q);if(N||G){let H=Date.now()+$.shutdownGraceMs+60000;while(Date.now()<H&&await V()!==null)await new Promise((M)=>setTimeout(M,250))}}function s9($,J){return J==="darwin"&&$.userChrome!==!1}function k9($,J,Z){let Q=[...s9($,J)?["your own Chrome profiles"]:[],...$.localLogins?["your Claude Code, Codex and Grok logins"]:[]];return[`\u2713 Connected "${$.name}" \xB7 Sessions run here, ${Z7($).replace(/^runs /,"")}`,...Q.length>0?[` Uses ${Q.join(" and ")} (reason connect --help to change)`]:[],...Z,""].join(`
307
- `)}function h9($,J,Z,Q){return[$,` Name: ${J.name}`,` Folder: ${J.workspaceRoot}`,...(J.folders??[]).map((X)=>` ${X}`)," Sessions: every Session you start",` Mode: ${Z7(J)}`,...J.proxy?[` Proxy: ${d6(J.proxy)}`]:[],...s9(J,Z)?[" Chrome: your own Chrome profiles (--user-chrome off to stop)"]:[],...J.cloudSessions?[" Cloud: your own turns in cloud Sessions may use it (--cloud-sessions on)"]:[],...J.localLogins?[" Logins: your Claude Code, Codex and Grok logins here serve your Sessions (--local-logins off to stop)"]:[],...Q,""].join(`
308
- `)}async function b6($,J,Z){let{io:Q,options:X}=Z;if(e6(Z.home,Z.channel).length===2)Q.stderr.write(`${JSON.stringify({event:"worker.connection_bound_twice",chosen:u9(J),timestamp:new Date().toISOString()})}
309
- `);let Y=F2(F0(Z.home,".config"));if(Y.problem)Q.stderr.write(`${JSON.stringify({event:"worker.config_rename",code:Y.problem,timestamp:new Date().toISOString()})}
310
- `);W9(Z.home,Z.host.platform);let V=b4({home:Z.home,channel:Z.channel,saved:$,configPath:J,log:(q)=>Q.stderr.write(`${q}
311
- `),host:Z.host}),N=A4({...V,log:(q)=>Q.stderr.write(`${q}
312
- `)}),{configPath:G}=N,H=N.saved;if(!H)return Q.stderr.write("Reason: this computer has no saved connection. Run `reason connect`.\n"),0;let M=(q,T)=>{let L=B3(Z.home,Z.channel),F;try{let O=null;try{O=T.keep?null:t(H)?.orgId.toLowerCase()??null}catch{}if(F=q2(H,{prefer:$2(Z.home,Z.channel,H),...T}),F&&O)H2(F,O)}finally{L()}if(!F)return!1;H=F;let D="";try{D=` (workspace ${t(F)?.orgId??"unknown"})`}catch{}return Q.stderr.write(`Reason: ${q}; this computer goes on running Sessions for its other Reason account${D}.
313
- `),!0};if(e(H).revoked&&!M("this computer's connection was removed from Reason",{keep:!1}))return Q.stderr.write("Reason: this computer was removed from Reason. Run `reason connect` to connect it again.\n"),0;if(H.executionMode==="confined"||!F1(H)){let q=p0(H.stateDirectory)??void 0,T=q?null:$2(Z.home,Z.channel,H);if(!q&&!(T&&I1(H,T)))M("this computer's connection expired and its account is not signed in here",{keep:!0,live:!0})}let U=H.executionMode==="confined";if(U||!F1(H)){let q=p0(H.stateDirectory)??void 0;if(Q.stderr.write(U?J7:`Reason: this computer's connection expired; renewing it with ${q?"its API key":"your login"}\u2026
314
- `),await d9($0.parse({...H,executionMode:"host"}),G,Q,X,q)!==0)return Q.stderr.write(q?"Reason: could not renew this computer's connection. Run `reason connect --api-key KEY` with a valid key.\n":"Reason: could not renew this computer's connection. Run `reason login`, then `reason connect`.\n"),0}let B=new AbortController;if(!X.runWorker)import("./ask-relay-4kwcx2b7.js").then(({runBackgroundAskRelay:q})=>q(B.signal,(T)=>Q.stderr.write(`${T}
315
- `))).catch(()=>{});try{for(;;){let q=p0(H.stateDirectory)===null?{ownerWorkspaces:X.worker?.ownerWorkspaces??{}}:{},T=X.runWorker?null:r2({stateDirectory:H.stateDirectory}),L=!1,F;try{F=await(X.runWorker??L$)(["start","--config",G],{deferOptionalLanes:!0,...X.worker,...q,ownComputer:!0,io:{stdout:Q.stdout,stderr:Q.stderr},onDeviceRevoked:()=>{L=!0}})}finally{T?.stop()}if(!L)return F;if(!M("this computer's connection was removed from Reason",{keep:!1}))break}return Y3(Z.home,Z.channel,!0),Q.stderr.write("Reason: this computer was removed from Reason. Run `reason connect` to connect it again.\n"),0}finally{B.abort()}}async function PG($,J,Z){let{io:Q,options:X,home:Y,channel:V,environment:N}=Z;if(J&&await(X.controlWorker??B0)(J,"status").catch(()=>null))throw new l("This computer is already connected in the background (see `reason status`). Run `reason disconnect` first to connect it only while a command runs.");let G=g0(Y,V,!0),H=Q7({parsed:$,saved:J,stateDirectory:G,lifetime:"ephemeral",home:Y,channel:V,options:X,environment:N}),M=X7(H,Z.apiKey??(J?p0(J.stateDirectory)??void 0:void 0)),U=F0(G,"worker.json");return o(G,!0),c(U,M),Q.stdout.write(h9(`Reason: connecting "${M.name}" while this command runs`,M,Z.host.platform,["Connecting\u2026"])),(X.runWorker??L$)(["start","--config",U],{...p9(X.worker,Z.apiKey),ownComputer:!0,io:{stdout:Q.stdout,stderr:J3(Q.stderr)},onStartup:(B)=>{if(B==="ready")Q.stdout.write(`Connected. Start Sessions on "${M.name}" from Reason. Press Ctrl-C to stop.
316
- `);X.worker?.onStartup?.(B)}})}function IG($,J,Z,Q){if(Z.platform!=="darwin")throw new l("--keep-awake is for macOS.");if(!J)throw new l("This computer is not connected to Reason. Run reason connect first.");o(g(J),!0),h4(d(J).daemon,$);let X=_2(d(J).daemon)==="battery_and_ac";return Q.stdout.write(`Keep awake: ${X?"on (this Mac stays awake while it runs Sessions)":"off"}
317
- `),0}var CG=K.object({root:K.object({id:K.string().min(1).max(160),label:K.string().max(160),path_fingerprint:K.string()})});async function Y7($,J,Z,Q){let X=await(p9(Q.worker,Z).enrollmentCredentials??z$)($,O$($));if(!X)throw Error("worker_session_login_required");if(!X.scopes.includes("devices:write"))throw Error("worker_devices_write_scope_required");let Y=Q.folderApi?.(X)??new C$(X,{credentialsPath:O$($),fetchImpl:b0($.proxy)}),V=(N)=>N instanceof v0&&N.status===404&&!["device_not_found","root_not_found"].includes(N.code);return{add:async(N)=>{let G=H4($,N,{...J.roots[0].permissions,expose_mcp:!1}),H=await Y.addDeviceRoot(J.deviceId,{path_fingerprint:G.pathFingerprint,label:G.label,permissions:{...G.permissions,expose_mcp:!1}}).catch((U)=>{if(V(U))throw Error("worker_folders_unavailable");if(U instanceof v0&&U.code==="root_limit_reached")throw new l("This computer already has the most folders Reason allows (32).");throw U}),M=CG.parse(H).root;if(M.path_fingerprint!==G.pathFingerprint)throw Error("worker_enrollment_receipt_mismatch");return{...G,id:M.id,label:M.label}},remove:async(N)=>{await Y.removeDeviceRoot(J.deviceId,N).catch((G)=>{if(V(G))throw Error("worker_folders_unavailable");if(!(G instanceof v0&&G.code==="root_not_found"))throw G})}}}function V7($,J,Z){h0({...J,roots:Z,handsSlots:$.slots,worker:{...J.worker,configDigest:K0($)}},d($).state,{proofStore:T0($)})}async function G7($,J,Z,Q){let{io:X,options:Y,host:V}=Q,N=J&&!Q.apiKey&&p0(J.stateDirectory)===null?$2(Q.home,Q.channel,J):null,G=J&&N&&x$(J)&&!I1(J,N)?k0(J).find((R)=>R.account&&R.organizationId===N)??null:void 0;if(G===null)throw new l("This computer is not connected for your account. Run reason connect first.");let H=G?G.config:J,M=G?G.configPath:Z,U=H&&x$(H)&&!e(H).revoked?t(H):null;if(!J||!H||!U||H.lifetime!=="persistent")throw new l("This computer is not connected to Reason. Run reason connect first.");let B=$.addFolder!==void 0,q=B?$.addFolder:$.removeFolder,T=Y.cwd??process.cwd(),L;try{L=$3(T,q)}catch(R){if(B)throw new l(R instanceof Error?R.message:String(R));L=_G(T,q)}if(L===H.workspaceRoot)throw new l(`${L} is this computer's main folder. To use another one, run reason connect --folder PATH.`);let F=H.folders??[],D=U.roots.slice(1).find((R)=>R.path===L);if(!B&&!D&&!F.includes(L))throw new l(`${L} is not one of this computer's folders.`);if(B&&!O1(L,H.stateDirectory))throw new l(`${L} holds Reason's own settings.`);if(B&&!D&&F.length>=31)throw new l("This computer already has the most folders Reason allows (32).");let O=Q.apiKey??p0(H.stateDirectory)??void 0,j=await Y7(H,U,O,Y),A=U.roots.filter((R)=>R.path!==L);if(B)A=[...A,await j.add(L)];else if(D)await j.remove(D.id);V7(H,U,A);let _=B?[...F.filter((R)=>R!==L),L]:F.filter((R)=>R!==L),{folders:W,...P}=H;if(c(M,$0.parse({...P,..._.length?{folders:_}:{}})),!await(Y.controlWorker??B0)(J,"reload_roots").then(()=>!0,()=>!1))G$(J,V,"connect");return X.stdout.write(B?`Added ${L}. Sessions on "${H.name}" may run in it.
318
- `:`Removed ${L}. Sessions on "${H.name}" no longer run in it.
319
- `),0}async function nF($,J,Z){let Q=f9(Z),X=B3(Q.home,Q.channel);try{let Y=F0(g0(Q.home,Q.channel),"worker.json");return await G7({once:!1,yes:J,addFolder:$},R0(Y),Y,Q)===0}finally{X()}}function f9($,J){let Z=B$($.home??N0()),Q=$.env??process.env;return{io:$.io??G3(),options:$,home:Z,channel:$.channel??Y$(),environment:Q,apiKey:J??g6(Q),host:$.serviceHost??V$(Z)}}async function EG($,J,Z,Q){let X=t($),Y=X.roots;if(J.workspaceRoot!==$.workspaceRoot){let V=await Y7($,X,Z,Q),N=Y.find((G)=>G.path===J.workspaceRoot)??await V.add(J.workspaceRoot);await V.remove(Y[0].id),Y=[N,...Y.slice(1).filter((G)=>G.id!==N.id)]}V7(J,X,Y)}var B7=Symbol("serve here");async function xG($,J,Z,Q){let{io:X,options:Y,home:V,channel:N,environment:G,host:H}=Q;if(H.platform==="darwin"){let E=S6(V);if(E.status==="failed")X.stderr.write(`Reason: could not remove the retired Reason Device helper (${E.code}).
320
- `)}let M=J&&!Q.apiKey&&p0(J.stateDirectory)===null?$2(V,N,J):null,U=J&&M&&e(J).revoked&&k0(J).some((E)=>E.account&&E.organizationId===M)?q2(J,{prefer:M,keep:!1})??J:J,B=Q7({parsed:$,saved:U,stateDirectory:g0(V,N),lifetime:"persistent",home:V,channel:N,options:Y,environment:G});if(Y3(V,N,!1),U?.executionMode==="confined")X.stdout.write(J7);let q=U?p0(U.stateDirectory):null,T=X7(B,Q.apiKey??q??void 0),L=T1(H,G),F=U!==null&&x$(U),D=F&&K0(U)===K0(T),O=D&&F1(T),j=U?.userChrome!==!1===(T.userChrome!==!1)&&U?.cloudSessions===T.cloudSessions&&U?.localLogins===T.localLogins,A=Q.apiKey??q??void 0,_=M!==null&&F&&!e(U).revoked&&!I1(U,M);if(_){if(!D||!j||JSON.stringify(U.proxy)!==JSON.stringify(T.proxy))throw new l("This computer is also connected for another Reason account, whose settings it keeps. Run reason connect without settings to connect it for your account with them, or change them signed in as that account.","worker_other_account_settings");let E=await RG(U,M,X,Y);if(E!==0)return E}let W=_?[` Account: yours too, in workspace ${M}, beside this computer's other Reason account`]:[],P=async()=>{if($.apiKey===void 0||$.apiKey===q)return;await T3(T,$.apiKey),M3(T.stateDirectory,$.apiKey)},C=G.PATH||"/usr/local/bin:/usr/bin:/bin",R=O&&JSON.stringify(U?.proxy)===JSON.stringify(T.proxy)&&j?L1(T,H,"connect"):null,I=R?.label===c6(T.channel),f=I?await(Y.controlWorker??B0)(T,"status").catch(()=>null):null,S=f!==null,h=I&&!S&&g9(R,H)&&i6({config:T,launcher:L,path:C,host:H,kind:"connect"});if((S||h)&&[null,r].includes(E1(T))){await P();let E=a6(T,H,"connect");if(E==="retired"){let z=h?null:await(Y.controlWorker??B0)(T,"status").catch(()=>null);if(!h&&(!z||z.phase==="stopping"))G$(T,H,"connect")}else if(E==="current_not_running")G$(T,H,"connect");else if(H.platform==="win32"&&f&&(f.capabilityReadiness?.["exec.run"]===!1||f.supportedOperations?.includes("exec.run")===!1)&&kG())G$(T,H,"connect");return await(Y.controlWorker??B0)(T,"reload_roots").catch(()=>null),X.stdout.write(G.REASON_INSTALLER==="1"?k9(T,H.platform,W):h9("This computer is connected to Reason",T,H.platform,[...W,...h?[" Worker: running, not answering yet (starting or busy); reason status shows when it is online"]:[],"Change a setting with reason connect --folder; remove it with reason disconnect."])),0}let p=!O&&!_;if(F&&!D)if(U.apiOrigin!==T.apiOrigin||U.name!==T.name){if(X.stdout.write(`Reconnecting this computer with its new settings\u2026
321
- `),!await l9(U,Z,X,Y,H))throw new l("Could not remove this computer's previous connection from Reason. Check your network and try again.","worker_previous_connection_not_removed")}else if(U.executionMode==="host"&&F1(U))X.stdout.write(`Applying the new settings to this computer\u2026
322
- `),await EG(U,T,A,Y),p=!1;else await c9(U,Y,H);if(p){if(G.REASON_INSTALLER!=="1")X.stdout.write(`Connecting this computer to Reason\u2026
323
- `);let E=await d9(T,Z,X,Y,A);if(E!==0)return E;if(A)M3(T.stateDirectory,A)}else c(Z,T),await P();let b;try{b=o2({config:T,launcher:L,path:C,host:H,kind:"connect"})}catch(E){if(!(E instanceof E$))throw E;if(E.code!=="worker_service_manager_missing")throw new l(`${E.message}
324
- This computer is set up; run reason connect again to start it.`,E.code??"worker_service_start_failed");if(Y.serveHere&&G.REASON_INSTALLER!=="1")return X.stdout.write(`No background service here; running in this terminal (Ctrl-C stops it).
325
- `),B7;if(Y.serveHere&&G.REASON_INSTALLER==="1"&&await SG(T,L,G,Y))return X.stdout.write(k9(T,H.platform,[` No service manager here: it runs until this computer restarts (keep it with ${L} connect under a process manager)`])),0;throw new E$(`${E.message}
326
- This computer is set up. Keep it connected by running ${L} connect in a terminal or under this box's process manager.`,E.code)}let x=[...W,...b.lingering===!1?["Note: it stops when you log out. To keep it running and start it at boot, run: sudo loginctl enable-linger $USER"]:[],...b.identityProblem?[`Note: Full Disk Access you grant it lasts until the next update (${b.identityProblem}).`]:[]];return X.stdout.write(G.REASON_INSTALLER==="1"?k9(T,H.platform,x):h9("This computer is connected to Reason",T,H.platform,[` Service: ${b.label} (starts at ${b.lingering?"boot":"login"}, restarts if it fails)`,` Logs: ${b.logs}`,`Start Sessions on "${T.name}" from Reason. Remove it with: reason disconnect`,...x])),0}async function SG($,J,Z,Q){let{REASON_INSTALLER:X,...Y}=Z;(Q.startConnection??K7)(J,Y,F0($.stateDirectory,"connect.log"));for(let V=0;V<60;V+=1)if(await new Promise((N)=>setTimeout(N,500)),await(Q.controlWorker??B0)($,"status").catch(()=>null))return!0;return!1}function K7($,J,Z){let Q=t6(Z,"a",384);try{let X=n6($,["connect"],{detached:!0,stdio:["ignore",Q,Q],env:J});X.on("error",()=>{return}),X.unref()}finally{r6(Q)}}async function U7($,J,Z,Q=!1){let X=!0;for(let Y of k0($)){if(Q&&Y.account)continue;if(Y.config&&x$(Y.config)&&!e(Y.config).revoked){if(await(Z.runWorker??L$)(["revoke","--config",Y.configPath],{...Z.worker,io:{stdout:X3,stderr:J.stderr}})!==0){X=!1;continue}}_1(Y.directory,{recursive:!0,force:!0})}return X}function G3(){return{stdout:process.stdout,stderr:process.stderr,stdin:process.stdin,stdinIsTty:Boolean(process.stdin.isTTY),stdoutIsTty:Boolean(process.stdout.isTTY)}}function a9($,J){if($ instanceof l||$ instanceof E$)return J.stderr.write(`Reason: ${$.message} (${$.code??"worker_service_failed"})
327
- `),2;let Z=$ instanceof Error&&/^worker_[a-z_]+$/.test($.message)?$.message:wG($);return J.stderr.write(`Reason: ${Z1(Z)??"could not connect this computer."} (${Z})
328
- `),1}var bG=new Set(["EACCES","EPERM","ENOENT","ENOSPC","EROFS","ENOTDIR","EEXIST","ELOOP"]);function wG($){if($ instanceof v0)return $.status>=500?"worker_api_unavailable":"worker_api_refused";let J=$?.code;if(typeof J==="string"&&bG.has(J))return`worker_file_${J.toLowerCase()}`;return"worker_connect_unexpected"}function w6($,J){if($.minimal){H7({home:J.home});return}if($.once||J.options.desktop===!1||!J.io.stdinIsTty||q7({home:J.home})!=="install")return;let Z;try{Z=T1(J.host,J.environment)}catch{return}if(J.host.platform==="darwin"){let X=F0(J.home,".local","share","reason","desktop-install.log");(J.options.installDesktop??y6)(Z,J.environment,{log:X}),J.io.stdout.write(`Desktop and browser use install in the background (reason desktop status; log ${X}).
329
- `);return}J.io.stdout.write(`Installing desktop components first (reason connect --minimal skips them)\u2026
330
- `);let Q=(J.options.installDesktop??y6)(Z,J.environment,null);if(Q!==0&&Q!==3)J.io.stderr.write(`Reason: desktop components did not install; connecting without them. Retry with reason desktop install. (desktop_install_failed)
331
- `)}function yG($){if($.host.platform!=="win32"||!$.io.stdinIsTty)return;v9();let J=m9();if(!MG(J)||k1(J))return;$.io.stdout.write(`Setting up the Windows sandbox for confined commands; approve the Windows prompt\u2026
332
- `);let Z=l6(J);if(Z!=="installed")$.io.stderr.write(`Reason: the Windows sandbox was not set up (${Z==="cancelled"?"prompt declined":"install failed"}); connecting without confined commands. Run reason connect again to retry. (windows_sandbox_unavailable)
333
- `)}function kG(){if(Y1()===null)return!1;return v9(),k1(m9())}function y6($,J,Z){if(!Z){let X=()=>qG($,["desktop","install"],{env:J,stdio:"inherit"}).status??1,Y=X();return Y===3221225477?X():Y}TG(u9(Z.log),{recursive:!0,mode:448});let Q=t6(Z.log,"w",384);try{let X=n6($,["desktop","install"],{detached:!0,stdio:["ignore",Q,Q],env:{...J,REASON_DESKTOP_BACKGROUND:"1"}});X.on("error",()=>{return}),X.unref()}finally{r6(Q)}return 0}async function rF($,J={}){let Z=J.io??G3();try{let Q=zG($);if(!Q)return Z.stdout.write(jG),0;if(Q.to!==void 0||Q.token!==void 0){if(Q.sessions!==void 0)throw new l("A machine's workers run one Session at a time; --sessions does not apply to them.");if(Q.proxy!==void 0)throw new l("--proxy is for your own computer; a machine's workers don't take it yet.");if(Q.userChrome!==void 0)throw new l("A machine serves every member of the workspace; --user-chrome is for your own computer.");if(Q.cloudSessions!==void 0)throw new l("A machine serves every member of the workspace; --cloud-sessions is for your own computer.");if(Q.localLogins!==void 0)throw new l("A machine serves every member of the workspace; --local-logins is for your own computer.");for(let[H,M]of[["--api-key",Q.apiKey],["--name",Q.name],["--api-url",Q.apiUrl]])if(M!==void 0)throw new l(`${H} is for your own computer; reason serve sets up a machine's workers.`);return w6(Q,f9(J)),await(J.runServe??C6)([...Q.to===void 0?[]:[Q.to],...Q.token===void 0?[]:["--token",Q.token],...Q.folder===void 0?[]:["--dir",Q.folder],...Q.yes?["--yes"]:[],Q.once?"--once":"--service"],{io:Z,...J.cwd?{cwd:J.cwd}:{},...J.home?{home:J.home}:{},...J.channel?{channel:J.channel}:{},...J.env?{env:J.env}:{},...J.serviceHost?{serviceHost:J.serviceHost}:{},...J.worker?{worker:J.worker}:{}})}let X=f9(J,Q.apiKey),{channel:Y,environment:V}=X;if(!J.env)for(let H of["REASON_API_KEY","ARA_API_KEY"])delete process.env[H];if(Q.userChrome&&X.host.platform!=="darwin")throw new l("--user-chrome is for a Mac.");let N=s6(V[c$],Y),G=N||Q.once?()=>{return}:B3(X.home,Y);try{let H=F0(g0(X.home,Y),"worker.json"),M=R0(H);if(N)return await b6(M,H,X);if(Q.keepAwake!==void 0)return IG(Q.keepAwake,M,X.host,Z);if(Q.addFolder!==void 0||Q.removeFolder!==void 0)return await G7(Q,M,H,X);if(w6(Q,X),yG(X),Q.once)return await PG(Q,M,X);let U=await xG(Q,M,H,X);if(U!==B7)return U;return G(),G=()=>{return},await b6(R0(H),H,X)}finally{G()}}catch(Q){return a9(Q,Z)}}async function tF($,J={}){let Z=J.io??G3();try{if($.some((V)=>["--help","-h","help"].includes(V)))return Z.stdout.write(DG),0;let Q=$.filter((V)=>!["--yes","-y","--temporary","--account"].includes(V)),X=$.includes("--temporary"),Y=$.includes("--account");if(Q.length>1||Q[0]?.startsWith("-")||(X||Y)&&Q.length>0||X&&Y)throw new l("Usage: reason disconnect [NAME] [--yes] (--temporary or --account only without NAME)");if(Q[0]!==void 0)return await vG(Q[0],Z,J);return await N7(Z,J,X?"temporary":Y?"account":"disconnect")}catch(Q){return a9(Q,Z)}}async function oF($={}){let J=$.io??G3();try{return await N7(J,$,"logout")}catch(Z){return a9(Z,J)}}async function N7($,J,Z){let Q=B$(J.home??N0()),X=J.channel??Y$(),Y=B3(Q,X);try{return await hG($,J,Z,Q,X)}finally{Y()}}function B3($,J){let Z=g0($,J),Q=u(Z)?$1():null;if(!Q)return()=>{return};for(let X=0;X<300;X+=1){let Y=Q.lock(Z);if(Y)return Y;Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,50)}throw new l("This computer's connection is busy; try again in a moment.","worker_connection_busy")}async function hG($,J,Z,Q,X){let Y=F0(g0(Q,X),"worker.json"),V=R0(Y);if(!V){if(Z==="disconnect")Y3(Q,X,!0);if(Z!=="logout")$.stdout.write(`This computer is not connected to Reason.
334
- `);return 0}if(Z!=="disconnect"){let G=await fG(V,Y,$,J,Z,Q,X);if(G!==null)return G}let N=!1;try{N=await l9(V,Y,$,J,J.serviceHost??V$(Q))}finally{if(Z!=="temporary")Y3(Q,X,!0)}if(!N)return $.stderr.write(`Reason: this computer stopped, but Reason could not be reached to remove it. Run reason disconnect again.
335
- `),1;return $.stdout.write(`Disconnected "${V.name}". It no longer runs Sessions; run reason connect to connect it again.
336
- `),0}async function fG($,J,Z,Q,X,Y,V){let N=k0($).filter((F)=>F.account);if(N.length===0)return null;let G=$2(Y,V,$),H=Q.controlWorker??B0,M=N.find((F)=>F.organizationId===G);if(M){if(M.config&&!await V3(M.config,M.configPath,Z,Q))return Z.stderr.write(`Reason: Reason could not be reached to remove your account's Device from this computer. Try again.
337
- `),1;if(X!=="account"||!M.config)_1(M.directory,{recursive:!0,force:!0});return await H($,"reload_roots").catch(()=>null),Z.stdout.write(`Disconnected this computer from workspace ${G} for your account. It stays connected for its other Reason accounts.
338
- `),0}if(!G&&X==="account")throw new l("Reason is signed out here, so which account to disconnect is unknown. Sign in as it, or run reason disconnect to disconnect every account.");if(!G||!I1($,G)){if(X==="account"&&G)H2($,G);if(X!=="logout")Z.stdout.write(`This computer stays connected for its other Reason accounts; it was not connected for yours.
339
- `);return 0}let U=Q.serviceHost??V$(Y),B=null;try{B=t($)?.orgId.toLowerCase()??null}catch{}if(await c9($,Q,U,"connect",!0),!await U7($,Z,Q,!0)||!await V3($,J,Z,Q))return G$($,U,"connect"),Z.stderr.write(`Reason: Reason could not be reached to remove your account's Devices from this computer. Try again.
340
- `),1;let q=q2($,{prefer:null,keep:!1});if(!q)return null;if(X==="account"&&B)H2(q,B);let T=G$(q,U,"connect")!==null,L="";try{L=` in workspace ${t(q)?.orgId??""}`}catch{}return Z.stdout.write(`Disconnected this computer for your account. It stays connected for its other Reason account${L}${T?"":"; run reason connect to start it again"}.
341
- `),0}async function vG($,J,Z){let Q=B$(Z.home??N0()),X=Z.serviceHost??V$(Q),Y=w9(Q,$);if(Y.length===0)throw new l(`No worker for machine "${$}" on this computer.`);let V=!1;for(let N of Y)if(await l9(N.config,N.path,J,Z,X,"serve"))J.stdout.write(`Disconnected machine "${$}" in ${N.config.workspaceRoot}.
342
- `);else V=!0,J.stderr.write(`Reason: machine "${$}" in ${N.config.workspaceRoot} stopped, but Reason could not be reached to remove it. Run reason disconnect ${$} again.
343
- `);return V?1:0}async function eF($={}){let J=B$($.home??N0()),Z=R0(F0(g0(J,$.channel??Y$()),"worker.json"));if(!Z)return null;let Q,X=await($.controlWorker??B0)(Z,"status").catch((q)=>{return Q=q instanceof Error?q:Error(String(q)),null}),Y=X?E1(Z):null,V=$.serviceHost??V$(J),N=L1(Z,V,"connect"),G=e(Z).revoked,H=!G&&!X,M=(()=>{try{return t(Z)}catch{return null}})(),{workspaces:U,off:B}=G||p0(Z.stateDirectory)!==null?{workspaces:null,off:null}:D4(Z,X?.phase==="running");return{workspaces:U,workspaces_off:B,workspaces_max:K2+(U?.filter((q)=>q.account).length??0),name:Z.name,device_id:M?.deviceId??null,organization_id:M?.orgId??null,folder:Z.workspaceRoot,mode:Z.executionMode,sessions_max:null,user_chrome:s9(Z,V.platform),cloud_sessions:Z.cloudSessions===!0,root:M?.roots[0]?{id:M.roots[0].id,permissions:M.roots[0].permissions}:null,roots:M?.roots.map((q)=>({id:q.id,folder:q.path,permissions:q.permissions}))??[],state:G?"removed":X?X.phase==="running"?"connected":X.phase:"not_running",not_running_reason:H?s4(Z,Q):null,worker_alive:H&&N?g9(N,V):null,sessions_running:X?.activeSessions??null,version:Y,service:N?{label:N.label,logs:N.logs}:null}}async function $_($,J,Z=B0){let Q={version:1,status:"unavailable"},X=R0(F0(g0(B$($),J==="stable"?"production":"staging"),"worker.json")),Y=X?await Z(X,"status").catch(()=>null):null;return X&&Y?.phase==="running"?k6({version:1,status:"connected",deviceId:Y.deviceId,apiOrigin:X.apiOrigin,managedRootIds:[]})??Q:Q}function J_($={}){try{let J=B$($.home??N0());return R0(F0(g0(J,$.channel??Y$()),"worker.json"))?.userChrome!==!1}catch{return!1}}function Z_($={}){let J=B$($.home??N0()),Z=R0(F0(g0(J,$.channel??Y$()),"worker.json"));if(!Z)return null;return G$(Z,$.serviceHost??V$(J),"connect")?.label??null}async function Q_($={}){let J=B$($.home??N0()),Z=R0(F0(g0(J,$.channel??Y$()),"worker.json"));if(!Z)return null;let Q=$.serviceHost??V$(J),X=await I6(Z,Q,"connect",$.current);if(X!==null||L1(Z,Q,"connect"))return X;return mG(Z,Q,$)}async function mG($,J,Z){let Q=Z.controlWorker??B0,X=await Q($,"status").catch(()=>null);if(!X)return null;if(Z.current!==void 0&&E1($)===Z.current)return{state:"current"};let Y=X.activeSessions??X.activeClaims;if(Y!==0)return{state:"busy",sessions:Y,waitedMs:0};let V;try{V=T1(J,Z.env??process.env)}catch{return null}await Q($,"stop").catch(()=>null);let N=Date.now()+$.shutdownGraceMs+60000;while(Date.now()<N&&await Q($,"status").catch(()=>null)!==null)await new Promise((U)=>setTimeout(U,250));let{REASON_INSTALLER:G,REASON_DESKTOP_BACKGROUND:H,...M}=Z.env??process.env;return(Z.startConnection??K7)(V,M,F0($.stateDirectory,"connect.log")),{state:"restarted"}}
344
- export{d as h,t as i,_2 as j,R0 as k,jG as l,DG as m,g0 as n,iF as o,nF as p,rF as q,tF as r,oF as s,eF as t,$_ as u,J_ as v,Z_ as w,Q_ as x};