@reason-machines/cli-linux-arm64-musl 0.2.380 → 0.2.382

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 (111) hide show
  1. package/README.md +3 -1
  2. package/bin/ara +2 -2
  3. package/bin/vm-hands/api-credentials-xppmbg0m.js +2 -0
  4. package/bin/vm-hands/api-xmpbsm6b.js +2 -0
  5. package/bin/vm-hands/{ask-relay-9pm7kj1s.js → ask-relay-zjqyxvxe.js} +3 -3
  6. package/bin/vm-hands/connect-cli-ehxeg8m5.js +2 -0
  7. package/bin/vm-hands/{custom-endpoint-device-zhpake9f.js → custom-endpoint-device-bm94e9r0.js} +1 -1
  8. package/bin/vm-hands/desktop-account-3tnm4z5w.js +2 -0
  9. package/bin/vm-hands/{device-workspace-vbcry9d6.js → device-workspace-0xsj5ykf.js} +1 -1
  10. package/bin/vm-hands/hands-worker-source-azdrrhsz.js +2 -0
  11. package/bin/vm-hands/{index-bbk6a9sk.js → index-7f2kwwen.js} +1 -1
  12. package/bin/vm-hands/{install-receipt-7x81ek76.js → install-receipt-3xyx3rdd.js} +1 -1
  13. package/bin/vm-hands/local-automation-ynx1qr9v.js +2 -0
  14. package/bin/vm-hands/local-capabilities-855ch0dq.js +2 -0
  15. package/bin/vm-hands/local-desktop-users-ajb81vjm.js +2 -0
  16. package/bin/vm-hands/local-display-mac-9h6btvvq.js +2 -0
  17. package/bin/vm-hands/local-display-session-f9ywkbba.js +2 -0
  18. package/bin/vm-hands/local-pty-session-cjas515w.js +2 -0
  19. package/bin/vm-hands/managed-runtime-dars4628.js +2 -0
  20. package/bin/vm-hands/{network-contract-zqvt1v0t.js → network-contract-dsw79qkc.js} +1 -1
  21. package/bin/vm-hands/package-smk3nqjs.js +2 -0
  22. package/bin/vm-hands/permissions-pdmhp2s3.js +2 -0
  23. package/bin/vm-hands/{reason-hands-protocol-8fxjynte.js → reason-hands-protocol-7d7xj1h3.js} +1 -1
  24. package/bin/vm-hands/serve-service-n6xd6323.js +2 -0
  25. package/bin/vm-hands/status-2m75kz1h.js +96 -0
  26. package/bin/vm-hands/version-74zqccyz.js +2 -0
  27. package/bin/vm-hands/vm-hands-entry-lite-06qnb2w1.js +458 -0
  28. package/bin/vm-hands/{vm-hands-entry-lite-7shpbsw8.js → vm-hands-entry-lite-1gxktkpe.js} +2 -2
  29. package/bin/vm-hands/{vm-hands-entry-lite-wf1ek4f0.js → vm-hands-entry-lite-23bb8ce4.js} +2 -2
  30. package/bin/vm-hands/vm-hands-entry-lite-245929bs.js +346 -0
  31. package/bin/vm-hands/vm-hands-entry-lite-2e18tm6w.js +245 -0
  32. package/bin/vm-hands/{vm-hands-entry-lite-g036gtem.js → vm-hands-entry-lite-2t0vcvd8.js} +1 -1
  33. package/bin/vm-hands/{vm-hands-entry-lite-8yy5ttfw.js → vm-hands-entry-lite-2tcjqgfp.js} +3 -3
  34. package/bin/vm-hands/vm-hands-entry-lite-3n3xh0xv.js +540 -0
  35. package/bin/vm-hands/vm-hands-entry-lite-50n6vbfx.js +251 -0
  36. package/bin/vm-hands/{vm-hands-entry-lite-j2q1k9vb.js → vm-hands-entry-lite-51hmj6am.js} +1 -1
  37. package/bin/vm-hands/{vm-hands-entry-lite-zfwg7ehq.js → vm-hands-entry-lite-5n4vsm6b.js} +2 -2
  38. package/bin/vm-hands/vm-hands-entry-lite-8fj07njx.js +3 -0
  39. package/bin/vm-hands/{vm-hands-entry-lite-r8twmzjc.js → vm-hands-entry-lite-8zawqa9q.js} +2 -2
  40. package/bin/vm-hands/{vm-hands-entry-lite-3hbe4em3.js → vm-hands-entry-lite-9cmfthkq.js} +1 -1
  41. package/bin/vm-hands/{vm-hands-entry-lite-45j8qwsf.js → vm-hands-entry-lite-9w5vs9zv.js} +1 -1
  42. package/bin/vm-hands/{vm-hands-entry-lite-qyzgxd9g.js → vm-hands-entry-lite-aj1ccphg.js} +2 -2
  43. package/bin/vm-hands/{vm-hands-entry-lite-za55dtte.js → vm-hands-entry-lite-ammr3xbc.js} +2 -2
  44. package/bin/vm-hands/{vm-hands-entry-lite-de2rkr5h.js → vm-hands-entry-lite-ch7y4b1b.js} +1 -1
  45. package/bin/vm-hands/{vm-hands-entry-lite-439yqbn5.js → vm-hands-entry-lite-cwe16c51.js} +174 -16
  46. package/bin/vm-hands/vm-hands-entry-lite-dh5gwmyf.js +3 -0
  47. package/bin/vm-hands/vm-hands-entry-lite-dsdwzasy.js +105 -0
  48. package/bin/vm-hands/{vm-hands-entry-lite-5pm6bhb8.js → vm-hands-entry-lite-e0gdt6r5.js} +1 -1
  49. package/bin/vm-hands/{vm-hands-entry-lite-5kgvss4p.js → vm-hands-entry-lite-e2mjbqmr.js} +2 -2
  50. package/bin/vm-hands/vm-hands-entry-lite-ejm5er3h.js +7 -0
  51. package/bin/vm-hands/{vm-hands-entry-lite-mh0xecf3.js → vm-hands-entry-lite-f02906k8.js} +4 -4
  52. package/bin/vm-hands/vm-hands-entry-lite-f5230h6t.js +67 -0
  53. package/bin/vm-hands/{vm-hands-entry-lite-zh8p7ndn.js → vm-hands-entry-lite-fb5dzy9x.js} +2 -2
  54. package/bin/vm-hands/vm-hands-entry-lite-fyvgav60.js +3 -0
  55. package/bin/vm-hands/vm-hands-entry-lite-g7h6wjqy.js +3 -0
  56. package/bin/vm-hands/vm-hands-entry-lite-h8dbw0c7.js +4 -0
  57. package/bin/vm-hands/{vm-hands-entry-lite-nhtb458c.js → vm-hands-entry-lite-hnsm5t36.js} +1 -1
  58. package/bin/vm-hands/{vm-hands-entry-lite-r6pap1kh.js → vm-hands-entry-lite-ma001vzh.js} +1 -1
  59. package/bin/vm-hands/{vm-hands-entry-lite-anmv8hp7.js → vm-hands-entry-lite-mn64e4pt.js} +286 -104
  60. package/bin/vm-hands/{vm-hands-entry-lite-9cgm6g8t.js → vm-hands-entry-lite-pk3q774c.js} +1 -1
  61. package/bin/vm-hands/vm-hands-entry-lite-qef2ndkd.js +6 -0
  62. package/bin/vm-hands/vm-hands-entry-lite-qnnfvm5r.js +5 -0
  63. package/bin/vm-hands/vm-hands-entry-lite-qwf78yqr.js +11 -0
  64. package/bin/vm-hands/vm-hands-entry-lite-r8qg3wp1.js +3 -0
  65. package/bin/vm-hands/vm-hands-entry-lite-rd0ak4ye.js +4 -0
  66. package/bin/vm-hands/{vm-hands-entry-lite-00qsbphw.js → vm-hands-entry-lite-rpn0frzb.js} +2 -2
  67. package/bin/vm-hands/{vm-hands-entry-lite-g9rvf5qk.js → vm-hands-entry-lite-rtt2w6c6.js} +1 -1
  68. package/bin/vm-hands/vm-hands-entry-lite-sex82vb1.js +3 -0
  69. package/bin/vm-hands/{vm-hands-entry-lite-dgxxsdwb.js → vm-hands-entry-lite-xrthfx3q.js} +2 -2
  70. package/bin/vm-hands/{vm-hands-entry-lite-kxdw4myj.js → vm-hands-entry-lite-y2s2w174.js} +1 -1
  71. package/bin/vm-hands/{vm-hands-entry-lite-hc3p6r9p.js → vm-hands-entry-lite-zjfr0zh8.js} +2 -2
  72. package/bin/vm-hands/vm-hands-entry-lite.js +1 -1
  73. package/bin/vm-hands/{vm-hands-executor-a05whg1y.js → vm-hands-executor-yx6mxa2p.js} +1 -1
  74. package/bin/vm-hands/vm-hands-op-runner-yt3v3v6w.js +2 -0
  75. package/bin/vm-hands/{vm-hands-runtime-ky9jhq5h.js → vm-hands-runtime-ygddqgbs.js} +3 -3
  76. package/bin/vm-hands/worker-sandbox-tgqbmy6b.js +2 -0
  77. package/package.json +1 -1
  78. package/bin/vm-hands/api-af9g18n7.js +0 -2
  79. package/bin/vm-hands/api-credentials-65mrr3tn.js +0 -2
  80. package/bin/vm-hands/connect-cli-w0z9jzv5.js +0 -2
  81. package/bin/vm-hands/desktop-account-5zvgspyw.js +0 -2
  82. package/bin/vm-hands/hands-worker-source-h0b1j53p.js +0 -2
  83. package/bin/vm-hands/local-automation-nm3xtj0a.js +0 -2
  84. package/bin/vm-hands/local-capabilities-bbrr6j7v.js +0 -2
  85. package/bin/vm-hands/local-desktop-users-0hadyvx1.js +0 -2
  86. package/bin/vm-hands/local-display-mac-v1pc7177.js +0 -2
  87. package/bin/vm-hands/local-display-session-n0kagkex.js +0 -2
  88. package/bin/vm-hands/local-pty-session-hs7rq03x.js +0 -2
  89. package/bin/vm-hands/managed-runtime-n7ftmmx7.js +0 -2
  90. package/bin/vm-hands/package-3cd7cfyv.js +0 -2
  91. package/bin/vm-hands/permissions-bfwdxyr5.js +0 -2
  92. package/bin/vm-hands/serve-service-g12x52xn.js +0 -2
  93. package/bin/vm-hands/status-t3jrf9fn.js +0 -96
  94. package/bin/vm-hands/version-m89hab1m.js +0 -2
  95. package/bin/vm-hands/vm-hands-entry-lite-1085xsma.js +0 -5
  96. package/bin/vm-hands/vm-hands-entry-lite-4m40gwkf.js +0 -3
  97. package/bin/vm-hands/vm-hands-entry-lite-5q1q991e.js +0 -181
  98. package/bin/vm-hands/vm-hands-entry-lite-bdp2578c.js +0 -540
  99. package/bin/vm-hands/vm-hands-entry-lite-bvbfcp1k.js +0 -4
  100. package/bin/vm-hands/vm-hands-entry-lite-c01eyep6.js +0 -3
  101. package/bin/vm-hands/vm-hands-entry-lite-dcynw6t2.js +0 -3
  102. package/bin/vm-hands/vm-hands-entry-lite-g6912hkd.js +0 -62
  103. package/bin/vm-hands/vm-hands-entry-lite-hh24bq0d.js +0 -3
  104. package/bin/vm-hands/vm-hands-entry-lite-jb2sr2r7.js +0 -3
  105. package/bin/vm-hands/vm-hands-entry-lite-sb9a1jcn.js +0 -4
  106. package/bin/vm-hands/vm-hands-entry-lite-sky5eg5d.js +0 -11
  107. package/bin/vm-hands/vm-hands-entry-lite-ynzy9k5z.js +0 -340
  108. package/bin/vm-hands/vm-hands-entry-lite-ze9msfq1.js +0 -3
  109. package/bin/vm-hands/vm-hands-entry-lite-zq42mcjc.js +0 -459
  110. package/bin/vm-hands/vm-hands-op-runner-69sca90a.js +0 -2
  111. package/bin/vm-hands/worker-sandbox-wpzkvwer.js +0 -2
@@ -0,0 +1,346 @@
1
+ // @bun
2
+ import{r as m0}from"./vm-hands-entry-lite-8fj07njx.js";import{v as t1,x as n6,y as t9}from"./vm-hands-entry-lite-hnsm5t36.js";import{A as V2,B as i6,C as V4,D as G4,E as R6,F as v0,J as C6,K as A$}from"./vm-hands-entry-lite-f02906k8.js";import{V as l2,oa as e0,ra as p1,ta as RJ}from"./vm-hands-entry-lite-qwf78yqr.js";import{Ba as $J,Ca as JJ,Da as V8,Ea as G8,Fa as mJ,Ga as gJ,Ha as W9,Ia as Z5,Ja as U8,Ka as T0,La as I1,Ma as E1,Na as P0,Oa as d1,Pa as X5,Qa as R5,Ra as u3,Sa as N5,Wa as H5,db as pJ,eb as lJ,fb as cJ,gb as sJ,hb as z9}from"./vm-hands-entry-lite-3n3xh0xv.js";import{$b as U0,Eb as g8,Fb as u8,Gb as B8,Hb as K8,Ib as wJ,Jb as yJ,Lb as j8,Mb as hJ,Nb as N1,Qb as $3,Rb as J3,Sb as p6,Tb as l6,Ub as c6,Vb as S0,Wb as J0,Xb as g,Yb as O9,Zb as D1,_b as r1,ac as fJ,fc as W5,hc as f4,jb as U6,kc as E2,mb as C8,mc as J5,nb as P8,nc as o3,pc as d8,qb as o8,rb as I8,ub as _8,vc as vJ,wb as k8,wc as i3,zb as h8}from"./vm-hands-entry-lite-06qnb2w1.js";import{Ac as w1,Bc as s6,Ec as N8,xc as h9,yc as f9,zc as Q5}from"./vm-hands-entry-lite-ejm5er3h.js";import{Lc as $5}from"./vm-hands-entry-lite-qef2ndkd.js";import{Rc as f8,Sc as v8,Zc as m8}from"./vm-hands-entry-lite-mn64e4pt.js";import{_c as q$}from"./vm-hands-entry-lite-rtt2w6c6.js";import{$c as u,ad as e,bd as s,cd as c}from"./vm-hands-entry-lite-h8dbw0c7.js";import{ud as Y8}from"./vm-hands-entry-lite-rpn0frzb.js";import{Fd as V5,Id as uJ,Ld as ZJ,Md as QJ}from"./vm-hands-entry-lite-cwe16c51.js";import{$d as o6,Pd as OJ,Qd as p$,Sd as Q$,Td as R$,Ud as H1,Wd as P6,Xd as r6,Yd as t6,_d as q1,ae as v9,be as e6,ce as r2,de as X$,ee as x4,fe as t2}from"./vm-hands-entry-lite-dsdwzasy.js";import{He as _2,If as X2,Le as SJ,Me as bJ,pf as X8,xf as D6,yf as n$}from"./vm-hands-entry-lite-5n4vsm6b.js";import{Vf as a6,Wf as u2,Zf as dJ,ag as k1,cg as F7,dg as _7,ig as U5}from"./vm-hands-entry-lite-50n6vbfx.js";import{mg as p8}from"./vm-hands-entry-lite-dh5gwmyf.js";import{Ag as rJ,Bg as i$,Cg as M3,Dg as R2,Eg as L4,Gg as C2,Hg as b$,Ig as k0,Jg as r$,Kg as P2,Ng as w$,xg as V0,yg as Z2,zg as nJ}from"./vm-hands-entry-lite-xrthfx3q.js";import{Qg as l1,Rg as e8}from"./vm-hands-entry-lite-fb5dzy9x.js";import{Xg as y8}from"./vm-hands-entry-lite-ammr3xbc.js";import{Ai as E4,Bi as t$,mi as Z$,qi as W$,ri as C0,si as $4,ti as g6,ui as u6,wi as L2,xi as d6,yi as _9,zi as I4}from"./vm-hands-entry-lite-e2mjbqmr.js";import{Ci as u1,Di as A1}from"./vm-hands-entry-lite-ma001vzh.js";import{_i as k6,gj as Y5,hj as j9,jj as H8}from"./vm-hands-entry-lite-8zawqa9q.js";import{lj as H0,nj as WJ}from"./vm-hands-entry-lite-fyvgav60.js";import{Lj as t}from"./vm-hands-entry-lite-aj1ccphg.js";import{ik as K}from"./vm-hands-entry-lite-zjfr0zh8.js";import{lk as kJ}from"./vm-hands-entry-lite-rd0ak4ye.js";import{qk as t8,sk as Z1,wk as DJ,xk as z8,yk as A8,zk as R8}from"./vm-hands-entry-lite-r8qg3wp1.js";import{Ek as h0}from"./vm-hands-entry-lite-51hmj6am.js";import{Kk as jG}from"./vm-hands-entry-lite-2t0vcvd8.js";import{spawn as $7,spawnSync as DG}from"child_process";import{closeSync as J7,existsSync as WG,mkdirSync as OG,openSync as Z7,readdirSync as zG,realpathSync as Y$,rmSync as L1}from"fs";import{hostname as AG}from"os";import{dirname as m9,join as F0,resolve as RG}from"path";import{createHash as D7}from"crypto";import{unlinkSync as W7}from"fs";import{platform as O7}from"os";import{join as z7}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)})]),S$=($)=>z7($,"api-key.json");function F$($){let J=D7("sha256").update(`reason-connect-api-key
3
+ ${$}`).digest("hex");return new i$(Z2(),O7(),J)}function H3($,J,Z=F$($)){try{Z.deleteBinding(),Z.createBinding(new TextEncoder().encode(J)),c(S$($),{version:1,store:"keychain"});return}catch(Q){if(!(Q instanceof V0))throw Q}c(S$($),{version:1,store:"file",api_key:J})}function d0($,J=F$($)){if(!u(S$($)))return null;let Z=o9.parse(JSON.parse(s(S$($))));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=F$($)){if(!u(S$($)))return;if(o9.parse(JSON.parse(s(S$($)))).store==="keychain")try{J.deleteBinding()}catch(Z){if(!(Z instanceof V0))throw Z}W7(S$($))}async function q3($,J){let Z;try{Z=await t9({env:{REASON_API_KEY:J,REASON_API_URL:$.apiOrigin},fetchImpl:S0($.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 d7,renameSync as p7,rmSync as y$}from"fs";import{join as q0}from"path";import{createHash as A7}from"crypto";import{realpathSync as R7,statSync as C7,unlinkSync as Q2}from"fs";import{platform as P7}from"os";import{join as b0}from"path";function d($){return{state:b0(g($),"device.json"),control:b0(g($),"control.json"),lock:b0(g($),"lifecycle.lock"),socket:b0(g($),"control.sock"),daemon:b0(g($),"daemon.json"),releaseCheck:b0(g($),"release-check.json"),updateDeferral:b0(g($),"update-deferral.json"),firstHeartbeat:b0(g($),"first-heartbeat.json")}}var I7=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(n$).optional()});function J4($,J,Z){e(g($),!0),c(d($).firstHeartbeat,{version:1,device_id:J,...Z.offer?{offer:Z.offer}:{},...Z.enrollmentMs!==void 0?{enrollment_ms:Z.enrollmentMs}:{}})}function L3($,J){let Z=d($).firstHeartbeat;try{if(!u(Z))return null;let Q=I7.safeParse(JSON.parse(s(Z)));if(Q2(Z),!Q.success||Q.data.device_id!==J)return null;let X=X2(Q.data.offer);return{...X?{offer:X}:{},...Q.data.enrollment_ms!==void 0?{enrollmentMs:Q.data.enrollment_ms}:{}}}catch{return null}}function L0($,J=!1){e(g($),J);let Z=["local-device.key","local-device.binding","device.json"].filter((Q)=>{let X=b0(g($),Q);if(!u(X))return!1;return s(X),!0});return $.lifetime==="persistent"&&Z.join()==="device.json"?T3($):new M3(g($))}function Y2($,J){L0($,!0),S7($);let Z=J??T3($),Q=new M3(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 T3($){return new i$(Z2(),P7(),E7($))}function E7($){let J=F3($);return A7("sha256").update(`reason-worker
4
+ ${J?.directory??g($)}`).digest("hex")}function W1($,J){c(b0(g($),O1),{version:1,directory:F3($)?.directory??g($),devicePublicKey:J})}var O1="keychain-scope.json";function Z4($){return u(b0(g($),O1))}var x7=K.strictObject({version:K.literal(1),directory:K.string().min(1),devicePublicKey:K.string().min(1)});function F3($){let J=b0(g($),O1);if(!u(J))return null;let Z=x7.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 S7($){let J=b0(g($),O1);if(!u(J))return;if(F3($))try{let Z=T3($);Z.deleteBinding(),Z.deleteKey()}catch(Z){if(!(Z instanceof V0))throw Z}Q2(J)}function U$($){let J=R7($.workspaceRoot);if(J!==$.workspaceRoot||!C7(J).isDirectory()||!D1(J,$.stateDirectory))throw Error("worker_workspace_not_canonical_or_overlaps_state")}function o($){if(!u(g($)))return null;let J=b$(d($).state,{proofStore:L0($),repair:!1}),Z=J!==null&&$4($.apiOrigin,J.apiOrigin),Q=Z?[U0($),U0({...$,apiOrigin:J.apiOrigin})]:[U0($)];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 $0($){let J=d($).control;return u(J)?Q4.parse(JSON.parse(s(J))):{version:1,drained:!1,revoked:!1}}function R0($,J){c(d($).control,Q4.parse(J))}function w0($){let J=L0($);J.deleteBinding(),J.deleteKey();let Z=b0(g($),O1);if(u(Z))Q2(Z);let Q=d($).state;if(u(Q))Q2(Q)}var b7=K.strictObject({read:K.boolean(),write:K.boolean(),execute:K.boolean(),discover_environment:K.boolean(),expose_mcp:K.literal(!1)}),_3=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:b7,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()}),w7=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()}),j3=30000;class t0 extends Error{deviceRemoved;constructor($){super("worker_enrollment_rejected");this.deviceRemoved=$}}async function y7($,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(j3)});if(!Q.ok){let X=Q.status===409?await Q.json().catch(()=>null):null;throw new t0(X?.error==="device_revoked")}return Q.json()}async function D3($,J,Z,Q){m0();let X=_3.parse(JSON.parse(s(J)));return o0($,X,Z,Q)}async function o0($,J,Z,Q=(Y,V)=>y7(Y,V,S0($.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=w$([$.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=w$([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:t,bridge_version:t,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=w7.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=X2(M.first_heartbeat);try{J4($,M.device_id,{...U?{offer:U}:{},enrollmentMs:Math.min(n$,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:U0($),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 k7,randomUUID as h7}from"crypto";import{unlinkSync as f7}from"fs";import{join as v7}from"path";var B4=K.strictObject({version:K.literal(1),install_id:K.uuid(),fingerprint_key:K.string().regex(/^[a-f0-9]{64}$/)}),m7=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 W3($){return m7.parse($)}var g7=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 _$($){return V2(A1("REASON_CLI_CHANNEL",$.channel),H0())}async function j$($,J=_$($)){if(!u(J))return null;let Z=g7.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=S0($.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=D$($);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=D$($),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 u7(U)}),Y);if(G)return G}return o0($,V.complete(J.orgId,await Z.createHeadlessDeviceEnrollmentTicket(V.request)),Q,X,Y)}function u7($){if(!($ instanceof v0))return $;if($.status===409)return new t0($.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 t0(!1);return $}var z1=($)=>v7(g($),"enrollment-install.json");function N4($){if(u(z1($)))f7(z1($))}function D$($,{stored:J=!0}={}){m0();let Z=z1($),Q=J&&u(Z)?B4.parse(JSON.parse(s(Z))):{version:1,install_id:h7(),fingerprint_key:k7(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=w$([$.workspaceRoot],X,Y)[0];if(V.path!==$.workspaceRoot)throw Error("worker_workspace_not_canonical_or_overlaps_state");let N=($.folders??[]).map((U)=>{let B=w$([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){e(g(U),!0),c(z1(U),Q)},complete(U,B){let q=W3(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=z1($);if(!u(Q))throw Error("worker_folders_unavailable");let X=B4.parse(JSON.parse(s(Q)));return w$([J],Z,Buffer.from(X.fingerprint_key,"hex"))[0]}var G2=8,T4=600000,F4=15000,q4=new Set(["device_revoked","invalid_device_credential"]),B2=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,N$=($)=>q0(g($),"workspaces"),_4="account.json",O3=($)=>u(q0($,_4));function y0($){let J;try{J=d7(N$($))}catch{return[]}return J.filter((Z)=>B2.test(Z)).sort().map((Z)=>{let Q=q0(N$($),Z),X=q0(Q,"worker.json"),Y=null;try{let V=J0.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:O3(Q)}})}function K2($,J){let Z=J.toLowerCase();if(!B2.test(Z))throw Error("worker_workspace_id_invalid");let Q=J0.parse({...$,stateDirectory:q0(N$($),Z)});return e(Q.stateDirectory,!0),c(q0(Q.stateDirectory,_4),{version:1}),{config:Q,configPath:q0(Q.stateDirectory,"worker.json")}}function U2($,J){try{let{config:Z,configPath:Q}=K2($,J);e(g(Z),!0),R0(Z,{version:1,drained:!0,revoked:!0}),c(Q,Z)}catch{}}function R1($,J){let Z=J.toLowerCase(),Q=null;try{Q=o($)?.orgId.toLowerCase()??null}catch{}return Q===Z||y0($).some((X)=>!X.account&&X.config!==null&&X.organizationId===Z)}var z3=["device.json","local-device.key","local-device.binding","keychain-scope.json","control.json","enrollment-install.json","first-heartbeat.json"];function M4($,J){let Z=o($);if(!Z?.worker)throw Error("worker_identity_missing");W1($,Z.devicePublicKey),e(g(J),!0);for(let Y of z3)y$(q0(g(J),Y),{force:!0});for(let Y of z3){let V=q0(g($),Y);if(u(V))p7(V,q0(g(J),Y))}let Q=L0(J),X=b$(d(J).state,{proofStore:Q,repair:!1});if(!X?.worker)throw Error("worker_identity_missing");k0({...X,worker:{...X.worker,configDigest:U0(J)}},d(J).state,{proofStore:Q})}function A3($){for(let J of y0($)){if(J.account)continue;try{if(J.config&&u(d(J.config).state))w0(J.config)}catch{}y$(J.directory,{recursive:!0,force:!0})}y$(C3($),{force:!0})}function N2($,{prefer:J,keep:Z,live:Q=!1}){let X=Date.now(),Y=(U)=>Number(Date.parse(U.worker?.expiresAt??"")>X+60000),N=y0($).flatMap((U)=>{if(!U.account||!U.config)return[];try{if($0(U.config).revoked)return[];let B=o(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=$0($).revoked?null:o($)}catch{}let H=G?.orgId.toLowerCase()??"";if(Z&&G&&B2.test(H)&&H!==N.organizationId){let U=K2($,H);M4($,U.config),c(U.configPath,U.config)}else if(u(g($))){try{if(u(d($).state))w0($)}catch{}for(let U of z3)y$(q0(g($),U),{force:!0})}A3($);let M=J0.parse({...N.config,stateDirectory:$.stateDirectory});return M4(N.config,M),c(q0($.stateDirectory,"worker.json"),M),y$(N.directory,{recursive:!0,force:!0}),M}var R3={before($){for(let{config:J}of y0($))try{let Z=J?o(J):null;if(J&&Z)W1(J,Z.devicePublicKey)}catch{}},after($,J){for(let{organizationId:Z,directory:Q,configPath:X,config:Y}of y0(J)){if(Y)continue;try{let V=J0.parse(JSON.parse(s(X)));if(V.stateDirectory!==q0(N$($),Z))continue;let N=J0.parse({...V,stateDirectory:Q}),G=L0(N),H=b$(d(N).state,{proofStore:G,repair:!1});if(H?.worker?.configDigest===U0(V))k0({...H,worker:{...H.worker,configDigest:U0(N)}},d(N).state,{proofStore:G});c(X,N)}catch{}}}},C3=($)=>q0(N$($),"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=y0($),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,L=null;try{U=H?$0(H).revoked:!1,B=H&&!U?o(H):null;let T=H?r$(d(H).daemon):null;q=J&&!!B&&T?.state==="connected",L=q?L4(T,B):null}catch{}return{...L?{permission_recovery:L}:{},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=(j)=>{let{folders:D,...R}=J,I=Z.roots.slice(1).map((C)=>C.path);return J0.parse({...R,...I.length?{folders:I}:{},stateDirectory:q0(N$(J),j)})},U=async(j)=>{let D=V.get(j);if(!D)return;D.controller.abort(),await D.done},B=(j,D=!1)=>{let R=new AbortController,I=()=>R.abort();if(X.addEventListener("abort",I,{once:!0}),X.aborted)R.abort();let C={...j,controller:R,claims:0,done:Promise.resolve(),account:D};C.done=$.serve(j,R.signal,(P)=>{C.claims=P}).then(()=>{return},(P)=>{if(D&&P instanceof T0&&P.status===401&&q4.has(P.code)){try{R0(j.config,{version:1,drained:!0,revoked:!0})}catch{}Y(`Reason worker: workspace ${j.organizationId} (another account's) no longer accepts this computer (${P.code}); run \`reason connect\` signed in as that account to connect it again
5
+ `)}else if(P instanceof T0&&P.status===401&&q4.has(P.code)){try{w0(j.config)}catch{}Y(`Reason worker: workspace ${j.organizationId} no longer accepts this computer
6
+ `)}else if(!R.signal.aborted)Y(`Reason worker: workspace ${j.organizationId} stopped (worker_workspace_failed); it starts again on the next check
7
+ `)}).finally(()=>{if(R.abort(),X.removeEventListener("abort",I),C.claims=0,V.get(j.organizationId)===C)V.delete(j.organizationId);let P=j.config.stateDirectory;if(D&&!O3(P)&&!u(q0(P,"worker.json")))y$(P,{recursive:!0,force:!0})}),V.set(j.organizationId,C)},q=(j,D)=>{if(!D)return null;try{let R=M(j),I=o(D);if(!I||I.orgId!==j||Date.parse(I.worker?.expiresAt??"")<=Date.now()+60000||D.name!==R.name||D.executionMode!==R.executionMode||!C0(D.apiOrigin,R.apiOrigin)||I.roots.map((C)=>C.path).join(`
8
+ `)!==Z.roots.map((C)=>C.path).join(`
9
+ `))return null;return{organizationId:j,config:D,state:I,proofStore:L0(D)}}catch{return null}},L=(j,D)=>{if(!D)return null;try{if($0(D).revoked)return null;let R=o(D);if(!R||R.orgId.toLowerCase()!==j||Date.parse(R.worker?.expiresAt??"")<=Date.now()+60000||D.executionMode!==J.executionMode||!C0(D.apiOrigin,J.apiOrigin))return null;return{organizationId:j,config:D,state:R,proofStore:L0(D)}}catch{return null}},T=(j,D)=>j.deviceId===D.deviceId&&j.devicePublicKey===D.devicePublicKey&&JSON.stringify(j.roots.map((R)=>[R.id,R.path]))===JSON.stringify(D.roots.map((R)=>[R.id,R.path])),_=async(j)=>{for(let[D,R]of j){if(X.aborted)return;let I=V.get(D),C=L(D,R.config);if(I&&C&&T(I.state,C.state))continue;if(I){if(I.claims>0)continue;await U(D)}if(C&&!X.aborted)B(C,!0)}for(let[D,R]of V)if(R.account&&!j.has(D)&&R.claims===0)await U(D)},W=async(j)=>{let D=M(j),R=J0.parse({...D,stateDirectory:J.stateDirectory});if(!u(q0(g(J),"enrollment-install.json")))return null;let I=D$(R),C=await Q.ownerWorkspaceEnrollment(Z,{organization_id:j,install_id:I.request.install_id,code_challenge:I.request.code_challenge},X),P=I.complete(j,C);if(e(g(D),!0),u(d(D).state))w0(D);let h=Y2(D);try{let S=await o0(D,P,h,$.enroll);return k0(S,d(D).state,{proofStore:h}),R0(D,{version:1,drained:!1,revoked:!1}),c(q0(D.stateDirectory,"worker.json"),D),{organizationId:j,config:D,state:S,proofStore:h}}catch(S){if(S instanceof t0&&S.deviceRemoved)return R0(D,{version:1,drained:!0,revoked:!0}),c(q0(D.stateDirectory,"worker.json"),D),null;throw S}},O=async()=>{let j=y0(J),D=new Map(j.filter((A)=>A.account).map((A)=>[A.organizationId,A]));await _(D);let R=new Map(j.filter((A)=>!A.account).map((A)=>[A.organizationId,A])),I=(A)=>D.has(A)||V.get(A)?.account===!0||O3(q0(N$(J),A)),C=(A)=>{let y=R.get(A)?.config;try{return y?$0(y).revoked:!1}catch{return!1}};for(let[A,y]of R){if(V.has(A)||C(A)||H.blocked.includes(A))continue;let w=q(A,y.config);if(w&&!X.aborted)B(w)}let P;try{P=await Q.ownerWorkspaces(Z,X)}catch(A){return H={listed:!1,blocked:H.blocked,...H.names?{names:H.names}:{},reason:A instanceof T0&&A.status===403&&A.code==="sign_in_not_eligible"?"sign_in":null},!1}let h=new Map(P.map((A)=>[A.id.toLowerCase(),A.blocked]).filter(([A])=>B2.test(A)&&A!==Z.orgId.toLowerCase()&&!I(A))),S=[...h.keys()].filter((A)=>R.has(A)?!C(A):!h.get(A)).slice(0,G2),k=[...V.values()].filter((A)=>!A.account&&A.claims>0&&!S.includes(A.organizationId)).length,p=S.filter((A)=>!R.has(A)),b=p.slice(p.length-Math.min(Math.max(0,S.length+k-G2),p.length)),x=S.filter((A)=>!b.includes(A)),E=Object.fromEntries(P.flatMap((A)=>A.name&&x.includes(A.id.toLowerCase())?[[A.id.toLowerCase(),A.name]]:[]));H={listed:!0,reason:null,blocked:x.filter((A)=>h.get(A)),names:E};for(let A of new Set([...R.keys(),...V.keys()])){if(x.includes(A)||I(A))continue;if(h.has(A)&&C(A))continue;if((V.get(A)?.claims??0)>0)continue;await U(A);let y=R.get(A)?.config;try{if(y&&u(d(y).state))w0(y)}catch{}y$(q0(N$(J),A),{recursive:!0,force:!0}),Y(`Reason worker: left workspace ${A}
10
+ `)}for(let A of x){if(X.aborted)return!0;if(I(A))continue;try{let y=V.get(A);if(h.get(A)){if(y&&y.claims===0)await U(A),Y(`Reason worker: offline in workspace ${A} (outside its allowed networks)
11
+ `);continue}let w=q(A,R.get(A)?.config??null);if(w&&y)continue;if(!w){if(y&&y.claims>0)continue;if(await U(A),w=await W(A),w)Y(`Reason worker: connected in workspace ${A}
12
+ `)}if(w&&!X.aborted)B(w)}catch{Y(`Reason worker: could not connect in workspace ${A} (worker_workspace_failed); it is tried again
13
+ `)}}return!0},F=null,z=async()=>{let j=!1;do G=!1,j=await O().catch(()=>!1);while(G&&!X.aborted);let D=JSON.stringify({version:1,...H});if(F!==D)try{e(N$(J),!0),c(C3(J),JSON.parse(D)),F=D}catch{}return j};return{check(){if(N)G=!0;else N=z().finally(()=>{N=null});return N},claims:()=>[...V.values()].reduce((j,D)=>j+D.claims,0),async settled(){await N,await Promise.all([...V.values()].map((j)=>j.done))}}}import{dirname as l7}from"path";function A4($){let J={saved:$.saved,configPath:$.configPath};if(!$.saved||!c7($.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?t$():$.native;if(!X)return J;let Y=[];try{let V=X.lock(l7($.configPath));if(!V)return J;if(Y.push(V),u(g(Z))){let M=e0({path:d(Z).lock,runtimeVersion:t});if(!M.acquired)return J;Y.push(()=>M.release())}let N=J0.parse(JSON.parse(s($.configPath)));if(N.stateDirectory!==Z.stateDirectory)return J;let G=R4(N),H={saved:N,configPath:$.configPath};if(!H2(N)&&G.length===0)return Q("unchanged"),H;if(H2(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 H2($){return W$($.apiOrigin)!==$.apiOrigin}function R4($){return y0($).filter((J)=>J.config!==null&&H2(J.config))}function c7($){return H2($)||R4($).length>0}function O4($){let J=J0.parse({...$,apiOrigin:W$($.apiOrigin)}),Z=o($);if(!Z)return J;if(!Z.worker)throw Error("worker_identity_missing");let Q=U0(J);if(Z.apiOrigin!==J.apiOrigin||Z.worker.configDigest!==Q)k0({...Z,apiOrigin:J.apiOrigin,worker:{...Z.worker,configDigest:Q}},d(J).state,{proofStore:L0(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 s7,lstatSync as E3,readdirSync as S4,readlinkSync as a7,unlinkSync as i7}from"fs";import{join as D0,sep as n7}from"path";var q2="rehome.json";class M2 extends Error{code;constructor($){super($);this.code=$}}function b4($){let J={saved:$.saved,configPath:$.configPath},Z=D0($.home,".config"),Q=D0(Z,"ara"),X=$.channel==="production"?["connect"]:[$.channel,"connect"],Y=D0(Q,...X),V=D0(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?t$():$.native,H=$.saved,M=[];try{if(H&&P4(Q)&&H.stateDirectory===Y){let W={...H,stateDirectory:V};if(!P3(G,V,W,M))return J;return C4(H,W,$.host,N)}if(H&&P4(Q)&&H.stateDirectory===V&&Z4(H)&&P3(G,V,H,M))return w4({...H,stateDirectory:Y},H,$.host),J;if(!H||H.lifetime!=="persistent"||H.stateDirectory!==Y||!o$(Q)?.isDirectory())return J;if(JZ(Y)===t)return J;let B=(W,O=!0)=>{if(O)c(D0(Y,q2),{version:t});return N("skipped",W),J},q=[Y];for(let W of t7(Q,Y)){if(W.config?.lifetime!=="ephemeral")return B("several_connections");if(!r7(W.directory,W.config,M))return B("once_running",!1);q.push(W.directory)}if(!G)return B("config_rename_unavailable:no_native");if(!P3(G,Y,H,M))return J;let L=o(H);if(!L||$0(H).revoked)return J;if(I4(Z)!==null)return B("conflicting_identity");if(E4(Z)!==null)return B("conflicting_files");if(o$(V)&&(!o$(V).isDirectory()||S4(V).length>0))return B("connection_folder_taken");W1(H,L.devicePublicKey),R3.before(H);let T=d0(Y);if(T&&I3(Y))o7(V,T);let _=L2(Z,G,q);if(_.state!=="renamed"&&_.state!=="linked"){if(T&&I3(Y))y4(V);return B(_.problem??"config_folder_kept")}return C4(H,{...H,stateDirectory:V},$.host,N)}catch(U){try{if(o$(Y)?.isDirectory())c(D0(Y,q2),{version:t})}catch{}return N("failed",ZZ(U)),$Z(H,Y,V,J)}finally{for(let U of M.reverse())U()}}function C4($,J,Z,Q){let X=E3(J.stateDirectory);if(X.isDirectory()&&X.uid===process.getuid?.()&&(X.mode&63)!==0)s7(J.stateDirectory,448);let Y=L0(J),V=b$(d(J).state,{proofStore:Y,repair:!1});if(!V?.worker)throw new M2("identity_missing");let N=U0(J);if(V.worker.configDigest===U0($))k0({...V,worker:{...V.worker,configDigest:N}},d(J).state,{proofStore:Y});else if(V.worker.configDigest!==N)throw new M2("worker_config_binding_mismatch");c(D0(J.stateDirectory,"worker.json"),J),R3.after($,J),w4($,J,Z);let G=D0(J.stateDirectory,q2);if(u(G))i7(G);return Q("moved"),{saved:J,configPath:D0(J.stateDirectory,"worker.json")}}function w4($,J,Z){if(x4($,J,Z,"connect"),!I3(J.stateDirectory))return;let Q=e7(F$($.stateDirectory));if(!Q)return;let X=F$(J.stateDirectory),Y;try{Y=X.loadBinding()}catch{return}if(!Y)X.createBinding(Q);y4($.stateDirectory)}function P3($,J,Z,Q){if($){let Y=$.lock(J);if(!Y)return!1;Q.push(Y)}if(!u(g(Z)))return!0;let X=e0({path:d(Z).lock,runtimeVersion:t});if(!X.acquired)return!1;return Q.push(()=>X.release()),!0}function r7($,J,Z){if(u(g(J))){let X=e0({path:d(J).lock,runtimeVersion:t});if(!X.acquired)return!1;return Z.push(()=>X.release()),!0}let Q=o$(D0($,"worker.json"));return Q!==null&&Date.now()-Q.mtimeMs>60000}function t7($,J){let Z=[$,...S4($,{withFileTypes:!0}).filter((X)=>X.isDirectory()&&!X.name.startsWith(".")).map((X)=>D0($,X.name))],Q=[];for(let X of Z)for(let Y of["connect","connect-once"]){let V=D0(X,Y);if(V===J||!o$(D0(V,"worker.json")))continue;let N=k4(V);if(!N||N.stateDirectory===$||N.stateDirectory.startsWith($+n7))Q.push({directory:V,config:N})}return Q}function I3($){try{return JSON.parse(s(D0($,"api-key.json"))).store==="keychain"}catch{return!1}}function o7($,J){let Z=F$($);Z.deleteBinding(),Z.createBinding(new TextEncoder().encode(J))}function y4($){try{F$($).deleteBinding()}catch(J){if(!(J instanceof V0))throw J}}function e7($){try{return $.loadBinding()}catch(J){if(J instanceof V0)return null;throw J}}function $Z($,J,Z,Q){if($?.stateDirectory!==J)return Q;let X=k4(Z);return X?.stateDirectory===Z?{saved:X,configPath:D0(Z,"worker.json")}:Q}function P4($){try{return E3($).isSymbolicLink()&&a7($)==="reason"}catch{return!1}}function JZ($){try{let J=JSON.parse(s(D0($,q2)));return typeof J.version==="string"?J.version:null}catch{return null}}function k4($){try{let J=D0($,"worker.json");return u(J)?J0.parse(JSON.parse(s(J))):null}catch{return null}}function o$($){try{return E3($)}catch{return null}}function ZZ($){if($ instanceof M2)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 QZ}from"fs";function T2($){try{let J=JSON.parse(QZ(`${$}.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 rV}from"crypto";import{readdirSync as tV,realpathSync as E9,statSync as oV}from"fs";import{hostname as eV}from"os";import{join as c$,resolve as $G}from"path";var F2="cloud",XZ=/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$/;function C1($){return XZ.test($)&&!f4.test($)}var YZ={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 e$($){return YZ[$]}import{randomUUID as VZ}from"crypto";import{chmodSync as GZ,lstatSync as j2,mkdtempSync as BZ,realpathSync as u4,rmdirSync as KZ,rmSync as UZ,unlinkSync as NZ}from"fs";import{createConnection as HZ,createServer as qZ}from"net";import{basename as v4,dirname as m4,join as k$}from"path";var MZ=K.enum(["status","drain","resume","stop","reload_roots"]),LZ=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(_2)).max(_2.length).optional(),capabilityReadiness:K.partialRecord(K.enum(_2),K.boolean()).optional(),lastHeartbeat:K.string().nullable(),expiresAt:K.string()}),TZ=K.strictObject({nonce:K.string(),action:MZ}),FZ=K.object({nonce:K.uuid()}),d4=K.strictObject({version:K.literal(1),nonce:K.uuid(),socketPath:K.string().max(100)});function p4($){return k$(d($).lock,"control.json")}function D2($){return e(d($).lock),FZ.parse(JSON.parse(s(k$(d($).lock,"owner.json"))))}function g4($){if(!u($))return!1;let J=j2($);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)||!j2(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(!_Z.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 e(X),g4(Q.socketPath)?Q.socketPath:null}var _Z=/^\\\\\.\\pipe\\reason-worker-[0-9a-f-]{36}$/;async function W2($,J,Z){if(D2($).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:BZ(k$(u4("/tmp"),"ara-worker-")),V=Y?k$(Y,"control.sock"):`\\\\.\\pipe\\reason-worker-${VZ()}`;if(Y)e(Y);if(Buffer.byteLength(V)>100)throw Error("worker_socket_path_too_long");let N=new Set,G=qZ((B)=>{N.add(B),B.once("close",()=>N.delete(B)),B.setTimeout(2000,()=>B.destroy());let q="",L=!1;B.on("error",()=>B.destroy()),B.on("data",(T)=>{if(L)return;if(q+=T.toString(),Buffer.byteLength(q)>4096){B.destroy();return}if(!q.includes(`
14
+ `))return;L=!0;try{let _=TZ.parse(JSON.parse(q));if(_.nonce!==J){B.destroy();return}B.end(JSON.stringify(Z(_.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=j2(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)NZ(Q)}catch{}}try{if(Y)KZ(Y)}catch{}};try{if(await new Promise((B,q)=>{G.once("error",q),G.listen(V,()=>{if(!X)GZ(V,384);B()})}),D2($).nonce!==J)throw Error("worker_instance_changed");return c(Q,{version:1,nonce:J,socketPath:V}),H=j2(Q),U}catch(B){throw await U(),B}}function c4($,J){try{let Z=JSON.parse(s(k$(d($).lock,"owner.json"))),Q=Z&&typeof Z==="object"?Z[J]:void 0;return typeof Q==="string"?Q:null}catch{return null}}function P1($){return c4($,"runtime_version")}function jZ($){return c4($,"nonce")}function s4($,J){if(J)return J.message==="worker_control_timeout"?"socket_timeout":"bad_reply";try{if(!u(k$(d($).lock,"owner.json")))return"no_lock";return l4($,D2($).nonce)?"socket_refused":"no_socket"}catch{return"bad_reply"}}var DZ=21600000,WZ=K.strictObject({instance:K.string().nullable(),since:K.number().int().nonnegative()});function OZ($,J){let Z=d($).updateDeferral;try{if(!u(Z))return null;let Q=WZ.safeParse(JSON.parse(s(Z)));if(Q.success&&Q.data.instance===J)return Q.data.since;x3($)}catch{}return null}function x3($){try{UZ(d($).updateDeferral,{force:!0})}catch{}}async function O2($,J,Z=()=>!1){let Q=jZ($),X=OZ($,Q);if(J!==void 0){let H=P1($);if(H===null||H===J&&X===null&&!Z())return{state:"current"}}let Y;try{let H=await K0($,"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<DZ?"busy":"drained",sessions:Y,waitedMs:G}}async function K0($,J){let Z=d($);if(!u(k$(Z.lock,"owner.json")))return null;let Q=D2($),X=l4($,Q.nonce);if(!X)return null;return new Promise((Y,V)=>{let N=HZ(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=LZ.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 wY}from"crypto";import{homedir as PJ}from"os";import{spawn as zZ}from"child_process";import{createRequire as AZ}from"module";var a4=2147483648,RZ=1;function CZ(){try{let $=AZ(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 PZ($,J){if($==="ac_only"||!J)return{status:"unsupported",release:async()=>"unsupported"};let Z=J((a4|RZ)>>>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 PZ($,J.setExecutionState??CZ());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??zZ)("/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,L)=>{B.once("spawn",q),B.once("error",L)}),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((L)=>{let T,_=setTimeout(()=>{try{B.kill("SIGKILL")}catch{}T=setTimeout(()=>L("failed"),1000)},1000);B.once("exit",()=>{clearTimeout(_),clearTimeout(T),L("released")});try{B.kill("SIGTERM")}catch{}});if(q==="released")X="failed";return q})()}}}class $1 extends Error{constructor(){super("Reason Device operation lease expired.")}}class z2{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 $1;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 $1;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 $1)},Math.min(this.remainingMs(),2147483647))}}import{realpathSync as bZ}from"fs";import{randomUUID as wZ}from"crypto";import{constants as S3}from"fs";import{open as IZ}from"fs/promises";import{join as EZ}from"path";var xZ={platform:process.platform,home:H0,async openFile($){let J=await IZ($,S3.O_RDONLY|S3.O_NOFOLLOW|S3.O_NONBLOCK);return{isFile:async()=>(await J.stat()).isFile(),close:()=>J.close()}}};async function n4($=xZ){if($.platform!=="darwin")return"unknown";try{let J=await $.openFile(EZ($.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 b3 extends Error{constructor(){super("Hands generation receipt attempt timed out.")}}async function SZ($,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 b3;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 SZ($.send,Q,Math.min(8000,$.lease.remainingMs()));return Q.throwIfAborted(),$.lease.assertCurrent(),X}catch(X){let Y=X instanceof b3||(X instanceof T0?I1(X.status):E1(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 d3($,J=process.env){return!$.proxied&&J.REASON_DEVICE_SESSION!=="0"}function q8($,J,Z){let Q=$?.permissionRecovery;return R2(Q,Z)&&Q.deviceId===J.deviceId&&Q.organizationId===J.orgId?{permissionRecovery:Q}:{}}var yZ=1000,kZ=250,hZ=H8(bZ(process.execPath)),t4=null,o4=null;function M8($){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:hZ}}}var fZ=8,vZ=64,mZ=2000,gZ=2000,p3=8000,e4=3,uZ=250,$8=1000,J8=30000,dZ=0.2,pZ=30000,lZ=21600000,cZ=300000,sZ=3600000,aZ=0.1,L8=new Set(["run_finished","run_cancelled","driver_handoff","driver_stopped"]);function iZ($){return Math.min(e4,Math.max(1,$??e4))}function nZ($){return typeof $.reason_code==="string"&&L8.has($.reason_code)?$.reason_code:"cancelled"}function w3($){return $.reason instanceof h0&&($.reason.code==="cancelled"||L8.has($.reason.code))?$.reason.code:"cancelled"}function Z8($){return $ instanceof h0&&/^[A-Za-z0-9._:-]{1,160}$/.test($.code)?$.code:"capability_failed"}function T8($){return $.capability==="hands.connect"&&(K8($.payload)||B8($.payload))}function y3($,J=Math.random){let Z=Math.min(Math.max(J(),0),1);return Math.max(0,Math.floor($*(1+Z*aZ)))}function rZ($,J=Math.random){let Z=Math.min(J8,$8*2**Math.max(0,$-1)),Q=Math.min(Math.max(J(),0),1),X=Z*dZ*(Q*2-1);return Math.min(J8,Math.max($8,Math.round(Z+X)))}function l3($,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 k3 extends Error{updateError;constructor($){super("Managed runtime update check failed.");this.updateError=$;this.name="RuntimeUpdateCheckError"}}async function tZ($,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 h3($){return $ instanceof Error?$.message:String($)}function f3($,J){return J.aborted||$ instanceof DOMException&&$.name==="AbortError"||$ instanceof Error&&$.name==="AbortError"}function i0($){return $ instanceof T0&&$.status===409&&$.code==="attempt_fenced"}function v3($){return $.capability==="environment.install"}function oZ($){if($ instanceof I2||$ instanceof $1||$ instanceof S1)return"timeout";if(!($ instanceof Error)||$ instanceof T0)return"transport_unknown";for(let J of[$,$.cause]){if(!(J instanceof Error)||J instanceof T0||!("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 x1($,J,Z){if(!$.state.worker&&!$.connectionDiagnostics)return;if(i0(Z))return;let Q=Z instanceof T0&&Number.isInteger(Z.status)&&Z.status>=100&&Z.status<=599?{stage:J,category:"http",httpStatus:Z.status}:{stage:J,category:oZ(Z)};$.onEvent?.({type:"error",message:"worker_connection_failed",diagnostic:Q})}async function J1($,J,Z){try{return await Z()}catch(Q){if(!$.signal.aborted)x1($,J,Q);throw Q}}class S1 extends Error{constructor(){super("Reason Device operation completion timed out.")}}async function m3($,J,Z,Q){let X=J.capability==="inference.custom.v1"&&Z.status!=="succeeded"?{status:Z.status,error_code:Z.status==="cancelled"?"operation_cancelled":Y8(Z.error_code)?Z.error_code:"custom_endpoint_unavailable"}:v3(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??l3,G=$.operationCompletionTimeoutMs??p3,H=performance.now()+G,M,U,B=new Promise((T,_)=>{let W=()=>{let F=new S1;Y.abort(F),_(F)},O=(F)=>{clearTimeout(M),M=setTimeout(W,F)};if(U=()=>O(Math.max(0,Math.min(H-performance.now(),mZ))),O(G),$.signal.addEventListener("abort",U,{once:!0}),$.signal.aborted)U()}),q,L=0;try{while(!0)try{q=await Promise.race([$.client.completeOperation($.state,J,X,V),B]);break}catch(T){if(V.aborted||$.signal.aborted||P0(T)||i0(T)||!eZ(T)||performance.now()>=H)throw x1($,"completion",T),T;L+=1;let _=Math.min(500*2**Math.min(L-1,4),Math.max(0,H-performance.now()));if(_<=0)throw x1($,"completion",T),T;try{await N(_,V)}catch{throw x1($,"completion",T),T}}}finally{clearTimeout(M),$.signal.removeEventListener("abort",U),Y.abort()}$.onEvent?.({type:"completed",operationId:J.operation_id,status:q.status})}function eZ($){if(P0($))return!1;if(i0($))return!1;if($ instanceof T0)return $.status===408||$.status===429||$.status>=500&&$.status<=504;if($ instanceof Error){if($.name==="AbortError"||$ instanceof S1)return!1;return!0}return!1}class I2 extends Error{constructor(){super("Reason Device operation heartbeat timed out.");this.name="OperationHeartbeatAttemptTimeoutError"}}function A2($){if($ instanceof I2)return!0;return $ instanceof T0?I1($.status):E1($)}function g3($,J){if(!($ instanceof T0)||!$.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 $Q($,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 I2;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=iZ($.operationHeartbeatMaxAttempts),N=$.operationHeartbeatAttemptTimeoutMs??p3,G=$.operationHeartbeatRetryDelayMs??uZ,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 $Q($,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||i0(B)||P0(B)||!A2(B)){if(!Q.aborted)x1($,"operation_heartbeat",B);throw B}let q=H-Y.remainingMs(),L=g3(B,($.now?.()??new Date).getTime()),T=Math.max(G*(U+1),M*(U+1)/V-q,L);await X(Math.min(Y.remainingMs(),T),Q),Y.assertCurrent()}throw Error("Reason Device operation heartbeat retries were exhausted.")}async function JQ($,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,L=Promise.resolve(),T=[],_=new AbortController,W=!1,O,F=null,z=!1,j,D,R={},I=(S)=>{W=!0,_.abort(S),V.abort(S),N.abort(S)},C=(S)=>{if(O)return O;let k=structuredClone(S),p=q;return O=(async()=>{let b=new AbortController,x=b.signal;x.throwIfAborted();let E,A=()=>{},y=new Promise((w,n)=>{if(A=()=>n(x.reason),x.addEventListener("abort",A,{once:!0}),E=setTimeout(()=>b.abort(Error("Hands stop receipt delivery timed out.")),4000),x.aborted)A()});try{for(let w=0;w<3;w+=1){x.throwIfAborted();try{let n=await Promise.race([J1($,"event",()=>$.client.operationEvents($.state,J,{eventSeqStart:p,events:[k],signal:x,transientRetryOwner:"caller"})),y]);if(x.throwIfAborted(),n.next_event_seq!==p+1)throw Error("Hands stop receipt acknowledgement sequence mismatch.");q=n.next_event_seq;return}catch(n){if(P0(n))X(n);let r=n instanceof T0?I1(n.status):E1(n);if(x.aborted||!r||w===2)throw n;let X0=Math.max(500*2**w,g3(n,($.now?.()??new Date).getTime()));await Promise.race([Z(X0,x),y])}}}finally{clearTimeout(E),x.removeEventListener("abort",A),b.abort()}})(),O},P=(S,k,p)=>{let b=(E)=>J1($,"event",()=>$.client.operationEvents($.state,J,{eventSeqStart:k,events:S,signal:E,...p?{transientRetryOwner:"caller"}:{}})).catch((A)=>{if(J.capability==="hands.connect"&&i0(A))I(A);if(p&&(P0(A)||i0(A))){if(P0(A))X(A);V.abort(A),N.abort(A),_.abort(A)}throw A});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 A=()=>{},y=new Promise((w,n)=>{A=()=>n(E.reason),E.addEventListener("abort",A,{once:!0})});try{let w=await Promise.race([b(E),y]);E.throwIfAborted(),q=w.next_event_seq}finally{E.removeEventListener("abort",A)}};let x=r4({send:b,lease:D,sleep:Z,retryAfterMs:(E)=>g3(E,($.now?.()??new Date).getTime())});return async(E)=>{let A=await x(E);if(A.next_event_seq!==k+S.length)throw Error("Hands generation receipt acknowledgement sequence mismatch.");q=A.next_event_seq}},h=async(S,k)=>{let p=S??await Q8($,J,{controlAckSeq:B,waitMs:k},N.signal,Z,D),b=null,x=!1;for(let E=0;E<10;E+=1){let A=B+1;for(let y of p.controls){if(y.seq!==A)throw Error("Reason returned an out-of-order Device operation control.");if(y.kind==="cancel"||y.kind==="operation.cancel")b??=nZ(y.payload),V.abort(new h0(b,"Reason closed the Device operation."));if(y.kind!=="cancel"&&y.kind!=="operation.cancel"){if(["browser.recording.v1","browser.pr-proof.v1","process.run.v1","process.full.v1"].includes(J.capability)){let w,n,r=new Promise((X0,M0)=>{w=X0,n=M0});r.catch(()=>{}),R.current={promise:r,resolve:w,reject:n}}try{x||=!await $.onControl?.(J,y)}catch(w){if(w instanceof h0)M??=Z8(w);throw R.current?.reject(w),w}}B=y.seq,A+=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,D),R.current?.resolve()}catch(y){if(R.current?.reject(y),!b||i0(y)||P0(y))throw y;return{cancellationReason:b,unsupported:x}}}throw Error("Reason returned too many Device operation control batches.")};try{let S;try{if(!Y)D=new z2(J.lease_until,()=>($.now?.()??new Date).getTime(),(k)=>{if(!V.signal.aborted)H=k;V.abort(k),N.abort(k)});S=Y||J.capability==="hands.connect"||J.capability==="display.stream.v1"||J.capability==="simulator.stream.v1"||u3.has(J.capability)||J.capability==="pty.start"?{cancellationReason:null,unsupported:!1}:await h()}catch(k){if(!v3(J)||i0(k)||P0(k))throw k;await m3($,J,{status:$.signal.aborted?"cancelled":"failed"});return}if(S.cancellationReason||$.signal.aborted){let k=S.cancellationReason??w3($.signal);V.abort(new h0(k,"Reason closed the Device operation.")),U={status:"cancelled",error_code:k}}else if(S.unsupported)V.abort(),U={status:"failed",error_code:"control_unsupported"};else{let k=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)?gZ:15000),x=Math.min(b,Math.max(0,($.operationHeartbeatAttemptTimeoutMs??p3)-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 A=await h(void 0,E?x:void 0);if(A.cancellationReason||A.unsupported){if(A.unsupported)H=Error("Reason requested an unsupported Device operation control.");V.abort(A.cancellationReason?new h0(A.cancellationReason,"Reason closed the Device operation."):void 0);return}}catch(A){if(P0(A))X(A);if(i0(A))H=A,I(A);if(!N.signal.aborted)H=A,V.abort();return}})();try{if(D?.assertCurrent(),V.signal.throwIfAborted(),Q.authorized=()=>!V.signal.aborted&&(Y||(D?.remainingMs()??0)>0),U=await $.onClaim(J,V.signal,async(b)=>{if(v3(J))return;if(b.kind==="permission.denied"){if(!Q.authorized())return;let r=b.data,X0=($.now??(()=>new Date))().getTime(),M0=$.statusPath??C2(),u0=($.loadStatus??r$)(M0),I0={id:wZ(),kind:"permission_denied",operation:r?.operation,provenance:r?.provenance,occurredAt:new Date(X0).toISOString(),expiresAt:new Date(X0+600000).toISOString(),sessionId:J.run_id,deviceId:$.state.deviceId,organizationId:$.state.orgId};if(u0&&R2(I0,X0)){let c0=u0.permissionRecovery;if(!c0||!R2(c0,X0)||c0.sessionId!==I0.sessionId||c0.operation!==I0.operation||c0.provenance!==I0.provenance)($.saveStatus??P2)({...u0,permissionRecovery:I0},M0)}return}let x=J.capability==="hands.connect"&&b.capability==="hands.connect"&&b.kind==="hands.stopped",E=J.capability==="hands.connect"&&b.kind==="hands.reconnected",A=E||J.capability==="inference.custom.v1"?AbortSignal.any([V.signal,_.signal,...b.deliverySignal?[b.deliverySignal]:[]]):J.capability==="hands.connect"?AbortSignal.any([$.signal,_.signal]):$.signal,y={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")||(u3.has(J.capability)||J.capability==="pty.start")&&b.kind==="started")return new Promise((r,X0)=>{T.push({wireEvent:y,settle:(M0)=>M0===void 0?r():X0(M0)})});let w=T;T=[];let n=L.then(async()=>{if((W||$.signal.aborted)&&J.capability==="hands.connect"&&!Y){if(x)await C(y);return}if(F!==null){if(b.kind!=="hands.stopped"||!z||!j)throw F;let X0=new AbortController,M0=AbortSignal.any([$.signal,_.signal,X0.signal]),u0=setTimeout(()=>X0.abort(Error("Hands stop receipt reconciliation timed out.")),4000);z=!1;try{await j(M0),j=void 0,await P([y],q,!0)(M0),F=null}catch(I0){throw F=I0??Error("Hands stop receipt could not be confirmed."),I0}finally{clearTimeout(u0),X0.abort()}return}if(E&&!D){let X0=Math.min(Date.parse(J.lease_until),Date.parse(String(J.payload.expires_at)));D=new z2(new Date(X0).toISOString(),()=>($.now?.()??new Date).getTime(),(M0)=>{V.abort(M0),N.abort(M0)})}let r=q;if(E)j=P([...w.map((X0)=>X0.wireEvent),y],r,!0),await j(A),j=void 0;else await P([...w.map((X0)=>X0.wireEvent),y],r,!1)(A)});n.then(()=>{for(let r of w)r.settle()},(r)=>{for(let X0 of w)X0.settle(r??Error("Hands event delivery failed."))}),L=n.catch((r)=>{if(P0(r))X(r);if(E){if(F===null)z=A.aborted&&!_.signal.aborted,F=r??Error("Hands generation receipt delivery failed.");if(!A.aborted)V.abort(r),N.abort(r)}}),await n}),["browser.recording.v1","browser.pr-proof.v1","process.run.v1","process.full.v1"].includes(J.capability))await R.current?.promise}catch(b){U=V.signal.aborted?{status:"cancelled",error_code:w3(V.signal)}:{status:"failed",error_code:Z8(b)}}finally{Q.authorized=()=>!1,_.abort();for(let b of T.splice(0))b.settle();N.abort(),await k}let p=V8(J.capability)?G8(U.result,J.operation_id):null;if(H){if(P0(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:w3(V.signal),...p?{result:p}:{}}}if(D?.close(),P0($.signal.reason))throw $.signal.reason;await m3($,J,U)}finally{D?.close(),_.abort(),N.abort(),$.signal.removeEventListener("abort",G)}}async function c3($){let J=$.now??(()=>new Date),Z=$.sleep??l3,Q=$.saveStatus??P2,X=$.loadStatus??r$,Y=$.statusPath??C2(),V=J().toISOString(),N=X(Y)?.lastUsedAt,G=!1,H=()=>({version:1,pid:process.pid,startedAt:V,...M8(J),...q8(X(Y),$.state,J().getTime()),deviceId:$.state.deviceId,...$.idleSleepPolicy||$.readIdleSleepPolicy?{idleSleepHold:G}:{},...N?{lastUsedAt:N}:{}}),M=0,U,B=!1,q,L,T,_=Promise.resolve();Q({...H(),state:"starting"},Y),$.onEvent?.({type:"started",deviceId:$.state.deviceId}),N8();try{let W=async()=>{let O=$.readIdleSleepPolicy?$.readIdleSleepPolicy():$.idleSleepPolicy;if($.signal.aborted||O===L)return;if(q&&L){let j=await q.release();if($.onEvent?.({type:"idle_sleep",status:j,policy:L}),j==="failed")return;q=void 0,L=void 0,G=!1;let D=X(Y);if(D)Q({...D,idleSleepHold:G},Y)}if(!O)return;L=O;let F=!0;q=await($.acquireAwakeHold??i4)(O,{onStatusChange:(j)=>{if(F)return;G=j==="held";let D=X(Y);if(D)Q({...D,idleSleepHold:G},Y);$.onEvent?.({type:"idle_sleep",status:j,policy:O})}}),F=!1,G=q.status==="held";let z=X(Y);if(z)Q({...z,idleSleepHold:G},Y);$.onEvent?.({type:"idle_sleep",status:q.status,policy:O})};if(await W(),$.readIdleSleepPolicy)T=setInterval(()=>{_=_.then(W).catch(()=>{$.onEvent?.({type:"idle_sleep",status:"failed",policy:L??"battery_and_ac"})})},$.idleSleepPollMs??1000),T.unref();while(!$.signal.aborted){let O=!1;try{await ZQ({...$,saveStatus:(F,z)=>{if(F.state==="starting"||F.state==="error"||F.state==="stopped")return;N=F.lastUsedAt??N,Q({...F,startedAt:V,...$.idleSleepPolicy||$.readIdleSleepPolicy?{idleSleepHold:G}:{}},z)},onEvent:(F)=>{if(F.type==="error"&&F.diagnostic){$.onEvent?.(F);return}if(F.type==="started"||F.type==="error"||F.type==="stopped")return;if(F.type==="heartbeat"&&M>0&&!O){O=!0;let z=M;M=0,U=void 0,$.onEvent?.({type:"reconnected",attempts:z})}$.onEvent?.(F)}});return}catch(F){if(f3(F,$.signal))return;if(P0(F)){B=!0;let j=$.state.worker?"worker_connection_failed":h3(F);throw Q({...H(),state:"error",error:j},Y),$.onEvent?.({type:"error",message:j}),F}M+=1;let z=rZ(M,$.reconnectRandom);U??=J().toISOString(),Q({...H(),state:"starting",reconnectingSince:U},Y),$.onEvent?.({type:"reconnecting",message:$.state.worker?"worker_connection_failed":h3(F),attempt:M,retryInMs:z}),await Z(z,$.signal)}}}catch(W){if(!f3(W,$.signal))throw W}finally{if($.client.close?.(),clearInterval(T),await _,q&&L){let W=await q.release();G=W==="failed"&&q.status==="held",$.onEvent?.({type:"idle_sleep",status:W,policy:L})}if(!B)Q({...H(),state:"stopped"},Y);else{let W=X(Y);if(W)Q({...W,idleSleepHold:G},Y)}$.onEvent?.({type:"stopped"})}}async function ZQ($){let J=$.now??(()=>new Date),Z=$.sleep??l3,Q=$.statusPath??C2(),X=$.saveStatus??P2,Y=$.loadStatus??r$,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(vZ,B):fZ,L=0,T=!1,_=null,W=(m)=>{_??=m,H.abort(m)},O=new Map,F=()=>{let m=new Set,Y0=0;for(let{claim:E$}of O.values()){let B$=E$.capability==="hands.connect"?E$.payload[X8]:void 0;if(typeof B$==="string"){if(m.has(B$))continue;m.add(B$)}Y0+=1}return Y0},z=null,j=()=>[...O.values()].some((m)=>m.authorized()),D=()=>[...O.values()].every((m)=>m.claim.capability==="preview.serve.v1"),R=G?new Date(V).getTime()+y3(G.initialDelayMs??pZ,U):Number.POSITIVE_INFINITY,I=null,C=!1,P=$.firstHeartbeat,h=P?.account_root_metadata_supported===!0,S=P?.workspace_root_metadata_supported===!0,k=P?.account_root_path_supported===!0,p=P?.home_contained_roots_supported===!0,b=P?.root_paths_supported===!0,x=P?.startup_supported===!0,E=P!==void 0,A=P?{challenge:P.challenge,expires_at:P.expires_at}:void 0,y,w=!$.startup,n=()=>({version:1,pid:process.pid,startedAt:V,...M8(J),...q8(Y(Q),$.state,J().getTime()),...N?{lastUsedAt:N}:{},deviceId:$.state.deviceId,...I?{organizationId:I.organization_id,organizationName:I.organization_name,organizationSlug:I.organization_slug}:{}}),r=()=>{let m=($.advertised??$.claimable)?.()!==!1;if(!w)y??=$.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&&!w&&y?{startup:y}:{},capabilities:m?U8($.capabilities,{accountRootMetadataSupported:h,workspaceRootMetadataSupported:S,accountRootPathSupported:k,homeContainedRootsSupported:p,rootPathsSupported:b}):{supported_operations:[]}}},X0=()=>{if(C||!$.client.identity)return;C=!0,$.client.identity($.state,$.signal).then((m)=>{if(m.organization_id!==$.state.orgId)return;I=m;let Y0=Y(Q);if(!Y0)return;X({...Y0,organizationId:m.organization_id,organizationName:m.organization_name,organizationSlug:m.organization_slug},Q)}).catch(()=>{return})},M0=(m)=>{h=m.account_root_metadata_supported===!0,S=m.workspace_root_metadata_supported===!0,k=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)w=!0},I0=(m,Y0)=>{if(!(Y0 instanceof T0&&Y0.status===400&&Y0.code==="invalid_heartbeat")||!m.startup&&!E)throw Y0;if(w=!0,E)h=S=k=!1,p=b=x=E=!1;return null},c0=(m)=>{M0(m),X({...n(),state:"connected",lastHeartbeatAt:J().toISOString()},Q),X0(),$.onEvent?.({type:"heartbeat",serverTime:m.server_time,drain:m.drain,...m.latest_cli_versions?{latestCliVersions:m.latest_cli_versions}:{},...m.hands_prespawn?{handsPrespawn:!0}:{}})},P$=!1,s$=!1;$.registerHeartbeatNow?.(()=>{if($.signal.aborted)return;if(P$)s$=!0;let m=r();J1($,"heartbeat",()=>$.client.heartbeat($.state,m,H.signal).catch((Y0)=>I0(m,Y0))).then((Y0)=>{if(!Y0)return;u0(m),M0(Y0),c0(Y0)},()=>{return})});let L$=(m)=>Z(m,$.signal);X({...n(),state:"starting"},Q),$.onEvent?.({type:"started",deviceId:$.state.deviceId});let V$=!1,I$=$.maxConsecutiveHeartbeatFailures??3,G$=0;try{while(!$.signal.aborted){if(_)throw _;if(T&&D())break;let m,Y0=r(),E$=A;A=void 0,P$=!0,s$=!1;try{let i=await J1($,"heartbeat",()=>$.client.heartbeat($.state,Y0,H.signal,...E$?[E$]:[]).catch((B0)=>I0(Y0,B0)));if(P$=!1,!i)continue;m=i,u0(Y0),G$=0}catch(i){if(P$=!1,$.signal.aborted)break;if(!A2(i))throw i;if(G$+=1,G$>=I$&&!j())throw i;await Z(Math.min($.heartbeatRetryDelayMs??2000,$.heartbeatIntervalMs??15000),$.signal);continue}if(M0(m),Object.keys(r().capabilities).length>Object.keys(Y0.capabilities).length)continue;if(s$)continue;if(c0(m),_)throw _;if($.signal.aborted)break;if(G&&["available","required"].includes(m.update_policy??""))R=Math.min(R,J().getTime());if(G&&J().getTime()>=R)try{let i=new AbortController,B0=()=>i.abort($.signal.reason);if($.signal.aborted)B0();else $.signal.addEventListener("abort",B0,{once:!0});let O0;try{O0=G.check(i.signal)}catch(z0){O0=Promise.reject(z0)}let K$=O0.then((z0)=>({kind:"completed",result:z0}),(z0)=>({kind:"failed",error:z0})),a$;try{while(!0){let z0=await tZ(K$,$.heartbeatIntervalMs??15000,$.signal,Z);if($.signal.aborted)throw $.signal.reason??new DOMException("Aborted","AbortError");if(z0.kind==="failed")throw new k3(z0.error);if(z0.kind==="completed"){a$=z0.result;break}try{let E0=r(),F1=await J1($,"heartbeat",()=>$.client.heartbeat($.state,E0,H.signal).catch((e1)=>I0(E0,e1)));if(!F1)continue;m=F1,u0(E0),c0(m),G$=0}catch(E0){if($.signal.aborted)throw E0;if(!A2(E0))throw E0;if(G$+=1,G$>=I$&&!j())throw E0}}}catch(z0){i.abort(z0);let E0=await K$;if(E0.kind==="completed"&&E0.result==="activated")a$="activated";else throw z0}finally{$.signal.removeEventListener("abort",B0)}if($.signal.aborted)throw $.signal.reason??new DOMException("Aborted","AbortError");if(L=0,a$==="activated"){if($.signal.aborted)throw $.signal.reason??new DOMException("Aborted","AbortError");$.onEvent?.({type:"runtime_updated"}),T=!0}R=J().getTime()+y3(G.intervalMs??lZ,U)}catch(i){if(!(i instanceof k3))throw i;L+=1;let B0=G.retryBaseMs??cZ,O0=G.retryMaxMs??sZ,K$=Math.min(O0,B0*2**Math.min(L-1,8));R=J().getTime()+y3(K$,U)}if($.signal.aborted)break;if(T&&D())break;if(T){await L$($.heartbeatIntervalMs??15000);continue}let B$=$.client.sessionCadence?.($.state)??null,x$=B$?.presenceIntervalMs??$.heartbeatIntervalMs??15000;if(m.drain||$.claimable?.()===!1){await L$(x$);continue}if(F()>=q){let i=new AbortController;z=i;try{await Z(x$,AbortSignal.any([$.signal,i.signal]))}catch(B0){if(!i.signal.aborted)throw B0}finally{if(z===i)z=null}continue}let f0,T1=B$?.claimWaitMs??Math.min($.heartbeatIntervalMs??15000,30000),f=performance.now();try{f0=await J1($,"claim",()=>$.client.claimOperation($.state,{waitMs:T1,signal:H.signal}))}catch(i){if($.signal.aborted||!A2(i)||!j())throw i;await L$(Math.min($.heartbeatRetryDelayMs??2000,$.heartbeatIntervalMs??15000));continue}if(_)throw _;if(!f0){if(performance.now()-f<T1-kZ)await L$(yZ);continue}if($.claimable?.()===!1){await m3($,f0,{status:"cancelled",error_code:"execution_authority_withdrawn"},$.signal);continue}N=J().toISOString(),X({...n(),state:"connected",lastHeartbeatAt:J().toISOString()},Q),$.onEvent?.({type:"claim",operationId:f0.operation_id,runId:f0.run_id,attemptId:f0.attempt_id,capability:f0.capability});let a,N0={authorized:()=>!1,claim:f0};if(a=JQ({...$,signal:H.signal},f0,Z,N0,W).catch((i)=>{if(P0(i))W(i);else if(!i0(i)&&[...O].some(([B0,O0])=>B0!==a&&O0.authorized())){if(i instanceof S1)$.onEvent?.({type:"error",message:"operation_completion_timeout",diagnostic:{stage:"completion",category:"timeout"}});return}if(!i0(i)&&_===null)_=i}).finally(()=>{O.delete(a),z?.abort(),$.onEvent?.({type:"claims_changed",activeClaims:O.size})}),O.set(a,N0),$.onEvent?.({type:"claims_changed",activeClaims:O.size}),T8(f0)){if(await a,_)throw _}}}catch(m){if(!f3(m,$.signal)){H.abort(m),V$=!0;let Y0=$.state.worker?"worker_connection_failed":h3(m);throw X({...n(),state:"error",error:Y0},Q),$.onEvent?.({type:"error",message:Y0}),m}}finally{if(H.abort(),await Promise.allSettled(O.keys()),$.signal.removeEventListener("abort",M),!V$)X({...n(),state:"stopped"},Q);$.onEvent?.({type:"stopped"})}}import{execFile as wQ}from"child_process";import{constants as a8,existsSync as yQ,mkdtempSync as r3,rmSync as G5}from"fs";import{access as i8,open as kQ,readFile as n8,readlink as hQ,readdir as r8,unlink as fQ,rmdir as vQ}from"fs/promises";import{tmpdir as mQ}from"os";import{basename as t3,join as b2}from"path";import{randomUUID as h$}from"crypto";import{chmodSync as QQ,closeSync as XQ,fsyncSync as YQ,openSync as VQ,readFileSync as GQ,rmdirSync as F8,unlinkSync as D8,writeFileSync as BQ}from"fs";import{createConnection as KQ,createServer as UQ}from"net";import{dirname as NQ,join as HQ}from"path";var qQ=5000;async function W8($,J,Z){if(Z.aborted)return!1;let Q={generation:1,fenceId:h$()},X={runId:h$(),deviceId:h$(),rootId:h$(),apiOrigin:$.apiOrigin,binding:{kind:"workspace_source",target_revision:1,root_grant_revision:1},expiresAtMs:Date.now()+30000,identity:()=>Q},Y=j8(J,X),V={version:1,snapshot_id:h$(),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{D8(Y.path)}catch{}}}async function O8($,J,Z=_8){if(J.aborted)return!1;let Q,X,Y=new Set,V=h$(),N=UQ((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,qQ);J.addEventListener("abort",H,{once:!0});try{Q=Z({runtimeDirectory:g($),root:$.workspaceRoot,runId:`readiness-${h$()}`}),X=HQ(Q.journalDirectory,"readiness.json");let B=VQ(X,"wx",384);try{BQ(B,V),YQ(B)}finally{XQ(B)}if(GQ(X,"utf8")!==V||J.aborted)return!1;let q=new Promise((L)=>{N.once("error",()=>L(!1)),N.listen(Q.socketPath,()=>{try{if(process.platform!=="win32")QQ(Q.socketPath,384)}catch{L(!1);return}G=KQ(Q.socketPath);let T="";G.setEncoding("utf8"),G.once("error",()=>L(!1)),G.on("data",(_)=>{if(T+=_,T.length>V.length)G?.destroy(),L(!1)}),G.once("end",()=>L(T===V)),G.once("close",()=>L(!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{D8(X)}catch{}if(Q){try{F8(Q.journalDirectory)}catch{}try{F8(NQ(Q.journalDirectory))}catch{}}}}import{spawn as MQ}from"child_process";import{randomUUID as f$}from"crypto";import{basename as LQ}from"path";import{fileURLToPath as TQ}from"url";function FQ(){let $=LQ(process.execPath).startsWith("bun");return{command:process.execPath,args:[...$?["--no-env-file",TQ(new URL("./worker-candidate-entry.ts",import.meta.url))]:[],"worker","__preview-probe"]}}async function E8($,J,Z=FQ()){if(J.aborted||!["darwin","linux","win32"].includes(process.platform)||process.platform==="win32"&&!P8())return!1;let Q=new AbortController,X=()=>Q.abort();J.addEventListener("abort",X,{once:!0});let Y=setTimeout(X,5000),V=MQ(Z.command,Z.args,{cwd:$,...A8(),stdio:["pipe","pipe","ignore"],env:z8()});R8(V);let N=!1,G=new Promise((F)=>V.once("close",()=>{N=!0,F()}));V.on("error",X);let H,M,U=new Promise((F)=>{H=F}),B=new Promise((F)=>{M=F}),q=new Promise((F)=>Q.signal.addEventListener("abort",()=>F(null),{once:!0})),L="",T=0,_=!1;V.stdout.setEncoding("utf8"),V.stdout.on("data",(F)=>{if(T+=Buffer.byteLength(F),L+=F,T>512){X();return}while(L.includes(`
17
+ `)){let z=L.indexOf(`
18
+ `),j=L.slice(0,z);L=L.slice(z+1);try{if(!_){let D=JSON.parse(j);if(!D||Object.keys(D).length!==2||!Number.isInteger(D.port)||D.port<1024||D.port>65535||typeof D.token!=="string"||!/^[a-zA-Z0-9_-]{43}$/.test(D.token))throw Error("probe_receipt_invalid");_=!0,H({port:D.port,token:D.token})}else if(j==="ready")M(!0);else X()}catch{X()}}}),G.then(X);let W,O=!1;try{let F=await Promise.race([U,q]);if(!F||!V.pid||Q.signal.aborted||J.aborted)return!1;let z=Date.now()+4500,j=f$(),D={organizationId:f$(),userId:f$(),runId:f$(),deviceId:f$(),rootId:f$(),attachmentRevision:0,grantRevision:1,jobId:"readiness",generation:1,fenceId:f$(),port:F.port,expiresAtMs:z},R={binding:D,executorLaunchId:j,job:{jobId:D.jobId,state:"running",startedAtMs:Date.now(),finishedAtMs:null,leaseExpiresAtMs:z,exitCode:null,inputSequence:0,output:[],firstCursor:1,nextCursor:0,truncated:!1,process:{pid:V.pid,processGroupId:V.pid,executorLaunchId:j}}},I=I8({binding:D,deniedPorts:new Set,readCurrentJob:async()=>!N&&!Q.signal.aborted?R:null});W=await C8({binding:D,deviceRelayUrl:`ws://127.0.0.1:${F.port}/device/readiness/${F.token}`,port:I,signal:Q.signal}),O=await Promise.race([B,q])===!0&&!Q.signal.aborted&&!J.aborted}catch{O=!1}finally{if(clearTimeout(Y),J.removeEventListener("abort",X),W?.close(),Q.abort(),V.stdin.destroy(),!N)V.kill("SIGKILL");await G}return O&&N}import{execFileSync as x2}from"child_process";import{randomUUID as p0}from"crypto";import{chmodSync as x8,chownSync as l8,closeSync as s3,constants as H$,existsSync as _Q,fstatSync as c8,mkdirSync as S8,mkdtempSync as jQ,openSync as a3,readFileSync as DQ,readSync as WQ,realpathSync as OQ,rmdirSync as zQ,rmSync as AQ}from"fs";import{join as v$}from"path";import{fileURLToPath as RQ}from"url";var b8=1e4,CQ=!1;function S2(){if(process.platform!=="linux")return!1;return CQ||=["/usr/bin/tmux","/usr/local/bin/tmux","/bin/tmux"].some(($)=>{try{let J=x2($,["-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 PQ=Buffer.from([0,255,3,4]);function w8($){return`printf "%s\\n" ${$==="foreground"?"$$":"$!"} > ${$}.pid.tmp; /bin/mv ${$}.pid.tmp ${$}.pid`}function IQ($,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 b1($,J={}){if(process.platform==="win32")return!$.aborted&&p8();if($.aborted||!["darwin","linux"].includes(process.platform)||typeof Bun>"u")return!1;let Z=E2(),{directory:Q,root:X,runtimeDirectory:Y}=SQ(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,b8),M={organization_id:p0(),user_id:p0(),device_id:p0()},U=p0(),B=p0(),q=p0(),L=p0(),T=Date.now()+b8,_={kind:"workspace_source",target_revision:0,root_grant_revision:1},W=p0().replaceAll("-",""),O,F=Buffer.alloc(0),z,j=!1,D=!1,R=!1,I=!1,C,P,h,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")},k=!1;try{G=EQ(Q,Z),C=Bun.serve({hostname:"127.0.0.1",port:0,fetch(x,E){let A=new URL(x.url).pathname,y=A===`/device/hands/${W}`?"hands":A===`/device/pty/${W}`?"pty":null;if(y&&E.upgrade(x,{data:{lane:y}}))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")j=!0}catch{N()}return}if(F.length+E.length>8192){N();return}F=Buffer.concat([F,E])}}});let p=`ws://127.0.0.1:${C.port}`;if(P=i3({headless:!0,managedPty:{version:1},root:X,runtimeDirectory:Y,runId:U,operationId:p0(),attemptId:p0(),claimOwner:M,deviceIdentity:{deviceId:M.device_id,rootId:B,apiOrigin:"https://worker-probe.invalid"},signal:V.signal,payload:{relay_url:`${p}/device/hands/${W}`,session_id:"pty-readiness",environment_id:"pty-readiness",expires_at:new Date(T).toISOString(),policy_mode:"full_access",policy_version:1,hands_protocol_version:y8,hands_worker_version:f8,hands_worker_artifact_sha256:m8,hands_worker_entrypoint:v8,target_generation:1,target_fence_id:q,environment_binding:_,[g8]:u8},emitEvent:async(x)=>{if(x==="hands.started")I=!0;if(x==="hands.ready")D=!0;if(x==="hands.stopped")R=!0}},{browserExecutablePath:null,slot:d8(),readyTimeoutMs:3000,logDiagnostic:()=>{return},resolvePathEnvironment:async()=>({path:"/usr/bin:/bin:/usr/sbin:/sbin",source:"fallback"}),sourceEntrypoint:RQ(new URL("./worker-candidate-entry.ts",import.meta.url)),...J}).catch(()=>{if(!D)N()}),await S(()=>D),k8({root:X,runId:U,payload:{version:1,snapshot_id:L,revision:1,run_id:U,root_id:B,device_id:M.device_id,binding:{..._,target_generation:1,target_fence_id:q},expires_at:new Date(T).toISOString(),variables:{PTY_PROBE_VALUE:W},git:null}}),h=h8({root:X,runId:U,rootId:B,deviceId:M.device_id,owner:M,workspace:{kind:"root"},authority:{device_id:M.device_id,binding:_.kind,target_revision:0,root_grant_revision:1,target_generation:1,target_fence_id:q},signal:V.signal,session:{jobId:`pty-${p0()}`,sessionId:"pty-readiness",operationId:p0(),cols:80,rows:24,leaseExpiresAtMs:T,relayUrl:`${p}/device/pty/${W}`},emit:async(x,E)=>{if(x==="pty.ready")z=E}}).catch(()=>{N()}),await S(()=>Boolean(z&&O&&j)),O.send(JSON.stringify({t:"resize",cols:100,rows:30})),O.send(Buffer.from(`stty -echo; test "$PTY_PROBE_VALUE" = '${W}' || exit 19; stty size; printf '\\000\\377\\003\\004'; (trap '' TERM HUP; ${G.wait("background")}) & ${w8("background")}; /bin/bash --noprofile --norc -c 'trap "" TERM HUP; ${w8("foreground")}; ${G.wait("foreground")}'
19
+ `)),await S(()=>_Q(v$(X,"foreground.pid"))&&F.includes(PQ)),!F.includes("30 100")||z.job.environmentSnapshotId!==L||z.job.environmentRevision!==1)return!1;let b=["background.pid","foreground.pid"].map((x)=>xQ(v$(X,x)));if(new Set(b).size!==2||b.some((x)=>!Number.isSafeInteger(x)||x<2||x===z.job.process.pid))return!1;if(process.platform==="linux"){if(!b.every((x)=>IQ(DQ(`/proc/${x}/stat`,"utf8"),x,z.job.process.pid)))return!1}else{let E=x2("/bin/ps",["-o","pid=,pgid=","-p",b.join(",")],{env:{PATH:"/usr/bin:/bin"},encoding:"utf8",timeout:1000,maxBuffer:1024}).trim().split(`
20
+ `).map((A)=>A.trim().split(/\s+/).map(Number));if(E.length!==2||new Set(E.map(([A])=>A)).size!==2||E.some((A)=>A.length!==2||!b.includes(A[0])||A[0]!==A[1]))return!1}if(O.send(JSON.stringify({t:"close"})),await h,V.signal.aborted)return!1;for(let x of[z.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}k=!0}catch{k=!1}finally{if(clearTimeout(H),$.removeEventListener("abort",N),N(),G?.close(),await h,await P,await C?.stop(!0),!I||R)bQ({directory:Q,root:X},Z)}return k&&R&&!$.aborted}function EQ($,J){let Z={foreground:v$($,"foreground.lifeline"),background:v$($,"background.lifeline")};if(!Object.values(Z).every((Y)=>/^\/[A-Za-z0-9/._-]+$/.test(Y)))throw Error("pty_probe_path");x2("/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))s3(Y)};try{for(let Y of Object.values(Z)){let V=a3(Y,H$.O_RDONLY|H$.O_NONBLOCK|H$.O_NOFOLLOW);try{if(Q.push(a3(Y,H$.O_WRONLY|H$.O_NONBLOCK|H$.O_NOFOLLOW)),!c8(Q.at(-1)).isFIFO())throw Error("pty_probe_lifeline")}finally{s3(V)}if(J)l8(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 s8($=(J)=>b1(J)){let J=new AbortController,Z=JSON.stringify(E2()),Q=(async()=>{try{return await $(J.signal)===!0&&!J.signal.aborted}catch{return!1}})();return{result:Q,matches:(X)=>X.executionMode==="host"&&JSON.stringify(E2())===Z,stop:async(X=1500)=>{J.abort();let Y;await Promise.race([Q,new Promise((V)=>{Y=setTimeout(V,X)})]),clearTimeout(Y)}}}function xQ($){let J;try{J=a3($,H$.O_RDONLY|H$.O_NOFOLLOW|H$.O_NONBLOCK)}catch{return Number.NaN}try{let Z=c8(J);if(!Z.isFile()||Z.size>32)return Number.NaN;let Q=Buffer.alloc(32),X=WQ(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{s3(J)}}function SQ($,J=OQ("/tmp")){let Z=jQ(v$(J,"reason-pty-probe-")),Q=v$(Z,"workspace"),X=v$(Z,"private");if(S8(Q,{mode:448}),S8(X,{mode:448}),$)x8(Z,493),x8(Q,493),l8(Q,$.uid,$.gid);return{directory:Z,root:Q,runtimeDirectory:X}}function bQ($,J){if(J)try{x2("/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}),zQ($.root)}catch{return}AQ($.directory,{recursive:!0,force:!0})}var B5=5000,m$="ARA_WORKER_PROBE_READY";function gQ($,J,Z,Q,X){if(X.aborted)return Promise.resolve(!1);return new Promise((Y)=>{wQ($,J,{cwd:Z,env:Q,signal:X,timeout:B5,killSignal:"SIGKILL",maxBuffer:4096,encoding:"utf8",windowsHide:!0},(V,N)=>Y(!V&&!X.aborted&&N===m$))})}function uQ($,J){let Z=t3($).replace(/\.exe$/i,"");if(Z==="bash")return["--noprofile","--norc","-c",J];if(Z==="zsh"||Z==="sh")return["-f","-c",J];return null}function dQ($,J){let Z=$5({home:J,temporaryDirectory:J}),Q=(Y,V,N)=>gQ(Y,V,$.workspaceRoot,Z,N),X=async(Y,V,N,G=(M)=>M===m$,H=!1)=>{let M=process.platform==="win32"?r3(b2(mQ(),"reason-device-probe-")):$.workspaceRoot;try{let U=await H5(Y,V,{cwd:M,root:M,allowWrite:!1,allowProcessInspection:H,timeoutMs:B5,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 ${t3(Y)} probe failed (exit ${U.exitCode}${U.timedOut?", timed out":""}): ${U.stderr.slice(-300).trim()}
21
+ `);return B}catch(U){if(process.platform==="win32")process.stderr.write(`Reason worker: confined ${t3(Y)} probe failed: ${String(U)}
22
+ `);throw U}finally{if(M!==$.workspaceRoot)G5(M,{recursive:!0,force:!0})}};return{workspaceRead:async(Y)=>{return await i8($.workspaceRoot,a8.R_OK),await r8($.workspaceRoot),!Y.aborted},workspaceWrite:async(Y)=>{if(await i8($.workspaceRoot,a8.W_OK),Y.aborted)return!1;let V=r3(b2($.workspaceRoot,".ara-worker-probe-")),N=b2(V,"receipt");try{let G=await kQ(N,"wx",384);try{await G.writeFile(m$),await G.sync()}finally{await G.close()}return await n8(N,"utf8")===m$&&!Y.aborted}finally{await fQ(N).catch(()=>{}),await vQ(V).catch(()=>{})}},confinedShell:(Y)=>{if(process.platform==="win32"&&!w1())return process.stderr.write(`Reason worker: ${Q5}
23
+ `),Promise.resolve(!1);return X(N5(),["-c",`printf ${m$}`],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}
24
+ `)&&/^n\//m.test(H),!0);if(process.platform==="win32")return o8(Y);if(process.platform!=="linux")return!1;let[V,N,G]=await Promise.all([hQ("/proc/self/cwd"),r8("/proc/self/fd"),n8("/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"?Z1():"/bin/bash";if(!V)return process.stderr.write(`Reason worker: ${process.platform==="win32"?t8:"bash is unavailable"}
25
+ `),!1;return Q(V,["--noprofile","--norc","-c",`printf ${m$}`],Y)},jobs:(Y)=>O8($,Y),environment:(Y)=>W8($,J,Y),preview:(Y)=>E8(J,Y),boundPty:(Y)=>b1(Y),desktopDisplay:()=>U5(),desktopAutomation:async()=>{let Y=e3();if(Y)process.stderr.write(`Reason worker: computer and browser use need setup (${Y})
26
+ `);return V5()},desktopBrowser:async()=>k1()?.features.browser===!0,fullControlShell:(Y)=>{let V=X5(),N=uQ(V,`printf ${m$}`);return N?Q(V,N,Y):Promise.resolve(!1)}}}function e3(){return process.platform==="darwin"&&k1()?.features.computer===!0?Y5():null}var $9=["pty.start","tunnel.open","tunnel.close","preview.serve.v1","display.stream.v1","automation.call.v1","browser.pr-proof.v1"];async function pQ($,J,Z=new AbortController().signal,Q={read:!0,write:!1},X=o3()){return y1($,J,Z,Q,X).final}function y1($,J,Z=new AbortController().signal,Q={read:!0,write:!1},X=o3(),Y,V){let N,G;try{if(U$($),m0(),!J)e(g($),!0),N=r3(b2(g($),"probe-")),J=dQ($,N);G=J}catch(O){let F=Promise.reject(O);return F.catch(()=>{}),{initial:F,final:F,pty:F}}let H=async(O,F)=>{if(Z.aborted||!F&&!G[O])return!1;let z,j=new Promise((D)=>{z=()=>D(!1)});Z.addEventListener("abort",z,{once:!0});try{return await Promise.race([F??G[O](Z),j])===!0&&!Z.aborted}catch{return!1}finally{Z.removeEventListener("abort",z)}},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,F,z,j,D,R,I,C,P]=await Promise.all([Promise.resolve(Q).then((h)=>h.read?H("workspaceRead"):!1,()=>!1),Promise.resolve(Q).then((h)=>h.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&&(!R||!I||!C)&&!V)await B;if(M){if(!R)R=await H("bash");if(!I)I=await H("jobs");if(!C)C=await H("environment")}return{read:O,write:F,shell:z,git:j,processes:D,bash:R,jobs:I,environment:C,full:P}})(),L=(O,F)=>{let{read:z,write:j,shell:D,git:R,processes:I,bash:C,jobs:P,environment:h,full:S}=O,{preview:k,boundPty:p,desktopDisplay:b,desktopAutomation:x,desktopBrowser:E}=F,A=J5(),y=M&&process.platform==="darwin"&&S&&yQ("/Library/Developer/PrivateFrameworks/CoreSimulator.framework");return Object.freeze({"fs.read":z,"fs.write":j,"inference.custom.v1":M&&z,"fs.export":z&&A,"fs.import":j&&A,"exec.run":D&&X,"git.run":D&&R&&X,"process.list":(process.platform==="linux"||process.platform==="win32"||D)&&I,"ports.list":(process.platform==="linux"||process.platform==="win32"||D)&&I,"exec.full":C&&S&&X,"hands.connect":z&&j&&C&&P,"jobs.control":z&&j&&C&&P,"pty.start":z&&j&&C&&P&&h&&p,"environment.install":z&&j&&C&&P&&h,"github.local.v1":(process.platform==="darwin"||process.platform==="win32"||process.platform==="linux"&&process.geteuid?.()!==0)&&z&&j&&C&&P&&h,"tunnel.open":z&&j&&C&&P&&h&&k,"tunnel.close":z&&j&&C&&P&&h&&k,"preview.serve.v1":z&&C&&P&&k&&S,"display.stream.v1":b,"automation.call.v1":x,"simulator.call.v1":y,"simulator.stream.v1":y,"browser.pr-proof.v1":x&&E&&e8()===null&&process.platform!=="win32","workspace.setup.v1":M&&Z5()})},T=q.then(async(O)=>L(O,{preview:!1,boundPty:await Promise.race([U,new Promise((F)=>setImmediate(()=>F(!1)))]),desktopDisplay:!1,desktopAutomation:!1,desktopBrowser:!1})),_=(async()=>{try{let O=await q,[F,z,j,D,R]=await B;if(M&&!z&&O.read&&O.write&&O.bash&&O.jobs&&O.environment)z=await H("boundPty");return L(O,{preview:F,boundPty:z,desktopDisplay:j,desktopAutomation:D,desktopBrowser:R})}finally{if(N)G5(N,{recursive:!0,force:!0})}})();T.catch(()=>{});let W=(async()=>{let O=await q;if(!(O.read&&O.write&&O.bash&&O.jobs&&O.environment))return!1;return await U||(await _)["pty.start"]===!0})();return W.catch(()=>{}),{initial:T,final:_,pty:W}}var lQ=["hands.connect","jobs.control","pty.start","environment.install","tunnel.open","tunnel.close","preview.serve.v1"],cQ=[60000,300000,900000];function n3($,J){if($.executionMode!=="host"||J["fs.read"]!==!0)return[];return lQ.filter((Z)=>J[Z]!==!0)}function K5($){let J=$.log??((Y)=>{process.stderr.write(Y)}),Z=$.resolve??((Y)=>pQ($.config,void 0,Y,$.permissions)),Q=$.readiness,X=n3($.config,Q);if(X.length===0)return Promise.resolve();return J(`Reason worker: withheld at start (${X.join(", ")}); probing them again while idle.
27
+ `),(async()=>{for(let Y of $.delaysMs??cQ){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=n3($.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(", ")}).
28
+ `),$.onReady(Q,N);if(n3($.config,Q).length===0)return}})()}import{execFile as pX}from"child_process";import{createHash as lX,randomUUID as T9}from"crypto";import{lstat as cX,readdir as t5,readFile as XJ,realpath as sX,stat as aX}from"fs/promises";import{basename as iX,join as M9}from"path";import{promisify as nX}from"util";import{createConnection as sQ}from"net";import{endianness as L5}from"os";var h1=4,J9=1e4;class O${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 $=sQ(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=aQ({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>=h1){let J=L5()==="LE"?this.#$.readUInt32LE(0):this.#$.readUInt32BE(0),Z=h1+J;if(this.#$.length<Z)return;let Q=this.#$.subarray(h1,Z);this.#$=this.#$.subarray(Z),this.#G(JSON.parse(Q.toString("utf8")))}}#G($){if(!n0($))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),n0($.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 w2{client;cdp;constructor($){this.client="client"in $?$.client:new O$($),this.cdp=new _5(this.client)}async connect(){return await this.client.connect(),this}close(){this.client.close()}async newTab($={}){let J=await this.client.createTab(),Z=iQ(J,"createTab response"),Q=this.tab(Z);if($.url)await Q.goto($.url,$);return Q}tab($){return new T5(this,$)}getTabs(){return this.client.getTabs()}}class T5{browser;id;playwright;constructor($,J){this.browser=$,this.id=J,this.playwright=new F5(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 F5{tab;constructor($){this.tab=$}waitForLoadState($={}){return this.tab.waitForLoadState($)}domSnapshot(){return this.tab.domSnapshot()}}class _5{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(n0(Q)&&n0(Q.exceptionDetails))throw Error(String(Q.exceptionDetails.text??"Open Browser Use evaluation failed"));return n0(Q)&&n0(Q.result)?Q.result.value??null:null}async navigate($,J,Z={}){if(!J)throw Error("goto requires a URL");let Q=Z.waitUntil??"load";q5(Q);let X=Z.timeoutMs??J9;await this.call($,"Page.enable");let Y=this.waitForLoadEvent($,Q,X),V=await this.call($,"Page.navigate",{url:J},{timeoutMs:X});if(n0(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(M5(G,Q))return;throw N}),V}async waitForLoadState($,J={}){let Z=J.state??"load";q5(Z),await this.call($,"Page.enable");let Q=await this.readDocumentState($);if(M5(Q,Z))return;await this.waitForLoadEvent($,Z,J.timeoutMs??J9)}async readDocumentState($){try{let J=await this.evaluate($,"({ href: window.location.href, readyState: document.readyState })");return n0(J)?{href:Z9(J.href),readyState:Z9(J.readyState)}:void 0}catch{return}}waitForEvent($,J,Z={}){let Q=Z.timeoutMs??J9;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=nQ(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 aQ($){let J=Buffer.from(JSON.stringify($),"utf8"),Z=Buffer.alloc(h1+J.length);if(L5()==="LE")Z.writeUInt32LE(J.length,0);else Z.writeUInt32BE(J.length,0);return J.copy(Z,h1),Z}function n0($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function iQ($,J){if(!n0($))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 q5($){if($!=="domcontentloaded"&&$!=="load")throw Error(`Unsupported load state "${$}". Use "domcontentloaded" or "load".`)}function M5($,J){if($?.readyState==="complete")return!0;return J==="domcontentloaded"&&$?.readyState==="interactive"}function nQ($,J){if($.method!=="onCDPEvent"||!n0($.params))return null;let Z=$.params.source;if(!n0(Z)||Z.tabId!==J)return null;return{method:Z9($.params.method)}}function Z9($){return typeof $==="string"?$:void 0}import{createHash as rQ}from"crypto";function j5($,J,Z,Q){let X=JSON.stringify([$.trim().toLowerCase(),J.trim().toLowerCase(),Z,Q]);return`reason-cloud-${rQ("sha256").update(X).digest("hex")}`}import{AsyncLocalStorage as gX}from"async_hooks";import{isDeepStrictEqual as n5}from"util";import{createHash as uX}from"crypto";var tQ=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 oQ=new Set(["png","jpg","jpeg","gif","webp"]),eQ=new Set(["webm","mp4"]);function $X($){if(!$)return null;try{return new URL($).origin}catch{return null}}function D5($,J){let Z;try{Z=new URL($)}catch{return null}let Q=$X(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=tQ.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=oQ.has(H)?"image":eQ.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 JX=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,y2=($)=>Boolean($&&typeof $==="object"&&!Array.isArray($)),g$=()=>{throw Error("cloud_browser_media_request_invalid")};function k2($){if(!y2($)||Object.keys($).some((Y)=>!["runId","configuredMediaOrigin","media"].includes(Y))||typeof $.runId!=="string"||!JX.test($.runId)||typeof $.configuredMediaOrigin!=="string"||$.configuredMediaOrigin.length>2048||!Array.isArray($.media)||$.media.length<1||$.media.length>8)return g$();let J;try{J=new URL($.configuredMediaOrigin)}catch{return g$()}if(J.protocol!=="https:"||J.username||J.password||J.port||!W5(J.origin,{mode:"public_web"}).allowed)return g$();let Z=$.runId.toLowerCase(),Q=new Set,X=$.media.map((Y)=>{if(!y2(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 g$();let V=D5(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 g$();if(Q.add(Y.url),Y.sourceUrl!==Y.url){let N;try{N=new URL(Y.sourceUrl)}catch{return g$()}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 g$()}return{url:Y.url,sourceUrl:Y.sourceUrl,kind:Y.kind}});return{runId:$.runId,configuredMediaOrigin:J.origin,media:X}}function O5($,J){let Z=()=>{throw Error("cloud_browser_media_verification_failed")};if(!y2($)||$.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(!y2(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 X9="browser.pr-proof.v1",j0=K.string().uuid(),Q1=K.string().regex(/^[a-f0-9]{64}$/),d$=K.iso.datetime({precision:3}),Q9=K.string().regex(/^[a-zA-Z0-9_-]{1,160}$/),C5=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])),l0=K.object({kind:K.literal("primary_mac"),version:K.literal(1),organizationId:Q9,userId:Q9,sessionId:Q9,runId:j0,deviceId:j0,rootId:j0,rootRevision:K.string().min(1).max(64),binding:K.enum(["workspace_source","mcp_control"]),targetRevision:K.number().int().nonnegative(),generation:j0,profile:K.string().regex(/^(Default|Profile [0-9]+)$/),extensionInstanceId:K.string().min(1).max(1024)}).strict().refine(($)=>$.binding!=="workspace_source"||$.targetRevision===0),ZX=K.custom().transform(($,J)=>{try{return R5($)}catch{return J.addIssue({code:"custom",message:"proof_visual_contract_invalid"}),K.NEVER}}),X1=K.object({version:K.literal(1),owner:l0,contextId:j0,preparedAt:d$,expiresAt:d$,prUrl:C5,headSha:K.string().regex(/^[a-f0-9]{40}$/),skillDigest:Q1,evidenceKind:K.enum(["image","video"]),visualPlan:ZX.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),Y9=K.object({version:K.literal(1),producer:K.literal("primary_mac"),context:X1,captureId:j0,operationId:j0,attemptId:j0,tabId:K.number().int().positive(),startedAt:d$,finishedAt:d$,sha256:Q1,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"})}),xN=K.discriminatedUnion("action",[K.object({action:K.literal("screenshot"),context_id:j0,tab_id:K.number().int().positive()}).strict(),K.object({action:K.literal("start_video"),context_id:j0,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:j0}).strict()]),f2=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(),h2=K.string().regex(/^[1-9][0-9]{0,19}$/),f1=K.object({version:K.literal(1),owner:l0,expectedActorId:h2.nullable(),repositoryId:h2,repositoryFullName:K.string().max(200).regex(/^[A-Za-z0-9_-]+\/[A-Za-z0-9_.-]+$/).refine(($)=>![".",".."].includes($.split("/")[1]))}).strict(),QX=["browser_unavailable","github_page_unavailable","identity_check_failed","operation_incomplete","attachment_unavailable"],V9=K.discriminatedUnion("status",[f1.extend({status:K.literal("ready"),observedActor:f2,checkedAt:d$}),f1.extend({status:K.literal("not_ready"),reason:K.enum(["authentication_required","identity_mismatch","authority_lost","unavailable"]),cause:K.enum(QX).optional()})]).refine(($)=>$.status!=="ready"||$.expectedActorId===null||$.observedActor.id===$.expectedActorId),u$=K.object({version:K.literal(1),owner:l0,expectedActorId:h2.nullable(),authenticatedActor:f2,attemptId:j0,captureId:j0,prUrl:C5,repositoryId:h2,headSha:K.string().regex(/^[a-f0-9]{40}$/),sha256:Q1,sizeBytes:K.number().int().min(128).max(10485760),contentType:K.literal("video/webm")}).strict(),P5=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}$/),Y1=K.discriminatedUnion("status",[u$.extend({status:K.literal("not_attempted"),reason:K.enum(["authentication_required","attachment_unavailable","identity_mismatch","capture_invalid","authority_lost"])}),u$.extend({status:K.literal("uncertain"),reason:K.literal("upload_outcome_unknown")}),u$.extend({status:K.literal("uploaded"),observedActor:f2,nativeUrl:P5,uploadedAt:d$})]).refine(($)=>($.expectedActorId===null||$.authenticatedActor.id===$.expectedActorId)&&($.status!=="uploaded"||$.observedActor.id===$.authenticatedActor.id&&$.observedActor.login===$.authenticatedActor.login)),v1=u$.extend({nativeUrl:P5,observedActor:f2,bodySha256:Q1}),G9=K.discriminatedUnion("status",[v1.extend({status:K.literal("incomplete"),reason:K.enum(["authentication_required","identity_mismatch","playback_unverified","authority_lost"])}),v1.extend({status:K.literal("verified"),sourceSha256:Q1,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:d$})]).refine(($)=>($.expectedActorId===null||$.authenticatedActor.id===$.expectedActorId)&&$.observedActor.id===$.authenticatedActor.id&&$.observedActor.login===$.authenticatedActor.login&&($.status!=="verified"||$.sourceSha256===$.sha256)),XX=K.custom().transform(($,J)=>{try{let Z=k2($);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}}),YX=K.discriminatedUnion("action",[K.object({action:K.literal("auth_check"),input:f1}).strict(),K.object({action:K.literal("prepare"),context:X1}).strict(),K.object({action:K.literal("capture_png"),owner:l0,contextId:j0,tabId:K.number().int().positive()}).strict(),K.object({action:K.literal("start_video"),owner:l0,contextId:j0,tabId:K.number().int().positive(),seconds:K.number().int().min(1).max(15)}).strict(),K.object({action:K.literal("inspect_capture"),owner:l0,captureId:j0}).strict(),K.object({action:K.literal("publish_video"),input:u$}).strict(),K.object({action:K.literal("verify_png_media"),owner:l0,media:XX}).strict().refine(($)=>$.media.runId===$.owner.runId),K.object({action:K.literal("verify_saved_media"),input:v1}).strict(),K.object({action:K.literal("publish_png"),owner:l0,attemptId:j0,captureId:j0,sha256:Q1,sizeBytes:K.number().int().min(24).max(8388608),storagePath:K.string().max(512),uploadUrl:K.string().url().max(8192)}).strict()]);var I5="pr-proof.stop.v1",B9=K.object({requestId:j0,command:YX}).strict();var VX={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},z5={type:"string",format:"uuid",description:"capture_context_id from tools.pr.prepareProof."},A5={type:"integer",minimum:1,description:"An already-owned tab's id."},SN={...VX,oneOf:[{type:"object",required:["action","context_id","tab_id"],additionalProperties:!1,properties:{action:{type:"string",const:"screenshot"},context_id:z5,tab_id:A5}},{type:"object",required:["action","context_id","tab_id","seconds"],additionalProperties:!1,properties:{action:{type:"string",const:"start_video"},context_id:z5,tab_id:A5,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 GX,randomUUID as BX}from"crypto";import{isDeepStrictEqual as V1}from"util";var E5=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"),K9=($)=>GX("sha256").update($).digest("hex");function x5($){let J=l0.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 L=[...Q.entries()].filter(([,_])=>_.claim.contextId===B);if((await Promise.allSettled(L.map(([,_])=>N(_)))).some((_)=>_.status==="rejected"))throw G0();for(let[_]of L)Q.delete(_);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 L=E5.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 T=V(L.contextId);if(q==="video"&&T.evidenceKind!=="video")throw G0();let _=Q.get(L.operationId);if(_){if(!V1(_.claim,L)||_.kind!==q||_.seconds!==B.seconds||_.controller.signal.aborted)throw G0();let I=await _.completion;if(await Y(),V(L.contextId),_.controller.signal.aborted)throw G0();return structuredClone(I)}if(Q.size>=16||[...Q.values()].some((I)=>!I.receipt&&!I.controller.signal.aborted&&I.claim.tabId===L.tabId))throw G0();let W,O,F=new Promise((I,C)=>{W=I,O=C});F.catch(()=>{});let z={claim:L,kind:q,seconds:B.seconds,controller:new AbortController,completion:F,stopRequested:!1,started:!1};Q.set(L.operationId,z);let j=()=>{N(z).catch(()=>{})};B.signal.addEventListener("abort",j,{once:!0});let D=async()=>{await Y(),V(L.contextId),B.signal.throwIfAborted(),z.controller.signal.throwIfAborted()},R;try{await D();let I;if(q==="image"){let C=new Date().toISOString();R=await $.screenshot(structuredClone(T),L.tabId,z.controller.signal);let P=new Date().toISOString();if(await D(),R.length<24||R.length>8388608||!R.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))||R.readUInt32BE(8)!==13||R.toString("ascii",12,16)!=="IHDR")throw G0();I=Y9.parse({version:1,producer:"primary_mac",context:T,captureId:BX(),operationId:L.operationId,attemptId:L.attemptId,tabId:L.tabId,startedAt:C,finishedAt:P,sha256:K9(R),media:{contentType:"image/png",sizeBytes:R.length,width:R.readUInt32BE(16),height:R.readUInt32BE(20)}})}else{if(z.host=await $.createVideo(structuredClone(T),L.tabId,B.seconds,z.controller.signal),z.controller.signal.aborted||B.signal.aborted||X)throw await z.host.close(),G0();await z.host.start(),z.started=!0;let C=z.host.completed();if(C.catch(()=>{}),await D(),await B.started?.(),z.stopRequested)M(z);let P=await C;if(z.stop)await z.stop;await D();let h=await z.host.read(P.captureId);R=h.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:L.tabId};if(!V1(P,h.capture)||!V1(P.owner,S)||R.length!==P.sizeBytes||K9(R)!==P.sha256||R.length<128||R.readUInt32BE(0)!==440786851)throw G0();await z.host.close(),await D(),I=Y9.parse({version:1,producer:"primary_mac",context:T,captureId:P.captureId,operationId:L.operationId,attemptId:L.attemptId,tabId:L.tabId,startedAt:P.startedAt,finishedAt:P.finishedAt,sha256:P.sha256,media:{contentType:"video/webm",sizeBytes:P.sizeBytes,durationSeconds:P.durationSeconds,frameCount:P.frameCount,receivedFrameCount:P.receivedFrameCount}})}if(await D(),[...Q.values()].reduce((C,P)=>C+(P.bytes?.length??0),R.length)>20971520)throw G0();return z.bytes=Buffer.from(R),z.receipt=I,W(I),structuredClone(I)}catch(I){let C=q==="video"&&!B.signal.aborted&&!z.controller.signal.aborted&&I instanceof Error&&I.message==="mac_recording_worker_failed:no_frames"?new h0("proof_capture_no_frames","The owned tab emitted no recording frames."):G0();throw await N(z).catch(()=>{}),O(C),C}finally{R?.fill(0),B.signal.removeEventListener("abort",j)}}return{async prepare(B){let q=X1.parse(B);if(!V1(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 L=Z.get(q.contextId);if(L){if(!V1(L,q))throw G0();return structuredClone(L)}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=E5.parse(B);await Y(),V(q.contextId);let L=Q.get(q.operationId);if(!L||L.kind!=="video"||!V1(q,L.claim)||L.controller.signal.aborted)throw G0();M(L)},async publicationCapture(B){await Y(),await G();let q=[...Q.values()].find((L)=>L.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||K9(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((L)=>L.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 y5,randomUUID as FX}from"crypto";import{isDeepStrictEqual as m1}from"util";import{realpath as _X}from"fs/promises";var S5=String.raw`async (media) => {
29
+ const deadline = (promise) => {
30
+ let timer;
31
+ return Promise.race([promise, new Promise((_, reject) => {
32
+ timer = setTimeout(() => reject(new Error("media_decode_timeout")), 12000);
33
+ })]).finally(() => clearTimeout(timer));
34
+ };
35
+ const items = await Promise.all(media.map(async (item) => {
36
+ const element = document.createElement(item.kind === "image" ? "img" : "video");
37
+ document.body.append(element);
38
+ try {
39
+ if (item.kind === "image") {
40
+ element.src = item.sourceUrl;
41
+ await deadline(element.decode());
42
+ if (!element.complete || !element.naturalWidth || !element.naturalHeight) throw new Error("media_image_not_decoded");
43
+ return { ...item, width: element.naturalWidth, height: element.naturalHeight };
44
+ }
45
+ element.muted = true;
46
+ element.playsInline = true;
47
+ element.preload = "auto";
48
+ const loaded = new Promise((resolve, reject) => {
49
+ element.addEventListener("loadeddata", resolve, { once: true });
50
+ element.addEventListener("error", () => reject(new Error("media_video_not_decoded")), { once: true });
51
+ });
52
+ element.src = item.sourceUrl;
53
+ await deadline(loaded);
54
+ if (!element.videoWidth || !element.videoHeight || !Number.isFinite(element.duration) || element.duration <= 0) throw new Error("media_video_not_decoded");
55
+ const initial = element.currentTime;
56
+ await deadline(element.play());
57
+ await deadline(new Promise((resolve, reject) => {
58
+ let timer;
59
+ const check = () => {
60
+ if (element.error) { clearTimeout(timer); reject(new Error("media_video_not_decoded")); return; }
61
+ if (element.currentTime - initial >= 0.05) { clearTimeout(timer); resolve(); return; }
62
+ timer = setTimeout(check, 25);
63
+ };
64
+ element.addEventListener("pause", () => { clearTimeout(timer); reject(new Error("media_video_not_advancing")); }, { once: true });
65
+ check();
66
+ }));
67
+ return { ...item, width: element.videoWidth, height: element.videoHeight, advancedSeconds: element.currentTime - initial };
68
+ } finally {
69
+ if (item.kind === "video") element.pause();
70
+ element.removeAttribute("src");
71
+ element.remove();
72
+ }
73
+ }));
74
+ return { verified: true, items };
75
+ }`;var b5=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"),L=J.document.querySelector("#fc-new_comment_field"),T=q?.closest("file-attachment"),_=q?.closest("form"),W=new J.URL(V.prUrl).pathname+"/comment";if(!q||q.value!==""||!L||L.type!=="file"||L.disabled||!T||T.getAttribute("input")!==L.id||T.getAttribute("data-upload-repository-id")!==V.repositoryId||!_||new J.URL(_.action,J.location.href).origin!=="https://github.com"||new J.URL(_.action,J.location.href).pathname!==W)return{ok:!1,reason:"attachment_unavailable"};let O=T.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=(W)=>{try{let O=new J.URL(W,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((W)=>/^issue-[1-9][0-9]*$/.test(W.closest('[id^="issue-"]')?.id||"")&&!W.closest("form")&&!W.closest(".preview-content"));if(G.length!==1)throw Error("saved_body_missing");let H=G[0],M=[...H.querySelectorAll("video")].filter((W)=>[W.currentSrc,W.src,...[...W.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,L=J.setTimeout(()=>q.abort(),12000),T=(W)=>J.Promise.race([W,new J.Promise((O,F)=>{if(q.signal.aborted)F(Error("playback_timeout"));else q.signal.addEventListener("abort",()=>F(Error("playback_timeout")),{once:!0})})]),_=async(W)=>{while(!W()){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 _(()=>U.readyState>=2&&U.videoWidth>0&&U.videoHeight>0);let W=U.currentSrc;if(!N(W))throw Error("source_unbound");let O=await T(J.fetch(W,{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 F=O.headers.get("content-length");if(F!==null&&(!/^[1-9][0-9]*$/.test(F)||Number(F)!==X.sizeBytes))throw Error("source_size_mismatch");let z=O.body.getReader(),j=[],D=0;try{for(;;){let k=await T(z.read());if(k.done)break;if(D+=k.value.length,D>10485760||D>X.sizeBytes)throw Error("source_too_large");j.push(k.value)}}finally{await z.cancel().catch(()=>{}),z.releaseLock()}if(D!==X.sizeBytes)throw Error("source_size_mismatch");let R=new J.Uint8Array(D),I=0;for(let k of j)R.set(k,I),I+=k.length;let C=[...new J.Uint8Array(await T(J.crypto.subtle.digest("SHA-256",R)))].map((k)=>k.toString(16).padStart(2,"0")).join("");if(C!==X.sha256||U.currentSrc!==W||!H.contains(U))throw Error("source_changed");let P=U.currentTime,h=U.getVideoPlaybackQuality().totalVideoFrames;if(await T(U.play()),await _(()=>U.currentTime-P>=0.05&&U.getVideoPlaybackQuality().totalVideoFrames>h),!Q(X,!1).ok||U.currentSrc!==W||!H.contains(U)||U.error)throw Error("player_changed");return{status:"verified",sourceSha256:C,width:U.videoWidth,height:U.videoHeight,durationSeconds:U.duration,advancedSeconds:U.currentTime-P,advancedFrames:U.getVideoPlaybackQuality().totalVideoFrames-h,playbackRestored:!0}}finally{if(J.clearTimeout(L),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 KX}from"child_process";import{lstat as UX,realpath as NX}from"fs/promises";import{join as w5,resolve as HX}from"path";import{promisify as qX}from"util";var MX=qX(KX);async function LX($,J){let Z=await NX($),{stdout:Q}=await MX(w5(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)&&HX(Y.source)===w5(Z,"Reason Browser Use","manifest.json"))}async function v2($,J,Z){if(!/^(Default|Profile [0-9]+)$/.test(J))throw Error("mac_recording_profile_unavailable");let Q=(await LX($,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 UX(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 TX}from"crypto";function G1($){return`reason-browser-${TX("sha256").update(`reason:mac-browser:v1:${$}`).digest("hex")}`}var k5=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()]),h5=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 U9($){let J=l0.parse($.owner),Z="endpoint"in $?$.endpoint(J):await jX($.automationDirectory,J),Q=new Map,X=`reason-pr-proof-${FX()}`,Y=!1,V=async()=>{if(Y)throw Z0();if(await $.assertCurrent(),Y)throw Z0()},N=async(M)=>{if(!m1(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(!m1(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||y5("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)),L=new w2({socketPath:q.socketPath,sessionId:X,timeoutMs:5000}),T,_=!1,W,O=new Promise((j,D)=>{W=setTimeout(()=>{_=!0,D(Z0())},60000)});O.catch(()=>{});let F=(j)=>Promise.race([j,O]),z=async()=>{if(_)throw Z0();if(await V(),_)throw Z0()};try{await F(L.connect());let j=h5.parse(await F(L.client.getInfo()));if(j.metadata.extensionId!==q.extensionId||j.metadata.extensionInstanceId!==q.instanceId||!j.metadata.nativeHostName)throw Z0();await z(),B?.("connected");let D=L.newTab();D.then((C)=>{if(_)C.close().catch(()=>{Y=!0})},()=>{}),T=await F(D),await z(),await F(T.goto(M,{waitUntil:"domcontentloaded",timeoutMs:15000})),await z(),B?.("loaded");let I=await F(U(T,async(C)=>{await z();let P=await F(T.evaluate(`(${b5.toString()})(${JSON.stringify(C)})`,{awaitPromise:!0}));return await z(),P},z));return await z(),I}finally{_=!0,clearTimeout(W);try{if(T){let j;try{await Promise.race([T.close(),new Promise((D,R)=>{j=setTimeout(()=>R(Z0()),5000)})])}finally{clearTimeout(j)}}}catch{throw Y=!0,Z0()}finally{L.close()}await V()}}return{async screenshot(M,U,B){let q=X1.parse(M);if(await N(q),!Number.isSafeInteger(U)||U<1||Date.parse(q.expiresAt)<=Date.now())throw Z0();B.throwIfAborted();let L=await Z.discover(B),T=new w2({socketPath:L.socketPath,sessionId:Z.tabScope,timeoutMs:5000}),_;try{await T.connect();let W=h5.parse(await T.client.getInfo());if(W.metadata.extensionId!==L.extensionId||W.metadata.extensionInstanceId!==L.instanceId)throw Z0();if(!K.array(K.object({id:K.number()})).max(256).parse(await T.getTabs()).some((z)=>z.id===U))throw Z0();await V(),B.throwIfAborted();let F=K.object({data:K.string().max(Math.ceil(2796202.6666666665)*4)}).strict().parse(await T.cdp.call(U,"Page.captureScreenshot",{format:"png",fromSurface:!0,captureBeyondViewport:!1}));if(!/^[A-Za-z0-9+/]+={0,2}$/.test(F.data)||F.data.length%4)throw Z0();if(_=Buffer.from(F.data,"base64"),_.toString("base64")!==F.data||_.length>8388608)throw Z0();if(await V(),B.throwIfAborted(),Date.parse(q.expiresAt)<=Date.now())throw Z0();return _}catch{throw _?.fill(0),Z0()}finally{T.close()}},async verifyImages(M){let U=k2(M);if(U.runId!==J.runId||U.media.some((B)=>B.kind!=="image"))throw Z0();return H("about:blank",async(B,q,L)=>{let T=B.browser.client,_=new Set(U.media.map((C)=>C.sourceUrl)),W=new Map,O=new Set,F=!1,z=0,j=!1,D=new Set,R=(C,P)=>{if(D.size>=32){F=!0;return}let h=T.executeCdp(B.id,C,P);D.add(h),h.catch(()=>{F=!0}).finally(()=>D.delete(h))},I=T.onNotification((C)=>{if(C.method!=="onCDPEvent"||!q$(C.params)||!q$(C.params.source)||C.params.source.tabId!==B.id||!q$(C.params.params))return;let P=C.params.params;if(++z>512){F=!0;return}if(C.params.method==="Fetch.requestPaused"){let k=typeof P.requestId==="string"&&q$(P.request)&&P.request.method==="GET"&&typeof P.request.url==="string"&&_.has(P.request.url)&&P.resourceType==="Image";if(typeof P.requestId!=="string"){F=!0;return}if(!k)F=!0;R(k?"Fetch.continueRequest":"Fetch.failRequest",{requestId:P.requestId,...k?{}:{errorReason:"BlockedByClient"}})}if(C.params.method==="Network.requestWillBeSent"&&P.redirectResponse)F=!0;if(C.params.method==="Network.loadingFailed")F=!0;if(C.params.method==="Network.loadingFinished"&&typeof P.requestId==="string")O.add(P.requestId);if(C.params.method!=="Network.responseReceived")return;if(!q$(P.response)||typeof P.response.url!=="string"||!_.has(P.response.url)||typeof P.requestId!=="string"||!q$(P.response.headers)||P.type!=="Image"){F=!0;return}let h=Object.fromEntries(Object.entries(P.response.headers).map(([k,p])=>[k.toLowerCase(),p])),S=Number(h["content-length"]);if(W.has(P.response.url)||P.response.status!==200||P.response.fromServiceWorker===!0||typeof h["content-length"]!=="string"||!/^[1-9][0-9]*$/.test(h["content-length"])||!Number.isSafeInteger(S)||S>8388608||h["content-range"]||h["content-encoding"]&&h["content-encoding"]!=="identity"){F=!0;return}W.set(P.response.url,{id:P.requestId,length:S})});try{await T.executeCdp(B.id,"Network.enable",{maxTotalBufferSize:67108864,maxResourceBufferSize:8388608}),await T.executeCdp(B.id,"Network.setBypassServiceWorker",{bypass:!0}),await T.executeCdp(B.id,"Network.setCacheDisabled",{cacheDisabled:!0}),await T.executeCdp(B.id,"Fetch.enable",{patterns:[{urlPattern:"*",requestStage:"Request"}]});let C=K.object({frameTree:K.object({frame:K.object({id:K.string().min(1).max(256)})})}).parse(await T.executeCdp(B.id,"Page.getFrameTree",{})),P=[...new Set(U.media.map((k)=>new URL(k.sourceUrl).origin))].join(" ");await T.executeCdp(B.id,"Page.setDocumentContent",{frameId:C.frameTree.frame.id,html:`<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src ${P}; style-src 'none'"><body></body>`}),await L(),j=!0;try{await T.executeCdp(B.id,"Emulation.setFocusEmulationEnabled",{enabled:!0})}catch{throw new h0("mac_pr_proof_png_render_failed","mac_pr_proof_png_render_failed")}await L();let h;try{h=await B.evaluate(`(${S5})(${JSON.stringify(U.media)})`,{awaitPromise:!0})}catch{throw new h0("mac_pr_proof_png_decode_failed","mac_pr_proof_png_decode_failed")}if(await L(),!q$(h)||!Array.isArray(h.items)||h.items.length!==U.media.length)throw Z0();await Promise.all(D);let S=[];for(let k=0;k<U.media.length;k++){await V();let p=W.get(U.media[k].sourceUrl);if(F||!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 T.executeCdp(B.id,"Network.getResponseBody",{requestId:p.id})),x=Buffer.from(b.body,"base64");try{let E=h.items[k];if(x.length!==p.length||x.toString("base64")!==b.body||!q$(E))throw Z0();S.push({...E,sourceSha256:y5("sha256").update(x).digest("hex")})}finally{x.fill(0)}}if(F)throw Z0();return O5({verified:!0,items:S},U)}finally{if(I(),await Promise.allSettled(D),j)try{await T.executeCdp(B.id,"Emulation.setFocusEmulationEnabled",{enabled:!1})}catch{throw new h0("mac_pr_proof_png_render_cleanup_failed","mac_pr_proof_png_render_cleanup_failed")}}})},async preflight(M){let U=f1.parse(M);await N(U);let B="browser_unavailable";try{return await H(`https://github.com/${U.repositoryFullName}`,async(q,L)=>{let T=k5.parse(await L({operation:"preflight",expected:{...U,prUrl:`https://github.com/${U.repositoryFullName}`}}));return V9.parse(T.ok?{...U,status:"ready",observedActor:T.actor,checkedAt:new Date().toISOString()}:T.reason==="attachment_unavailable"?{...U,status:"not_ready",reason:"unavailable",cause:"attachment_unavailable"}:{...U,status:"not_ready",reason:T.reason})},(q)=>{B=q==="connected"?"github_page_unavailable":"identity_check_failed"})}catch{return V9.parse({...U,status:"not_ready",reason:"unavailable",cause:B})}},async publish(M){let U=u$.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(!m1(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:Y1.parse({...U,status:"uncertain",reason:"upload_outcome_unknown"})};Q.set(U.attemptId,q);let L=!1,T="dispatch";try{(await G(U)).bytes.fill(0),q.result=await H(U.prUrl,async(_,W)=>{let O=k5.parse(await W({operation:"identity",expected:U}));if(!O.ok)return Y1.parse({...U,status:"not_attempted",reason:O.reason});let F=await G(U),z;try{L=!0,z=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 W({operation:"upload",expected:U,base64:F.bytes.toString("base64")}))}finally{F.bytes.fill(0)}if(!z.dispatched)return L=!1,Y1.parse({...U,status:"not_attempted",reason:z.reason});if(!m1(z.actor,O.actor))throw T="actor_changed",Z0();T="result";let j=performance.now();while(performance.now()-j<30000){let D=await W({operation:"upload_result",expected:{...U,observedActor:O.actor}});if(D!==null){let R=K.object({nativeUrl:K.string(),actor:K.object({login:K.string(),id:K.string().nullable()}).strict()}).strict().parse(D);return T="finalize",await V(),Y1.parse({...U,status:"uploaded",nativeUrl:R.nativeUrl,observedActor:R.actor,uploadedAt:new Date().toISOString()})}await new Promise((R)=>setTimeout(R,100))}throw T="result_timeout",Z0()})}catch{if(L)process.stderr.write(`Reason PR proof: video upload outcome unknown (stage=${T})
76
+ `);q.result=Y1.parse({...U,...L?{status:"uncertain",reason:"upload_outcome_unknown"}:{status:"not_attempted",reason:"capture_invalid"}})}return structuredClone(q.result)},async verify(M){let U=v1.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 L=await q({operation:"saved_player",expected:U});if(!L||typeof L!=="object"||Array.isArray(L))throw Z0();let T=G9.parse({...U,...L,..."status"in L&&L.status==="verified"?{verifiedAt:new Date().toISOString()}:{}});if(Object.entries(U).some(([_,W])=>!m1(W,T[_])))throw Z0();return T}finally{await B.browser.client.executeCdp(B.id,"Emulation.setFocusEmulationEnabled",{enabled:!1})}})}catch{return G9.parse({...U,status:"incomplete",reason:"playback_unverified"})}},close(){Y=!0}}}async function jX($,J){let Z=await _X($);return{async discover(Q){let X=await v2(Z,J.profile,Q);if(X.instanceId!==J.extensionInstanceId)throw Z0();return X},tabScope:G1(J.runId)}}import{realpath as mX}from"fs/promises";var UH=K.object({version:K.literal(1),recording_operation_id:K.string().uuid(),proof_ready:K.literal(!1),acknowledged_at:K.iso.datetime()}).strict(),m2=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(),f5=K.object({action:K.literal("inspect"),recording_operation_id:K.string().uuid()}).strict(),NH=K.discriminatedUnion("action",[m2,f5]),v5=K.object({recording_operation_id:K.string().uuid()}).strict(),N9={device_id:K.string().uuid(),root_id:K.string().uuid()},DX=K.discriminatedUnion("action",[m2.extend(N9),f5.extend(N9),v5.extend({...N9,action:K.literal("stop")})]),HH=K.toJSONSchema(DX),qH=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 zH=m2.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 xX,randomUUID as SX}from"crypto";import{mkdtemp as bX,realpath as wX,rm as s5}from"fs/promises";import{tmpdir as yX}from"os";import{join as kX}from"path";import{spawn as hX}from"child_process";import{isDeepStrictEqual as fX}from"util";import{createHash as WX}from"crypto";import{execFile as OX}from"child_process";import{chmod as zX,lstat as g5,mkdtemp as AX,readFile as u5,realpath as d5,rm as RX,writeFile as m5}from"fs/promises";import{tmpdir as CX}from"os";import{isAbsolute as PX,join as g2}from"path";import{promisify as IX}from"util";var H9=IX(OX),EX=($)=>WX("sha256").update($).digest("hex");async function $$($){if(!PX($.path)||!/^[a-f0-9]{64}$/.test($.sha256)||await d5($.path)!==$.path)throw Error("mac_recording_encoder_unqualified");let J=await g5($.path);if(!J.isFile()||!(J.mode&73)||J.mode&18||J.size>134217728||EX(await u5($.path))!==$.sha256)throw Error("mac_recording_encoder_unqualified")}async function g1($,J){if(!$)return null;let Z=structuredClone($);try{await Promise.all([$$(Z.ffmpeg),$$(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([$$(Z.ffmpeg),$$(Z.ffprobe)]);let V=await d5(await AX(g2(J??CX(),"reason-owned-recording-")));await zX(V,448);let N=g2(V,"capture.webm"),G="frames";try{let H=["ffconcat version 1.0"];for(let[_,W]of Q.entries()){let O=`${_}.jpg`;await m5(g2(V,O),W.jpeg,{mode:384,flag:"wx"});let F=Q[_+1]?.timestamp??Q[0].timestamp+X;H.push(`file '${O}'`,`duration ${Math.max(0.001,F-W.timestamp).toFixed(6)}`)}H.push(`file '${Q.length-1}.jpg'`),await m5(g2(V,"frames.ffconcat"),H.join(`
77
+ `)+`
78
+ `,{mode:384,flag:"wx"});let M={cwd:V,signal:Y,timeout:15000,maxBuffer:16384,env:{PATH:"/usr/bin:/bin"}};G="encode",await H9(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 g5(N);if(!U.isFile()||U.isSymbolicLink()||U.nlink!==1||U.size<128||U.size>10485760)throw Error();G="probe";let{stdout:B}=await H9(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),L=q.streams,T=Number(q.format?.duration);if(G="probe_streams",!Array.isArray(L)||L.length!==1||L[0]?.codec_type!=="video"||L[0]?.codec_name!=="vp8")throw Error();if(G="probe_dimensions",!Number.isSafeInteger(L[0].width)||L[0].width<2||L[0].width>1600||!Number.isSafeInteger(L[0].height)||L[0].height<2||L[0].height>1000)throw Error();if(G="probe_duration",!Number.isFinite(T)||Math.abs(T-X)>0.25)throw Error();if(G="probe_frames",!Number.isSafeInteger(Number(L[0].nb_read_frames))||Number(L[0].nb_read_frames)<1)throw Error();if(G="probe_format",q.format?.format_name!=="matroska,webm")throw Error();return G="decode",await H9(Z.ffmpeg.path,["-nostdin","-v","error","-xerror","-max_pixels","1600000","-threads","1","-i",N,"-f","null","-"],M),G="pin",await Promise.all([$$(Z.ffmpeg),$$(Z.ffprobe)]),await u5(N)}catch{throw Error(Y.aborted?"mac_recording_cancelled":`mac_recording_encoding_${G}_failed`)}finally{await RX(V,{recursive:!0,force:!0})}}}}var l5=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 J$=K.string().min(1).max(1024),p5=K.object({path:J$,sha256:K.string().regex(/^[a-f0-9]{64}$/)}).strict(),c5=K.object({owner:K.object({runId:J$,deviceId:J$,rootId:J$,rootRevision:J$,profile:K.string().regex(/^(Default|Profile [0-9]+)$/),extensionInstanceId:J$,generation:J$,browserScope:J$,tabId:K.number().int().positive()}).strict(),socketPath:J$,extensionId:K.string().regex(/^[a-p]{32}$/),nativeHostName:J$,seconds:K.number().int().min(1).max(15),encoder:K.object({ffmpeg:p5,ffprobe:p5}).strict()}).strict();var vX=15728640,z$=()=>Error("mac_recording_worker_failed");function a5($){let J=c5.parse($.configuration),Z={...$.worker},Q=new Map,X=!1,Y=!1,V=null,N=async()=>{},G=async(B,q=3000)=>{let L;try{return await Promise.race([B,new Promise((T,_)=>{L=setTimeout(()=>_(z$()),q)})])}finally{clearTimeout(L)}},H=()=>V??=G((async()=>{let q=(await Promise.allSettled([N(),$.cleanup()])).find((L)=>L.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,L=typeof q==="string"&&["ESRCH","EPERM","EACCES","ENOTEMPTY","ENOENT","EBUSY"].includes(q)?q:"unknown";throw Error(`mac_recording_cleanup_failed:${L}`)}),M=null,U=async()=>{if(X)throw z$();if(await G($.assertCurrent()),X)throw z$()};return{async start(){if(Y||M)throw Error("mac_recording_already_active");Y=!0;try{await U(),await $$({path:Z.path,sha256:Z.sha256}),await U(),V=null;let B=await wX(await bX(kX(yX(),"reason-recording-host-")));try{await U()}catch(x){throw await s5(B,{recursive:!0,force:!0}),x}let q=hX(Z.path,[...Z.args??[]],{detached:!0,stdio:["pipe","pipe","ignore"],env:{PATH:"/usr/bin:/bin"}}),L=new Promise((x)=>q.once("close",()=>x())),T=()=>{if(q.pid)try{process.kill(-q.pid,"SIGKILL")}catch(x){if(x.code!=="ESRCH")throw x}},_=null;N=()=>_??=(async()=>{try{T()}catch(x){if(x.code!=="EPERM")throw x}await L;try{for(let x=0;;x++)try{T();break}catch(E){if(E.code!=="EPERM"||x>=20)throw E;await new Promise((A)=>setTimeout(A,25))}}finally{await s5(B,{recursive:!0,force:!0})}})();let W="",O=0,F=!1,z=!1,j=null,D,R,I=new Promise((x,E)=>{D=x,R=E}),C,P,h=new Promise((x,E)=>{C=x,P=E});h.catch(()=>{});let S=(x=z$())=>{if(F)return;F=!0,clearTimeout(k),clearInterval(b),H().then(()=>{R(x),P(x)},(E)=>{R(E),P(E)})},k=setTimeout(()=>S(),(J.seconds+25)*1000),p=!1,b=setInterval(()=>{if(p||F)return;p=!0,U().catch(()=>S()).finally(()=>{p=!1})},250);M={completion:h,stop:()=>{if(!F)q.stdin.write(`{"type":"stop"}
79
+ `)},cancel:()=>S()},q.on("error",()=>S()),q.stdin.on("error",()=>S()),q.stdout.on("data",(x)=>{if(F)return;if(O+=x.length,O>vX){S();return}W+=x.toString("utf8");let E;while((E=W.indexOf(`
80
+ `))!==-1){let A=W.slice(0,E);W=W.slice(E+1);try{let y=JSON.parse(A);if(y.type==="failed"&&Object.keys(y).sort().join(",")==="reason,type"){let r=l5.safeParse(y.reason);S(r.success?Error(`mac_recording_worker_failed:${r.data}`):z$());return}if(y.type==="unsupported"&&!z){S(Error("mac_recording_encoder_unavailable"));return}if(y.type==="started"&&!z&&Object.keys(y).length===1){z=!0,D({recording:!0});continue}if(!z||y.type!=="capture"||j||Object.keys(y).sort().join(",")!=="bytes,capture,type")throw z$();let w=y.capture;if(!w||Object.keys(w).sort().join(",")!=="captureId,contentType,durationSeconds,finishedAt,frameCount,owner,receivedFrameCount,sha256,sizeBytes,startedAt"||typeof w.sha256!=="string"||typeof w.startedAt!=="string"||typeof w.finishedAt!=="string"||!fX(w.owner,J.owner)||w.contentType!=="video/webm"||!/^[a-f0-9]{64}$/.test(w.sha256)||!Number.isSafeInteger(w.sizeBytes)||w.sizeBytes<128||w.sizeBytes>10485760||!Number.isSafeInteger(w.frameCount)||w.frameCount<1||w.frameCount>450||!Number.isSafeInteger(w.receivedFrameCount)||w.receivedFrameCount<w.frameCount||w.receivedFrameCount>2000||!Number.isFinite(w.durationSeconds)||w.durationSeconds<0.05||w.durationSeconds>J.seconds||!Number.isFinite(Date.parse(w.startedAt))||!Number.isFinite(Date.parse(w.finishedAt))||Math.abs((Date.parse(w.finishedAt)-Date.parse(w.startedAt))/1000-w.durationSeconds)>0.1||typeof y.bytes!=="string"||y.bytes.length%4!==0||!/^[A-Za-z0-9+/]+={0,2}$/.test(y.bytes))throw z$();let n=Buffer.from(y.bytes,"base64");if(n.length!==w.sizeBytes||xX("sha256").update(n).digest("hex")!==w.sha256||!n.subarray(0,4).equals(Buffer.from([26,69,223,163])))throw z$();j={capture:Object.freeze({...w,captureId:SX(),owner:Object.freeze({...J.owner})}),bytes:n}}catch{S();return}}}),q.once("close",(x)=>{if(F)return;if(x!==0||!j||W.trim()){S();return}let E=j;U().then(async()=>{if(await N(),F)return;F=!0,clearTimeout(k),clearInterval(b),Q.set(E.capture.captureId,E);while(Q.size>2)Q.delete(Q.keys().next().value);C(E.capture)}).catch(()=>S())}),q.stdin.write(JSON.stringify({...J,scratchDirectory:B})+`
81
+ `);try{return await I}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 i5=K.object({version:K.literal("0.1.42"),metadata:K.object({extensionId:K.string(),extensionInstanceId:K.string(),nativeHostName:K.string()})});async function q9($){await $.assertCurrent();let J;if("discover"in $)J=$.discover;else{let Z=await mX($.automationDirectory);J=(Q,X)=>v2(Z,Q,X)}if(await $$({path:$.worker.path,sha256:$.worker.sha256}),!await g1($.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 O$({socketPath:V.socketPath,sessionId:X,timeoutMs:2000}),G;try{if(await N.connect(),G=i5.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 O$({socketPath:V.socketPath,sessionId:H.browser.browserScope,timeoutMs:2000});return a5({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 L=i5.parse(await B.getInfo());if(L.metadata.extensionInstanceId!==H.browser.extensionInstanceId||L.metadata.extensionId!==V.extensionId||L.metadata.nativeHostName!==G.metadata.nativeHostName)throw Error("mac_recording_profile_changed");await B.executeCdp(Q,"Page.stopScreencast",{})}finally{B.close()}}})}}}}var W0=()=>Error("mac_pr_proof_unavailable"),dX=K.object({operationId:K.string().uuid()}).strict();function r5($){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 W0();if(!$.qualifiedProfiles){let B=new URL($.uploadOrigin);if(!$.resolveBrowser||B.protocol!=="https:"||B.origin!==$.uploadOrigin||B.username||B.password)throw W0()}let Q=new Map,X=new Map,Y=new Map,V=!1,N=new gX,G=async(B)=>{let q=N.getStore();if(V||!B&&!q)throw W0();if(q?.signal.throwIfAborted(),await $.assertCurrent(B??q.claim),V)throw W0();q?.signal.throwIfAborted()},H=(B,q)=>{let L="owner"in q?q.owner:("context"in q)?q.context.owner:q.input.owner;if(B.capability!==X9||!B.owner||L.generation!==$.generation||!Z.some((T)=>T.profile===L.profile&&T.extension_instance_id===L.extensionInstanceId)||L.organizationId!==B.owner.organization_id||L.userId!==B.owner.user_id||L.deviceId!==B.owner.device_id||L.rootId!==B.root_id||L.runId!==B.run_id)throw W0();return L},M=async(B)=>{await G();let q=JSON.stringify([B.runId,B.profile]),L=Q.get(q);if(!L){if(Q.size>=4)throw W0();L=(async()=>{let _,W=$.browserScope?.(B)??G1(B.runId),O=await $.createBrowser({owner:B,assertCurrent:()=>G(),readVideo:(F)=>_.publicationCapture(F)});if(_=x5({owner:B,browserScope:W,assertCurrent:()=>G(),screenshot:O.screenshot,async createVideo(F,z,j,D){if(!$.resolveBrowser)throw W0();let R=await $.resolveBrowser(B.profile,z,W,D);if(R.extensionInstanceId!==B.extensionInstanceId)throw W0();return R.createHost({organizationId:B.organizationId,userId:B.userId,operationId:F.contextId,attemptId:F.contextId,recordingId:F.contextId,browser:{runId:B.runId,deviceId:B.deviceId,rootId:B.rootId,rootRevision:B.rootRevision,generation:B.generation,profile:B.profile,extensionInstanceId:B.extensionInstanceId,browserScope:W,tabId:z}},j,D)}}),V)throw O.close(),await _.close(),W0();return{owner:structuredClone(B),browser:O,capture:_,expiresAt:Date.now()+300000}})(),Q.set(q,L)}let T=await L;if(!n5(T.owner,B)||T.expiresAt<=Date.now())throw W0();return T},U=setInterval(()=>{for(let[B,q]of Q)q.then(async(L)=>{if(L.expiresAt>Date.now()||[...X.values()].some((T)=>T.runtime===L))return;if(L.browser.close(),await L.capture.close(),Q.get(B)===q)Q.delete(B)}).catch(()=>{V=!0})},1000);return U.unref(),{generation:$.generation,async execute(B,q,L){return N.run({claim:B,signal:q},async()=>{let T=B9.parse(B.payload).command,_=H(B,T);if(await G(B),q.throwIfAborted(),$.qualifiedProfiles&&!$.resolveBrowser&&(T.action==="prepare"?T.context.evidenceKind!=="image"||Boolean(T.context.visualPlan)||!T.context.uploadOrigin:!["capture_png","inspect_capture","verify_png_media","publish_png"].includes(T.action)))throw Error("proof_png_only");let W=await M(_),O=async()=>{await G(B),q.throwIfAborted()},F;switch(T.action){case"auth_check":F=await W.browser.preflight(T.input);break;case"prepare":if(T.context.visualPlan)throw Error("proof_source_unavailable");if($.qualifiedProfiles&&!T.context.uploadOrigin)throw W0();F=await W.capture.prepare(T.context);break;case"capture_png":F=await W.capture.screenshot({claim:{operationId:B.operation_id,attemptId:B.attempt_id,contextId:T.contextId,tabId:T.tabId},signal:q});break;case"start_video":{let z={runtime:W,contextId:T.contextId,attemptId:B.attempt_id,tabId:T.tabId,signal:q};if(X.has(B.operation_id))throw W0();X.set(B.operation_id,z);try{F=await W.capture.record({claim:{operationId:B.operation_id,attemptId:B.attempt_id,contextId:T.contextId,tabId:T.tabId},signal:q,seconds:T.seconds,started:async()=>{await O(),await L({version:1,operationId:B.operation_id,contextId:T.contextId,acknowledgedAt:new Date().toISOString()})}})}finally{X.delete(B.operation_id)}break}case"inspect_capture":F=await W.capture.inspect(T.captureId);break;case"publish_video":F=await W.browser.publish(T.input);break;case"verify_saved_media":F=await W.browser.verify(T.input);break;case"verify_png_media":F=await W.browser.verifyImages(T.media);break;case"publish_png":{let z=`${_.runId}:${T.attemptId}`,j=Y.get(z);if(j){if(!n5(j.request,T))throw W0();F=j.result;break}if(Y.size>=16)throw W0();let D=new URL(T.uploadUrl);if(D.protocol!=="https:"||D.username||D.password||D.hash||D.pathname!==`/${T.storagePath}`||!T.storagePath.startsWith(`pr-screenshots/${_.runId}/${T.captureId}/`)||!/^[a-zA-Z0-9._-]+\.png$/.test(T.storagePath.split("/").at(-1))||T.storagePath.split("/").length!==4)throw W0();let R=await W.capture.publicationCapture(T.captureId);try{if(D.origin!==($.qualifiedProfiles?R.capture.context.uploadOrigin:$.uploadOrigin)||R.capture.media.contentType!=="image/png"||R.capture.sha256!==T.sha256||R.bytes.length!==T.sizeBytes||uX("sha256").update(R.bytes).digest("hex")!==T.sha256)throw W0();await O();let I={request:structuredClone(T),result:{status:"uncertain",sha256:T.sha256,sizeBytes:T.sizeBytes}};Y.set(z,I);try{let C=await fetch(D,{method:"PUT",body:R.bytes,headers:{"Content-Type":"image/png"},redirect:"error",signal:AbortSignal.any([q,AbortSignal.timeout(20000)])});if(await C.body?.cancel(),await O(),C.ok)I.result={...I.result,status:"uploaded"}}catch{}F=I.result}finally{R.bytes.fill(0)}break}}return await O(),structuredClone(F)})},async control(B,q){if(B.capability!==X9||q.kind!==I5)return!1;let L=dX.safeParse(q.payload),T=X.get(B.operation_id);if(!L.success||L.data.operationId!==B.operation_id||!T||T.attemptId!==B.attempt_id)return!1;let _=B9.parse(B.payload).command;return H(B,_),await G(B),await N.run({claim:B,signal:T.signal},()=>T.runtime.capture.stop({operationId:B.operation_id,attemptId:B.attempt_id,contextId:T.contextId,tabId:T.tabId})),!0},async close(){V=!0,clearInterval(U);let B=await Promise.allSettled([...Q.values()].map(async(q)=>{let L=await q;L.browser.close(),await L.capture.close()}));if(Q.clear(),X.clear(),Y.clear(),B.some((q)=>q.status==="rejected"))throw W0()}}}var rX="__browser-recorder",tX=nX(pX),oX="/tmp/open-browser-use",eX=33554432,$Y=K.object({version:K.literal("0.1.42"),metadata:K.object({extensionId:K.literal(u2),extensionInstanceId:K.string().min(1).max(1024)})}),o5=()=>Error("worker_pr_proof_browser_unavailable"),F9={components:k1,ensureBrowser:ZJ,socketDirectory:oX,async identity($){let J=new O$({socketPath:$,sessionId:`reason-proof-qualification-${T9()}`,timeoutMs:2000});try{return await J.connect(),await J.getInfo()}finally{J.close()}}};async function e5($,J=F9){let Z=J.components();if(!Z?.features.browser)throw o5();await J.ensureBrowser(Z),$.throwIfAborted();let Q=M9(QJ(Z),"Default","Local Extension Settings",u2),X=(await t5(Q)).filter((Y)=>Y.endsWith(".log")||Y.endsWith(".ldb")).map((Y)=>M9(Q,Y));for(let Y of(await t5(J.socketDirectory)).filter((V)=>V.endsWith(".sock"))){$.throwIfAborted();let V=M9(J.socketDirectory,Y);try{let N=await cX(V);if(!N.isSocket()||N.uid!==process.getuid?.())continue;let G=$Y.parse(await J.identity(V)).metadata.extensionInstanceId;for(let H of X)if((await aX(H)).size<=eX&&(await XJ(H)).includes(G))return{socketPath:V,instanceId:G,extensionId:u2}}catch{}}throw o5()}async function L9($){let J=await sX($);return{path:J,sha256:lX("sha256").update(await XJ(J)).digest("hex")}}async function YJ($={}){let J={...F9,...$};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 L9(Z.ffmpeg),{stdout:X}=await tX(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 L9(Z.ffprobe)};if(!await g1(Y))return{error:"worker_recording_encoder_unqualified"};let V=$.recorder??{path:process.execPath,args:[...iX(process.execPath).startsWith("bun")&&process.argv[1]?[process.argv[1]]:[],rX]};return{worker:{...await L9(V.path),args:V.args},encoder:Y}}catch{return{error:"worker_recording_unqualified"}}}function VJ($,J={}){let Z={...F9,...J},Q=T9(),X=T9(),Y=$J.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?JJ.parse({...Y,version:3,video:!0,max_seconds:15}):Y,N=(U)=>j5(U.organizationId,U.sessionId,U.deviceId,1),G=$.recording,H,M=r5({generation:Q,qualifiedProfiles:[{profile:"Default",extension_instance_id:X}],assertCurrent:$.assertCurrent,browserScope:N,...G?{resolveBrowser:async(U,B,q,L)=>{H??=q9({...G,assertCurrent:()=>$.assertCurrent(),discover:(_,W)=>e5(W,Z)}),H.catch(()=>{H=void 0});let T=await(await H)(U,B,q,L);return{extensionInstanceId:X,createHost:async(_,W,O)=>JY(await T.createHost({..._,browser:{..._.browser,extensionInstanceId:T.extensionInstanceId}},W,O),X)}}}:{},createBrowser:(U)=>U9({...U,endpoint:(B)=>({discover:(q)=>e5(q,Z),tabScope:N(B)})})});return{capability:V,broker:M}}function JY($,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 _Y}from"child_process";import{execFile as ZY}from"child_process";import{readFile as QY}from"fs/promises";import{join as r0}from"path";var XY="Claude Code-credentials",YY="/usr/bin/security",VY=120000,GY=8192,d2={exec:($,J,Z)=>new Promise((Q)=>{ZY($,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 QY($,"utf8")}catch{return null}}};function B1($){return typeof $==="string"&&$.length>0&&$.length<=GY?$:null}function BY($,J){return $.CLAUDE_CONFIG_DIR||r0(J,".claude")}function KY($,J){return $.CODEX_HOME||r0(J,".codex")}function GJ($){if(!$)return null;try{let J=JSON.parse($).claudeAiOauth,Z=B1(J?.accessToken),Q=B1(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 UY($){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 NY($){if(!$)return null;try{let J=JSON.parse($);if(J.auth_mode!==void 0&&J.auth_mode!=="chatgpt")return null;let Z=B1(J.tokens?.access_token),Q=B1(J.tokens?.refresh_token);if(!Z||!Q)return null;return{provider:"openai-codex",access:Z,refresh:Q,expires:UY(Z)??Date.now()}}catch{return null}}function HY($,J){return r0($.XDG_DATA_HOME||r0(J,".local","share"),"opencode","auth.json")}var qY={anthropic:"anthropic",openai:"openai-codex"};function MY($){return NJ($,qY)}function NJ($,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=B1(V.access),G=B1(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 LY($){return NJ($,{anthropic:"anthropic","openai-codex":"openai-codex"})}function TY($,J){let Z=$.PI_CODING_AGENT_DIR;return Z==="~"?J:Z?.startsWith("~/")?r0(J,Z.slice(2)):Z||r0(J,".pi","agent")}async function HJ($,J,Z=d2){let Q=[],X=await Z.exec(YY,["find-generic-password","-s",XY,"-w"],VY),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?GJ(X.stdout.trim()):null),!Q.some((G)=>G.provider==="anthropic"&&G.expires>Y))V(GJ(await Z.readText(r0(BY($,J),".credentials.json"))));let N=NY(await Z.readText(r0(KY($,J),"auth.json")));V(N),V(FY(await Z.readText(r0($.GROK_HOME||r0(J,".grok"),"auth.json"))));for(let G of MY(await Z.readText(HY($,J))))V(G);for(let G of LY(await Z.readText(r0(TY($,J),"auth.json"))))V(G);return Q}function qJ($){return $.map(({provider:J,access:Z,expires:Q})=>({provider:J,access:Z,expires:Q}))}var BJ="https://auth.x.ai",KJ="b1a00492-073a-47ea-816f-4c329264a828",UJ=($)=>typeof $==="string"&&$.length>0&&$.length<=8192&&$.trim()===$;function FY($){if(!$)return null;try{let J=JSON.parse($);if(!J||typeof J!=="object"||Array.isArray(J))return null;let Z=J[`${BJ}::${KJ}`];if(!Z||typeof Z!=="object"||Array.isArray(Z))return null;let Q=Z;if(Q.auth_mode!=="oidc"||Q.oidc_issuer!==BJ||Q.oidc_client_id!==KJ||!UJ(Q.key)||!UJ(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 MJ=330000,jY=300000,DY=60000;function WY($,J,Z=Date.now()){return $.filter((Q)=>{if(!Number.isFinite(Q.expires)||Q.expires<=Z+MJ)return!1;let X=J.get(Q.provider);return!X||X.access!==Q.access||X.expires!==Q.expires})}function OY($,J=Date.now()){return[...$.values()].some((Q)=>Q.expires<=J+2*MJ)?DY:jY}var zY=($,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 LJ($){let J=new Map,Z=$.wait??zY,Q=$.stores??(process.platform==="darwin"?d2:{...d2,exec:async()=>({code:1,stdout:""})});while(!$.signal.aborted){try{let X=qJ(await HJ($.environment??process.env,$.home,Q));for(let Y of WY(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(OY(J),$.signal)}}function TJ($=process.env){return new Promise((J)=>{_Y("gh",["auth","status","--hostname","github.com"],{env:$,timeout:8000,maxBuffer:65536},(Z)=>J(!Z))})}import{execFile as AY,spawn as oq,spawnSync as eq}from"child_process";import{chmodSync as JM,existsSync as RY,mkdirSync as ZM,readFileSync as QM,renameSync as XM,rmSync as YM,statSync as VM,writeFileSync as GM}from"fs";import{dirname as KM,isAbsolute as UM,join as p2}from"path";var FJ=/^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$/;function _J($,J){if(!FJ.test($)||!FJ.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 CY="com.reasonmachines.updater",PY=["so.ara.updater","so.reason.updater"];function IY($){let J=$==="staging"?".staging":"";return{label:`${CY}${J}`,legacyLabels:[...PY].reverse().map((Z)=>`${Z}${J}`)}}function EY($,J){return J==="darwin"?$.launchAgent:J==="win32"?$.scheduledTask:$.systemdService}function xY($,J,Z){return{launchAgent:p2(J,"Library","LaunchAgents",`${$}.plist`),systemdService:p2(Z,"systemd","user",`${$}.service`),systemdTimer:p2(Z,"systemd","user",`${$}.timer`),scheduledTask:p2(OJ(J),`${$}.xml`)}}function SY($,J){return new Promise((Z)=>{AY(DJ($),[...J],{timeout:1e4},(Q)=>{Z(Q?typeof Q.code==="number"?Q.code:1:0)})})}async function zJ($){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??H0(),{label:X,legacyLabels:Y}=IY($.channel),V=$.configHome??WJ(Q),N=[X,...Y].filter((U)=>{return RY(EY(xY(U,Q,V),J))});if(N.length===0)return"absent";let G=$.command??SY,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 jJ=60000;function AJ($){let J=(X,Y)=>{try{return _J(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(jJ-1,Math.floor(V*jJ)))}}var bY=30000;async function CJ($){return($.flush??RJ)($.paths,async(J)=>{let{schema_version:Z,...Q}=J,X=AbortSignal.timeout(bY);try{await $.client.deviceLifecycle($.device,Q,$.signal?AbortSignal.any([$.signal,X]):X)}catch(Y){if(Y instanceof T0&&Y.status===400&&Y.code==="invalid_device_lifecycle_event")return;throw Y}},$.accept)}var IJ=25000,yY=5000,kY=600000,hY=["display.stream.v1","pty.start"],fY=64;function D9($,J,Z=O9($),Q){return m0(),lJ(J.roots,{...Z,...Q?{productionProof:Q}:{}})}var EJ=5000,vY=600000;function mY($,J){if($.lifetime!=="persistent"||J!=="darwin"||!process.env[p$])return null;try{return l2({platform:J})}catch{return null}}function gY($){return $.event.startsWith("update.")||$.event.startsWith("executor.update.")||$.event.startsWith("identity.")||$.event.startsWith("worker.")}function uY($,J){let Z=Object.keys(J).filter((Q)=>J[Q]!==!0).sort();try{let Q=e3();if(Z.length>0)p1($,{event:"worker.capabilities_withheld",runtime_version:t,capabilities:Z});if(Q)p1($,{event:"identity.computer_use_unavailable",runtime_version:t,reason_code:Q})}catch{}}async function c1($,J,Z,Q,X={}){if(m0(),$.executionMode==="host")l1();let Y=J.worker?.expiresAt;if(!Y||Date.parse(Y)<=Date.now())throw Error("worker_credential_expired");let V=$0($);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"?dJ():Promise.resolve(!1),M=fJ(),U=X.prestartedReadiness??y1($,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 L,T=q["github.local.v1"]===!0?(X.probeGithubSignedIn??TJ)().catch(()=>!1):null,_=new AbortController,W=null,O=async(f,a)=>{let i=($.userChrome??X.ownComputer===!0)&&f["automation.call.v1"]===!0?uJ():null;if(i&&"code"in i)process.stderr.write(`Reason worker: your own Chrome unavailable (${i.code})
82
+ `);let B0=O9($,f,{displayVideo:f["display.stream.v1"]===!0&&await H(),handsBrowser:f["hands.connect"]===!0&&M,userChrome:i&&"host"in i?i.host:null,...L===void 0?{}:{githubSignedIn:L},persistentTerminals:f["pty.start"]===!0&&S2(),probing:a,ownComputer:X.ownComputer===!0});if(!W&&B0.worker.readiness?.["browser.pr-proof.v1"]===!0){let O0=await YJ();if(W||_.signal.aborted)return B0;process.stderr.write("error"in O0?`Reason worker: PR video proof unavailable (${O0.error})
83
+ `:`Reason worker: PR video proof ready (ffmpeg ${O0.encoder.ffmpeg.path})
84
+ `),W=VJ({assertCurrent:async()=>{if(!b())throw Error("proof_authority_lost")},...!("error"in O0)?{recording:O0}:{}})}return B0},F=await O(q,B?$9.filter((f)=>q[f]!==!0):[]),z=D9($,J,F,W?.capability);X.onStartup?.("inventory_completed");let j=!1,D=0,R=0,I="starting",C=null,P=!1,h=!1,S=null,k,p=()=>!V.drained&&Date.parse(Y)>Date.now()&&z.supported_operations.some((f)=>F.worker.readiness?.[f]===!0),b=()=>!j&&p(),x=null,E=()=>D+(x?.claims()??0),A=null,y=new Set,w=(f)=>{let a=f.capabilities.root_paths;if(Object.assign(f.capabilities,D9(f.config,f.state,F,W?.capability)),a)f.capabilities.root_paths=a},n=(f)=>{F=f,w({config:$,state:J,capabilities:z}),A?.();for(let a of y)w(a),a.heartbeatNow?.()},r=new Set,X0=new Set,M0=setInterval(()=>{let f=new Set;for(let a of[{state:J,capabilities:z},...y])for(let N0 of hY){if(a.capabilities.operation_constraints?.[N0]?.probing!==!0)continue;let B0=`${a.state.deviceId} ${N0}`;if(f.add(B0),!r.has(B0)||X0.has(B0))continue;X0.add(B0),process.stderr.write(`${JSON.stringify({event:"worker.readiness_probing_stale",device_id:a.state.deviceId,lane:N0,login_device:a.state===J,timestamp:new Date().toISOString()})}
85
+ `)}r.clear();for(let a of f)r.add(a)},kY);M0.unref();let u0=(f)=>{if(!X.readinessProbes)K5({config:$,readiness:f,signal:_.signal,idle:()=>E()===0,permissions:J.roots[0].permissions,onReady:(a)=>{O(a,[]).then(n)}})},I0=B?U.final.then(async(f)=>{if(_.signal.aborted)return;n(await O(f,[]));let a=$9.filter((N0)=>f[N0]===!0);process.stderr.write(`Reason worker: deferred lanes decided (${a.length?`ready: ${a.join(", ")}`:"none ready"}).
86
+ `),u0(f)},()=>{}):Promise.resolve();if(!B)u0(q);T?.then(async(f)=>{L=f;for(;;){let a=F,N0=await O(a.worker.readiness??{},a.worker.probing??[]);if(_.signal.aborted)return;if(F!==a)continue;n(N0);return}});let c0=B&&F.worker.probing?.includes("pty.start")?U.pty.then(async(f)=>{let a=()=>F.worker.probing?.includes("pty.start")===!0;if(_.signal.aborted||!a())return;let N0=await O({...F.worker.readiness,"pty.start":f},(F.worker.probing??[]).filter((i)=>i!=="pty.start"));if(_.signal.aborted||!a())return;n(N0)},()=>{}):Promise.resolve(),P$=()=>({version:1,instanceId:Q,deviceId:J.deviceId,phase:I,drained:V.drained||j||P,activeClaims:E(),activeSessions:R,lastHeartbeat:C,expiresAt:Y,supportedOperations:[...z.supported_operations],capabilityReadiness:F.worker.readiness,executionEligible:b()&&!P&&I==="running"}),s$=!1,L$=()=>{s$=!0,V$()},V$=()=>{if(j)return;if(j=!0,I="stopping",S?.close(),E()===0)_.abort();else k=setTimeout(()=>_.abort(),$.shutdownGraceMs)},I$=$.channel==="production"||$.channel==="staging"?$.channel:null,G$=d($).releaseCheck,m=X.publishedRelease??(I$&&$.lifetime==="persistent"?AJ({currentVersion:t,signal:_.signal,actedOn:(()=>{try{let f=JSON.parse(s(G$));return typeof f==="string"?f:null}catch{return null}})(),check:async(f)=>{try{c(G$,f)}catch{}let a=await zJ({channel:I$});process.stderr.write(a==="started"?`Reason worker: CLI ${f} is published; the updater is checking now.
87
+ `:a==="absent"?`Reason worker: CLI ${f} is published; no updater is installed for it here.
88
+ `:`Reason worker: CLI ${f} is published; the updater did not start, so its next scheduled check takes it.
89
+ `)}}):void 0),Y0=(f)=>{if(f==="stop")L$();if(f==="reload_roots"){let a=o($);if(!a||a.deviceId!==J.deviceId)throw Error("worker_identity_changed");J.roots=a.roots;let N0=pJ(J.roots,PJ());if(N0)z.root_paths=N0;else delete z.root_paths;x?.check()}if(f==="drain"||f==="resume"){if(j||Date.parse(Y)<=Date.now())throw Error("worker_stopping_or_expired");V={...V,drained:f==="drain"},R0($,V)}return P$()};X.prestartedControl?.handle(Y0);let E$=X.prestartedControl?await X.prestartedControl.closed:await W2($,Q,Y0),B$,x$=!1,f0=()=>{let f=Date.parse(Y)-Date.now();if(f>0){B$=setTimeout(f0,Math.min(f,2147483647));return}j=!0,S?.close(),x$=!0,I="stopping",_.abort(Error("worker_credential_expired"))};f0(),X.signal?.addEventListener("abort",V$,{once:!0});let T1=X.processSignals!==!1;if(T1)process.once("SIGTERM",V$),process.once("SIGINT",L$);if(X.signal?.aborted)V$();try{X.onStartup?.("control_ready");let f=X.client??new d1(W$($.apiOrigin),S0($.proxy,xJ()),Z,{deviceSession:d3({proxied:Boolean($.proxy)||process.env.REASON_RELAY_CUSTOM_DOMAIN==="1"}),prefetchEventChallenges:!0}),a=d($).daemon,N0=L3($,J.deviceId),i=X.startupTiming,B0=i?()=>({...i(),...N0?.enrollmentMs!==void 0?{enrollment_ms:N0.enrollmentMs}:{}}):void 0,O0=(v)=>{let s0=v.client.localSubscription?.bind(v.client);if($.localLogins===!0&&s0)(X.handOverLocalLogins??LJ)({state:v.state,client:{localSubscription:s0},signal:v.signal,home:H0()}).catch(()=>{return});let _0=PJ(),x0=v.client.liveSessionWorktrees?.bind(v.client);if(x0)yJ(()=>wJ({home:_0,deviceId:v.state.deviceId,liveIds:(T$)=>x0(v.state,T$,v.signal)}),v.signal)};O0({state:J,client:f,signal:_.signal});let K$=mY($,X.platform??process.platform),a$=f.deviceLifecycle?.bind(f),z0=Promise.resolve(),E0=0,F1=()=>{if(!K$||!a$||j||Date.now()<E0)return;E0=Date.now()+vY,z0=z0.then(()=>CJ({paths:K$,device:J,client:{deviceLifecycle:a$},accept:gY,signal:_.signal})).catch(()=>{return})};if(F1(),K$)U.final.then((v)=>uY(K$,v),()=>{});let e1=(v,s0)=>({state:v.state,client:v.client,...v.firstHeartbeat?{firstHeartbeat:v.firstHeartbeat}:{},runtimeVersion:t,bridgeVersion:t,protocolVersion:2,capabilities:v.capabilities,signal:v.signal,statusPath:v.statusPath,maxConcurrentClaims:X.ownComputer===!0?fY:4*$.slots+mJ,heartbeatIntervalMs:X.heartbeatIntervalMs,operationHeartbeatAttemptTimeoutMs:IJ,operationCompletionTimeoutMs:IJ,maxConsecutiveHeartbeatFailures:3,claimable:b,advertised:p,onClaim:async(_0,x0,T$)=>{let j1=Date.now();if(!v.capabilities.supported_operations.includes(_0.capability))return{status:"failed",error_code:"unsupported_capability"};let a0=F.worker.probing??[],n9=a0.includes(_0.capability)?I0:_0.capability==="hands.connect"&&$.executionMode==="host"&&a0.includes("pty.start")?c0:null;if(n9){let J2,N3=()=>{};await Promise.race([n9,new Promise((r9)=>{J2=setTimeout(r9,yY),N3=()=>r9(),x0.addEventListener("abort",N3,{once:!0})})]),clearTimeout(J2),x0.removeEventListener("abort",N3)}let $2=_0.capability==="hands.connect",U3=$2?S:null,j7={signal:x0,emit:T$,...F,...W?{proveMac:W.broker.execute}:{},..._0.capability==="inference.custom.v1"&&v.client.operationCustomEndpointCredential?{customEndpointCredential:(J2)=>v.client.operationCustomEndpointCredential(v.state,_0,J2)}:{},...$2?{handsLaunch:{claimedAtMs:j1,...U3?{takePrespawnedWorker:U3.take,adoptSpawnedWorker:U3.adopt}:{}}}:{}};if($2)R+=1;try{return await(X.execute??z9)(v.state,_0,j7)}finally{if($2)R-=1}},onControl:async(_0,x0)=>await cJ(v.state,_0,x0,v.client)||await sJ(v.state,_0,x0)||await gJ(_0,x0)||await W?.broker.control(_0,x0)||!1,onEvent:s0}),s9=async(v)=>{await v.client.deviceLifecycle?.(v.state,{event_id:wY(),event:"service.stopped",occurred_at:new Date().toISOString(),runtime_version:t,reason_code:"worker_stopped"},AbortSignal.timeout(EJ)).catch(()=>{return})},_1=$.lifetime==="persistent"?X.ownerWorkspaces:void 0,a9=f.ownerWorkspaces?.bind(f),i9=f.ownerWorkspaceEnrollment?.bind(f);if(_1&&a9&&i9)x=W4({config:$,state:J,signal:_.signal,client:{ownerWorkspaces:a9,ownerWorkspaceEnrollment:i9},..._1.enroll?{enroll:_1.enroll}:{},log:(v)=>{process.stderr.write(v)},serve:async(v,s0,_0)=>{let x0=L3(v.config,v.state.deviceId),T$={config:v.config,state:v.state,signal:s0,statusPath:d(v.config).daemon,...x0?.offer?{firstHeartbeat:x0.offer}:{},capabilities:D9(v.config,v.state,F,W?.capability),client:_1.client?.(v)??new d1(W$($.apiOrigin),S0($.proxy,xJ()),v.proofStore,{deviceSession:d3({proxied:Boolean($.proxy)||process.env.REASON_RELAY_CUSTOM_DOMAIN==="1"}),prefetchEventChallenges:!0})};O0(T$);let j1={...T$,heartbeatNow:null};y.add(j1);try{await c3({registerHeartbeatNow:(a0)=>{j1.heartbeatNow=a0},...e1(T$,(a0)=>{if(a0.type==="completed")W9(a0.operationId,a0.status);if(a0.type==="claims_changed"){if(_0(a0.activeClaims),j&&E()===0)_.abort()}if(a0.type==="stopped")_0(0)})})}finally{y.delete(j1)}if(j&&!x$)await s9(T$)}});let G3=0,B3=0,K3=_1?.intervalMs??T4;if(await c3({...(X.platform??process.platform)==="darwin"?{readIdleSleepPolicy:()=>E()>0?T2(a):void 0,...X.acquireAwakeHold?{acquireAwakeHold:X.acquireAwakeHold}:{}}:{},registerHeartbeatNow:(v)=>{A=v},...B0?{startup:B0}:{},...e1({state:J,client:f,capabilities:z,signal:_.signal,statusPath:a,...N0?.offer?{firstHeartbeat:N0.offer}:{}},(v)=>{if(v.type==="completed")W9(v.operationId,v.status);if(v.type==="claims_changed"){if(D=v.activeClaims,j&&E()===0)_.abort()}if(v.type==="heartbeat"&&!j){if(v.handsPrespawn&&$.lifetime==="ephemeral"&&!S)S=hJ({log:(s0,_0)=>{process.stderr.write(`${JSON.stringify({event:s0,..._0})}
90
+ `)}}),S.arm(),setTimeout(vJ,0);else if(!v.handsPrespawn&&S)S.close(),S=null}if(v.type==="heartbeat"){if(x&&!j&&Date.now()>=G3)G3=Date.now()+K3,x.check().then((s0)=>{B3=s0?0:B3+1,G3=Date.now()+(s0?K3:Math.min(K3,F4*2**Math.min(B3-1,10)))});if(C=v.serverTime,P=v.drain,F1(),!j&&I$)m?.(v.latestCliVersions?.[I$]);if(!j)I="running";if(!j&&!h&&P$().executionEligible){if(h=!0,X.onStartup?.("ready"),(X.platform??process.platform)==="darwin")setTimeout(()=>{try{j9({skipWhenSettled:!0})}catch{}},0)}}if(v.type==="reconnecting"&&!j)I="reconnecting";if(v.type==="stopped")D=0;X.onEvent?.(v)})}),await x?.settled(),j&&!x$&&$.lifetime==="ephemeral")await f.disconnect?.(J,AbortSignal.timeout(EJ)).catch(()=>{process.stderr.write(`Reason worker: could not remove this computer from Reason (worker_disconnect_failed); it expires on its own.
91
+ `)});else if(j&&!x$)await s9({state:J,client:f});if(s$)await kJ().catch(()=>{return})}catch(f){if(!(f instanceof T0&&f.status===401))throw f;if(R0($,{...V,revoked:!0}),f.code==="device_revoked")X.onDeviceRevoked?.();throw Error("worker_revoked")}finally{if(clearTimeout(B$),clearInterval(M0),k)clearTimeout(k);if(T1)process.removeListener("SIGTERM",V$),process.removeListener("SIGINT",L$);X.signal?.removeEventListener("abort",V$),_.abort(),S?.close(),await x?.settled().catch(()=>{return}),await W?.broker.close().catch(()=>{return}),await E$()}}function xJ($=process.env){if($.REASON_RELAY_CUSTOM_DOMAIN!=="1")return fetch;return Object.assign((Z,Q)=>{let X=new Headers(Q?.headers);return X.set(SJ,bJ),fetch(Z,{...Q,headers:X})},{preconnect:fetch.preconnect})}import{generateKeyPairSync as dY,sign as pY}from"crypto";var aJ=65536,lY=65536;function cY($){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(!nJ(X))throw new V0("invalid_public_key");return X}function iJ(){try{let{privateKey:$,publicKey:J}=dY("ec",{namedCurve:"P-256"});return{privateKey:$,publicPoint:cY(J)}}catch($){if($ instanceof V0)throw $;throw new V0("proof_key_generation_failed")}}class s1{keyPair=iJ();binding=null;loadPublicKey(){if(!this.keyPair)throw new V0("proof_key_read_failed");return this.keyPair.publicPoint}createFreshPublicKey(){return this.keyPair=iJ(),this.keyPair.publicPoint}sign($){if(!this.keyPair||$.byteLength<1||$.byteLength>lY)throw new V0("proof_sign_failed");let J;try{J=pY("sha256",$,this.keyPair.privateKey)}catch{throw new V0("proof_sign_failed")}if(!rJ(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>aJ)throw new V0("invalid_binding");if(this.binding)throw new V0("binding_create_failed");this.binding=Uint8Array.from($)}updateBinding($){if($.byteLength<1||$.byteLength>aJ)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 oY,spawn as eY}from"child_process";import{isAbsolute as $V}from"path";import{promisify as JV}from"util";var a1={now:()=>Date.now(),after($,J){let Z=setTimeout(J,$);return()=>clearTimeout(Z)},every($,J){let Z=setInterval(J,$);return()=>clearInterval(Z)}};class i1{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=a1){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($)+`
92
+ `;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 sY}from"crypto";import{unlinkSync as aY}from"fs";import{join as iY}from"path";var n1=1,c2=45000,nY=K.strictObject({type:K.literal("configure"),protocol:K.literal(n1),version:K.string(),config:J0}),rY=K.strictObject({type:K.literal("ticket"),organizationId:K.string().min(1).max(160),receipt:K.unknown()}),tY=K.strictObject({type:K.enum(["ping","stop"])});async function tJ($={}){let J=$.clock??a1,Z=new i1($.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}=nY.parse(await Z.receive(30000,Q.signal));if(B!==t)throw Error("worker_ssh_version_mismatch");if(!["darwin","linux"].includes(process.platform)||!["arm64","x64"].includes(process.arch))throw Error("worker_ssh_platform_unsupported");if(U$(U),e(g(U),!0),N=e0({path:d(U).lock,runtimeVersion:t}),!N.acquired)throw Error("worker_already_running_or_lifecycle_busy");let q=iY(g(U),`ssh-preflight-${sY()}.json`);try{c(q,{version:1}),s(q)}finally{try{aY(q)}catch{}}let L=o(U),T=$0(U);if(T.revoked||T.drained)throw Error("worker_ssh_revoked_or_drained");if(L&&Date.parse(L.worker.expiresAt)<=Date.now())throw Error("worker_credential_expired");if(L&&U.lifetime==="ephemeral")throw Error("worker_ephemeral_requires_fresh_enrollment");await Z.send({type:"hello",protocol:n1,version:t,platform:process.platform,architecture:process.arch,enrolled:!!L});let _=U.lifetime==="ephemeral"?G=new s1:L0(U,!0);if(!L){let j=D$(U);await Z.send({type:"ticket-request",request:j.request});let D=rY.parse(await Z.receive(70000,Q.signal)),R=j.complete(D.organizationId,D.receipt);if(L=await o0(U,R,_,$.enroll),U.lifetime==="persistent")k0(L,d(U).state,{proofStore:_});R0(U,{version:1,drained:!1,revoked:!1})}if(Q.signal.aborted)throw Error("worker_ssh_cancelled");V=(async()=>{try{while(!X.signal.aborted){if(tY.parse(await Z.receive(35000,X.signal)).type==="stop"){Y();return}await Z.send({type:"pong"})}}catch{if(!X.signal.aborted)Y()}})();let W=!1,O,F=!1;H=J.after(Math.max(1,Math.min(c2,$.startupTimeoutMs??c2)),()=>{F=!0,Y()});let z=N.owner.nonce;if(await c1(U,L,_,z,{...$,signal:Q.signal,onEvent(j){if($.onEvent?.(j),j.type==="heartbeat"&&!W&&!O)O=(async()=>{let D=await K0(U,"status");if(!D?.executionEligible)throw Error("worker_ssh_no_ready_capabilities");await Z.send({type:"running",deviceId:D.deviceId,expiresAt:D.expiresAt,lifetime:U.lifetime,supervision:"ssh-foreground"}),W=!0,H?.()})().catch(()=>{F=!0,Y()})}}),await O,F||!W)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 R9=($)=>$V($)&&$.length<=4096&&!/[\x00-\x1f\x7f]/.test($),A9=($)=>`'${$.replaceAll("'","'\\''")}'`,ZV=K.strictObject({type:K.literal("hello"),protocol:K.literal(n1),version:K.string(),platform:K.enum(["linux","darwin"]),architecture:K.enum(["arm64","x64"]),enrolled:K.boolean()}),QV=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)})}),oJ=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")})]),XV=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 s2($){if($&&typeof $==="object"&&"type"in $&&$.type==="error"){let J="code"in $&&typeof $.code==="string"&&XV.has($.code)?$.code:"worker_ssh_remote_failed";throw Error(J)}return $}function eJ($){if(!R9($.remoteCli)||!/^[a-f0-9]{64}$/.test($.sha256))throw Error("worker_ssh_invalid_target");let J=`set -eu
93
+ a=${A9($.remoteCli)}
94
+ [ -f "$a" ] && [ ! -L "$a" ] && [ -x "$a" ] || { echo worker_ssh_artifact_unavailable >&2; exit 72; }
95
+ p=\${a%/*}; f=\${a##*/}; p=\${p:-/}
96
+ p=$(cd -P "$p" && pwd -P)
97
+ [ "\${p%/}/$f" = "$a" ] || { echo worker_ssh_artifact_unavailable >&2; exit 72; }
98
+ if [ -x /usr/bin/sha256sum ]; then h=$(/usr/bin/sha256sum < "$a");
99
+ elif [ -x /usr/bin/shasum ]; then h=$(/usr/bin/shasum -a 256 < "$a");
100
+ else echo worker_ssh_hash_tool_unavailable >&2; exit 72; fi
101
+ h=\${h%% *}
102
+ [ "$h" = ${A9($.sha256)} ] || { echo worker_ssh_artifact_mismatch >&2; exit 72; }
103
+ exec "$a" worker __ssh-bootstrap`;return`exec /usr/bin/env -i PATH=/usr/bin:/bin:/usr/sbin:/sbin /bin/sh -c ${A9(J)}`}function $6($,J){if(!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/.test($.alias)||!R9($.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,eJ($)]}function YV($){return $6($,!1)}function J6(){return{PATH:"/usr/bin:/bin:/usr/sbin:/sbin",HOME:H0(),...process.env.SSH_AUTH_SOCK?{SSH_AUTH_SOCK:process.env.SSH_AUTH_SOCK}:{}}}async function VV($){let J;try{({stdout:J}=await JV(oY)("/usr/bin/ssh",["-G",...$6($,!0)],{env:J6(),timeout:5000,maxBuffer:65536,encoding:"utf8"}))}catch{throw Error("worker_ssh_config_invalid")}for(let Z of J.split(`
104
+ `)){let[Q,...X]=Z.trim().split(/\s+/);if(["proxyjump","proxycommand"].includes(Q??"")&&X.join(" ").toLowerCase()!=="none")throw Error("worker_ssh_proxy_unsupported")}}function GV($){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 BV($){await VV($);let J=eY("/usr/bin/ssh",YV($),{stdio:["pipe","pipe","pipe"],env:J6()}),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=GV(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 KV($){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)||!R9(X.sshConfig))throw Error("worker_ssh_invalid_target");eJ(X),s(X.sshConfig);let Y=J0.parse(JSON.parse(s(Q("--config"))));if(r1(Y.workspaceRoot,X.remoteCli))throw Error("worker_ssh_artifact_inside_workspace");return{target:X,config:Y,credentialPath:J.get("--credential-file")}}async function UV($,J,Z,Q,X){let{request:Y}=QV.parse(s2(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??_$(J),M=await(Q.enrollmentCredentials??j$)(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 A$(M,{credentialsPath:H}),B=W3(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 Z6($,J={}){let{config:Z,target:Q,credentialPath:X}=KV($);if(J.signal?.aborted)throw Error("worker_ssh_cancelled");let Y=J.clock??a1,V=await(J.sshTransport??BV)(Q),N=new i1(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:n1,version:t,config:Z});let B=ZV.parse(s2(await N.receive(30000,G.signal)));if(B.version!==t)throw Error("worker_ssh_version_mismatch");if(!B.enrolled)await UV(N,Z,X,J,AbortSignal.any([G.signal,N.signal]));M=Y.every(1e4,()=>{N.send({type:"ping"}).catch(H)});let q=!1,L=Y.now()+(B.enrolled?0:j3)+c2+5000;while(!0){let T=q?35000:Math.max(1,L-Y.now()),_=oJ.parse(s2(await N.receive(T,G.signal)));if(_.type==="running"){if(q||_.lifetime!==Z.lifetime||Date.parse(_.expiresAt)<=Date.now())throw Error("worker_ssh_invalid_readiness");q=!0,(J.io??process).stdout.write(JSON.stringify(_)+`
105
+ `)}if(_.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(oJ.parse(s2(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((L)=>setTimeout(L,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 LV}from"net";import{WebSocket as a2}from"ws";var NV=1,U1=65536,Q6=4096,X6=67108864,Y6=4194304,K1=K.uuid(),HV=K.strictObject({kind:K.literal("install_only"),authorityId:K1,organizationId:K1,userId:K1,connectionId:K1,attemptId:K1,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)}),qV=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"||!K1.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 MV=K.strictObject({protocol:K.literal(NV),type:K.literal("ssh_install_relay"),authorityToken:K.string().regex(/^(?:reason|ara)_ssh_install_[A-Za-z0-9_-]{43}$/),authority:HV,relayUrl:qV,endpoint:K.strictObject({host:K.literal("127.0.0.1"),port:K.literal(22)})});function C9($,J=Date.now()){let Z=MV.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 V6($){let J=JSON.stringify($);if(Buffer.byteLength(J)>U1)throw Error("ssh_install_relay_frame_too_large");return J}function G6($){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 B6="ssh_install_relay_closed";function TV($){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 FV($){if(Buffer.isBuffer($))return $;if($ instanceof ArrayBuffer)return Buffer.from($);if(ArrayBuffer.isView($))return Buffer.from($.buffer,$.byteOffset,$.byteLength);return null}function _V($,J=B6){try{$.close(1000,J)}catch{$.terminate()}}async function jV($){let J=$.now??(()=>Date.now()),Z=C9($.receipt,J()),X=($.createWebSocket??((j)=>new a2(j,{followRedirects:!1,perMessageDeflate:!1,maxPayload:U1})))(Z.relayUrl),Y=$.connectLocal??(()=>LV({host:"127.0.0.1",port:22})),V,N=!1,G=!1,H=0,M=0,U,B=(j)=>{if(U)clearTimeout(U);U=setTimeout(()=>T("ssh_install_relay_expired"),Math.max(1,j)),U.unref?.()},q,L=new Promise((j)=>{q=j}),T=(j=B6)=>{if(G)return;if(G=!0,U)clearTimeout(U);if($.signal?.removeEventListener("abort",_),V?.destroy(),X.readyState===a2.OPEN)_V(X,j);else if(X.readyState!==a2.CLOSED)X.terminate();q()},_=()=>T("ssh_install_relay_aborted"),W=()=>T("ssh_install_relay_protocol_error"),O=(j)=>{return H+=1,M+=j,j<=U1&&H<=Q6&&M<=X6},F=(j)=>{if(G||!N||X.readyState!==a2.OPEN||X.bufferedAmount>Y6||!O(j.length)){W();return}X.send(j,{binary:!0},(D)=>{if(D)W()})};X.on("open",()=>{if(G)return;try{let j=V6({type:"ssh_install_relay_receipt",receipt:Z});X.send(j,{binary:!1},(D)=>{if(D)W()})}catch{W()}}),X.on("message",(j,D)=>{if(G)return;let R=TV(j);if(R>U1||!O(R))return W();if(!N){if(D)return W();try{let C=G6(JSON.parse(String(j)));if(C.type!=="ssh_install_relay_ready"||C.authorityId!==Z.authority.authorityId)return W();N=!0,B(Z.authority.maxDurationMs),V=Y(),V.setNoDelay(!0),V.on("data",F),V.on("error",W),V.on("close",()=>T("ssh_install_relay_peer_closed")),V.on("drain",()=>X._socket?.resume()),V.on("connect",()=>{})}catch{W()}return}if(!D)return W();let I=FV(j);if(!I||!V||V.destroyed||!V.write(I))X._socket?.pause()}),X.on("error",W),X.on("close",()=>T("ssh_install_relay_peer_closed"));let z=Math.max(1,Math.min(Z.authority.maxDurationMs,Date.parse(Z.authority.expiresAt)-J()));if(B(z),$.signal?.addEventListener("abort",_,{once:!0}),$.signal?.aborted)_();return{receipt:Z,closed:L,close:()=>T()}}async function K6($=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>U1)return 1;J.push(X)}try{let Q=JSON.parse(Buffer.concat(J).toString("utf8"));return await(await jV({receipt:Q})).closed,0}catch{return 1}}import{randomBytes as DV}from"crypto";var l$="ARA_WORKER_PREVIEW_PROBE";async function N6(){if(typeof Bun>"u")return 1;let $=DV(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(l$);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===l$)V.send(l$);else V.close();return}try{let G=U6(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>l$.length)throw Error("probe_overflow");H({type:"credit",id:"http"})}else if(G.type==="end"&&G.id==="http"&&V.data.http===l$)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(l$).toString("base64"),binary:!1});else if(G.type==="data"&&G.id==="ws"&&!G.binary&&Buffer.from(G.data,"base64").toString()===l$&&!V.data.reported)V.data.reported=!0,process.stdout.write(`ready
106
+ `);else throw Error("probe_protocol_failed")}catch{V.close(),J(1)}}}});try{return process.stdout.write(JSON.stringify({port:Y.port,token:$})+`
107
+ `),await Z}finally{clearTimeout(Q),Y.stop(!0),process.stdin.removeListener("end",X),process.stdin.pause()}}import{closeSync as zV,createReadStream as AV,fstatSync as RV,readFileSync as CV}from"fs";var H6="/run/sc/instance-generation";var WV=/^[1-9][0-9]{0,15}\n?$/;function OV($){return typeof $==="number"&&Number.isSafeInteger($)&&$>0}function q6($){if(typeof $!=="string"||!WV.test($))return null;let J=Number($.trim());return OV(J)?J:null}var M6=3,PV=600000,IV=65536,EV=500;function L6($){if($.length!==3||$[0]!=="standby"||$[1]!=="--handoff-fd"||$[2]!==String(M6))throw Error("worker_standby_invalid_invocation");return{handoffFd:M6}}function xV($=(J)=>CV(J,"utf8")){try{return q6($(H6))}catch{return null}}function SV($){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=J0.safeParse(Q.config),Y=_3.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 T6={isPipe:($)=>RV($).isFIFO(),stream:($)=>{let J=AV("",{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 bV($,J=T6){if(!J.isPipe($.fd)){try{zV($.fd)}catch{}throw Error("worker_standby_handoff_not_pipe")}let Z=J.now()+($.armMs??PV),Q=J.stream($.fd),X=null,Y=()=>{},V=new Promise((G,H)=>{Y=(M)=>{X??=M,H(M)}});V.catch(()=>{});let N=J.every(EV,()=>{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>IV)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 F6($,J=T6){let Z=$.readGeneration??(()=>xV()),Q=J.parentPid(),X=Z();if(X===null)throw Error("worker_standby_no_instance_generation");$.onBooted?.();let Y=await bV({fd:$.fd,parentPid:Q,armMs:$.armMs,onArriving:$.onArriving},J);if(Z()!==X)throw Error("worker_standby_generation_changed");return SV(Y)}var wV=`Usage: reason worker <command> --config PATH [--json]
108
+
109
+ enroll Obtain/redeem a ticket using the current Reason login
110
+ start Run the existing Device daemon in the foreground
111
+ status Read enrollment and live local control state
112
+ doctor Read local prerequisites; never enroll or repair
113
+ drain Persist withdrawal of new claims; keep current work
114
+ resume Explicitly clear persistent drain
115
+ stop Drain, then cancel at shutdownGraceMs (ephemeral: ends its Device)
116
+ revoke Revoke an offline Device and remove its local key
117
+ attach Start this same worker over verified system SSH
118
+
119
+ Config: version 1; apiOrigin, channel, stateDirectory, workspaceRoot, lifetime
120
+ (persistent|ephemeral); executionMode defaults confined (host is explicit consent);
121
+ slots (Sessions at once, 1-4) defaults 1 and a Machine worker runs one;
122
+ shutdownGraceMs defaults 30000. Paths must be absolute and canonical.
123
+ Config and enrollment files must be owned by the current user with mode 0600.
124
+ Enroll: --enrollment-file PATH redeems a platform-provided ticket instead.
125
+ Enroll: --credential-file PATH selects a protected Reason credentials JSON file
126
+ (including credentialKind: api_key). Credentials never belong in argv or worker state.
127
+ The current login needs devices:write; enrollment never opens a browser or starts work.
128
+ Ephemeral: start keeps its proof key only in this process. It redeems
129
+ --enrollment-file PATH, or else obtains a ticket with the current login.
130
+ Its Device ends when the process exits; every start enrolls a new Device.
131
+ Use lifetime persistent to stop and start the same Device.
132
+ Simple setup: \`reason serve NAME\` writes this config and enrolls for you.
133
+ State is isolated under stateDirectory/headless-<channel>, never Desktop identity.
134
+ Persistent keys: a new identity's is a non-extractable login Keychain key on a Mac
135
+ where the CLI can create one there, otherwise an extractable owner-only file.
136
+ proxy {version 1, url, caFile?} carries enrollment, control, Hands and desktop relay
137
+ traffic (not yet previews or kept terminals); proxy environment variables stay refused.
138
+ No service is installed, no update is performed, and no desktop/VNC is enabled.
139
+ SSH: attach --ssh ALIAS --ssh-config PATH --remote-cli /absolute/path/reason
140
+ --artifact-sha256 HASH --config PATH --foreground [--credential-file PATH]
141
+ The config describes remote paths. An existing, SHA-256-pinned CLI is required.
142
+ SSH config must be protected (0600); it explicitly owns IdentityFile and host trust.
143
+ ProxyJump/ProxyCommand are unsupported; configure a directly reachable alias.
144
+ Pretrust known_hosts. No agent forwarding, automatic installation or detached service.
145
+ SSH starts with a clean environment. Custom PLAYWRIGHT_BROWSERS_PATH locations
146
+ are not forwarded/supported; running is not a browser-readiness receipt.
147
+ Closing SSH stops foreground work; persistent enrollment remains for restart/revoke.
148
+ `;function yV($){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 kV=1e4,hV=2000,_6=15000,fV=50;async function W6($,J,Z,Q,X,Y){let V=new s1,N=new AbortController,G,H,M=new Promise((I,C)=>{G=I,H=C});if(M.catch(()=>{}),m0(),$.executionMode==="host")l1();Z("enrollment_started");let U=X(V);U.catch(()=>{});let B=null,q=W2($,J,(I)=>{if(!B)throw Error("worker_starting");return B(I)});q.catch(()=>{}),Z("readiness_started");let L=new AbortController,T,_=AbortSignal.any([N.signal,L.signal,...Q.signal?[Q.signal]:[]]),W=Y?.matches($)?Y.result:void 0;if(Y&&!W)await Y.stop();if(W)_.addEventListener("abort",()=>void Y.stop(),{once:!0});let O,F=new Promise((I)=>{O=I}),z=setTimeout(()=>O(),kV);_.addEventListener("abort",()=>O(),{once:!0});let j,D=(I)=>{if(I==="ready")j=setTimeout(()=>O(),hV);Q.onStartup?.(I)},R=y1($,Q.readinessProbes,_,M,void 0,W,F);R.final.catch(()=>{});try{let I;try{I=await U}catch(C){throw N.abort(),H(Error("worker_enrollment_failed")),await R.final.catch(()=>{}),await q.then((P)=>P(),()=>{}),C}Z("enrollment_completed"),T=setTimeout(()=>L.abort(),Math.max(1,Math.min(_6,Date.parse(I.worker?.expiresAt??"")-Date.now()||_6))),G(I.roots[0].permissions),R0($,{version:1,drained:!1,revoked:!1}),await c1($,I,V,J,{...Q,onStartup:D,prestartedReadiness:R,prestartedControl:{closed:q,handle:(C)=>{B=C}},deferOptionalLanes:!0})}finally{clearTimeout(T),clearTimeout(z),clearTimeout(j),N.abort(),V.deleteBinding(),V.deleteKey(),await q.then((I)=>I(),()=>{})}}async function vV($,J,Z,Q){let{handoffFd:X}=L6($);if(N1(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:(L)=>b1(L);if(G||!q)return;try{m0(),l1()}catch{return}if(Y=s8(q),!Z.readinessProbes)setImmediate(()=>{if(G)return;try{S2()}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??F6)({fd:X,onBooted:()=>{Q("standby_booted"),V=setTimeout(N,fV)},onArriving:()=>clearTimeout(V)})}catch(q){clearTimeout(V);let L=q instanceof Error&&/^worker_standby_[a-z_]+$/.test(q.message)?q.message:"worker_standby_failed";return(J.io??process).stderr.write(`Reason worker: ${L}.
149
+ `),await Y?.stop(),(J.exitProcess??((T)=>process.exit(T)))(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{e(g(U),!0);let q=await O6(U,()=>{});try{if(Q("lock_acquired"),o(U))throw Error("worker_ephemeral_requires_fresh_enrollment");return U$(U),await W6(U,q.owner.nonce,Q,Z,(L)=>o0(U,B,L,J.enroll),Y),0}finally{q.release()}}finally{await Y?.stop()}}async function M$($,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()})+`
150
+ `),J.onStartup?.(G)},N={...J,onStartup:V,onDeviceRevoked:()=>{X=!0,J.onDeviceRevoked?.()},startupTiming:()=>{let G=(q)=>Math.min(n$,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(D6.flatMap((q)=>{let L=Y.get(q);return L===void 0?[]:[[q,G(L-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})+`
151
+ `)}J.onEvent?.(G)}};try{if($[0]==="__preview-probe"){if($.length!==1||N1(J.environment??process.env).length>0)throw Error("worker_invalid_probe_invocation");return await N6()}if($[0]==="attach"||$[0]==="__ssh-bootstrap"||$[0]==="__ssh-reverse"){if(N1(J.environment??process.env).length>0)throw Error("worker_unsafe_environment");if($[0]==="attach")return await Z6($.slice(1),J);if($.length!==1)throw Error("worker_unknown_or_duplicate_flag");if($[0]==="__ssh-reverse")return await K6();return await tJ(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(N1(J.environment??process.env).length>0)throw Error("worker_unsafe_environment");let L=J0.parse(JSON.parse(s($[2]))),T=await O2(L,q?void 0:t);return Z.stdout.write(JSON.stringify(T)+`
152
+ `),T.state==="current"?3:T.state==="busy"?75:0}if($[0]==="standby")return await vV($,J,N,V);let G=yV($);if(!G)return Z.stdout.write(wV),0;if(N1(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=J0.parse(JSON.parse(s(G.configPath))),M=(q)=>Z.stdout.write(JSON.stringify(q)+`
153
+ `),U=o(H);if(G.action==="status"||G.action==="doctor"){let q=await K0(H,"status"),L=$0(H),T={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:L.drained,revoked:L.revoked,live:q};if(G.action==="status")return M(T),0;let _=!0;try{U$(H)}catch{_=!1}return M({...T,workspace:_,platform:process.platform,executionMode:H.executionMode,proofStorage:H.lifetime==="ephemeral"?"process-memory":U&&L0(H)instanceof i$?"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&&!T.expired}),_&&(U||q)&&!T.revoked&&!T.expired?0:1}if(["drain","resume","stop"].includes(G.action)){let q=G.action==="drain"?"drain":G.action==="resume"?"resume":"stop",L=await K0(H,q);if(L){if(M(L),q==="stop"&&H.lifetime==="ephemeral"&&!G.json)Z.stderr.write(gV);return 0}}e(g(H),!0);let B=await O6(H,()=>{if(!G.json)Z.stderr.write(`Waiting for the previous worker to stop\u2026
154
+ `)});try{if(G.action==="start")V("lock_acquired");let q=o(H);if(["drain","resume","stop"].includes(G.action)){if(!q)throw Error("worker_not_enrolled");let L=$0(H);if(L.revoked||Date.parse(q.worker.expiresAt)<=Date.now())throw Error("worker_revoked_or_expired");if(G.action!=="stop")R0(H,{...L,drained:G.action==="drain"});return M({running:!1,drained:G.action==="stop"?L.drained:G.action==="drain"}),0}if(G.action==="enroll"){if(H.lifetime!=="persistent")throw Error("worker_ephemeral_requires_start_enrollment_file");let L=G.enrollmentPath,T=!L&&$0(H).revoked;if(q&&!T)throw Error("worker_already_enrolled");U$(H);let _=()=>{w0(H),N4(H)};if(T)_();let W=async()=>{let z=Y2(H),j=L?await D3(H,L,z,J.enroll):await j6(H,G.credentialPath,J,z);return{proof:z,enrolled:j}},{proof:O,enrolled:F}=await W().catch((z)=>{if(L||!(z instanceof t0)||!z.deviceRemoved)throw z;return _(),W()});return k0(F,d(H).state,{proofStore:O}),R0(H,{version:1,drained:!1,revoked:!1}),M({enrolled:!0,deviceId:F.deviceId,lifetime:H.lifetime}),0}if(G.action==="revoke"){if(!q)throw Error("worker_not_enrolled");let L=L0(H),T=new d1(W$(H.apiOrigin),S0(H.proxy),L);if(R0(H,{version:1,drained:!0,revoked:!0}),J.revoke)await J.revoke(q,T);else await T.disconnect(q,AbortSignal.timeout(30000));return w0(H),M({revoked:!0,localKeyRemoved:!0}),0}if(U$(H),H.lifetime==="ephemeral"){if(q)throw Error("worker_ephemeral_requires_fresh_enrollment");await W6(H,B.owner.nonce,V,N,async(L)=>G.enrollmentPath?D3(H,G.enrollmentPath,L,J.enroll):j6(H,void 0,J,L,"worker_ephemeral_enrollment_required"))}else{if(G.enrollmentPath)throw Error("worker_start_never_reenrolls_persistent_identity");if(!q)throw Error("worker_not_enrolled");if($0(H).revoked)X=!0;await c1(H,q,L0(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}.
155
+ `);let M=$.includes("--json")?void 0:e$(G instanceof t0&&G.deviceRemoved?"worker_enrollment_device_removed":H);if(M)Z.stderr.write(`${M}
156
+ `);return H==="worker_revoked"&&X?0:1}}var mV=60000;async function O6($,J){let Z=Date.now()+$.shutdownGraceMs+mV,Q=!1;for(;;){let X=e0({path:d($).lock,runtimeVersion:t});if(X.acquired)return X;let Y=await K0($,"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 gV='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 j6($,J,Z,Q,X="worker_session_login_required"){if(Z.enrollmentInput&&!J){let G=performance.now();return o0($,await Z.enrollmentInput($),Q,Z.enroll,G)}let Y=J??_$($),V=await(Z.enrollmentCredentials??j$)($,Y);if(!V)throw Error(X);let N=Z.createTicketClient?.(V)??new A$(V,{credentialsPath:Y,fetchImpl:S0($.proxy)});return U4($,V,N,Q,Z.enroll)}import{spawn as uV}from"child_process";import{readFileSync as dV,unlinkSync as pV}from"fs";import{join as lV}from"path";var cV=120,sV=15,aV=5000;function i2($={}){let J=$.stateDirectory?lV($.stateDirectory,iV):null;if(J)nV(J);let Z=Z1();if(!Z)return null;let Q=process.platform==="win32",X=Math.max(1,Math.floor($.limitSeconds??cV)),Y=$.pid??process.pid,V=Math.min(sV,X),N=J?`printf '%s %s %s\\n' "$(date +%s)" ${X+V} ${z6(t)} > ${z6(J)} 2>/dev/null
157
+ `:"",G=(L)=>`[ $((SECONDS - started)) -ge ${Math.max(1,L-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}; }
158
+ while :; do started=$SECONDS
159
+ IFS= read -r -t ${X} pulse && continue
160
+ ${G(X)} && parent_is_worker || exit 0
161
+ started=$SECONDS
162
+ IFS= read -r -t ${V} pulse && continue
163
+ if ${G(V)} && parent_is_worker; then
164
+ echo "Reason: worker_event_loop_stalled; no progress for ${X+V}s, restarting the worker." >&2
165
+ ${N}${M}
166
+ fi
167
+ exit 0
168
+ done`,B=uV(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(`
169
+ `),Math.min(aV,X*1000/4));return q.unref(),B.unref(),{stop(){clearInterval(q),B.stdin.end()}}}var iV="worker-stalled";function z6($){return`'${$.replaceAll("'","'\\''")}'`}function nV($){let J;try{J=dV($,"utf8"),pV($)}catch{return}let Z=/^(\d{1,12}) (\d{1,6}) ([0-9A-Za-z.+-]{1,64})\n?$/.exec(J);if(!Z)return;try{p1(l2(),{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 JG=`Share this computer as a machine
170
+
171
+ Usage:
172
+ reason serve This computer, signed in (machine name: its hostname)
173
+ reason serve --token rmt_\u2026 Any server, no login: the token names the machine
174
+ reason serve NAME [--dir PATH] [--once] [--sandbox] [--yes]
175
+ reason serve [NAME | --token rmt_\u2026] [--dir PATH] --service
176
+ reason serve NAME --stop [--json] (same as: reason stop NAME)
177
+
178
+ Adds this computer as a worker of a machine and waits for sessions. Start one
179
+ from anywhere with: reason "fix the flaky test" --on NAME
180
+ (To run one session here yourself, run \`reason "PROMPT"\` in the folder; it
181
+ needs no machine and serves only while that command runs.)
182
+ Sessions queue on the machine until one of its workers is free. Run
183
+ \`reason serve\` on more computers, or in more folders, to add workers.
184
+
185
+ Signed in, the machine is created if it doesn't exist (owners and admins).
186
+ Without a login, use a token from \`reason machines token NAME\`: --token, or
187
+ REASON_TOKEN. The token is used once to join and is never saved. Reconnect
188
+ later with \`reason serve NAME\` or the same command. Press Ctrl-C to stop.
189
+
190
+ With --service (macOS and Linux), this computer joins in the foreground, then
191
+ keeps the worker running in the background: it starts again at login (Linux:
192
+ at boot, when user lingering is allowed) and restarts if it fails. The service
193
+ runs \`reason serve NAME --dir PATH\` with this worker's saved identity; the
194
+ token is never saved. \`reason stop NAME\` stops and removes it.
195
+
196
+ Options:
197
+ --dir PATH Folder sessions work in (default: the current directory)
198
+ --once Keep the worker only while this command runs; nothing is saved
199
+ --sandbox Run confined. Sandboxed machines can't host sessions yet.
200
+ --yes Accept the first-run confirmation (required without a terminal;
201
+ a token already carries it)
202
+ --service Keep this worker running as a background service (see above)
203
+ --stop Stop this computer's running workers for NAME and remove
204
+ their background services. They stay in Reason and can
205
+ start again; \`reason disconnect NAME\` removes them.
206
+
207
+ Sessions run commands in the folder with the permissions of the user who runs
208
+ the worker unless --sandbox is set. Settings live in
209
+ ~/.reason/workers/NAME@<folder hash>/worker.json, one per folder, so every
210
+ folder served for NAME is its own worker. Use
211
+ \`reason worker status|revoke --config <that file>\` for advanced control.
212
+ `,ZG=/^[A-Za-z0-9][A-Za-z0-9._-]{0,31}$/,QG=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,I6="Machine NAME must start with a letter or digit and use only letters, digits or hyphens (max 63).",A6=["REASON_TOKEN","REASON_MACHINE_TOKEN"],E6="my-computer";function x9($){let J=($.trim().split(".")[0]??"").toLowerCase().replace(/[^a-z0-9-]+/g,"-").replace(/-{2,}/g,"-").slice(0,63).replace(/^-+|-+$/g,"");return J&&C1(J)&&J!==F2?J:E6}class Q0 extends Error{}function XG($,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 Q0(`Missing value after ${M}.`);if(Q.has(M))throw new Q0(`${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 Q0(`Unknown option: ${M}. Run \`reason serve --help\`.`);if(Z!==void 0)throw new Q0("Expected one machine NAME.");Z=M}let Y=X.has("--stop");if(Z===void 0&&Y)throw new Q0("Missing machine NAME. Usage: reason stop NAME");if(Z!==void 0){if(!C1(Z)&&!ZG.test(Z))throw new Q0(I6);if(Z.toLowerCase()===F2)throw new Q0(`"${F2}" is reserved for Reason's cloud. Choose another NAME.`)}if(Y&&(Q.size>0||[...X].some((H)=>H!=="--stop"&&H!=="--json")))throw new Q0("--stop takes only NAME and --json.");if(!Y&&X.has("--json"))throw new Q0("--json is only used with --stop.");if(X.has("--service")&&X.has("--once"))throw new Q0("--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 Q0("That is not a machine token (they start with rmt_). Create one with: reason machines token NAME");if(N!==void 0&&!QG.test(N))throw new Q0("--org must be a workspace id.")}else if(N!==void 0)throw new Q0("--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 o2($,J){let Z=$G($,J??"."),Q;try{Q=process.platform==="win32"?E9.native(Z):E9(Z)}catch{throw new Q0(`Folder not found: ${Z}`)}if(!oV(Q).isDirectory())throw new Q0(`Not a folder: ${Q}`);return Q}var n2=($)=>c$($,".reason","workers"),P9=($)=>u(d($).state);function YG($,J,Z){let Q=c$(n2($),J);if(A0(c$(Q,"worker.json"))?.workspaceRoot===Z)return Q;return c$(n2($),`${J}@${rV("sha256").update(Z).digest("hex").slice(0,8)}`)}function x6($){let{stateDirectory:J}=$;if(r1($.workspaceRoot,J)||r1(J,$.workspaceRoot))throw new Q0(`${$.workspaceRoot} contains Reason's machine settings (~/.reason). Pick a project folder with --dir.`);return J0.parse({version:1,apiOrigin:$.apiOrigin,channel:$.channel,stateDirectory:J,workspaceRoot:$.workspaceRoot,lifetime:$.once?"ephemeral":"persistent",executionMode:$.sandbox?"confined":"host",name:$.name})}function A0($){if(!u($))return null;let J=new Q0(`${$} 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=J0.safeParse(Z);if(!Q.success)throw J;return Q.data}function I9($){return[`--dir ${$.workspaceRoot}`,...$.executionMode==="confined"?["--sandbox"]:[]].join(" ")}async function VG($,J){$.stdout.write(`${J} [y/N] `);let Z=await R6($.stdin,new AbortController().signal);return/^(y|yes)$/i.test(Z?.trim()??"")}function e2($){return{write(J){if(J.startsWith('{"event":"worker.startup"'))return!0;return $.write(J)}}}var GG={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 S6($){try{return await $()}catch(J){let Z=J instanceof v0?GG[J.code]:void 0;throw Z?Error(Z):J}}async function BG($,J,Z,Q){let X=x6({...J,name:$.name??E6,stateDirectory:c$(n2(Z),".token-enrollment")}),Y=D$(X,{stored:!1}),V=await S6(()=>C6({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 Q0(`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 Q0(`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 KG($,J,Z,Q){return async(X)=>{if(J)return J.input(X);let Y=await(Z.worker?.enrollmentCredentials??j$)(X);if(!Y)throw Error("worker_session_login_required");let V=(Z.createApi??((N)=>new A$(N)))(Y);return K4(X,Y,{createHeadlessDeviceEnrollmentTicket:(N)=>S6(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 "${$}".
213
+ `)}catch(G){if(!(G instanceof v0)||G.status!==409)throw G}return V.createMachineEnrollmentTicket($,N)})})}}async function b6($,J,Z,Q){let X=await O2($,Q,()=>P6($,J,Z));if(X.state==="current"||X.state==="busy")return X;if(!X$($,J,Z))return null;return x3($),X}function S9($,J){let Z=n2($);if(!u(Z))return[];let Q=J.toLowerCase();return tV(Z).sort().flatMap((X)=>{let Y=X.toLowerCase();if(Y!==Q&&!Y.startsWith(`${Q}@`))return[];let V=c$(Z,X,"worker.json"),N=A0(V);return N?[{path:V,config:N}]:[]})}async function UG($,J,Z,Q,X){let Y=S9(J,$.name);if(Y.length===0)throw new Q0(`No worker for machine "${$.name}" on this computer.`);let V=Q.controlWorker??K0,N=[];for(let G of Y){let H=await V(G.config,"stop")!==null,M=t2(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.
214
+ `);if(!$.json)Z.stdout.write(U?`Stopping machine "${$.name}" in ${G.config.workspaceRoot}; current work finishes first.
215
+ `:`Machine "${$.name}" in ${G.config.workspaceRoot} is not running.
216
+ `)}if($.json)Z.stdout.write(`${JSON.stringify({machine:$.name,workers:N})}
217
+ `);return 0}async function w6($,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??M$,X=J.env??process.env,Y=A6.map((V)=>X[V]?.trim()).find(Boolean)||void 0;if(!J.env)for(let V of A6)delete process.env[V];try{let V=XG($,Y);if(!V)return Z.stdout.write(JG),0;let N=E9(J.home??H0()),G=J.serviceHost??Q$(N);if(V.stop)return await UG({...V,name:V.name},N,Z,J,G);let H=J.channel??Z$(),M=o2(J.cwd??process.cwd(),V.dir),U=V.service?H1(G,X):void 0,B={channel:H,apiOrigin:t1(X,H),workspaceRoot:M,once:V.once,sandbox:V.sandbox},q=V.token?await BG({...V,token:V.token},B,N,J):void 0,L=q?.name??V.name??x9((J.hostname??eV)()),T=YG(N,L,M),_=c$(T,"worker.json"),W=A0(_);if(q&&W&&P9(W)&&$0(W).revoked)w0(W);let O=!q&&W!==null&&P9(W)&&(!u1(X,"REASON_API_URL")?.trim()||C0(B.apiOrigin,W.apiOrigin))?W.apiOrigin:void 0,F=x6({...B,...O?{apiOrigin:O}:{},name:L,stateDirectory:T}),z=W!==null&&P9(W);if(z&&U0(W)!==U0(F)){if(F.lifetime==="ephemeral")throw new Q0(`Machine "${L}" is already saved for this folder; --once needs another folder or NAME.`);throw new Q0(`Machine "${L}" is already set up with different settings (${W.workspaceRoot}, ${W.executionMode==="host"?"your user permissions":"sandboxed"}).
218
+ Run it with: reason serve ${L} ${I9(W)}
219
+ Or remove it first: reason worker revoke --config ${_}`)}let j=F.lifetime==="persistent"?q1(F,G):null;if(j&&!V.service&&X[p$]!==j.label)return Z.stdout.write(`Machine "${L}" in ${M} already runs as a background service (${j.label}).
220
+ Logs: ${j.logs}
221
+ Stop it with: reason stop ${L}
222
+ `),0;if(V.service&&z&&!j&&await(J.controlWorker??K0)(F,"status")!==null)throw new Q0(`Machine "${L}" is already running in ${M}. Stop it first (Ctrl-C, or reason stop ${L}), then run this again.`);let D=F.lifetime==="ephemeral"||!z;if(D&&!C1(L))throw new Q0(I6);if(F.executionMode==="confined")Z.stderr.write(`Note: sandboxed machines can't host sessions yet. Drop --sandbox to run sessions here.
223
+ `);else if(D&&!V.yes&&!q){let C=`Sessions on "${L}" will run commands in ${M} with your user permissions (no sandbox). Continue?`,P=Boolean(Z.stdin&&Z.stdinIsTty);if(!J.confirm&&!P)throw new Q0(`${C.replace(/ Continue\?$/,"")}
224
+ Re-run with --yes to confirm.`);if(!await(J.confirm??((h)=>VG(Z,h)))(C))return Z.stderr.write(`Cancelled. Nothing was added.
225
+ `),1}if(!z)e(F.stateDirectory,!0),c(_,F);let R={...J.worker,enrollmentInput:KG(L,q,J,Z)};if(F.lifetime==="persistent"&&!z){Z.stdout.write(`Adding this computer to machine "${L}"\u2026
226
+ `);let P=await Q(["enroll","--config",_],{...R,io:{stdout:{write:()=>!0},stderr:Z.stderr}});if(P!==0)return P}if(U){let C;try{C=r2({config:F,launcher:U,path:X.PATH||"/usr/local/bin:/usr/bin:/bin",host:G})}catch(P){if(!(P instanceof R$))throw P;throw new Q0(`${P.message}
227
+ This computer is added to machine "${L}". Run it in this terminal with: reason serve ${L} ${I9(F)}
228
+ Or try the background service again with: reason serve ${L} ${I9(F)} --service`)}return Z.stdout.write([`Reason machine "${L}" runs in the background`,` Folder: ${M}`,` Mode: ${F.executionMode==="host"?"runs with your user permissions":"sandboxed (can't host sessions yet)"}`,` Service: ${C.label} (starts at ${C.lingering?"boot":"login"}, restarts if it fails)`,` Logs: ${C.logs}`,`Start a session with: reason "\u2026" --on ${L}`,`Stop it with: reason stop ${L}`,...C.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(`
229
+ `)),0}Z.stdout.write([`Reason machine "${L}"`,` Folder: ${M}`,` Mode: ${F.executionMode==="host"?"runs with your user permissions":"sandboxed (can't host sessions yet)"}`,` Lifetime: ${F.lifetime==="persistent"?`saved; run \`reason serve ${L}\` again to reconnect`:"this run only (--once)"}`,"Connecting\u2026",""].join(`
230
+ `));let I=j&&X[p$]===j.label&&!J.runWorker?i2({stateDirectory:F.stateDirectory}):null;try{return await Q(["start","--config",_],{...R,io:{stdout:Z.stdout,stderr:e2(Z.stderr)},onStartup:(C)=>{if(C==="ready")Z.stdout.write(`Waiting for sessions\u2026 start one with: reason "\u2026" --on ${L}
231
+ `);J.worker?.onStartup?.(C)}})}finally{I?.stop()}}catch(V){if(V instanceof Q0||V instanceof R$){let H=V instanceof R$&&V.code?` (${V.code})`:"";return Z.stderr.write(`Reason: ${V.message}${H}
232
+ `),2}let N=V instanceof Error&&/^worker_[a-z_]+$/.test(V.message)?V.message:null,G=N?e$(N):void 0;return Z.stderr.write(`Reason: ${N?G?`${G} (${N})`:N:"could not prepare this machine."}
233
+ `),1}}var NG=200;var WF=K.strictObject({version:K.literal(1),session_ids:K.array(K.string().min(1).max(200)).max(NG)});function M1($){let J=o($);return J!==null&&Date.parse(J.worker?.expiresAt??"")>Date.now()&&!$0($).revoked}import{spawnSync as y6}from"child_process";import{readFileSync as HG,rmdirSync as qG,rmSync as MG}from"fs";import{join as b9}from"path";var LG=["Reason.app","Ara Sidecar.app","Ara Device.app"],TG="sidecar_retire_failed";function FG($){return b9($,"Library","Application Support","Ara","Sidecar")}function _G($){try{let J=HG(b9($,"Contents","Info.plist"),"utf8");return/<key>CFBundleIdentifier<\/key>\s*<string>so\.ara\.sidecar<\/string>/.test(J)}catch{return!1}}function h6($,J={}){let Z=FG($),Q=LG.map((N)=>b9(Z,N)).filter(_G);if(Q.length===0)return{status:"absent"};let X=J.processTable??(()=>y6("/bin/ps",["-xo","pid=,command="],{encoding:"utf8",timeout:5000}).stdout??""),Y=J.signal??((N)=>process.kill(N,"SIGTERM")),V=J.command??((N,G)=>y6(N,[...G],{stdio:"ignore",timeout:1e4}).status??1);try{for(let N of X().split(`
234
+ `)){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(k6,["-u",N]),MG(N,{recursive:!0,force:!0});try{qG(Z)}catch{}}catch{return{status:"failed",code:TG}}return{status:"removed",bundles:Q}}var CG=`Connect this computer to Reason
235
+
236
+ Usage:
237
+ reason connect Your computer, kept connected in the background
238
+ reason connect --to NAME Add it to team machine NAME (as reason serve NAME --service)
239
+ reason connect --token rmt_\u2026 Join a machine with no login (as reason serve --token \u2026 --service)
240
+ reason connect --once Only while this command runs; nothing is saved
241
+ reason connect --api-key KEY Without reason login: a headless box, with an API key that has
242
+ devices:write (or set REASON_API_KEY, which keeps it out of ps).
243
+ The connection keeps the key to renew itself (macOS: Keychain).
244
+ reason disconnect [NAME] Stop and remove it (NAME: this computer's workers for machine NAME);
245
+ it stays disconnected until you run reason connect
246
+
247
+ Settings, saved; run reason connect again to change them:
248
+ --folder PATH Where Sessions may run (yours: your home folder; a machine: the current folder)
249
+ --sessions N No longer needed: your computer runs every Session you start
250
+ --name NAME This computer's name in Reason (default: its hostname)
251
+ --api-url URL The Reason API to connect to (as REASON_API_URL)
252
+ --proxy URL Reach Reason through this proxy (HTTPS_PROXY is not used)
253
+ --proxy-ca-file PATH The proxy's PEM CA bundle
254
+ --user-chrome on|off Your Sessions may use your own Chrome and its signed-in profiles
255
+ (macOS, through the Reason extension; on by default)
256
+ --cloud-sessions on|off No longer needed: Reason does not read it
257
+ --minimal Keep this computer minimal: files, shell and terminal, no desktop,
258
+ computer use or browser use (reason desktop install adds them)
259
+ --local-logins on|off Your Sessions run on the Claude Code, Codex and Grok logins
260
+ on this computer (on by default; off with an API key).
261
+ Reason gets each login's current access token, never
262
+ its refresh token.
263
+
264
+ --keep-awake on|off macOS: keep this Mac awake while it runs Sessions (default on).
265
+ Applies at once, without reconnecting.
266
+ --add-folder PATH Let Sessions run in another folder too, on the same computer in
267
+ --remove-folder PATH Reason; or stop that. Applies at once; running Sessions in other
268
+ folders keep running. \`reason status --json\` lists the folders.
269
+
270
+ Your computer is Personal: it needs no machine and no admin role, and only you
271
+ start Sessions on it until you make it Team in Settings \u203A Computers. They run commands
272
+ with your user permissions (there is no sandbox mode). It starts again at login (Linux:
273
+ at boot, when lingering is allowed), restarts if it fails, and \`reason update\`
274
+ restarts it on the new version. \`reason status\` shows it.
275
+
276
+ It is connected in the workspace you signed in to. It is also connected, by
277
+ itself, in up to 8 other workspaces you belong to, as each one's own computer,
278
+ when this computer was signed in with the setup command Reason shows you (it
279
+ ends in --pair CODE, a one-time code from your signed-in Reason) or by the
280
+ Reason app, and was connected after that. Signed in with \`reason login\`
281
+ alone, or connected with --api-key or --once, it stays in the one workspace:
282
+ run the setup command from Reason here, then \`reason disconnect\` and
283
+ \`reason connect\` if it was connected before. One sign-in covers one computer;
284
+ a second computer needs its own. \`reason status\` says when this applies.
285
+
286
+ One computer serves several Reason accounts. Signed in as another account than
287
+ the one it is connected for, reason connect connects it for that account too,
288
+ as that account's own computer in the workspace it signed in to; the other
289
+ accounts stay connected. That account's \`reason logout\` removes only its own.
290
+ `,PG=`Disconnect this computer from Reason
291
+
292
+ Usage:
293
+ reason disconnect Stop your computer's connection and remove it from Reason, in every
294
+ workspace and for every Reason account it is connected for. It stays
295
+ disconnected (reason "\u2026" won't connect it) until you run reason connect
296
+ reason disconnect NAME Stop this computer's workers for machine NAME and remove them from Reason
297
+
298
+ --account Only the signed-in account's computer leaves Reason (all of it when it is
299
+ the only account here); it stays disconnected for that account until
300
+ its reason connect (the Reason app's Disconnect)
301
+ --temporary The Reason app's sign-out: only the signed-in account's computer leaves
302
+ Reason (all of it when it is the only account here), and it is not kept
303
+ disconnected: the next reason "\u2026" connects it again
304
+ --yes, -y Accepted for scripts; disconnect never asks
305
+ `;class l extends Error{code;constructor($,J="worker_connect_refused"){super($);this.code=J}}var IG=4,Z3={write:()=>!0};function g0($,J,Z=!1){let Q=X7($,J,Z);return Q.length===1?Q[0]:F0(d6(F0($,".config")),...Q7(J,Z))}var Q7=($,J)=>[...$==="production"?[]:[$],J?"connect-once":"connect"];function X7($,J,Z=!1){let Q=$;try{Q=Y$($)}catch{}return["ara","reason"].map((X)=>F0(Q,".config",X,...Q7(J,Z))).filter(EG)}function EG($){try{if(Y$($)!==$)return!1;return A0(F0($,"worker.json"))?.stateDirectory===$}catch{return!1}}var Y7="disconnected.json";function U_($,J){return u(F0(g0($,J),Y7))}function Q3($,J,Z){let Q=F0(g0($,J),Y7);if(!Z){L1(Q,{force:!0});return}e(m9(Q),!0),c(Q,{version:1,disconnected_at:new Date().toISOString()})}function xG($){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",$3,J3,"--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(J3)&&!J.has($3))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($3)),...M("proxyCaFile",J.get(J3)),...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 C$=($)=>u(d($).state),V7=`Reason: this computer now runs Sessions with your user permissions (its sandbox is gone).
306
+ `;function G7($){return $.executionMode==="host"?"runs with your user permissions":"sandboxed (can't host Sessions yet)"}function B7($){let{parsed:J,saved:Z}=$,Q=Z?.workspaceRoot??$.home;if(J.folder!==void 0)try{Q=o2($.options.cwd??process.cwd(),J.folder)}catch(N){throw new l(N instanceof Error?N.message:String(N))}if(!D1(Q,$.stateDirectory))throw new l(`${Q} holds Reason's own settings. Pick another folder with --folder.`);let X;try{X=J.apiUrl!==void 0?t1({REASON_API_URL:J.apiUrl},$.channel):Z&&!u1($.environment,"REASON_API_URL")?.trim()?Z.apiOrigin:t1($.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(!u6(X)&&!g6($.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=c6({proxyUrl:J.proxy,caFile:J.proxyCaFile},{home:$.home,statePath:$.stateDirectory})}catch(N){if(!(N instanceof p6))throw N;throw new l(N.message)}let V=(Z?.folders??[]).filter((N)=>N!==Q);return J0.parse({...V.length?{folders:V}:{},version:1,apiOrigin:X,channel:$.channel,stateDirectory:$.stateDirectory,workspaceRoot:Q,lifetime:$.lifetime,executionMode:"host",name:J.name??Z?.name??x9(($.options.hostname??AG)()),slots:J.sessions??Z?.slots??IG,...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 K7($,J){if($.localLogins!==void 0||J)return $;return J0.parse({...$,localLogins:!0})}async function g9($,J,Z,Q,X){if($0($).revoked){if(C$($))try{w0($)}catch{}A3($);let N=[];try{N=zG(g($))}catch{}for(let G of N)if(G!=="workspaces")L1(F0(g($),G),{recursive:!0,force:!0})}else if(C$($))w0($);e($.stateDirectory,!0),c(J,$);let Y=SG(Z.stderr),V=await(Q.runWorker??M$)(["enroll","--config",J],{...u9(Q.worker,X),io:{stdout:Z3,stderr:Y}});if(V!==0)Z.stderr.write(`Reason: this computer was not connected. (${Y.code()??"worker_command_failed"})
307
+ `);return V}function SG($){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 o1($,J,Z){let Q=i6(V2(A1("REASON_CLI_CHANNEL",J),$));return Q&&C0(Q.apiOrigin,Z.apiOrigin)?Q.orgId.toLowerCase():null}async function bG($,J,Z,Q){let{config:X,configPath:Y}=K2($,J),V=(H)=>{try{return H!==null&&M1(H)&&o(H)?.orgId.toLowerCase()===J}catch{return!1}},N=null;try{N=A0(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
308
+ `);let G=await g9(X,Y,Z,Q,void 0);if(G===0&&V(X))return 0;if(G===0&&C$(X))await X3(X,Y,Z,Q);if(L1(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 u9($,J){return J?{...$,enrollmentCredentials:(Z)=>q3(Z,J)}:{...$}}async function d9($,J,Z,Q,X,Y="connect"){if(await p9($,Q,X,Y),Y==="connect"&&!await L7($,Z,Q))return!1;if(!await X3($,J,Z,Q))return!1;return e9($.stateDirectory),L1($.stateDirectory,{recursive:!0,force:!0}),!0}async function X3($,J,Z,Q){if(!C$($)||$0($).revoked)return!0;for(let X=1;;X+=1){let Y=X===3;if(await(Q.runWorker??M$)(["revoke","--config",J],{...Q.worker,io:{stdout:Z3,stderr:Y?Z.stderr:Z3}})===0)return!0;if(Y)return!1;await new Promise((N)=>setTimeout(N,1000))}}async function p9($,J,Z,Q="connect",X=!1){let Y=J.controlWorker??K0,V=async()=>Y($,"status").catch(()=>null),N=await Y($,"stop").catch(()=>null)!==null,G=!X&&t2($,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 l9($,J){return J==="darwin"&&$.userChrome!==!1}function w9($,J,Z){let Q=[...l9($,J)?["your own Chrome profiles"]:[],...$.localLogins?["your Claude Code, Codex and Grok logins"]:[]];return[`\u2713 Connected "${$.name}" \xB7 Sessions run here, ${G7($).replace(/^runs /,"")}`,...Q.length>0?[` Uses ${Q.join(" and ")} (reason connect --help to change)`]:[],...Z,""].join(`
309
+ `)}function y9($,J,Z,Q){return[$,` Name: ${J.name}`,` Folder: ${J.workspaceRoot}`,...(J.folders??[]).map((X)=>` ${X}`)," Sessions: every Session you start",` Mode: ${G7(J)}`,...J.proxy?[` Proxy: ${l6(J.proxy)}`]:[],...l9(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(`
310
+ `)}async function f6($,J,Z){let{io:Q,options:X}=Z;if(X7(Z.home,Z.channel).length===2)Q.stderr.write(`${JSON.stringify({event:"worker.connection_bound_twice",chosen:m9(J),timestamp:new Date().toISOString()})}
311
+ `);let Y=L2(F0(Z.home,".config"));if(Y.problem)Q.stderr.write(`${JSON.stringify({event:"worker.config_rename",code:Y.problem,timestamp:new Date().toISOString()})}
312
+ `);_9(Z.home,Z.host.platform);let V=b4({home:Z.home,channel:Z.channel,saved:$,configPath:J,log:(q)=>Q.stderr.write(`${q}
313
+ `),host:Z.host}),N=A4({...V,log:(q)=>Q.stderr.write(`${q}
314
+ `)}),{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,L)=>{let T=V3(Z.home,Z.channel),_;try{let O=null;try{O=L.keep?null:o(H)?.orgId.toLowerCase()??null}catch{}if(_=N2(H,{prefer:o1(Z.home,Z.channel,H),...L}),_&&O)U2(_,O)}finally{T()}if(!_)return!1;H=_;let W="";try{W=` (workspace ${o(_)?.orgId??"unknown"})`}catch{}return Q.stderr.write(`Reason: ${q}; this computer goes on running Sessions for its other Reason account${W}.
315
+ `),!0};if($0(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"||!M1(H)){let q=d0(H.stateDirectory)??void 0,L=q?null:o1(Z.home,Z.channel,H);if(!q&&!(L&&R1(H,L)))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||!M1(H)){let q=d0(H.stateDirectory)??void 0;if(Q.stderr.write(U?V7:`Reason: this computer's connection expired; renewing it with ${q?"its API key":"your login"}\u2026
316
+ `),await g9(J0.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-zjqyxvxe.js").then(({runBackgroundAskRelay:q})=>q(B.signal,(L)=>Q.stderr.write(`${L}
317
+ `))).catch(()=>{});try{for(;;){let q=d0(H.stateDirectory)===null?{ownerWorkspaces:X.worker?.ownerWorkspaces??{}}:{},L=X.runWorker?null:i2({stateDirectory:H.stateDirectory}),T=!1,_;try{_=await(X.runWorker??M$)(["start","--config",G],{deferOptionalLanes:!0,...X.worker,...q,ownComputer:!0,io:{stdout:Q.stdout,stderr:Q.stderr},onDeviceRevoked:()=>{T=!0}})}finally{L?.stop()}if(!T)return _;if(!M("this computer's connection was removed from Reason",{keep:!1}))break}return Q3(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 wG($,J,Z){let{io:Q,options:X,home:Y,channel:V,environment:N}=Z;if(J&&await(X.controlWorker??K0)(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=B7({parsed:$,saved:J,stateDirectory:G,lifetime:"ephemeral",home:Y,channel:V,options:X,environment:N}),M=K7(H,Z.apiKey??(J?d0(J.stateDirectory)??void 0:void 0)),U=F0(G,"worker.json");return e(G,!0),c(U,M),Q.stdout.write(y9(`Reason: connecting "${M.name}" while this command runs`,M,Z.host.platform,["Connecting\u2026"])),(X.runWorker??M$)(["start","--config",U],{...u9(X.worker,Z.apiKey),ownComputer:!0,io:{stdout:Q.stdout,stderr:e2(Q.stderr)},onStartup:(B)=>{if(B==="ready")Q.stdout.write(`Connected. Start Sessions on "${M.name}" from Reason. Press Ctrl-C to stop.
318
+ `);X.worker?.onStartup?.(B)}})}function yG($,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.");e(g(J),!0),h4(d(J).daemon,$);let X=T2(d(J).daemon)==="battery_and_ac";return Q.stdout.write(`Keep awake: ${X?"on (this Mac stays awake while it runs Sessions)":"off"}
319
+ `),0}var kG=K.object({root:K.object({id:K.string().min(1).max(160),label:K.string().max(160),path_fingerprint:K.string()})});async function U7($,J,Z,Q){let X=await(u9(Q.worker,Z).enrollmentCredentials??j$)($,_$($));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 A$(X,{credentialsPath:_$($),fetchImpl:S0($.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=kG.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 N7($,J,Z){k0({...J,roots:Z,handsSlots:$.slots,worker:{...J.worker,configDigest:U0($)}},d($).state,{proofStore:L0($)})}async function H7($,J,Z,Q){let{io:X,options:Y,host:V}=Q,N=J&&!Q.apiKey&&d0(J.stateDirectory)===null?o1(Q.home,Q.channel,J):null,G=J&&N&&C$(J)&&!R1(J,N)?y0(J).find((C)=>C.account&&C.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&&C$(H)&&!$0(H).revoked?o(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,L=Y.cwd??process.cwd(),T;try{T=o2(L,q)}catch(C){if(B)throw new l(C instanceof Error?C.message:String(C));T=RG(L,q)}if(T===H.workspaceRoot)throw new l(`${T} is this computer's main folder. To use another one, run reason connect --folder PATH.`);let _=H.folders??[],W=U.roots.slice(1).find((C)=>C.path===T);if(!B&&!W&&!_.includes(T))throw new l(`${T} is not one of this computer's folders.`);if(B&&!D1(T,H.stateDirectory))throw new l(`${T} holds Reason's own settings.`);if(B&&!W&&_.length>=31)throw new l("This computer already has the most folders Reason allows (32).");let O=Q.apiKey??d0(H.stateDirectory)??void 0,F=await U7(H,U,O,Y),z=U.roots.filter((C)=>C.path!==T);if(B)z=[...z,await F.add(T)];else if(W)await F.remove(W.id);N7(H,U,z);let j=B?[..._.filter((C)=>C!==T),T]:_.filter((C)=>C!==T),{folders:D,...R}=H;if(c(M,J0.parse({...R,...j.length?{folders:j}:{}})),!await(Y.controlWorker??K0)(J,"reload_roots").then(()=>!0,()=>!1))X$(J,V,"connect");return X.stdout.write(B?`Added ${T}. Sessions on "${H.name}" may run in it.
320
+ `:`Removed ${T}. Sessions on "${H.name}" no longer run in it.
321
+ `),0}async function N_($,J,Z){let Q=k9(Z),X=V3(Q.home,Q.channel);try{let Y=F0(g0(Q.home,Q.channel),"worker.json");return await H7({once:!1,yes:J,addFolder:$},A0(Y),Y,Q)===0}finally{X()}}function k9($,J){let Z=Y$($.home??H0()),Q=$.env??process.env;return{io:$.io??Y3(),options:$,home:Z,channel:$.channel??Z$(),environment:Q,apiKey:J??n6(Q),host:$.serviceHost??Q$(Z)}}async function hG($,J,Z,Q){let X=o($),Y=X.roots;if(J.workspaceRoot!==$.workspaceRoot){let V=await U7($,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)]}N7(J,X,Y)}var q7=Symbol("serve here");async function fG($,J,Z,Q){let{io:X,options:Y,home:V,channel:N,environment:G,host:H}=Q;if(H.platform==="darwin"){let E=h6(V);if(E.status==="failed")X.stderr.write(`Reason: could not remove the retired Reason Device helper (${E.code}).
322
+ `)}let M=J&&!Q.apiKey&&d0(J.stateDirectory)===null?o1(V,N,J):null,U=J&&M&&$0(J).revoked&&y0(J).some((E)=>E.account&&E.organizationId===M)?N2(J,{prefer:M,keep:!1})??J:J,B=B7({parsed:$,saved:U,stateDirectory:g0(V,N),lifetime:"persistent",home:V,channel:N,options:Y,environment:G});if(Q3(V,N,!1),U?.executionMode==="confined")X.stdout.write(V7);let q=U?d0(U.stateDirectory):null,L=K7(B,Q.apiKey??q??void 0),T=H1(H,G),_=U!==null&&C$(U),W=_&&U0(U)===U0(L),O=W&&M1(L),F=U?.userChrome!==!1===(L.userChrome!==!1)&&U?.cloudSessions===L.cloudSessions&&U?.localLogins===L.localLogins,z=Q.apiKey??q??void 0,j=M!==null&&_&&!$0(U).revoked&&!R1(U,M);if(j){if(!W||!F||JSON.stringify(U.proxy)!==JSON.stringify(L.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 bG(U,M,X,Y);if(E!==0)return E}let D=j?[` Account: yours too, in workspace ${M}, beside this computer's other Reason account`]:[],R=async()=>{if($.apiKey===void 0||$.apiKey===q)return;await q3(L,$.apiKey),H3(L.stateDirectory,$.apiKey)},I=G.PATH||"/usr/local/bin:/usr/bin:/bin",C=O&&JSON.stringify(U?.proxy)===JSON.stringify(L.proxy)&&F?q1(L,H,"connect"):null,P=C?.label===r6(L.channel),h=P?await(Y.controlWorker??K0)(L,"status").catch(()=>null):null,S=h!==null,k=P&&!S&&v9(C,H)&&e6({config:L,launcher:T,path:I,host:H,kind:"connect"});if((S||k)&&[null,t].includes(P1(L))){await R();let E=o6(L,H,"connect");if(E==="retired"){let A=k?null:await(Y.controlWorker??K0)(L,"status").catch(()=>null);if(!k&&(!A||A.phase==="stopping"))X$(L,H,"connect")}else if(E==="current_not_running")X$(L,H,"connect");else if(H.platform==="win32"&&h&&(h.capabilityReadiness?.["exec.run"]===!1||h.supportedOperations?.includes("exec.run")===!1)&&dG())X$(L,H,"connect");return await(Y.controlWorker??K0)(L,"reload_roots").catch(()=>null),X.stdout.write(G.REASON_INSTALLER==="1"?w9(L,H.platform,D):y9("This computer is connected to Reason",L,H.platform,[...D,...k?[" 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&&!j;if(_&&!W)if(U.apiOrigin!==L.apiOrigin||U.name!==L.name){if(X.stdout.write(`Reconnecting this computer with its new settings\u2026
323
+ `),!await d9(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"&&M1(U))X.stdout.write(`Applying the new settings to this computer\u2026
324
+ `),await hG(U,L,z,Y),p=!1;else await p9(U,Y,H);if(p){if(G.REASON_INSTALLER!=="1")X.stdout.write(`Connecting this computer to Reason\u2026
325
+ `);let E=await g9(L,Z,X,Y,z);if(E!==0)return E;if(z)H3(L.stateDirectory,z)}else c(Z,L),await R();let b;try{b=r2({config:L,launcher:T,path:I,host:H,kind:"connect"})}catch(E){if(!(E instanceof R$))throw E;if(E.code!=="worker_service_manager_missing")throw new l(`${E.message}
326
+ 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).
327
+ `),q7;if(Y.serveHere&&G.REASON_INSTALLER==="1"&&await vG(L,T,G,Y))return X.stdout.write(w9(L,H.platform,[` No service manager here: it runs until this computer restarts (keep it with ${T} connect under a process manager)`])),0;throw new R$(`${E.message}
328
+ This computer is set up. Keep it connected by running ${T} connect in a terminal or under this box's process manager.`,E.code)}let x=[...D,...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"?w9(L,H.platform,x):y9("This computer is connected to Reason",L,H.platform,[` Service: ${b.label} (starts at ${b.lingering?"boot":"login"}, restarts if it fails)`,` Logs: ${b.logs}`,`Start Sessions on "${L.name}" from Reason. Remove it with: reason disconnect`,...x])),0}async function vG($,J,Z,Q){let{REASON_INSTALLER:X,...Y}=Z;(Q.startConnection??M7)(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??K0)($,"status").catch(()=>null))return!0;return!1}function M7($,J,Z){let Q=Z7(Z,"a",384);try{let X=$7($,["connect"],{detached:!0,stdio:["ignore",Q,Q],env:J});X.on("error",()=>{return}),X.unref()}finally{J7(Q)}}async function L7($,J,Z,Q=!1){let X=!0;for(let Y of y0($)){if(Q&&Y.account)continue;if(Y.config&&C$(Y.config)&&!$0(Y.config).revoked){if(await(Z.runWorker??M$)(["revoke","--config",Y.configPath],{...Z.worker,io:{stdout:Z3,stderr:J.stderr}})!==0){X=!1;continue}}L1(Y.directory,{recursive:!0,force:!0})}return X}function Y3(){return{stdout:process.stdout,stderr:process.stderr,stdin:process.stdin,stdinIsTty:Boolean(process.stdin.isTTY),stdoutIsTty:Boolean(process.stdout.isTTY)}}function c9($,J){if($ instanceof l||$ instanceof R$)return J.stderr.write(`Reason: ${$.message} (${$.code??"worker_service_failed"})
329
+ `),2;let Z=$ instanceof Error&&/^worker_[a-z_]+$/.test($.message)?$.message:gG($);return J.stderr.write(`Reason: ${e$(Z)??"could not connect this computer."} (${Z})
330
+ `),1}var mG=new Set(["EACCES","EPERM","ENOENT","ENOSPC","EROFS","ENOTDIR","EEXIST","ELOOP"]);function gG($){if($ instanceof v0)return $.status>=500?"worker_api_unavailable":"worker_api_refused";let J=$?.code;if(typeof J==="string"&&mG.has(J))return`worker_file_${J.toLowerCase()}`;return"worker_connect_unexpected"}function v6($,J){if($.minimal){F7({home:J.home});return}if($.once||J.options.desktop===!1||!J.io.stdinIsTty||_7({home:J.home})!=="install")return;let Z;try{Z=H1(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??m6)(Z,J.environment,{log:X}),J.io.stdout.write(`Desktop and browser use install in the background (reason desktop status; log ${X}).
331
+ `);return}J.io.stdout.write(`Installing desktop components first (reason connect --minimal skips them)\u2026
332
+ `);let Q=(J.options.installDesktop??m6)(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)
333
+ `)}function uG($){if($.host.platform!=="win32"||!$.io.stdinIsTty)return;h9();let J=f9();if(!WG(J)||w1(J))return;$.io.stdout.write(`Setting up the Windows sandbox for confined commands; approve the Windows prompt\u2026
334
+ `);let Z=s6(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)
335
+ `)}function dG(){if(Z1()===null)return!1;return h9(),w1(f9())}function m6($,J,Z){if(!Z){let X=()=>DG($,["desktop","install"],{env:J,stdio:"inherit"}).status??1,Y=X();return Y===3221225477?X():Y}OG(m9(Z.log),{recursive:!0,mode:448});let Q=Z7(Z.log,"w",384);try{let X=$7($,["desktop","install"],{detached:!0,stdio:["ignore",Q,Q],env:{...J,REASON_DESKTOP_BACKGROUND:"1"}});X.on("error",()=>{return}),X.unref()}finally{J7(Q)}return 0}async function H_($,J={}){let Z=J.io??Y3();try{let Q=xG($);if(!Q)return Z.stdout.write(CG),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 v6(Q,k9(J)),await(J.runServe??w6)([...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=k9(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=t6(V[p$],Y),G=N||Q.once?()=>{return}:V3(X.home,Y);try{let H=F0(g0(X.home,Y),"worker.json"),M=A0(H);if(N)return await f6(M,H,X);if(Q.keepAwake!==void 0)return yG(Q.keepAwake,M,X.host,Z);if(Q.addFolder!==void 0||Q.removeFolder!==void 0)return await H7(Q,M,H,X);if(v6(Q,X),uG(X),Q.once)return await wG(Q,M,X);let U=await fG(Q,M,H,X);if(U!==q7)return U;return G(),G=()=>{return},await f6(A0(H),H,X)}finally{G()}}catch(Q){return c9(Q,Z)}}async function q_($,J={}){let Z=J.io??Y3();try{if($.some((V)=>["--help","-h","help"].includes(V)))return Z.stdout.write(PG),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 cG(Q[0],Z,J);return await T7(Z,J,X?"temporary":Y?"account":"disconnect")}catch(Q){return c9(Q,Z)}}async function M_($={}){let J=$.io??Y3();try{return await T7(J,$,"logout")}catch(Z){return c9(Z,J)}}async function T7($,J,Z){let Q=Y$(J.home??H0()),X=J.channel??Z$(),Y=V3(Q,X);try{return await pG($,J,Z,Q,X)}finally{Y()}}function V3($,J){let Z=g0($,J),Q=u(Z)?t$():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 pG($,J,Z,Q,X){let Y=F0(g0(Q,X),"worker.json"),V=A0(Y);if(!V){if(Z==="disconnect")Q3(Q,X,!0);if(Z!=="logout")$.stdout.write(`This computer is not connected to Reason.
336
+ `);return 0}if(Z!=="disconnect"){let G=await lG(V,Y,$,J,Z,Q,X);if(G!==null)return G}let N=!1;try{N=await d9(V,Y,$,J,J.serviceHost??Q$(Q))}finally{if(Z!=="temporary")Q3(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.
337
+ `),1;return $.stdout.write(`Disconnected "${V.name}". It no longer runs Sessions; run reason connect to connect it again.
338
+ `),0}async function lG($,J,Z,Q,X,Y,V){let N=y0($).filter((_)=>_.account);if(N.length===0)return null;let G=o1(Y,V,$),H=Q.controlWorker??K0,M=N.find((_)=>_.organizationId===G);if(M){if(M.config&&!await X3(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.
339
+ `),1;if(X!=="account"||!M.config)L1(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.
340
+ `),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||!R1($,G)){if(X==="account"&&G)U2($,G);if(X!=="logout")Z.stdout.write(`This computer stays connected for its other Reason accounts; it was not connected for yours.
341
+ `);return 0}let U=Q.serviceHost??Q$(Y),B=null;try{B=o($)?.orgId.toLowerCase()??null}catch{}if(await p9($,Q,U,"connect",!0),!await L7($,Z,Q,!0)||!await X3($,J,Z,Q))return X$($,U,"connect"),Z.stderr.write(`Reason: Reason could not be reached to remove your account's Devices from this computer. Try again.
342
+ `),1;let q=N2($,{prefer:null,keep:!1});if(!q)return null;if(X==="account"&&B)U2(q,B);let L=X$(q,U,"connect")!==null,T="";try{T=` in workspace ${o(q)?.orgId??""}`}catch{}return Z.stdout.write(`Disconnected this computer for your account. It stays connected for its other Reason account${T}${L?"":"; run reason connect to start it again"}.
343
+ `),0}async function cG($,J,Z){let Q=Y$(Z.home??H0()),X=Z.serviceHost??Q$(Q),Y=S9(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 d9(N.config,N.path,J,Z,X,"serve"))J.stdout.write(`Disconnected machine "${$}" in ${N.config.workspaceRoot}.
344
+ `);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.
345
+ `);return V?1:0}async function L_($={}){let J=Y$($.home??H0()),Z=A0(F0(g0(J,$.channel??Z$()),"worker.json"));if(!Z)return null;let Q,X=await($.controlWorker??K0)(Z,"status").catch((q)=>{return Q=q instanceof Error?q:Error(String(q)),null}),Y=X?P1(Z):null,V=$.serviceHost??Q$(J),N=q1(Z,V,"connect"),G=$0(Z).revoked,H=!G&&!X,M=(()=>{try{return o(Z)}catch{return null}})(),{workspaces:U,off:B}=G||d0(Z.stateDirectory)!==null?{workspaces:null,off:null}:D4(Z,X?.phase==="running");return{workspaces:U,workspaces_off:B,workspaces_max:G2+(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:l9(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?v9(N,V):null,sessions_running:X?.activeSessions??null,version:Y,service:N?{label:N.label,logs:N.logs}:null}}async function T_($,J,Z=K0){let Q={version:1,status:"unavailable"},X=A0(F0(g0(Y$($),J==="stable"?"production":"staging"),"worker.json")),Y=X?await Z(X,"status").catch(()=>null):null;return X&&Y?.phase==="running"?a6({version:1,status:"connected",deviceId:Y.deviceId,apiOrigin:X.apiOrigin,managedRootIds:[]})??Q:Q}function F_($={}){try{let J=Y$($.home??H0());return A0(F0(g0(J,$.channel??Z$()),"worker.json"))?.userChrome!==!1}catch{return!1}}function __($={}){let J=Y$($.home??H0()),Z=A0(F0(g0(J,$.channel??Z$()),"worker.json"));if(!Z)return null;return X$(Z,$.serviceHost??Q$(J),"connect")?.label??null}async function j_($={}){let J=Y$($.home??H0()),Z=A0(F0(g0(J,$.channel??Z$()),"worker.json"));if(!Z)return null;let Q=$.serviceHost??Q$(J),X=await b6(Z,Q,"connect",$.current);if(X!==null||q1(Z,Q,"connect"))return X;return sG(Z,Q,$)}async function sG($,J,Z){let Q=Z.controlWorker??K0,X=await Q($,"status").catch(()=>null);if(!X)return null;if(Z.current!==void 0&&P1($)===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=H1(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??M7)(V,M,F0($.stateDirectory,"connect.log")),{state:"restarted"}}
346
+ export{d as a,o as b,T2 as c,A0 as d,CG as e,PG as f,g0 as g,U_ as h,N_ as i,H_ as j,q_ as k,M_ as l,L_ as m,T_ as n,F_ as o,__ as p,j_ as q};