@reason-machines/cli-linux-arm64 0.2.568 → 0.2.570
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/reason +1 -1
- package/bin/vm-hands/agent-network-nswyx8m2.js +2 -0
- package/bin/vm-hands/{api-credentials-ntpwt7rg.js → api-credentials-kp2sjeds.js} +1 -1
- package/bin/vm-hands/api-h2pwjbr1.js +2 -0
- package/bin/vm-hands/{ask-relay-hfa5kzxn.js → ask-relay-eqv9sq9m.js} +2 -2
- package/bin/vm-hands/connect-cli-gc79h47t.js +2 -0
- package/bin/vm-hands/{credentials-nfx99zxr.js → credentials-gwh93z0q.js} +1 -1
- package/bin/vm-hands/{custom-endpoint-device-5047vdn3.js → custom-endpoint-device-fdemgypq.js} +1 -1
- package/bin/vm-hands/desktop-account-15zym6ze.js +2 -0
- package/bin/vm-hands/desktop-components-py12mt6g.js +2 -0
- package/bin/vm-hands/{hands-worker-source-8a4kh44t.js → hands-worker-source-vd87swg4.js} +1 -1
- package/bin/vm-hands/{install-receipt-rckwjqmt.js → install-receipt-7hvy0181.js} +1 -1
- package/bin/vm-hands/local-automation-bt51qn3g.js +2 -0
- package/bin/vm-hands/local-capabilities-q9jvmztz.js +2 -0
- package/bin/vm-hands/local-display-session-j807vr40.js +2 -0
- package/bin/vm-hands/local-display-video-3b5qegyk.js +2 -0
- package/bin/vm-hands/local-managed-process-48t1899b.js +2 -0
- package/bin/vm-hands/{local-pty-session-w0yhjdvz.js → local-pty-session-bk7pp5nb.js} +1 -1
- package/bin/vm-hands/{managed-runtime-e4cj6r2s.js → managed-runtime-v7fz5zzh.js} +1 -1
- package/bin/vm-hands/{network-auto-update-8f2745gk.js → network-auto-update-1pfqzgd6.js} +2 -2
- package/bin/vm-hands/{network-contract-ht0psj5j.js → network-contract-8fjtkgma.js} +1 -1
- package/bin/vm-hands/{network-sign-in-s00679q9.js → network-sign-in-xdx20n1p.js} +1 -1
- package/bin/vm-hands/{permissions-74rj58e1.js → permissions-19yptfxx.js} +1 -1
- package/bin/vm-hands/{reason-hands-protocol-9r62swp0.js → reason-hands-protocol-yga8dh1m.js} +1 -1
- package/bin/vm-hands/{serve-service-19s965ze.js → serve-service-1sp5n0cm.js} +1 -1
- package/bin/vm-hands/{status-099b2ec1.js → status-pbv2pezp.js} +6 -6
- package/bin/vm-hands/{version-avq09c5d.js → version-w7r1n5k3.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-ksfd234v.js → vm-hands-entry-lite-10fwwbwj.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-bbjsnjct.js → vm-hands-entry-lite-13pzgnj9.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-fp3gaa2c.js → vm-hands-entry-lite-43ja1g10.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-8s5n4wps.js → vm-hands-entry-lite-4x9p79j4.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-vvhfaxpd.js → vm-hands-entry-lite-6dkjbe2b.js} +3 -3
- package/bin/vm-hands/{vm-hands-entry-lite-ezkb7f6j.js → vm-hands-entry-lite-7pj0tvht.js} +8 -8
- package/bin/vm-hands/{vm-hands-entry-lite-mktndd2r.js → vm-hands-entry-lite-7x2dnf35.js} +14 -14
- package/bin/vm-hands/{vm-hands-entry-lite-jm9jpj77.js → vm-hands-entry-lite-7z05qb3m.js} +11 -11
- package/bin/vm-hands/{vm-hands-entry-lite-bcz4qpp6.js → vm-hands-entry-lite-92qqzeas.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-0xfme8gg.js → vm-hands-entry-lite-a4fn6ye1.js} +2 -2
- package/bin/vm-hands/vm-hands-entry-lite-a8pm6cqb.js +10 -0
- package/bin/vm-hands/{vm-hands-entry-lite-7jmt3q38.js → vm-hands-entry-lite-asyv9pk8.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-t2rhwchw.js → vm-hands-entry-lite-cg84jcgd.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-7aeqbfc8.js → vm-hands-entry-lite-ck130wm6.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-vha0pf8k.js → vm-hands-entry-lite-ea3cts1t.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-bt6skt4h.js → vm-hands-entry-lite-ef0ergar.js} +3 -3
- package/bin/vm-hands/{vm-hands-entry-lite-9meg54bs.js → vm-hands-entry-lite-epzkdacr.js} +4 -4
- package/bin/vm-hands/{vm-hands-entry-lite-3594pdj0.js → vm-hands-entry-lite-f6np7g11.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-dhn0fs5e.js → vm-hands-entry-lite-g4e21m1g.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-4kb5rq3d.js → vm-hands-entry-lite-hnsdwskm.js} +3 -3
- package/bin/vm-hands/{vm-hands-entry-lite-rpf4t8r4.js → vm-hands-entry-lite-m4zkvq9s.js} +15 -15
- package/bin/vm-hands/{vm-hands-entry-lite-kzygj0q8.js → vm-hands-entry-lite-mayj6bpv.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-mzw2vcah.js → vm-hands-entry-lite-mkha0rqp.js} +96 -96
- package/bin/vm-hands/{vm-hands-entry-lite-1cdtev4n.js → vm-hands-entry-lite-pnx4zgd6.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-bc9zq8gx.js → vm-hands-entry-lite-sk4qxvzq.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-1as6h9ed.js → vm-hands-entry-lite-ttemn34n.js} +4 -4
- package/bin/vm-hands/{vm-hands-entry-lite-y2vqwds4.js → vm-hands-entry-lite-vgwm0t9m.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-h5x725z8.js → vm-hands-entry-lite-w4vnk4tg.js} +6 -6
- package/bin/vm-hands/{vm-hands-entry-lite-8twdd0ff.js → vm-hands-entry-lite-yqzy5wp8.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-2qh3rat2.js → vm-hands-entry-lite-ysmjfpef.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-r131db1f.js → vm-hands-entry-lite-zhxpfb3n.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-n9277v11.js → vm-hands-entry-lite-zm0707rq.js} +1 -1
- package/bin/vm-hands/vm-hands-entry-lite.js +2 -2
- package/bin/vm-hands/{vm-hands-executor-xd8v5v0e.js → vm-hands-executor-e75we703.js} +1 -1
- package/bin/vm-hands/{vm-hands-op-runner-nr4ncs4p.js → vm-hands-op-runner-86zndw34.js} +1 -1
- package/bin/vm-hands/{vm-hands-runtime-qvy5s122.js → vm-hands-runtime-ad8q3cjr.js} +3 -3
- package/bin/vm-hands/{worker-sandbox-2trfs79b.js → worker-sandbox-6aepsk73.js} +1 -1
- package/package.json +1 -1
- package/bin/vm-hands/agent-network-dw7yrrwt.js +0 -2
- package/bin/vm-hands/api-xvjq0bka.js +0 -2
- package/bin/vm-hands/connect-cli-2ja7aj4w.js +0 -2
- package/bin/vm-hands/desktop-account-d1g1m6yb.js +0 -2
- package/bin/vm-hands/desktop-components-577haqrs.js +0 -2
- package/bin/vm-hands/local-automation-fxdb4ynz.js +0 -2
- package/bin/vm-hands/local-capabilities-8fgrfpj4.js +0 -2
- package/bin/vm-hands/local-display-session-8b2hx1k6.js +0 -2
- package/bin/vm-hands/local-display-video-511qjgmq.js +0 -2
- package/bin/vm-hands/local-managed-process-h0fypn67.js +0 -2
- package/bin/vm-hands/vm-hands-entry-lite-rd7bm9we.js +0 -10
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{R,Rn}from"./vm-hands-entry-lite-ys4jhf7n.js";import{w,
|
|
3
|
-
${e}`).digest("hex");return new mt(fn(),Xu(),l)}function na(e,l,v=Fr(e)){try{v.deleteBinding(),v.createBinding(new TextEncoder().encode(l)),y(dn(e),{version:1,store:"keychain"});return}catch(D){if(!(D instanceof a))throw D}y(dn(e),{version:1,store:"file",api_key:l})}function lr(e,l=Fr(e)){if(!u(dn(e)))return null;let v=ac.parse(JSON.parse(m(dn(e))));if(v.store==="file")return v.api_key;try{let D=l.loadBinding();return D?new TextDecoder().decode(D):null}catch(D){if(!(D instanceof a))throw D;throw Error("worker_api_key_unreadable")}}function sc(e,l=Fr(e)){if(!u(dn(e)))return;if(ac.parse(JSON.parse(m(dn(e)))).store==="keychain")try{l.deleteBinding()}catch(v){if(!(v instanceof a))throw v}Yu(dn(e))}async function oa(e,l){let v;try{v=await ir({env:{REASON_API_KEY:l,REASON_API_URL:e.apiOrigin},fetchImpl:
|
|
4
|
-
${l?.directory??p(e)}`).digest("hex")}function co(e,l){y(Xt(p(e),lo),{version:1,directory:sa(e)?.directory??p(e),devicePublicKey:l})}var lo="keychain-scope.json";function dc(e){return u(Xt(p(e),lo))}var af=h({version:i(1),directory:t().min(1),devicePublicKey:t().min(1)});function sa(e){let l=Xt(p(e),lo);if(!u(l))return null;let v=af.safeParse(JSON.parse(m(l))),D=f(e).state;if(!v.success||!u(D))return null;return JSON.parse(m(D))?.devicePublicKey===v.data.devicePublicKey?v.data:null}function sf(e){let l=Xt(p(e),lo);if(!u(l))return;if(sa(e))try{let v=aa(e);v.deleteBinding(),v.deleteKey()}catch(v){if(!(v instanceof a))throw v}Xo(l)}function Or(e){let l=ef(e.workspaceRoot);if(l!==e.workspaceRoot||!tf(l).isDirectory()||!ge(l,e.stateDirectory))throw Error("worker_workspace_not_canonical_or_overlaps_state")}function S(e){if(!u(p(e)))return null;let l=Ut(f(e).state,{proofStore:xt(e),repair:!1}),v=l!==null&&An(e.apiOrigin,l.apiOrigin),D=v?[O(e),O({...e,apiOrigin:l.apiOrigin})]:[O(e)];if(l&&(!D.includes(l.worker?.configDigest??"")||l.worker.lifetime!==e.lifetime||l.apiOrigin!==e.apiOrigin&&!v||l.roots.length>32||l.roots[0]?.path!==e.workspaceRoot||l.handsSlots!==e.slots))throw Error("worker_config_binding_mismatch");return l}var uc=h({version:i(1),drained:_(),revoked:_()});function ft(e){let l=f(e).control;return u(l)?uc.parse(JSON.parse(m(l))):{version:1,drained:!1,revoked:!1}}function qt(e,l){y(f(e).control,uc.parse(l))}function Zt(e){let l=xt(e);l.deleteBinding(),l.deleteKey();let v=Xt(p(e),lo);if(u(v))Xo(v);let D=f(e).state;if(u(D))Xo(D)}var cf=h({read:_(),write:_(),execute:_(),discover_environment:_(),expose_mcp:i(!1)}),ca=h({version:i(1),organization_id:t().min(1).max(160),enrollment_ticket:t().min(1).max(4096),code_verifier:t().regex(/^[A-Za-z0-9._~-]{43,128}$/),root_fingerprint_key:t().regex(/^[a-f0-9]{64}$/),root:h({path_fingerprint:t().regex(/^[a-f0-9]{64}$/),permissions:cf,execution_mode:c(["confined","host"]).default("confined")}),folders:d(h({path_fingerprint:t().regex(/^[a-f0-9]{64}$/)})).min(1).max(31).optional()}),lf=n({device_id:t().min(1).max(160),organization_id:t().min(1).max(160),auth_scheme:i("p256"),protocol_version:i(2),roots:d(n({id:t().min(1),label:t(),path_fingerprint:t()})).min(1).max(32),headless:n({lifecycle:c(["persistent","ephemeral"]),expires_at:I.datetime({offset:!0})}),first_heartbeat:Rt().optional()}),la=30000;class Rr extends Error{deviceRemoved;constructor(e){super("worker_enrollment_rejected");this.deviceRemoved=e}}async function df(e,l,v=fetch){let D=await v(`${e}/app/local-runtime/enroll`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l),redirect:"error",signal:AbortSignal.timeout(la)});if(!D.ok){let M=D.status===409?await D.json().catch(()=>null):null;throw new Rr(M?.error==="device_revoked")}return D.json()}async function da(e,l,v,D){ne();let M=ca.parse(JSON.parse(m(l)));return Er(e,M,v,D)}async function Er(e,l,v,D=(L,z)=>df(L,z,oe(e.proxy)),M=performance.now()){let L=mc(e,l,v),z=await D(e.apiOrigin,{...L.request,enrollment_ticket:l.enrollment_ticket,code_verifier:l.code_verifier});return L.receipt(z,M)}async function fc(e,l,v,D,M=performance.now()){let L=mc(e,l,v),z=await D(L.request,l.code_verifier);return z===null?null:L.receipt(z,M)}function mc(e,l,v){if(ne(),l.root.execution_mode!==e.executionMode)throw Error("worker_enrollment_mode_mismatch");let D=zt([e.workspaceRoot],l.root.permissions,Buffer.from(l.root_fingerprint_key,"hex"))[0];if(D.path!==e.workspaceRoot||D.pathFingerprint!==l.root.path_fingerprint)throw Error("worker_enrollment_root_mismatch");let M=(e.folders??[]).map((G,ce)=>{let we=zt([G],l.root.permissions,Buffer.from(l.root_fingerprint_key,"hex"))[0];if(we.path!==G||we.pathFingerprint!==l.folders?.[ce]?.path_fingerprint)throw Error("worker_enrollment_root_mismatch");return we});if((l.folders?.length??0)!==M.length)throw Error("worker_enrollment_root_mismatch");let L=[{...D,label:"workspace"},...M],z;try{z=v.loadPublicKey()}catch{z=v.createFreshPublicKey()}return{request:{device_public_key:z,name:e.name,os:process.platform,architecture:process.arch,reason_runtime_version:g,bridge_version:g,protocol_version:2,capabilities:{supported_operations:[]},roots:L.map((G)=>({label:G.label,path_fingerprint:G.pathFingerprint,permissions:l.root.permissions}))},receipt(G,ce){let we=lf.parse(G);if(we.organization_id!==l.organization_id||we.roots.length!==L.length||we.roots.some((X,he)=>X.path_fingerprint!==L[he].pathFingerprint)||we.headless.lifecycle!==e.lifetime||Date.parse(we.headless.expires_at)<=Date.now())throw Error("worker_enrollment_receipt_mismatch");let te=Hn(we.first_heartbeat);try{lc(e,we.device_id,{...te?{offer:te}:{},enrollmentMs:Math.min(tr,Math.max(0,Math.round(performance.now()-ce)))})}catch{}return{version:4,apiOrigin:e.apiOrigin,orgId:we.organization_id,deviceId:we.device_id,devicePublicKey:z,displayName:e.name,registeredAt:new Date().toISOString(),handsSlots:e.slots,worker:{configDigest:O(e),lifetime:e.lifetime,expiresAt:we.headless.expires_at},roots:we.roots.map((X,he)=>({id:X.id,label:X.label,path:L[he].path,pathFingerprint:X.path_fingerprint,permissions:l.root.permissions}))}}}}import{randomBytes as uf,randomUUID as ff}from"crypto";import{unlinkSync as mf}from"fs";import{join as pf}from"path";var pc=h({version:i(1),install_id:V(),fingerprint_key:t().regex(/^[a-f0-9]{64}$/)}),hf=n({enrollment_ticket:t().min(1).max(4096),expires_at:I.datetime({offset:!0}),device_kind:i("headless"),lifecycle:c(["persistent","ephemeral"]),device_expires_at:I.datetime({offset:!0})});function ua(e){return hf.parse(e)}var gf=n({credentialKind:c(["oauth","api_key"]).optional(),apiOrigin:zr(),clientId:t(),accessToken:t().min(1).max(32768),refreshToken:t().max(32768),expiresAt:I.datetime({offset:!0}),scopes:d(t().max(128)).max(128),orgId:t().min(1).max(160)});function jr(e){return Q(Rn("REASON_CLI_CHANNEL",e.channel),s())}async function qr(e,l=jr(e)){if(!u(l))return null;let v=gf.parse(JSON.parse(m(l)));if(!W(v.apiOrigin,e.apiOrigin))throw Error("worker_session_origin_mismatch");if(v.credentialKind==="api_key")return Date.parse(v.expiresAt)>Date.now()?v:null;let D=oe(e.proxy),M=Object.assign((z,re)=>D(z,{...re,redirect:"error",signal:AbortSignal.timeout(30000)}),{preconnect:fetch.preconnect}),L=await be({path:l,fetchImpl:M});if(L&&!W(L.apiOrigin,e.apiOrigin))throw Error("worker_session_origin_mismatch");return L}async function hc(e,l,v){if(!W(l.apiOrigin,e.apiOrigin))throw Error("worker_session_origin_mismatch");if(!l.scopes.includes("devices:write"))throw Error("worker_devices_write_scope_required");let D=Kr(e);return D.complete(l.orgId,await v.createHeadlessDeviceEnrollmentTicket(D.request))}async function gc(e,l,v,D,M){let L=performance.now();if(!W(l.apiOrigin,e.apiOrigin))throw Error("worker_session_origin_mismatch");if(!l.scopes.includes("devices:write"))throw Error("worker_devices_write_scope_required");let z=Kr(e),re=M?void 0:v.enrollHeadlessDevice?.bind(v);if(re){let G=await fc(e,z.direct(l.orgId),D,(ce,we)=>re({approval:z.request,code_verifier:we,registration:ce}).catch((te)=>{throw wf(te)}),L);if(G)return G}return Er(e,z.complete(l.orgId,await v.createHeadlessDeviceEnrollmentTicket(z.request)),D,M,L)}function wf(e){if(!(e instanceof C))return e;if(e.status===409)return new Rr(e.code==="device_revoked");if(e.status===410||e.status===401&&e.code==="invalid_enrollment_ticket"||e.status===403&&e.code==="grant_exceeded"||e.status===400&&e.code==="invalid_device_enrollment")return new Rr(!1);return e}var fo=(e)=>pf(p(e),"enrollment-install.json");function wc(e){if(u(fo(e)))mf(fo(e))}function Kr(e,{stored:l=!0}={}){ne();let v=fo(e),D=l&&u(v)?pc.parse(JSON.parse(m(v))):{version:1,install_id:ff(),fingerprint_key:uf(32).toString("hex")};if(l&&!u(v))y(v,D);let M={read:!0,write:!0,execute:!0,discover_environment:!0,expose_mcp:!1},L=Buffer.from(D.fingerprint_key,"hex"),z=zt([e.workspaceRoot],M,L)[0];if(z.path!==e.workspaceRoot)throw Error("worker_workspace_not_canonical_or_overlaps_state");let re=(e.folders??[]).map((te)=>{let X=zt([te],M,L)[0];if(X.path!==te)throw Error("worker_workspace_not_canonical_or_overlaps_state");return{path_fingerprint:X.pathFingerprint}}),G=Aa(),ce={install_id:D.install_id,code_challenge:G.challenge,lifecycle:e.lifetime,roots:[z.pathFingerprint,...re.map((te)=>te.path_fingerprint)].map((te)=>({path_fingerprint:te,permissions:M,execution_mode:e.executionMode}))},we=(te)=>({version:1,organization_id:te,code_verifier:G.verifier,root_fingerprint_key:D.fingerprint_key,root:{path_fingerprint:z.pathFingerprint,permissions:M,execution_mode:e.executionMode},...re.length?{folders:re}:{}});return{request:ce,saveInstall(te){b(p(te),!0),y(fo(te),D)},complete(te,X){let he=ua(X);if(he.lifecycle!==e.lifetime||Date.parse(he.expires_at)<=Date.now()||Date.parse(he.device_expires_at)<=Date.now())throw Error("worker_ticket_receipt_mismatch");return{...we(te),enrollment_ticket:he.enrollment_ticket}},direct:we}}function yc(e,l,v){let D=fo(e);if(!u(D))throw Error("worker_folders_unavailable");let M=pc.parse(JSON.parse(m(D)));return zt([l],v,Buffer.from(M.fingerprint_key,"hex"))[0]}var Qo=8,pa=600000,kc=15000,bf=3600000,kf=new Set(["device_not_eligible","sign_in_not_eligible"]),_c=new Set(["device_revoked","invalid_device_credential"]),ei=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,Dr=(e)=>Pt(p(e),"workspaces"),vc="account.json",fa=(e)=>u(Pt(e,vc));function Qt(e){let l;try{l=yf(Dr(e))}catch{return[]}return l.filter((v)=>ei.test(v)).sort().map((v)=>{let D=Pt(Dr(e),v),M=Pt(D,"worker.json"),L=null;try{let z=x.safeParse(JSON.parse(m(M)));if(z.success&&z.data.stateDirectory===D)L=z.data}catch{}return{organizationId:v,directory:D,configPath:M,config:L,account:fa(D)}})}function oi(e,l){let v=l.toLowerCase();if(!ei.test(v))throw Error("worker_workspace_id_invalid");let D=x.parse({...e,stateDirectory:Pt(Dr(e),v)});return b(D.stateDirectory,!0),y(Pt(D.stateDirectory,vc),{version:1}),{config:D,configPath:Pt(D.stateDirectory,"worker.json")}}function ii(e,l){try{let{config:v,configPath:D}=oi(e,l);b(p(v),!0),qt(v,{version:1,drained:!0,revoked:!0}),y(D,v)}catch{}}function wo(e,l){let v=l.toLowerCase(),D=null;try{D=S(e)?.orgId.toLowerCase()??null}catch{}return D===v||Qt(e).some((M)=>!M.account&&M.config!==null&&M.organizationId===v)}var ma=["device.json","local-device.key","local-device.binding","keychain-scope.json","control.json","enrollment-install.json","first-heartbeat.json"];function bc(e,l){let v=S(e);if(!v?.worker)throw Error("worker_identity_missing");co(e,v.devicePublicKey),b(p(l),!0);for(let L of ma)un(Pt(p(l),L),{force:!0});for(let L of ma){let z=Pt(p(e),L);if(u(z))_f(z,Pt(p(l),L))}let D=xt(l),M=Ut(f(l).state,{proofStore:D,repair:!1});if(!M?.worker)throw Error("worker_identity_missing");ae({...M,worker:{...M.worker,configDigest:O(l)}},f(l).state,{proofStore:D})}function ha(e){for(let l of Qt(e)){if(l.account)continue;try{if(l.config&&u(f(l.config).state))Zt(l.config)}catch{}un(l.directory,{recursive:!0,force:!0})}un(ya(e),{force:!0})}function si(e,{prefer:l,keep:v,live:D=!1}){let M=Date.now(),L=(te)=>Number(Date.parse(te.worker?.expiresAt??"")>M+60000),re=Qt(e).flatMap((te)=>{if(!te.account||!te.config)return[];try{if(ft(te.config).revoked)return[];let X=S(te.config);return X&&X.orgId.toLowerCase()===te.organizationId&&(!D||L(X))?[{...te,config:te.config,state:X}]:[]}catch{return[]}}).sort((te,X)=>Number(X.organizationId===l)-Number(te.organizationId===l)||L(X.state)-L(te.state))[0];if(!re)return null;let G=null;try{G=ft(e).revoked?null:S(e)}catch{}let ce=G?.orgId.toLowerCase()??"";if(v&&G&&ei.test(ce)&&ce!==re.organizationId){let te=oi(e,ce);bc(e,te.config),y(te.configPath,te.config)}else if(u(p(e))){try{if(u(f(e).state))Zt(e)}catch{}for(let te of ma)un(Pt(p(e),te),{force:!0})}ha(e);let we=x.parse({...re.config,stateDirectory:e.stateDirectory});return bc(re.config,we),y(Pt(e.stateDirectory,"worker.json"),we),un(re.directory,{recursive:!0,force:!0}),we}var ga={before(e){for(let{config:l}of Qt(e))try{let v=l?S(l):null;if(l&&v)co(l,v.devicePublicKey)}catch{}},after(e,l){for(let{organizationId:v,directory:D,configPath:M,config:L}of Qt(l)){if(L)continue;try{let z=x.parse(JSON.parse(m(M)));if(z.stateDirectory!==Pt(Dr(e),v))continue;let re=x.parse({...z,stateDirectory:D}),G=xt(re),ce=Ut(f(re).state,{proofStore:G,repair:!1});if(ce?.worker?.configDigest===O(z))ae({...ce,worker:{...ce.worker,configDigest:O(re)}},f(re).state,{proofStore:G});y(M,re)}catch{}}}},ya=(e)=>Pt(Dr(e),"listed.json");function Rc(e){try{let l=JSON.parse(m(ya(e))),v=l.names&&typeof l.names==="object"&&!Array.isArray(l.names)?Object.fromEntries(Object.entries(l.names).filter((M)=>typeof M[1]==="string")):{},D=l.refused&&typeof l.refused==="object"?l.refused:null;return{listed:l.listed===!0,reason:l.reason==="sign_in"?"sign_in":null,blocked:Array.isArray(l.blocked)?l.blocked.filter((M)=>typeof M==="string"):[],names:v,...D&&typeof D.device==="string"&&typeof D.roots==="string"&&typeof D.at==="number"&&Number.isFinite(D.at)&&typeof D.count==="number"&&Number.isInteger(D.count)&&D.count>=1?{refused:{device:D.device,roots:D.roots,at:D.at,count:D.count}}:{}}}catch{return null}}function Pc(e,l){let v=Qt(e),D=v.filter((G)=>G.account),M=v.filter((G)=>!G.account),L=Rc(e),z=L&&!L.listed?L.reason:null,re=z||M.length===0&&L&&!L.listed?[]:M;if(D.length===0&&re.length===0&&(z||L&&!L.listed))return{workspaces:null,off:z};return{off:z,workspaces:[...D,...re].map(({organizationId:G,config:ce,account:we})=>{let te=!1,X=null,he=!1,Se=null;try{te=ce?ft(ce).revoked:!1,X=ce&&!te?S(ce):null;let Re=ce?rt(f(ce).daemon):null;he=l&&!!X&&Re?.state==="connected",Se=he?gn(Re,X):null}catch{}return{...Se?{permission_recovery:Se}:{},organization_id:G,device_id:X?.deviceId??null,name:L?.names?.[G]??null,root:X?.roots[0]?{id:X.roots[0].id,permissions:X.roots[0].permissions}:null,state:te?"removed":he?"connected":"not_running",blocked:!we&&!te&&!he&&(L?.blocked.includes(G)??!1),...we?{account:!0}:{}}})}}function Cc(e){let{config:l,state:v,client:D,signal:M}=e,L=e.log??(()=>{return}),z=e.intervalMs??pa,re=new Map,G=null,ce=!1,we=Rc(l)??{listed:!1,reason:null,blocked:[]},te=()=>v.roots.map((Ne)=>Ne.id).join(","),X=(Ne)=>{if(!Ne||Ne.device!==v.deviceId||Ne.roots!==te())return!1;let xe=Date.now();return xe>=Ne.at&&xe<Ne.at+Math.min(bf,z*2**Math.min(Ne.count-1,10))},he=(Ne)=>{let{folders:xe,...Le}=l,Ge=v.roots.slice(1).map((Ve)=>Ve.path);return x.parse({...Le,...Ge.length?{folders:Ge}:{},stateDirectory:Pt(Dr(l),Ne)})},Se=async(Ne)=>{let xe=re.get(Ne);if(!xe)return;xe.controller.abort(),await xe.done},Re=(Ne,xe=!1)=>{let Le=new AbortController,Ge=()=>Le.abort();if(M.addEventListener("abort",Ge,{once:!0}),M.aborted)Le.abort();let Ve={...Ne,controller:Le,claims:0,done:Promise.resolve(),account:xe};Ve.done=e.serve(Ne,Le.signal,(Je)=>{Ve.claims=Je}).then(()=>{return},(Je)=>{if(xe&&Je instanceof k&&Je.status===401&&_c.has(Je.code)){try{qt(Ne.config,{version:1,drained:!0,revoked:!0})}catch{}L(`Reason worker: workspace ${Ne.organizationId} (another account's) no longer accepts this computer (${Je.code}); run \`reason connect\` signed in as that account to connect it again
|
|
2
|
+
import{R,Rn}from"./vm-hands-entry-lite-ys4jhf7n.js";import{w,we,W,An,Pn,Cr}from"./vm-hands-entry-lite-a4fn6ye1.js";import{Q,Se}from"./vm-hands-entry-lite-hnsdwskm.js";import{Aa,ve,Pa,C,io,ge}from"./vm-hands-entry-lite-g4e21m1g.js";import{g}from"./vm-hands-entry-lite-zm0707rq.js";import{ut,Vn,ir}from"./vm-hands-entry-lite-4x9p79j4.js";import{a,fn,Ht,Si,mt,mn,fr,gn,mr,Ut,ce,rt,Ei,zt}from"./vm-hands-entry-lite-ttemn34n.js";import{Nr,Ss,Es,he,Ys,tr,Hn}from"./vm-hands-entry-lite-6dkjbe2b.js";import{Hr}from"./vm-hands-entry-lite-pnx4zgd6.js";import{Da,k,or,sr,ee,ar,uo,po,Zr,dt,ho,Qr,en,Kn,Jn,mo,go,_o,Xn}from"./vm-hands-entry-lite-m4zkvq9s.js";import{ri,ni,K,qa,Wa,se,x,p,vo,_e,ae,O,$t,Qe,rn,So,E,ye,Qa,ec,tc,ai,nn,pt,rc,Mt,on,Pe,J,ic,Co,Ao,an,et}from"./vm-hands-entry-lite-7x2dnf35.js";import{je}from"./vm-hands-entry-lite-732hnx41.js";import{cr,Ae,Oa,tn,Na,$a}from"./vm-hands-entry-lite-bqs4pkyb.js";import{ie}from"./vm-hands-entry-lite-ck130wm6.js";import{ue,A,ts,rs}from"./vm-hands-entry-lite-epzkdacr.js";import{Nn,Ln,Ui,Fc}from"./vm-hands-entry-lite-ysmjfpef.js";import{kr,de}from"./vm-hands-entry-lite-cg84jcgd.js";import{Lt,oe,N,no}from"./vm-hands-entry-lite-w4vnk4tg.js";import{Ni,xe,pe,j,ze,is,kn,os,qe,Li,$i,ss,xn,Ie,as,Cn}from"./vm-hands-entry-lite-7pj0tvht.js";import{F}from"./vm-hands-entry-lite-sk4qxvzq.js";import{U,H,T}from"./vm-hands-entry-lite-13pzgnj9.js";import{Qn,Ba,Ha,bo,ti}from"./vm-hands-entry-lite-asyv9pk8.js";import{wa}from"./vm-hands-entry-lite-t3k90kdn.js";import{yi}from"./vm-hands-entry-lite-f6np7g11.js";import{Bo}from"./vm-hands-entry-lite-7z05qb3m.js";import{Jt}from"./vm-hands-entry-lite-10fwwbwj.js";import{hr,No,Lo,$o}from"./vm-hands-entry-lite-mayj6bpv.js";import{ro}from"./vm-hands-entry-lite-kankyeep.js";import{gi,cc}from"./vm-hands-entry-lite-sxnvhzy5.js";import{u,b,m,y}from"./vm-hands-entry-lite-2927z566.js";import{q}from"./vm-hands-entry-lite-a6ss0ges.js";import{De,wt,ls,Sc,Ec,bt}from"./vm-hands-entry-lite-peyr9y6z.js";import{s,Et}from"./vm-hands-entry-lite-tzv8s0e7.js";import{Jc,Xi,I,t,V,zr,o,_,Rt,d,n,h,P,ul,c,i,Yi}from"./vm-hands-entry-lite-ef0ergar.js";import{Sa,Y,B}from"./vm-hands-entry-lite-04nx5y4f.js";import{r}from"./vm-hands-entry-lite-qy9xg6em.js";import{spawn as Du,spawnSync as Xw}from"child_process";import{closeSync as Mu,existsSync as Zw,mkdirSync as Qw,openSync as Tu,readdirSync as ey,realpathSync as Yr,rmSync as Zn}from"fs";import{hostname as ty}from"os";import{dirname as Bs,join as Bt,resolve as ry}from"path";var Yo={ENOENT:"native_enoent",EACCES:"native_permission_denied",EPERM:"native_permission_denied",ETIMEDOUT:"native_timeout",ECONNREFUSED:"native_network",ECONNRESET:"native_network",ENOTFOUND:"native_network",EAI_AGAIN:"native_network",ENETUNREACH:"native_network",EHOSTUNREACH:"native_network",EPIPE:"native_pipe_closed",ENOSPC:"native_disk_full",EMFILE:"native_too_many_files",EBUSY:"native_busy",E2BIG:"native_args_too_large"};function oc(e){if(!(e instanceof Error))return e===void 0||e===null?"native_no_error":"native_non_error";let l=e.code;if(typeof l==="string"&&Yo[l])return Yo[l];let v=e.message;if(e.name==="TimeoutError"||e.name==="AbortError")return"native_timeout";if(/No handler registered for /.test(v))return"ipc_handler_missing";if(/could not be cloned/i.test(v))return"ipc_clone_failed";if(/Render frame was disposed|Object has been destroyed|WebContents was destroyed/i.test(v))return"ipc_window_closed";let D=/\b(E[A-Z0-9]{2,15})\b/.exec(v)?.[1];if(D&&Yo[D])return Yo[D];if(/timed? ?out|timeout/i.test(v))return"native_timeout";if(/fetch failed|failed to fetch|network|socket hang up|getaddrinfo/i.test(v))return"native_network";if(e.name==="TypeError"&&v==="Load failed")return"native_network";if(/unexpected token|is not valid JSON|JSON\.parse|Unexpected end of JSON/i.test(v))return"native_unreadable_output";if(/keychain|secitem|errSec/i.test(v))return"native_keychain_error";if(/Error invoking remote method/.test(v))return"ipc_remote_error";switch(e.name){case"TypeError":return"native_type_error";case"RangeError":return"native_range_error";case"SyntaxError":return"native_unreadable_output"}return"native_unexpected"}import{createHash as Gu}from"crypto";import{unlinkSync as Yu}from"fs";import{platform as Xu}from"os";import{join as Zu}from"path";var ac=P("store",[h({version:i(1),store:i("keychain")}),h({version:i(1),store:i("file"),api_key:t().min(1).max(4096)})]),dn=(e)=>Zu(e,"api-key.json");function Fr(e){let l=Gu("sha256").update(`reason-connect-api-key
|
|
3
|
+
${e}`).digest("hex");return new mt(fn(),Xu(),l)}function na(e,l,v=Fr(e)){try{v.deleteBinding(),v.createBinding(new TextEncoder().encode(l)),y(dn(e),{version:1,store:"keychain"});return}catch(D){if(!(D instanceof a))throw D}y(dn(e),{version:1,store:"file",api_key:l})}function lr(e,l=Fr(e)){if(!u(dn(e)))return null;let v=ac.parse(JSON.parse(m(dn(e))));if(v.store==="file")return v.api_key;try{let D=l.loadBinding();return D?new TextDecoder().decode(D):null}catch(D){if(!(D instanceof a))throw D;throw Error("worker_api_key_unreadable")}}function sc(e,l=Fr(e)){if(!u(dn(e)))return;if(ac.parse(JSON.parse(m(dn(e)))).store==="keychain")try{l.deleteBinding()}catch(v){if(!(v instanceof a))throw v}Yu(dn(e))}async function oa(e,l){let v;try{v=await ir({env:{REASON_API_KEY:l,REASON_API_URL:e.apiOrigin},fetchImpl:se(e.proxy)})}catch(D){if(D instanceof C&&(D.status===401||D.status===403))throw Error("worker_api_key_rejected");throw D}if(!v)throw Error("worker_api_key_rejected");if(!v.scopes.includes("devices:write"))throw Error("worker_api_key_devices_write_required");return v}import{readdirSync as yf,renameSync as _f,rmSync as un}from"fs";import{join as Pt}from"path";import{createHash as Qu}from"crypto";import{realpathSync as ef,statSync as tf,unlinkSync as Xo}from"fs";import{platform as rf}from"os";import{join as Xt}from"path";function f(e){return{state:Xt(p(e),"device.json"),control:Xt(p(e),"control.json"),lock:Xt(p(e),"lifecycle.lock"),socket:Xt(p(e),"control.sock"),daemon:Xt(p(e),"daemon.json"),releaseCheck:Xt(p(e),"release-check.json"),updateDeferral:Xt(p(e),"update-deferral.json"),firstHeartbeat:Xt(p(e),"first-heartbeat.json")}}var nf=n({version:i(1),device_id:t().min(1).max(160),offer:Rt().optional(),enrollment_ms:o().int().nonnegative().max(tr).optional()});function lc(e,l,v){b(p(e),!0),y(f(e).firstHeartbeat,{version:1,device_id:l,...v.offer?{offer:v.offer}:{},...v.enrollmentMs!==void 0?{enrollment_ms:v.enrollmentMs}:{}})}function ia(e,l){let v=f(e).firstHeartbeat;try{if(!u(v))return null;let D=nf.safeParse(JSON.parse(m(v)));if(Xo(v),!D.success||D.data.device_id!==l)return null;let M=Hn(D.data.offer);return{...M?{offer:M}:{},...D.data.enrollment_ms!==void 0?{enrollmentMs:D.data.enrollment_ms}:{}}}catch{return null}}function xt(e,l=!1){b(p(e),l);let v=["local-device.key","local-device.binding","device.json"].filter((D)=>{let M=Xt(p(e),D);if(!u(M))return!1;return m(M),!0});return e.lifetime==="persistent"&&v.join()==="device.json"?aa(e):new mn(p(e))}function Zo(e,l){xt(e,!0),sf(e);let v=l??aa(e),D=new mn(p(e));try{v.deleteBinding(),v.deleteKey(),v.createFreshPublicKey()}catch(M){if(M instanceof a)return D;throw M}return D.deleteBinding(),D.deleteKey(),v}function aa(e){return new mt(fn(),rf(),of(e))}function of(e){let l=sa(e);return Qu("sha256").update(`reason-worker
|
|
4
|
+
${l?.directory??p(e)}`).digest("hex")}function co(e,l){y(Xt(p(e),lo),{version:1,directory:sa(e)?.directory??p(e),devicePublicKey:l})}var lo="keychain-scope.json";function dc(e){return u(Xt(p(e),lo))}var af=h({version:i(1),directory:t().min(1),devicePublicKey:t().min(1)});function sa(e){let l=Xt(p(e),lo);if(!u(l))return null;let v=af.safeParse(JSON.parse(m(l))),D=f(e).state;if(!v.success||!u(D))return null;return JSON.parse(m(D))?.devicePublicKey===v.data.devicePublicKey?v.data:null}function sf(e){let l=Xt(p(e),lo);if(!u(l))return;if(sa(e))try{let v=aa(e);v.deleteBinding(),v.deleteKey()}catch(v){if(!(v instanceof a))throw v}Xo(l)}function Or(e){let l=ef(e.workspaceRoot);if(l!==e.workspaceRoot||!tf(l).isDirectory()||!_e(l,e.stateDirectory))throw Error("worker_workspace_not_canonical_or_overlaps_state")}function S(e){if(!u(p(e)))return null;let l=Ut(f(e).state,{proofStore:xt(e),repair:!1}),v=l!==null&&An(e.apiOrigin,l.apiOrigin),D=v?[O(e),O({...e,apiOrigin:l.apiOrigin})]:[O(e)];if(l&&(!D.includes(l.worker?.configDigest??"")||l.worker.lifetime!==e.lifetime||l.apiOrigin!==e.apiOrigin&&!v||l.roots.length>32||l.roots[0]?.path!==e.workspaceRoot||l.handsSlots!==e.slots))throw Error("worker_config_binding_mismatch");return l}var uc=h({version:i(1),drained:_(),revoked:_()});function ft(e){let l=f(e).control;return u(l)?uc.parse(JSON.parse(m(l))):{version:1,drained:!1,revoked:!1}}function qt(e,l){y(f(e).control,uc.parse(l))}function Zt(e){let l=xt(e);l.deleteBinding(),l.deleteKey();let v=Xt(p(e),lo);if(u(v))Xo(v);let D=f(e).state;if(u(D))Xo(D)}var cf=h({read:_(),write:_(),execute:_(),discover_environment:_(),expose_mcp:i(!1)}),ca=h({version:i(1),organization_id:t().min(1).max(160),enrollment_ticket:t().min(1).max(4096),code_verifier:t().regex(/^[A-Za-z0-9._~-]{43,128}$/),root_fingerprint_key:t().regex(/^[a-f0-9]{64}$/),root:h({path_fingerprint:t().regex(/^[a-f0-9]{64}$/),permissions:cf,execution_mode:c(["confined","host"]).default("confined")}),folders:d(h({path_fingerprint:t().regex(/^[a-f0-9]{64}$/)})).min(1).max(31).optional()}),lf=n({device_id:t().min(1).max(160),organization_id:t().min(1).max(160),auth_scheme:i("p256"),protocol_version:i(2),roots:d(n({id:t().min(1),label:t(),path_fingerprint:t()})).min(1).max(32),headless:n({lifecycle:c(["persistent","ephemeral"]),expires_at:I.datetime({offset:!0})}),first_heartbeat:Rt().optional()}),la=30000;class Rr extends Error{deviceRemoved;constructor(e){super("worker_enrollment_rejected");this.deviceRemoved=e}}async function df(e,l,v=fetch){let D=await v(`${e}/app/local-runtime/enroll`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l),redirect:"error",signal:AbortSignal.timeout(la)});if(!D.ok){let M=D.status===409?await D.json().catch(()=>null):null;throw new Rr(M?.error==="device_revoked")}return D.json()}async function da(e,l,v,D){ie();let M=ca.parse(JSON.parse(m(l)));return Er(e,M,v,D)}async function Er(e,l,v,D=(L,z)=>df(L,z,se(e.proxy)),M=performance.now()){let L=mc(e,l,v),z=await D(e.apiOrigin,{...L.request,enrollment_ticket:l.enrollment_ticket,code_verifier:l.code_verifier});return L.receipt(z,M)}async function fc(e,l,v,D,M=performance.now()){let L=mc(e,l,v),z=await D(L.request,l.code_verifier);return z===null?null:L.receipt(z,M)}function mc(e,l,v){if(ie(),l.root.execution_mode!==e.executionMode)throw Error("worker_enrollment_mode_mismatch");let D=zt([e.workspaceRoot],l.root.permissions,Buffer.from(l.root_fingerprint_key,"hex"))[0];if(D.path!==e.workspaceRoot||D.pathFingerprint!==l.root.path_fingerprint)throw Error("worker_enrollment_root_mismatch");let M=(e.folders??[]).map((G,ne)=>{let fe=zt([G],l.root.permissions,Buffer.from(l.root_fingerprint_key,"hex"))[0];if(fe.path!==G||fe.pathFingerprint!==l.folders?.[ne]?.path_fingerprint)throw Error("worker_enrollment_root_mismatch");return fe});if((l.folders?.length??0)!==M.length)throw Error("worker_enrollment_root_mismatch");let L=[{...D,label:"workspace"},...M],z;try{z=v.loadPublicKey()}catch{z=v.createFreshPublicKey()}return{request:{device_public_key:z,name:e.name,os:process.platform,architecture:process.arch,reason_runtime_version:g,bridge_version:g,protocol_version:2,capabilities:{supported_operations:[]},roots:L.map((G)=>({label:G.label,path_fingerprint:G.pathFingerprint,permissions:l.root.permissions}))},receipt(G,ne){let fe=lf.parse(G);if(fe.organization_id!==l.organization_id||fe.roots.length!==L.length||fe.roots.some((X,le)=>X.path_fingerprint!==L[le].pathFingerprint)||fe.headless.lifecycle!==e.lifetime||Date.parse(fe.headless.expires_at)<=Date.now())throw Error("worker_enrollment_receipt_mismatch");let te=Hn(fe.first_heartbeat);try{lc(e,fe.device_id,{...te?{offer:te}:{},enrollmentMs:Math.min(tr,Math.max(0,Math.round(performance.now()-ne)))})}catch{}return{version:4,apiOrigin:e.apiOrigin,orgId:fe.organization_id,deviceId:fe.device_id,devicePublicKey:z,displayName:e.name,registeredAt:new Date().toISOString(),handsSlots:e.slots,worker:{configDigest:O(e),lifetime:e.lifetime,expiresAt:fe.headless.expires_at},roots:fe.roots.map((X,le)=>({id:X.id,label:X.label,path:L[le].path,pathFingerprint:X.path_fingerprint,permissions:l.root.permissions}))}}}}import{randomBytes as uf,randomUUID as ff}from"crypto";import{unlinkSync as mf}from"fs";import{join as pf}from"path";var pc=h({version:i(1),install_id:V(),fingerprint_key:t().regex(/^[a-f0-9]{64}$/)}),hf=n({enrollment_ticket:t().min(1).max(4096),expires_at:I.datetime({offset:!0}),device_kind:i("headless"),lifecycle:c(["persistent","ephemeral"]),device_expires_at:I.datetime({offset:!0})});function ua(e){return hf.parse(e)}var gf=n({credentialKind:c(["oauth","api_key"]).optional(),apiOrigin:zr(),clientId:t(),accessToken:t().min(1).max(32768),refreshToken:t().max(32768),expiresAt:I.datetime({offset:!0}),scopes:d(t().max(128)).max(128),orgId:t().min(1).max(160)});function jr(e){return Q(Rn("REASON_CLI_CHANNEL",e.channel),s())}async function qr(e,l=jr(e)){if(!u(l))return null;let v=gf.parse(JSON.parse(m(l)));if(!W(v.apiOrigin,e.apiOrigin))throw Error("worker_session_origin_mismatch");if(v.credentialKind==="api_key")return Date.parse(v.expiresAt)>Date.now()?v:null;let D=se(e.proxy),M=Object.assign((z,re)=>D(z,{...re,redirect:"error",signal:AbortSignal.timeout(30000)}),{preconnect:fetch.preconnect}),L=await ve({path:l,fetchImpl:M});if(L&&!W(L.apiOrigin,e.apiOrigin))throw Error("worker_session_origin_mismatch");return L}async function hc(e,l,v){if(!W(l.apiOrigin,e.apiOrigin))throw Error("worker_session_origin_mismatch");if(!l.scopes.includes("devices:write"))throw Error("worker_devices_write_scope_required");let D=Kr(e);return D.complete(l.orgId,await v.createHeadlessDeviceEnrollmentTicket(D.request))}async function gc(e,l,v,D,M){let L=performance.now();if(!W(l.apiOrigin,e.apiOrigin))throw Error("worker_session_origin_mismatch");if(!l.scopes.includes("devices:write"))throw Error("worker_devices_write_scope_required");let z=Kr(e),re=M?void 0:v.enrollHeadlessDevice?.bind(v);if(re){let G=await fc(e,z.direct(l.orgId),D,(ne,fe)=>re({approval:z.request,code_verifier:fe,registration:ne}).catch((te)=>{throw wf(te)}),L);if(G)return G}return Er(e,z.complete(l.orgId,await v.createHeadlessDeviceEnrollmentTicket(z.request)),D,M,L)}function wf(e){if(!(e instanceof C))return e;if(e.status===409)return new Rr(e.code==="device_revoked");if(e.status===410||e.status===401&&e.code==="invalid_enrollment_ticket"||e.status===403&&e.code==="grant_exceeded"||e.status===400&&e.code==="invalid_device_enrollment")return new Rr(!1);return e}var fo=(e)=>pf(p(e),"enrollment-install.json");function wc(e){if(u(fo(e)))mf(fo(e))}function Kr(e,{stored:l=!0}={}){ie();let v=fo(e),D=l&&u(v)?pc.parse(JSON.parse(m(v))):{version:1,install_id:ff(),fingerprint_key:uf(32).toString("hex")};if(l&&!u(v))y(v,D);let M={read:!0,write:!0,execute:!0,discover_environment:!0,expose_mcp:!1},L=Buffer.from(D.fingerprint_key,"hex"),z=zt([e.workspaceRoot],M,L)[0];if(z.path!==e.workspaceRoot)throw Error("worker_workspace_not_canonical_or_overlaps_state");let re=(e.folders??[]).map((te)=>{let X=zt([te],M,L)[0];if(X.path!==te)throw Error("worker_workspace_not_canonical_or_overlaps_state");return{path_fingerprint:X.pathFingerprint}}),G=Aa(),ne={install_id:D.install_id,code_challenge:G.challenge,lifecycle:e.lifetime,roots:[z.pathFingerprint,...re.map((te)=>te.path_fingerprint)].map((te)=>({path_fingerprint:te,permissions:M,execution_mode:e.executionMode}))},fe=(te)=>({version:1,organization_id:te,code_verifier:G.verifier,root_fingerprint_key:D.fingerprint_key,root:{path_fingerprint:z.pathFingerprint,permissions:M,execution_mode:e.executionMode},...re.length?{folders:re}:{}});return{request:ne,saveInstall(te){b(p(te),!0),y(fo(te),D)},complete(te,X){let le=ua(X);if(le.lifecycle!==e.lifetime||Date.parse(le.expires_at)<=Date.now()||Date.parse(le.device_expires_at)<=Date.now())throw Error("worker_ticket_receipt_mismatch");return{...fe(te),enrollment_ticket:le.enrollment_ticket}},direct:fe}}function yc(e,l,v){let D=fo(e);if(!u(D))throw Error("worker_folders_unavailable");let M=pc.parse(JSON.parse(m(D)));return zt([l],v,Buffer.from(M.fingerprint_key,"hex"))[0]}var Qo=8,pa=600000,kc=15000,bf=3600000,kf=new Set(["device_not_eligible","sign_in_not_eligible"]),_c=new Set(["device_revoked","invalid_device_credential"]),ei=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,Dr=(e)=>Pt(p(e),"workspaces"),vc="account.json",fa=(e)=>u(Pt(e,vc));function Qt(e){let l;try{l=yf(Dr(e))}catch{return[]}return l.filter((v)=>ei.test(v)).sort().map((v)=>{let D=Pt(Dr(e),v),M=Pt(D,"worker.json"),L=null;try{let z=x.safeParse(JSON.parse(m(M)));if(z.success&&z.data.stateDirectory===D)L=z.data}catch{}return{organizationId:v,directory:D,configPath:M,config:L,account:fa(D)}})}function oi(e,l){let v=l.toLowerCase();if(!ei.test(v))throw Error("worker_workspace_id_invalid");let D=x.parse({...e,stateDirectory:Pt(Dr(e),v)});return b(D.stateDirectory,!0),y(Pt(D.stateDirectory,vc),{version:1}),{config:D,configPath:Pt(D.stateDirectory,"worker.json")}}function ii(e,l){try{let{config:v,configPath:D}=oi(e,l);b(p(v),!0),qt(v,{version:1,drained:!0,revoked:!0}),y(D,v)}catch{}}function wo(e,l){let v=l.toLowerCase(),D=null;try{D=S(e)?.orgId.toLowerCase()??null}catch{}return D===v||Qt(e).some((M)=>!M.account&&M.config!==null&&M.organizationId===v)}var ma=["device.json","local-device.key","local-device.binding","keychain-scope.json","control.json","enrollment-install.json","first-heartbeat.json"];function bc(e,l){let v=S(e);if(!v?.worker)throw Error("worker_identity_missing");co(e,v.devicePublicKey),b(p(l),!0);for(let L of ma)un(Pt(p(l),L),{force:!0});for(let L of ma){let z=Pt(p(e),L);if(u(z))_f(z,Pt(p(l),L))}let D=xt(l),M=Ut(f(l).state,{proofStore:D,repair:!1});if(!M?.worker)throw Error("worker_identity_missing");ce({...M,worker:{...M.worker,configDigest:O(l)}},f(l).state,{proofStore:D})}function ha(e){for(let l of Qt(e)){if(l.account)continue;try{if(l.config&&u(f(l.config).state))Zt(l.config)}catch{}un(l.directory,{recursive:!0,force:!0})}un(ya(e),{force:!0})}function si(e,{prefer:l,keep:v,live:D=!1}){let M=Date.now(),L=(te)=>Number(Date.parse(te.worker?.expiresAt??"")>M+60000),re=Qt(e).flatMap((te)=>{if(!te.account||!te.config)return[];try{if(ft(te.config).revoked)return[];let X=S(te.config);return X&&X.orgId.toLowerCase()===te.organizationId&&(!D||L(X))?[{...te,config:te.config,state:X}]:[]}catch{return[]}}).sort((te,X)=>Number(X.organizationId===l)-Number(te.organizationId===l)||L(X.state)-L(te.state))[0];if(!re)return null;let G=null;try{G=ft(e).revoked?null:S(e)}catch{}let ne=G?.orgId.toLowerCase()??"";if(v&&G&&ei.test(ne)&&ne!==re.organizationId){let te=oi(e,ne);bc(e,te.config),y(te.configPath,te.config)}else if(u(p(e))){try{if(u(f(e).state))Zt(e)}catch{}for(let te of ma)un(Pt(p(e),te),{force:!0})}ha(e);let fe=x.parse({...re.config,stateDirectory:e.stateDirectory});return bc(re.config,fe),y(Pt(e.stateDirectory,"worker.json"),fe),un(re.directory,{recursive:!0,force:!0}),fe}var ga={before(e){for(let{config:l}of Qt(e))try{let v=l?S(l):null;if(l&&v)co(l,v.devicePublicKey)}catch{}},after(e,l){for(let{organizationId:v,directory:D,configPath:M,config:L}of Qt(l)){if(L)continue;try{let z=x.parse(JSON.parse(m(M)));if(z.stateDirectory!==Pt(Dr(e),v))continue;let re=x.parse({...z,stateDirectory:D}),G=xt(re),ne=Ut(f(re).state,{proofStore:G,repair:!1});if(ne?.worker?.configDigest===O(z))ce({...ne,worker:{...ne.worker,configDigest:O(re)}},f(re).state,{proofStore:G});y(M,re)}catch{}}}},ya=(e)=>Pt(Dr(e),"listed.json");function Rc(e){try{let l=JSON.parse(m(ya(e))),v=l.names&&typeof l.names==="object"&&!Array.isArray(l.names)?Object.fromEntries(Object.entries(l.names).filter((M)=>typeof M[1]==="string")):{},D=l.refused&&typeof l.refused==="object"?l.refused:null;return{listed:l.listed===!0,reason:l.reason==="sign_in"?"sign_in":null,blocked:Array.isArray(l.blocked)?l.blocked.filter((M)=>typeof M==="string"):[],names:v,...D&&typeof D.device==="string"&&typeof D.roots==="string"&&typeof D.at==="number"&&Number.isFinite(D.at)&&typeof D.count==="number"&&Number.isInteger(D.count)&&D.count>=1?{refused:{device:D.device,roots:D.roots,at:D.at,count:D.count}}:{}}}catch{return null}}function Pc(e,l){let v=Qt(e),D=v.filter((G)=>G.account),M=v.filter((G)=>!G.account),L=Rc(e),z=L&&!L.listed?L.reason:null,re=z||M.length===0&&L&&!L.listed?[]:M;if(D.length===0&&re.length===0&&(z||L&&!L.listed))return{workspaces:null,off:z};return{off:z,workspaces:[...D,...re].map(({organizationId:G,config:ne,account:fe})=>{let te=!1,X=null,le=!1,be=null;try{te=ne?ft(ne).revoked:!1,X=ne&&!te?S(ne):null;let ke=ne?rt(f(ne).daemon):null;le=l&&!!X&&ke?.state==="connected",be=le?gn(ke,X):null}catch{}return{...be?{permission_recovery:be}:{},organization_id:G,device_id:X?.deviceId??null,name:L?.names?.[G]??null,root:X?.roots[0]?{id:X.roots[0].id,permissions:X.roots[0].permissions}:null,state:te?"removed":le?"connected":"not_running",blocked:!fe&&!te&&!le&&(L?.blocked.includes(G)??!1),...fe?{account:!0}:{}}})}}function Cc(e){let{config:l,state:v,client:D,signal:M}=e,L=e.log??(()=>{return}),z=e.intervalMs??pa,re=new Map,G=null,ne=!1,fe=Rc(l)??{listed:!1,reason:null,blocked:[]},te=()=>v.roots.map((Ne)=>Ne.id).join(","),X=(Ne)=>{if(!Ne||Ne.device!==v.deviceId||Ne.roots!==te())return!1;let Ce=Date.now();return Ce>=Ne.at&&Ce<Ne.at+Math.min(bf,z*2**Math.min(Ne.count-1,10))},le=(Ne)=>{let{folders:Ce,...Le}=l,Ge=v.roots.slice(1).map((Ve)=>Ve.path);return x.parse({...Le,...Ge.length?{folders:Ge}:{},stateDirectory:Pt(Dr(l),Ne)})},be=async(Ne)=>{let Ce=re.get(Ne);if(!Ce)return;Ce.controller.abort(),await Ce.done},ke=(Ne,Ce=!1)=>{let Le=new AbortController,Ge=()=>Le.abort();if(M.addEventListener("abort",Ge,{once:!0}),M.aborted)Le.abort();let Ve={...Ne,controller:Le,claims:0,done:Promise.resolve(),account:Ce};Ve.done=e.serve(Ne,Le.signal,(Je)=>{Ve.claims=Je}).then(()=>{return},(Je)=>{if(Ce&&Je instanceof k&&Je.status===401&&_c.has(Je.code)){try{qt(Ne.config,{version:1,drained:!0,revoked:!0})}catch{}L(`Reason worker: workspace ${Ne.organizationId} (another account's) no longer accepts this computer (${Je.code}); run \`reason connect\` signed in as that account to connect it again
|
|
5
5
|
`)}else if(Je instanceof k&&Je.status===401&&_c.has(Je.code)){try{Zt(Ne.config)}catch{}L(`Reason worker: workspace ${Ne.organizationId} no longer accepts this computer
|
|
6
6
|
`)}else if(!Le.signal.aborted)L(`Reason worker: workspace ${Ne.organizationId} stopped (worker_workspace_failed); it starts again on the next check
|
|
7
|
-
`)}).finally(()=>{if(Le.abort(),M.removeEventListener("abort",Ge),Ve.claims=0,re.get(Ne.organizationId)===Ve)re.delete(Ne.organizationId);let Je=Ne.config.stateDirectory;if(
|
|
7
|
+
`)}).finally(()=>{if(Le.abort(),M.removeEventListener("abort",Ge),Ve.claims=0,re.get(Ne.organizationId)===Ve)re.delete(Ne.organizationId);let Je=Ne.config.stateDirectory;if(Ce&&!fa(Je)&&!u(Pt(Je,"worker.json")))un(Je,{recursive:!0,force:!0})}),re.set(Ne.organizationId,Ve)},Re=(Ne,Ce)=>{if(!Ce)return null;try{let Le=le(Ne),Ge=S(Ce);if(!Ge||Ge.orgId!==Ne||Date.parse(Ge.worker?.expiresAt??"")<=Date.now()+60000||Ce.name!==Le.name||Ce.executionMode!==Le.executionMode||!W(Ce.apiOrigin,Le.apiOrigin)||Ge.roots.map((Ve)=>Ve.path).join(`
|
|
8
8
|
`)!==v.roots.map((Ve)=>Ve.path).join(`
|
|
9
|
-
`))return null;return{organizationId:Ne,config:
|
|
10
|
-
`)}for(let He of nt){if(M.aborted)return!0;if(Ge(He))continue;try{let at=re.get(He);if(it.get(He)){if(at&&at.claims===0)await
|
|
11
|
-
`);continue}let lt=
|
|
12
|
-
`)}if(lt&&!M.aborted)
|
|
13
|
-
`)}}return!0},$e=null,Ue=async()=>{let Ne=!1;do ce=!1,Ne=await We().catch(()=>!1);while(ce&&!M.aborted);let xe=JSON.stringify({version:1,...we});if($e!==xe)try{b(Dr(l),!0),y(ya(l),JSON.parse(xe)),$e=xe}catch{}return Ne};return{check(){if(G)ce=!0;else G=Ue().finally(()=>{G=null});return G},claims:()=>[...re.values()].reduce((Ne,xe)=>Ne+xe.claims,0),async settled(){await G,await Promise.all([...re.values()].map((Ne)=>Ne.done))}}}import{dirname as vf}from"path";function Ic(e){let l={saved:e.saved,configPath:e.configPath};if(!e.saved||!Sf(e.saved))return l;let v=e.saved,D=(z,re)=>e.log(JSON.stringify({event:"worker.api_origin_move",outcome:z,...re?{code:`worker_api_origin_move_${z}:${re}`}:{},timestamp:new Date().toISOString()})),M=e.native===void 0?bt():e.native;if(!M)return l;let L=[];try{let z=M.lock(vf(e.configPath));if(!z)return l;if(L.push(z),u(p(v))){let we=ie({path:f(v).lock,runtimeVersion:g});if(!we.acquired)return l;L.push(()=>we.release())}let re=x.parse(JSON.parse(m(e.configPath)));if(re.stateDirectory!==v.stateDirectory)return l;let G=Oc(re),ce={saved:re,configPath:e.configPath};if(!ci(re)&&G.length===0)return D("unchanged"),ce;if(ci(re)){let we=Ac(re);y(e.configPath,we),ce={saved:we,configPath:e.configPath}}for(let we of G)try{y(we.configPath,Ac(we.config))}catch(te){D("failed",`workspace:${xc(te)}`)}return D("moved"),ce}catch(z){return D("failed",xc(z)),l}finally{for(let z of L.reverse())z()}}function ci(e){return ye(e.apiOrigin)!==e.apiOrigin}function Oc(e){return Qt(e).filter((l)=>l.config!==null&&ci(l.config))}function Sf(e){return ci(e)||Oc(e).length>0}function Ac(e){let l=x.parse({...e,apiOrigin:ye(e.apiOrigin)}),v=S(e);if(!v)return l;if(!v.worker)throw Error("worker_identity_missing");let D=O(l);if(v.apiOrigin!==l.apiOrigin||v.worker.configDigest!==D)ae({...v,apiOrigin:l.apiOrigin,worker:{...v.worker,configDigest:D}},f(l).state,{proofStore:xt(l)});return l}function xc(e){if(e instanceof a)return e.code;if(e instanceof Error&&/^worker_[a-z_]+$/.test(e.message))return e.message;return e instanceof Error&&"code"in e&&typeof e.code==="string"?e.code:"unexpected"}import{chmodSync as Rf,lstatSync as ka,readdirSync as Tc,readlinkSync as Ef,unlinkSync as Pf}from"fs";import{join as Wt,sep as Cf}from"path";var li="rehome.json";class di extends Error{code;constructor(e){super(e);this.code=e}}function Lc(e){let l={saved:e.saved,configPath:e.configPath},v=Wt(e.home,".config"),D=Wt(v,"ara"),M=e.channel==="production"?["connect"]:[e.channel,"connect"],L=Wt(D,...M),z=Wt(v,"reason",...M),re=(te,X)=>e.log(JSON.stringify({event:"worker.state_rehome",outcome:te,...X?{code:`worker_state_rehome_${te}:${X}`}:{},timestamp:new Date().toISOString()})),G=e.native===void 0?bt():e.native,ce=e.saved,we=[];try{if(ce&&Mc(D)&&ce.stateDirectory===L){let Oe={...ce,stateDirectory:z};if(!_a(G,z,Oe,we))return l;return Dc(ce,Oe,e.host,re)}if(ce&&Mc(D)&&ce.stateDirectory===z&&dc(ce)&&_a(G,z,ce,we))return Wc({...ce,stateDirectory:L},ce,e.host),l;if(!ce||ce.lifetime!=="persistent"||ce.stateDirectory!==L||!Dn(D)?.isDirectory())return l;if(Mf(L)===g)return l;let X=(Oe,Me=!0)=>{if(Me)y(Wt(L,li),{version:g});return re("skipped",Oe),l},he=[L];for(let Oe of xf(D,L)){if(Oe.config?.lifetime!=="ephemeral")return X("several_connections");if(!Af(Oe.directory,Oe.config,we))return X("once_running",!1);he.push(Oe.directory)}if(!G)return X("config_rename_unavailable:no_native");if(!_a(G,L,ce,we))return l;let Se=S(ce);if(!Se||ft(ce).revoked)return l;if(Sc(v)!==null)return X("conflicting_identity");if(Ec(v)!==null)return X("conflicting_files");if(Dn(z)&&(!Dn(z).isDirectory()||Tc(z).length>0))return X("connection_folder_taken");co(ce,Se.devicePublicKey),ga.before(ce);let Re=lr(L);if(Re&&ba(L))If(z,Re);let Ee=De(v,G,he);if(Ee.state!=="renamed"&&Ee.state!=="linked"){if(Re&&ba(L))Nc(z);return X(Ee.problem??"config_folder_kept")}return Dc(ce,{...ce,stateDirectory:z},e.host,re)}catch(te){try{if(Dn(L)?.isDirectory())y(Wt(L,li),{version:g})}catch{}return re("failed",Tf(te)),Df(ce,L,z,l)}finally{for(let te of we.reverse())te()}}function Dc(e,l,v,D){let M=ka(l.stateDirectory);if(M.isDirectory()&&M.uid===process.getuid?.()&&(M.mode&63)!==0)Rf(l.stateDirectory,448);let L=xt(l),z=Ut(f(l).state,{proofStore:L,repair:!1});if(!z?.worker)throw new di("identity_missing");let re=O(l);if(z.worker.configDigest===O(e))ae({...z,worker:{...z.worker,configDigest:re}},f(l).state,{proofStore:L});else if(z.worker.configDigest!==re)throw new di("worker_config_binding_mismatch");y(Wt(l.stateDirectory,"worker.json"),l),ga.after(e,l),Wc(e,l,v);let G=Wt(l.stateDirectory,li);if(u(G))Pf(G);return D("moved"),{saved:l,configPath:Wt(l.stateDirectory,"worker.json")}}function Wc(e,l,v){if(as(e,l,v,"connect"),!ba(l.stateDirectory))return;let D=Of(Fr(e.stateDirectory));if(!D)return;let M=Fr(l.stateDirectory),L;try{L=M.loadBinding()}catch{return}if(!L)M.createBinding(D);Nc(e.stateDirectory)}function _a(e,l,v,D){if(e){let L=e.lock(l);if(!L)return!1;D.push(L)}if(!u(p(v)))return!0;let M=ie({path:f(v).lock,runtimeVersion:g});if(!M.acquired)return!1;return D.push(()=>M.release()),!0}function Af(e,l,v){if(u(p(l))){let M=ie({path:f(l).lock,runtimeVersion:g});if(!M.acquired)return!1;return v.push(()=>M.release()),!0}let D=Dn(Wt(e,"worker.json"));return D!==null&&Date.now()-D.mtimeMs>60000}function xf(e,l){let v=[e,...Tc(e,{withFileTypes:!0}).filter((M)=>M.isDirectory()&&!M.name.startsWith(".")).map((M)=>Wt(e,M.name))],D=[];for(let M of v)for(let L of["connect","connect-once"]){let z=Wt(M,L);if(z===l||!Dn(Wt(z,"worker.json")))continue;let re=Hc(z);if(!re||re.stateDirectory===e||re.stateDirectory.startsWith(e+Cf))D.push({directory:z,config:re})}return D}function ba(e){try{return JSON.parse(m(Wt(e,"api-key.json"))).store==="keychain"}catch{return!1}}function If(e,l){let v=Fr(e);v.deleteBinding(),v.createBinding(new TextEncoder().encode(l))}function Nc(e){try{Fr(e).deleteBinding()}catch(l){if(!(l instanceof a))throw l}}function Of(e){try{return e.loadBinding()}catch(l){if(l instanceof a)return null;throw l}}function Df(e,l,v,D){if(e?.stateDirectory!==l)return D;let M=Hc(v);return M?.stateDirectory===v?{saved:M,configPath:Wt(v,"worker.json")}:D}function Mc(e){try{return ka(e).isSymbolicLink()&&Ef(e)==="reason"}catch{return!1}}function Mf(e){try{let l=JSON.parse(m(Wt(e,li)));return typeof l.version==="string"?l.version:null}catch{return null}}function Hc(e){try{let l=Wt(e,"worker.json");return u(l)?x.parse(JSON.parse(m(l))):null}catch{return null}}function Dn(e){try{return ka(e)}catch{return null}}function Tf(e){if(e instanceof di)return e.code;if(e instanceof Error&&/^worker_[a-z_]+$/.test(e.message))return e.message;if(e instanceof a)return e.code;return e instanceof Error&&"code"in e&&typeof e.code==="string"?e.code:"unexpected"}import{readFileSync as Lf}from"fs";function nr(e){try{let l=JSON.parse(Lf(`${e}.keep-awake.json`,"utf8"));return l!==null&&typeof l==="object"&&"version"in l&&l.version===1&&"enabled"in l&&l.enabled===!0?"battery_and_ac":void 0}catch(l){return l.code==="ENOENT"?"battery_and_ac":void 0}}function $c(e,l){y(`${e}.keep-awake.json`,{version:1,enabled:l})}import{createHash as Aw}from"crypto";import{readdirSync as xw,realpathSync as Ts,statSync as Iw}from"fs";import{hostname as Ow}from"os";import{join as En,resolve as Dw}from"path";var ui="cloud",Wf=/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$/;function yo(e){return Wf.test(e)&&!on.test(e)}var Nf={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 \u203A API keys) 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_api_unreachable:"This computer could not reach Reason. Check its internet connection, and any VPN, proxy or firewall that lets the Reason app through but not the reason command, then try again.",worker_api_certificate_untrusted:"This computer did not trust Reason's certificate. A proxy, VPN or security software inspecting HTTPS, or a wrong clock, usually causes this: let Reason through it, then try again.",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 Mn(e){return Nf[e]}import{randomUUID as Hf}from"crypto";import{chmodSync as $f,lstatSync as fi,mkdtempSync as Bf,realpathSync as qc,rmdirSync as Uf,rmSync as Ff,unlinkSync as jf}from"fs";import{createConnection as qf,createServer as zf}from"net";import{basename as Bc,dirname as Uc,join as pn}from"path";var Kf=c(["status","drain","resume","stop","reload_roots"]),Vf=h({version:i(1),instanceId:t(),deviceId:t(),phase:c(["starting","running","reconnecting","stopping"]),drained:_(),activeClaims:o().int().nonnegative(),activeSessions:o().int().nonnegative().optional(),executionEligible:_(),supportedOperations:d(c(Nr)).max(Nr.length).optional(),capabilityReadiness:ul(c(Nr),_()).optional(),lastHeartbeat:t().nullable(),expiresAt:t()}),Jf=h({nonce:t(),action:Kf}),Gf=n({nonce:V()}),zc=h({version:i(1),nonce:V(),socketPath:t().max(100)});function Kc(e){return pn(f(e).lock,"control.json")}function mi(e){return b(f(e).lock),Gf.parse(JSON.parse(m(pn(f(e).lock,"owner.json"))))}function jc(e){if(!u(e))return!1;let l=fi(e);if(!l.isSocket()||l.uid!==process.getuid?.()||(l.mode&63)!==0)throw Error("worker_control_socket_not_private");return!0}function Vc(e,l){let v=Kc(e);if(!u(v)){let L=f(e).socket;if(!u(L)||!fi(L).isSocket())return null;return jc(L)?L:null}let D=zc.parse(JSON.parse(m(v)));if(D.nonce!==l)throw Error("worker_instance_changed");if(process.platform==="win32"){if(!Yf.test(D.socketPath))throw Error("worker_control_endpoint_invalid");return D.socketPath}let M=Uc(D.socketPath);if(Uc(M)!==qc("/tmp")||!/^(?:reason|ara)-worker-[A-Za-z0-9]{6}$/.test(Bc(M))||Bc(D.socketPath)!=="control.sock"||Buffer.byteLength(D.socketPath)>100)throw Error("worker_control_endpoint_invalid");if(!u(M))return null;return b(M),jc(D.socketPath)?D.socketPath:null}var Yf=/^\\\\\.\\pipe\\reason-worker-[0-9a-f-]{36}$/;async function pi(e,l,v){if(mi(e).nonce!==l)throw Error("worker_instance_changed");let D=Kc(e);if(u(D))throw Error("worker_control_already_serving");let M=process.platform==="win32",L=M?null:Bf(pn(qc("/tmp"),"ara-worker-")),z=L?pn(L,"control.sock"):`\\\\.\\pipe\\reason-worker-${Hf()}`;if(L)b(L);if(Buffer.byteLength(z)>100)throw Error("worker_socket_path_too_long");let re=new Set,G=zf((X)=>{re.add(X),X.once("close",()=>re.delete(X)),X.setTimeout(2000,()=>X.destroy());let he="",Se=!1;X.on("error",()=>X.destroy()),X.on("data",(Re)=>{if(Se)return;if(he+=Re.toString(),Buffer.byteLength(he)>4096){X.destroy();return}if(!he.includes(`
|
|
14
|
-
`))return;
|
|
15
|
-
`)}catch{X.destroy()}})});G.maxConnections=32;let
|
|
16
|
-
`)),re.on("data",(te)=>{if(G+=te.toString(),Buffer.byteLength(G)>16384)re.destroy(Error("worker_control_oversize"))}),re.on("error",(te)=>{if("code"in te&&["ECONNREFUSED","ENOENT"].includes(String(te.code)))we(null);else we(null,te.message==="worker_control_timeout"?te:Error("worker_control_unavailable"))}),re.on("end",()=>{try{let te=Vf.parse(JSON.parse(G));if(te.instanceId!==D.nonce)throw Error("worker_instance_changed");we(te)}catch{we(null,Error("worker_control_invalid_response"))}}),re.once("close",()=>we(null,Error("worker_control_unavailable")))})}import{randomUUID as Fd}from"crypto";import{homedir as jd}from"os";import{spawn as tm}from"child_process";import{createRequire as rm}from"module";var Xc=2147483648,nm=1;function om(){try{let e=rm(import.meta.url)("bun:ffi"),l=e.dlopen("kernel32.dll",{SetThreadExecutionState:{args:[e.FFIType.u32],returns:e.FFIType.u32}});return(v)=>l.symbols.SetThreadExecutionState(v)}catch{return null}}function im(e,l){if(e==="ac_only"||!l)return{status:"unsupported",release:async()=>"unsupported"};let v=l((Xc|nm)>>>0)===0?"failed":"held";return{get status(){return v},async release(){if(v==="held")l(Xc);return v="failed","released"}}}async function Zc(e,l={}){let v=l.platform??process.platform;if(v==="win32")return im(e,l.setExecutionState??om());if(v!=="darwin")return{status:"unsupported",release:async()=>"unsupported"};let D,M="failed",L=!1,z,re=Promise.resolve(),G=(X)=>{if(M===X)return;M=X,l.onStatusChange?.(X)},ce=()=>{if(L||z)return;z=setTimeout(()=>{z=void 0,re=we()},l.retryMs??5000),z.unref()},we=async()=>{try{let X=(l.spawn??tm)("/usr/bin/caffeinate",[e==="ac_only"?"-s":"-i","-w",String(process.pid)],{stdio:"ignore",shell:!1});if(D=X,X.once("exit",()=>{if(!L&&D===X)G("failed"),ce()}),await new Promise((he,Se)=>{X.once("spawn",he),X.once("error",Se)}),X.exitCode===null&&X.signalCode===null)G("held")}catch{G("failed"),ce()}};re=we(),await re;let te;return{get status(){return M},release(){return te??=(async()=>{L=!0,clearTimeout(z),await re;let X=D;if(!X||X.exitCode!==null||X.signalCode!==null||!X.pid)return M="failed","released";let he=await new Promise((Se)=>{let Re,Ee=setTimeout(()=>{try{X.kill("SIGKILL")}catch{}Re=setTimeout(()=>Se("failed"),1000)},1000);X.once("exit",()=>{clearTimeout(Ee),clearTimeout(Re),Se("released")});try{X.kill("SIGTERM")}catch{}});if(he==="released")M="failed";return he})()}}}class Tn extends Error{constructor(){super("Reason Device operation lease expired.")}}class wi{now;onExpire;deadline=0;clockFloor;clockTick=performance.now();timer;closed=!1;constructor(e,l,v){this.now=l;this.onExpire=v;this.clockFloor=l(),this.install(e)}remainingMs(){if(this.closed)return 0;return Math.max(0,this.deadline-this.clockNow())}assertCurrent(){if(this.remainingMs()>0)return;let e=new Tn;if(!this.closed)this.close(),this.onExpire(e);throw e}acknowledge(e){this.assertCurrent(),this.install(e)}close(){this.closed=!0,clearTimeout(this.timer)}install(e){let l=Date.parse(e);if(!Number.isFinite(l))throw Error("Reason returned an invalid operation lease deadline.");if(l-this.clockNow()<=0)throw new Tn;this.deadline=l,clearTimeout(this.timer),this.arm()}clockNow(){let e=performance.now();return this.clockFloor=Math.max(this.now(),this.clockFloor+Math.max(0,e-this.clockTick)),this.clockTick=e,this.clockFloor}arm(){this.timer=setTimeout(()=>{if(this.remainingMs()>0){this.arm();return}this.close(),this.onExpire(new Tn)},Math.min(this.remainingMs(),2147483647))}}import{realpathSync as dm}from"fs";import{randomUUID as um}from"crypto";import{constants as Ra}from"fs";import{open as am}from"fs/promises";import{join as sm}from"path";var cm={platform:process.platform,home:s,async openFile(e){let l=await am(e,Ra.O_RDONLY|Ra.O_NOFOLLOW|Ra.O_NONBLOCK);return{isFile:async()=>(await l.stat()).isFile(),close:()=>l.close()}}};async function Qc(e=cm){if(e.platform!=="darwin")return"unknown";try{let l=await e.openFile(sm(e.home(),"Library/Application Support/com.apple.TCC/TCC.db"));try{return await l.isFile()?"granted":"unknown"}finally{await l.close()}}catch(l){return l instanceof Error&&"code"in l&&["EACCES","EPERM"].includes(String(l.code))?"not_granted":"unknown"}}class Ea extends Error{constructor(){super("Hands generation receipt attempt timed out.")}}async function lm(e,l,v){l.throwIfAborted();let D=new AbortController,M=()=>{},L,z=new Promise((re,G)=>{M=()=>{D.abort(l.reason),G(l.reason)},l.addEventListener("abort",M,{once:!0}),L=setTimeout(()=>{let ce=new Ea;D.abort(ce),G(ce)},v)});try{return await Promise.race([e(D.signal),z])}finally{clearTimeout(L),l.removeEventListener("abort",M),D.abort()}}function el(e){let l=0,v=0;return async(D)=>{for(;;){D.throwIfAborted(),e.lease.assertCurrent();while(performance.now()<v)await e.sleep(Math.min(v-performance.now(),e.lease.remainingMs()),D),D.throwIfAborted(),e.lease.assertCurrent();try{let M=await lm(e.send,D,Math.min(8000,e.lease.remainingMs()));return D.throwIfAborted(),e.lease.assertCurrent(),M}catch(M){let L=M instanceof Ea||(M instanceof k?or(M.status):sr(M));if(L){let z=Math.max(Math.min(500*2**Math.min(l++,4),5000),e.retryAfterMs(M));v=performance.now()+z}if(D.throwIfAborted(),e.lease.assertCurrent(),!L)throw M}}}}function Fa(e,l=process.env){return!e.proxied&&l.REASON_DEVICE_SESSION!=="0"}function cl(e,l,v){let D=e?.permissionRecovery;return fr(D,v)&&D.deviceId===l.deviceId&&D.organizationId===l.orgId?{permissionRecovery:D}:{}}var fm=1000,mm=250,pm=16,hm=5000,gm=Fc(dm(process.execPath)),tl=null,rl=null;function ll(e){if(process.platform!=="darwin")return{};return rl??=Qc().then((l)=>{tl={status:l,checkedAt:e().getTime()}}).finally(()=>{rl=null}),{fullDiskAccess:{...tl??{status:"unknown",checkedAt:e().getTime()},executablePath:gm}}}var wm=8,ym=64,_m=2000,bm=2000,ja=8000,nl=3,km=250,ol=1000,il=30000,vm=0.2,Sm=30000,Rm=21600000,Em=300000,Pm=3600000,Cm=0.1,dl=new Set(["run_finished","run_cancelled","driver_handoff","driver_stopped"]);function Am(e){return Math.min(nl,Math.max(1,e??nl))}function xm(e){return typeof e.reason_code==="string"&&dl.has(e.reason_code)?e.reason_code:"cancelled"}function Ca(e){return e.reason instanceof r&&(e.reason.code==="cancelled"||dl.has(e.reason.code))?e.reason.code:"cancelled"}function al(e){return e instanceof r&&/^[A-Za-z0-9._:-]{1,160}$/.test(e.code)?e.code:"capability_failed"}function fl(e){return e.capability==="hands.connect"&&Qa(e.payload)}function xa(e,l=Math.random){let v=Math.min(Math.max(l(),0),1);return Math.max(0,Math.floor(e*(1+v*Cm)))}function Im(e,l=Math.random){let v=Math.min(il,ol*2**Math.max(0,e-1)),D=Math.min(Math.max(l(),0),1),M=v*vm*(D*2-1);return Math.min(il,Math.max(ol,Math.round(v+M)))}function za(e,l){return new Promise((v,D)=>{if(l.aborted){D(l.reason??new DOMException("Aborted","AbortError"));return}let M=()=>{clearTimeout(L),D(l.reason??new DOMException("Aborted","AbortError"))},L=setTimeout(()=>{l.removeEventListener("abort",M),v()},e);l.addEventListener("abort",M,{once:!0})})}class Ia extends Error{updateError;constructor(e){super("Managed runtime update check failed.");this.updateError=e;this.name="RuntimeUpdateCheckError"}}async function Om(e,l,v,D){let M=new AbortController,L=()=>M.abort(v.reason);if(v.aborted)L();else v.addEventListener("abort",L,{once:!0});try{return await Promise.race([e,D(l,M.signal).then(()=>({kind:"heartbeat"}))])}finally{M.abort(),v.removeEventListener("abort",L)}}function Ma(e){return e instanceof Error?e.message:String(e)}function Ta(e,l){return l.aborted||e instanceof DOMException&&e.name==="AbortError"||e instanceof Error&&e.name==="AbortError"}function _r(e){return e instanceof k&&e.status===409&&e.code==="attempt_fenced"}function La(e){return e.capability==="environment.install"}function Dm(e){if(e instanceof ki||e instanceof Tn||e instanceof Eo)return"timeout";if(!(e instanceof Error)||e instanceof k)return"transport_unknown";for(let l of[e,e.cause]){if(!(l instanceof Error)||l instanceof k||!("code"in l))continue;switch(l.code){case"ConnectionClosed":case"ECONNRESET":return"connection_closed";case"ConnectionRefused":case"ECONNREFUSED":return"connection_refused";case"ETIMEDOUT":return"timeout"}}return"transport_unknown"}function Ro(e,l,v){if(!e.state.worker&&!e.connectionDiagnostics)return;if(_r(v))return;let D=v instanceof k&&Number.isInteger(v.status)&&v.status>=100&&v.status<=599?{stage:l,category:"http",httpStatus:v.status}:{stage:l,category:Dm(v)};e.onEvent?.({type:"error",message:"worker_connection_failed",diagnostic:D})}async function Wn(e,l,v){try{return await v()}catch(D){if(!e.signal.aborted)Ro(e,l,D);throw D}}class Eo extends Error{constructor(){super("Reason Device operation completion timed out.")}}async function Ua(e,l,v,D){let M=l.capability==="inference.custom.v1"&&v.status!=="succeeded"?{status:v.status,error_code:v.status==="cancelled"?"operation_cancelled":Hr(v.error_code)?v.error_code:"custom_endpoint_unavailable"}:La(l)&&v.status!=="succeeded"?{status:v.status,error_code:v.status==="cancelled"?"operation_cancelled":v.error_code==="environment_unavailable"?"environment_unavailable":"environment_install_failed"}:v,L=new AbortController,z=D?AbortSignal.any([D,L.signal]):L.signal,re=e.sleep??za,G=e.operationCompletionTimeoutMs??ja,ce=performance.now()+G,we,te,X=new Promise((Re,Ee)=>{let Oe=()=>{let Ce=new Eo;L.abort(Ce),Ee(Ce)},Me=(Ce)=>{clearTimeout(we),we=setTimeout(Oe,Ce)};if(te=()=>Me(Math.max(0,Math.min(ce-performance.now(),_m))),Me(G),e.signal.addEventListener("abort",te,{once:!0}),e.signal.aborted)te()}),he,Se=0;try{while(!0)try{he=await Promise.race([e.client.completeOperation(e.state,l,M,z),X]);break}catch(Re){if(z.aborted||e.signal.aborted||ee(Re)||_r(Re)||!Mm(Re)||performance.now()>=ce)throw Ro(e,"completion",Re),Re;Se+=1;let Ee=Math.min(500*2**Math.min(Se-1,4),Math.max(0,ce-performance.now()));if(Ee<=0)throw Ro(e,"completion",Re),Re;try{await re(Ee,z)}catch{throw Ro(e,"completion",Re),Re}}}finally{clearTimeout(we),e.signal.removeEventListener("abort",te),L.abort()}e.onEvent?.({type:"completed",operationId:l.operation_id,status:he.status})}function Mm(e){if(ee(e))return!1;if(_r(e))return!1;if(e instanceof k)return e.status===408||e.status===429||e.status>=500&&e.status<=504;if(e instanceof Error){if(e.name==="AbortError"||e instanceof Eo)return!1;return!0}return!1}class ki extends Error{constructor(){super("Reason Device operation heartbeat timed out.");this.name="OperationHeartbeatAttemptTimeoutError"}}function _i(e){if(e instanceof ki)return!0;return e instanceof k?or(e.status):sr(e)}function Tm(e,l,v,D){let M=Math.min(v,l*2**Math.min(e-1,10));return e<=1?M:Math.round(M/2+M/2*D())}function bi(e,l){if(!(e instanceof k)||!e.retryAfter)return 0;let v=e.retryAfter.trim(),D=/^\d+(?:\.\d+)?$/.test(v)?Number(v)*1000:Date.parse(v)-l;return Number.isNaN(D)?0:Math.max(0,D)}async function Lm(e,l,v,D,M){let L=new AbortController,z,re=()=>{return},G=new Promise((we,te)=>{let X=()=>{let he=D.reason??new DOMException("Aborted","AbortError");L.abort(he),te(he)};if(re=()=>D.removeEventListener("abort",X),D.aborted)X();else D.addEventListener("abort",X,{once:!0})}),ce=new Promise((we,te)=>{z=setTimeout(()=>{let X=new ki;L.abort(X),te(X)},M)});try{return await Promise.race([e.client.operationHeartbeat(e.state,l,{transientRetryOwner:"caller",...v.controlAckSeq===void 0?{}:{controlAckSeq:v.controlAckSeq},clientRetryCount:v.clientRetryCount,...v.waitMs===void 0?{}:{waitMs:v.waitMs},signal:L.signal}),G,ce])}finally{if(z!==void 0)clearTimeout(z);re()}}async function sl(e,l,v,D,M,L){let z=Am(e.operationHeartbeatMaxAttempts),re=e.operationHeartbeatAttemptTimeoutMs??ja,G=e.operationHeartbeatRetryDelayMs??km,ce=L.remainingMs(),we=Math.min(ce,z*re+G*z*(z-1)/2);for(let te=0;te<z;te+=1)try{D.throwIfAborted(),L.assertCurrent();let X=Math.min(re,L.remainingMs()),he=await Lm(e,l,{...v,waitMs:v.waitMs===void 0?void 0:Math.min(v.waitMs,Math.max(0,Math.floor(X-1000))),clientRetryCount:te},D,X);return D.throwIfAborted(),L.acknowledge(he.lease_until),he}catch(X){if(D.aborted||te+1>=z||_r(X)||ee(X)||!_i(X)){if(!D.aborted)Ro(e,"operation_heartbeat",X);throw X}let he=ce-L.remainingMs(),Se=bi(X,(e.now?.()??new Date).getTime()),Re=Math.max(G*(te+1),we*(te+1)/z-he,Se);await M(Math.min(L.remainingMs(),Re),D),L.assertCurrent()}throw Error("Reason Device operation heartbeat retries were exhausted.")}async function Wm(e,l,v,D,M){let L=fl(l),z=new AbortController,re=new AbortController,G=()=>{z.abort(e.signal.reason),re.abort(e.signal.reason)};if(e.signal.aborted)G();else e.signal.addEventListener("abort",G,{once:!0});let ce=null,we,te,X=-1,he=0,Se=Promise.resolve(),Re=[],Ee=new AbortController,Oe=!1,Me,Ce=null,Te=!1,We,$e,Ue={},Ne=(Ve)=>{Oe=!0,Ee.abort(Ve),z.abort(Ve),re.abort(Ve)},xe=(Ve)=>{if(Me)return Me;let Je=structuredClone(Ve),it=he;return Me=(async()=>{let Ye=new AbortController,Be=Ye.signal;Be.throwIfAborted();let Ke,Fe=()=>{},nt=new Promise((Ze,He)=>{if(Fe=()=>He(Be.reason),Be.addEventListener("abort",Fe,{once:!0}),Ke=setTimeout(()=>Ye.abort(Error("Hands stop receipt delivery timed out.")),4000),Be.aborted)Fe()});try{for(let Ze=0;Ze<3;Ze+=1){Be.throwIfAborted();try{let He=await Promise.race([Wn(e,"event",()=>e.client.operationEvents(e.state,l,{eventSeqStart:it,events:[Je],signal:Be,transientRetryOwner:"caller"})),nt]);if(Be.throwIfAborted(),He.next_event_seq!==it+1)throw Error("Hands stop receipt acknowledgement sequence mismatch.");he=He.next_event_seq;return}catch(He){if(ee(He))M(He);let at=He instanceof k?or(He.status):sr(He);if(Be.aborted||!at||Ze===2)throw He;let lt=Math.max(500*2**Ze,bi(He,(e.now?.()??new Date).getTime()));await Promise.race([v(lt,Be),nt])}}}finally{clearTimeout(Ke),Be.removeEventListener("abort",Fe),Ye.abort()}})(),Me},Le=(Ve,Je,it)=>{let Ye=(Ke)=>Wn(e,"event",()=>e.client.operationEvents(e.state,l,{eventSeqStart:Je,events:Ve,signal:Ke,...it?{transientRetryOwner:"caller"}:{}})).catch((Fe)=>{if(l.capability==="hands.connect"&&_r(Fe))Ne(Fe);if(it&&(ee(Fe)||_r(Fe))){if(ee(Fe))M(Fe);z.abort(Fe),re.abort(Fe),Ee.abort(Fe)}throw Fe});if(!it)return async(Ke)=>{if(l.capability!=="hands.connect"&&l.capability!=="inference.custom.v1"){he=(await Ye(Ke)).next_event_seq;return}Ke.throwIfAborted();let Fe=()=>{},nt=new Promise((Ze,He)=>{Fe=()=>He(Ke.reason),Ke.addEventListener("abort",Fe,{once:!0})});try{let Ze=await Promise.race([Ye(Ke),nt]);Ke.throwIfAborted(),he=Ze.next_event_seq}finally{Ke.removeEventListener("abort",Fe)}};let Be=el({send:Ye,lease:$e,sleep:v,retryAfterMs:(Ke)=>bi(Ke,(e.now?.()??new Date).getTime())});return async(Ke)=>{let Fe=await Be(Ke);if(Fe.next_event_seq!==Je+Ve.length)throw Error("Hands generation receipt acknowledgement sequence mismatch.");he=Fe.next_event_seq}},Ge=async(Ve,Je)=>{let it=Ve??await sl(e,l,{controlAckSeq:X,waitMs:Je},re.signal,v,$e),Ye=null,Be=!1;for(let Ke=0;Ke<10;Ke+=1){let Fe=X+1;for(let nt of it.controls){if(nt.seq!==Fe)throw Error("Reason returned an out-of-order Device operation control.");if(nt.kind==="cancel"||nt.kind==="operation.cancel")Ye??=xm(nt.payload),z.abort(new r(Ye,"Reason closed the Device operation."));if(nt.kind!=="cancel"&&nt.kind!=="operation.cancel"){if(["browser.recording.v1","browser.pr-proof.v1","process.run.v1","process.full.v1"].includes(l.capability)){let Ze,He,at=new Promise((lt,kt)=>{Ze=lt,He=kt});at.catch(()=>{}),Ue.current={promise:at,resolve:Ze,reject:He}}try{Be||=!await e.onControl?.(l,nt)}catch(Ze){if(Ze instanceof r)we??=al(Ze);throw Ue.current?.reject(Ze),Ze}}X=nt.seq,Fe+=1}if(it.controls.length===0){if(it.next_control_seq!==X+1)throw Error("Reason returned a Device operation control sequence gap.");return{cancellationReason:Ye,unsupported:Be}}try{it=await sl(e,l,{controlAckSeq:X},re.signal,v,$e),Ue.current?.resolve()}catch(nt){if(Ue.current?.reject(nt),!Ye||_r(nt)||ee(nt))throw nt;return{cancellationReason:Ye,unsupported:Be}}}throw Error("Reason returned too many Device operation control batches.")};try{let Ve;try{if(!L)$e=new wi(l.lease_until,()=>(e.now?.()??new Date).getTime(),(Je)=>{if(!z.signal.aborted)ce=Je;z.abort(Je),re.abort(Je)});Ve=L||l.capability==="hands.connect"||l.capability==="display.stream.v1"||l.capability==="simulator.stream.v1"||Qr.has(l.capability)||l.capability==="pty.start"?{cancellationReason:null,unsupported:!1}:await Ge()}catch(Je){if(!La(l)||_r(Je)||ee(Je))throw Je;await Ua(e,l,{status:e.signal.aborted?"cancelled":"failed"});return}if(Ve.cancellationReason||e.signal.aborted){let Je=Ve.cancellationReason??Ca(e.signal);z.abort(new r(Je,"Reason closed the Device operation.")),te={status:"cancelled",error_code:Je}}else if(Ve.unsupported)z.abort(),te={status:"failed",error_code:"control_unsupported"};else{let Je=L?Promise.resolve():(async()=>{let Ye=e.operationHeartbeatIntervalMs??e.heartbeatIntervalMs??(["hands.connect","browser.recording.v1","browser.pr-proof.v1","process.run.v1","process.full.v1","preview.serve.v1"].includes(l.capability)?bm:15000),Be=Math.min(Ye,Math.max(0,(e.operationHeartbeatAttemptTimeoutMs??ja)-1000)),Ke=l.capability==="hands.connect"||l.capability==="pty.start"||l.capability==="display.stream.v1"||l.capability==="simulator.stream.v1"||l.capability==="browser.recording.v1"||l.capability==="browser.pr-proof.v1"||l.capability==="process.run.v1"||l.capability==="process.full.v1"||l.capability==="preview.serve.v1"||l.capability==="inference.custom.v1";while(!re.signal.aborted)try{if(!Ke){if(await v(Ye,re.signal),re.signal.aborted)return}let Fe=await Ge(void 0,Ke?Be:void 0);if(Fe.cancellationReason||Fe.unsupported){if(Fe.unsupported)ce=Error("Reason requested an unsupported Device operation control.");z.abort(Fe.cancellationReason?new r(Fe.cancellationReason,"Reason closed the Device operation."):void 0);return}}catch(Fe){if(ee(Fe))M(Fe);if(_r(Fe))ce=Fe,Ne(Fe);if(!re.signal.aborted)ce=Fe,z.abort();return}})();try{if($e?.assertCurrent(),z.signal.throwIfAborted(),D.authorized=()=>!z.signal.aborted&&(L||($e?.remainingMs()??0)>0),te=await e.onClaim(l,z.signal,async(Ye)=>{if(La(l))return;if(Ye.kind==="permission.denied"){if(!D.authorized())return;let at=Ye.data,lt=(e.now??(()=>new Date))().getTime(),kt=e.statusPath??mr(),jt=(e.loadStatus??rt)(kt),Kt={id:um(),kind:"permission_denied",operation:at?.operation,provenance:at?.provenance,occurredAt:new Date(lt).toISOString(),expiresAt:new Date(lt+600000).toISOString(),sessionId:l.run_id,deviceId:e.state.deviceId,organizationId:e.state.orgId};if(jt&&fr(Kt,lt)){let pr=jt.permissionRecovery;if(!pr||!fr(pr,lt)||pr.sessionId!==Kt.sessionId||pr.operation!==Kt.operation||pr.provenance!==Kt.provenance)(e.saveStatus??Ei)({...jt,permissionRecovery:Kt},kt)}return}let Be=l.capability==="hands.connect"&&Ye.capability==="hands.connect"&&Ye.kind==="hands.stopped",Ke=l.capability==="hands.connect"&&Ye.kind==="hands.reconnected",Fe=Ke||l.capability==="inference.custom.v1"?AbortSignal.any([z.signal,Ee.signal,...Ye.deliverySignal?[Ye.deliverySignal]:[]]):l.capability==="hands.connect"?AbortSignal.any([e.signal,Ee.signal]):e.signal,nt={kind:Ye.kind,payload:{sequence:Ye.sequence,capability:Ye.capability,...Ye.data?{data:Ke?structuredClone(Ye.data):Ye.data}:{}}};if(l.capability==="hands.connect"&&Ye.capability==="hands.connect"&&(Ye.kind==="started"||Ye.kind==="hands.started")||(Qr.has(l.capability)||l.capability==="pty.start")&&Ye.kind==="started")return new Promise((at,lt)=>{Re.push({wireEvent:nt,settle:(kt)=>kt===void 0?at():lt(kt)})});let Ze=Re;Re=[];let He=Se.then(async()=>{if((Oe||e.signal.aborted)&&l.capability==="hands.connect"&&!L){if(Be)await xe(nt);return}if(Ce!==null){if(Ye.kind!=="hands.stopped"||!Te||!We)throw Ce;let lt=new AbortController,kt=AbortSignal.any([e.signal,Ee.signal,lt.signal]),jt=setTimeout(()=>lt.abort(Error("Hands stop receipt reconciliation timed out.")),4000);Te=!1;try{await We(kt),We=void 0,await Le([nt],he,!0)(kt),Ce=null}catch(Kt){throw Ce=Kt??Error("Hands stop receipt could not be confirmed."),Kt}finally{clearTimeout(jt),lt.abort()}return}if(Ke&&!$e){let lt=Math.min(Date.parse(l.lease_until),Date.parse(String(l.payload.expires_at)));$e=new wi(new Date(lt).toISOString(),()=>(e.now?.()??new Date).getTime(),(kt)=>{z.abort(kt),re.abort(kt)})}let at=he;if(Ke)We=Le([...Ze.map((lt)=>lt.wireEvent),nt],at,!0),await We(Fe),We=void 0;else await Le([...Ze.map((lt)=>lt.wireEvent),nt],at,!1)(Fe)});He.then(()=>{for(let at of Ze)at.settle()},(at)=>{for(let lt of Ze)lt.settle(at??Error("Hands event delivery failed."))}),Se=He.catch((at)=>{if(ee(at))M(at);if(Ke){if(Ce===null)Te=Fe.aborted&&!Ee.signal.aborted,Ce=at??Error("Hands generation receipt delivery failed.");if(!Fe.aborted)z.abort(at),re.abort(at)}}),await He}),["browser.recording.v1","browser.pr-proof.v1","process.run.v1","process.full.v1"].includes(l.capability))await Ue.current?.promise}catch(Ye){te=z.signal.aborted?{status:"cancelled",error_code:Ca(z.signal)}:{status:"failed",error_code:al(Ye)}}finally{D.authorized=()=>!1,Ee.abort();for(let Ye of Re.splice(0))Ye.settle();re.abort(),await Je}let it=Qn(l.capability)?Ba(te.result,l.operation_id):null;if(ce){if(ee(ce))throw ce;te={status:"failed",error_code:we??"control_or_heartbeat_failed",...it?{result:it}:{}}}else if(z.signal.aborted&&te.status==="succeeded")te={status:"cancelled",error_code:Ca(z.signal),...it?{result:it}:{}}}if($e?.close(),ee(e.signal.reason))throw e.signal.reason;await Ua(e,l,te)}finally{$e?.close(),Ee.abort(),re.abort(),e.signal.removeEventListener("abort",G)}}async function Ka(e){let l=e.now??(()=>new Date),v=e.sleep??za,D=e.saveStatus??Ei,M=e.loadStatus??rt,L=e.statusPath??mr(),z=l().toISOString(),re=M(L)?.lastUsedAt,G=!1,ce=()=>({version:1,pid:process.pid,startedAt:z,...ll(l),...cl(M(L),e.state,l().getTime()),deviceId:e.state.deviceId,...e.idleSleepPolicy||e.readIdleSleepPolicy?{idleSleepHold:G}:{},...re?{lastUsedAt:re}:{}}),we=0,te,X=!1,he,Se,Re,Ee=Promise.resolve();D({...ce(),state:"starting"},L),e.onEvent?.({type:"started",deviceId:e.state.deviceId}),$a();try{let Oe=async()=>{let Me=e.readIdleSleepPolicy?e.readIdleSleepPolicy():e.idleSleepPolicy;if(e.signal.aborted||Me===Se)return;if(he&&Se){let We=await he.release();if(e.onEvent?.({type:"idle_sleep",status:We,policy:Se}),We==="failed")return;he=void 0,Se=void 0,G=!1;let $e=M(L);if($e)D({...$e,idleSleepHold:G},L)}if(!Me)return;Se=Me;let Ce=!0;he=await(e.acquireAwakeHold??Zc)(Me,{onStatusChange:(We)=>{if(Ce)return;G=We==="held";let $e=M(L);if($e)D({...$e,idleSleepHold:G},L);e.onEvent?.({type:"idle_sleep",status:We,policy:Me})}}),Ce=!1,G=he.status==="held";let Te=M(L);if(Te)D({...Te,idleSleepHold:G},L);e.onEvent?.({type:"idle_sleep",status:he.status,policy:Me})};if(await Oe(),e.readIdleSleepPolicy)Re=setInterval(()=>{Ee=Ee.then(Oe).catch(()=>{e.onEvent?.({type:"idle_sleep",status:"failed",policy:Se??"battery_and_ac"})})},e.idleSleepPollMs??1000),Re.unref();while(!e.signal.aborted){let Me=!1;try{await Nm({...e,saveStatus:(Ce,Te)=>{if(Ce.state==="starting"||Ce.state==="error"||Ce.state==="stopped")return;re=Ce.lastUsedAt??re,D({...Ce,startedAt:z,...e.idleSleepPolicy||e.readIdleSleepPolicy?{idleSleepHold:G}:{}},Te)},onEvent:(Ce)=>{if(Ce.type==="error"&&Ce.diagnostic){e.onEvent?.(Ce);return}if(Ce.type==="started"||Ce.type==="error"||Ce.type==="stopped")return;if(Ce.type==="heartbeat"&&we>0&&!Me){Me=!0;let Te=we;we=0,te=void 0,e.onEvent?.({type:"reconnected",attempts:Te})}e.onEvent?.(Ce)}});return}catch(Ce){if(Ta(Ce,e.signal))return;if(ee(Ce)){X=!0;let We=e.state.worker?"worker_connection_failed":Ma(Ce);throw D({...ce(),state:"error",error:We},L),e.onEvent?.({type:"error",message:We}),Ce}we+=1;let Te=Im(we,e.reconnectRandom);te??=l().toISOString(),D({...ce(),state:"starting",reconnectingSince:te},L),e.onEvent?.({type:"reconnecting",message:e.state.worker?"worker_connection_failed":Ma(Ce),attempt:we,retryInMs:Te}),await v(Te,e.signal)}}}catch(Oe){if(!Ta(Oe,e.signal))throw Oe}finally{if(e.client.close?.(),clearInterval(Re),await Ee,he&&Se){let Oe=await he.release();G=Oe==="failed"&&he.status==="held",e.onEvent?.({type:"idle_sleep",status:Oe,policy:Se})}if(!X)D({...ce(),state:"stopped"},L);else{let Oe=M(L);if(Oe)D({...Oe,idleSleepHold:G},L)}e.onEvent?.({type:"stopped"})}}async function Nm(e){let l=e.now??(()=>new Date),v=e.sleep??za,D=e.statusPath??mr(),M=e.saveStatus??Ei,L=e.loadStatus??rt,z=l().toISOString(),re=L(D)?.lastUsedAt,G=e.runtimeUpdate,ce=new AbortController,we=()=>ce.abort(e.signal.reason);if(e.signal.aborted)we();else e.signal.addEventListener("abort",we,{once:!0});let te=G?.random??Math.random,X=e.maxConcurrentClaims,he=typeof X==="number"&&Number.isSafeInteger(X)&&X>0?Math.min(ym,X):wm,Se=0,Re=!1,Ee=null,Oe=(tt)=>{Ee??=tt,ce.abort(tt)},Me=new Map,Ce=()=>{let tt=new Set,yt=0;for(let{claim:Wr}of Me.values()){let Xe=Wr.capability==="hands.connect"?Wr.payload[pe]:void 0;if(typeof Xe==="string"){if(tt.has(Xe))continue;tt.add(Xe)}yt+=1}return yt},Te=null,We=()=>[...Me.values()].some((tt)=>tt.authorized()),$e=()=>[...Me.values()].every((tt)=>tt.claim.capability==="preview.serve.v1"),Ue=G?new Date(z).getTime()+xa(G.initialDelayMs??Sm,te):Number.POSITIVE_INFINITY,Ne=null,xe=!1,Le=e.firstHeartbeat,Ge=Le?.account_root_metadata_supported===!0,Ve=Le?.workspace_root_metadata_supported===!0,Je=Le?.account_root_path_supported===!0,it=Le?.home_contained_roots_supported===!0,Ye=Le?.root_paths_supported===!0,Be=Le?.startup_supported===!0,Ke=Le!==void 0,Fe=Le?{challenge:Le.challenge,expires_at:Le.expires_at}:void 0,nt,Ze=!e.startup,He=()=>({version:1,pid:process.pid,startedAt:z,...ll(l),...cl(L(D),e.state,l().getTime()),...re?{lastUsedAt:re}:{},deviceId:e.state.deviceId,...Ne?{organizationId:Ne.organization_id,organizationName:Ne.organization_name,organizationSlug:Ne.organization_slug}:{}}),at=()=>{let tt=(e.advertised??e.claimable)?.()!==!1;if(!Ze)nt??=e.startup?.();return{...e.deviceMetadata?.device_model!=null?{device_model:e.deviceMetadata.device_model}:{},...e.deviceMetadata?.device_chip!=null?{device_chip:e.deviceMetadata.device_chip}:{},...e.deviceMetadata?.device_location!=null?{device_location:e.deviceMetadata.device_location}:{},reason_runtime_version:e.runtimeVersion,bridge_version:e.bridgeVersion,protocol_version:e.protocolVersion,execution_eligible:tt,...Be&&!Ze&&nt?{startup:nt}:{},capabilities:tt?Da(e.capabilities,{accountRootMetadataSupported:Ge,workspaceRootMetadataSupported:Ve,accountRootPathSupported:Je,homeContainedRootsSupported:it,rootPathsSupported:Ye}):{supported_operations:[]}}},lt=()=>{if(xe||!e.client.identity)return;xe=!0,e.client.identity(e.state,e.signal).then((tt)=>{if(tt.organization_id!==e.state.orgId)return;Ne=tt;let yt=L(D);if(!yt)return;M({...yt,organizationId:tt.organization_id,organizationName:tt.organization_name,organizationSlug:tt.organization_slug},D)}).catch(()=>{return})},kt=(tt)=>{Ge=tt.account_root_metadata_supported===!0,Ve=tt.workspace_root_metadata_supported===!0,Je=tt.account_root_path_supported===!0,it=tt.home_contained_roots_supported===!0,Ye=tt.root_paths_supported===!0,Be=tt.startup_supported===!0,Ke=!1},jt=(tt)=>{if(tt.startup)Ze=!0},Kt=(tt,yt)=>{if(!(yt instanceof k&&yt.status===400&&yt.code==="invalid_heartbeat")||!tt.startup&&!Ke)throw yt;if(Ze=!0,Ke)Ge=Ve=Je=!1,it=Ye=Be=Ke=!1;return null},pr=(tt)=>{kt(tt),M({...He(),state:"connected",lastHeartbeatAt:l().toISOString()},D),lt(),e.onEvent?.({type:"heartbeat",serverTime:tt.server_time,drain:tt.drain,...tt.latest_cli_versions?{latestCliVersions:tt.latest_cli_versions}:{},...tt.hands_prespawn?{handsPrespawn:!0}:{}})},Xr=!1,In=!1;e.registerHeartbeatNow?.(()=>{if(e.signal.aborted)return;if(Xr)In=!0;let tt=at();Wn(e,"heartbeat",()=>e.client.heartbeat(e.state,tt,ce.signal).catch((yt)=>Kt(tt,yt))).then((yt)=>{if(!yt)return;jt(tt),kt(yt),pr(yt)},()=>{return})});let Lr=(tt)=>v(tt,e.signal);M({...He(),state:"starting"},D),e.onEvent?.({type:"started",deviceId:e.state.deviceId});let xr=!1,sn=e.maxConsecutiveHeartbeatFailures??3,Ir=0,er=0,On=0,zo=0,cn=null;try{while(!e.signal.aborted){if(Ee)throw Ee;if(Re&&$e())break;let tt,yt=er>0&&er<pm&&performance.now()-zo<hm&&cn!==null;if(!yt)er=0;e:{if(yt&&cn){tt=cn;break e}let vt=at(),rr=Fe;Fe=void 0,Xr=!0,In=!1;try{let At=await Wn(e,"heartbeat",()=>e.client.heartbeat(e.state,vt,ce.signal,...rr?[rr]:[]).catch((Sr)=>Kt(vt,Sr)));if(Xr=!1,!At)continue;tt=At,jt(vt),zo=performance.now(),Ir=0}catch(At){if(Xr=!1,e.signal.aborted)break;if(!_i(At))throw At;if(Ir+=1,Ir>=sn&&!We())throw At;await v(Math.min(e.heartbeatRetryDelayMs??2000,e.heartbeatIntervalMs??15000),e.signal);continue}if(kt(tt),Object.keys(at().capabilities).length>Object.keys(vt.capabilities).length)continue;if(In)continue;if(pr(tt),Ee)throw Ee;if(e.signal.aborted)break;if(G&&["available","required"].includes(tt.update_policy??""))Ue=Math.min(Ue,l().getTime());if(G&&l().getTime()>=Ue)try{let At=new AbortController,Sr=()=>At.abort(e.signal.reason);if(e.signal.aborted)Sr();else e.signal.addEventListener("abort",Sr,{once:!0});let $r;try{$r=G.check(At.signal)}catch(Ft){$r=Promise.reject(Ft)}let ln=$r.then((Ft)=>({kind:"completed",result:Ft}),(Ft)=>({kind:"failed",error:Ft})),Br;try{while(!0){let Ft=await Om(ln,e.heartbeatIntervalMs??15000,e.signal,v);if(e.signal.aborted)throw e.signal.reason??new DOMException("Aborted","AbortError");if(Ft.kind==="failed")throw new Ia(Ft.error);if(Ft.kind==="completed"){Br=Ft.result;break}try{let Gt=at(),oo=await Wn(e,"heartbeat",()=>e.client.heartbeat(e.state,Gt,ce.signal).catch((Ko)=>Kt(Gt,Ko)));if(!oo)continue;tt=oo,jt(Gt),pr(tt),Ir=0}catch(Gt){if(e.signal.aborted)throw Gt;if(!_i(Gt))throw Gt;if(Ir+=1,Ir>=sn&&!We())throw Gt}}}catch(Ft){At.abort(Ft);let Gt=await ln;if(Gt.kind==="completed"&&Gt.result==="activated")Br="activated";else throw Ft}finally{e.signal.removeEventListener("abort",Sr)}if(e.signal.aborted)throw e.signal.reason??new DOMException("Aborted","AbortError");if(Se=0,Br==="activated"){if(e.signal.aborted)throw e.signal.reason??new DOMException("Aborted","AbortError");e.onEvent?.({type:"runtime_updated"}),Re=!0}Ue=l().getTime()+xa(G.intervalMs??Rm,te)}catch(At){if(!(At instanceof Ia))throw At;Se+=1;let Sr=G.retryBaseMs??Em,$r=G.retryMaxMs??Pm,ln=Math.min($r,Sr*2**Math.min(Se-1,8));Ue=l().getTime()+xa(ln,te)}}if(cn=tt,e.signal.aborted)break;if(Re&&$e())break;if(Re){await Lr(e.heartbeatIntervalMs??15000);continue}let Wr=e.client.sessionCadence?.(e.state)??null,Xe=Wr?.presenceIntervalMs??e.heartbeatIntervalMs??15000;if(tt.drain||e.claimable?.()===!1){er=0,await Lr(Xe);continue}if(Ce()>=he){er=0;let vt=new AbortController;Te=vt;try{await v(Xe,AbortSignal.any([e.signal,vt.signal]))}catch(rr){if(!vt.signal.aborted)throw rr}finally{if(Te===vt)Te=null}continue}let st,Ct=yt?0:Wr?.claimWaitMs??Math.min(e.heartbeatIntervalMs??15000,30000),Vt=performance.now();try{st=await Wn(e,"claim",()=>e.client.claimOperation(e.state,{waitMs:Ct,signal:ce.signal}))}catch(vt){if(er=0,e.signal.aborted||!_i(vt)||!We())throw vt;On+=1;let rr=Math.min(e.heartbeatRetryDelayMs??2000,e.heartbeatIntervalMs??15000);await Lr(Math.max(Tm(On,rr,Math.max(rr,Ct),te),bi(vt,(e.now?.()??new Date).getTime())));continue}if(On=0,Ee)throw Ee;if(!st){if(yt){er=0;continue}if(performance.now()-Vt<Ct-mm)await Lr(fm);continue}if(e.claimable?.()===!1){er=0,await Ua(e,st,{status:"cancelled",error_code:"execution_authority_withdrawn"},e.signal);continue}re=l().toISOString(),M({...He(),state:"connected",lastHeartbeatAt:l().toISOString()},D),e.onEvent?.({type:"claim",operationId:st.operation_id,runId:st.run_id,attemptId:st.attempt_id,capability:st.capability});let Tt,gr={authorized:()=>!1,claim:st};if(Tt=Wm({...e,signal:ce.signal},st,v,gr,Oe).catch((vt)=>{if(ee(vt))Oe(vt);else if(!_r(vt)&&[...Me].some(([rr,At])=>rr!==Tt&&At.authorized())){if(vt instanceof Eo)e.onEvent?.({type:"error",message:"operation_completion_timeout",diagnostic:{stage:"completion",category:"timeout"}});return}if(!_r(vt)&&Ee===null)Ee=vt}).finally(()=>{Me.delete(Tt),Te?.abort(),e.onEvent?.({type:"claims_changed",activeClaims:Me.size})}),Me.set(Tt,gr),e.onEvent?.({type:"claims_changed",activeClaims:Me.size}),er+=1,fl(st)){if(er=0,await Tt,Ee)throw Ee}}}catch(tt){if(!Ta(tt,e.signal)){ce.abort(tt),xr=!0;let yt=e.state.worker?"worker_connection_failed":Ma(tt);throw M({...He(),state:"error",error:yt},D),e.onEvent?.({type:"error",message:yt}),tt}}finally{if(ce.abort(),await Promise.allSettled(Me.keys()),e.signal.removeEventListener("abort",we),!xr)M({...He(),state:"stopped"},D);e.onEvent?.({type:"stopped"})}}import{execFile as dp}from"child_process";import{constants as Al,existsSync as up,mkdtempSync as Ya,rmSync as Dl}from"fs";import{access as xl,open as fp,readFile as Il,readlink as mp,readdir as Ol,unlink as pp,rmdir as hp}from"fs/promises";import{tmpdir as gp}from"os";import{basename as Xa,join as Pi}from"path";import{randomUUID as hn}from"crypto";import{chmodSync as Hm,closeSync as $m,fsyncSync as Bm,openSync as Um,readFileSync as Fm,rmdirSync as ml,unlinkSync as pl,writeFileSync as jm}from"fs";import{createConnection as qm,createServer as zm}from"net";import{dirname as Km,join as Vm}from"path";var Jm=5000;async function hl(e,l,v){if(v.aborted)return!1;let D={generation:1,fenceId:hn()},M={runId:hn(),deviceId:hn(),rootId:hn(),apiOrigin:e.apiOrigin,binding:{kind:"workspace_source",target_revision:1,root_grant_revision:1},expiresAtMs:Date.now()+30000,identity:()=>D},L=ai(l,M),z={version:1,snapshot_id:hn(),revision:1,run_id:M.runId,device_id:M.deviceId,root_id:M.rootId,binding:{...M.binding,target_generation:D.generation,target_fence_id:D.fenceId},expires_at:new Date(M.expiresAtMs).toISOString(),variables:{WORKER_PROBE:"synthetic-readiness"},git:null};try{return L.install(z).installed&&L.current().snapshot_id===z.snapshot_id&&!v.aborted}catch{return!1}finally{try{pl(L.path)}catch{}}}async function bl(e,l,v=$t){if(l.aborted)return!1;let D,M,L=new Set,z=hn(),re=zm((X)=>{L.add(X),X.once("close",()=>L.delete(X)),X.on("error",()=>X.destroy()),X.end(z)});re.maxConnections=1;let G,ce,we=new Promise((X)=>{ce=()=>X(!1)}),te=setTimeout(ce,Jm);l.addEventListener("abort",ce,{once:!0});try{D=v({runtimeDirectory:p(e),root:e.workspaceRoot,runId:`readiness-${hn()}`}),M=Vm(D.journalDirectory,"readiness.json");let X=Um(M,"wx",384);try{jm(X,z),Bm(X)}finally{$m(X)}if(Fm(M,"utf8")!==z||l.aborted)return!1;let he=new Promise((Se)=>{re.once("error",()=>Se(!1)),re.listen(D.socketPath,()=>{try{if(process.platform!=="win32")Hm(D.socketPath,384)}catch{Se(!1);return}G=qm(D.socketPath);let Re="";G.setEncoding("utf8"),G.once("error",()=>Se(!1)),G.on("data",(Ee)=>{if(Re+=Ee,Re.length>z.length)G?.destroy(),Se(!1)}),G.once("end",()=>Se(Re===z)),G.once("close",()=>Se(!1))})});return await Promise.race([he,we])&&!l.aborted}catch{return!1}finally{clearTimeout(te),l.removeEventListener("abort",ce),G?.destroy();for(let X of L)X.destroy();if(await new Promise((X)=>re.close(()=>X())),D?.disposeSocket(),M)try{pl(M)}catch{}if(D){try{ml(D.journalDirectory)}catch{}try{ml(Km(D.journalDirectory))}catch{}}}}import{execFileSync as vi}from"child_process";import{randomUUID as dr}from"crypto";import{chmodSync as kl,chownSync as El,closeSync as Va,constants as Mr,existsSync as Gm,fstatSync as Pl,mkdirSync as vl,mkdtempSync as Ym,openSync as Ja,readFileSync as Xm,readSync as Zm,realpathSync as Qm,rmdirSync as ep,rmSync as tp}from"fs";import{join as wn}from"path";import{fileURLToPath as rp}from"url";var Sl=1e4,np=!1;function Ri(){if(process.platform!=="linux")return!1;return np||=["/usr/bin/tmux","/usr/local/bin/tmux","/bin/tmux"].some((e)=>{try{let l=vi(e,["-V"],{encoding:"utf8",timeout:2000,env:{PATH:"/usr/bin:/bin"},stdio:["ignore","pipe","ignore"]}),v=/^tmux (?:next-)?([0-9]+)\.([0-9]+)/.exec(l);return v!==null&&Number(v[1])*100+Number(v[2])>=302}catch{return!1}})}var op=Buffer.from([0,255,3,4]);function Rl(e){return`printf "%s\\n" ${e==="foreground"?"$$":"$!"} > ${e}.pid.tmp; /bin/mv ${e}.pid.tmp ${e}.pid`}function ip(e,l,v){if(!Number.isSafeInteger(l)||l<2||!Number.isSafeInteger(v)||v<2||e.length>4096||!e.startsWith(`${l} (`))return!1;let D=e.lastIndexOf(") ");if(D<0)return!1;let M=e.slice(D+2).trim().split(/\s+/);return M.length>=20&&/^[A-Za-z]$/.test(M[0])&&/^\d+$/.test(M[1])&&M[2]===String(l)&&M[3]===String(v)&&/^[1-9][0-9]*$/.test(M[19])}async function Po(e,l={}){if(process.platform==="win32")return!e.aborted&&yi();if(e.aborted||!["darwin","linux"].includes(process.platform)||typeof Bun>"u")return!1;let v=J(),{directory:D,root:M,runtimeDirectory:L}=cp(v),z=new AbortController,re=()=>z.abort();e.addEventListener("abort",re,{once:!0});let G;z.signal.addEventListener("abort",()=>G?.close(),{once:!0});let ce=setTimeout(re,Sl),we={organization_id:dr(),user_id:dr(),device_id:dr()},te=dr(),X=dr(),he=dr(),Se=dr(),Re=Date.now()+Sl,Ee={kind:"workspace_source",target_revision:0,root_grant_revision:1},Oe=dr().replaceAll("-",""),Me,Ce=Buffer.alloc(0),Te,We=!1,$e=!1,Ue=!1,Ne=!1,xe,Le,Ge,Ve=async(it)=>{while(!it()){if(z.signal.aborted)throw Error("pty_probe_cancelled");await new Promise((Ye)=>setTimeout(Ye,20))}if(z.signal.aborted)throw Error("pty_probe_cancelled")},Je=!1;try{G=ap(D,v),xe=Bun.serve({hostname:"127.0.0.1",port:0,fetch(Be,Ke){let Fe=new URL(Be.url).pathname,nt=Fe===`/device/hands/${Oe}`?"hands":Fe===`/device/pty/${Oe}`?"pty":null;if(nt&&Ke.upgrade(Be,{data:{lane:nt}}))return;return new Response(null,{status:404})},websocket:{maxPayloadLength:8192,open(Be){if(Be.data.lane==="pty")Me=Be},message(Be,Ke){if(Be.data.lane!=="pty")return;if(typeof Ke==="string"){try{if(JSON.parse(Ke).t==="open")We=!0}catch{re()}return}if(Ce.length+Ke.length>8192){re();return}Ce=Buffer.concat([Ce,Ke])}}});let it=`ws://127.0.0.1:${xe.port}`;if(Le=et({headless:!0,managedPty:{version:1},root:M,runtimeDirectory:L,runId:te,operationId:dr(),attemptId:dr(),claimOwner:we,deviceIdentity:{deviceId:we.device_id,rootId:X,apiOrigin:"https://worker-probe.invalid"},signal:z.signal,payload:{relay_url:`${it}/device/hands/${Oe}`,session_id:"pty-readiness",environment_id:"pty-readiness",expires_at:new Date(Re).toISOString(),policy_mode:"full_access",policy_version:1,hands_protocol_version:F,hands_worker_version:U,hands_worker_artifact_sha256:T,hands_worker_entrypoint:H,target_generation:1,target_fence_id:he,environment_binding:Ee,[E]:_e},emitEvent:async(Be)=>{if(Be==="hands.started")Ne=!0;if(Be==="hands.ready")$e=!0;if(Be==="hands.stopped")Ue=!0}},{browserExecutablePath:null,slot:Ao(),readyTimeoutMs:3000,logDiagnostic:()=>{return},resolvePathEnvironment:async()=>({path:"/usr/bin:/bin:/usr/sbin:/sbin",source:"fallback"}),sourceEntrypoint:rp(new URL("./worker-candidate-entry.ts",import.meta.url)),...l}).catch(()=>{if(!$e)re()}),await Ve(()=>$e),Qe({root:M,runId:te,payload:{version:1,snapshot_id:Se,revision:1,run_id:te,root_id:X,device_id:we.device_id,binding:{...Ee,target_generation:1,target_fence_id:he},expires_at:new Date(Re).toISOString(),variables:{PTY_PROBE_VALUE:Oe},git:null}}),Ge=rn({root:M,runId:te,rootId:X,deviceId:we.device_id,owner:we,workspace:{kind:"root"},authority:{device_id:we.device_id,binding:Ee.kind,target_revision:0,root_grant_revision:1,target_generation:1,target_fence_id:he},signal:z.signal,session:{jobId:`pty-${dr()}`,sessionId:"pty-readiness",operationId:dr(),cols:80,rows:24,leaseExpiresAtMs:Re,relayUrl:`${it}/device/pty/${Oe}`},emit:async(Be,Ke)=>{if(Be==="pty.ready")Te=Ke}}).catch(()=>{re()}),await Ve(()=>Boolean(Te&&Me&&We)),Me.send(JSON.stringify({t:"resize",cols:100,rows:30})),Me.send(Buffer.from(`stty -echo; test "$PTY_PROBE_VALUE" = '${Oe}' || exit 19; stty size; printf '\\000\\377\\003\\004'; (trap '' TERM HUP; ${G.wait("background")}) & ${Rl("background")}; /bin/bash --noprofile --norc -c 'trap "" TERM HUP; ${Rl("foreground")}; ${G.wait("foreground")}'
|
|
17
|
-
`)),await Ve(()=>Gm(wn(M,"foreground.pid"))&&
|
|
18
|
-
`).map((Fe)=>Fe.trim().split(/\s+/).map(Number));if(Ke.length!==2||new Set(Ke.map(([Fe])=>Fe)).size!==2||Ke.some((Fe)=>Fe.length!==2||!Ye.includes(Fe[0])||Fe[0]!==Fe[1]))return!1}if(Me.send(JSON.stringify({t:"close"})),await Ge,z.signal.aborted)return!1;for(let Be of[Te.job.process.pid,...Ye])try{return process.kill(Be,0),!1}catch(Ke){if(!(Ke instanceof Error&&("code"in Ke)&&Ke.code==="ESRCH"))return!1}Je=!0}catch{Je=!1}finally{if(clearTimeout(
|
|
9
|
+
`))return null;return{organizationId:Ne,config:Ce,state:Ge,proofStore:xt(Ce)}}catch{return null}},Oe=(Ne,Ce)=>{if(!Ce)return null;try{if(ft(Ce).revoked)return null;let Le=S(Ce);if(!Le||Le.orgId.toLowerCase()!==Ne||Date.parse(Le.worker?.expiresAt??"")<=Date.now()+60000||Ce.executionMode!==l.executionMode||!W(Ce.apiOrigin,l.apiOrigin))return null;return{organizationId:Ne,config:Ce,state:Le,proofStore:xt(Ce)}}catch{return null}},Me=(Ne,Ce)=>Ne.deviceId===Ce.deviceId&&Ne.devicePublicKey===Ce.devicePublicKey&&JSON.stringify(Ne.roots.map((Le)=>[Le.id,Le.path]))===JSON.stringify(Ce.roots.map((Le)=>[Le.id,Le.path])),Ee=async(Ne)=>{for(let[Ce,Le]of Ne){if(M.aborted)return;let Ge=re.get(Ce),Ve=Oe(Ce,Le.config);if(Ge&&Ve&&Me(Ge.state,Ve.state))continue;if(Ge){if(Ge.claims>0)continue;await be(Ce)}if(Ve&&!M.aborted)ke(Ve,!0)}for(let[Ce,Le]of re)if(Le.account&&!Ne.has(Ce)&&Le.claims===0)await be(Ce)},Te=async(Ne)=>{let Ce=le(Ne),Le=x.parse({...Ce,stateDirectory:l.stateDirectory});if(!u(Pt(p(l),"enrollment-install.json")))return null;let Ge=Kr(Le),Ve=await D.ownerWorkspaceEnrollment(v,{organization_id:Ne,install_id:Ge.request.install_id,code_challenge:Ge.request.code_challenge},M),Je=Ge.complete(Ne,Ve);if(b(p(Ce),!0),u(f(Ce).state))Zt(Ce);let it=Zo(Ce);try{let Ye=await Er(Ce,Je,it,e.enroll);return ce(Ye,f(Ce).state,{proofStore:it}),qt(Ce,{version:1,drained:!1,revoked:!1}),y(Pt(Ce.stateDirectory,"worker.json"),Ce),{organizationId:Ne,config:Ce,state:Ye,proofStore:it}}catch(Ye){if(Ye instanceof Rr&&Ye.deviceRemoved)return qt(Ce,{version:1,drained:!0,revoked:!0}),y(Pt(Ce.stateDirectory,"worker.json"),Ce),null;throw Ye}},We=async()=>{let Ne=Qt(l),Ce=new Map(Ne.filter((He)=>He.account).map((He)=>[He.organizationId,He]));await Ee(Ce);let Le=new Map(Ne.filter((He)=>!He.account).map((He)=>[He.organizationId,He])),Ge=(He)=>Ce.has(He)||re.get(He)?.account===!0||fa(Pt(Dr(l),He)),Ve=(He)=>{let at=Le.get(He)?.config;try{return at?ft(at).revoked:!1}catch{return!1}};for(let[He,at]of Le){if(re.has(He)||Ve(He)||fe.blocked.includes(He))continue;let lt=Re(He,at.config);if(lt&&!M.aborted)ke(lt)}if(X(fe.refused))return!0;let Je;try{Je=await D.ownerWorkspaces(v,M)}catch(He){let at=He instanceof k&&He.status===403&&kf.has(He.code),lt=fe.refused,kt=te(),jt=at?{device:v.deviceId,roots:kt,at:Date.now(),count:lt?.device===v.deviceId&<.roots===kt?lt.count+1:1}:lt;return fe={listed:!1,blocked:fe.blocked,...fe.names?{names:fe.names}:{},reason:He instanceof k&&He.status===403&&He.code==="sign_in_not_eligible"?"sign_in":null,...jt?{refused:jt}:{}},at}let it=new Map(Je.map((He)=>[He.id.toLowerCase(),He.blocked]).filter(([He])=>ei.test(He)&&He!==v.orgId.toLowerCase()&&!Ge(He))),Ye=[...it.keys()].filter((He)=>Le.has(He)?!Ve(He):!it.get(He)).slice(0,Qo),Be=[...re.values()].filter((He)=>!He.account&&He.claims>0&&!Ye.includes(He.organizationId)).length,Ke=Ye.filter((He)=>!Le.has(He)),Fe=Ke.slice(Ke.length-Math.min(Math.max(0,Ye.length+Be-Qo),Ke.length)),nt=Ye.filter((He)=>!Fe.includes(He)),Ze=Object.fromEntries(Je.flatMap((He)=>He.name&&nt.includes(He.id.toLowerCase())?[[He.id.toLowerCase(),He.name]]:[]));fe={listed:!0,reason:null,blocked:nt.filter((He)=>it.get(He)),names:Ze};for(let He of new Set([...Le.keys(),...re.keys()])){if(nt.includes(He)||Ge(He))continue;if(it.has(He)&&Ve(He))continue;if((re.get(He)?.claims??0)>0)continue;await be(He);let at=Le.get(He)?.config;try{if(at&&u(f(at).state))Zt(at)}catch{}un(Pt(Dr(l),He),{recursive:!0,force:!0}),L(`Reason worker: left workspace ${He}
|
|
10
|
+
`)}for(let He of nt){if(M.aborted)return!0;if(Ge(He))continue;try{let at=re.get(He);if(it.get(He)){if(at&&at.claims===0)await be(He),L(`Reason worker: offline in workspace ${He} (outside its allowed networks)
|
|
11
|
+
`);continue}let lt=Re(He,Le.get(He)?.config??null);if(lt&&at)continue;if(!lt){if(at&&at.claims>0)continue;if(await be(He),lt=await Te(He),lt)L(`Reason worker: connected in workspace ${He}
|
|
12
|
+
`)}if(lt&&!M.aborted)ke(lt)}catch{L(`Reason worker: could not connect in workspace ${He} (worker_workspace_failed); it is tried again
|
|
13
|
+
`)}}return!0},$e=null,Ue=async()=>{let Ne=!1;do ne=!1,Ne=await We().catch(()=>!1);while(ne&&!M.aborted);let Ce=JSON.stringify({version:1,...fe});if($e!==Ce)try{b(Dr(l),!0),y(ya(l),JSON.parse(Ce)),$e=Ce}catch{}return Ne};return{check(){if(G)ne=!0;else G=Ue().finally(()=>{G=null});return G},claims:()=>[...re.values()].reduce((Ne,Ce)=>Ne+Ce.claims,0),async settled(){await G,await Promise.all([...re.values()].map((Ne)=>Ne.done))}}}import{dirname as vf}from"path";function Ic(e){let l={saved:e.saved,configPath:e.configPath};if(!e.saved||!Sf(e.saved))return l;let v=e.saved,D=(z,re)=>e.log(JSON.stringify({event:"worker.api_origin_move",outcome:z,...re?{code:`worker_api_origin_move_${z}:${re}`}:{},timestamp:new Date().toISOString()})),M=e.native===void 0?bt():e.native;if(!M)return l;let L=[];try{let z=M.lock(vf(e.configPath));if(!z)return l;if(L.push(z),u(p(v))){let fe=oe({path:f(v).lock,runtimeVersion:g});if(!fe.acquired)return l;L.push(()=>fe.release())}let re=x.parse(JSON.parse(m(e.configPath)));if(re.stateDirectory!==v.stateDirectory)return l;let G=Oc(re),ne={saved:re,configPath:e.configPath};if(!ci(re)&&G.length===0)return D("unchanged"),ne;if(ci(re)){let fe=Ac(re);y(e.configPath,fe),ne={saved:fe,configPath:e.configPath}}for(let fe of G)try{y(fe.configPath,Ac(fe.config))}catch(te){D("failed",`workspace:${xc(te)}`)}return D("moved"),ne}catch(z){return D("failed",xc(z)),l}finally{for(let z of L.reverse())z()}}function ci(e){return we(e.apiOrigin)!==e.apiOrigin}function Oc(e){return Qt(e).filter((l)=>l.config!==null&&ci(l.config))}function Sf(e){return ci(e)||Oc(e).length>0}function Ac(e){let l=x.parse({...e,apiOrigin:we(e.apiOrigin)}),v=S(e);if(!v)return l;if(!v.worker)throw Error("worker_identity_missing");let D=O(l);if(v.apiOrigin!==l.apiOrigin||v.worker.configDigest!==D)ce({...v,apiOrigin:l.apiOrigin,worker:{...v.worker,configDigest:D}},f(l).state,{proofStore:xt(l)});return l}function xc(e){if(e instanceof a)return e.code;if(e instanceof Error&&/^worker_[a-z_]+$/.test(e.message))return e.message;return e instanceof Error&&"code"in e&&typeof e.code==="string"?e.code:"unexpected"}import{chmodSync as Rf,lstatSync as ka,readdirSync as Tc,readlinkSync as Ef,unlinkSync as Pf}from"fs";import{join as Wt,sep as Cf}from"path";var li="rehome.json";class di extends Error{code;constructor(e){super(e);this.code=e}}function Lc(e){let l={saved:e.saved,configPath:e.configPath},v=Wt(e.home,".config"),D=Wt(v,"ara"),M=e.channel==="production"?["connect"]:[e.channel,"connect"],L=Wt(D,...M),z=Wt(v,"reason",...M),re=(te,X)=>e.log(JSON.stringify({event:"worker.state_rehome",outcome:te,...X?{code:`worker_state_rehome_${te}:${X}`}:{},timestamp:new Date().toISOString()})),G=e.native===void 0?bt():e.native,ne=e.saved,fe=[];try{if(ne&&Mc(D)&&ne.stateDirectory===L){let Oe={...ne,stateDirectory:z};if(!_a(G,z,Oe,fe))return l;return Dc(ne,Oe,e.host,re)}if(ne&&Mc(D)&&ne.stateDirectory===z&&dc(ne)&&_a(G,z,ne,fe))return Wc({...ne,stateDirectory:L},ne,e.host),l;if(!ne||ne.lifetime!=="persistent"||ne.stateDirectory!==L||!Dn(D)?.isDirectory())return l;if(Mf(L)===g)return l;let X=(Oe,Me=!0)=>{if(Me)y(Wt(L,li),{version:g});return re("skipped",Oe),l},le=[L];for(let Oe of xf(D,L)){if(Oe.config?.lifetime!=="ephemeral")return X("several_connections");if(!Af(Oe.directory,Oe.config,fe))return X("once_running",!1);le.push(Oe.directory)}if(!G)return X("config_rename_unavailable:no_native");if(!_a(G,L,ne,fe))return l;let be=S(ne);if(!be||ft(ne).revoked)return l;if(Sc(v)!==null)return X("conflicting_identity");if(Ec(v)!==null)return X("conflicting_files");if(Dn(z)&&(!Dn(z).isDirectory()||Tc(z).length>0))return X("connection_folder_taken");co(ne,be.devicePublicKey),ga.before(ne);let ke=lr(L);if(ke&&ba(L))If(z,ke);let Re=De(v,G,le);if(Re.state!=="renamed"&&Re.state!=="linked"){if(ke&&ba(L))Nc(z);return X(Re.problem??"config_folder_kept")}return Dc(ne,{...ne,stateDirectory:z},e.host,re)}catch(te){try{if(Dn(L)?.isDirectory())y(Wt(L,li),{version:g})}catch{}return re("failed",Tf(te)),Df(ne,L,z,l)}finally{for(let te of fe.reverse())te()}}function Dc(e,l,v,D){let M=ka(l.stateDirectory);if(M.isDirectory()&&M.uid===process.getuid?.()&&(M.mode&63)!==0)Rf(l.stateDirectory,448);let L=xt(l),z=Ut(f(l).state,{proofStore:L,repair:!1});if(!z?.worker)throw new di("identity_missing");let re=O(l);if(z.worker.configDigest===O(e))ce({...z,worker:{...z.worker,configDigest:re}},f(l).state,{proofStore:L});else if(z.worker.configDigest!==re)throw new di("worker_config_binding_mismatch");y(Wt(l.stateDirectory,"worker.json"),l),ga.after(e,l),Wc(e,l,v);let G=Wt(l.stateDirectory,li);if(u(G))Pf(G);return D("moved"),{saved:l,configPath:Wt(l.stateDirectory,"worker.json")}}function Wc(e,l,v){if(as(e,l,v,"connect"),!ba(l.stateDirectory))return;let D=Of(Fr(e.stateDirectory));if(!D)return;let M=Fr(l.stateDirectory),L;try{L=M.loadBinding()}catch{return}if(!L)M.createBinding(D);Nc(e.stateDirectory)}function _a(e,l,v,D){if(e){let L=e.lock(l);if(!L)return!1;D.push(L)}if(!u(p(v)))return!0;let M=oe({path:f(v).lock,runtimeVersion:g});if(!M.acquired)return!1;return D.push(()=>M.release()),!0}function Af(e,l,v){if(u(p(l))){let M=oe({path:f(l).lock,runtimeVersion:g});if(!M.acquired)return!1;return v.push(()=>M.release()),!0}let D=Dn(Wt(e,"worker.json"));return D!==null&&Date.now()-D.mtimeMs>60000}function xf(e,l){let v=[e,...Tc(e,{withFileTypes:!0}).filter((M)=>M.isDirectory()&&!M.name.startsWith(".")).map((M)=>Wt(e,M.name))],D=[];for(let M of v)for(let L of["connect","connect-once"]){let z=Wt(M,L);if(z===l||!Dn(Wt(z,"worker.json")))continue;let re=Hc(z);if(!re||re.stateDirectory===e||re.stateDirectory.startsWith(e+Cf))D.push({directory:z,config:re})}return D}function ba(e){try{return JSON.parse(m(Wt(e,"api-key.json"))).store==="keychain"}catch{return!1}}function If(e,l){let v=Fr(e);v.deleteBinding(),v.createBinding(new TextEncoder().encode(l))}function Nc(e){try{Fr(e).deleteBinding()}catch(l){if(!(l instanceof a))throw l}}function Of(e){try{return e.loadBinding()}catch(l){if(l instanceof a)return null;throw l}}function Df(e,l,v,D){if(e?.stateDirectory!==l)return D;let M=Hc(v);return M?.stateDirectory===v?{saved:M,configPath:Wt(v,"worker.json")}:D}function Mc(e){try{return ka(e).isSymbolicLink()&&Ef(e)==="reason"}catch{return!1}}function Mf(e){try{let l=JSON.parse(m(Wt(e,li)));return typeof l.version==="string"?l.version:null}catch{return null}}function Hc(e){try{let l=Wt(e,"worker.json");return u(l)?x.parse(JSON.parse(m(l))):null}catch{return null}}function Dn(e){try{return ka(e)}catch{return null}}function Tf(e){if(e instanceof di)return e.code;if(e instanceof Error&&/^worker_[a-z_]+$/.test(e.message))return e.message;if(e instanceof a)return e.code;return e instanceof Error&&"code"in e&&typeof e.code==="string"?e.code:"unexpected"}import{readFileSync as Lf}from"fs";function nr(e){try{let l=JSON.parse(Lf(`${e}.keep-awake.json`,"utf8"));return l!==null&&typeof l==="object"&&"version"in l&&l.version===1&&"enabled"in l&&l.enabled===!0?"battery_and_ac":void 0}catch(l){return l.code==="ENOENT"?"battery_and_ac":void 0}}function $c(e,l){y(`${e}.keep-awake.json`,{version:1,enabled:l})}import{createHash as Aw}from"crypto";import{readdirSync as xw,realpathSync as Ts,statSync as Iw}from"fs";import{hostname as Ow}from"os";import{join as En,resolve as Dw}from"path";var ui="cloud",Wf=/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$/;function yo(e){return Wf.test(e)&&!on.test(e)}var Nf={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 \u203A API keys) 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_api_unreachable:"This computer could not reach Reason. Check its internet connection, and any VPN, proxy or firewall that lets the Reason app through but not the reason command, then try again.",worker_api_certificate_untrusted:"This computer did not trust Reason's certificate. A proxy, VPN or security software inspecting HTTPS, or a wrong clock, usually causes this: let Reason through it, then try again.",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 Mn(e){return Nf[e]}import{randomUUID as Hf}from"crypto";import{chmodSync as $f,lstatSync as fi,mkdtempSync as Bf,realpathSync as qc,rmdirSync as Uf,rmSync as Ff,unlinkSync as jf}from"fs";import{createConnection as qf,createServer as zf}from"net";import{basename as Bc,dirname as Uc,join as pn}from"path";var Kf=c(["status","drain","resume","stop","reload_roots"]),Vf=h({version:i(1),instanceId:t(),deviceId:t(),phase:c(["starting","running","reconnecting","stopping"]),drained:_(),activeClaims:o().int().nonnegative(),activeSessions:o().int().nonnegative().optional(),executionEligible:_(),supportedOperations:d(c(Nr)).max(Nr.length).optional(),capabilityReadiness:ul(c(Nr),_()).optional(),lastHeartbeat:t().nullable(),expiresAt:t()}),Jf=h({nonce:t(),action:Kf}),Gf=n({nonce:V()}),zc=h({version:i(1),nonce:V(),socketPath:t().max(100)});function Kc(e){return pn(f(e).lock,"control.json")}function mi(e){return b(f(e).lock),Gf.parse(JSON.parse(m(pn(f(e).lock,"owner.json"))))}function jc(e){if(!u(e))return!1;let l=fi(e);if(!l.isSocket()||l.uid!==process.getuid?.()||(l.mode&63)!==0)throw Error("worker_control_socket_not_private");return!0}function Vc(e,l){let v=Kc(e);if(!u(v)){let L=f(e).socket;if(!u(L)||!fi(L).isSocket())return null;return jc(L)?L:null}let D=zc.parse(JSON.parse(m(v)));if(D.nonce!==l)throw Error("worker_instance_changed");if(process.platform==="win32"){if(!Yf.test(D.socketPath))throw Error("worker_control_endpoint_invalid");return D.socketPath}let M=Uc(D.socketPath);if(Uc(M)!==qc("/tmp")||!/^(?:reason|ara)-worker-[A-Za-z0-9]{6}$/.test(Bc(M))||Bc(D.socketPath)!=="control.sock"||Buffer.byteLength(D.socketPath)>100)throw Error("worker_control_endpoint_invalid");if(!u(M))return null;return b(M),jc(D.socketPath)?D.socketPath:null}var Yf=/^\\\\\.\\pipe\\reason-worker-[0-9a-f-]{36}$/;async function pi(e,l,v){if(mi(e).nonce!==l)throw Error("worker_instance_changed");let D=Kc(e);if(u(D))throw Error("worker_control_already_serving");let M=process.platform==="win32",L=M?null:Bf(pn(qc("/tmp"),"ara-worker-")),z=L?pn(L,"control.sock"):`\\\\.\\pipe\\reason-worker-${Hf()}`;if(L)b(L);if(Buffer.byteLength(z)>100)throw Error("worker_socket_path_too_long");let re=new Set,G=zf((X)=>{re.add(X),X.once("close",()=>re.delete(X)),X.setTimeout(2000,()=>X.destroy());let le="",be=!1;X.on("error",()=>X.destroy()),X.on("data",(ke)=>{if(be)return;if(le+=ke.toString(),Buffer.byteLength(le)>4096){X.destroy();return}if(!le.includes(`
|
|
14
|
+
`))return;be=!0;try{let Re=Jf.parse(JSON.parse(le));if(Re.nonce!==l){X.destroy();return}X.end(JSON.stringify(v(Re.action))+`
|
|
15
|
+
`)}catch{X.destroy()}})});G.maxConnections=32;let ne,fe=!1,te=async()=>{if(fe)return;fe=!0;for(let X of re)X.destroy();if(await new Promise((X)=>G.close(()=>X())),ne&&u(D)){let X=fi(D);if(X.isFile()&&X.dev===ne.dev&&X.ino===ne.ino)try{let le=zc.parse(JSON.parse(m(D)));if(le.nonce===l&&le.socketPath===z)jf(D)}catch{}}try{if(L)Uf(L)}catch{}};try{if(await new Promise((X,le)=>{G.once("error",le),G.listen(z,()=>{if(!M)$f(z,384);X()})}),mi(e).nonce!==l)throw Error("worker_instance_changed");return y(D,{version:1,nonce:l,socketPath:z}),ne=fi(D),te}catch(X){throw await te(),X}}function Gc(e,l){try{let v=JSON.parse(m(pn(f(e).lock,"owner.json"))),D=v&&typeof v==="object"?v[l]:void 0;return typeof D==="string"?D:null}catch{return null}}function ko(e){return Gc(e,"runtime_version")}function Xf(e){return Gc(e,"nonce")}function Yc(e,l){if(l)return l.message==="worker_control_timeout"?"socket_timeout":"bad_reply";try{if(!u(pn(f(e).lock,"owner.json")))return"no_lock";return Vc(e,mi(e).nonce)?"socket_refused":"no_socket"}catch{return"bad_reply"}}var Zf=21600000,Qf=h({instance:t().nullable(),since:o().int().nonnegative()});function em(e,l){let v=f(e).updateDeferral;try{if(!u(v))return null;let D=Qf.safeParse(JSON.parse(m(v)));if(D.success&&D.data.instance===l)return D.data.since;va(e)}catch{}return null}function va(e){try{Ff(f(e).updateDeferral,{force:!0})}catch{}}async function hi(e,l,v=()=>!1){let D=Xf(e),M=em(e,D);if(l!==void 0){let ne=ko(e);if(ne===null||ne===l&&M===null&&!v())return{state:"current"}}let L;try{let ne=await St(e,"status");L=ne?ne.activeSessions??ne.activeClaims:0}catch{L=null}if(L===0)return{state:"restarted"};let z=Date.now(),re=M;if(re===null){re=z;try{y(f(e).updateDeferral,{instance:D,since:re})}catch{}}let G=z-re;return{state:G<Zf?"busy":"drained",sessions:L,waitedMs:G}}async function St(e,l){let v=f(e);if(!u(pn(v.lock,"owner.json")))return null;let D=mi(e),M=Vc(e,D.nonce);if(!M)return null;return new Promise((L,z)=>{let re=qf(M),G="",ne=!1,fe=(te,X)=>{if(ne)return;if(ne=!0,re.destroy(),X)z(X);else L(te)};re.setTimeout(2000,()=>re.destroy(Error("worker_control_timeout"))),re.on("connect",()=>re.write(JSON.stringify({nonce:D.nonce,action:l})+`
|
|
16
|
+
`)),re.on("data",(te)=>{if(G+=te.toString(),Buffer.byteLength(G)>16384)re.destroy(Error("worker_control_oversize"))}),re.on("error",(te)=>{if("code"in te&&["ECONNREFUSED","ENOENT"].includes(String(te.code)))fe(null);else fe(null,te.message==="worker_control_timeout"?te:Error("worker_control_unavailable"))}),re.on("end",()=>{try{let te=Vf.parse(JSON.parse(G));if(te.instanceId!==D.nonce)throw Error("worker_instance_changed");fe(te)}catch{fe(null,Error("worker_control_invalid_response"))}}),re.once("close",()=>fe(null,Error("worker_control_unavailable")))})}import{randomUUID as Fd}from"crypto";import{homedir as jd}from"os";import{spawn as tm}from"child_process";import{createRequire as rm}from"module";var Xc=2147483648,nm=1;function om(){try{let e=rm(import.meta.url)("bun:ffi"),l=e.dlopen("kernel32.dll",{SetThreadExecutionState:{args:[e.FFIType.u32],returns:e.FFIType.u32}});return(v)=>l.symbols.SetThreadExecutionState(v)}catch{return null}}function im(e,l){if(e==="ac_only"||!l)return{status:"unsupported",release:async()=>"unsupported"};let v=l((Xc|nm)>>>0)===0?"failed":"held";return{get status(){return v},async release(){if(v==="held")l(Xc);return v="failed","released"}}}async function Zc(e,l={}){let v=l.platform??process.platform;if(v==="win32")return im(e,l.setExecutionState??om());if(v!=="darwin")return{status:"unsupported",release:async()=>"unsupported"};let D,M="failed",L=!1,z,re=Promise.resolve(),G=(X)=>{if(M===X)return;M=X,l.onStatusChange?.(X)},ne=()=>{if(L||z)return;z=setTimeout(()=>{z=void 0,re=fe()},l.retryMs??5000),z.unref()},fe=async()=>{try{let X=(l.spawn??tm)("/usr/bin/caffeinate",[e==="ac_only"?"-s":"-i","-w",String(process.pid)],{stdio:"ignore",shell:!1});if(D=X,X.once("exit",()=>{if(!L&&D===X)G("failed"),ne()}),await new Promise((le,be)=>{X.once("spawn",le),X.once("error",be)}),X.exitCode===null&&X.signalCode===null)G("held")}catch{G("failed"),ne()}};re=fe(),await re;let te;return{get status(){return M},release(){return te??=(async()=>{L=!0,clearTimeout(z),await re;let X=D;if(!X||X.exitCode!==null||X.signalCode!==null||!X.pid)return M="failed","released";let le=await new Promise((be)=>{let ke,Re=setTimeout(()=>{try{X.kill("SIGKILL")}catch{}ke=setTimeout(()=>be("failed"),1000)},1000);X.once("exit",()=>{clearTimeout(Re),clearTimeout(ke),be("released")});try{X.kill("SIGTERM")}catch{}});if(le==="released")M="failed";return le})()}}}class Tn extends Error{constructor(){super("Reason Device operation lease expired.")}}class wi{now;onExpire;deadline=0;clockFloor;clockTick=performance.now();timer;closed=!1;constructor(e,l,v){this.now=l;this.onExpire=v;this.clockFloor=l(),this.install(e)}remainingMs(){if(this.closed)return 0;return Math.max(0,this.deadline-this.clockNow())}assertCurrent(){if(this.remainingMs()>0)return;let e=new Tn;if(!this.closed)this.close(),this.onExpire(e);throw e}acknowledge(e){this.assertCurrent(),this.install(e)}close(){this.closed=!0,clearTimeout(this.timer)}install(e){let l=Date.parse(e);if(!Number.isFinite(l))throw Error("Reason returned an invalid operation lease deadline.");if(l-this.clockNow()<=0)throw new Tn;this.deadline=l,clearTimeout(this.timer),this.arm()}clockNow(){let e=performance.now();return this.clockFloor=Math.max(this.now(),this.clockFloor+Math.max(0,e-this.clockTick)),this.clockTick=e,this.clockFloor}arm(){this.timer=setTimeout(()=>{if(this.remainingMs()>0){this.arm();return}this.close(),this.onExpire(new Tn)},Math.min(this.remainingMs(),2147483647))}}import{realpathSync as dm}from"fs";import{randomUUID as um}from"crypto";import{constants as Ra}from"fs";import{open as am}from"fs/promises";import{join as sm}from"path";var cm={platform:process.platform,home:s,async openFile(e){let l=await am(e,Ra.O_RDONLY|Ra.O_NOFOLLOW|Ra.O_NONBLOCK);return{isFile:async()=>(await l.stat()).isFile(),close:()=>l.close()}}};async function Qc(e=cm){if(e.platform!=="darwin")return"unknown";try{let l=await e.openFile(sm(e.home(),"Library/Application Support/com.apple.TCC/TCC.db"));try{return await l.isFile()?"granted":"unknown"}finally{await l.close()}}catch(l){return l instanceof Error&&"code"in l&&["EACCES","EPERM"].includes(String(l.code))?"not_granted":"unknown"}}class Ea extends Error{constructor(){super("Hands generation receipt attempt timed out.")}}async function lm(e,l,v){l.throwIfAborted();let D=new AbortController,M=()=>{},L,z=new Promise((re,G)=>{M=()=>{D.abort(l.reason),G(l.reason)},l.addEventListener("abort",M,{once:!0}),L=setTimeout(()=>{let ne=new Ea;D.abort(ne),G(ne)},v)});try{return await Promise.race([e(D.signal),z])}finally{clearTimeout(L),l.removeEventListener("abort",M),D.abort()}}function el(e){let l=0,v=0;return async(D)=>{for(;;){D.throwIfAborted(),e.lease.assertCurrent();while(performance.now()<v)await e.sleep(Math.min(v-performance.now(),e.lease.remainingMs()),D),D.throwIfAborted(),e.lease.assertCurrent();try{let M=await lm(e.send,D,Math.min(8000,e.lease.remainingMs()));return D.throwIfAborted(),e.lease.assertCurrent(),M}catch(M){let L=M instanceof Ea||(M instanceof k?or(M.status):sr(M));if(L){let z=Math.max(Math.min(500*2**Math.min(l++,4),5000),e.retryAfterMs(M));v=performance.now()+z}if(D.throwIfAborted(),e.lease.assertCurrent(),!L)throw M}}}}function Fa(e,l=process.env){return!e.proxied&&l.REASON_DEVICE_SESSION!=="0"}function cl(e,l,v){let D=e?.permissionRecovery;return fr(D,v)&&D.deviceId===l.deviceId&&D.organizationId===l.orgId?{permissionRecovery:D}:{}}var fm=1000,mm=250,pm=16,hm=5000,gm=Fc(dm(process.execPath)),tl=null,rl=null;function ll(e){if(process.platform!=="darwin")return{};return rl??=Qc().then((l)=>{tl={status:l,checkedAt:e().getTime()}}).finally(()=>{rl=null}),{fullDiskAccess:{...tl??{status:"unknown",checkedAt:e().getTime()},executablePath:gm}}}var wm=8,ym=64,_m=2000,bm=2000,ja=8000,nl=3,km=250,ol=1000,il=30000,vm=0.2,Sm=30000,Rm=21600000,Em=300000,Pm=3600000,Cm=0.1,dl=new Set(["run_finished","run_cancelled","driver_handoff","driver_stopped"]);function Am(e){return Math.min(nl,Math.max(1,e??nl))}function xm(e){return typeof e.reason_code==="string"&&dl.has(e.reason_code)?e.reason_code:"cancelled"}function Ca(e){return e.reason instanceof r&&(e.reason.code==="cancelled"||dl.has(e.reason.code))?e.reason.code:"cancelled"}function al(e){return e instanceof r&&/^[A-Za-z0-9._:-]{1,160}$/.test(e.code)?e.code:"capability_failed"}function fl(e){return e.capability==="hands.connect"&&Qa(e.payload)}function xa(e,l=Math.random){let v=Math.min(Math.max(l(),0),1);return Math.max(0,Math.floor(e*(1+v*Cm)))}function Im(e,l=Math.random){let v=Math.min(il,ol*2**Math.max(0,e-1)),D=Math.min(Math.max(l(),0),1),M=v*vm*(D*2-1);return Math.min(il,Math.max(ol,Math.round(v+M)))}function za(e,l){return new Promise((v,D)=>{if(l.aborted){D(l.reason??new DOMException("Aborted","AbortError"));return}let M=()=>{clearTimeout(L),D(l.reason??new DOMException("Aborted","AbortError"))},L=setTimeout(()=>{l.removeEventListener("abort",M),v()},e);l.addEventListener("abort",M,{once:!0})})}class Ia extends Error{updateError;constructor(e){super("Managed runtime update check failed.");this.updateError=e;this.name="RuntimeUpdateCheckError"}}async function Om(e,l,v,D){let M=new AbortController,L=()=>M.abort(v.reason);if(v.aborted)L();else v.addEventListener("abort",L,{once:!0});try{return await Promise.race([e,D(l,M.signal).then(()=>({kind:"heartbeat"}))])}finally{M.abort(),v.removeEventListener("abort",L)}}function Ma(e){return e instanceof Error?e.message:String(e)}function Ta(e,l){return l.aborted||e instanceof DOMException&&e.name==="AbortError"||e instanceof Error&&e.name==="AbortError"}function _r(e){return e instanceof k&&e.status===409&&e.code==="attempt_fenced"}function La(e){return e.capability==="environment.install"}function Dm(e){if(e instanceof ki||e instanceof Tn||e instanceof Eo)return"timeout";if(!(e instanceof Error)||e instanceof k)return"transport_unknown";for(let l of[e,e.cause]){if(!(l instanceof Error)||l instanceof k||!("code"in l))continue;switch(l.code){case"ConnectionClosed":case"ECONNRESET":return"connection_closed";case"ConnectionRefused":case"ECONNREFUSED":return"connection_refused";case"ETIMEDOUT":return"timeout"}}return"transport_unknown"}function Ro(e,l,v){if(!e.state.worker&&!e.connectionDiagnostics)return;if(_r(v))return;let D=v instanceof k&&Number.isInteger(v.status)&&v.status>=100&&v.status<=599?{stage:l,category:"http",httpStatus:v.status}:{stage:l,category:Dm(v)};e.onEvent?.({type:"error",message:"worker_connection_failed",diagnostic:D})}async function Wn(e,l,v){try{return await v()}catch(D){if(!e.signal.aborted)Ro(e,l,D);throw D}}class Eo extends Error{constructor(){super("Reason Device operation completion timed out.")}}async function Ua(e,l,v,D){let M=l.capability==="inference.custom.v1"&&v.status!=="succeeded"?{status:v.status,error_code:v.status==="cancelled"?"operation_cancelled":Hr(v.error_code)?v.error_code:"custom_endpoint_unavailable"}:La(l)&&v.status!=="succeeded"?{status:v.status,error_code:v.status==="cancelled"?"operation_cancelled":v.error_code==="environment_unavailable"?"environment_unavailable":"environment_install_failed"}:v,L=new AbortController,z=D?AbortSignal.any([D,L.signal]):L.signal,re=e.sleep??za,G=e.operationCompletionTimeoutMs??ja,ne=performance.now()+G,fe,te,X=new Promise((ke,Re)=>{let Oe=()=>{let Ee=new Eo;L.abort(Ee),Re(Ee)},Me=(Ee)=>{clearTimeout(fe),fe=setTimeout(Oe,Ee)};if(te=()=>Me(Math.max(0,Math.min(ne-performance.now(),_m))),Me(G),e.signal.addEventListener("abort",te,{once:!0}),e.signal.aborted)te()}),le,be=0;try{while(!0)try{le=await Promise.race([e.client.completeOperation(e.state,l,M,z),X]);break}catch(ke){if(z.aborted||e.signal.aborted||ee(ke)||_r(ke)||!Mm(ke)||performance.now()>=ne)throw Ro(e,"completion",ke),ke;be+=1;let Re=Math.min(500*2**Math.min(be-1,4),Math.max(0,ne-performance.now()));if(Re<=0)throw Ro(e,"completion",ke),ke;try{await re(Re,z)}catch{throw Ro(e,"completion",ke),ke}}}finally{clearTimeout(fe),e.signal.removeEventListener("abort",te),L.abort()}e.onEvent?.({type:"completed",operationId:l.operation_id,status:le.status})}function Mm(e){if(ee(e))return!1;if(_r(e))return!1;if(e instanceof k)return e.status===408||e.status===429||e.status>=500&&e.status<=504;if(e instanceof Error){if(e.name==="AbortError"||e instanceof Eo)return!1;return!0}return!1}class ki extends Error{constructor(){super("Reason Device operation heartbeat timed out.");this.name="OperationHeartbeatAttemptTimeoutError"}}function _i(e){if(e instanceof ki)return!0;return e instanceof k?or(e.status):sr(e)}function Tm(e,l,v,D){let M=Math.min(v,l*2**Math.min(e-1,10));return e<=1?M:Math.round(M/2+M/2*D())}function bi(e,l){if(!(e instanceof k)||!e.retryAfter)return 0;let v=e.retryAfter.trim(),D=/^\d+(?:\.\d+)?$/.test(v)?Number(v)*1000:Date.parse(v)-l;return Number.isNaN(D)?0:Math.max(0,D)}async function Lm(e,l,v,D,M){let L=new AbortController,z,re=()=>{return},G=new Promise((fe,te)=>{let X=()=>{let le=D.reason??new DOMException("Aborted","AbortError");L.abort(le),te(le)};if(re=()=>D.removeEventListener("abort",X),D.aborted)X();else D.addEventListener("abort",X,{once:!0})}),ne=new Promise((fe,te)=>{z=setTimeout(()=>{let X=new ki;L.abort(X),te(X)},M)});try{return await Promise.race([e.client.operationHeartbeat(e.state,l,{transientRetryOwner:"caller",...v.controlAckSeq===void 0?{}:{controlAckSeq:v.controlAckSeq},clientRetryCount:v.clientRetryCount,...v.waitMs===void 0?{}:{waitMs:v.waitMs},signal:L.signal}),G,ne])}finally{if(z!==void 0)clearTimeout(z);re()}}async function sl(e,l,v,D,M,L){let z=Am(e.operationHeartbeatMaxAttempts),re=e.operationHeartbeatAttemptTimeoutMs??ja,G=e.operationHeartbeatRetryDelayMs??km,ne=L.remainingMs(),fe=Math.min(ne,z*re+G*z*(z-1)/2);for(let te=0;te<z;te+=1)try{D.throwIfAborted(),L.assertCurrent();let X=Math.min(re,L.remainingMs()),le=await Lm(e,l,{...v,waitMs:v.waitMs===void 0?void 0:Math.min(v.waitMs,Math.max(0,Math.floor(X-1000))),clientRetryCount:te},D,X);return D.throwIfAborted(),L.acknowledge(le.lease_until),le}catch(X){if(D.aborted||te+1>=z||_r(X)||ee(X)||!_i(X)){if(!D.aborted)Ro(e,"operation_heartbeat",X);throw X}let le=ne-L.remainingMs(),be=bi(X,(e.now?.()??new Date).getTime()),ke=Math.max(G*(te+1),fe*(te+1)/z-le,be);await M(Math.min(L.remainingMs(),ke),D),L.assertCurrent()}throw Error("Reason Device operation heartbeat retries were exhausted.")}async function Wm(e,l,v,D,M){let L=fl(l),z=new AbortController,re=new AbortController,G=()=>{z.abort(e.signal.reason),re.abort(e.signal.reason)};if(e.signal.aborted)G();else e.signal.addEventListener("abort",G,{once:!0});let ne=null,fe,te,X=-1,le=0,be=Promise.resolve(),ke=[],Re=new AbortController,Oe=!1,Me,Ee=null,Te=!1,We,$e,Ue={},Ne=(Ve)=>{Oe=!0,Re.abort(Ve),z.abort(Ve),re.abort(Ve)},Ce=(Ve)=>{if(Me)return Me;let Je=structuredClone(Ve),it=le;return Me=(async()=>{let Ye=new AbortController,Be=Ye.signal;Be.throwIfAborted();let Ke,Fe=()=>{},nt=new Promise((Ze,He)=>{if(Fe=()=>He(Be.reason),Be.addEventListener("abort",Fe,{once:!0}),Ke=setTimeout(()=>Ye.abort(Error("Hands stop receipt delivery timed out.")),4000),Be.aborted)Fe()});try{for(let Ze=0;Ze<3;Ze+=1){Be.throwIfAborted();try{let He=await Promise.race([Wn(e,"event",()=>e.client.operationEvents(e.state,l,{eventSeqStart:it,events:[Je],signal:Be,transientRetryOwner:"caller"})),nt]);if(Be.throwIfAborted(),He.next_event_seq!==it+1)throw Error("Hands stop receipt acknowledgement sequence mismatch.");le=He.next_event_seq;return}catch(He){if(ee(He))M(He);let at=He instanceof k?or(He.status):sr(He);if(Be.aborted||!at||Ze===2)throw He;let lt=Math.max(500*2**Ze,bi(He,(e.now?.()??new Date).getTime()));await Promise.race([v(lt,Be),nt])}}}finally{clearTimeout(Ke),Be.removeEventListener("abort",Fe),Ye.abort()}})(),Me},Le=(Ve,Je,it)=>{let Ye=(Ke)=>Wn(e,"event",()=>e.client.operationEvents(e.state,l,{eventSeqStart:Je,events:Ve,signal:Ke,...it?{transientRetryOwner:"caller"}:{}})).catch((Fe)=>{if(l.capability==="hands.connect"&&_r(Fe))Ne(Fe);if(it&&(ee(Fe)||_r(Fe))){if(ee(Fe))M(Fe);z.abort(Fe),re.abort(Fe),Re.abort(Fe)}throw Fe});if(!it)return async(Ke)=>{if(l.capability!=="hands.connect"&&l.capability!=="inference.custom.v1"){le=(await Ye(Ke)).next_event_seq;return}Ke.throwIfAborted();let Fe=()=>{},nt=new Promise((Ze,He)=>{Fe=()=>He(Ke.reason),Ke.addEventListener("abort",Fe,{once:!0})});try{let Ze=await Promise.race([Ye(Ke),nt]);Ke.throwIfAborted(),le=Ze.next_event_seq}finally{Ke.removeEventListener("abort",Fe)}};let Be=el({send:Ye,lease:$e,sleep:v,retryAfterMs:(Ke)=>bi(Ke,(e.now?.()??new Date).getTime())});return async(Ke)=>{let Fe=await Be(Ke);if(Fe.next_event_seq!==Je+Ve.length)throw Error("Hands generation receipt acknowledgement sequence mismatch.");le=Fe.next_event_seq}},Ge=async(Ve,Je)=>{let it=Ve??await sl(e,l,{controlAckSeq:X,waitMs:Je},re.signal,v,$e),Ye=null,Be=!1;for(let Ke=0;Ke<10;Ke+=1){let Fe=X+1;for(let nt of it.controls){if(nt.seq!==Fe)throw Error("Reason returned an out-of-order Device operation control.");if(nt.kind==="cancel"||nt.kind==="operation.cancel")Ye??=xm(nt.payload),z.abort(new r(Ye,"Reason closed the Device operation."));if(nt.kind!=="cancel"&&nt.kind!=="operation.cancel"){if(["browser.recording.v1","browser.pr-proof.v1","process.run.v1","process.full.v1"].includes(l.capability)){let Ze,He,at=new Promise((lt,kt)=>{Ze=lt,He=kt});at.catch(()=>{}),Ue.current={promise:at,resolve:Ze,reject:He}}try{Be||=!await e.onControl?.(l,nt)}catch(Ze){if(Ze instanceof r)fe??=al(Ze);throw Ue.current?.reject(Ze),Ze}}X=nt.seq,Fe+=1}if(it.controls.length===0){if(it.next_control_seq!==X+1)throw Error("Reason returned a Device operation control sequence gap.");return{cancellationReason:Ye,unsupported:Be}}try{it=await sl(e,l,{controlAckSeq:X},re.signal,v,$e),Ue.current?.resolve()}catch(nt){if(Ue.current?.reject(nt),!Ye||_r(nt)||ee(nt))throw nt;return{cancellationReason:Ye,unsupported:Be}}}throw Error("Reason returned too many Device operation control batches.")};try{let Ve;try{if(!L)$e=new wi(l.lease_until,()=>(e.now?.()??new Date).getTime(),(Je)=>{if(!z.signal.aborted)ne=Je;z.abort(Je),re.abort(Je)});Ve=L||l.capability==="hands.connect"||l.capability==="display.stream.v1"||l.capability==="simulator.stream.v1"||Qr.has(l.capability)||l.capability==="pty.start"?{cancellationReason:null,unsupported:!1}:await Ge()}catch(Je){if(!La(l)||_r(Je)||ee(Je))throw Je;await Ua(e,l,{status:e.signal.aborted?"cancelled":"failed"});return}if(Ve.cancellationReason||e.signal.aborted){let Je=Ve.cancellationReason??Ca(e.signal);z.abort(new r(Je,"Reason closed the Device operation.")),te={status:"cancelled",error_code:Je}}else if(Ve.unsupported)z.abort(),te={status:"failed",error_code:"control_unsupported"};else{let Je=L?Promise.resolve():(async()=>{let Ye=e.operationHeartbeatIntervalMs??e.heartbeatIntervalMs??(["hands.connect","browser.recording.v1","browser.pr-proof.v1","process.run.v1","process.full.v1","preview.serve.v1"].includes(l.capability)?bm:15000),Be=Math.min(Ye,Math.max(0,(e.operationHeartbeatAttemptTimeoutMs??ja)-1000)),Ke=l.capability==="hands.connect"||l.capability==="pty.start"||l.capability==="display.stream.v1"||l.capability==="simulator.stream.v1"||l.capability==="browser.recording.v1"||l.capability==="browser.pr-proof.v1"||l.capability==="process.run.v1"||l.capability==="process.full.v1"||l.capability==="preview.serve.v1"||l.capability==="inference.custom.v1";while(!re.signal.aborted)try{if(!Ke){if(await v(Ye,re.signal),re.signal.aborted)return}let Fe=await Ge(void 0,Ke?Be:void 0);if(Fe.cancellationReason||Fe.unsupported){if(Fe.unsupported)ne=Error("Reason requested an unsupported Device operation control.");z.abort(Fe.cancellationReason?new r(Fe.cancellationReason,"Reason closed the Device operation."):void 0);return}}catch(Fe){if(ee(Fe))M(Fe);if(_r(Fe))ne=Fe,Ne(Fe);if(!re.signal.aborted)ne=Fe,z.abort();return}})();try{if($e?.assertCurrent(),z.signal.throwIfAborted(),D.authorized=()=>!z.signal.aborted&&(L||($e?.remainingMs()??0)>0),te=await e.onClaim(l,z.signal,async(Ye)=>{if(La(l))return;if(Ye.kind==="permission.denied"){if(!D.authorized())return;let at=Ye.data,lt=(e.now??(()=>new Date))().getTime(),kt=e.statusPath??mr(),jt=(e.loadStatus??rt)(kt),Kt={id:um(),kind:"permission_denied",operation:at?.operation,provenance:at?.provenance,occurredAt:new Date(lt).toISOString(),expiresAt:new Date(lt+600000).toISOString(),sessionId:l.run_id,deviceId:e.state.deviceId,organizationId:e.state.orgId};if(jt&&fr(Kt,lt)){let pr=jt.permissionRecovery;if(!pr||!fr(pr,lt)||pr.sessionId!==Kt.sessionId||pr.operation!==Kt.operation||pr.provenance!==Kt.provenance)(e.saveStatus??Ei)({...jt,permissionRecovery:Kt},kt)}return}let Be=l.capability==="hands.connect"&&Ye.capability==="hands.connect"&&Ye.kind==="hands.stopped",Ke=l.capability==="hands.connect"&&Ye.kind==="hands.reconnected",Fe=Ke||l.capability==="inference.custom.v1"?AbortSignal.any([z.signal,Re.signal,...Ye.deliverySignal?[Ye.deliverySignal]:[]]):l.capability==="hands.connect"?AbortSignal.any([e.signal,Re.signal]):e.signal,nt={kind:Ye.kind,payload:{sequence:Ye.sequence,capability:Ye.capability,...Ye.data?{data:Ke?structuredClone(Ye.data):Ye.data}:{}}};if(l.capability==="hands.connect"&&Ye.capability==="hands.connect"&&(Ye.kind==="started"||Ye.kind==="hands.started")||(Qr.has(l.capability)||l.capability==="pty.start")&&Ye.kind==="started")return new Promise((at,lt)=>{ke.push({wireEvent:nt,settle:(kt)=>kt===void 0?at():lt(kt)})});let Ze=ke;ke=[];let He=be.then(async()=>{if((Oe||e.signal.aborted)&&l.capability==="hands.connect"&&!L){if(Be)await Ce(nt);return}if(Ee!==null){if(Ye.kind!=="hands.stopped"||!Te||!We)throw Ee;let lt=new AbortController,kt=AbortSignal.any([e.signal,Re.signal,lt.signal]),jt=setTimeout(()=>lt.abort(Error("Hands stop receipt reconciliation timed out.")),4000);Te=!1;try{await We(kt),We=void 0,await Le([nt],le,!0)(kt),Ee=null}catch(Kt){throw Ee=Kt??Error("Hands stop receipt could not be confirmed."),Kt}finally{clearTimeout(jt),lt.abort()}return}if(Ke&&!$e){let lt=Math.min(Date.parse(l.lease_until),Date.parse(String(l.payload.expires_at)));$e=new wi(new Date(lt).toISOString(),()=>(e.now?.()??new Date).getTime(),(kt)=>{z.abort(kt),re.abort(kt)})}let at=le;if(Ke)We=Le([...Ze.map((lt)=>lt.wireEvent),nt],at,!0),await We(Fe),We=void 0;else await Le([...Ze.map((lt)=>lt.wireEvent),nt],at,!1)(Fe)});He.then(()=>{for(let at of Ze)at.settle()},(at)=>{for(let lt of Ze)lt.settle(at??Error("Hands event delivery failed."))}),be=He.catch((at)=>{if(ee(at))M(at);if(Ke){if(Ee===null)Te=Fe.aborted&&!Re.signal.aborted,Ee=at??Error("Hands generation receipt delivery failed.");if(!Fe.aborted)z.abort(at),re.abort(at)}}),await He}),["browser.recording.v1","browser.pr-proof.v1","process.run.v1","process.full.v1"].includes(l.capability))await Ue.current?.promise}catch(Ye){te=z.signal.aborted?{status:"cancelled",error_code:Ca(z.signal)}:{status:"failed",error_code:al(Ye)}}finally{D.authorized=()=>!1,Re.abort();for(let Ye of ke.splice(0))Ye.settle();re.abort(),await Je}let it=Qn(l.capability)?Ba(te.result,l.operation_id):null;if(ne){if(ee(ne))throw ne;te={status:"failed",error_code:fe??"control_or_heartbeat_failed",...it?{result:it}:{}}}else if(z.signal.aborted&&te.status==="succeeded")te={status:"cancelled",error_code:Ca(z.signal),...it?{result:it}:{}}}if($e?.close(),ee(e.signal.reason))throw e.signal.reason;await Ua(e,l,te)}finally{$e?.close(),Re.abort(),re.abort(),e.signal.removeEventListener("abort",G)}}async function Ka(e){let l=e.now??(()=>new Date),v=e.sleep??za,D=e.saveStatus??Ei,M=e.loadStatus??rt,L=e.statusPath??mr(),z=l().toISOString(),re=M(L)?.lastUsedAt,G=!1,ne=()=>({version:1,pid:process.pid,startedAt:z,...ll(l),...cl(M(L),e.state,l().getTime()),deviceId:e.state.deviceId,...e.idleSleepPolicy||e.readIdleSleepPolicy?{idleSleepHold:G}:{},...re?{lastUsedAt:re}:{}}),fe=0,te,X=!1,le,be,ke,Re=Promise.resolve();D({...ne(),state:"starting"},L),e.onEvent?.({type:"started",deviceId:e.state.deviceId}),$a();try{let Oe=async()=>{let Me=e.readIdleSleepPolicy?e.readIdleSleepPolicy():e.idleSleepPolicy;if(e.signal.aborted||Me===be)return;if(le&&be){let We=await le.release();if(e.onEvent?.({type:"idle_sleep",status:We,policy:be}),We==="failed")return;le=void 0,be=void 0,G=!1;let $e=M(L);if($e)D({...$e,idleSleepHold:G},L)}if(!Me)return;be=Me;let Ee=!0;le=await(e.acquireAwakeHold??Zc)(Me,{onStatusChange:(We)=>{if(Ee)return;G=We==="held";let $e=M(L);if($e)D({...$e,idleSleepHold:G},L);e.onEvent?.({type:"idle_sleep",status:We,policy:Me})}}),Ee=!1,G=le.status==="held";let Te=M(L);if(Te)D({...Te,idleSleepHold:G},L);e.onEvent?.({type:"idle_sleep",status:le.status,policy:Me})};if(await Oe(),e.readIdleSleepPolicy)ke=setInterval(()=>{Re=Re.then(Oe).catch(()=>{e.onEvent?.({type:"idle_sleep",status:"failed",policy:be??"battery_and_ac"})})},e.idleSleepPollMs??1000),ke.unref();while(!e.signal.aborted){let Me=!1;try{await Nm({...e,saveStatus:(Ee,Te)=>{if(Ee.state==="starting"||Ee.state==="error"||Ee.state==="stopped")return;re=Ee.lastUsedAt??re,D({...Ee,startedAt:z,...e.idleSleepPolicy||e.readIdleSleepPolicy?{idleSleepHold:G}:{}},Te)},onEvent:(Ee)=>{if(Ee.type==="error"&&Ee.diagnostic){e.onEvent?.(Ee);return}if(Ee.type==="started"||Ee.type==="error"||Ee.type==="stopped")return;if(Ee.type==="heartbeat"&&fe>0&&!Me){Me=!0;let Te=fe;fe=0,te=void 0,e.onEvent?.({type:"reconnected",attempts:Te})}e.onEvent?.(Ee)}});return}catch(Ee){if(Ta(Ee,e.signal))return;if(ee(Ee)){X=!0;let We=e.state.worker?"worker_connection_failed":Ma(Ee);throw D({...ne(),state:"error",error:We},L),e.onEvent?.({type:"error",message:We}),Ee}fe+=1;let Te=Im(fe,e.reconnectRandom);te??=l().toISOString(),D({...ne(),state:"starting",reconnectingSince:te},L),e.onEvent?.({type:"reconnecting",message:e.state.worker?"worker_connection_failed":Ma(Ee),attempt:fe,retryInMs:Te}),await v(Te,e.signal)}}}catch(Oe){if(!Ta(Oe,e.signal))throw Oe}finally{if(e.client.close?.(),clearInterval(ke),await Re,le&&be){let Oe=await le.release();G=Oe==="failed"&&le.status==="held",e.onEvent?.({type:"idle_sleep",status:Oe,policy:be})}if(!X)D({...ne(),state:"stopped"},L);else{let Oe=M(L);if(Oe)D({...Oe,idleSleepHold:G},L)}e.onEvent?.({type:"stopped"})}}async function Nm(e){let l=e.now??(()=>new Date),v=e.sleep??za,D=e.statusPath??mr(),M=e.saveStatus??Ei,L=e.loadStatus??rt,z=l().toISOString(),re=L(D)?.lastUsedAt,G=e.runtimeUpdate,ne=new AbortController,fe=()=>ne.abort(e.signal.reason);if(e.signal.aborted)fe();else e.signal.addEventListener("abort",fe,{once:!0});let te=G?.random??Math.random,X=e.maxConcurrentClaims,le=typeof X==="number"&&Number.isSafeInteger(X)&&X>0?Math.min(ym,X):wm,be=0,ke=!1,Re=null,Oe=(tt)=>{Re??=tt,ne.abort(tt)},Me=new Map,Ee=()=>{let tt=new Set,yt=0;for(let{claim:Wr}of Me.values()){let Xe=Wr.capability==="hands.connect"?Wr.payload[he]:void 0;if(typeof Xe==="string"){if(tt.has(Xe))continue;tt.add(Xe)}yt+=1}return yt},Te=null,We=()=>[...Me.values()].some((tt)=>tt.authorized()),$e=()=>[...Me.values()].every((tt)=>tt.claim.capability==="preview.serve.v1"),Ue=G?new Date(z).getTime()+xa(G.initialDelayMs??Sm,te):Number.POSITIVE_INFINITY,Ne=null,Ce=!1,Le=e.firstHeartbeat,Ge=Le?.account_root_metadata_supported===!0,Ve=Le?.workspace_root_metadata_supported===!0,Je=Le?.account_root_path_supported===!0,it=Le?.home_contained_roots_supported===!0,Ye=Le?.root_paths_supported===!0,Be=Le?.startup_supported===!0,Ke=Le!==void 0,Fe=Le?{challenge:Le.challenge,expires_at:Le.expires_at}:void 0,nt,Ze=!e.startup,He=()=>({version:1,pid:process.pid,startedAt:z,...ll(l),...cl(L(D),e.state,l().getTime()),...re?{lastUsedAt:re}:{},deviceId:e.state.deviceId,...Ne?{organizationId:Ne.organization_id,organizationName:Ne.organization_name,organizationSlug:Ne.organization_slug}:{}}),at=()=>{let tt=(e.advertised??e.claimable)?.()!==!1;if(!Ze)nt??=e.startup?.();return{...e.deviceMetadata?.device_model!=null?{device_model:e.deviceMetadata.device_model}:{},...e.deviceMetadata?.device_chip!=null?{device_chip:e.deviceMetadata.device_chip}:{},...e.deviceMetadata?.device_location!=null?{device_location:e.deviceMetadata.device_location}:{},reason_runtime_version:e.runtimeVersion,bridge_version:e.bridgeVersion,protocol_version:e.protocolVersion,execution_eligible:tt,...Be&&!Ze&&nt?{startup:nt}:{},capabilities:tt?Da(e.capabilities,{accountRootMetadataSupported:Ge,workspaceRootMetadataSupported:Ve,accountRootPathSupported:Je,homeContainedRootsSupported:it,rootPathsSupported:Ye}):{supported_operations:[]}}},lt=()=>{if(Ce||!e.client.identity)return;Ce=!0,e.client.identity(e.state,e.signal).then((tt)=>{if(tt.organization_id!==e.state.orgId)return;Ne=tt;let yt=L(D);if(!yt)return;M({...yt,organizationId:tt.organization_id,organizationName:tt.organization_name,organizationSlug:tt.organization_slug},D)}).catch(()=>{return})},kt=(tt)=>{Ge=tt.account_root_metadata_supported===!0,Ve=tt.workspace_root_metadata_supported===!0,Je=tt.account_root_path_supported===!0,it=tt.home_contained_roots_supported===!0,Ye=tt.root_paths_supported===!0,Be=tt.startup_supported===!0,Ke=!1},jt=(tt)=>{if(tt.startup)Ze=!0},Kt=(tt,yt)=>{if(!(yt instanceof k&&yt.status===400&&yt.code==="invalid_heartbeat")||!tt.startup&&!Ke)throw yt;if(Ze=!0,Ke)Ge=Ve=Je=!1,it=Ye=Be=Ke=!1;return null},pr=(tt)=>{kt(tt),M({...He(),state:"connected",lastHeartbeatAt:l().toISOString()},D),lt(),e.onEvent?.({type:"heartbeat",serverTime:tt.server_time,drain:tt.drain,...tt.latest_cli_versions?{latestCliVersions:tt.latest_cli_versions}:{},...tt.hands_prespawn?{handsPrespawn:!0}:{}})},Xr=!1,In=!1;e.registerHeartbeatNow?.(()=>{if(e.signal.aborted)return;if(Xr)In=!0;let tt=at();Wn(e,"heartbeat",()=>e.client.heartbeat(e.state,tt,ne.signal).catch((yt)=>Kt(tt,yt))).then((yt)=>{if(!yt)return;jt(tt),kt(yt),pr(yt)},()=>{return})});let Lr=(tt)=>v(tt,e.signal);M({...He(),state:"starting"},D),e.onEvent?.({type:"started",deviceId:e.state.deviceId});let xr=!1,sn=e.maxConsecutiveHeartbeatFailures??3,Ir=0,er=0,On=0,zo=0,cn=null;try{while(!e.signal.aborted){if(Re)throw Re;if(ke&&$e())break;let tt,yt=er>0&&er<pm&&performance.now()-zo<hm&&cn!==null;if(!yt)er=0;e:{if(yt&&cn){tt=cn;break e}let vt=at(),rr=Fe;Fe=void 0,Xr=!0,In=!1;try{let At=await Wn(e,"heartbeat",()=>e.client.heartbeat(e.state,vt,ne.signal,...rr?[rr]:[]).catch((Sr)=>Kt(vt,Sr)));if(Xr=!1,!At)continue;tt=At,jt(vt),zo=performance.now(),Ir=0}catch(At){if(Xr=!1,e.signal.aborted)break;if(!_i(At))throw At;if(Ir+=1,Ir>=sn&&!We())throw At;await v(Math.min(e.heartbeatRetryDelayMs??2000,e.heartbeatIntervalMs??15000),e.signal);continue}if(kt(tt),Object.keys(at().capabilities).length>Object.keys(vt.capabilities).length)continue;if(In)continue;if(pr(tt),Re)throw Re;if(e.signal.aborted)break;if(G&&["available","required"].includes(tt.update_policy??""))Ue=Math.min(Ue,l().getTime());if(G&&l().getTime()>=Ue)try{let At=new AbortController,Sr=()=>At.abort(e.signal.reason);if(e.signal.aborted)Sr();else e.signal.addEventListener("abort",Sr,{once:!0});let $r;try{$r=G.check(At.signal)}catch(Ft){$r=Promise.reject(Ft)}let ln=$r.then((Ft)=>({kind:"completed",result:Ft}),(Ft)=>({kind:"failed",error:Ft})),Br;try{while(!0){let Ft=await Om(ln,e.heartbeatIntervalMs??15000,e.signal,v);if(e.signal.aborted)throw e.signal.reason??new DOMException("Aborted","AbortError");if(Ft.kind==="failed")throw new Ia(Ft.error);if(Ft.kind==="completed"){Br=Ft.result;break}try{let Gt=at(),oo=await Wn(e,"heartbeat",()=>e.client.heartbeat(e.state,Gt,ne.signal).catch((Ko)=>Kt(Gt,Ko)));if(!oo)continue;tt=oo,jt(Gt),pr(tt),Ir=0}catch(Gt){if(e.signal.aborted)throw Gt;if(!_i(Gt))throw Gt;if(Ir+=1,Ir>=sn&&!We())throw Gt}}}catch(Ft){At.abort(Ft);let Gt=await ln;if(Gt.kind==="completed"&&Gt.result==="activated")Br="activated";else throw Ft}finally{e.signal.removeEventListener("abort",Sr)}if(e.signal.aborted)throw e.signal.reason??new DOMException("Aborted","AbortError");if(be=0,Br==="activated"){if(e.signal.aborted)throw e.signal.reason??new DOMException("Aborted","AbortError");e.onEvent?.({type:"runtime_updated"}),ke=!0}Ue=l().getTime()+xa(G.intervalMs??Rm,te)}catch(At){if(!(At instanceof Ia))throw At;be+=1;let Sr=G.retryBaseMs??Em,$r=G.retryMaxMs??Pm,ln=Math.min($r,Sr*2**Math.min(be-1,8));Ue=l().getTime()+xa(ln,te)}}if(cn=tt,e.signal.aborted)break;if(ke&&$e())break;if(ke){await Lr(e.heartbeatIntervalMs??15000);continue}let Wr=e.client.sessionCadence?.(e.state)??null,Xe=Wr?.presenceIntervalMs??e.heartbeatIntervalMs??15000;if(tt.drain||e.claimable?.()===!1){er=0,await Lr(Xe);continue}if(Ee()>=le){er=0;let vt=new AbortController;Te=vt;try{await v(Xe,AbortSignal.any([e.signal,vt.signal]))}catch(rr){if(!vt.signal.aborted)throw rr}finally{if(Te===vt)Te=null}continue}let st,Ct=yt?0:Wr?.claimWaitMs??Math.min(e.heartbeatIntervalMs??15000,30000),Vt=performance.now();try{st=await Wn(e,"claim",()=>e.client.claimOperation(e.state,{waitMs:Ct,signal:ne.signal}))}catch(vt){if(er=0,e.signal.aborted||!_i(vt)||!We())throw vt;On+=1;let rr=Math.min(e.heartbeatRetryDelayMs??2000,e.heartbeatIntervalMs??15000);await Lr(Math.max(Tm(On,rr,Math.max(rr,Ct),te),bi(vt,(e.now?.()??new Date).getTime())));continue}if(On=0,Re)throw Re;if(!st){if(yt){er=0;continue}if(performance.now()-Vt<Ct-mm)await Lr(fm);continue}if(e.claimable?.()===!1){er=0,await Ua(e,st,{status:"cancelled",error_code:"execution_authority_withdrawn"},e.signal);continue}re=l().toISOString(),M({...He(),state:"connected",lastHeartbeatAt:l().toISOString()},D),e.onEvent?.({type:"claim",operationId:st.operation_id,runId:st.run_id,attemptId:st.attempt_id,capability:st.capability});let Tt,gr={authorized:()=>!1,claim:st};if(Tt=Wm({...e,signal:ne.signal},st,v,gr,Oe).catch((vt)=>{if(ee(vt))Oe(vt);else if(!_r(vt)&&[...Me].some(([rr,At])=>rr!==Tt&&At.authorized())){if(vt instanceof Eo)e.onEvent?.({type:"error",message:"operation_completion_timeout",diagnostic:{stage:"completion",category:"timeout"}});return}if(!_r(vt)&&Re===null)Re=vt}).finally(()=>{Me.delete(Tt),Te?.abort(),e.onEvent?.({type:"claims_changed",activeClaims:Me.size})}),Me.set(Tt,gr),e.onEvent?.({type:"claims_changed",activeClaims:Me.size}),er+=1,fl(st)){if(er=0,await Tt,Re)throw Re}}}catch(tt){if(!Ta(tt,e.signal)){ne.abort(tt),xr=!0;let yt=e.state.worker?"worker_connection_failed":Ma(tt);throw M({...He(),state:"error",error:yt},D),e.onEvent?.({type:"error",message:yt}),tt}}finally{if(ne.abort(),await Promise.allSettled(Me.keys()),e.signal.removeEventListener("abort",fe),!xr)M({...He(),state:"stopped"},D);e.onEvent?.({type:"stopped"})}}import{execFile as dp}from"child_process";import{constants as Al,existsSync as up,mkdtempSync as Ya,rmSync as Dl}from"fs";import{access as xl,open as fp,readFile as Il,readlink as mp,readdir as Ol,unlink as pp,rmdir as hp}from"fs/promises";import{tmpdir as gp}from"os";import{basename as Xa,join as Pi}from"path";import{randomUUID as hn}from"crypto";import{chmodSync as Hm,closeSync as $m,fsyncSync as Bm,openSync as Um,readFileSync as Fm,rmdirSync as ml,unlinkSync as pl,writeFileSync as jm}from"fs";import{createConnection as qm,createServer as zm}from"net";import{dirname as Km,join as Vm}from"path";var Jm=5000;async function hl(e,l,v){if(v.aborted)return!1;let D={generation:1,fenceId:hn()},M={runId:hn(),deviceId:hn(),rootId:hn(),apiOrigin:e.apiOrigin,binding:{kind:"workspace_source",target_revision:1,root_grant_revision:1},expiresAtMs:Date.now()+30000,identity:()=>D},L=ai(l,M),z={version:1,snapshot_id:hn(),revision:1,run_id:M.runId,device_id:M.deviceId,root_id:M.rootId,binding:{...M.binding,target_generation:D.generation,target_fence_id:D.fenceId},expires_at:new Date(M.expiresAtMs).toISOString(),variables:{WORKER_PROBE:"synthetic-readiness"},git:null};try{return L.install(z).installed&&L.current().snapshot_id===z.snapshot_id&&!v.aborted}catch{return!1}finally{try{pl(L.path)}catch{}}}async function bl(e,l,v=$t){if(l.aborted)return!1;let D,M,L=new Set,z=hn(),re=zm((X)=>{L.add(X),X.once("close",()=>L.delete(X)),X.on("error",()=>X.destroy()),X.end(z)});re.maxConnections=1;let G,ne,fe=new Promise((X)=>{ne=()=>X(!1)}),te=setTimeout(ne,Jm);l.addEventListener("abort",ne,{once:!0});try{D=v({runtimeDirectory:p(e),root:e.workspaceRoot,runId:`readiness-${hn()}`}),M=Vm(D.journalDirectory,"readiness.json");let X=Um(M,"wx",384);try{jm(X,z),Bm(X)}finally{$m(X)}if(Fm(M,"utf8")!==z||l.aborted)return!1;let le=new Promise((be)=>{re.once("error",()=>be(!1)),re.listen(D.socketPath,()=>{try{if(process.platform!=="win32")Hm(D.socketPath,384)}catch{be(!1);return}G=qm(D.socketPath);let ke="";G.setEncoding("utf8"),G.once("error",()=>be(!1)),G.on("data",(Re)=>{if(ke+=Re,ke.length>z.length)G?.destroy(),be(!1)}),G.once("end",()=>be(ke===z)),G.once("close",()=>be(!1))})});return await Promise.race([le,fe])&&!l.aborted}catch{return!1}finally{clearTimeout(te),l.removeEventListener("abort",ne),G?.destroy();for(let X of L)X.destroy();if(await new Promise((X)=>re.close(()=>X())),D?.disposeSocket(),M)try{pl(M)}catch{}if(D){try{ml(D.journalDirectory)}catch{}try{ml(Km(D.journalDirectory))}catch{}}}}import{execFileSync as vi}from"child_process";import{randomUUID as dr}from"crypto";import{chmodSync as kl,chownSync as El,closeSync as Va,constants as Mr,existsSync as Gm,fstatSync as Pl,mkdirSync as vl,mkdtempSync as Ym,openSync as Ja,readFileSync as Xm,readSync as Zm,realpathSync as Qm,rmdirSync as ep,rmSync as tp}from"fs";import{join as wn}from"path";import{fileURLToPath as rp}from"url";var Sl=1e4,np=!1;function Ri(){if(process.platform!=="linux")return!1;return np||=["/usr/bin/tmux","/usr/local/bin/tmux","/bin/tmux"].some((e)=>{try{let l=vi(e,["-V"],{encoding:"utf8",timeout:2000,env:{PATH:"/usr/bin:/bin"},stdio:["ignore","pipe","ignore"]}),v=/^tmux (?:next-)?([0-9]+)\.([0-9]+)/.exec(l);return v!==null&&Number(v[1])*100+Number(v[2])>=302}catch{return!1}})}var op=Buffer.from([0,255,3,4]);function Rl(e){return`printf "%s\\n" ${e==="foreground"?"$$":"$!"} > ${e}.pid.tmp; /bin/mv ${e}.pid.tmp ${e}.pid`}function ip(e,l,v){if(!Number.isSafeInteger(l)||l<2||!Number.isSafeInteger(v)||v<2||e.length>4096||!e.startsWith(`${l} (`))return!1;let D=e.lastIndexOf(") ");if(D<0)return!1;let M=e.slice(D+2).trim().split(/\s+/);return M.length>=20&&/^[A-Za-z]$/.test(M[0])&&/^\d+$/.test(M[1])&&M[2]===String(l)&&M[3]===String(v)&&/^[1-9][0-9]*$/.test(M[19])}async function Po(e,l={}){if(process.platform==="win32")return!e.aborted&&yi();if(e.aborted||!["darwin","linux"].includes(process.platform)||typeof Bun>"u")return!1;let v=J(),{directory:D,root:M,runtimeDirectory:L}=cp(v),z=new AbortController,re=()=>z.abort();e.addEventListener("abort",re,{once:!0});let G;z.signal.addEventListener("abort",()=>G?.close(),{once:!0});let ne=setTimeout(re,Sl),fe={organization_id:dr(),user_id:dr(),device_id:dr()},te=dr(),X=dr(),le=dr(),be=dr(),ke=Date.now()+Sl,Re={kind:"workspace_source",target_revision:0,root_grant_revision:1},Oe=dr().replaceAll("-",""),Me,Ee=Buffer.alloc(0),Te,We=!1,$e=!1,Ue=!1,Ne=!1,Ce,Le,Ge,Ve=async(it)=>{while(!it()){if(z.signal.aborted)throw Error("pty_probe_cancelled");await new Promise((Ye)=>setTimeout(Ye,20))}if(z.signal.aborted)throw Error("pty_probe_cancelled")},Je=!1;try{G=ap(D,v),Ce=Bun.serve({hostname:"127.0.0.1",port:0,fetch(Be,Ke){let Fe=new URL(Be.url).pathname,nt=Fe===`/device/hands/${Oe}`?"hands":Fe===`/device/pty/${Oe}`?"pty":null;if(nt&&Ke.upgrade(Be,{data:{lane:nt}}))return;return new Response(null,{status:404})},websocket:{maxPayloadLength:8192,open(Be){if(Be.data.lane==="pty")Me=Be},message(Be,Ke){if(Be.data.lane!=="pty")return;if(typeof Ke==="string"){try{if(JSON.parse(Ke).t==="open")We=!0}catch{re()}return}if(Ee.length+Ke.length>8192){re();return}Ee=Buffer.concat([Ee,Ke])}}});let it=`ws://127.0.0.1:${Ce.port}`;if(Le=et({headless:!0,managedPty:{version:1},root:M,runtimeDirectory:L,runId:te,operationId:dr(),attemptId:dr(),claimOwner:fe,deviceIdentity:{deviceId:fe.device_id,rootId:X,apiOrigin:"https://worker-probe.invalid"},signal:z.signal,payload:{relay_url:`${it}/device/hands/${Oe}`,session_id:"pty-readiness",environment_id:"pty-readiness",expires_at:new Date(ke).toISOString(),policy_mode:"full_access",policy_version:1,hands_protocol_version:F,hands_worker_version:U,hands_worker_artifact_sha256:T,hands_worker_entrypoint:H,target_generation:1,target_fence_id:le,environment_binding:Re,[E]:ye},emitEvent:async(Be)=>{if(Be==="hands.started")Ne=!0;if(Be==="hands.ready")$e=!0;if(Be==="hands.stopped")Ue=!0}},{browserExecutablePath:null,slot:Ao(),readyTimeoutMs:3000,logDiagnostic:()=>{return},resolvePathEnvironment:async()=>({path:"/usr/bin:/bin:/usr/sbin:/sbin",source:"fallback"}),sourceEntrypoint:rp(new URL("./worker-candidate-entry.ts",import.meta.url)),...l}).catch(()=>{if(!$e)re()}),await Ve(()=>$e),Qe({root:M,runId:te,payload:{version:1,snapshot_id:be,revision:1,run_id:te,root_id:X,device_id:fe.device_id,binding:{...Re,target_generation:1,target_fence_id:le},expires_at:new Date(ke).toISOString(),variables:{PTY_PROBE_VALUE:Oe},git:null}}),Ge=rn({root:M,runId:te,rootId:X,deviceId:fe.device_id,owner:fe,workspace:{kind:"root"},authority:{device_id:fe.device_id,binding:Re.kind,target_revision:0,root_grant_revision:1,target_generation:1,target_fence_id:le},signal:z.signal,session:{jobId:`pty-${dr()}`,sessionId:"pty-readiness",operationId:dr(),cols:80,rows:24,leaseExpiresAtMs:ke,relayUrl:`${it}/device/pty/${Oe}`},emit:async(Be,Ke)=>{if(Be==="pty.ready")Te=Ke}}).catch(()=>{re()}),await Ve(()=>Boolean(Te&&Me&&We)),Me.send(JSON.stringify({t:"resize",cols:100,rows:30})),Me.send(Buffer.from(`stty -echo; test "$PTY_PROBE_VALUE" = '${Oe}' || exit 19; stty size; printf '\\000\\377\\003\\004'; (trap '' TERM HUP; ${G.wait("background")}) & ${Rl("background")}; /bin/bash --noprofile --norc -c 'trap "" TERM HUP; ${Rl("foreground")}; ${G.wait("foreground")}'
|
|
17
|
+
`)),await Ve(()=>Gm(wn(M,"foreground.pid"))&&Ee.includes(op)),!Ee.includes("30 100")||Te.job.environmentSnapshotId!==be||Te.job.environmentRevision!==1)return!1;let Ye=["background.pid","foreground.pid"].map((Be)=>sp(wn(M,Be)));if(new Set(Ye).size!==2||Ye.some((Be)=>!Number.isSafeInteger(Be)||Be<2||Be===Te.job.process.pid))return!1;if(process.platform==="linux"){if(!Ye.every((Be)=>ip(Xm(`/proc/${Be}/stat`,"utf8"),Be,Te.job.process.pid)))return!1}else{let Ke=vi("/bin/ps",["-o","pid=,pgid=","-p",Ye.join(",")],{env:{PATH:"/usr/bin:/bin"},encoding:"utf8",timeout:1000,maxBuffer:1024}).trim().split(`
|
|
18
|
+
`).map((Fe)=>Fe.trim().split(/\s+/).map(Number));if(Ke.length!==2||new Set(Ke.map(([Fe])=>Fe)).size!==2||Ke.some((Fe)=>Fe.length!==2||!Ye.includes(Fe[0])||Fe[0]!==Fe[1]))return!1}if(Me.send(JSON.stringify({t:"close"})),await Ge,z.signal.aborted)return!1;for(let Be of[Te.job.process.pid,...Ye])try{return process.kill(Be,0),!1}catch(Ke){if(!(Ke instanceof Error&&("code"in Ke)&&Ke.code==="ESRCH"))return!1}Je=!0}catch{Je=!1}finally{if(clearTimeout(ne),e.removeEventListener("abort",re),re(),G?.close(),await Ge,await Le,await Ce?.stop(!0),!Ne||Ue)lp({directory:D,root:M},v)}return Je&&Ue&&!e.aborted}function ap(e,l){let v={foreground:wn(e,"foreground.lifeline"),background:wn(e,"background.lifeline")};if(!Object.values(v).every((L)=>/^\/[A-Za-z0-9/._-]+$/.test(L)))throw Error("pty_probe_path");vi("/usr/bin/mkfifo",["-m","0600",...Object.values(v)],{env:{PATH:"/usr/bin:/bin"},stdio:"ignore",timeout:1000});let D=[],M=()=>{for(let L of D.splice(0))Va(L)};try{for(let L of Object.values(v)){let z=Ja(L,Mr.O_RDONLY|Mr.O_NONBLOCK|Mr.O_NOFOLLOW);try{if(D.push(Ja(L,Mr.O_WRONLY|Mr.O_NONBLOCK|Mr.O_NOFOLLOW)),!Pl(D.at(-1)).isFIFO())throw Error("pty_probe_lifeline")}finally{Va(z)}if(l)El(L,l.uid,l.gid)}}catch(L){throw M(),L}return{wait:(L)=>`exec 3<>${v[L]} <${v[L]} 3>&-; exec /bin/cat`,close:M}}function Cl(e=(l)=>Po(l)){let l=new AbortController,v=JSON.stringify(J()),D=(async()=>{try{return await e(l.signal)===!0&&!l.signal.aborted}catch{return!1}})();return{result:D,matches:(M)=>M.executionMode==="host"&&JSON.stringify(J())===v,stop:async(M=1500)=>{l.abort();let L;await Promise.race([D,new Promise((z)=>{L=setTimeout(z,M)})]),clearTimeout(L)}}}function sp(e){let l;try{l=Ja(e,Mr.O_RDONLY|Mr.O_NOFOLLOW|Mr.O_NONBLOCK)}catch{return Number.NaN}try{let v=Pl(l);if(!v.isFile()||v.size>32)return Number.NaN;let D=Buffer.alloc(32),M=Zm(l,D,0,D.length,0),L=D.subarray(0,M).toString("utf8").trim();return/^[0-9]{1,10}$/.test(L)?Number(L):Number.NaN}catch{return Number.NaN}finally{Va(l)}}function cp(e,l=Qm("/tmp")){let v=Ym(wn(l,"reason-pty-probe-")),D=wn(v,"workspace"),M=wn(v,"private");if(vl(D,{mode:448}),vl(M,{mode:448}),e)kl(v,493),kl(D,493),El(D,e.uid,e.gid);return{directory:v,root:D,runtimeDirectory:M}}function lp(e,l){if(l)try{vi("/usr/bin/setpriv",[`--reuid=${l.uid}`,`--regid=${l.gid}`,"--clear-groups","--no-new-privs","--","/usr/bin/find",e.root,"-mindepth","1","-delete"],{env:{PATH:"/usr/bin:/bin"},stdio:"ignore",timeout:2000}),ep(e.root)}catch{return}tp(e.directory,{recursive:!0,force:!0})}var Ml=5000,yn="ARA_WORKER_PROBE_READY";function wp(e,l,v,D,M){if(M.aborted)return Promise.resolve(!1);return new Promise((L)=>{dp(e,l,{cwd:v,env:D,signal:M,timeout:Ml,killSignal:"SIGKILL",maxBuffer:4096,encoding:"utf8",windowsHide:!0},(z,re)=>L(!z&&!M.aborted&&re===yn))})}function yp(e,l){let v=Xa(e).replace(/\.exe$/i,"");if(v==="bash")return["--noprofile","--norc","-c",l];if(v==="zsh"||v==="sh")return["-f","-c",l];return null}function _p(e,l){let v=je({home:l,temporaryDirectory:l}),D=(L,z,re)=>wp(L,z,e.workspaceRoot,v,re),M=async(L,z,re,G=(fe)=>fe===yn,ne=!1)=>{let fe=process.platform==="win32"?Ya(Pi(gp(),"reason-device-probe-")):e.workspaceRoot;try{let te=await Kn(L,z,{cwd:fe,root:fe,allowWrite:!1,allowProcessInspection:ne,timeoutMs:Ml,signal:re,workerProbe:!0}),X=!re.aborted&&!te.timedOut&&!te.truncated&&te.exitCode===0&&G(te.stdout);if(!X&&process.platform==="win32")process.stderr.write(`Reason worker: confined ${Xa(L)} probe failed (exit ${te.exitCode}${te.timedOut?", timed out":""}): ${te.stderr.slice(-300).trim()}
|
|
19
19
|
`);return X}catch(te){if(process.platform==="win32")process.stderr.write(`Reason worker: confined ${Xa(L)} probe failed: ${String(te)}
|
|
20
|
-
`);throw te}finally{if(
|
|
21
|
-
`),Promise.resolve(!1);return M(en(),["-c",`printf ${yn}`],L)},confinedGit:(L)=>M("git",["--version"],L,(z)=>/^git version \S+/.test(z)),processInspection:async(L)=>{if(process.platform==="darwin")return M("/usr/sbin/lsof",["-a","-p",String(process.pid),"-d","cwd","-Fn"],L,(
|
|
22
|
-
`)&&/^n\//m.test(
|
|
20
|
+
`);throw te}finally{if(fe!==e.workspaceRoot)Dl(fe,{recursive:!0,force:!0})}};return{workspaceRead:async(L)=>(await xl(e.workspaceRoot,Al.R_OK),await Ol(e.workspaceRoot),!L.aborted),workspaceWrite:async(L)=>{if(await xl(e.workspaceRoot,Al.W_OK),L.aborted)return!1;let z=Ya(Pi(e.workspaceRoot,".ara-worker-probe-")),re=Pi(z,"receipt");try{let G=await fp(re,"wx",384);try{await G.writeFile(yn),await G.sync()}finally{await G.close()}return await Il(re,"utf8")===yn&&!L.aborted}finally{await pp(re).catch(()=>{}),await hp(z).catch(()=>{})}},confinedShell:(L)=>{if(process.platform==="win32"&&!tn())return process.stderr.write(`Reason worker: ${Oa}
|
|
21
|
+
`),Promise.resolve(!1);return M(en(),["-c",`printf ${yn}`],L)},confinedGit:(L)=>M("git",["--version"],L,(z)=>/^git version \S+/.test(z)),processInspection:async(L)=>{if(process.platform==="darwin")return M("/usr/sbin/lsof",["-a","-p",String(process.pid),"-d","cwd","-Fn"],L,(ne)=>ne.includes(`p${process.pid}
|
|
22
|
+
`)&&/^n\//m.test(ne),!0);if(process.platform==="win32")return cc(L);if(process.platform!=="linux")return!1;let[z,re,G]=await Promise.all([mp("/proc/self/cwd"),Ol("/proc/self/fd"),Il("/proc/net/tcp","utf8")]);return!L.aborted&&z.length>0&&re.length>0&&G.includes("local_address")},bash:async(L)=>{let z=process.platform==="win32"?Y():"/bin/bash";if(!z)return process.stderr.write(`Reason worker: ${process.platform==="win32"?Sa:"bash is unavailable"}
|
|
23
23
|
`),!1;return D(z,["--noprofile","--norc","-c",`printf ${yn}`],L)},jobs:(L)=>bl(e,L),environment:(L)=>hl(e,l,L),preview:(L)=>ro(l,L),boundPty:(L)=>Po(L),desktopDisplay:()=>Bo(),desktopAutomation:async()=>{let L=Za();if(L)process.stderr.write(`Reason worker: computer and browser use need setup (${L})
|
|
24
|
-
`);return hr()},desktopBrowser:async()=>A()?.features.browser===!0,fullControlShell:(L)=>{let z=dt(),re=yp(z,`printf ${yn}`);return re?D(z,re,L):Promise.resolve(!1)}}}function Za(){return process.platform==="darwin"&&A()?.features.computer===!0?Ln():null}var es=["pty.start","tunnel.open","tunnel.close","preview.serve.v1","display.stream.v1","automation.call.v1","browser.pr-proof.v1"];async function bp(e,l,v=new AbortController().signal,D={read:!0,write:!1},M=Co()){return xo(e,l,v,D,M).final}function xo(e,l,v=new AbortController().signal,D={read:!0,write:!1},M=Co(),L,z){let re,G;try{if(Or(e),
|
|
25
|
-
`),(async()=>{for(let L of e.delaysMs??vp){if(await new Promise((G)=>{let
|
|
26
|
-
`),e.onReady(D,re);if(Ga(e.config,D).length===0)return}})()}import{execFile as vh}from"child_process";import{createHash as Sh,randomUUID as Rs}from"crypto";import{lstat as Rh,readdir as bd,readFile as Sd,realpath as Eh,stat as Ph}from"fs/promises";import{basename as Ch,join as ks}from"path";import{promisify as Ah}from"util";import{createConnection as Sp}from"net";import{endianness as Nl}from"os";var Io=4,ns=1e4;class Vr{socketPath;sessionId;turnId;timeoutMs;#t=null;#e=Buffer.alloc(0);#i=1;#r=new Map;#n=new Set;constructor(e){this.socketPath=e.socketPath,this.sessionId=e.sessionId??"open-browser-use-js",this.turnId=e.turnId??`turn-${Date.now()}`,this.timeoutMs=e.timeoutMs??1e4}async connect(){if(this.#t)return this;let e=Sp(this.socketPath);return this.#t=e,e.on("data",(l)=>this.#a(Buffer.from(l))),e.on("close",()=>this.#o(Error("Open Browser Use socket closed"))),e.on("error",(l)=>this.#o(l)),await new Promise((l,v)=>{e.once("connect",l),e.once("error",v)}),this}close(){this.#t?.end(),this.#t=null}onNotification(e){return this.#n.add(e),()=>{this.#n.delete(e)}}async request(e,l={}){await this.connect();let v=this.#t;if(!v)throw Error("Open Browser Use socket is not connected");let D=String(this.#i++),M={session_id:this.sessionId,turn_id:this.turnId,...l},z=Rp({jsonrpc:"2.0",id:D,method:e,params:M}),re=new Promise((G,ce)=>{let we=setTimeout(()=>{this.#r.delete(D),ce(Error(`Open Browser Use request timed out: ${e}`))},this.timeoutMs);this.#r.set(D,{resolve:G,reject:ce,timeout:we})});return v.write(z),await re}getInfo(){return this.request("getInfo")}createTab(){return this.request("createTab")}getTabs(){return this.request("getTabs")}getUserTabs(){return this.request("getUserTabs")}getUserHistory(e={}){return this.request("getUserHistory",e)}claimUserTab(e){return this.request("claimUserTab",{tabId:e})}finalizeTabs(e){return this.request("finalizeTabs",{keep:e})}nameSession(e){return this.request("nameSession",{name:e})}attach(e){return this.request("attach",{tabId:e})}detach(e){return this.request("detach",{tabId:e})}executeCdp(e,l,v={}){return this.request("executeCdp",{target:{tabId:e},method:l,commandParams:v})}moveMouse(e,l,v,D=!0){return this.request("moveMouse",{tabId:e,x:l,y:v,waitForArrival:D})}waitForFileChooser(e,l){return this.request("waitForFileChooser",{tabId:e,...l===void 0?{}:{timeoutMs:l}})}setFileChooserFiles(e,l){return this.request("setFileChooserFiles",{fileChooserId:e,files:l})}waitForDownload(e,l){return this.request("waitForDownload",{tabId:e,...l===void 0?{}:{timeoutMs:l}})}downloadPath(e,l){return this.request("downloadPath",{downloadId:e,...l===void 0?{}:{timeoutMs:l}})}browserUserHistory(e={}){return this.getUserHistory(e)}readClipboardText(e){return this.request("readClipboardText",{tabId:e})}writeClipboardText(e,l){return this.request("writeClipboardText",{tabId:e,text:l})}readClipboard(e){return this.request("readClipboard",{tabId:e})}writeClipboard(e,l){return this.request("writeClipboard",{tabId:e,items:l})}turnEnded(){return this.request("turnEnded")}#a(e){this.#e=Buffer.concat([this.#e,e]);while(this.#e.length>=Io){let l=Nl()==="LE"?this.#e.readUInt32LE(0):this.#e.readUInt32BE(0),v=Io+l;if(this.#e.length<v)return;let D=this.#e.subarray(Io,v);this.#e=this.#e.subarray(v),this.#s(JSON.parse(D.toString("utf8")))}}#s(e){if(!br(e))return;let l=typeof e.id==="string"||typeof e.id==="number"?String(e.id):null;if(!l&&typeof e.method==="string"){let D={method:e.method,params:e.params};for(let M of this.#n)M(D);return}if(!l)return;let v=this.#r.get(l);if(!v)return;if(this.#r.delete(l),clearTimeout(v.timeout),br(e.error)){v.reject(Error(String(e.error.message??"Open Browser Use request failed")));return}v.resolve(e.result??null)}#o(e){for(let[l,v]of this.#r)this.#r.delete(l),clearTimeout(v.timeout),v.reject(e)}}class Ci{client;cdp;constructor(e){this.client="client"in e?e.client:new Vr(e),this.cdp=new Bl(this.client)}async connect(){return await this.client.connect(),this}close(){this.client.close()}async newTab(e={}){let l=await this.client.createTab(),v=Ep(l,"createTab response"),D=this.tab(v);if(e.url)await D.goto(e.url,e);return D}tab(e){return new Hl(this,e)}getTabs(){return this.client.getTabs()}}class Hl{browser;id;playwright;constructor(e,l){this.browser=e,this.id=l,this.playwright=new $l(this)}goto(e,l={}){return this.browser.cdp.navigate(this.id,e,l)}waitForLoadState(e={}){return this.browser.cdp.waitForLoadState(this.id,e)}domSnapshot(){return this.browser.cdp.evaluate(this.id,"document.body?.innerText ?? ''").then((e)=>String(e??""))}evaluate(e,l={}){return this.browser.cdp.evaluate(this.id,e,l)}close(){return this.browser.cdp.call(this.id,"Page.close")}}class $l{tab;constructor(e){this.tab=e}waitForLoadState(e={}){return this.tab.waitForLoadState(e)}domSnapshot(){return this.tab.domSnapshot()}}class Bl{client;#t=new Set;constructor(e){this.client=e}async call(e,l,v={},D={}){return await this.ensureAttached(e),this.client.request("executeCdp",{target:{tabId:e},method:l,commandParams:v,...D.timeoutMs===void 0?{}:{timeoutMs:D.timeoutMs}})}async evaluate(e,l,v={}){let D=await this.call(e,"Runtime.evaluate",{expression:l,returnByValue:!0,...v.awaitPromise===void 0?{}:{awaitPromise:v.awaitPromise}});if(br(D)&&br(D.exceptionDetails))throw Error(String(D.exceptionDetails.text??"Open Browser Use evaluation failed"));return br(D)&&br(D.result)?D.result.value??null:null}async navigate(e,l,v={}){if(!l)throw Error("goto requires a URL");let D=v.waitUntil??"load";Ll(D);let M=v.timeoutMs??ns;await this.call(e,"Page.enable");let L=this.waitForLoadEvent(e,D,M),z=await this.call(e,"Page.navigate",{url:l},{timeoutMs:M});if(br(z)&&typeof z.errorText==="string"&&z.errorText)throw Error(`Browser failed to navigate tab ${e}: ${z.errorText}`);return await L.catch(async(re)=>{let G=await this.readDocumentState(e);if(Wl(G,D))return;throw re}),z}async waitForLoadState(e,l={}){let v=l.state??"load";Ll(v),await this.call(e,"Page.enable");let D=await this.readDocumentState(e);if(Wl(D,v))return;await this.waitForLoadEvent(e,v,l.timeoutMs??ns)}async readDocumentState(e){try{let l=await this.evaluate(e,"({ href: window.location.href, readyState: document.readyState })");return br(l)?{href:cs(l.href),readyState:cs(l.readyState)}:void 0}catch{return}}waitForEvent(e,l,v={}){let D=v.timeoutMs??ns;return new Promise((M,L)=>{let z=!1,re=null,G,ce=()=>{if(z)return!1;return z=!0,clearTimeout(G),re?.(),!0};G=setTimeout(()=>{if(ce())L(Error(v.timeoutMessage??`Timed out waiting for tab ${e} event`))},D),re=this.client.onNotification((we)=>{try{if(l(we)){if(ce())M(we)}}catch(te){if(ce())L(te instanceof Error?te:Error(String(te)))}})})}waitForLoadEvent(e,l,v){return this.waitForEvent(e,(D)=>{let M=Pp(D,e);if(!M)return!1;if(M.method==="Page.navigationBlocked")throw Error(`Navigation was blocked in tab ${e}`);return l==="domcontentloaded"?M.method==="Page.domContentEventFired":M.method==="Page.loadEventFired"},{timeoutMs:v,timeoutMessage:`Timed out waiting for ${l} in tab ${e}`}).then(()=>{return})}async ensureAttached(e){if(this.#t.has(e))return;await this.client.attach(e),this.#t.add(e)}}function Rp(e){let l=Buffer.from(JSON.stringify(e),"utf8"),v=Buffer.alloc(Io+l.length);if(Nl()==="LE")v.writeUInt32LE(l.length,0);else v.writeUInt32BE(l.length,0);return l.copy(v,Io),v}function br(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function Ep(e,l){if(!br(e))throw Error(`${l} did not include a tab object`);let v=e.id;if(typeof v==="number"&&Number.isInteger(v)&&v>0)return v;if(typeof v==="string"){let D=Number(v);if(Number.isInteger(D)&&D>0)return D}throw Error(`${l} did not include a numeric tab id`)}function Ll(e){if(e!=="domcontentloaded"&&e!=="load")throw Error(`Unsupported load state "${e}". Use "domcontentloaded" or "load".`)}function Wl(e,l){if(e?.readyState==="complete")return!0;return l==="domcontentloaded"&&e?.readyState==="interactive"}function Pp(e,l){if(e.method!=="onCDPEvent"||!br(e.params))return null;let v=e.params.source;if(!br(v)||v.tabId!==l)return null;return{method:cs(e.params.method)}}function cs(e){return typeof e==="string"?e:void 0}import{createHash as Cp}from"crypto";function Ul(e,l,v,D){let M=JSON.stringify([e.trim().toLowerCase(),l.trim().toLowerCase(),v,D]);return`reason-cloud-${Cp("sha256").update(M).digest("hex")}`}import{AsyncLocalStorage as _h}from"async_hooks";import{isDeepStrictEqual as yd}from"util";import{createHash as bh}from"crypto";var Ap=/#w=(\d{1,5})&h=(\d{1,5})$/;function Fl(e){return typeof e==="number"&&Number.isInteger(e)&&e>0&&e<=32768?e:void 0}function jl(e){let l=Ap.exec(e);if(!l)return;let v=Fl(Number(l[1])),D=Fl(Number(l[2]));return v&&D?{width:v,height:D}:void 0}var ql="[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}",xp=new RegExp(`^/media/pr-screenshots/(${ql})/(${ql})/([a-z0-9][a-z0-9._-]*)\\.(png|jpe?g|gif|webp|webm|mp4)$`,"i");var Ip=new Set(["png","jpg","jpeg","gif","webp"]),Op=new Set(["webm","mp4"]);function Dp(e){if(!e)return null;try{return new URL(e).origin}catch{return null}}function Mp(e){let l=jl(e);return Boolean(l&&e===`#w=${l.width}&h=${l.height}`)}function zl(e,l){let v;try{v=new URL(e)}catch{return null}let D=Dp(l),M=v.hostname==="ara.so"||v.hostname.endsWith(".ara.so")||v.hostname==="reasonmachines.ai"||v.hostname.endsWith(".reasonmachines.ai")||v.hostname==="reasonmachines.com"||v.hostname.endsWith(".reasonmachines.com");if(v.protocol!=="https:"||!M&&v.origin!==D||v.username||v.password||v.port||v.search||v.hash&&!Mp(v.hash))return null;let L=xp.exec(v.pathname);if(!L)return null;let z=L[1]?.toLowerCase(),re=L[2]?.toLowerCase(),G=L[3]?.toLowerCase(),ce=L[4]?.toLowerCase();if(!z||!re||!G||!ce)return null;let we=Ip.has(ce)?"image":Op.has(ce)?"video":null;if(!we)return null;let te=/^(before|after)[\s:_-]+/.exec(G),X=v.pathname.replace(/^\/media\//,"");return{url:v.toString(),storagePath:X,runId:z,artifactId:re,fileName:`${G}.${ce}`,kind:we,phase:te?.[1]==="before"||te?.[1]==="after"?te[1]:null}}var Tp=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,Ai=(e)=>Boolean(e&&typeof e==="object"&&!Array.isArray(e)),_n=()=>{throw Error("cloud_browser_media_request_invalid")};function xi(e){if(!Ai(e)||Object.keys(e).some((L)=>!["runId","configuredMediaOrigin","media"].includes(L))||typeof e.runId!=="string"||!Tp.test(e.runId)||typeof e.configuredMediaOrigin!=="string"||e.configuredMediaOrigin.length>2048||!Array.isArray(e.media)||e.media.length<1||e.media.length>8)return _n();let l;try{l=new URL(e.configuredMediaOrigin)}catch{return _n()}if(l.protocol!=="https:"||l.username||l.password||l.port||!Mt(l.origin,{mode:"public_web"}).allowed)return _n();let v=e.runId.toLowerCase(),D=new Set,M=e.media.map((L)=>{if(!Ai(L)||Object.keys(L).some((re)=>!["url","sourceUrl","kind"].includes(re))||typeof L.url!=="string"||L.url.length>2048||typeof L.sourceUrl!=="string"||L.sourceUrl.length>8192||!["image","video"].includes(String(L.kind)))return _n();let z=zl(L.url,l.origin);if(!z||new URL(z.url).origin!==l.origin||z.runId!==v||z.kind!==L.kind||z.url!==L.url||D.has(L.url))return _n();if(D.add(L.url),L.sourceUrl!==L.url){let re;try{re=new URL(L.sourceUrl)}catch{return _n()}let G=/^\/(?:[a-f0-9]{40}|[a-f0-9]{64})\/([a-f0-9]+)$/.exec(re.pathname)?.[1];if(L.kind!=="image"||re.origin!=="https://camo.githubusercontent.com"||re.username||re.password||re.search||re.hash||!G||G.length%2!==0||Buffer.from(G,"hex").toString("utf8")!==L.url)return _n()}return{url:L.url,sourceUrl:L.sourceUrl,kind:L.kind}});return{runId:e.runId,configuredMediaOrigin:l.origin,media:M}}function Kl(e,l){let v=()=>{throw Error("cloud_browser_media_verification_failed")};if(!Ai(e)||e.verified!==!0||!Array.isArray(e.items)||e.items.length!==l.media.length)return v();return{verified:!0,items:e.items.map((M,L)=>{let z=l.media[L];if(!Ai(M)||M.url!==z.url||M.sourceUrl!==z.sourceUrl||M.kind!==z.kind||typeof M.sourceSha256!=="string"||!/^[a-f0-9]{64}$/.test(M.sourceSha256)||!Number.isSafeInteger(M.width)||!Number.isSafeInteger(M.height)||Number(M.width)<1||Number(M.height)<1||Number(M.width)>16384||Number(M.height)>16384||z.kind==="video"&&(typeof M.advancedSeconds!=="number"||!Number.isFinite(M.advancedSeconds)||M.advancedSeconds<0.05||M.advancedSeconds>30))return v();return{...z,width:Number(M.width),height:Number(M.height),sourceSha256:M.sourceSha256,...z.kind==="video"?{advancedSeconds:M.advancedSeconds}:{}}})}}var us="browser.pr-proof.v1",Dt=t().uuid(),$n=t().regex(/^[a-f0-9]{64}$/),vn=I.datetime({precision:3}),ds=t().regex(/^[a-zA-Z0-9_-]{1,160}$/),Gl=t().max(2048).regex(/^https:\/\/github\.com\/[A-Za-z0-9_-]+\/[A-Za-z0-9_.-]+\/pull\/[1-9][0-9]*$/).refine((e)=>![".",".."].includes(e.split("/")[4])),ur=n({kind:i("primary_mac"),version:i(1),organizationId:ds,userId:ds,sessionId:ds,runId:Dt,deviceId:Dt,rootId:Dt,rootRevision:t().min(1).max(64),binding:c(["workspace_source","mcp_control"]),targetRevision:o().int().nonnegative(),generation:Dt,profile:t().regex(/^(Default|Profile [0-9]+)$/),extensionInstanceId:t().min(1).max(1024)}).strict().refine((e)=>e.binding!=="workspace_source"||e.targetRevision===0),Lp=Yi().transform((e,l)=>{try{return ho(e)}catch{return l.addIssue({code:"custom",message:"proof_visual_contract_invalid"}),Jc}}),Bn=n({version:i(1),owner:ur,contextId:Dt,preparedAt:vn,expiresAt:vn,prUrl:Gl,headSha:t().regex(/^[a-f0-9]{40}$/),skillDigest:$n,evidenceKind:c(["image","video"]),visualPlan:Lp.optional(),uploadOrigin:t().url().refine((e)=>{let l=new URL(e);return l.protocol==="https:"&&l.origin===e&&!l.username&&!l.password}).optional()}).strict().refine((e)=>Date.parse(e.expiresAt)>Date.parse(e.preparedAt)&&Date.parse(e.expiresAt)-Date.parse(e.preparedAt)<=300000),fs=n({version:i(1),producer:i("primary_mac"),context:Bn,captureId:Dt,operationId:Dt,attemptId:Dt,tabId:o().int().positive(),startedAt:vn,finishedAt:vn,sha256:$n,media:P("contentType",[n({contentType:i("image/png"),sizeBytes:o().int().min(24).max(8388608),width:o().int().min(1).max(4096),height:o().int().min(1).max(4096)}).strict(),n({contentType:i("video/webm"),sizeBytes:o().int().min(128).max(10485760),durationSeconds:o().min(0.05).max(15),frameCount:o().int().min(1).max(450),receivedFrameCount:o().int().min(1).max(2000)}).strict()])}).strict().superRefine((e,l)=>{let v=Date.parse(e.startedAt),D=Date.parse(e.finishedAt);if(v<Date.parse(e.context.preparedAt)||D<v||D>Date.parse(e.context.expiresAt)||D-v>30000||e.media.contentType==="video/webm"&&(e.media.receivedFrameCount<e.media.frameCount||Math.abs((D-v)/1000-e.media.durationSeconds)>0.1))l.addIssue({code:"custom",message:"mac_pr_proof_capture_chronology_invalid"})}),ov=P("action",[n({action:i("screenshot"),context_id:Dt,tab_id:o().int().positive()}).strict(),n({action:i("start_video"),context_id:Dt,tab_id:o().int().positive(),seconds:o().int().min(1).max(15)}).strict(),n({action:i("stop_video"),recording_operation_id:Dt}).strict()]),Oi=n({login:t().regex(/^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?$/),id:t().regex(/^[1-9][0-9]{0,19}$/).nullable()}).strict(),Ii=t().regex(/^[1-9][0-9]{0,19}$/),Oo=n({version:i(1),owner:ur,expectedActorId:Ii.nullable(),repositoryId:Ii,repositoryFullName:t().max(200).regex(/^[A-Za-z0-9_-]+\/[A-Za-z0-9_.-]+$/).refine((e)=>![".",".."].includes(e.split("/")[1]))}).strict(),Wp=["browser_unavailable","github_page_unavailable","identity_check_failed","operation_incomplete","attachment_unavailable"],ms=P("status",[Oo.extend({status:i("ready"),observedActor:Oi,checkedAt:vn}),Oo.extend({status:i("not_ready"),reason:c(["authentication_required","identity_mismatch","authority_lost","unavailable"]),cause:c(Wp).optional()})]).refine((e)=>e.status!=="ready"||e.expectedActorId===null||e.observedActor.id===e.expectedActorId),bn=n({version:i(1),owner:ur,expectedActorId:Ii.nullable(),authenticatedActor:Oi,attemptId:Dt,captureId:Dt,prUrl:Gl,repositoryId:Ii,headSha:t().regex(/^[a-f0-9]{40}$/),sha256:$n,sizeBytes:o().int().min(128).max(10485760),contentType:i("video/webm")}).strict(),Yl=t().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}$/),Un=P("status",[bn.extend({status:i("not_attempted"),reason:c(["authentication_required","attachment_unavailable","identity_mismatch","capture_invalid","authority_lost"])}),bn.extend({status:i("uncertain"),reason:i("upload_outcome_unknown")}),bn.extend({status:i("uploaded"),observedActor:Oi,nativeUrl:Yl,uploadedAt:vn})]).refine((e)=>(e.expectedActorId===null||e.authenticatedActor.id===e.expectedActorId)&&(e.status!=="uploaded"||e.observedActor.id===e.authenticatedActor.id&&e.observedActor.login===e.authenticatedActor.login)),Do=bn.extend({nativeUrl:Yl,observedActor:Oi,bodySha256:$n}),ps=P("status",[Do.extend({status:i("incomplete"),reason:c(["authentication_required","identity_mismatch","playback_unverified","authority_lost"])}),Do.extend({status:i("verified"),sourceSha256:$n,width:o().int().min(1).max(4096),height:o().int().min(1).max(4096),durationSeconds:o().positive().max(30),advancedSeconds:o().min(0.05).max(10),advancedFrames:o().int().positive(),playbackRestored:i(!0),verifiedAt:vn})]).refine((e)=>(e.expectedActorId===null||e.authenticatedActor.id===e.expectedActorId)&&e.observedActor.id===e.authenticatedActor.id&&e.observedActor.login===e.authenticatedActor.login&&(e.status!=="verified"||e.sourceSha256===e.sha256)),Np=Yi().transform((e,l)=>{try{let v=xi(e);if(v.media.some((D)=>D.kind!=="image"))throw Error();return v}catch{return l.addIssue({code:"custom",message:"proof_media_request_invalid"}),Jc}}),Hp=P("action",[n({action:i("auth_check"),input:Oo}).strict(),n({action:i("prepare"),context:Bn}).strict(),n({action:i("capture_png"),owner:ur,contextId:Dt,tabId:o().int().positive()}).strict(),n({action:i("start_video"),owner:ur,contextId:Dt,tabId:o().int().positive(),seconds:o().int().min(1).max(15)}).strict(),n({action:i("inspect_capture"),owner:ur,captureId:Dt}).strict(),n({action:i("publish_video"),input:bn}).strict(),n({action:i("verify_png_media"),owner:ur,media:Np}).strict().refine((e)=>e.media.runId===e.owner.runId),n({action:i("verify_saved_media"),input:Do}).strict(),n({action:i("publish_png"),owner:ur,attemptId:Dt,captureId:Dt,sha256:$n,sizeBytes:o().int().min(24).max(8388608),storagePath:t().max(512),uploadUrl:t().url().max(8192)}).strict()]);var Xl="pr-proof.stop.v1",hs=n({requestId:Dt,command:Hp}).strict();var $p={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},Vl={type:"string",format:"uuid",description:"capture_context_id from tools.pr.prepareProof."},Jl={type:"integer",minimum:1,description:"An already-owned tab's id."},iv={...$p,oneOf:[{type:"object",required:["action","context_id","tab_id"],additionalProperties:!1,properties:{action:{type:"string",const:"screenshot"},context_id:Vl,tab_id:Jl}},{type:"object",required:["action","context_id","tab_id","seconds"],additionalProperties:!1,properties:{action:{type:"string",const:"start_video"},context_id:Vl,tab_id:Jl,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 Bp,randomUUID as Up}from"crypto";import{isDeepStrictEqual as Fn}from"util";var Zl=n({operationId:t().uuid(),attemptId:t().uuid(),contextId:t().uuid(),tabId:o().int().positive()}).strict(),_t=()=>Error("mac_pr_proof_capture_unavailable"),gs=(e)=>Bp("sha256").update(e).digest("hex");function Ql(e){let l=ur.parse(e.owner),v=new Map,D=new Map,M=!1,L=async()=>{if(M)throw _t();if(await e.assertCurrent(),M)throw _t()},z=(X)=>{let he=v.get(X);if(!he||Date.parse(he.expiresAt)<=Date.now())throw _t();return he},re=(X)=>X.disposal??=(async()=>{X.controller.abort(),X.bytes?.fill(0),X.bytes=void 0,X.receipt=void 0;try{await X.host?.close()}catch{throw M=!0,_t()}})(),G=async()=>{for(let[X,he]of v){if(Date.parse(he.expiresAt)>Date.now())continue;let Se=[...D.entries()].filter(([,Ee])=>Ee.claim.contextId===X);if((await Promise.allSettled(Se.map(([,Ee])=>re(Ee)))).some((Ee)=>Ee.status==="rejected"))throw _t();for(let[Ee]of Se)D.delete(Ee);v.delete(X)}},ce=setInterval(()=>{G().catch(()=>{M=!0})},1000);ce.unref();let we=(X)=>{if(X.stopRequested=!0,X.started&&X.host&&!X.stop)X.stop=X.host.stop(),X.stop.catch(()=>X.controller.abort())};async function te(X,he){let Se=Zl.parse(X.claim);if(he==="video"&&(!Number.isInteger(X.seconds)||X.seconds<1||X.seconds>15))throw _t();await L(),X.signal.throwIfAborted(),await G();let Re=z(Se.contextId);if(he==="video"&&Re.evidenceKind!=="video")throw _t();let Ee=D.get(Se.operationId);if(Ee){if(!Fn(Ee.claim,Se)||Ee.kind!==he||Ee.seconds!==X.seconds||Ee.controller.signal.aborted)throw _t();let Ne=await Ee.completion;if(await L(),z(Se.contextId),Ee.controller.signal.aborted)throw _t();return structuredClone(Ne)}if(D.size>=16||[...D.values()].some((Ne)=>!Ne.receipt&&!Ne.controller.signal.aborted&&Ne.claim.tabId===Se.tabId))throw _t();let Oe,Me,Ce=new Promise((Ne,xe)=>{Oe=Ne,Me=xe});Ce.catch(()=>{});let Te={claim:Se,kind:he,seconds:X.seconds,controller:new AbortController,completion:Ce,stopRequested:!1,started:!1};D.set(Se.operationId,Te);let We=()=>{re(Te).catch(()=>{})};X.signal.addEventListener("abort",We,{once:!0});let $e=async()=>{await L(),z(Se.contextId),X.signal.throwIfAborted(),Te.controller.signal.throwIfAborted()},Ue;try{await $e();let Ne;if(he==="image"){let xe=new Date().toISOString();Ue=await e.screenshot(structuredClone(Re),Se.tabId,Te.controller.signal);let Le=new Date().toISOString();if(await $e(),Ue.length<24||Ue.length>8388608||!Ue.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))||Ue.readUInt32BE(8)!==13||Ue.toString("ascii",12,16)!=="IHDR")throw _t();Ne=fs.parse({version:1,producer:"primary_mac",context:Re,captureId:Up(),operationId:Se.operationId,attemptId:Se.attemptId,tabId:Se.tabId,startedAt:xe,finishedAt:Le,sha256:gs(Ue),media:{contentType:"image/png",sizeBytes:Ue.length,width:Ue.readUInt32BE(16),height:Ue.readUInt32BE(20)}})}else{if(Te.host=await e.createVideo(structuredClone(Re),Se.tabId,X.seconds,Te.controller.signal),Te.controller.signal.aborted||X.signal.aborted||M)throw await Te.host.close(),_t();await Te.host.start(),Te.started=!0;let xe=Te.host.completed();if(xe.catch(()=>{}),await $e(),await X.started?.(),Te.stopRequested)we(Te);let Le=await xe;if(Te.stop)await Te.stop;await $e();let Ge=await Te.host.read(Le.captureId);Ue=Ge.bytes;let Ve={runId:l.runId,deviceId:l.deviceId,rootId:l.rootId,rootRevision:l.rootRevision,generation:l.generation,profile:l.profile,extensionInstanceId:l.extensionInstanceId,browserScope:e.browserScope,tabId:Se.tabId};if(!Fn(Le,Ge.capture)||!Fn(Le.owner,Ve)||Ue.length!==Le.sizeBytes||gs(Ue)!==Le.sha256||Ue.length<128||Ue.readUInt32BE(0)!==440786851)throw _t();await Te.host.close(),await $e(),Ne=fs.parse({version:1,producer:"primary_mac",context:Re,captureId:Le.captureId,operationId:Se.operationId,attemptId:Se.attemptId,tabId:Se.tabId,startedAt:Le.startedAt,finishedAt:Le.finishedAt,sha256:Le.sha256,media:{contentType:"video/webm",sizeBytes:Le.sizeBytes,durationSeconds:Le.durationSeconds,frameCount:Le.frameCount,receivedFrameCount:Le.receivedFrameCount}})}if(await $e(),[...D.values()].reduce((xe,Le)=>xe+(Le.bytes?.length??0),Ue.length)>20971520)throw _t();return Te.bytes=Buffer.from(Ue),Te.receipt=Ne,Oe(Ne),structuredClone(Ne)}catch(Ne){let xe=he==="video"&&!X.signal.aborted&&!Te.controller.signal.aborted&&Ne instanceof Error&&Ne.message==="mac_recording_worker_failed:no_frames"?new r("proof_capture_no_frames","The owned tab emitted no recording frames."):_t();throw await re(Te).catch(()=>{}),Me(xe),xe}finally{Ue?.fill(0),X.signal.removeEventListener("abort",We)}}return{async prepare(X){let he=Bn.parse(X);if(!Fn(he.owner,l))throw _t();if(await L(),await G(),Date.parse(he.preparedAt)>Date.now()||Date.parse(he.expiresAt)<=Date.now())throw _t();let Se=v.get(he.contextId);if(Se){if(!Fn(Se,he))throw _t();return structuredClone(Se)}if(v.size>=4)throw _t();return v.set(he.contextId,he),structuredClone(he)},screenshot:(X)=>te(X,"image"),record:(X)=>te(X,"video"),async stop(X){let he=Zl.parse(X);await L(),z(he.contextId);let Se=D.get(he.operationId);if(!Se||Se.kind!=="video"||!Fn(he,Se.claim)||Se.controller.signal.aborted)throw _t();we(Se)},async publicationCapture(X){await L(),await G();let he=[...D.values()].find((Se)=>Se.receipt?.captureId===X);if(!he?.receipt||!he.bytes||he.controller.signal.aborted)throw _t();if(z(he.claim.contextId),he.bytes.length!==he.receipt.media.sizeBytes||gs(he.bytes)!==he.receipt.sha256)throw _t();return{capture:structuredClone(he.receipt),bytes:Buffer.from(he.bytes)}},async inspect(X){await L(),await G();let he=[...D.values()].find((Se)=>Se.receipt?.captureId===X);if(!he?.receipt||he.controller.signal.aborted)throw _t();return z(he.claim.contextId),structuredClone(he.receipt)},async close(){M=!0,clearInterval(ce);let X=await Promise.allSettled([...D.values()].map(re));if(D.clear(),v.clear(),X.some((he)=>he.status==="rejected"))throw _t()}}}import{createHash as nd,randomUUID as Yp}from"crypto";import{isDeepStrictEqual as Mo}from"util";import{realpath as Xp}from"fs/promises";var ed=String.raw`async (media) => {
|
|
24
|
+
`);return hr()},desktopBrowser:async()=>A()?.features.browser===!0,fullControlShell:(L)=>{let z=dt(),re=yp(z,`printf ${yn}`);return re?D(z,re,L):Promise.resolve(!1)}}}function Za(){return process.platform==="darwin"&&A()?.features.computer===!0?Ln():null}var es=["pty.start","tunnel.open","tunnel.close","preview.serve.v1","display.stream.v1","automation.call.v1","browser.pr-proof.v1"];async function bp(e,l,v=new AbortController().signal,D={read:!0,write:!1},M=Co()){return xo(e,l,v,D,M).final}function xo(e,l,v=new AbortController().signal,D={read:!0,write:!1},M=Co(),L,z){let re,G;try{if(Or(e),ie(),!l)b(p(e),!0),re=Ya(Pi(p(e),"probe-")),l=_p(e,re);G=l}catch(Me){let Ee=Promise.reject(Me);return Ee.catch(()=>{}),{initial:Ee,final:Ee,pty:Ee}}let ne=async(Me,Ee)=>{if(v.aborted||!Ee&&!G[Me])return!1;let Te,We=new Promise(($e)=>{Te=()=>$e(!1)});v.addEventListener("abort",Te,{once:!0});try{return await Promise.race([Ee??G[Me](v),We])===!0&&!v.aborted}catch{return!1}finally{v.removeEventListener("abort",Te)}},fe=e.executionMode==="host",te=fe?ne("boundPty",L):Promise.resolve(!1),X=Promise.resolve(z).then(()=>Promise.all(fe?[ne("preview"),te,ne("desktopDisplay"),ne("desktopAutomation"),ne("desktopBrowser")]:[!1,!1,!1,!1,!1]),()=>[!1,!1,!1,!1,!1]),le=(async()=>{let[Me,Ee,Te,We,$e,Ue,Ne,Ce,Le]=await Promise.all([Promise.resolve(D).then((Ge)=>Ge.read?ne("workspaceRead"):!1,()=>!1),Promise.resolve(D).then((Ge)=>Ge.write?ne("workspaceWrite"):!1,()=>!1),M?ne("confinedShell"):!1,M?ne("confinedGit"):!1,ne("processInspection"),...fe?[ne("bash"),ne("jobs"),ne("environment"),ne("fullControlShell")]:[!1,!1,!1,!1]]);if(fe&&(!Ue||!Ne||!Ce)&&!z)await X;if(fe){if(!Ue)Ue=await ne("bash");if(!Ne)Ne=await ne("jobs");if(!Ce)Ce=await ne("environment")}return{read:Me,write:Ee,shell:Te,git:We,processes:$e,bash:Ue,jobs:Ne,environment:Ce,full:Le}})(),be=(Me,Ee)=>{let{read:Te,write:We,shell:$e,git:Ue,processes:Ne,bash:Ce,jobs:Le,environment:Ge,full:Ve}=Me,{preview:Je,boundPty:it,desktopDisplay:Ye,desktopAutomation:Be,desktopBrowser:Ke}=Ee,Fe=ic(),nt=fe&&process.platform==="darwin"&&Ve&&up("/Library/Developer/PrivateFrameworks/CoreSimulator.framework");return Object.freeze({"fs.read":Te,"fs.write":We,"inference.custom.v1":fe&&Te,"fs.export":Te&&Fe,"fs.import":We&&Fe,"exec.run":$e&&M,"git.run":$e&&Ue&&M,"process.list":(process.platform==="linux"||process.platform==="win32"||$e)&&Ne,"ports.list":(process.platform==="linux"||process.platform==="win32"||$e)&&Ne,"exec.full":Ce&&Ve&&M,"hands.connect":Te&&We&&Ce&&Le,"jobs.control":Te&&We&&Ce&&Le,"pty.start":Te&&We&&Ce&&Le&&Ge&&it,"environment.install":Te&&We&&Ce&&Le&&Ge,"github.local.v1":(process.platform==="darwin"||process.platform==="win32"||process.platform==="linux"&&process.geteuid?.()!==0)&&Te&&We&&Ce&&Le&&Ge,"tunnel.open":Te&&We&&Ce&&Le&&Ge&&Je,"tunnel.close":Te&&We&&Ce&&Le&&Ge&&Je,"preview.serve.v1":Te&&Ce&&Le&&Je&&Ve,"display.stream.v1":Ye,"automation.call.v1":Be,"simulator.call.v1":nt,"simulator.stream.v1":nt,"browser.pr-proof.v1":Be&&Ke&&de()===null&&process.platform!=="win32","workspace.setup.v1":fe&&Zr()})},ke=le.then(async(Me)=>be(Me,{preview:!1,boundPty:await Promise.race([te,new Promise((Ee)=>setImmediate(()=>Ee(!1)))]),desktopDisplay:!1,desktopAutomation:!1,desktopBrowser:!1})),Re=(async()=>{try{let Me=await le,[Ee,Te,We,$e,Ue]=await X;if(fe&&!Te&&Me.read&&Me.write&&Me.bash&&Me.jobs&&Me.environment)Te=await ne("boundPty");return be(Me,{preview:Ee,boundPty:Te,desktopDisplay:We,desktopAutomation:$e,desktopBrowser:Ue})}finally{if(re)Dl(re,{recursive:!0,force:!0})}})();ke.catch(()=>{});let Oe=(async()=>{let Me=await le;if(!(Me.read&&Me.write&&Me.bash&&Me.jobs&&Me.environment))return!1;return await te||(await Re)["pty.start"]===!0})();return Oe.catch(()=>{}),{initial:ke,final:Re,pty:Oe}}var kp=["hands.connect","jobs.control","pty.start","environment.install","tunnel.open","tunnel.close","preview.serve.v1"],vp=[60000,300000,900000];function Ga(e,l){if(e.executionMode!=="host"||l["fs.read"]!==!0)return[];return kp.filter((v)=>l[v]!==!0)}function Tl(e){let l=e.log??((L)=>{process.stderr.write(L)}),v=e.resolve??((L)=>bp(e.config,void 0,L,e.permissions)),D=e.readiness,M=Ga(e.config,D);if(M.length===0)return Promise.resolve();return l(`Reason worker: withheld at start (${M.join(", ")}); probing them again while idle.
|
|
25
|
+
`),(async()=>{for(let L of e.delaysMs??vp){if(await new Promise((G)=>{let ne=setTimeout(G,L);e.signal.addEventListener("abort",()=>{clearTimeout(ne),G()},{once:!0})}),e.signal.aborted)return;if(!e.idle())continue;let z;try{z=await v(AbortSignal.any([e.signal,AbortSignal.timeout(30000)]))}catch{continue}if(e.signal.aborted)return;let re=Ga(e.config,D).filter((G)=>z[G]===!0);if(re.length>0)D=Object.freeze({...D,...Object.fromEntries(re.map((G)=>[G,!0]))}),l(`Reason worker: ready after probing again (${re.join(", ")}).
|
|
26
|
+
`),e.onReady(D,re);if(Ga(e.config,D).length===0)return}})()}import{execFile as vh}from"child_process";import{createHash as Sh,randomUUID as Rs}from"crypto";import{lstat as Rh,readdir as bd,readFile as Sd,realpath as Eh,stat as Ph}from"fs/promises";import{basename as Ch,join as ks}from"path";import{promisify as Ah}from"util";import{createConnection as Sp}from"net";import{endianness as Nl}from"os";var Io=4,ns=1e4;class Vr{socketPath;sessionId;turnId;timeoutMs;#t=null;#e=Buffer.alloc(0);#i=1;#r=new Map;#n=new Set;constructor(e){this.socketPath=e.socketPath,this.sessionId=e.sessionId??"open-browser-use-js",this.turnId=e.turnId??`turn-${Date.now()}`,this.timeoutMs=e.timeoutMs??1e4}async connect(){if(this.#t)return this;let e=Sp(this.socketPath);return this.#t=e,e.on("data",(l)=>this.#a(Buffer.from(l))),e.on("close",()=>this.#o(Error("Open Browser Use socket closed"))),e.on("error",(l)=>this.#o(l)),await new Promise((l,v)=>{e.once("connect",l),e.once("error",v)}),this}close(){this.#t?.end(),this.#t=null}onNotification(e){return this.#n.add(e),()=>{this.#n.delete(e)}}async request(e,l={}){await this.connect();let v=this.#t;if(!v)throw Error("Open Browser Use socket is not connected");let D=String(this.#i++),M={session_id:this.sessionId,turn_id:this.turnId,...l},z=Rp({jsonrpc:"2.0",id:D,method:e,params:M}),re=new Promise((G,ne)=>{let fe=setTimeout(()=>{this.#r.delete(D),ne(Error(`Open Browser Use request timed out: ${e}`))},this.timeoutMs);this.#r.set(D,{resolve:G,reject:ne,timeout:fe})});return v.write(z),await re}getInfo(){return this.request("getInfo")}createTab(){return this.request("createTab")}getTabs(){return this.request("getTabs")}getUserTabs(){return this.request("getUserTabs")}getUserHistory(e={}){return this.request("getUserHistory",e)}claimUserTab(e){return this.request("claimUserTab",{tabId:e})}finalizeTabs(e){return this.request("finalizeTabs",{keep:e})}nameSession(e){return this.request("nameSession",{name:e})}attach(e){return this.request("attach",{tabId:e})}detach(e){return this.request("detach",{tabId:e})}executeCdp(e,l,v={}){return this.request("executeCdp",{target:{tabId:e},method:l,commandParams:v})}moveMouse(e,l,v,D=!0){return this.request("moveMouse",{tabId:e,x:l,y:v,waitForArrival:D})}waitForFileChooser(e,l){return this.request("waitForFileChooser",{tabId:e,...l===void 0?{}:{timeoutMs:l}})}setFileChooserFiles(e,l){return this.request("setFileChooserFiles",{fileChooserId:e,files:l})}waitForDownload(e,l){return this.request("waitForDownload",{tabId:e,...l===void 0?{}:{timeoutMs:l}})}downloadPath(e,l){return this.request("downloadPath",{downloadId:e,...l===void 0?{}:{timeoutMs:l}})}browserUserHistory(e={}){return this.getUserHistory(e)}readClipboardText(e){return this.request("readClipboardText",{tabId:e})}writeClipboardText(e,l){return this.request("writeClipboardText",{tabId:e,text:l})}readClipboard(e){return this.request("readClipboard",{tabId:e})}writeClipboard(e,l){return this.request("writeClipboard",{tabId:e,items:l})}turnEnded(){return this.request("turnEnded")}#a(e){this.#e=Buffer.concat([this.#e,e]);while(this.#e.length>=Io){let l=Nl()==="LE"?this.#e.readUInt32LE(0):this.#e.readUInt32BE(0),v=Io+l;if(this.#e.length<v)return;let D=this.#e.subarray(Io,v);this.#e=this.#e.subarray(v),this.#s(JSON.parse(D.toString("utf8")))}}#s(e){if(!br(e))return;let l=typeof e.id==="string"||typeof e.id==="number"?String(e.id):null;if(!l&&typeof e.method==="string"){let D={method:e.method,params:e.params};for(let M of this.#n)M(D);return}if(!l)return;let v=this.#r.get(l);if(!v)return;if(this.#r.delete(l),clearTimeout(v.timeout),br(e.error)){v.reject(Error(String(e.error.message??"Open Browser Use request failed")));return}v.resolve(e.result??null)}#o(e){for(let[l,v]of this.#r)this.#r.delete(l),clearTimeout(v.timeout),v.reject(e)}}class Ci{client;cdp;constructor(e){this.client="client"in e?e.client:new Vr(e),this.cdp=new Bl(this.client)}async connect(){return await this.client.connect(),this}close(){this.client.close()}async newTab(e={}){let l=await this.client.createTab(),v=Ep(l,"createTab response"),D=this.tab(v);if(e.url)await D.goto(e.url,e);return D}tab(e){return new Hl(this,e)}getTabs(){return this.client.getTabs()}}class Hl{browser;id;playwright;constructor(e,l){this.browser=e,this.id=l,this.playwright=new $l(this)}goto(e,l={}){return this.browser.cdp.navigate(this.id,e,l)}waitForLoadState(e={}){return this.browser.cdp.waitForLoadState(this.id,e)}domSnapshot(){return this.browser.cdp.evaluate(this.id,"document.body?.innerText ?? ''").then((e)=>String(e??""))}evaluate(e,l={}){return this.browser.cdp.evaluate(this.id,e,l)}close(){return this.browser.cdp.call(this.id,"Page.close")}}class $l{tab;constructor(e){this.tab=e}waitForLoadState(e={}){return this.tab.waitForLoadState(e)}domSnapshot(){return this.tab.domSnapshot()}}class Bl{client;#t=new Set;constructor(e){this.client=e}async call(e,l,v={},D={}){return await this.ensureAttached(e),this.client.request("executeCdp",{target:{tabId:e},method:l,commandParams:v,...D.timeoutMs===void 0?{}:{timeoutMs:D.timeoutMs}})}async evaluate(e,l,v={}){let D=await this.call(e,"Runtime.evaluate",{expression:l,returnByValue:!0,...v.awaitPromise===void 0?{}:{awaitPromise:v.awaitPromise}});if(br(D)&&br(D.exceptionDetails))throw Error(String(D.exceptionDetails.text??"Open Browser Use evaluation failed"));return br(D)&&br(D.result)?D.result.value??null:null}async navigate(e,l,v={}){if(!l)throw Error("goto requires a URL");let D=v.waitUntil??"load";Ll(D);let M=v.timeoutMs??ns;await this.call(e,"Page.enable");let L=this.waitForLoadEvent(e,D,M),z=await this.call(e,"Page.navigate",{url:l},{timeoutMs:M});if(br(z)&&typeof z.errorText==="string"&&z.errorText)throw Error(`Browser failed to navigate tab ${e}: ${z.errorText}`);return await L.catch(async(re)=>{let G=await this.readDocumentState(e);if(Wl(G,D))return;throw re}),z}async waitForLoadState(e,l={}){let v=l.state??"load";Ll(v),await this.call(e,"Page.enable");let D=await this.readDocumentState(e);if(Wl(D,v))return;await this.waitForLoadEvent(e,v,l.timeoutMs??ns)}async readDocumentState(e){try{let l=await this.evaluate(e,"({ href: window.location.href, readyState: document.readyState })");return br(l)?{href:cs(l.href),readyState:cs(l.readyState)}:void 0}catch{return}}waitForEvent(e,l,v={}){let D=v.timeoutMs??ns;return new Promise((M,L)=>{let z=!1,re=null,G,ne=()=>{if(z)return!1;return z=!0,clearTimeout(G),re?.(),!0};G=setTimeout(()=>{if(ne())L(Error(v.timeoutMessage??`Timed out waiting for tab ${e} event`))},D),re=this.client.onNotification((fe)=>{try{if(l(fe)){if(ne())M(fe)}}catch(te){if(ne())L(te instanceof Error?te:Error(String(te)))}})})}waitForLoadEvent(e,l,v){return this.waitForEvent(e,(D)=>{let M=Pp(D,e);if(!M)return!1;if(M.method==="Page.navigationBlocked")throw Error(`Navigation was blocked in tab ${e}`);return l==="domcontentloaded"?M.method==="Page.domContentEventFired":M.method==="Page.loadEventFired"},{timeoutMs:v,timeoutMessage:`Timed out waiting for ${l} in tab ${e}`}).then(()=>{return})}async ensureAttached(e){if(this.#t.has(e))return;await this.client.attach(e),this.#t.add(e)}}function Rp(e){let l=Buffer.from(JSON.stringify(e),"utf8"),v=Buffer.alloc(Io+l.length);if(Nl()==="LE")v.writeUInt32LE(l.length,0);else v.writeUInt32BE(l.length,0);return l.copy(v,Io),v}function br(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function Ep(e,l){if(!br(e))throw Error(`${l} did not include a tab object`);let v=e.id;if(typeof v==="number"&&Number.isInteger(v)&&v>0)return v;if(typeof v==="string"){let D=Number(v);if(Number.isInteger(D)&&D>0)return D}throw Error(`${l} did not include a numeric tab id`)}function Ll(e){if(e!=="domcontentloaded"&&e!=="load")throw Error(`Unsupported load state "${e}". Use "domcontentloaded" or "load".`)}function Wl(e,l){if(e?.readyState==="complete")return!0;return l==="domcontentloaded"&&e?.readyState==="interactive"}function Pp(e,l){if(e.method!=="onCDPEvent"||!br(e.params))return null;let v=e.params.source;if(!br(v)||v.tabId!==l)return null;return{method:cs(e.params.method)}}function cs(e){return typeof e==="string"?e:void 0}import{createHash as Cp}from"crypto";function Ul(e,l,v,D){let M=JSON.stringify([e.trim().toLowerCase(),l.trim().toLowerCase(),v,D]);return`reason-cloud-${Cp("sha256").update(M).digest("hex")}`}import{AsyncLocalStorage as _h}from"async_hooks";import{isDeepStrictEqual as yd}from"util";import{createHash as bh}from"crypto";var Ap=/#w=(\d{1,5})&h=(\d{1,5})$/;function Fl(e){return typeof e==="number"&&Number.isInteger(e)&&e>0&&e<=32768?e:void 0}function jl(e){let l=Ap.exec(e);if(!l)return;let v=Fl(Number(l[1])),D=Fl(Number(l[2]));return v&&D?{width:v,height:D}:void 0}var ql="[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}",xp=new RegExp(`^/media/pr-screenshots/(${ql})/(${ql})/([a-z0-9][a-z0-9._-]*)\\.(png|jpe?g|gif|webp|webm|mp4)$`,"i");var Ip=new Set(["png","jpg","jpeg","gif","webp"]),Op=new Set(["webm","mp4"]);function Dp(e){if(!e)return null;try{return new URL(e).origin}catch{return null}}function Mp(e){let l=jl(e);return Boolean(l&&e===`#w=${l.width}&h=${l.height}`)}function zl(e,l){let v;try{v=new URL(e)}catch{return null}let D=Dp(l),M=v.hostname==="ara.so"||v.hostname.endsWith(".ara.so")||v.hostname==="reasonmachines.ai"||v.hostname.endsWith(".reasonmachines.ai")||v.hostname==="reasonmachines.com"||v.hostname.endsWith(".reasonmachines.com");if(v.protocol!=="https:"||!M&&v.origin!==D||v.username||v.password||v.port||v.search||v.hash&&!Mp(v.hash))return null;let L=xp.exec(v.pathname);if(!L)return null;let z=L[1]?.toLowerCase(),re=L[2]?.toLowerCase(),G=L[3]?.toLowerCase(),ne=L[4]?.toLowerCase();if(!z||!re||!G||!ne)return null;let fe=Ip.has(ne)?"image":Op.has(ne)?"video":null;if(!fe)return null;let te=/^(before|after)[\s:_-]+/.exec(G),X=v.pathname.replace(/^\/media\//,"");return{url:v.toString(),storagePath:X,runId:z,artifactId:re,fileName:`${G}.${ne}`,kind:fe,phase:te?.[1]==="before"||te?.[1]==="after"?te[1]:null}}var Tp=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,Ai=(e)=>Boolean(e&&typeof e==="object"&&!Array.isArray(e)),_n=()=>{throw Error("cloud_browser_media_request_invalid")};function xi(e){if(!Ai(e)||Object.keys(e).some((L)=>!["runId","configuredMediaOrigin","media"].includes(L))||typeof e.runId!=="string"||!Tp.test(e.runId)||typeof e.configuredMediaOrigin!=="string"||e.configuredMediaOrigin.length>2048||!Array.isArray(e.media)||e.media.length<1||e.media.length>8)return _n();let l;try{l=new URL(e.configuredMediaOrigin)}catch{return _n()}if(l.protocol!=="https:"||l.username||l.password||l.port||!Mt(l.origin,{mode:"public_web"}).allowed)return _n();let v=e.runId.toLowerCase(),D=new Set,M=e.media.map((L)=>{if(!Ai(L)||Object.keys(L).some((re)=>!["url","sourceUrl","kind"].includes(re))||typeof L.url!=="string"||L.url.length>2048||typeof L.sourceUrl!=="string"||L.sourceUrl.length>8192||!["image","video"].includes(String(L.kind)))return _n();let z=zl(L.url,l.origin);if(!z||new URL(z.url).origin!==l.origin||z.runId!==v||z.kind!==L.kind||z.url!==L.url||D.has(L.url))return _n();if(D.add(L.url),L.sourceUrl!==L.url){let re;try{re=new URL(L.sourceUrl)}catch{return _n()}let G=/^\/(?:[a-f0-9]{40}|[a-f0-9]{64})\/([a-f0-9]+)$/.exec(re.pathname)?.[1];if(L.kind!=="image"||re.origin!=="https://camo.githubusercontent.com"||re.username||re.password||re.search||re.hash||!G||G.length%2!==0||Buffer.from(G,"hex").toString("utf8")!==L.url)return _n()}return{url:L.url,sourceUrl:L.sourceUrl,kind:L.kind}});return{runId:e.runId,configuredMediaOrigin:l.origin,media:M}}function Kl(e,l){let v=()=>{throw Error("cloud_browser_media_verification_failed")};if(!Ai(e)||e.verified!==!0||!Array.isArray(e.items)||e.items.length!==l.media.length)return v();return{verified:!0,items:e.items.map((M,L)=>{let z=l.media[L];if(!Ai(M)||M.url!==z.url||M.sourceUrl!==z.sourceUrl||M.kind!==z.kind||typeof M.sourceSha256!=="string"||!/^[a-f0-9]{64}$/.test(M.sourceSha256)||!Number.isSafeInteger(M.width)||!Number.isSafeInteger(M.height)||Number(M.width)<1||Number(M.height)<1||Number(M.width)>16384||Number(M.height)>16384||z.kind==="video"&&(typeof M.advancedSeconds!=="number"||!Number.isFinite(M.advancedSeconds)||M.advancedSeconds<0.05||M.advancedSeconds>30))return v();return{...z,width:Number(M.width),height:Number(M.height),sourceSha256:M.sourceSha256,...z.kind==="video"?{advancedSeconds:M.advancedSeconds}:{}}})}}var us="browser.pr-proof.v1",Dt=t().uuid(),$n=t().regex(/^[a-f0-9]{64}$/),vn=I.datetime({precision:3}),ds=t().regex(/^[a-zA-Z0-9_-]{1,160}$/),Gl=t().max(2048).regex(/^https:\/\/github\.com\/[A-Za-z0-9_-]+\/[A-Za-z0-9_.-]+\/pull\/[1-9][0-9]*$/).refine((e)=>![".",".."].includes(e.split("/")[4])),ur=n({kind:i("primary_mac"),version:i(1),organizationId:ds,userId:ds,sessionId:ds,runId:Dt,deviceId:Dt,rootId:Dt,rootRevision:t().min(1).max(64),binding:c(["workspace_source","mcp_control"]),targetRevision:o().int().nonnegative(),generation:Dt,profile:t().regex(/^(Default|Profile [0-9]+)$/),extensionInstanceId:t().min(1).max(1024)}).strict().refine((e)=>e.binding!=="workspace_source"||e.targetRevision===0),Lp=Yi().transform((e,l)=>{try{return ho(e)}catch{return l.addIssue({code:"custom",message:"proof_visual_contract_invalid"}),Jc}}),Bn=n({version:i(1),owner:ur,contextId:Dt,preparedAt:vn,expiresAt:vn,prUrl:Gl,headSha:t().regex(/^[a-f0-9]{40}$/),skillDigest:$n,evidenceKind:c(["image","video"]),visualPlan:Lp.optional(),uploadOrigin:t().url().refine((e)=>{let l=new URL(e);return l.protocol==="https:"&&l.origin===e&&!l.username&&!l.password}).optional()}).strict().refine((e)=>Date.parse(e.expiresAt)>Date.parse(e.preparedAt)&&Date.parse(e.expiresAt)-Date.parse(e.preparedAt)<=300000),fs=n({version:i(1),producer:i("primary_mac"),context:Bn,captureId:Dt,operationId:Dt,attemptId:Dt,tabId:o().int().positive(),startedAt:vn,finishedAt:vn,sha256:$n,media:P("contentType",[n({contentType:i("image/png"),sizeBytes:o().int().min(24).max(8388608),width:o().int().min(1).max(4096),height:o().int().min(1).max(4096)}).strict(),n({contentType:i("video/webm"),sizeBytes:o().int().min(128).max(10485760),durationSeconds:o().min(0.05).max(15),frameCount:o().int().min(1).max(450),receivedFrameCount:o().int().min(1).max(2000)}).strict()])}).strict().superRefine((e,l)=>{let v=Date.parse(e.startedAt),D=Date.parse(e.finishedAt);if(v<Date.parse(e.context.preparedAt)||D<v||D>Date.parse(e.context.expiresAt)||D-v>30000||e.media.contentType==="video/webm"&&(e.media.receivedFrameCount<e.media.frameCount||Math.abs((D-v)/1000-e.media.durationSeconds)>0.1))l.addIssue({code:"custom",message:"mac_pr_proof_capture_chronology_invalid"})}),ov=P("action",[n({action:i("screenshot"),context_id:Dt,tab_id:o().int().positive()}).strict(),n({action:i("start_video"),context_id:Dt,tab_id:o().int().positive(),seconds:o().int().min(1).max(15)}).strict(),n({action:i("stop_video"),recording_operation_id:Dt}).strict()]),Oi=n({login:t().regex(/^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?$/),id:t().regex(/^[1-9][0-9]{0,19}$/).nullable()}).strict(),Ii=t().regex(/^[1-9][0-9]{0,19}$/),Oo=n({version:i(1),owner:ur,expectedActorId:Ii.nullable(),repositoryId:Ii,repositoryFullName:t().max(200).regex(/^[A-Za-z0-9_-]+\/[A-Za-z0-9_.-]+$/).refine((e)=>![".",".."].includes(e.split("/")[1]))}).strict(),Wp=["browser_unavailable","github_page_unavailable","identity_check_failed","operation_incomplete","attachment_unavailable"],ms=P("status",[Oo.extend({status:i("ready"),observedActor:Oi,checkedAt:vn}),Oo.extend({status:i("not_ready"),reason:c(["authentication_required","identity_mismatch","authority_lost","unavailable"]),cause:c(Wp).optional()})]).refine((e)=>e.status!=="ready"||e.expectedActorId===null||e.observedActor.id===e.expectedActorId),bn=n({version:i(1),owner:ur,expectedActorId:Ii.nullable(),authenticatedActor:Oi,attemptId:Dt,captureId:Dt,prUrl:Gl,repositoryId:Ii,headSha:t().regex(/^[a-f0-9]{40}$/),sha256:$n,sizeBytes:o().int().min(128).max(10485760),contentType:i("video/webm")}).strict(),Yl=t().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}$/),Un=P("status",[bn.extend({status:i("not_attempted"),reason:c(["authentication_required","attachment_unavailable","identity_mismatch","capture_invalid","authority_lost"])}),bn.extend({status:i("uncertain"),reason:i("upload_outcome_unknown")}),bn.extend({status:i("uploaded"),observedActor:Oi,nativeUrl:Yl,uploadedAt:vn})]).refine((e)=>(e.expectedActorId===null||e.authenticatedActor.id===e.expectedActorId)&&(e.status!=="uploaded"||e.observedActor.id===e.authenticatedActor.id&&e.observedActor.login===e.authenticatedActor.login)),Do=bn.extend({nativeUrl:Yl,observedActor:Oi,bodySha256:$n}),ps=P("status",[Do.extend({status:i("incomplete"),reason:c(["authentication_required","identity_mismatch","playback_unverified","authority_lost"])}),Do.extend({status:i("verified"),sourceSha256:$n,width:o().int().min(1).max(4096),height:o().int().min(1).max(4096),durationSeconds:o().positive().max(30),advancedSeconds:o().min(0.05).max(10),advancedFrames:o().int().positive(),playbackRestored:i(!0),verifiedAt:vn})]).refine((e)=>(e.expectedActorId===null||e.authenticatedActor.id===e.expectedActorId)&&e.observedActor.id===e.authenticatedActor.id&&e.observedActor.login===e.authenticatedActor.login&&(e.status!=="verified"||e.sourceSha256===e.sha256)),Np=Yi().transform((e,l)=>{try{let v=xi(e);if(v.media.some((D)=>D.kind!=="image"))throw Error();return v}catch{return l.addIssue({code:"custom",message:"proof_media_request_invalid"}),Jc}}),Hp=P("action",[n({action:i("auth_check"),input:Oo}).strict(),n({action:i("prepare"),context:Bn}).strict(),n({action:i("capture_png"),owner:ur,contextId:Dt,tabId:o().int().positive()}).strict(),n({action:i("start_video"),owner:ur,contextId:Dt,tabId:o().int().positive(),seconds:o().int().min(1).max(15)}).strict(),n({action:i("inspect_capture"),owner:ur,captureId:Dt}).strict(),n({action:i("publish_video"),input:bn}).strict(),n({action:i("verify_png_media"),owner:ur,media:Np}).strict().refine((e)=>e.media.runId===e.owner.runId),n({action:i("verify_saved_media"),input:Do}).strict(),n({action:i("publish_png"),owner:ur,attemptId:Dt,captureId:Dt,sha256:$n,sizeBytes:o().int().min(24).max(8388608),storagePath:t().max(512),uploadUrl:t().url().max(8192)}).strict()]);var Xl="pr-proof.stop.v1",hs=n({requestId:Dt,command:Hp}).strict();var $p={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},Vl={type:"string",format:"uuid",description:"capture_context_id from tools.pr.prepareProof."},Jl={type:"integer",minimum:1,description:"An already-owned tab's id."},iv={...$p,oneOf:[{type:"object",required:["action","context_id","tab_id"],additionalProperties:!1,properties:{action:{type:"string",const:"screenshot"},context_id:Vl,tab_id:Jl}},{type:"object",required:["action","context_id","tab_id","seconds"],additionalProperties:!1,properties:{action:{type:"string",const:"start_video"},context_id:Vl,tab_id:Jl,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 Bp,randomUUID as Up}from"crypto";import{isDeepStrictEqual as Fn}from"util";var Zl=n({operationId:t().uuid(),attemptId:t().uuid(),contextId:t().uuid(),tabId:o().int().positive()}).strict(),_t=()=>Error("mac_pr_proof_capture_unavailable"),gs=(e)=>Bp("sha256").update(e).digest("hex");function Ql(e){let l=ur.parse(e.owner),v=new Map,D=new Map,M=!1,L=async()=>{if(M)throw _t();if(await e.assertCurrent(),M)throw _t()},z=(X)=>{let le=v.get(X);if(!le||Date.parse(le.expiresAt)<=Date.now())throw _t();return le},re=(X)=>X.disposal??=(async()=>{X.controller.abort(),X.bytes?.fill(0),X.bytes=void 0,X.receipt=void 0;try{await X.host?.close()}catch{throw M=!0,_t()}})(),G=async()=>{for(let[X,le]of v){if(Date.parse(le.expiresAt)>Date.now())continue;let be=[...D.entries()].filter(([,Re])=>Re.claim.contextId===X);if((await Promise.allSettled(be.map(([,Re])=>re(Re)))).some((Re)=>Re.status==="rejected"))throw _t();for(let[Re]of be)D.delete(Re);v.delete(X)}},ne=setInterval(()=>{G().catch(()=>{M=!0})},1000);ne.unref();let fe=(X)=>{if(X.stopRequested=!0,X.started&&X.host&&!X.stop)X.stop=X.host.stop(),X.stop.catch(()=>X.controller.abort())};async function te(X,le){let be=Zl.parse(X.claim);if(le==="video"&&(!Number.isInteger(X.seconds)||X.seconds<1||X.seconds>15))throw _t();await L(),X.signal.throwIfAborted(),await G();let ke=z(be.contextId);if(le==="video"&&ke.evidenceKind!=="video")throw _t();let Re=D.get(be.operationId);if(Re){if(!Fn(Re.claim,be)||Re.kind!==le||Re.seconds!==X.seconds||Re.controller.signal.aborted)throw _t();let Ne=await Re.completion;if(await L(),z(be.contextId),Re.controller.signal.aborted)throw _t();return structuredClone(Ne)}if(D.size>=16||[...D.values()].some((Ne)=>!Ne.receipt&&!Ne.controller.signal.aborted&&Ne.claim.tabId===be.tabId))throw _t();let Oe,Me,Ee=new Promise((Ne,Ce)=>{Oe=Ne,Me=Ce});Ee.catch(()=>{});let Te={claim:be,kind:le,seconds:X.seconds,controller:new AbortController,completion:Ee,stopRequested:!1,started:!1};D.set(be.operationId,Te);let We=()=>{re(Te).catch(()=>{})};X.signal.addEventListener("abort",We,{once:!0});let $e=async()=>{await L(),z(be.contextId),X.signal.throwIfAborted(),Te.controller.signal.throwIfAborted()},Ue;try{await $e();let Ne;if(le==="image"){let Ce=new Date().toISOString();Ue=await e.screenshot(structuredClone(ke),be.tabId,Te.controller.signal);let Le=new Date().toISOString();if(await $e(),Ue.length<24||Ue.length>8388608||!Ue.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))||Ue.readUInt32BE(8)!==13||Ue.toString("ascii",12,16)!=="IHDR")throw _t();Ne=fs.parse({version:1,producer:"primary_mac",context:ke,captureId:Up(),operationId:be.operationId,attemptId:be.attemptId,tabId:be.tabId,startedAt:Ce,finishedAt:Le,sha256:gs(Ue),media:{contentType:"image/png",sizeBytes:Ue.length,width:Ue.readUInt32BE(16),height:Ue.readUInt32BE(20)}})}else{if(Te.host=await e.createVideo(structuredClone(ke),be.tabId,X.seconds,Te.controller.signal),Te.controller.signal.aborted||X.signal.aborted||M)throw await Te.host.close(),_t();await Te.host.start(),Te.started=!0;let Ce=Te.host.completed();if(Ce.catch(()=>{}),await $e(),await X.started?.(),Te.stopRequested)fe(Te);let Le=await Ce;if(Te.stop)await Te.stop;await $e();let Ge=await Te.host.read(Le.captureId);Ue=Ge.bytes;let Ve={runId:l.runId,deviceId:l.deviceId,rootId:l.rootId,rootRevision:l.rootRevision,generation:l.generation,profile:l.profile,extensionInstanceId:l.extensionInstanceId,browserScope:e.browserScope,tabId:be.tabId};if(!Fn(Le,Ge.capture)||!Fn(Le.owner,Ve)||Ue.length!==Le.sizeBytes||gs(Ue)!==Le.sha256||Ue.length<128||Ue.readUInt32BE(0)!==440786851)throw _t();await Te.host.close(),await $e(),Ne=fs.parse({version:1,producer:"primary_mac",context:ke,captureId:Le.captureId,operationId:be.operationId,attemptId:be.attemptId,tabId:be.tabId,startedAt:Le.startedAt,finishedAt:Le.finishedAt,sha256:Le.sha256,media:{contentType:"video/webm",sizeBytes:Le.sizeBytes,durationSeconds:Le.durationSeconds,frameCount:Le.frameCount,receivedFrameCount:Le.receivedFrameCount}})}if(await $e(),[...D.values()].reduce((Ce,Le)=>Ce+(Le.bytes?.length??0),Ue.length)>20971520)throw _t();return Te.bytes=Buffer.from(Ue),Te.receipt=Ne,Oe(Ne),structuredClone(Ne)}catch(Ne){let Ce=le==="video"&&!X.signal.aborted&&!Te.controller.signal.aborted&&Ne instanceof Error&&Ne.message==="mac_recording_worker_failed:no_frames"?new r("proof_capture_no_frames","The owned tab emitted no recording frames."):_t();throw await re(Te).catch(()=>{}),Me(Ce),Ce}finally{Ue?.fill(0),X.signal.removeEventListener("abort",We)}}return{async prepare(X){let le=Bn.parse(X);if(!Fn(le.owner,l))throw _t();if(await L(),await G(),Date.parse(le.preparedAt)>Date.now()||Date.parse(le.expiresAt)<=Date.now())throw _t();let be=v.get(le.contextId);if(be){if(!Fn(be,le))throw _t();return structuredClone(be)}if(v.size>=4)throw _t();return v.set(le.contextId,le),structuredClone(le)},screenshot:(X)=>te(X,"image"),record:(X)=>te(X,"video"),async stop(X){let le=Zl.parse(X);await L(),z(le.contextId);let be=D.get(le.operationId);if(!be||be.kind!=="video"||!Fn(le,be.claim)||be.controller.signal.aborted)throw _t();fe(be)},async publicationCapture(X){await L(),await G();let le=[...D.values()].find((be)=>be.receipt?.captureId===X);if(!le?.receipt||!le.bytes||le.controller.signal.aborted)throw _t();if(z(le.claim.contextId),le.bytes.length!==le.receipt.media.sizeBytes||gs(le.bytes)!==le.receipt.sha256)throw _t();return{capture:structuredClone(le.receipt),bytes:Buffer.from(le.bytes)}},async inspect(X){await L(),await G();let le=[...D.values()].find((be)=>be.receipt?.captureId===X);if(!le?.receipt||le.controller.signal.aborted)throw _t();return z(le.claim.contextId),structuredClone(le.receipt)},async close(){M=!0,clearInterval(ne);let X=await Promise.allSettled([...D.values()].map(re));if(D.clear(),v.clear(),X.some((le)=>le.status==="rejected"))throw _t()}}}import{createHash as nd,randomUUID as Yp}from"crypto";import{isDeepStrictEqual as Mo}from"util";import{realpath as Xp}from"fs/promises";var ed=String.raw`async (media) => {
|
|
27
27
|
const deadline = (promise) => {
|
|
28
28
|
let timer;
|
|
29
29
|
return Promise.race([promise, new Promise((_, reject) => {
|
|
@@ -70,25 +70,25 @@ ${l?.directory??p(e)}`).digest("hex")}function co(e,l){y(Xt(p(e),lo),{version:1,
|
|
|
70
70
|
}
|
|
71
71
|
}));
|
|
72
72
|
return { verified: true, items };
|
|
73
|
-
}`;var td=function(e){let l=this??globalThis,v=10485760,D=(z,re)=>{if(l.location.origin!=="https://github.com")return{ok:!1,reason:"identity_mismatch"};let G=l.document.querySelector('meta[name="user-login"]')?.getAttribute("content");if(!G&&(l.location.href===z.prUrl||/^\/(?:login|session)(?:[/?]|$)/.test(l.location.pathname)))return{ok:!1,reason:"authentication_required"};if(l.location.href!==z.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 ce=l.document.querySelector('meta[name="octolytics-actor-id"]')?.getAttribute("content"),we=/^[1-9][0-9]{0,19}$/.test(ce||"")?ce:null,te={login:G,id:we};if(z.expectedActorId!==null&&we!==z.expectedActorId||z.authenticatedActor&&(G!==z.authenticatedActor.login||we!==z.authenticatedActor.id)||z.observedActor&&(G!==z.observedActor.login||we!==z.observedActor.id)||l.document.querySelector('meta[name="octolytics-dimension-repository_id"]')?.getAttribute("content")!==z.repositoryId)return{ok:!1,reason:"identity_mismatch"};let X=l.document.querySelector('link[rel="canonical"]');if(X&&X.href!==z.prUrl)return{ok:!1,reason:"identity_mismatch"};if(re){let he=l.document.querySelector("#new_comment_field"),Se=l.document.querySelector("#fc-new_comment_field"),Re=he?.closest("file-attachment"),Ee=he?.closest("form"),Oe=new l.URL(z.prUrl).pathname+"/comment";if(!he||he.value!==""||!Se||Se.type!=="file"||Se.disabled||!Re||Re.getAttribute("input")!==Se.id||Re.getAttribute("data-upload-repository-id")!==z.repositoryId||!Ee||new l.URL(Ee.action,l.location.href).origin!=="https://github.com"||new l.URL(Ee.action,l.location.href).pathname!==Oe)return{ok:!1,reason:"attachment_unavailable"};let Me=Re.getAttribute("data-upload-policy-url");if(!Me||new l.URL(Me,l.location.href).href!=="https://github.com/upload/policies/assets")return{ok:!1,reason:"attachment_unavailable"}}return{ok:!0,actor:te}};if(e.operation==="preflight")return D(e.expected,!1);if(e.operation==="identity")return D(e.expected,!0);if(e.operation==="upload"){let z=e.expected,re=D(z,!0);if(!re.ok)return{dispatched:!1,reason:re.reason};let G=l.Uint8Array.from(l.atob(e.base64||""),(X)=>X.charCodeAt(0));if(G.length!==z.sizeBytes||G.length>10485760)return{dispatched:!1,reason:"capture_invalid"};let ce=new l.File([G],z.captureId+".webm",{type:"video/webm"}),we=new l.DataTransfer;we.items.add(ce);let te=l.document.querySelector("#fc-new_comment_field");if(!te)return{dispatched:!1,reason:"attachment_unavailable"};return te.files=we.files,te.dispatchEvent(new l.Event("change",{bubbles:!0})),{dispatched:!0,actor:re.actor}}if(e.operation==="upload_result"){let z=D(e.expected,!1);if(!z.ok)throw Error("github_video_identity_changed");let re=l.document.querySelector("#new_comment_field")?.value?.trim(),G="["+e.expected.captureId+".webm](",ce=re?.startsWith(G)&&re.endsWith(")")?re.slice(G.length,-1):re;if(!ce||!/^https:\/\/github\.com\/user-attachments\/assets\/[0-9a-f-]{36}$/.test(ce))return null;return{nativeUrl:ce,actor:z.actor}}let M=e.expected,L=D(M,!1);if(!L.ok)return{status:"incomplete",reason:L.reason};return(async()=>{let z=M.nativeUrl.split("/").pop(),re=(Oe)=>{try{let Me=new l.URL(Oe,l.location.href);if(Me.protocol!=="https:"||Me.username||Me.password||Me.port||Me.hash)return!1;if(Me.origin==="https://github.com")return Me.href===M.nativeUrl;return["private-user-images.githubusercontent.com","user-images.githubusercontent.com"].includes(Me.hostname)&&new RegExp("/[0-9]+/[0-9]+-"+z+"\\.(webm|mp4)$").test(Me.pathname)}catch{return!1}},G=[...l.document.querySelectorAll('[id^="issue-"] .js-comment-body')].filter((Oe)=>/^issue-[1-9][0-9]*$/.test(Oe.closest('[id^="issue-"]')?.id||"")&&!Oe.closest("form")&&!Oe.closest(".preview-content"));if(G.length!==1)throw Error("saved_body_missing");let ce=G[0],we=[...ce.querySelectorAll("video")].filter((Oe)=>[Oe.currentSrc,Oe.src,...[...Oe.querySelectorAll("source")].map((Me)=>Me.src)].some(re));if(we.length!==1)throw Error("saved_player_missing");let te=we[0],X={muted:te.muted,volume:te.volume,rate:te.playbackRate,preload:te.preload},he=new l.AbortController,Se=l.setTimeout(()=>he.abort(),12000),Re=(Oe)=>l.Promise.race([Oe,new l.Promise((Me,Ce)=>{if(he.signal.aborted)Ce(Error("playback_timeout"));else he.signal.addEventListener("abort",()=>Ce(Error("playback_timeout")),{once:!0})})]),Ee=async(Oe)=>{while(!Oe()){if(te.error||he.signal.aborted)throw Error("playback_unverified");await new l.Promise((Me)=>l.setTimeout(Me,25))}};try{if(te.muted=!0,te.playbackRate=1,te.currentTime=0,te.readyState<2)te.preload="auto",te.load();await Ee(()=>te.readyState>=2&&te.videoWidth>0&&te.videoHeight>0);let Oe=te.currentSrc;if(!re(Oe))throw Error("source_unbound");let Me=await Re(l.fetch(Oe,{credentials:"same-origin",redirect:"error",signal:he.signal}));if(Me.status!==200||!re(Me.url)||Me.headers.get("content-range")||!/^video\/webm(?:;|$)/i.test(Me.headers.get("content-type")||"")||!Me.body)throw Error("source_unverifiable");let Ce=Me.headers.get("content-length");if(Ce!==null&&(!/^[1-9][0-9]*$/.test(Ce)||Number(Ce)!==M.sizeBytes))throw Error("source_size_mismatch");let Te=Me.body.getReader(),We=[],$e=0;try{for(;;){let Je=await Re(Te.read());if(Je.done)break;if($e+=Je.value.length,$e>10485760||$e>M.sizeBytes)throw Error("source_too_large");We.push(Je.value)}}finally{await Te.cancel().catch(()=>{}),Te.releaseLock()}if($e!==M.sizeBytes)throw Error("source_size_mismatch");let Ue=new l.Uint8Array($e),Ne=0;for(let Je of We)Ue.set(Je,Ne),Ne+=Je.length;let xe=[...new l.Uint8Array(await Re(l.crypto.subtle.digest("SHA-256",Ue)))].map((Je)=>Je.toString(16).padStart(2,"0")).join("");if(xe!==M.sha256||te.currentSrc!==Oe||!ce.contains(te))throw Error("source_changed");let Le=te.currentTime,Ge=te.getVideoPlaybackQuality().totalVideoFrames;if(await Re(te.play()),await Ee(()=>te.currentTime-Le>=0.05&&te.getVideoPlaybackQuality().totalVideoFrames>Ge),!D(M,!1).ok||te.currentSrc!==Oe||!ce.contains(te)||te.error)throw Error("player_changed");return{status:"verified",sourceSha256:xe,width:te.videoWidth,height:te.videoHeight,durationSeconds:te.duration,advancedSeconds:te.currentTime-Le,advancedFrames:te.getVideoPlaybackQuality().totalVideoFrames-Ge,playbackRestored:!0}}finally{if(l.clearTimeout(Se),he.abort(),te.pause(),te.currentTime=0,te.muted=X.muted,te.volume=X.volume,te.playbackRate=X.rate,te.preload=X.preload,!te.paused||te.currentTime!==0)throw Error("playback_restore_failed")}})()};import{execFile as Fp}from"child_process";import{lstat as jp,realpath as qp}from"fs/promises";import{join as rd,resolve as zp}from"path";import{promisify as Kp}from"util";var Vp=Kp(Fp);async function Jp(e,l){let v=await qp(e),{stdout:D}=await Vp(rd(v,"reason-browser-use"),["profiles","--connected","--json"],{timeout:5000,maxBuffer:65536,signal:l});return d(n({browser:t(),directory:t(),connected:_().optional(),source:t(),socketPath:t().optional(),instanceId:t().optional(),extensionId:t().regex(/^[a-p]{32}$/)})).max(256).parse(JSON.parse(D)).filter((L)=>L.browser==="chrome"&&L.connected===!0&&/^(Default|Profile [0-9]+)$/.test(L.directory)&&zp(L.source)===rd(v,"Reason Browser Use","manifest.json"))}async function Di(e,l,v){if(!/^(Default|Profile [0-9]+)$/.test(l))throw Error("mac_recording_profile_unavailable");let D=(await Jp(e,v)).filter((z)=>z.directory===l),M=D[0];if(D.length!==1||!M?.socketPath||!M.instanceId)throw Error("mac_recording_profile_unavailable");let L=await jp(M.socketPath);if(!L.isSocket()||L.uid!==process.getuid?.()||L.mode&63)throw Error("mac_recording_socket_invalid");return{socketPath:M.socketPath,instanceId:M.instanceId,extensionId:M.extensionId}}import{createHash as Gp}from"crypto";function jn(e){return`reason-browser-${Gp("sha256").update(`reason:mac-browser:v1:${e}`).digest("hex")}`}var od=P("ok",[n({ok:i(!0),actor:n({login:t(),id:t().nullable()}).strict()}).strict(),n({ok:i(!1),reason:c(["authentication_required","identity_mismatch","attachment_unavailable"])}).strict()]),id=n({version:i("0.1.42"),metadata:n({extensionId:t(),extensionInstanceId:t(),nativeHostName:t()})}),ht=()=>Error("mac_pr_proof_browser_unavailable");async function ws(e){let l=ur.parse(e.owner),v="endpoint"in e?e.endpoint(l):await Zp(e.automationDirectory,l),D=new Map,M=`reason-pr-proof-${Yp()}`,L=!1,z=async()=>{if(L)throw ht();if(await e.assertCurrent(),L)throw ht()},re=async(we)=>{if(!Mo(l,we.owner))throw ht();await z()},G=async(we)=>{await re(we);let te=await e.readVideo(we.captureId);try{await z();let X=te.capture;if(!Mo(X.context.owner,l)||X.captureId!==we.captureId||X.context.prUrl!==we.prUrl||X.context.headSha!==we.headSha||X.media.contentType!=="video/webm"||X.media.sizeBytes!==we.sizeBytes||X.sha256!==we.sha256||te.bytes.length!==we.sizeBytes||te.bytes.length<128||te.bytes.length>10485760||te.bytes.readUInt32BE(0)!==440786851||nd("sha256").update(te.bytes).digest("hex")!==we.sha256)throw ht();return te}catch(X){throw te.bytes.fill(0),X}};async function ce(we,te,X){await z();let he=await v.discover(AbortSignal.timeout(5000)),Se=new Ci({socketPath:he.socketPath,sessionId:M,timeoutMs:5000}),Re,Ee=!1,Oe,Me=new Promise((We,$e)=>{Oe=setTimeout(()=>{Ee=!0,$e(ht())},60000)});Me.catch(()=>{});let Ce=(We)=>Promise.race([We,Me]),Te=async()=>{if(Ee)throw ht();if(await z(),Ee)throw ht()};try{await Ce(Se.connect());let We=id.parse(await Ce(Se.client.getInfo()));if(We.metadata.extensionId!==he.extensionId||We.metadata.extensionInstanceId!==he.instanceId||!We.metadata.nativeHostName)throw ht();await Te(),X?.("connected");let $e=Se.newTab();$e.then((xe)=>{if(Ee)xe.close().catch(()=>{L=!0})},()=>{}),Re=await Ce($e),await Te(),await Ce(Re.goto(we,{waitUntil:"domcontentloaded",timeoutMs:15000})),await Te(),X?.("loaded");let Ne=await Ce(te(Re,async(xe)=>{await Te();let Le=await Ce(Re.evaluate(`(${td.toString()})(${JSON.stringify(xe)})`,{awaitPromise:!0}));return await Te(),Le},Te));return await Te(),Ne}finally{Ee=!0,clearTimeout(Oe);try{if(Re){let We;try{await Promise.race([Re.close(),new Promise(($e,Ue)=>{We=setTimeout(()=>Ue(ht()),5000)})])}finally{clearTimeout(We)}}}catch{throw L=!0,ht()}finally{Se.close()}await z()}}return{async screenshot(we,te,X){let he=Bn.parse(we);if(await re(he),!Number.isSafeInteger(te)||te<1||Date.parse(he.expiresAt)<=Date.now())throw ht();X.throwIfAborted();let Se=await v.discover(X),Re=new Ci({socketPath:Se.socketPath,sessionId:v.tabScope,timeoutMs:5000}),Ee;try{await Re.connect();let Oe=id.parse(await Re.client.getInfo());if(Oe.metadata.extensionId!==Se.extensionId||Oe.metadata.extensionInstanceId!==Se.instanceId)throw ht();if(!d(n({id:o()})).max(256).parse(await Re.getTabs()).some((Te)=>Te.id===te))throw ht();await z(),X.throwIfAborted();let Ce=n({data:t().max(Math.ceil(2796202.6666666665)*4)}).strict().parse(await Re.cdp.call(te,"Page.captureScreenshot",{format:"png",fromSurface:!0,captureBeyondViewport:!1}));if(!/^[A-Za-z0-9+/]+={0,2}$/.test(Ce.data)||Ce.data.length%4)throw ht();if(Ee=Buffer.from(Ce.data,"base64"),Ee.toString("base64")!==Ce.data||Ee.length>8388608)throw ht();if(await z(),X.throwIfAborted(),Date.parse(he.expiresAt)<=Date.now())throw ht();return Ee}catch{throw Ee?.fill(0),ht()}finally{Re.close()}},async verifyImages(we){let te=xi(we);if(te.runId!==l.runId||te.media.some((X)=>X.kind!=="image"))throw ht();return ce("about:blank",async(X,he,Se)=>{let Re=X.browser.client,Ee=new Set(te.media.map((xe)=>xe.sourceUrl)),Oe=new Map,Me=new Set,Ce=!1,Te=0,We=!1,$e=new Set,Ue=(xe,Le)=>{if($e.size>=32){Ce=!0;return}let Ge=Re.executeCdp(X.id,xe,Le);$e.add(Ge),Ge.catch(()=>{Ce=!0}).finally(()=>$e.delete(Ge))},Ne=Re.onNotification((xe)=>{if(xe.method!=="onCDPEvent"||!q(xe.params)||!q(xe.params.source)||xe.params.source.tabId!==X.id||!q(xe.params.params))return;let Le=xe.params.params;if(++Te>512){Ce=!0;return}if(xe.params.method==="Fetch.requestPaused"){let Je=typeof Le.requestId==="string"&&q(Le.request)&&Le.request.method==="GET"&&typeof Le.request.url==="string"&&Ee.has(Le.request.url)&&Le.resourceType==="Image";if(typeof Le.requestId!=="string"){Ce=!0;return}if(!Je)Ce=!0;Ue(Je?"Fetch.continueRequest":"Fetch.failRequest",{requestId:Le.requestId,...Je?{}:{errorReason:"BlockedByClient"}})}if(xe.params.method==="Network.requestWillBeSent"&&Le.redirectResponse)Ce=!0;if(xe.params.method==="Network.loadingFailed")Ce=!0;if(xe.params.method==="Network.loadingFinished"&&typeof Le.requestId==="string")Me.add(Le.requestId);if(xe.params.method!=="Network.responseReceived")return;if(!q(Le.response)||typeof Le.response.url!=="string"||!Ee.has(Le.response.url)||typeof Le.requestId!=="string"||!q(Le.response.headers)||Le.type!=="Image"){Ce=!0;return}let Ge=Object.fromEntries(Object.entries(Le.response.headers).map(([Je,it])=>[Je.toLowerCase(),it])),Ve=Number(Ge["content-length"]);if(Oe.has(Le.response.url)||Le.response.status!==200||Le.response.fromServiceWorker===!0||typeof Ge["content-length"]!=="string"||!/^[1-9][0-9]*$/.test(Ge["content-length"])||!Number.isSafeInteger(Ve)||Ve>8388608||Ge["content-range"]||Ge["content-encoding"]&&Ge["content-encoding"]!=="identity"){Ce=!0;return}Oe.set(Le.response.url,{id:Le.requestId,length:Ve})});try{await Re.executeCdp(X.id,"Network.enable",{maxTotalBufferSize:67108864,maxResourceBufferSize:8388608}),await Re.executeCdp(X.id,"Network.setBypassServiceWorker",{bypass:!0}),await Re.executeCdp(X.id,"Network.setCacheDisabled",{cacheDisabled:!0}),await Re.executeCdp(X.id,"Fetch.enable",{patterns:[{urlPattern:"*",requestStage:"Request"}]});let xe=n({frameTree:n({frame:n({id:t().min(1).max(256)})})}).parse(await Re.executeCdp(X.id,"Page.getFrameTree",{})),Le=[...new Set(te.media.map((Je)=>new URL(Je.sourceUrl).origin))].join(" ");await Re.executeCdp(X.id,"Page.setDocumentContent",{frameId:xe.frameTree.frame.id,html:`<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src ${Le}; style-src 'none'"><body></body>`}),await Se(),We=!0;try{await Re.executeCdp(X.id,"Emulation.setFocusEmulationEnabled",{enabled:!0})}catch{throw new r("mac_pr_proof_png_render_failed","mac_pr_proof_png_render_failed")}await Se();let Ge;try{Ge=await X.evaluate(`(${ed})(${JSON.stringify(te.media)})`,{awaitPromise:!0})}catch{throw new r("mac_pr_proof_png_decode_failed","mac_pr_proof_png_decode_failed")}if(await Se(),!q(Ge)||!Array.isArray(Ge.items)||Ge.items.length!==te.media.length)throw ht();await Promise.all($e);let Ve=[];for(let Je=0;Je<te.media.length;Je++){await z();let it=Oe.get(te.media[Je].sourceUrl);if(Ce||!it||!Me.has(it.id))throw ht();let Ye=n({base64Encoded:i(!0),body:t().max(Math.ceil(2796202.6666666665)*4)}).strict().parse(await Re.executeCdp(X.id,"Network.getResponseBody",{requestId:it.id})),Be=Buffer.from(Ye.body,"base64");try{let Ke=Ge.items[Je];if(Be.length!==it.length||Be.toString("base64")!==Ye.body||!q(Ke))throw ht();Ve.push({...Ke,sourceSha256:nd("sha256").update(Be).digest("hex")})}finally{Be.fill(0)}}if(Ce)throw ht();return Kl({verified:!0,items:Ve},te)}finally{if(Ne(),await Promise.allSettled($e),We)try{await Re.executeCdp(X.id,"Emulation.setFocusEmulationEnabled",{enabled:!1})}catch{throw new r("mac_pr_proof_png_render_cleanup_failed","mac_pr_proof_png_render_cleanup_failed")}}})},async preflight(we){let te=Oo.parse(we);await re(te);let X="browser_unavailable";try{return await ce(`https://github.com/${te.repositoryFullName}`,async(he,Se)=>{let Re=od.parse(await Se({operation:"preflight",expected:{...te,prUrl:`https://github.com/${te.repositoryFullName}`}}));return ms.parse(Re.ok?{...te,status:"ready",observedActor:Re.actor,checkedAt:new Date().toISOString()}:Re.reason==="attachment_unavailable"?{...te,status:"not_ready",reason:"unavailable",cause:"attachment_unavailable"}:{...te,status:"not_ready",reason:Re.reason})},(he)=>{X=he==="connected"?"github_page_unavailable":"identity_check_failed"})}catch{return ms.parse({...te,status:"not_ready",reason:"unavailable",cause:X})}},async publish(we){let te=bn.parse(we);if(await re(te),te.expectedActorId!==null&&te.authenticatedActor.id!==te.expectedActorId)throw ht();let X=D.get(te.attemptId);if(X){if(!Mo(X.binding,te))throw ht();return structuredClone(X.result)}if(D.size>=3)throw Error("proof_native_publication_limit");let he={binding:structuredClone(te),result:Un.parse({...te,status:"uncertain",reason:"upload_outcome_unknown"})};D.set(te.attemptId,he);let Se=!1,Re="dispatch";try{(await G(te)).bytes.fill(0),he.result=await ce(te.prUrl,async(Ee,Oe)=>{let Me=od.parse(await Oe({operation:"identity",expected:te}));if(!Me.ok)return Un.parse({...te,status:"not_attempted",reason:Me.reason});let Ce=await G(te),Te;try{Se=!0,Te=P("dispatched",[n({dispatched:i(!0),actor:n({login:t(),id:t().nullable()}).strict()}).strict(),n({dispatched:i(!1),reason:c(["authentication_required","identity_mismatch","attachment_unavailable","capture_invalid"])}).strict()]).parse(await Oe({operation:"upload",expected:te,base64:Ce.bytes.toString("base64")}))}finally{Ce.bytes.fill(0)}if(!Te.dispatched)return Se=!1,Un.parse({...te,status:"not_attempted",reason:Te.reason});if(!Mo(Te.actor,Me.actor))throw Re="actor_changed",ht();Re="result";let We=performance.now();while(performance.now()-We<30000){let $e=await Oe({operation:"upload_result",expected:{...te,observedActor:Me.actor}});if($e!==null){let Ue=n({nativeUrl:t(),actor:n({login:t(),id:t().nullable()}).strict()}).strict().parse($e);return Re="finalize",await z(),Un.parse({...te,status:"uploaded",nativeUrl:Ue.nativeUrl,observedActor:Ue.actor,uploadedAt:new Date().toISOString()})}await new Promise((Ue)=>setTimeout(Ue,100))}throw Re="result_timeout",ht()})}catch{if(Se)process.stderr.write(`Reason PR proof: video upload outcome unknown (stage=${Re})
|
|
74
|
-
`);
|
|
73
|
+
}`;var td=function(e){let l=this??globalThis,v=10485760,D=(z,re)=>{if(l.location.origin!=="https://github.com")return{ok:!1,reason:"identity_mismatch"};let G=l.document.querySelector('meta[name="user-login"]')?.getAttribute("content");if(!G&&(l.location.href===z.prUrl||/^\/(?:login|session)(?:[/?]|$)/.test(l.location.pathname)))return{ok:!1,reason:"authentication_required"};if(l.location.href!==z.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 ne=l.document.querySelector('meta[name="octolytics-actor-id"]')?.getAttribute("content"),fe=/^[1-9][0-9]{0,19}$/.test(ne||"")?ne:null,te={login:G,id:fe};if(z.expectedActorId!==null&&fe!==z.expectedActorId||z.authenticatedActor&&(G!==z.authenticatedActor.login||fe!==z.authenticatedActor.id)||z.observedActor&&(G!==z.observedActor.login||fe!==z.observedActor.id)||l.document.querySelector('meta[name="octolytics-dimension-repository_id"]')?.getAttribute("content")!==z.repositoryId)return{ok:!1,reason:"identity_mismatch"};let X=l.document.querySelector('link[rel="canonical"]');if(X&&X.href!==z.prUrl)return{ok:!1,reason:"identity_mismatch"};if(re){let le=l.document.querySelector("#new_comment_field"),be=l.document.querySelector("#fc-new_comment_field"),ke=le?.closest("file-attachment"),Re=le?.closest("form"),Oe=new l.URL(z.prUrl).pathname+"/comment";if(!le||le.value!==""||!be||be.type!=="file"||be.disabled||!ke||ke.getAttribute("input")!==be.id||ke.getAttribute("data-upload-repository-id")!==z.repositoryId||!Re||new l.URL(Re.action,l.location.href).origin!=="https://github.com"||new l.URL(Re.action,l.location.href).pathname!==Oe)return{ok:!1,reason:"attachment_unavailable"};let Me=ke.getAttribute("data-upload-policy-url");if(!Me||new l.URL(Me,l.location.href).href!=="https://github.com/upload/policies/assets")return{ok:!1,reason:"attachment_unavailable"}}return{ok:!0,actor:te}};if(e.operation==="preflight")return D(e.expected,!1);if(e.operation==="identity")return D(e.expected,!0);if(e.operation==="upload"){let z=e.expected,re=D(z,!0);if(!re.ok)return{dispatched:!1,reason:re.reason};let G=l.Uint8Array.from(l.atob(e.base64||""),(X)=>X.charCodeAt(0));if(G.length!==z.sizeBytes||G.length>10485760)return{dispatched:!1,reason:"capture_invalid"};let ne=new l.File([G],z.captureId+".webm",{type:"video/webm"}),fe=new l.DataTransfer;fe.items.add(ne);let te=l.document.querySelector("#fc-new_comment_field");if(!te)return{dispatched:!1,reason:"attachment_unavailable"};return te.files=fe.files,te.dispatchEvent(new l.Event("change",{bubbles:!0})),{dispatched:!0,actor:re.actor}}if(e.operation==="upload_result"){let z=D(e.expected,!1);if(!z.ok)throw Error("github_video_identity_changed");let re=l.document.querySelector("#new_comment_field")?.value?.trim(),G="["+e.expected.captureId+".webm](",ne=re?.startsWith(G)&&re.endsWith(")")?re.slice(G.length,-1):re;if(!ne||!/^https:\/\/github\.com\/user-attachments\/assets\/[0-9a-f-]{36}$/.test(ne))return null;return{nativeUrl:ne,actor:z.actor}}let M=e.expected,L=D(M,!1);if(!L.ok)return{status:"incomplete",reason:L.reason};return(async()=>{let z=M.nativeUrl.split("/").pop(),re=(Oe)=>{try{let Me=new l.URL(Oe,l.location.href);if(Me.protocol!=="https:"||Me.username||Me.password||Me.port||Me.hash)return!1;if(Me.origin==="https://github.com")return Me.href===M.nativeUrl;return["private-user-images.githubusercontent.com","user-images.githubusercontent.com"].includes(Me.hostname)&&new RegExp("/[0-9]+/[0-9]+-"+z+"\\.(webm|mp4)$").test(Me.pathname)}catch{return!1}},G=[...l.document.querySelectorAll('[id^="issue-"] .js-comment-body')].filter((Oe)=>/^issue-[1-9][0-9]*$/.test(Oe.closest('[id^="issue-"]')?.id||"")&&!Oe.closest("form")&&!Oe.closest(".preview-content"));if(G.length!==1)throw Error("saved_body_missing");let ne=G[0],fe=[...ne.querySelectorAll("video")].filter((Oe)=>[Oe.currentSrc,Oe.src,...[...Oe.querySelectorAll("source")].map((Me)=>Me.src)].some(re));if(fe.length!==1)throw Error("saved_player_missing");let te=fe[0],X={muted:te.muted,volume:te.volume,rate:te.playbackRate,preload:te.preload},le=new l.AbortController,be=l.setTimeout(()=>le.abort(),12000),ke=(Oe)=>l.Promise.race([Oe,new l.Promise((Me,Ee)=>{if(le.signal.aborted)Ee(Error("playback_timeout"));else le.signal.addEventListener("abort",()=>Ee(Error("playback_timeout")),{once:!0})})]),Re=async(Oe)=>{while(!Oe()){if(te.error||le.signal.aborted)throw Error("playback_unverified");await new l.Promise((Me)=>l.setTimeout(Me,25))}};try{if(te.muted=!0,te.playbackRate=1,te.currentTime=0,te.readyState<2)te.preload="auto",te.load();await Re(()=>te.readyState>=2&&te.videoWidth>0&&te.videoHeight>0);let Oe=te.currentSrc;if(!re(Oe))throw Error("source_unbound");let Me=await ke(l.fetch(Oe,{credentials:"same-origin",redirect:"error",signal:le.signal}));if(Me.status!==200||!re(Me.url)||Me.headers.get("content-range")||!/^video\/webm(?:;|$)/i.test(Me.headers.get("content-type")||"")||!Me.body)throw Error("source_unverifiable");let Ee=Me.headers.get("content-length");if(Ee!==null&&(!/^[1-9][0-9]*$/.test(Ee)||Number(Ee)!==M.sizeBytes))throw Error("source_size_mismatch");let Te=Me.body.getReader(),We=[],$e=0;try{for(;;){let Je=await ke(Te.read());if(Je.done)break;if($e+=Je.value.length,$e>10485760||$e>M.sizeBytes)throw Error("source_too_large");We.push(Je.value)}}finally{await Te.cancel().catch(()=>{}),Te.releaseLock()}if($e!==M.sizeBytes)throw Error("source_size_mismatch");let Ue=new l.Uint8Array($e),Ne=0;for(let Je of We)Ue.set(Je,Ne),Ne+=Je.length;let Ce=[...new l.Uint8Array(await ke(l.crypto.subtle.digest("SHA-256",Ue)))].map((Je)=>Je.toString(16).padStart(2,"0")).join("");if(Ce!==M.sha256||te.currentSrc!==Oe||!ne.contains(te))throw Error("source_changed");let Le=te.currentTime,Ge=te.getVideoPlaybackQuality().totalVideoFrames;if(await ke(te.play()),await Re(()=>te.currentTime-Le>=0.05&&te.getVideoPlaybackQuality().totalVideoFrames>Ge),!D(M,!1).ok||te.currentSrc!==Oe||!ne.contains(te)||te.error)throw Error("player_changed");return{status:"verified",sourceSha256:Ce,width:te.videoWidth,height:te.videoHeight,durationSeconds:te.duration,advancedSeconds:te.currentTime-Le,advancedFrames:te.getVideoPlaybackQuality().totalVideoFrames-Ge,playbackRestored:!0}}finally{if(l.clearTimeout(be),le.abort(),te.pause(),te.currentTime=0,te.muted=X.muted,te.volume=X.volume,te.playbackRate=X.rate,te.preload=X.preload,!te.paused||te.currentTime!==0)throw Error("playback_restore_failed")}})()};import{execFile as Fp}from"child_process";import{lstat as jp,realpath as qp}from"fs/promises";import{join as rd,resolve as zp}from"path";import{promisify as Kp}from"util";var Vp=Kp(Fp);async function Jp(e,l){let v=await qp(e),{stdout:D}=await Vp(rd(v,"reason-browser-use"),["profiles","--connected","--json"],{timeout:5000,maxBuffer:65536,signal:l});return d(n({browser:t(),directory:t(),connected:_().optional(),source:t(),socketPath:t().optional(),instanceId:t().optional(),extensionId:t().regex(/^[a-p]{32}$/)})).max(256).parse(JSON.parse(D)).filter((L)=>L.browser==="chrome"&&L.connected===!0&&/^(Default|Profile [0-9]+)$/.test(L.directory)&&zp(L.source)===rd(v,"Reason Browser Use","manifest.json"))}async function Di(e,l,v){if(!/^(Default|Profile [0-9]+)$/.test(l))throw Error("mac_recording_profile_unavailable");let D=(await Jp(e,v)).filter((z)=>z.directory===l),M=D[0];if(D.length!==1||!M?.socketPath||!M.instanceId)throw Error("mac_recording_profile_unavailable");let L=await jp(M.socketPath);if(!L.isSocket()||L.uid!==process.getuid?.()||L.mode&63)throw Error("mac_recording_socket_invalid");return{socketPath:M.socketPath,instanceId:M.instanceId,extensionId:M.extensionId}}import{createHash as Gp}from"crypto";function jn(e){return`reason-browser-${Gp("sha256").update(`reason:mac-browser:v1:${e}`).digest("hex")}`}var od=P("ok",[n({ok:i(!0),actor:n({login:t(),id:t().nullable()}).strict()}).strict(),n({ok:i(!1),reason:c(["authentication_required","identity_mismatch","attachment_unavailable"])}).strict()]),id=n({version:i("0.1.42"),metadata:n({extensionId:t(),extensionInstanceId:t(),nativeHostName:t()})}),ht=()=>Error("mac_pr_proof_browser_unavailable");async function ws(e){let l=ur.parse(e.owner),v="endpoint"in e?e.endpoint(l):await Zp(e.automationDirectory,l),D=new Map,M=`reason-pr-proof-${Yp()}`,L=!1,z=async()=>{if(L)throw ht();if(await e.assertCurrent(),L)throw ht()},re=async(fe)=>{if(!Mo(l,fe.owner))throw ht();await z()},G=async(fe)=>{await re(fe);let te=await e.readVideo(fe.captureId);try{await z();let X=te.capture;if(!Mo(X.context.owner,l)||X.captureId!==fe.captureId||X.context.prUrl!==fe.prUrl||X.context.headSha!==fe.headSha||X.media.contentType!=="video/webm"||X.media.sizeBytes!==fe.sizeBytes||X.sha256!==fe.sha256||te.bytes.length!==fe.sizeBytes||te.bytes.length<128||te.bytes.length>10485760||te.bytes.readUInt32BE(0)!==440786851||nd("sha256").update(te.bytes).digest("hex")!==fe.sha256)throw ht();return te}catch(X){throw te.bytes.fill(0),X}};async function ne(fe,te,X){await z();let le=await v.discover(AbortSignal.timeout(5000)),be=new Ci({socketPath:le.socketPath,sessionId:M,timeoutMs:5000}),ke,Re=!1,Oe,Me=new Promise((We,$e)=>{Oe=setTimeout(()=>{Re=!0,$e(ht())},60000)});Me.catch(()=>{});let Ee=(We)=>Promise.race([We,Me]),Te=async()=>{if(Re)throw ht();if(await z(),Re)throw ht()};try{await Ee(be.connect());let We=id.parse(await Ee(be.client.getInfo()));if(We.metadata.extensionId!==le.extensionId||We.metadata.extensionInstanceId!==le.instanceId||!We.metadata.nativeHostName)throw ht();await Te(),X?.("connected");let $e=be.newTab();$e.then((Ce)=>{if(Re)Ce.close().catch(()=>{L=!0})},()=>{}),ke=await Ee($e),await Te(),await Ee(ke.goto(fe,{waitUntil:"domcontentloaded",timeoutMs:15000})),await Te(),X?.("loaded");let Ne=await Ee(te(ke,async(Ce)=>{await Te();let Le=await Ee(ke.evaluate(`(${td.toString()})(${JSON.stringify(Ce)})`,{awaitPromise:!0}));return await Te(),Le},Te));return await Te(),Ne}finally{Re=!0,clearTimeout(Oe);try{if(ke){let We;try{await Promise.race([ke.close(),new Promise(($e,Ue)=>{We=setTimeout(()=>Ue(ht()),5000)})])}finally{clearTimeout(We)}}}catch{throw L=!0,ht()}finally{be.close()}await z()}}return{async screenshot(fe,te,X){let le=Bn.parse(fe);if(await re(le),!Number.isSafeInteger(te)||te<1||Date.parse(le.expiresAt)<=Date.now())throw ht();X.throwIfAborted();let be=await v.discover(X),ke=new Ci({socketPath:be.socketPath,sessionId:v.tabScope,timeoutMs:5000}),Re;try{await ke.connect();let Oe=id.parse(await ke.client.getInfo());if(Oe.metadata.extensionId!==be.extensionId||Oe.metadata.extensionInstanceId!==be.instanceId)throw ht();if(!d(n({id:o()})).max(256).parse(await ke.getTabs()).some((Te)=>Te.id===te))throw ht();await z(),X.throwIfAborted();let Ee=n({data:t().max(Math.ceil(2796202.6666666665)*4)}).strict().parse(await ke.cdp.call(te,"Page.captureScreenshot",{format:"png",fromSurface:!0,captureBeyondViewport:!1}));if(!/^[A-Za-z0-9+/]+={0,2}$/.test(Ee.data)||Ee.data.length%4)throw ht();if(Re=Buffer.from(Ee.data,"base64"),Re.toString("base64")!==Ee.data||Re.length>8388608)throw ht();if(await z(),X.throwIfAborted(),Date.parse(le.expiresAt)<=Date.now())throw ht();return Re}catch{throw Re?.fill(0),ht()}finally{ke.close()}},async verifyImages(fe){let te=xi(fe);if(te.runId!==l.runId||te.media.some((X)=>X.kind!=="image"))throw ht();return ne("about:blank",async(X,le,be)=>{let ke=X.browser.client,Re=new Set(te.media.map((Ce)=>Ce.sourceUrl)),Oe=new Map,Me=new Set,Ee=!1,Te=0,We=!1,$e=new Set,Ue=(Ce,Le)=>{if($e.size>=32){Ee=!0;return}let Ge=ke.executeCdp(X.id,Ce,Le);$e.add(Ge),Ge.catch(()=>{Ee=!0}).finally(()=>$e.delete(Ge))},Ne=ke.onNotification((Ce)=>{if(Ce.method!=="onCDPEvent"||!q(Ce.params)||!q(Ce.params.source)||Ce.params.source.tabId!==X.id||!q(Ce.params.params))return;let Le=Ce.params.params;if(++Te>512){Ee=!0;return}if(Ce.params.method==="Fetch.requestPaused"){let Je=typeof Le.requestId==="string"&&q(Le.request)&&Le.request.method==="GET"&&typeof Le.request.url==="string"&&Re.has(Le.request.url)&&Le.resourceType==="Image";if(typeof Le.requestId!=="string"){Ee=!0;return}if(!Je)Ee=!0;Ue(Je?"Fetch.continueRequest":"Fetch.failRequest",{requestId:Le.requestId,...Je?{}:{errorReason:"BlockedByClient"}})}if(Ce.params.method==="Network.requestWillBeSent"&&Le.redirectResponse)Ee=!0;if(Ce.params.method==="Network.loadingFailed")Ee=!0;if(Ce.params.method==="Network.loadingFinished"&&typeof Le.requestId==="string")Me.add(Le.requestId);if(Ce.params.method!=="Network.responseReceived")return;if(!q(Le.response)||typeof Le.response.url!=="string"||!Re.has(Le.response.url)||typeof Le.requestId!=="string"||!q(Le.response.headers)||Le.type!=="Image"){Ee=!0;return}let Ge=Object.fromEntries(Object.entries(Le.response.headers).map(([Je,it])=>[Je.toLowerCase(),it])),Ve=Number(Ge["content-length"]);if(Oe.has(Le.response.url)||Le.response.status!==200||Le.response.fromServiceWorker===!0||typeof Ge["content-length"]!=="string"||!/^[1-9][0-9]*$/.test(Ge["content-length"])||!Number.isSafeInteger(Ve)||Ve>8388608||Ge["content-range"]||Ge["content-encoding"]&&Ge["content-encoding"]!=="identity"){Ee=!0;return}Oe.set(Le.response.url,{id:Le.requestId,length:Ve})});try{await ke.executeCdp(X.id,"Network.enable",{maxTotalBufferSize:67108864,maxResourceBufferSize:8388608}),await ke.executeCdp(X.id,"Network.setBypassServiceWorker",{bypass:!0}),await ke.executeCdp(X.id,"Network.setCacheDisabled",{cacheDisabled:!0}),await ke.executeCdp(X.id,"Fetch.enable",{patterns:[{urlPattern:"*",requestStage:"Request"}]});let Ce=n({frameTree:n({frame:n({id:t().min(1).max(256)})})}).parse(await ke.executeCdp(X.id,"Page.getFrameTree",{})),Le=[...new Set(te.media.map((Je)=>new URL(Je.sourceUrl).origin))].join(" ");await ke.executeCdp(X.id,"Page.setDocumentContent",{frameId:Ce.frameTree.frame.id,html:`<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src ${Le}; style-src 'none'"><body></body>`}),await be(),We=!0;try{await ke.executeCdp(X.id,"Emulation.setFocusEmulationEnabled",{enabled:!0})}catch{throw new r("mac_pr_proof_png_render_failed","mac_pr_proof_png_render_failed")}await be();let Ge;try{Ge=await X.evaluate(`(${ed})(${JSON.stringify(te.media)})`,{awaitPromise:!0})}catch{throw new r("mac_pr_proof_png_decode_failed","mac_pr_proof_png_decode_failed")}if(await be(),!q(Ge)||!Array.isArray(Ge.items)||Ge.items.length!==te.media.length)throw ht();await Promise.all($e);let Ve=[];for(let Je=0;Je<te.media.length;Je++){await z();let it=Oe.get(te.media[Je].sourceUrl);if(Ee||!it||!Me.has(it.id))throw ht();let Ye=n({base64Encoded:i(!0),body:t().max(Math.ceil(2796202.6666666665)*4)}).strict().parse(await ke.executeCdp(X.id,"Network.getResponseBody",{requestId:it.id})),Be=Buffer.from(Ye.body,"base64");try{let Ke=Ge.items[Je];if(Be.length!==it.length||Be.toString("base64")!==Ye.body||!q(Ke))throw ht();Ve.push({...Ke,sourceSha256:nd("sha256").update(Be).digest("hex")})}finally{Be.fill(0)}}if(Ee)throw ht();return Kl({verified:!0,items:Ve},te)}finally{if(Ne(),await Promise.allSettled($e),We)try{await ke.executeCdp(X.id,"Emulation.setFocusEmulationEnabled",{enabled:!1})}catch{throw new r("mac_pr_proof_png_render_cleanup_failed","mac_pr_proof_png_render_cleanup_failed")}}})},async preflight(fe){let te=Oo.parse(fe);await re(te);let X="browser_unavailable";try{return await ne(`https://github.com/${te.repositoryFullName}`,async(le,be)=>{let ke=od.parse(await be({operation:"preflight",expected:{...te,prUrl:`https://github.com/${te.repositoryFullName}`}}));return ms.parse(ke.ok?{...te,status:"ready",observedActor:ke.actor,checkedAt:new Date().toISOString()}:ke.reason==="attachment_unavailable"?{...te,status:"not_ready",reason:"unavailable",cause:"attachment_unavailable"}:{...te,status:"not_ready",reason:ke.reason})},(le)=>{X=le==="connected"?"github_page_unavailable":"identity_check_failed"})}catch{return ms.parse({...te,status:"not_ready",reason:"unavailable",cause:X})}},async publish(fe){let te=bn.parse(fe);if(await re(te),te.expectedActorId!==null&&te.authenticatedActor.id!==te.expectedActorId)throw ht();let X=D.get(te.attemptId);if(X){if(!Mo(X.binding,te))throw ht();return structuredClone(X.result)}if(D.size>=3)throw Error("proof_native_publication_limit");let le={binding:structuredClone(te),result:Un.parse({...te,status:"uncertain",reason:"upload_outcome_unknown"})};D.set(te.attemptId,le);let be=!1,ke="dispatch";try{(await G(te)).bytes.fill(0),le.result=await ne(te.prUrl,async(Re,Oe)=>{let Me=od.parse(await Oe({operation:"identity",expected:te}));if(!Me.ok)return Un.parse({...te,status:"not_attempted",reason:Me.reason});let Ee=await G(te),Te;try{be=!0,Te=P("dispatched",[n({dispatched:i(!0),actor:n({login:t(),id:t().nullable()}).strict()}).strict(),n({dispatched:i(!1),reason:c(["authentication_required","identity_mismatch","attachment_unavailable","capture_invalid"])}).strict()]).parse(await Oe({operation:"upload",expected:te,base64:Ee.bytes.toString("base64")}))}finally{Ee.bytes.fill(0)}if(!Te.dispatched)return be=!1,Un.parse({...te,status:"not_attempted",reason:Te.reason});if(!Mo(Te.actor,Me.actor))throw ke="actor_changed",ht();ke="result";let We=performance.now();while(performance.now()-We<30000){let $e=await Oe({operation:"upload_result",expected:{...te,observedActor:Me.actor}});if($e!==null){let Ue=n({nativeUrl:t(),actor:n({login:t(),id:t().nullable()}).strict()}).strict().parse($e);return ke="finalize",await z(),Un.parse({...te,status:"uploaded",nativeUrl:Ue.nativeUrl,observedActor:Ue.actor,uploadedAt:new Date().toISOString()})}await new Promise((Ue)=>setTimeout(Ue,100))}throw ke="result_timeout",ht()})}catch{if(be)process.stderr.write(`Reason PR proof: video upload outcome unknown (stage=${ke})
|
|
74
|
+
`);le.result=Un.parse({...te,...be?{status:"uncertain",reason:"upload_outcome_unknown"}:{status:"not_attempted",reason:"capture_invalid"}})}return structuredClone(le.result)},async verify(fe){let te=Do.parse(fe);await re(te);try{return(await G(te)).bytes.fill(0),await ne(te.prUrl,async(X,le)=>{await X.browser.client.executeCdp(X.id,"Emulation.setFocusEmulationEnabled",{enabled:!0});try{let be=await le({operation:"saved_player",expected:te});if(!be||typeof be!=="object"||Array.isArray(be))throw ht();let ke=ps.parse({...te,...be,..."status"in be&&be.status==="verified"?{verifiedAt:new Date().toISOString()}:{}});if(Object.entries(te).some(([Re,Oe])=>!Mo(Oe,ke[Re])))throw ht();return ke}finally{await X.browser.client.executeCdp(X.id,"Emulation.setFocusEmulationEnabled",{enabled:!1})}})}catch{return ps.parse({...te,status:"incomplete",reason:"playback_unverified"})}},close(){L=!0}}}async function Zp(e,l){let v=await Xp(e);return{async discover(D){let M=await Di(v,l.profile,D);if(M.instanceId!==l.extensionInstanceId)throw ht();return M},tabScope:jn(l.runId)}}import{realpath as yh}from"fs/promises";var Hv=n({version:i(1),recording_operation_id:t().uuid(),proof_ready:i(!1),acknowledged_at:I.datetime()}).strict(),Mi=n({action:i("start"),request_id:t().uuid(),profile:t().regex(/^(Default|Profile [0-9]+)$/),tab_id:o().int().positive(),seconds:o().int().min(1).max(15)}).strict(),ad=n({action:i("inspect"),recording_operation_id:t().uuid()}).strict(),$v=P("action",[Mi,ad]),sd=n({recording_operation_id:t().uuid()}).strict(),ys={device_id:t().uuid(),root_id:t().uuid()},Qp=P("action",[Mi.extend(ys),ad.extend(ys),sd.extend({...ys,action:i("stop")})]),Bv=Xi(Qp),Uv=n({version:i(1),recordingId:t().uuid(),proofReady:i(!1),capture:n({captureId:t().uuid(),contentType:i("video/webm"),sha256:t().regex(/^[a-f0-9]{64}$/),sizeBytes:o().int().min(128).max(10485760),startedAt:I.datetime(),finishedAt:I.datetime(),durationSeconds:o().min(0.05).max(15),frameCount:o().int().min(1).max(450),receivedFrameCount:o().int().min(1).max(2000),owner:n({runId:t().uuid(),deviceId:t().uuid(),rootId:t().uuid(),rootRevision:t().max(64),profile:t().regex(/^(Default|Profile [0-9]+)$/),extensionInstanceId:t().min(1).max(1024),generation:t().uuid(),browserScope:t().max(128),tabId:o().int().positive()}).strict()}).strict().refine((e)=>e.receivedFrameCount>=e.frameCount&&Math.abs((Date.parse(e.finishedAt)-Date.parse(e.startedAt))/1000-e.durationSeconds)<=0.1)}).strict();var Xv=Mi.extend({action:c(["start","inspect"]),recording_boot_generation:t().uuid(),recording_operation_id:t().uuid().optional(),recording_attempt_id:t().uuid().optional()}).strict();import{createHash as lh,randomUUID as dh}from"crypto";import{mkdtemp as uh,realpath as fh,rm as hd}from"fs/promises";import{tmpdir as mh}from"os";import{join as ph}from"path";import{spawn as hh}from"child_process";import{isDeepStrictEqual as gh}from"util";import{createHash as eh}from"crypto";import{execFile as th}from"child_process";import{chmod as rh,lstat as ld,mkdtemp as nh,readFile as dd,realpath as ud,rm as oh,writeFile as cd}from"fs/promises";import{tmpdir as ih}from"os";import{isAbsolute as ah,join as Ti}from"path";import{promisify as sh}from"util";var _s=sh(th),ch=(e)=>eh("sha256").update(e).digest("hex");async function Pr(e){if(!ah(e.path)||!/^[a-f0-9]{64}$/.test(e.sha256)||await ud(e.path)!==e.path)throw Error("mac_recording_encoder_unqualified");let l=await ld(e.path);if(!l.isFile()||!(l.mode&73)||l.mode&18||l.size>134217728||ch(await dd(e.path))!==e.sha256)throw Error("mac_recording_encoder_unqualified")}async function To(e,l){if(!e)return null;let v=structuredClone(e);try{await Promise.all([Pr(v.ffmpeg),Pr(v.ffprobe)])}catch{return null}return{async encode(D,M,L){if(L.aborted||!D.length||!Number.isFinite(M)||M<0.05||M>15)throw Error("mac_recording_encoding_invalid");await Promise.all([Pr(v.ffmpeg),Pr(v.ffprobe)]);let z=await ud(await nh(Ti(l??ih(),"reason-owned-recording-")));await rh(z,448);let re=Ti(z,"capture.webm"),G="frames";try{let ne=["ffconcat version 1.0"];for(let[Re,Oe]of D.entries()){let Me=`${Re}.jpg`;await cd(Ti(z,Me),Oe.jpeg,{mode:384,flag:"wx"});let Ee=D[Re+1]?.timestamp??D[0].timestamp+M;ne.push(`file '${Me}'`,`duration ${Math.max(0.001,Ee-Oe.timestamp).toFixed(6)}`)}ne.push(`file '${D.length-1}.jpg'`),await cd(Ti(z,"frames.ffconcat"),ne.join(`
|
|
75
75
|
`)+`
|
|
76
|
-
`,{mode:384,flag:"wx"});let
|
|
77
|
-
`)},cancel:()=>Ve()},
|
|
78
|
-
`))!==-1){let Fe=Oe.slice(0,Ke);Oe=Oe.slice(Ke+1);try{let nt=JSON.parse(Fe);if(nt.type==="failed"&&Object.keys(nt).sort().join(",")==="reason,type"){let at=md.safeParse(nt.reason);Ve(at.success?Error(`mac_recording_worker_failed:${at.data}`):Jr());return}if(nt.type==="unsupported"&&!Te){Ve(Error("mac_recording_encoder_unavailable"));return}if(nt.type==="started"&&!Te&&Object.keys(nt).length===1){Te=!0,$e({recording:!0});continue}if(!Te||nt.type!=="capture"||We||Object.keys(nt).sort().join(",")!=="bytes,capture,type")throw Jr();let Ze=nt.capture;if(!Ze||Object.keys(Ze).sort().join(",")!=="captureId,contentType,durationSeconds,finishedAt,frameCount,owner,receivedFrameCount,sha256,sizeBytes,startedAt"||typeof Ze.sha256!=="string"||typeof Ze.startedAt!=="string"||typeof Ze.finishedAt!=="string"||!gh(Ze.owner,l.owner)||Ze.contentType!=="video/webm"||!/^[a-f0-9]{64}$/.test(Ze.sha256)||!Number.isSafeInteger(Ze.sizeBytes)||Ze.sizeBytes<128||Ze.sizeBytes>10485760||!Number.isSafeInteger(Ze.frameCount)||Ze.frameCount<1||Ze.frameCount>450||!Number.isSafeInteger(Ze.receivedFrameCount)||Ze.receivedFrameCount<Ze.frameCount||Ze.receivedFrameCount>2000||!Number.isFinite(Ze.durationSeconds)||Ze.durationSeconds<0.05||Ze.durationSeconds>l.seconds||!Number.isFinite(Date.parse(Ze.startedAt))||!Number.isFinite(Date.parse(Ze.finishedAt))||Math.abs((Date.parse(Ze.finishedAt)-Date.parse(Ze.startedAt))/1000-Ze.durationSeconds)>0.1||typeof nt.bytes!=="string"||nt.bytes.length%4!==0||!/^[A-Za-z0-9+/]+={0,2}$/.test(nt.bytes))throw Jr();let He=Buffer.from(nt.bytes,"base64");if(He.length!==Ze.sizeBytes||lh("sha256").update(He).digest("hex")!==Ze.sha256||!He.subarray(0,4).equals(Buffer.from([26,69,223,163])))throw Jr();We={capture:Object.freeze({...Ze,captureId:dh(),owner:Object.freeze({...l.owner})}),bytes:He}}catch{Ve();return}}}),
|
|
79
|
-
`);try{return await Ne}catch(Be){throw we=null,Be}}finally{L=!1}},async completed(){if(await te(),!we)throw Error("mac_recording_not_active");return we.completion},async stop(){await te();let X=we;if(!X)throw Error("mac_recording_not_started");X.stop();try{return await X.completion}finally{if(we===X)we=null}},async read(X){await te();let he=D.get(X);if(!he)throw Error("mac_recording_capture_unavailable");return{capture:structuredClone(he.capture),bytes:Buffer.from(he.bytes)}},async close(){if(M)return;M=!0;let X=we;X?.cancel(),D.clear();try{await ce(),await X?.completion.catch(()=>{})}finally{we=null}}}}var wd=n({version:i("0.1.42"),metadata:n({extensionId:t(),extensionInstanceId:t(),nativeHostName:t()})});async function bs(e){await e.assertCurrent();let l;if("discover"in e)l=e.discover;else{let v=await yh(e.automationDirectory);l=(D,M)=>Di(v,D,M)}if(await Pr({path:e.worker.path,sha256:e.worker.sha256}),!await To(e.encoder))throw Error("mac_recording_encoder_unavailable");return async(v,D,M,L)=>{L.throwIfAborted(),await e.assertCurrent();let z=await l(v,L),re=new Vr({socketPath:z.socketPath,sessionId:M,timeoutMs:2000}),G;try{if(await re.connect(),G=wd.parse(await re.getInfo()),G.metadata.extensionId!==z.extensionId||G.metadata.extensionInstanceId!==z.instanceId)throw Error("mac_recording_profile_changed");if(!d(n({id:o()})).parse(await re.getTabs()).some((we)=>we.id===D))throw Error("mac_recording_tab_not_owned");await e.assertCurrent(),L.throwIfAborted()}finally{re.close()}return{extensionInstanceId:z.instanceId,async createHost(ce,we,te){let X=new Vr({socketPath:z.socketPath,sessionId:ce.browser.browserScope,timeoutMs:2000});return gd({worker:e.worker,configuration:{owner:ce.browser,seconds:we,encoder:e.encoder,socketPath:z.socketPath,extensionId:z.extensionId,nativeHostName:G.metadata.nativeHostName},async assertCurrent(){te.throwIfAborted(),L.throwIfAborted(),await e.assertCurrent()},async cleanup(){try{await X.connect();let Se=wd.parse(await X.getInfo());if(Se.metadata.extensionInstanceId!==ce.browser.extensionInstanceId||Se.metadata.extensionId!==z.extensionId||Se.metadata.nativeHostName!==G.metadata.nativeHostName)throw Error("mac_recording_profile_changed");await X.executeCdp(D,"Page.stopScreencast",{})}finally{X.close()}}})}}}}var Nt=()=>Error("mac_pr_proof_unavailable"),kh=n({operationId:t().uuid()}).strict();function _d(e){let l=e.qualifiedProfiles??[{profile:e.profile,extension_instance_id:e.extensionInstanceId}],v=d(n({profile:t().regex(/^(Default|Profile [0-9]+)$/),extension_instance_id:t().min(1).max(1024)}).strict()).min(1).max(16).parse(l);if(!t().uuid().safeParse(e.generation).success||new Set(v.map((X)=>X.profile)).size!==v.length)throw Nt();if(!e.qualifiedProfiles){let X=new URL(e.uploadOrigin);if(!e.resolveBrowser||X.protocol!=="https:"||X.origin!==e.uploadOrigin||X.username||X.password)throw Nt()}let D=new Map,M=new Map,L=new Map,z=!1,re=new _h,G=async(X)=>{let he=re.getStore();if(z||!X&&!he)throw Nt();if(he?.signal.throwIfAborted(),await e.assertCurrent(X??he.claim),z)throw Nt();he?.signal.throwIfAborted()},ce=(X,he)=>{let Se="owner"in he?he.owner:("context"in he)?he.context.owner:he.input.owner;if(X.capability!==us||!X.owner||Se.generation!==e.generation||!v.some((Re)=>Re.profile===Se.profile&&Re.extension_instance_id===Se.extensionInstanceId)||Se.organizationId!==X.owner.organization_id||Se.userId!==X.owner.user_id||Se.deviceId!==X.owner.device_id||Se.rootId!==X.root_id||Se.runId!==X.run_id)throw Nt();return Se},we=async(X)=>{await G();let he=JSON.stringify([X.runId,X.profile]),Se=D.get(he);if(!Se){if(D.size>=4)throw Nt();Se=(async()=>{let Ee,Oe=e.browserScope?.(X)??jn(X.runId),Me=await e.createBrowser({owner:X,assertCurrent:()=>G(),readVideo:(Ce)=>Ee.publicationCapture(Ce)});if(Ee=Ql({owner:X,browserScope:Oe,assertCurrent:()=>G(),screenshot:Me.screenshot,async createVideo(Ce,Te,We,$e){if(!e.resolveBrowser)throw Nt();let Ue=await e.resolveBrowser(X.profile,Te,Oe,$e);if(Ue.extensionInstanceId!==X.extensionInstanceId)throw Nt();return Ue.createHost({organizationId:X.organizationId,userId:X.userId,operationId:Ce.contextId,attemptId:Ce.contextId,recordingId:Ce.contextId,browser:{runId:X.runId,deviceId:X.deviceId,rootId:X.rootId,rootRevision:X.rootRevision,generation:X.generation,profile:X.profile,extensionInstanceId:X.extensionInstanceId,browserScope:Oe,tabId:Te}},We,$e)}}),z)throw Me.close(),await Ee.close(),Nt();return{owner:structuredClone(X),browser:Me,capture:Ee,expiresAt:Date.now()+300000}})(),D.set(he,Se)}let Re=await Se;if(!yd(Re.owner,X)||Re.expiresAt<=Date.now())throw Nt();return Re},te=setInterval(()=>{for(let[X,he]of D)he.then(async(Se)=>{if(Se.expiresAt>Date.now()||[...M.values()].some((Re)=>Re.runtime===Se))return;if(Se.browser.close(),await Se.capture.close(),D.get(X)===he)D.delete(X)}).catch(()=>{z=!0})},1000);return te.unref(),{generation:e.generation,async execute(X,he,Se){return re.run({claim:X,signal:he},async()=>{let Re=hs.parse(X.payload).command,Ee=ce(X,Re);if(await G(X),he.throwIfAborted(),e.qualifiedProfiles&&!e.resolveBrowser&&(Re.action==="prepare"?Re.context.evidenceKind!=="image"||Boolean(Re.context.visualPlan)||!Re.context.uploadOrigin:!["capture_png","inspect_capture","verify_png_media","publish_png"].includes(Re.action)))throw Error("proof_png_only");let Oe=await we(Ee),Me=async()=>{await G(X),he.throwIfAborted()},Ce;switch(Re.action){case"auth_check":Ce=await Oe.browser.preflight(Re.input);break;case"prepare":if(Re.context.visualPlan)throw Error("proof_source_unavailable");if(e.qualifiedProfiles&&!Re.context.uploadOrigin)throw Nt();Ce=await Oe.capture.prepare(Re.context);break;case"capture_png":Ce=await Oe.capture.screenshot({claim:{operationId:X.operation_id,attemptId:X.attempt_id,contextId:Re.contextId,tabId:Re.tabId},signal:he});break;case"start_video":{let Te={runtime:Oe,contextId:Re.contextId,attemptId:X.attempt_id,tabId:Re.tabId,signal:he};if(M.has(X.operation_id))throw Nt();M.set(X.operation_id,Te);try{Ce=await Oe.capture.record({claim:{operationId:X.operation_id,attemptId:X.attempt_id,contextId:Re.contextId,tabId:Re.tabId},signal:he,seconds:Re.seconds,started:async()=>{await Me(),await Se({version:1,operationId:X.operation_id,contextId:Re.contextId,acknowledgedAt:new Date().toISOString()})}})}finally{M.delete(X.operation_id)}break}case"inspect_capture":Ce=await Oe.capture.inspect(Re.captureId);break;case"publish_video":Ce=await Oe.browser.publish(Re.input);break;case"verify_saved_media":Ce=await Oe.browser.verify(Re.input);break;case"verify_png_media":Ce=await Oe.browser.verifyImages(Re.media);break;case"publish_png":{let Te=`${Ee.runId}:${Re.attemptId}`,We=L.get(Te);if(We){if(!yd(We.request,Re))throw Nt();Ce=We.result;break}if(L.size>=16)throw Nt();let $e=new URL(Re.uploadUrl);if($e.protocol!=="https:"||$e.username||$e.password||$e.hash||$e.pathname!==`/${Re.storagePath}`||!Re.storagePath.startsWith(`pr-screenshots/${Ee.runId}/${Re.captureId}/`)||!/^[a-zA-Z0-9._-]+\.png$/.test(Re.storagePath.split("/").at(-1))||Re.storagePath.split("/").length!==4)throw Nt();let Ue=await Oe.capture.publicationCapture(Re.captureId);try{if($e.origin!==(e.qualifiedProfiles?Ue.capture.context.uploadOrigin:e.uploadOrigin)||Ue.capture.media.contentType!=="image/png"||Ue.capture.sha256!==Re.sha256||Ue.bytes.length!==Re.sizeBytes||bh("sha256").update(Ue.bytes).digest("hex")!==Re.sha256)throw Nt();await Me();let Ne={request:structuredClone(Re),result:{status:"uncertain",sha256:Re.sha256,sizeBytes:Re.sizeBytes}};L.set(Te,Ne);try{let xe=await fetch($e,{method:"PUT",body:Ue.bytes,headers:{"Content-Type":"image/png"},redirect:"error",signal:AbortSignal.any([he,AbortSignal.timeout(20000)])});if(await xe.body?.cancel(),await Me(),xe.ok)Ne.result={...Ne.result,status:"uploaded"}}catch{}Ce=Ne.result}finally{Ue.bytes.fill(0)}break}}return await Me(),structuredClone(Ce)})},async control(X,he){if(X.capability!==us||he.kind!==Xl)return!1;let Se=kh.safeParse(he.payload),Re=M.get(X.operation_id);if(!Se.success||Se.data.operationId!==X.operation_id||!Re||Re.attemptId!==X.attempt_id)return!1;let Ee=hs.parse(X.payload).command;return ce(X,Ee),await G(X),await re.run({claim:X,signal:Re.signal},()=>Re.runtime.capture.stop({operationId:X.operation_id,attemptId:X.attempt_id,contextId:Re.contextId,tabId:Re.tabId})),!0},async close(){z=!0,clearInterval(te);let X=await Promise.allSettled([...D.values()].map(async(he)=>{let Se=await he;Se.browser.close(),await Se.capture.close()}));if(D.clear(),M.clear(),L.clear(),X.some((he)=>he.status==="rejected"))throw Nt()}}}var xh="__browser-recorder",Ih=Ah(vh),Oh="/tmp/open-browser-use",Dh=33554432,Mh=n({version:i("0.1.42"),metadata:n({extensionId:i(le),extensionInstanceId:t().min(1).max(1024)})}),kd=()=>Error("worker_pr_proof_browser_unavailable"),Ps={components:A,ensureBrowser:Lo,socketDirectory:Oh,async identity(e){let l=new Vr({socketPath:e,sessionId:`reason-proof-qualification-${Rs()}`,timeoutMs:2000});try{return await l.connect(),await l.getInfo()}finally{l.close()}}};async function vd(e,l=Ps){let v=l.components();if(!v?.features.browser)throw kd();await l.ensureBrowser(v),e.throwIfAborted();let D=ks($o(v),"Default","Local Extension Settings",le),M=(await bd(D)).filter((L)=>L.endsWith(".log")||L.endsWith(".ldb")).map((L)=>ks(D,L));for(let L of(await bd(l.socketDirectory)).filter((z)=>z.endsWith(".sock"))){e.throwIfAborted();let z=ks(l.socketDirectory,L);try{let re=await Rh(z);if(!re.isSocket()||re.uid!==process.getuid?.())continue;let G=Mh.parse(await l.identity(z)).metadata.extensionInstanceId;for(let ce of M)if((await Ph(ce)).size<=Dh&&(await Sd(ce)).includes(G))return{socketPath:z,instanceId:G,extensionId:le}}catch{}}throw kd()}async function vs(e){let l=await Eh(e);return{path:l,sha256:Sh("sha256").update(await Sd(l)).digest("hex")}}async function Rd(e={}){let l={...Ps,...e};try{let v=l.components();if(!v?.ffmpeg)return{error:"worker_recording_ffmpeg_unavailable"};if(!v.ffprobe)return{error:"worker_recording_ffprobe_unavailable"};let D=await vs(v.ffmpeg),{stdout:M}=await Ih(D.path,["-hide_banner","-encoders"],{timeout:1e4,maxBuffer:1048576,env:{PATH:"/usr/bin:/bin"}});if(!/^\s*V\S*\s+libvpx\s/m.test(M))return{error:"worker_recording_libvpx_unavailable"};let L={ffmpeg:D,ffprobe:await vs(v.ffprobe)};if(!await To(L))return{error:"worker_recording_encoder_unqualified"};let z=e.recorder??{path:process.execPath,args:[...Ch(process.execPath).startsWith("bun")&&process.argv[1]?[process.argv[1]]:[],xh]};return{worker:{...await vs(z.path),args:z.args},encoder:L}}catch{return{error:"worker_recording_unqualified"}}}function Ed(e,l={}){let v={...Ps,...l},D=Rs(),M=Rs(),L=uo.parse({version:2,ready:!0,development_only:!1,proof_ready:!1,result:"metadata_only",boot_generation:D,profiles:["Default"],extension_instance_ids:[M],image:!0,video:!1,source_bound:!1}),z=e.recording?po.parse({...L,version:3,video:!0,max_seconds:15}):L,re=(te)=>Ul(te.organizationId,te.sessionId,te.deviceId,1),G=e.recording,ce,we=_d({generation:D,qualifiedProfiles:[{profile:"Default",extension_instance_id:M}],assertCurrent:e.assertCurrent,browserScope:re,...G?{resolveBrowser:async(te,X,he,Se)=>{ce??=bs({...G,assertCurrent:()=>e.assertCurrent(),discover:(Ee,Oe)=>vd(Oe,v)}),ce.catch(()=>{ce=void 0});let Re=await(await ce)(te,X,he,Se);return{extensionInstanceId:M,createHost:async(Ee,Oe,Me)=>Th(await Re.createHost({...Ee,browser:{...Ee.browser,extensionInstanceId:Re.extensionInstanceId}},Oe,Me),M)}}}:{},createBrowser:(te)=>ws({...te,endpoint:(X)=>({discover:(he)=>vd(he,v),tabScope:re(X)})})});return{capability:z,broker:we}}function Th(e,l){let v=(D)=>({...D,owner:{...D.owner,extensionInstanceId:l}});return{start:()=>e.start(),close:()=>e.close(),completed:async()=>v(await e.completed()),stop:async()=>v(await e.stop()),read:async(D)=>{let M=await e.read(D);return{capture:v(M.capture),bytes:M.bytes}}}}import{execFile as Xh}from"child_process";import{execFile as Lh}from"child_process";import{readFile as Wh}from"fs/promises";import{join as vr}from"path";var Nh="Claude Code-credentials",Hh="/usr/bin/security",$h=120000,Bh=8192,Wi={exec:(e,l,v)=>new Promise((D)=>{Lh(e,l,{timeout:v,maxBuffer:8388608},(M,L)=>{let z=M?typeof M.code==="number"?M.code:1:0;D({code:z,stdout:String(L??"")})})}),readText:async(e)=>{try{return await Wh(e,"utf8")}catch{return null}}};function qn(e){return typeof e==="string"&&e.length>0&&e.length<=Bh?e:null}function Uh(e,l){return e.CLAUDE_CONFIG_DIR||vr(l,".claude")}function Fh(e,l){return e.CODEX_HOME||vr(l,".codex")}function Pd(e){if(!e)return null;try{let l=JSON.parse(e).claudeAiOauth,v=qn(l?.accessToken),D=qn(l?.refreshToken),M=typeof l?.expiresAt==="number"&&Number.isFinite(l.expiresAt)?l.expiresAt:null;return v&&D&&M!==null?{provider:"anthropic",access:v,refresh:D,expires:M}:null}catch{return null}}function jh(e){try{let l=JSON.parse(Buffer.from(e.split(".")[1]??"","base64url").toString("utf8"));return typeof l.exp==="number"?l.exp*1000:null}catch{return null}}function qh(e){if(!e)return null;try{let l=JSON.parse(e);if(l.auth_mode!==void 0&&l.auth_mode!=="chatgpt")return null;let v=qn(l.tokens?.access_token),D=qn(l.tokens?.refresh_token);if(!v||!D)return null;return{provider:"openai-codex",access:v,refresh:D,expires:jh(v)??Date.now()}}catch{return null}}function zh(e,l){return vr(e.XDG_DATA_HOME||vr(l,".local","share"),"opencode","auth.json")}var Kh={anthropic:"anthropic",openai:"openai-codex"};function Vh(e){return Id(e,Kh)}function Id(e,l){if(!e)return[];try{let v=JSON.parse(e),D=[];for(let[M,L]of Object.entries(l)){let z=v[M];if(z?.type!=="oauth")continue;let re=qn(z.access),G=qn(z.refresh),ce=typeof z.expires==="number"&&Number.isFinite(z.expires)?z.expires:null;if(re&&G&&ce!==null)D.push({provider:L,access:re,refresh:G,expires:ce})}return D}catch{return[]}}function Jh(e){return Id(e,{anthropic:"anthropic","openai-codex":"openai-codex"})}function Gh(e,l){let v=e.PI_CODING_AGENT_DIR;return v==="~"?l:v?.startsWith("~/")?vr(l,v.slice(2)):v||vr(l,".pi","agent")}async function Od(e,l,v=Wi){let D=[],M=await v.exec(Hh,["find-generic-password","-s",Nh,"-w"],$h),L=Date.now()+300000,z=(G)=>{if(!G)return;let ce=D.findIndex((we)=>we.provider===G.provider);if(ce<0)D.push(G);else if(D[ce].expires<=L&&G.expires>L)D[ce]=G};if(z(M.code===0?Pd(M.stdout.trim()):null),!D.some((G)=>G.provider==="anthropic"&&G.expires>L))z(Pd(await v.readText(vr(Uh(e,l),".credentials.json"))));let re=qh(await v.readText(vr(Fh(e,l),"auth.json")));z(re),z(Yh(await v.readText(vr(e.GROK_HOME||vr(l,".grok"),"auth.json"))));for(let G of Vh(await v.readText(zh(e,l))))z(G);for(let G of Jh(await v.readText(vr(Gh(e,l),"auth.json"))))z(G);return D}function Dd(e){return e.map(({provider:l,access:v,expires:D})=>({provider:l,access:v,expires:D}))}var Cd="https://auth.x.ai",Ad="b1a00492-073a-47ea-816f-4c329264a828",xd=(e)=>typeof e==="string"&&e.length>0&&e.length<=8192&&e.trim()===e;function Yh(e){if(!e)return null;try{let l=JSON.parse(e);if(!l||typeof l!=="object"||Array.isArray(l))return null;let v=l[`${Cd}::${Ad}`];if(!v||typeof v!=="object"||Array.isArray(v))return null;let D=v;if(D.auth_mode!=="oidc"||D.oidc_issuer!==Cd||D.oidc_client_id!==Ad||!xd(D.key)||!xd(D.refresh_token)||typeof D.expires_at!=="string")return null;let M=Date.parse(D.expires_at);if(!Number.isFinite(M)||M<=0)return null;return{provider:"xai",access:D.key,refresh:D.refresh_token,expires:M}}catch{return null}}var Md=330000,Zh=300000,Qh=60000;function eg(e,l,v=Date.now()){return e.filter((D)=>{if(!Number.isFinite(D.expires)||D.expires<=v+Md)return!1;let M=l.get(D.provider);return!M||M.access!==D.access||M.expires!==D.expires})}function tg(e,l=Date.now()){return[...e.values()].some((D)=>D.expires<=l+2*Md)?Qh:Zh}var rg=(e,l)=>new Promise((v)=>{if(l.aborted)return v();let D=setTimeout(M,e);function M(){clearTimeout(D),l.removeEventListener("abort",M),v()}l.addEventListener("abort",M,{once:!0})});async function Td(e){let l=new Map,v=e.wait??rg,D=e.stores??(process.platform==="darwin"?Wi:{...Wi,exec:async()=>({code:1,stdout:""})});while(!e.signal.aborted){try{let M=Dd(await Od(e.environment??process.env,e.home,D));for(let L of eg(M,l)){if(e.signal.aborted)return;let z=await e.client.localSubscription(e.state,L,AbortSignal.any([e.signal,AbortSignal.timeout(30000)]));l.set(L.provider,{access:L.access,expires:L.expires}),e.onOutcome?.({provider:L.provider,ok:z.ok,...z.ok?{}:{error:z.error}})}}catch{}await v(tg(l),e.signal)}}function Ld(e=process.env){return new Promise((l)=>{Xh("gh",["auth","status","--hostname","github.com"],{env:e,timeout:8000,maxBuffer:65536},(v)=>l(!v))})}import{execFile as ng,spawn as PR,spawnSync as CR}from"child_process";import{chmodSync as xR,existsSync as og,mkdirSync as IR,readFileSync as OR,renameSync as DR,rmSync as MR,statSync as TR,writeFileSync as LR}from"fs";import{dirname as NR,isAbsolute as HR,join as Hi}from"path";var Wd=/^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$/;function Nd(e,l){if(!Wd.test(e)||!Wd.test(l))throw Error("Invalid CLI version");let v=e.split(".").map(BigInt),D=l.split(".").map(BigInt);for(let M=0;M<3;M++){if(v[M]<D[M])return-1;if(v[M]>D[M])return 1}return 0}var ig="com.reasonmachines.updater",ag=["so.ara.updater","so.reason.updater"];function sg(e){let l=e==="staging"?".staging":"";return{label:`${ig}${l}`,legacyLabels:[...ag].reverse().map((v)=>`${v}${l}`)}}function cg(e,l){return l==="darwin"?e.launchAgent:l==="win32"?e.scheduledTask:e.systemdService}function lg(e,l,v){return{launchAgent:Hi(l,"Library","LaunchAgents",`${e}.plist`),systemdService:Hi(v,"systemd","user",`${e}.service`),systemdTimer:Hi(v,"systemd","user",`${e}.timer`),scheduledTask:Hi(Ni(l),`${e}.xml`)}}function dg(e,l){return new Promise((v)=>{ng(B(e),[...l],{timeout:1e4},(D)=>{v(D?typeof D.code==="number"?D.code:1:0)})})}async function $d(e){let l=e.runtimePlatform??process.platform;if(l!=="darwin"&&l!=="linux"&&l!=="win32")return"absent";let v=e.uid??process.getuid?.();if(l!=="win32"&&(typeof v!=="number"||!Number.isSafeInteger(v)||v<=0))return"absent";let D=e.home??s(),{label:M,legacyLabels:L}=sg(e.channel),z=e.configHome??Et(D),re=[M,...L].filter((te)=>og(cg(lg(te,D,z),l)));if(re.length===0)return"absent";let G=e.command??dg,ce=re[0];if(re.length>1){for(let te of re)if((l==="darwin"?await G("/bin/launchctl",["print",`gui/${v}/${te}`]):l==="win32"?await G("schtasks",["/Query","/TN",te]):await G("systemctl",["--user","is-enabled",`${te}.timer`]))===0){ce=te;break}}return(l==="darwin"?await G("/bin/launchctl",["kickstart",`gui/${v}/${ce}`]):l==="win32"?await G("schtasks",["/Run","/TN",ce]):await G("systemctl",["--user","start","--no-block",`${ce}.service`]))===0?"started":"failed"}var Hd=60000;function Bd(e){let l=(M,L)=>{try{return Nd(M,L)>0}catch{return!1}},v=e.actedOn&&l(e.actedOn,"0.0.0")?e.actedOn:null,D=e.schedule??((M,L)=>{let z=setTimeout(M,L);z.unref?.(),e.signal.addEventListener("abort",()=>clearTimeout(z),{once:!0})});return(M)=>{if(e.signal.aborted||M===void 0||!l(M,e.currentVersion))return;if(v!==null&&!l(M,v))return;v=M;let L=(e.random??Math.random)(),z=Number.isFinite(L)?Math.min(Math.max(L,0),1):0;D(()=>{if(!e.signal.aborted)e.check(M).catch(()=>{return})},Math.min(Hd-1,Math.floor(z*Hd)))}}var ug=30000;async function Ud(e){return(e.flush??no)(e.paths,async(l)=>{let{schema_version:v,...D}=l,M=AbortSignal.timeout(ug);try{await e.client.deviceLifecycle(e.device,D,e.signal?AbortSignal.any([e.signal,M]):M)}catch(L){if(L instanceof k&&L.status===400&&L.code==="invalid_device_lifecycle_event")return;throw L}},e.accept)}var qd=25000,fg=5000,mg=600000,pg=["display.stream.v1","pty.start"],hg=64;function Cs(e,l,v=vo(e),D){return ne(),mo(l.roots,{...v,...D?{productionProof:D}:{}})}var As=5000,gg=600000;function wg(e,l){if(e.lifetime!=="persistent"||l!=="darwin"||!process.env[ke])return null;try{return Lt({platform:l})}catch{return null}}function yg(e){return e.event.startsWith("update.")||e.event.startsWith("executor.update.")||e.event.startsWith("identity.")||e.event.startsWith("worker.")}function _g(e,l){let v=Object.keys(l).filter((D)=>l[D]!==!0).sort();try{let D=Za();if(v.length>0)N(e,{event:"worker.capabilities_withheld",runtime_version:g,capabilities:v});if(D)N(e,{event:"identity.computer_use_unavailable",runtime_version:g,reason_code:D})}catch{}}async function Wo(e,l,v,D,M={}){if(ne(),e.executionMode==="host")kr();let L=l.worker?.expiresAt;if(!L||Date.parse(L)<=Date.now())throw Error("worker_credential_expired");let z=ft(e);if(z.revoked)throw Error("worker_revoked");let re=AbortSignal.any([...M.signal?[M.signal]:[],AbortSignal.timeout(Math.max(1,Math.min(15000,Date.parse(L)-Date.now())))]);if(!M.prestartedReadiness)M.onStartup?.("readiness_started");let G,ce=()=>G??=e.executionMode==="host"?Jt():Promise.resolve(!1),we=rc(),te=M.prestartedReadiness??xo(e,M.readinessProbes,re,l.roots[0].permissions),X=M.deferOptionalLanes===!0,he=await(X?te.initial:te.final);if(M.signal?.aborted)throw Error("worker_start_cancelled");if(M.onStartup?.("readiness_completed"),Date.parse(L)<=Date.now())throw Error("worker_credential_expired");let Se,Re=he["github.local.v1"]===!0?(M.probeGithubSignedIn??Ld)().catch(()=>!1):null,Ee=new AbortController,Oe=null,Me=async(Xe,st)=>{let Vt=(e.userChrome??M.ownComputer===!0)&&Xe["automation.call.v1"]===!0?No():null;if(Vt&&"code"in Vt)process.stderr.write(`Reason worker: your own Chrome unavailable (${Vt.code})
|
|
80
|
-
`);let Tt=vo(e,Xe,{displayVideo:Xe["display.stream.v1"]===!0&&await
|
|
76
|
+
`,{mode:384,flag:"wx"});let fe={cwd:z,signal:L,timeout:15000,maxBuffer:16384,env:{PATH:"/usr/bin:/bin"}};G="encode",await _s(v.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(M),"-an","-map_metadata","-1","-vf",`scale=trunc(iw/2)*2:trunc(ih/2)*2,tpad=stop_mode=clone:stop_duration=${M},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",re],fe),G="output";let te=await ld(re);if(!te.isFile()||te.isSymbolicLink()||te.nlink!==1||te.size<128||te.size>10485760)throw Error();G="probe";let{stdout:X}=await _s(v.ffprobe.path,["-v","error","-count_frames","-show_entries","stream=codec_type,codec_name,width,height,nb_read_frames:format=format_name,duration","-of","json",re],fe),le=JSON.parse(X),be=le.streams,ke=Number(le.format?.duration);if(G="probe_streams",!Array.isArray(be)||be.length!==1||be[0]?.codec_type!=="video"||be[0]?.codec_name!=="vp8")throw Error();if(G="probe_dimensions",!Number.isSafeInteger(be[0].width)||be[0].width<2||be[0].width>1600||!Number.isSafeInteger(be[0].height)||be[0].height<2||be[0].height>1000)throw Error();if(G="probe_duration",!Number.isFinite(ke)||Math.abs(ke-M)>0.25)throw Error();if(G="probe_frames",!Number.isSafeInteger(Number(be[0].nb_read_frames))||Number(be[0].nb_read_frames)<1)throw Error();if(G="probe_format",le.format?.format_name!=="matroska,webm")throw Error();return G="decode",await _s(v.ffmpeg.path,["-nostdin","-v","error","-xerror","-max_pixels","1600000","-threads","1","-i",re,"-f","null","-"],fe),G="pin",await Promise.all([Pr(v.ffmpeg),Pr(v.ffprobe)]),await dd(re)}catch{throw Error(L.aborted?"mac_recording_cancelled":`mac_recording_encoding_${G}_failed`)}finally{await oh(z,{recursive:!0,force:!0})}}}}var md=c(["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 Ar=t().min(1).max(1024),fd=n({path:Ar,sha256:t().regex(/^[a-f0-9]{64}$/)}).strict(),pd=n({owner:n({runId:Ar,deviceId:Ar,rootId:Ar,rootRevision:Ar,profile:t().regex(/^(Default|Profile [0-9]+)$/),extensionInstanceId:Ar,generation:Ar,browserScope:Ar,tabId:o().int().positive()}).strict(),socketPath:Ar,extensionId:t().regex(/^[a-p]{32}$/),nativeHostName:Ar,seconds:o().int().min(1).max(15),encoder:n({ffmpeg:fd,ffprobe:fd}).strict()}).strict();var wh=15728640,Jr=()=>Error("mac_recording_worker_failed");function gd(e){let l=pd.parse(e.configuration),v={...e.worker},D=new Map,M=!1,L=!1,z=null,re=async()=>{},G=async(X,le=3000)=>{let be;try{return await Promise.race([X,new Promise((ke,Re)=>{be=setTimeout(()=>Re(Jr()),le)})])}finally{clearTimeout(be)}},ne=()=>z??=G((async()=>{let le=(await Promise.allSettled([re(),e.cleanup()])).find((be)=>be.status==="rejected");if(le?.status==="rejected")throw le.reason})(),5000).catch((X)=>{M=!0;let le=X&&typeof X==="object"&&"code"in X?X.code:null,be=typeof le==="string"&&["ESRCH","EPERM","EACCES","ENOTEMPTY","ENOENT","EBUSY"].includes(le)?le:"unknown";throw Error(`mac_recording_cleanup_failed:${be}`)}),fe=null,te=async()=>{if(M)throw Jr();if(await G(e.assertCurrent()),M)throw Jr()};return{async start(){if(L||fe)throw Error("mac_recording_already_active");L=!0;try{await te(),await Pr({path:v.path,sha256:v.sha256}),await te(),z=null;let X=await fh(await uh(ph(mh(),"reason-recording-host-")));try{await te()}catch(Be){throw await hd(X,{recursive:!0,force:!0}),Be}let le=hh(v.path,[...v.args??[]],{detached:!0,stdio:["pipe","pipe","ignore"],env:{PATH:"/usr/bin:/bin"}}),be=new Promise((Be)=>le.once("close",()=>Be())),ke=()=>{if(le.pid)try{process.kill(-le.pid,"SIGKILL")}catch(Be){if(Be.code!=="ESRCH")throw Be}},Re=null;re=()=>Re??=(async()=>{try{ke()}catch(Be){if(Be.code!=="EPERM")throw Be}await be;try{for(let Be=0;;Be++)try{ke();break}catch(Ke){if(Ke.code!=="EPERM"||Be>=20)throw Ke;await new Promise((Fe)=>setTimeout(Fe,25))}}finally{await hd(X,{recursive:!0,force:!0})}})();let Oe="",Me=0,Ee=!1,Te=!1,We=null,$e,Ue,Ne=new Promise((Be,Ke)=>{$e=Be,Ue=Ke}),Ce,Le,Ge=new Promise((Be,Ke)=>{Ce=Be,Le=Ke});Ge.catch(()=>{});let Ve=(Be=Jr())=>{if(Ee)return;Ee=!0,clearTimeout(Je),clearInterval(Ye),ne().then(()=>{Ue(Be),Le(Be)},(Ke)=>{Ue(Ke),Le(Ke)})},Je=setTimeout(()=>Ve(),(l.seconds+25)*1000),it=!1,Ye=setInterval(()=>{if(it||Ee)return;it=!0,te().catch(()=>Ve()).finally(()=>{it=!1})},250);fe={completion:Ge,stop:()=>{if(!Ee)le.stdin.write(`{"type":"stop"}
|
|
77
|
+
`)},cancel:()=>Ve()},le.on("error",()=>Ve()),le.stdin.on("error",()=>Ve()),le.stdout.on("data",(Be)=>{if(Ee)return;if(Me+=Be.length,Me>wh){Ve();return}Oe+=Be.toString("utf8");let Ke;while((Ke=Oe.indexOf(`
|
|
78
|
+
`))!==-1){let Fe=Oe.slice(0,Ke);Oe=Oe.slice(Ke+1);try{let nt=JSON.parse(Fe);if(nt.type==="failed"&&Object.keys(nt).sort().join(",")==="reason,type"){let at=md.safeParse(nt.reason);Ve(at.success?Error(`mac_recording_worker_failed:${at.data}`):Jr());return}if(nt.type==="unsupported"&&!Te){Ve(Error("mac_recording_encoder_unavailable"));return}if(nt.type==="started"&&!Te&&Object.keys(nt).length===1){Te=!0,$e({recording:!0});continue}if(!Te||nt.type!=="capture"||We||Object.keys(nt).sort().join(",")!=="bytes,capture,type")throw Jr();let Ze=nt.capture;if(!Ze||Object.keys(Ze).sort().join(",")!=="captureId,contentType,durationSeconds,finishedAt,frameCount,owner,receivedFrameCount,sha256,sizeBytes,startedAt"||typeof Ze.sha256!=="string"||typeof Ze.startedAt!=="string"||typeof Ze.finishedAt!=="string"||!gh(Ze.owner,l.owner)||Ze.contentType!=="video/webm"||!/^[a-f0-9]{64}$/.test(Ze.sha256)||!Number.isSafeInteger(Ze.sizeBytes)||Ze.sizeBytes<128||Ze.sizeBytes>10485760||!Number.isSafeInteger(Ze.frameCount)||Ze.frameCount<1||Ze.frameCount>450||!Number.isSafeInteger(Ze.receivedFrameCount)||Ze.receivedFrameCount<Ze.frameCount||Ze.receivedFrameCount>2000||!Number.isFinite(Ze.durationSeconds)||Ze.durationSeconds<0.05||Ze.durationSeconds>l.seconds||!Number.isFinite(Date.parse(Ze.startedAt))||!Number.isFinite(Date.parse(Ze.finishedAt))||Math.abs((Date.parse(Ze.finishedAt)-Date.parse(Ze.startedAt))/1000-Ze.durationSeconds)>0.1||typeof nt.bytes!=="string"||nt.bytes.length%4!==0||!/^[A-Za-z0-9+/]+={0,2}$/.test(nt.bytes))throw Jr();let He=Buffer.from(nt.bytes,"base64");if(He.length!==Ze.sizeBytes||lh("sha256").update(He).digest("hex")!==Ze.sha256||!He.subarray(0,4).equals(Buffer.from([26,69,223,163])))throw Jr();We={capture:Object.freeze({...Ze,captureId:dh(),owner:Object.freeze({...l.owner})}),bytes:He}}catch{Ve();return}}}),le.once("close",(Be)=>{if(Ee)return;if(Be!==0||!We||Oe.trim()){Ve();return}let Ke=We;te().then(async()=>{if(await re(),Ee)return;Ee=!0,clearTimeout(Je),clearInterval(Ye),D.set(Ke.capture.captureId,Ke);while(D.size>2)D.delete(D.keys().next().value);Ce(Ke.capture)}).catch(()=>Ve())}),le.stdin.write(JSON.stringify({...l,scratchDirectory:X})+`
|
|
79
|
+
`);try{return await Ne}catch(Be){throw fe=null,Be}}finally{L=!1}},async completed(){if(await te(),!fe)throw Error("mac_recording_not_active");return fe.completion},async stop(){await te();let X=fe;if(!X)throw Error("mac_recording_not_started");X.stop();try{return await X.completion}finally{if(fe===X)fe=null}},async read(X){await te();let le=D.get(X);if(!le)throw Error("mac_recording_capture_unavailable");return{capture:structuredClone(le.capture),bytes:Buffer.from(le.bytes)}},async close(){if(M)return;M=!0;let X=fe;X?.cancel(),D.clear();try{await ne(),await X?.completion.catch(()=>{})}finally{fe=null}}}}var wd=n({version:i("0.1.42"),metadata:n({extensionId:t(),extensionInstanceId:t(),nativeHostName:t()})});async function bs(e){await e.assertCurrent();let l;if("discover"in e)l=e.discover;else{let v=await yh(e.automationDirectory);l=(D,M)=>Di(v,D,M)}if(await Pr({path:e.worker.path,sha256:e.worker.sha256}),!await To(e.encoder))throw Error("mac_recording_encoder_unavailable");return async(v,D,M,L)=>{L.throwIfAborted(),await e.assertCurrent();let z=await l(v,L),re=new Vr({socketPath:z.socketPath,sessionId:M,timeoutMs:2000}),G;try{if(await re.connect(),G=wd.parse(await re.getInfo()),G.metadata.extensionId!==z.extensionId||G.metadata.extensionInstanceId!==z.instanceId)throw Error("mac_recording_profile_changed");if(!d(n({id:o()})).parse(await re.getTabs()).some((fe)=>fe.id===D))throw Error("mac_recording_tab_not_owned");await e.assertCurrent(),L.throwIfAborted()}finally{re.close()}return{extensionInstanceId:z.instanceId,async createHost(ne,fe,te){let X=new Vr({socketPath:z.socketPath,sessionId:ne.browser.browserScope,timeoutMs:2000});return gd({worker:e.worker,configuration:{owner:ne.browser,seconds:fe,encoder:e.encoder,socketPath:z.socketPath,extensionId:z.extensionId,nativeHostName:G.metadata.nativeHostName},async assertCurrent(){te.throwIfAborted(),L.throwIfAborted(),await e.assertCurrent()},async cleanup(){try{await X.connect();let be=wd.parse(await X.getInfo());if(be.metadata.extensionInstanceId!==ne.browser.extensionInstanceId||be.metadata.extensionId!==z.extensionId||be.metadata.nativeHostName!==G.metadata.nativeHostName)throw Error("mac_recording_profile_changed");await X.executeCdp(D,"Page.stopScreencast",{})}finally{X.close()}}})}}}}var Nt=()=>Error("mac_pr_proof_unavailable"),kh=n({operationId:t().uuid()}).strict();function _d(e){let l=e.qualifiedProfiles??[{profile:e.profile,extension_instance_id:e.extensionInstanceId}],v=d(n({profile:t().regex(/^(Default|Profile [0-9]+)$/),extension_instance_id:t().min(1).max(1024)}).strict()).min(1).max(16).parse(l);if(!t().uuid().safeParse(e.generation).success||new Set(v.map((X)=>X.profile)).size!==v.length)throw Nt();if(!e.qualifiedProfiles){let X=new URL(e.uploadOrigin);if(!e.resolveBrowser||X.protocol!=="https:"||X.origin!==e.uploadOrigin||X.username||X.password)throw Nt()}let D=new Map,M=new Map,L=new Map,z=!1,re=new _h,G=async(X)=>{let le=re.getStore();if(z||!X&&!le)throw Nt();if(le?.signal.throwIfAborted(),await e.assertCurrent(X??le.claim),z)throw Nt();le?.signal.throwIfAborted()},ne=(X,le)=>{let be="owner"in le?le.owner:("context"in le)?le.context.owner:le.input.owner;if(X.capability!==us||!X.owner||be.generation!==e.generation||!v.some((ke)=>ke.profile===be.profile&&ke.extension_instance_id===be.extensionInstanceId)||be.organizationId!==X.owner.organization_id||be.userId!==X.owner.user_id||be.deviceId!==X.owner.device_id||be.rootId!==X.root_id||be.runId!==X.run_id)throw Nt();return be},fe=async(X)=>{await G();let le=JSON.stringify([X.runId,X.profile]),be=D.get(le);if(!be){if(D.size>=4)throw Nt();be=(async()=>{let Re,Oe=e.browserScope?.(X)??jn(X.runId),Me=await e.createBrowser({owner:X,assertCurrent:()=>G(),readVideo:(Ee)=>Re.publicationCapture(Ee)});if(Re=Ql({owner:X,browserScope:Oe,assertCurrent:()=>G(),screenshot:Me.screenshot,async createVideo(Ee,Te,We,$e){if(!e.resolveBrowser)throw Nt();let Ue=await e.resolveBrowser(X.profile,Te,Oe,$e);if(Ue.extensionInstanceId!==X.extensionInstanceId)throw Nt();return Ue.createHost({organizationId:X.organizationId,userId:X.userId,operationId:Ee.contextId,attemptId:Ee.contextId,recordingId:Ee.contextId,browser:{runId:X.runId,deviceId:X.deviceId,rootId:X.rootId,rootRevision:X.rootRevision,generation:X.generation,profile:X.profile,extensionInstanceId:X.extensionInstanceId,browserScope:Oe,tabId:Te}},We,$e)}}),z)throw Me.close(),await Re.close(),Nt();return{owner:structuredClone(X),browser:Me,capture:Re,expiresAt:Date.now()+300000}})(),D.set(le,be)}let ke=await be;if(!yd(ke.owner,X)||ke.expiresAt<=Date.now())throw Nt();return ke},te=setInterval(()=>{for(let[X,le]of D)le.then(async(be)=>{if(be.expiresAt>Date.now()||[...M.values()].some((ke)=>ke.runtime===be))return;if(be.browser.close(),await be.capture.close(),D.get(X)===le)D.delete(X)}).catch(()=>{z=!0})},1000);return te.unref(),{generation:e.generation,async execute(X,le,be){return re.run({claim:X,signal:le},async()=>{let ke=hs.parse(X.payload).command,Re=ne(X,ke);if(await G(X),le.throwIfAborted(),e.qualifiedProfiles&&!e.resolveBrowser&&(ke.action==="prepare"?ke.context.evidenceKind!=="image"||Boolean(ke.context.visualPlan)||!ke.context.uploadOrigin:!["capture_png","inspect_capture","verify_png_media","publish_png"].includes(ke.action)))throw Error("proof_png_only");let Oe=await fe(Re),Me=async()=>{await G(X),le.throwIfAborted()},Ee;switch(ke.action){case"auth_check":Ee=await Oe.browser.preflight(ke.input);break;case"prepare":if(ke.context.visualPlan)throw Error("proof_source_unavailable");if(e.qualifiedProfiles&&!ke.context.uploadOrigin)throw Nt();Ee=await Oe.capture.prepare(ke.context);break;case"capture_png":Ee=await Oe.capture.screenshot({claim:{operationId:X.operation_id,attemptId:X.attempt_id,contextId:ke.contextId,tabId:ke.tabId},signal:le});break;case"start_video":{let Te={runtime:Oe,contextId:ke.contextId,attemptId:X.attempt_id,tabId:ke.tabId,signal:le};if(M.has(X.operation_id))throw Nt();M.set(X.operation_id,Te);try{Ee=await Oe.capture.record({claim:{operationId:X.operation_id,attemptId:X.attempt_id,contextId:ke.contextId,tabId:ke.tabId},signal:le,seconds:ke.seconds,started:async()=>{await Me(),await be({version:1,operationId:X.operation_id,contextId:ke.contextId,acknowledgedAt:new Date().toISOString()})}})}finally{M.delete(X.operation_id)}break}case"inspect_capture":Ee=await Oe.capture.inspect(ke.captureId);break;case"publish_video":Ee=await Oe.browser.publish(ke.input);break;case"verify_saved_media":Ee=await Oe.browser.verify(ke.input);break;case"verify_png_media":Ee=await Oe.browser.verifyImages(ke.media);break;case"publish_png":{let Te=`${Re.runId}:${ke.attemptId}`,We=L.get(Te);if(We){if(!yd(We.request,ke))throw Nt();Ee=We.result;break}if(L.size>=16)throw Nt();let $e=new URL(ke.uploadUrl);if($e.protocol!=="https:"||$e.username||$e.password||$e.hash||$e.pathname!==`/${ke.storagePath}`||!ke.storagePath.startsWith(`pr-screenshots/${Re.runId}/${ke.captureId}/`)||!/^[a-zA-Z0-9._-]+\.png$/.test(ke.storagePath.split("/").at(-1))||ke.storagePath.split("/").length!==4)throw Nt();let Ue=await Oe.capture.publicationCapture(ke.captureId);try{if($e.origin!==(e.qualifiedProfiles?Ue.capture.context.uploadOrigin:e.uploadOrigin)||Ue.capture.media.contentType!=="image/png"||Ue.capture.sha256!==ke.sha256||Ue.bytes.length!==ke.sizeBytes||bh("sha256").update(Ue.bytes).digest("hex")!==ke.sha256)throw Nt();await Me();let Ne={request:structuredClone(ke),result:{status:"uncertain",sha256:ke.sha256,sizeBytes:ke.sizeBytes}};L.set(Te,Ne);try{let Ce=await fetch($e,{method:"PUT",body:Ue.bytes,headers:{"Content-Type":"image/png"},redirect:"error",signal:AbortSignal.any([le,AbortSignal.timeout(20000)])});if(await Ce.body?.cancel(),await Me(),Ce.ok)Ne.result={...Ne.result,status:"uploaded"}}catch{}Ee=Ne.result}finally{Ue.bytes.fill(0)}break}}return await Me(),structuredClone(Ee)})},async control(X,le){if(X.capability!==us||le.kind!==Xl)return!1;let be=kh.safeParse(le.payload),ke=M.get(X.operation_id);if(!be.success||be.data.operationId!==X.operation_id||!ke||ke.attemptId!==X.attempt_id)return!1;let Re=hs.parse(X.payload).command;return ne(X,Re),await G(X),await re.run({claim:X,signal:ke.signal},()=>ke.runtime.capture.stop({operationId:X.operation_id,attemptId:X.attempt_id,contextId:ke.contextId,tabId:ke.tabId})),!0},async close(){z=!0,clearInterval(te);let X=await Promise.allSettled([...D.values()].map(async(le)=>{let be=await le;be.browser.close(),await be.capture.close()}));if(D.clear(),M.clear(),L.clear(),X.some((le)=>le.status==="rejected"))throw Nt()}}}var xh="__browser-recorder",Ih=Ah(vh),Oh="/tmp/open-browser-use",Dh=33554432,Mh=n({version:i("0.1.42"),metadata:n({extensionId:i(ue),extensionInstanceId:t().min(1).max(1024)})}),kd=()=>Error("worker_pr_proof_browser_unavailable"),Ps={components:A,ensureBrowser:Lo,socketDirectory:Oh,async identity(e){let l=new Vr({socketPath:e,sessionId:`reason-proof-qualification-${Rs()}`,timeoutMs:2000});try{return await l.connect(),await l.getInfo()}finally{l.close()}}};async function vd(e,l=Ps){let v=l.components();if(!v?.features.browser)throw kd();await l.ensureBrowser(v),e.throwIfAborted();let D=ks($o(v),"Default","Local Extension Settings",ue),M=(await bd(D)).filter((L)=>L.endsWith(".log")||L.endsWith(".ldb")).map((L)=>ks(D,L));for(let L of(await bd(l.socketDirectory)).filter((z)=>z.endsWith(".sock"))){e.throwIfAborted();let z=ks(l.socketDirectory,L);try{let re=await Rh(z);if(!re.isSocket()||re.uid!==process.getuid?.())continue;let G=Mh.parse(await l.identity(z)).metadata.extensionInstanceId;for(let ne of M)if((await Ph(ne)).size<=Dh&&(await Sd(ne)).includes(G))return{socketPath:z,instanceId:G,extensionId:ue}}catch{}}throw kd()}async function vs(e){let l=await Eh(e);return{path:l,sha256:Sh("sha256").update(await Sd(l)).digest("hex")}}async function Rd(e={}){let l={...Ps,...e};try{let v=l.components();if(!v?.ffmpeg)return{error:"worker_recording_ffmpeg_unavailable"};if(!v.ffprobe)return{error:"worker_recording_ffprobe_unavailable"};let D=await vs(v.ffmpeg),{stdout:M}=await Ih(D.path,["-hide_banner","-encoders"],{timeout:1e4,maxBuffer:1048576,env:{PATH:"/usr/bin:/bin"}});if(!/^\s*V\S*\s+libvpx\s/m.test(M))return{error:"worker_recording_libvpx_unavailable"};let L={ffmpeg:D,ffprobe:await vs(v.ffprobe)};if(!await To(L))return{error:"worker_recording_encoder_unqualified"};let z=e.recorder??{path:process.execPath,args:[...Ch(process.execPath).startsWith("bun")&&process.argv[1]?[process.argv[1]]:[],xh]};return{worker:{...await vs(z.path),args:z.args},encoder:L}}catch{return{error:"worker_recording_unqualified"}}}function Ed(e,l={}){let v={...Ps,...l},D=Rs(),M=Rs(),L=uo.parse({version:2,ready:!0,development_only:!1,proof_ready:!1,result:"metadata_only",boot_generation:D,profiles:["Default"],extension_instance_ids:[M],image:!0,video:!1,source_bound:!1}),z=e.recording?po.parse({...L,version:3,video:!0,max_seconds:15}):L,re=(te)=>Ul(te.organizationId,te.sessionId,te.deviceId,1),G=e.recording,ne,fe=_d({generation:D,qualifiedProfiles:[{profile:"Default",extension_instance_id:M}],assertCurrent:e.assertCurrent,browserScope:re,...G?{resolveBrowser:async(te,X,le,be)=>{ne??=bs({...G,assertCurrent:()=>e.assertCurrent(),discover:(Re,Oe)=>vd(Oe,v)}),ne.catch(()=>{ne=void 0});let ke=await(await ne)(te,X,le,be);return{extensionInstanceId:M,createHost:async(Re,Oe,Me)=>Th(await ke.createHost({...Re,browser:{...Re.browser,extensionInstanceId:ke.extensionInstanceId}},Oe,Me),M)}}}:{},createBrowser:(te)=>ws({...te,endpoint:(X)=>({discover:(le)=>vd(le,v),tabScope:re(X)})})});return{capability:z,broker:fe}}function Th(e,l){let v=(D)=>({...D,owner:{...D.owner,extensionInstanceId:l}});return{start:()=>e.start(),close:()=>e.close(),completed:async()=>v(await e.completed()),stop:async()=>v(await e.stop()),read:async(D)=>{let M=await e.read(D);return{capture:v(M.capture),bytes:M.bytes}}}}import{execFile as Xh}from"child_process";import{execFile as Lh}from"child_process";import{readFile as Wh}from"fs/promises";import{join as vr}from"path";var Nh="Claude Code-credentials",Hh="/usr/bin/security",$h=120000,Bh=8192,Wi={exec:(e,l,v)=>new Promise((D)=>{Lh(e,l,{timeout:v,maxBuffer:8388608},(M,L)=>{let z=M?typeof M.code==="number"?M.code:1:0;D({code:z,stdout:String(L??"")})})}),readText:async(e)=>{try{return await Wh(e,"utf8")}catch{return null}}};function qn(e){return typeof e==="string"&&e.length>0&&e.length<=Bh?e:null}function Uh(e,l){return e.CLAUDE_CONFIG_DIR||vr(l,".claude")}function Fh(e,l){return e.CODEX_HOME||vr(l,".codex")}function Pd(e){if(!e)return null;try{let l=JSON.parse(e).claudeAiOauth,v=qn(l?.accessToken),D=qn(l?.refreshToken),M=typeof l?.expiresAt==="number"&&Number.isFinite(l.expiresAt)?l.expiresAt:null;return v&&D&&M!==null?{provider:"anthropic",access:v,refresh:D,expires:M}:null}catch{return null}}function jh(e){try{let l=JSON.parse(Buffer.from(e.split(".")[1]??"","base64url").toString("utf8"));return typeof l.exp==="number"?l.exp*1000:null}catch{return null}}function qh(e){if(!e)return null;try{let l=JSON.parse(e);if(l.auth_mode!==void 0&&l.auth_mode!=="chatgpt")return null;let v=qn(l.tokens?.access_token),D=qn(l.tokens?.refresh_token);if(!v||!D)return null;return{provider:"openai-codex",access:v,refresh:D,expires:jh(v)??Date.now()}}catch{return null}}function zh(e,l){return vr(e.XDG_DATA_HOME||vr(l,".local","share"),"opencode","auth.json")}var Kh={anthropic:"anthropic",openai:"openai-codex"};function Vh(e){return Id(e,Kh)}function Id(e,l){if(!e)return[];try{let v=JSON.parse(e),D=[];for(let[M,L]of Object.entries(l)){let z=v[M];if(z?.type!=="oauth")continue;let re=qn(z.access),G=qn(z.refresh),ne=typeof z.expires==="number"&&Number.isFinite(z.expires)?z.expires:null;if(re&&G&&ne!==null)D.push({provider:L,access:re,refresh:G,expires:ne})}return D}catch{return[]}}function Jh(e){return Id(e,{anthropic:"anthropic","openai-codex":"openai-codex"})}function Gh(e,l){let v=e.PI_CODING_AGENT_DIR;return v==="~"?l:v?.startsWith("~/")?vr(l,v.slice(2)):v||vr(l,".pi","agent")}async function Od(e,l,v=Wi){let D=[],M=await v.exec(Hh,["find-generic-password","-s",Nh,"-w"],$h),L=Date.now()+300000,z=(G)=>{if(!G)return;let ne=D.findIndex((fe)=>fe.provider===G.provider);if(ne<0)D.push(G);else if(D[ne].expires<=L&&G.expires>L)D[ne]=G};if(z(M.code===0?Pd(M.stdout.trim()):null),!D.some((G)=>G.provider==="anthropic"&&G.expires>L))z(Pd(await v.readText(vr(Uh(e,l),".credentials.json"))));let re=qh(await v.readText(vr(Fh(e,l),"auth.json")));z(re),z(Yh(await v.readText(vr(e.GROK_HOME||vr(l,".grok"),"auth.json"))));for(let G of Vh(await v.readText(zh(e,l))))z(G);for(let G of Jh(await v.readText(vr(Gh(e,l),"auth.json"))))z(G);return D}function Dd(e){return e.map(({provider:l,access:v,expires:D})=>({provider:l,access:v,expires:D}))}var Cd="https://auth.x.ai",Ad="b1a00492-073a-47ea-816f-4c329264a828",xd=(e)=>typeof e==="string"&&e.length>0&&e.length<=8192&&e.trim()===e;function Yh(e){if(!e)return null;try{let l=JSON.parse(e);if(!l||typeof l!=="object"||Array.isArray(l))return null;let v=l[`${Cd}::${Ad}`];if(!v||typeof v!=="object"||Array.isArray(v))return null;let D=v;if(D.auth_mode!=="oidc"||D.oidc_issuer!==Cd||D.oidc_client_id!==Ad||!xd(D.key)||!xd(D.refresh_token)||typeof D.expires_at!=="string")return null;let M=Date.parse(D.expires_at);if(!Number.isFinite(M)||M<=0)return null;return{provider:"xai",access:D.key,refresh:D.refresh_token,expires:M}}catch{return null}}var Md=330000,Zh=300000,Qh=60000;function eg(e,l,v=Date.now()){return e.filter((D)=>{if(!Number.isFinite(D.expires)||D.expires<=v+Md)return!1;let M=l.get(D.provider);return!M||M.access!==D.access||M.expires!==D.expires})}function tg(e,l=Date.now()){return[...e.values()].some((D)=>D.expires<=l+2*Md)?Qh:Zh}var rg=(e,l)=>new Promise((v)=>{if(l.aborted)return v();let D=setTimeout(M,e);function M(){clearTimeout(D),l.removeEventListener("abort",M),v()}l.addEventListener("abort",M,{once:!0})});async function Td(e){let l=new Map,v=e.wait??rg,D=e.stores??(process.platform==="darwin"?Wi:{...Wi,exec:async()=>({code:1,stdout:""})});while(!e.signal.aborted){try{let M=Dd(await Od(e.environment??process.env,e.home,D));for(let L of eg(M,l)){if(e.signal.aborted)return;let z=await e.client.localSubscription(e.state,L,AbortSignal.any([e.signal,AbortSignal.timeout(30000)]));l.set(L.provider,{access:L.access,expires:L.expires}),e.onOutcome?.({provider:L.provider,ok:z.ok,...z.ok?{}:{error:z.error}})}}catch{}await v(tg(l),e.signal)}}function Ld(e=process.env){return new Promise((l)=>{Xh("gh",["auth","status","--hostname","github.com"],{env:e,timeout:8000,maxBuffer:65536},(v)=>l(!v))})}import{execFile as ng,spawn as PR,spawnSync as CR}from"child_process";import{chmodSync as xR,existsSync as og,mkdirSync as IR,readFileSync as OR,renameSync as DR,rmSync as MR,statSync as TR,writeFileSync as LR}from"fs";import{dirname as NR,isAbsolute as HR,join as Hi}from"path";var Wd=/^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$/;function Nd(e,l){if(!Wd.test(e)||!Wd.test(l))throw Error("Invalid CLI version");let v=e.split(".").map(BigInt),D=l.split(".").map(BigInt);for(let M=0;M<3;M++){if(v[M]<D[M])return-1;if(v[M]>D[M])return 1}return 0}var ig="com.reasonmachines.updater",ag=["so.ara.updater","so.reason.updater"];function sg(e){let l=e==="staging"?".staging":"";return{label:`${ig}${l}`,legacyLabels:[...ag].reverse().map((v)=>`${v}${l}`)}}function cg(e,l){return l==="darwin"?e.launchAgent:l==="win32"?e.scheduledTask:e.systemdService}function lg(e,l,v){return{launchAgent:Hi(l,"Library","LaunchAgents",`${e}.plist`),systemdService:Hi(v,"systemd","user",`${e}.service`),systemdTimer:Hi(v,"systemd","user",`${e}.timer`),scheduledTask:Hi(Ni(l),`${e}.xml`)}}function dg(e,l){return new Promise((v)=>{ng(B(e),[...l],{timeout:1e4},(D)=>{v(D?typeof D.code==="number"?D.code:1:0)})})}async function $d(e){let l=e.runtimePlatform??process.platform;if(l!=="darwin"&&l!=="linux"&&l!=="win32")return"absent";let v=e.uid??process.getuid?.();if(l!=="win32"&&(typeof v!=="number"||!Number.isSafeInteger(v)||v<=0))return"absent";let D=e.home??s(),{label:M,legacyLabels:L}=sg(e.channel),z=e.configHome??Et(D),re=[M,...L].filter((te)=>og(cg(lg(te,D,z),l)));if(re.length===0)return"absent";let G=e.command??dg,ne=re[0];if(re.length>1){for(let te of re)if((l==="darwin"?await G("/bin/launchctl",["print",`gui/${v}/${te}`]):l==="win32"?await G("schtasks",["/Query","/TN",te]):await G("systemctl",["--user","is-enabled",`${te}.timer`]))===0){ne=te;break}}return(l==="darwin"?await G("/bin/launchctl",["kickstart",`gui/${v}/${ne}`]):l==="win32"?await G("schtasks",["/Run","/TN",ne]):await G("systemctl",["--user","start","--no-block",`${ne}.service`]))===0?"started":"failed"}var Hd=60000;function Bd(e){let l=(M,L)=>{try{return Nd(M,L)>0}catch{return!1}},v=e.actedOn&&l(e.actedOn,"0.0.0")?e.actedOn:null,D=e.schedule??((M,L)=>{let z=setTimeout(M,L);z.unref?.(),e.signal.addEventListener("abort",()=>clearTimeout(z),{once:!0})});return(M)=>{if(e.signal.aborted||M===void 0||!l(M,e.currentVersion))return;if(v!==null&&!l(M,v))return;v=M;let L=(e.random??Math.random)(),z=Number.isFinite(L)?Math.min(Math.max(L,0),1):0;D(()=>{if(!e.signal.aborted)e.check(M).catch(()=>{return})},Math.min(Hd-1,Math.floor(z*Hd)))}}var ug=30000;async function Ud(e){return(e.flush??no)(e.paths,async(l)=>{let{schema_version:v,...D}=l,M=AbortSignal.timeout(ug);try{await e.client.deviceLifecycle(e.device,D,e.signal?AbortSignal.any([e.signal,M]):M)}catch(L){if(L instanceof k&&L.status===400&&L.code==="invalid_device_lifecycle_event")return;throw L}},e.accept)}var qd=25000,fg=5000,mg=600000,pg=["display.stream.v1","pty.start"],hg=64;function Cs(e,l,v=vo(e),D){return ie(),mo(l.roots,{...v,...D?{productionProof:D}:{}})}var As=5000,gg=600000;function wg(e,l){if(e.lifetime!=="persistent"||l!=="darwin"||!process.env[xe])return null;try{return Lt({platform:l})}catch{return null}}function yg(e){return e.event.startsWith("update.")||e.event.startsWith("executor.update.")||e.event.startsWith("identity.")||e.event.startsWith("worker.")}function _g(e,l){let v=Object.keys(l).filter((D)=>l[D]!==!0).sort();try{let D=Za();if(v.length>0)N(e,{event:"worker.capabilities_withheld",runtime_version:g,capabilities:v});if(D)N(e,{event:"identity.computer_use_unavailable",runtime_version:g,reason_code:D})}catch{}}async function Wo(e,l,v,D,M={}){if(ie(),e.executionMode==="host")kr();let L=l.worker?.expiresAt;if(!L||Date.parse(L)<=Date.now())throw Error("worker_credential_expired");let z=ft(e);if(z.revoked)throw Error("worker_revoked");let re=AbortSignal.any([...M.signal?[M.signal]:[],AbortSignal.timeout(Math.max(1,Math.min(15000,Date.parse(L)-Date.now())))]);if(!M.prestartedReadiness)M.onStartup?.("readiness_started");let G,ne=()=>G??=e.executionMode==="host"?Jt():Promise.resolve(!1),fe=rc(),te=M.prestartedReadiness??xo(e,M.readinessProbes,re,l.roots[0].permissions),X=M.deferOptionalLanes===!0,le=await(X?te.initial:te.final);if(M.signal?.aborted)throw Error("worker_start_cancelled");if(M.onStartup?.("readiness_completed"),Date.parse(L)<=Date.now())throw Error("worker_credential_expired");let be,ke=le["github.local.v1"]===!0?(M.probeGithubSignedIn??Ld)().catch(()=>!1):null,Re=new AbortController,Oe=null,Me=async(Xe,st)=>{let Vt=(e.userChrome??M.ownComputer===!0)&&Xe["automation.call.v1"]===!0?No():null;if(Vt&&"code"in Vt)process.stderr.write(`Reason worker: your own Chrome unavailable (${Vt.code})
|
|
80
|
+
`);let Tt=vo(e,Xe,{displayVideo:Xe["display.stream.v1"]===!0&&await ne(),handsBrowser:Xe["hands.connect"]===!0&&fe,userChrome:Vt&&"host"in Vt?Vt.host:null,...be===void 0?{}:{githubSignedIn:be},persistentTerminals:Xe["pty.start"]===!0&&Ri(),probing:st,ownComputer:M.ownComputer===!0});if(!Oe&&Tt.worker.readiness?.["browser.pr-proof.v1"]===!0){let gr=await Rd();if(Oe||Re.signal.aborted)return Tt;process.stderr.write("error"in gr?`Reason worker: PR video proof unavailable (${gr.error})
|
|
81
81
|
`:`Reason worker: PR video proof ready (ffmpeg ${gr.encoder.ffmpeg.path})
|
|
82
|
-
`),Oe=Ed({assertCurrent:async()=>{if(!Ye())throw Error("proof_authority_lost")},...!("error"in gr)?{recording:gr}:{}})}return Tt},
|
|
83
|
-
`)}at.clear();for(let st of Xe)at.add(st)},mg);kt.unref();let jt=(Xe)=>{if(!M.readinessProbes)Tl({config:e,readiness:Xe,signal:
|
|
84
|
-
`),jt(Xe)},()=>{}):Promise.resolve();if(!X)jt(
|
|
82
|
+
`),Oe=Ed({assertCurrent:async()=>{if(!Ye())throw Error("proof_authority_lost")},...!("error"in gr)?{recording:gr}:{}})}return Tt},Ee=await Me(le,X?es.filter((Xe)=>le[Xe]!==!0):[]),Te=Cs(e,l,Ee,Oe?.capability);M.onStartup?.("inventory_completed");let We=!1,$e=0,Ue=0,Ne="starting",Ce=null,Le=!1,Ge=!1,Ve=null,Je,it=()=>!z.drained&&Date.parse(L)>Date.now()&&Te.supported_operations.some((Xe)=>Ee.worker.readiness?.[Xe]===!0),Ye=()=>!We&&it(),Be=null,Ke=()=>$e+(Be?.claims()??0),Fe=null,nt=new Set,Ze=(Xe)=>{let st=Xe.capabilities.root_paths;if(Object.assign(Xe.capabilities,Cs(Xe.config,Xe.state,Ee,Oe?.capability)),st)Xe.capabilities.root_paths=st},He=(Xe)=>{Ee=Xe,Ze({config:e,state:l,capabilities:Te}),Fe?.();for(let st of nt)Ze(st),st.heartbeatNow?.()},at=new Set,lt=new Set,kt=setInterval(()=>{let Xe=new Set;for(let st of[{state:l,capabilities:Te},...nt])for(let Ct of pg){if(st.capabilities.operation_constraints?.[Ct]?.probing!==!0)continue;let Tt=`${st.state.deviceId} ${Ct}`;if(Xe.add(Tt),!at.has(Tt)||lt.has(Tt))continue;lt.add(Tt),process.stderr.write(`${JSON.stringify({event:"worker.readiness_probing_stale",device_id:st.state.deviceId,lane:Ct,login_device:st.state===l,timestamp:new Date().toISOString()})}
|
|
83
|
+
`)}at.clear();for(let st of Xe)at.add(st)},mg);kt.unref();let jt=(Xe)=>{if(!M.readinessProbes)Tl({config:e,readiness:Xe,signal:Re.signal,idle:()=>Ke()===0,permissions:l.roots[0].permissions,onReady:(st)=>{Me(st,[]).then(He)}})},Kt=X?te.final.then(async(Xe)=>{if(Re.signal.aborted)return;He(await Me(Xe,[]));let st=es.filter((Ct)=>Xe[Ct]===!0);process.stderr.write(`Reason worker: deferred lanes decided (${st.length?`ready: ${st.join(", ")}`:"none ready"}).
|
|
84
|
+
`),jt(Xe)},()=>{}):Promise.resolve();if(!X)jt(le);ke?.then(async(Xe)=>{be=Xe;for(;;){let st=Ee,Ct=await Me(st.worker.readiness??{},st.worker.probing??[]);if(Re.signal.aborted)return;if(Ee!==st)continue;He(Ct);return}});let pr=X&&Ee.worker.probing?.includes("pty.start")?te.pty.then(async(Xe)=>{let st=()=>Ee.worker.probing?.includes("pty.start")===!0;if(Re.signal.aborted||!st())return;let Ct=await Me({...Ee.worker.readiness,"pty.start":Xe},(Ee.worker.probing??[]).filter((Vt)=>Vt!=="pty.start"));if(Re.signal.aborted||!st())return;He(Ct)},()=>{}):Promise.resolve(),Xr=()=>({version:1,instanceId:D,deviceId:l.deviceId,phase:Ne,drained:z.drained||We||Le,activeClaims:Ke(),activeSessions:Ue,lastHeartbeat:Ce,expiresAt:L,supportedOperations:[...Te.supported_operations],capabilityReadiness:Ee.worker.readiness,executionEligible:Ye()&&!Le&&Ne==="running"}),In=!1,Lr=()=>{In=!0,xr()},xr=()=>{if(We)return;if(We=!0,Ne="stopping",Ve?.close(),Ke()===0)Re.abort();else Je=setTimeout(()=>Re.abort(),e.shutdownGraceMs)},sn=e.channel==="production"||e.channel==="staging"?e.channel:null,Ir=f(e).releaseCheck,er=M.publishedRelease??(sn&&e.lifetime==="persistent"?Bd({currentVersion:g,signal:Re.signal,actedOn:(()=>{try{let Xe=JSON.parse(m(Ir));return typeof Xe==="string"?Xe:null}catch{return null}})(),check:async(Xe)=>{try{y(Ir,Xe)}catch{}let st=await $d({channel:sn});process.stderr.write(st==="started"?`Reason worker: CLI ${Xe} is published; the updater is checking now.
|
|
85
85
|
`:st==="absent"?`Reason worker: CLI ${Xe} is published; no updater is installed for it here.
|
|
86
86
|
`:`Reason worker: CLI ${Xe} is published; the updater did not start, so its next scheduled check takes it.
|
|
87
|
-
`)}}):void 0),On=(Xe)=>{if(Xe==="stop")Lr();if(Xe==="reload_roots"){let st=S(e);if(!st||st.deviceId!==l.deviceId)throw Error("worker_identity_changed");l.roots=st.roots;let Ct=Jn(l.roots,jd());if(Ct)Te.root_paths=Ct;else delete Te.root_paths;Be?.check()}if(Xe==="drain"||Xe==="resume"){if(We||Date.parse(L)<=Date.now())throw Error("worker_stopping_or_expired");z={...z,drained:Xe==="drain"},qt(e,z)}return Xr()};M.prestartedControl?.handle(On);let zo=M.prestartedControl?await M.prestartedControl.closed:await pi(e,D,On),cn,tt=!1,yt=()=>{let Xe=Date.parse(L)-Date.now();if(Xe>0){cn=setTimeout(yt,Math.min(Xe,2147483647));return}We=!0,Ve?.close(),tt=!0,Ne="stopping",
|
|
88
|
-
`);let Vt=!0,Tt=!1,gr=0,vt=()=>{if(!Xe.deviceLifecycle||!Vt||Tt||
|
|
89
|
-
`)}}),Ve.arm(),setTimeout(an,0);else if(!ot.handsPrespawn&&Ve)Ve.close(),Ve=null}if(ot.type==="heartbeat"){if(Be&&!We&&Date.now()>=Qi)Qi=Date.now()+Vo,Be.check().then((wr)=>{ea=wr?0:ea+1,Qi=Date.now()+(wr?Vo:Math.min(Vo,kc*2**Math.min(ea-1,10)))});if(
|
|
90
|
-
`)});else if(We&&!tt)await Gs({state:l,client:Xe});if(In)await wa().catch(()=>{return})}catch(Xe){if(!(Xe instanceof k&&Xe.status===401)||Xe.code==="invalid_device_proof"||Xe.code==="device_proof_replayed")throw Xe;if(qt(e,{...z,revoked:!0}),Xe.code==="device_revoked")M.onDeviceRevoked?.();throw Error("worker_revoked")}finally{if(clearTimeout(cn),clearInterval(kt),Je)clearTimeout(Je);if(Wr)process.removeListener("SIGTERM",xr),process.removeListener("SIGINT",Lr);M.signal?.removeEventListener("abort",xr),
|
|
91
|
-
`;if(Buffer.byteLength(v)>65536)throw Error("worker_ssh_frame_too_large");let D;try{await new Promise((M,L)=>{D=this.clock.after(l,()=>L(Error("worker_ssh_write_timeout"))),this.output.write(v,(z)=>z?L(Error("worker_ssh_connection_failed")):M())})}finally{D?.()}}async receive(e=30000,l){if(l?.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 v,D;try{return await new Promise((M,L)=>{this.waiter={resolve:M,reject:L},D=()=>{this.waiter=void 0,L(Error("worker_ssh_cancelled"))},v=this.clock.after(e,()=>{this.waiter=void 0,L(Error("worker_ssh_handshake_timeout"))}),l?.addEventListener("abort",D,{once:!0})})}finally{v?.(),l?.removeEventListener("abort",D)}}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 Rg}from"crypto";import{unlinkSync as Eg}from"fs";import{join as Pg}from"path";var jo=1,Bi=45000,Cg=h({type:i("configure"),protocol:i(jo),version:t(),config:x}),Ag=h({type:i("ticket"),organizationId:t().min(1).max(160),receipt:Rt()}),xg=h({type:c(["ping","stop"])});async function Jd(e={}){let l=e.clock??Uo,v=new Fo(e.input??process.stdin,e.output??process.stdout,l),D=new AbortController,M=new AbortController,L=()=>D.abort(),z,re,G,
|
|
87
|
+
`)}}):void 0),On=(Xe)=>{if(Xe==="stop")Lr();if(Xe==="reload_roots"){let st=S(e);if(!st||st.deviceId!==l.deviceId)throw Error("worker_identity_changed");l.roots=st.roots;let Ct=Jn(l.roots,jd());if(Ct)Te.root_paths=Ct;else delete Te.root_paths;Be?.check()}if(Xe==="drain"||Xe==="resume"){if(We||Date.parse(L)<=Date.now())throw Error("worker_stopping_or_expired");z={...z,drained:Xe==="drain"},qt(e,z)}return Xr()};M.prestartedControl?.handle(On);let zo=M.prestartedControl?await M.prestartedControl.closed:await pi(e,D,On),cn,tt=!1,yt=()=>{let Xe=Date.parse(L)-Date.now();if(Xe>0){cn=setTimeout(yt,Math.min(Xe,2147483647));return}We=!0,Ve?.close(),tt=!0,Ne="stopping",Re.abort(Error("worker_credential_expired"))};yt(),M.signal?.addEventListener("abort",xr,{once:!0});let Wr=M.processSignals!==!1;if(Wr)process.once("SIGTERM",xr),process.once("SIGINT",Lr);if(M.signal?.aborted)xr();try{M.onStartup?.("control_ready");let Xe=M.client??new ar(we(e.apiOrigin),se(e.proxy,zd()),v,{deviceSession:Fa({proxied:Boolean(e.proxy)||process.env.REASON_RELAY_CUSTOM_DOMAIN==="1"}),prefetchEventChallenges:!0}),st=!Pe(e.executionMode==="host")?"not_root_host":!J()?"no_jobs_user":So(),Ct={event_id:Fd(),event:"worker.model_jobs_egress",occurred_at:new Date().toISOString(),runtime_version:g,reason_code:st==="active"?"gid_v1":st};process.stderr.write(`${JSON.stringify({...Ct,device_id:l.deviceId})}
|
|
88
|
+
`);let Vt=!0,Tt=!1,gr=0,vt=()=>{if(!Xe.deviceLifecycle||!Vt||Tt||Re.signal.aborted||Date.now()<gr)return;Tt=!0,gr=Date.now()+30000,Xe.deviceLifecycle(l,Ct,AbortSignal.any([Re.signal,AbortSignal.timeout(As)])).then(()=>{Vt=!1},()=>{}).finally(()=>{Tt=!1})};vt();let rr=f(e).daemon,At=ia(e,l.deviceId),Sr=M.startupTiming,$r=Sr?()=>({...Sr(),...At?.enrollmentMs!==void 0?{enrollment_ms:At.enrollmentMs}:{}}):void 0,ln=(ot)=>{let wr=ot.client.localSubscription?.bind(ot.client);if(e.localLogins===!0&&wr)(M.handOverLocalLogins??Td)({state:ot.state,client:{localSubscription:wr},signal:ot.signal,home:s()}).catch(()=>{return});let It=jd(),Yt=ot.client.liveSessionWorktrees?.bind(ot.client);if(Yt)tc(()=>ec({home:It,deviceId:ot.state.deviceId,liveIds:(Ur)=>Yt(ot.state,Ur,ot.signal)}),ot.signal)};ln({state:l,client:Xe,signal:Re.signal});let Br=wg(e,M.platform??process.platform),Ft=Xe.deviceLifecycle?.bind(Xe),Gt=Promise.resolve(),oo=0,Ko=()=>{if(!Br||!Ft||We||Date.now()<oo)return;oo=Date.now()+gg,Gt=Gt.then(()=>Ud({paths:Br,device:l,client:{deviceLifecycle:Ft},accept:yg,signal:Re.signal})).catch(()=>{return})};if(Ko(),Br)te.final.then((ot)=>_g(Br,ot),()=>{});let Js=(ot,wr)=>({state:ot.state,client:ot.client,...ot.firstHeartbeat?{firstHeartbeat:ot.firstHeartbeat}:{},runtimeVersion:g,bridgeVersion:g,protocolVersion:2,capabilities:ot.capabilities,signal:ot.signal,statusPath:ot.statusPath,maxConcurrentClaims:M.ownComputer===!0?hg:4*e.slots+Ha,heartbeatIntervalMs:M.heartbeatIntervalMs,operationHeartbeatAttemptTimeoutMs:qd,operationCompletionTimeoutMs:qd,maxConsecutiveHeartbeatFailures:3,claimable:Ye,advertised:it,onClaim:async(It,Yt,Ur)=>{let so=Date.now();if(!ot.capabilities.supported_operations.includes(It.capability))return{status:"failed",error_code:"unsupported_capability"};let yr=Ee.worker.probing??[],Qs=yr.includes(It.capability)?Kt:It.capability==="hands.connect"&&e.executionMode==="host"&&yr.includes("pty.start")?pr:null;if(Qs){let Go,ra=()=>{};await Promise.race([Qs,new Promise((nc)=>{Go=setTimeout(nc,fg),ra=()=>nc(),Yt.addEventListener("abort",ra,{once:!0})})]),clearTimeout(Go),Yt.removeEventListener("abort",ra)}let Jo=It.capability==="hands.connect",ta=Jo?Ve:null,Ju={signal:Yt,emit:Ur,...Ee,...Oe?{proveMac:Oe.broker.execute}:{},...It.capability==="inference.custom.v1"&&ot.client.operationCustomEndpointCredential?{customEndpointCredential:(Go)=>ot.client.operationCustomEndpointCredential(ot.state,It,Go)}:{},...Jo?{handsLaunch:{claimedAtMs:so,...ta?{takePrespawnedWorker:ta.take,adoptSpawnedWorker:ta.adopt}:{}}}:{}};if(Jo)Ue+=1;try{return await(M.execute??Xn)(ot.state,It,Ju)}finally{if(Jo)Ue-=1}},onControl:async(It,Yt)=>await go(ot.state,It,Yt,ot.client)||await _o(ot.state,It,Yt)||await bo(It,Yt)||await Oe?.broker.control(It,Yt)||!1,onEvent:wr}),Gs=async(ot)=>{await ot.client.deviceLifecycle?.(ot.state,{event_id:Fd(),event:"service.stopped",occurred_at:new Date().toISOString(),runtime_version:g,reason_code:"worker_stopped"},AbortSignal.timeout(As)).catch(()=>{return})},ao=e.lifetime==="persistent"?M.ownerWorkspaces:void 0,Vo=ao?.intervalMs??pa,Xs=Xe.ownerWorkspaces?.bind(Xe),Zs=Xe.ownerWorkspaceEnrollment?.bind(Xe);if(ao&&Xs&&Zs)Be=Cc({config:e,state:l,signal:Re.signal,client:{ownerWorkspaces:Xs,ownerWorkspaceEnrollment:Zs},...ao.enroll?{enroll:ao.enroll}:{},intervalMs:Vo,log:(ot)=>{process.stderr.write(ot)},serve:async(ot,wr,It)=>{let Yt=ia(ot.config,ot.state.deviceId),Ur={config:ot.config,state:ot.state,signal:wr,statusPath:f(ot.config).daemon,...Yt?.offer?{firstHeartbeat:Yt.offer}:{},capabilities:Cs(ot.config,ot.state,Ee,Oe?.capability),client:ao.client?.(ot)??new ar(we(e.apiOrigin),se(e.proxy,zd()),ot.proofStore,{deviceSession:Fa({proxied:Boolean(e.proxy)||process.env.REASON_RELAY_CUSTOM_DOMAIN==="1"}),prefetchEventChallenges:!0})};ln(Ur);let so={...Ur,heartbeatNow:null};nt.add(so);try{await Ka({registerHeartbeatNow:(yr)=>{so.heartbeatNow=yr},...Js(Ur,(yr)=>{if(yr.type==="completed")ti(yr.operationId,yr.status);if(yr.type==="claims_changed"){if(It(yr.activeClaims),We&&Ke()===0)Re.abort()}if(yr.type==="stopped")It(0)})})}finally{nt.delete(so)}if(We&&!tt)await Gs(Ur)}});let Qi=0,ea=0;if(await Ka({...(M.platform??process.platform)==="darwin"?{readIdleSleepPolicy:()=>Ke()>0?nr(rr):void 0,...M.acquireAwakeHold?{acquireAwakeHold:M.acquireAwakeHold}:{}}:{},registerHeartbeatNow:(ot)=>{Fe=ot},...$r?{startup:$r}:{},...Js({state:l,client:Xe,capabilities:Te,signal:Re.signal,statusPath:rr,...At?.offer?{firstHeartbeat:At.offer}:{}},(ot)=>{if(ot.type==="completed")ti(ot.operationId,ot.status);if(ot.type==="claims_changed"){if($e=ot.activeClaims,We&&Ke()===0)Re.abort()}if(ot.type==="heartbeat"&&!We){if(ot.handsPrespawn&&e.lifetime==="ephemeral"&&!Ve)Ve=nn({log:(wr,It)=>{process.stderr.write(`${JSON.stringify({event:wr,...It})}
|
|
89
|
+
`)}}),Ve.arm(),setTimeout(an,0);else if(!ot.handsPrespawn&&Ve)Ve.close(),Ve=null}if(ot.type==="heartbeat"){if(Be&&!We&&Date.now()>=Qi)Qi=Date.now()+Vo,Be.check().then((wr)=>{ea=wr?0:ea+1,Qi=Date.now()+(wr?Vo:Math.min(Vo,kc*2**Math.min(ea-1,10)))});if(Ce=ot.serverTime,Le=ot.drain,vt(),Ko(),!We&&sn)er?.(ot.latestCliVersions?.[sn]);if(!We)Ne="running";if(!We&&!Ge&&Xr().executionEligible){if(Ge=!0,M.onStartup?.("ready"),(M.platform??process.platform)==="darwin")setTimeout(()=>{try{Ui({skipWhenSettled:!0})}catch{}},0)}}if(ot.type==="reconnecting"&&!We)Ne="reconnecting";if(ot.type==="stopped")$e=0;M.onEvent?.(ot)})}),await Be?.settled(),We&&!tt&&e.lifetime==="ephemeral")await Xe.disconnect?.(l,AbortSignal.timeout(As)).catch(()=>{process.stderr.write(`Reason worker: could not remove this computer from Reason (worker_disconnect_failed); it expires on its own.
|
|
90
|
+
`)});else if(We&&!tt)await Gs({state:l,client:Xe});if(In)await wa().catch(()=>{return})}catch(Xe){if(!(Xe instanceof k&&Xe.status===401)||Xe.code==="invalid_device_proof"||Xe.code==="device_proof_replayed")throw Xe;if(qt(e,{...z,revoked:!0}),Xe.code==="device_revoked")M.onDeviceRevoked?.();throw Error("worker_revoked")}finally{if(clearTimeout(cn),clearInterval(kt),Je)clearTimeout(Je);if(Wr)process.removeListener("SIGTERM",xr),process.removeListener("SIGINT",Lr);M.signal?.removeEventListener("abort",xr),Re.abort(),Ve?.close(),await Be?.settled().catch(()=>{return}),await Oe?.broker.close().catch(()=>{return}),await zo()}}function zd(e=process.env){if(e.REASON_RELAY_CUSTOM_DOMAIN!=="1")return fetch;return Object.assign((v,D)=>{let M=new Headers(D?.headers);return M.set(Ss,Es),fetch(v,{...D,headers:M})},{preconnect:fetch.preconnect})}import{generateKeyPairSync as bg,sign as kg}from"crypto";var Kd=65536,vg=65536;function Sg(e){let l=e.export({format:"jwk"});if(l.crv!=="P-256"||typeof l.x!=="string"||typeof l.y!=="string")throw new a("invalid_public_key");let v=Buffer.from(l.x,"base64url"),D=Buffer.from(l.y,"base64url");if(v.byteLength!==32||D.byteLength!==32)throw new a("invalid_public_key");let M=Buffer.concat([Buffer.of(4),v,D]).toString("base64url");if(!Ht(M))throw new a("invalid_public_key");return M}function Vd(){try{let{privateKey:e,publicKey:l}=bg("ec",{namedCurve:"P-256"});return{privateKey:e,publicPoint:Sg(l)}}catch(e){if(e instanceof a)throw e;throw new a("proof_key_generation_failed")}}class Ho{keyPair=Vd();binding=null;loadPublicKey(){if(!this.keyPair)throw new a("proof_key_read_failed");return this.keyPair.publicPoint}createFreshPublicKey(){return this.keyPair=Vd(),this.keyPair.publicPoint}sign(e){if(!this.keyPair||e.byteLength<1||e.byteLength>vg)throw new a("proof_sign_failed");let l;try{l=kg("sha256",e,this.keyPair.privateKey)}catch{throw new a("proof_sign_failed")}if(!Si(l))throw new a("invalid_signature");return l.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(e){if(e.byteLength<1||e.byteLength>Kd)throw new a("invalid_binding");if(this.binding)throw new a("binding_create_failed");this.binding=Uint8Array.from(e)}updateBinding(e){if(e.byteLength<1||e.byteLength>Kd)throw new a("invalid_binding");if(!this.binding)throw new a("binding_update_failed");this.binding=Uint8Array.from(e)}deleteBinding(){if(!this.binding)return!1;return this.binding=null,!0}loadLegacyCredential(){return null}deleteLegacyCredential(){return!1}}import{execFile as Ig,spawn as Og}from"child_process";import{isAbsolute as Dg}from"path";import{promisify as Mg}from"util";var Uo={now:()=>Date.now(),after(e,l){let v=setTimeout(l,e);return()=>clearTimeout(v)},every(e,l){let v=setInterval(l,e);return()=>clearInterval(v)}};class Fo{input;output;clock;lifetime=new AbortController;signal=this.lifetime.signal;buffer=Buffer.alloc(0);queue=[];failure;waiter;onData=(e)=>{let l=Buffer.isBuffer(e)?e:Buffer.from(e),v=0;while(v<l.length&&!this.failure){let D=l.indexOf(10,v),M=D<0?l.length:D;if(this.buffer.length+M-v+1>65536){this.fail(Error("worker_ssh_frame_too_large"));return}if(this.buffer=Buffer.concat([this.buffer,l.subarray(v,M)]),D<0)return;try{let L=JSON.parse(this.buffer.toString("utf8"));if(this.buffer=Buffer.alloc(0),this.waiter){let z=this.waiter;this.waiter=void 0,z.resolve(L)}else if(this.queue.length<4)this.queue.push(L);else{this.fail(Error("worker_ssh_protocol_flood"));return}}catch{this.fail(Error("worker_ssh_invalid_frame"));return}v=M+1}};onEnd=()=>this.fail(Error("worker_ssh_connection_closed"),!0);onError=()=>this.fail(Error("worker_ssh_connection_failed"));constructor(e,l,v=Uo){this.input=e;this.output=l;this.clock=v;e.on("data",this.onData),e.on("end",this.onEnd),e.on("close",this.onEnd),e.on("error",this.onError),l.on("error",this.onError)}fail(e,l=!1){if(this.failure??=e,this.buffer=Buffer.alloc(0),!l)this.queue=[];this.lifetime.abort();let v=this.waiter;this.waiter=void 0,v?.reject(this.failure)}async send(e,l=1e4){if(this.failure||this.output.destroyed)throw this.failure??Error("worker_ssh_connection_closed");let v=JSON.stringify(e)+`
|
|
91
|
+
`;if(Buffer.byteLength(v)>65536)throw Error("worker_ssh_frame_too_large");let D;try{await new Promise((M,L)=>{D=this.clock.after(l,()=>L(Error("worker_ssh_write_timeout"))),this.output.write(v,(z)=>z?L(Error("worker_ssh_connection_failed")):M())})}finally{D?.()}}async receive(e=30000,l){if(l?.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 v,D;try{return await new Promise((M,L)=>{this.waiter={resolve:M,reject:L},D=()=>{this.waiter=void 0,L(Error("worker_ssh_cancelled"))},v=this.clock.after(e,()=>{this.waiter=void 0,L(Error("worker_ssh_handshake_timeout"))}),l?.addEventListener("abort",D,{once:!0})})}finally{v?.(),l?.removeEventListener("abort",D)}}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 Rg}from"crypto";import{unlinkSync as Eg}from"fs";import{join as Pg}from"path";var jo=1,Bi=45000,Cg=h({type:i("configure"),protocol:i(jo),version:t(),config:x}),Ag=h({type:i("ticket"),organizationId:t().min(1).max(160),receipt:Rt()}),xg=h({type:c(["ping","stop"])});async function Jd(e={}){let l=e.clock??Uo,v=new Fo(e.input??process.stdin,e.output??process.stdout,l),D=new AbortController,M=new AbortController,L=()=>D.abort(),z,re,G,ne,fe=!1;process.once("SIGHUP",L),v.signal.addEventListener("abort",L,{once:!0}),e.signal?.addEventListener("abort",L,{once:!0});try{if(e.signal?.aborted)throw Error("worker_ssh_cancelled");let{config:te,version:X}=Cg.parse(await v.receive(30000,D.signal));if(X!==g)throw Error("worker_ssh_version_mismatch");if(!["darwin","linux"].includes(process.platform)||!["arm64","x64"].includes(process.arch))throw Error("worker_ssh_platform_unsupported");if(Or(te),b(p(te),!0),re=oe({path:f(te).lock,runtimeVersion:g}),!re.acquired)throw Error("worker_already_running_or_lifecycle_busy");let le=Pg(p(te),`ssh-preflight-${Rg()}.json`);try{y(le,{version:1}),m(le)}finally{try{Eg(le)}catch{}}let be=S(te),ke=ft(te);if(ke.revoked||ke.drained)throw Error("worker_ssh_revoked_or_drained");if(be&&Date.parse(be.worker.expiresAt)<=Date.now())throw Error("worker_credential_expired");if(be&&te.lifetime==="ephemeral")throw Error("worker_ephemeral_requires_fresh_enrollment");await v.send({type:"hello",protocol:jo,version:g,platform:process.platform,architecture:process.arch,enrolled:!!be});let Re=te.lifetime==="ephemeral"?G=new Ho:xt(te,!0);if(!be){let We=Kr(te);await v.send({type:"ticket-request",request:We.request});let $e=Ag.parse(await v.receive(70000,D.signal)),Ue=We.complete($e.organizationId,$e.receipt);if(be=await Er(te,Ue,Re,e.enroll),te.lifetime==="persistent")ce(be,f(te).state,{proofStore:Re});qt(te,{version:1,drained:!1,revoked:!1})}if(D.signal.aborted)throw Error("worker_ssh_cancelled");z=(async()=>{try{while(!M.signal.aborted){if(xg.parse(await v.receive(35000,M.signal)).type==="stop"){L();return}await v.send({type:"pong"})}}catch{if(!M.signal.aborted)L()}})();let Oe=!1,Me,Ee=!1;ne=l.after(Math.max(1,Math.min(Bi,e.startupTimeoutMs??Bi)),()=>{Ee=!0,L()});let Te=re.owner.nonce;if(await Wo(te,be,Re,Te,{...e,signal:D.signal,onEvent(We){if(e.onEvent?.(We),We.type==="heartbeat"&&!Oe&&!Me)Me=(async()=>{let $e=await St(te,"status");if(!$e?.executionEligible)throw Error("worker_ssh_no_ready_capabilities");await v.send({type:"running",deviceId:$e.deviceId,expiresAt:$e.expiresAt,lifetime:te.lifetime,supervision:"ssh-foreground"}),Oe=!0,ne?.()})().catch(()=>{Ee=!0,L()})}}),await Me,Ee||!Oe)throw Error("worker_ssh_outbound_or_readiness_failed");return fe=!0,0}catch(te){let X=te instanceof Error&&/^worker_[a-z_]+$/.test(te.message)?te.message:"worker_ssh_bootstrap_failed";try{await v.send({type:"error",code:X})}catch{}return 1}finally{if(ne?.(),L(),M.abort(),await z,G?.deleteBinding(),G?.deleteKey(),re?.acquired)re.release();if(process.removeListener("SIGHUP",L),e.signal?.removeEventListener("abort",L),v.signal.removeEventListener("abort",L),fe)try{await v.send({type:"stopped"})}catch{}v.dispose()}}var Is=(e)=>Dg(e)&&e.length<=4096&&!/[\x00-\x1f\x7f]/.test(e),xs=(e)=>`'${e.replaceAll("'","'\\''")}'`,Tg=h({type:i("hello"),protocol:i(jo),version:t(),platform:c(["linux","darwin"]),architecture:c(["arm64","x64"]),enrolled:_()}),Lg=h({type:i("ticket-request"),request:h({install_id:V(),code_challenge:t().regex(/^[A-Za-z0-9_-]{43}$/),lifecycle:c(["persistent","ephemeral"]),roots:d(h({path_fingerprint:t().regex(/^[a-f0-9]{64}$/),execution_mode:c(["confined","host"]),permissions:h({read:i(!0),write:i(!0),execute:i(!0),discover_environment:i(!0),expose_mcp:i(!1)})})).length(1)})}),Gd=P("type",[h({type:i("running"),deviceId:t().min(1).max(160),expiresAt:I.datetime({offset:!0}),lifetime:c(["persistent","ephemeral"]),supervision:i("ssh-foreground")}),h({type:i("pong")}),h({type:i("stopped")})]),Wg=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 Fi(e){if(e&&typeof e==="object"&&"type"in e&&e.type==="error"){let l="code"in e&&typeof e.code==="string"&&Wg.has(e.code)?e.code:"worker_ssh_remote_failed";throw Error(l)}return e}function Yd(e){if(!Is(e.remoteCli)||!/^[a-f0-9]{64}$/.test(e.sha256))throw Error("worker_ssh_invalid_target");let l=`set -eu
|
|
92
92
|
a=${xs(e.remoteCli)}
|
|
93
93
|
[ -f "$a" ] && [ ! -L "$a" ] && [ -x "$a" ] || { echo worker_ssh_artifact_unavailable >&2; exit 72; }
|
|
94
94
|
p=\${a%/*}; f=\${a##*/}; p=\${p:-/}
|
|
@@ -100,10 +100,10 @@ else echo worker_ssh_hash_tool_unavailable >&2; exit 72; fi
|
|
|
100
100
|
h=\${h%% *}
|
|
101
101
|
[ "$h" = ${xs(e.sha256)} ] || { echo worker_ssh_artifact_mismatch >&2; exit 72; }
|
|
102
102
|
exec "$a" worker __ssh-bootstrap`;return`exec /usr/bin/env -i PATH=/usr/bin:/bin:/usr/sbin:/sbin /bin/sh -c ${xs(l)}`}function Xd(e,l){if(!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/.test(e.alias)||!Is(e.sshConfig))throw Error("worker_ssh_invalid_target");return["-T","-a","-F",e.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",...l?[]:["-o","ProxyJump=none","-o","ProxyCommand=none"],"-o","ConnectTimeout=10","-o","ConnectionAttempts=1","-o","ServerAliveInterval=10","-o","ServerAliveCountMax=3","-o","LogLevel=ERROR","--",e.alias,Yd(e)]}function Ng(e){return Xd(e,!1)}function Zd(){return{PATH:"/usr/bin:/bin:/usr/sbin:/sbin",HOME:s(),...process.env.SSH_AUTH_SOCK?{SSH_AUTH_SOCK:process.env.SSH_AUTH_SOCK}:{}}}async function Hg(e){let l;try{({stdout:l}=await Mg(Ig)("/usr/bin/ssh",["-G",...Xd(e,!0)],{env:Zd(),timeout:5000,maxBuffer:65536,encoding:"utf8"}))}catch{throw Error("worker_ssh_config_invalid")}for(let v of l.split(`
|
|
103
|
-
`)){let[D,...M]=v.trim().split(/\s+/);if(["proxyjump","proxycommand"].includes(D??"")&&M.join(" ").toLowerCase()!=="none")throw Error("worker_ssh_proxy_unsupported")}}function $g(e){let l=["artifact_unavailable","hash_tool_unavailable","artifact_mismatch"].find((v)=>e.includes(`worker_ssh_${v}`));return l?`worker_ssh_${l}`:/HOST IDENTIFICATION HAS CHANGED|Host key verification failed|No .*host key is known/i.test(e)?"worker_ssh_host_key_rejected":/Permission denied|authentication failed|expired/i.test(e)?"worker_ssh_authentication_failed":"worker_ssh_connection_failed"}async function Bg(e){await Hg(e);let l=Og("/usr/bin/ssh",Ng(e),{stdio:["pipe","pipe","pipe"],env:Zd()}),v="";l.stderr.on("data",(M)=>{if(Buffer.byteLength(v)+M.length<=65536)v+=M.toString("utf8");else l.kill("SIGKILL")});let D=new Promise((M)=>{l.once("error",()=>M({exitCode:1,errorCode:"worker_ssh_client_unavailable"})),l.once("close",(L)=>{let z=$g(v);v="",M({exitCode:L??1,errorCode:z})})});return{input:l.stdin,output:l.stdout,result:D,close(){if(l.stdin.destroy(),l.exitCode===null&&l.signalCode===null){l.kill("SIGTERM");let M=setTimeout(()=>l.kill("SIGKILL"),2000);M.unref(),D.finally(()=>clearTimeout(M))}}}}function Ug(e){let l=new Map,v=!1;for(let z=0;z<e.length;z++){let re=e[z];if(re==="--foreground"&&!v){v=!0;continue}if(!["--ssh","--ssh-config","--remote-cli","--artifact-sha256","--config","--credential-file"].includes(re)||l.has(re))throw Error("worker_unknown_or_duplicate_flag");let G=e[++z];if(!G||G.startsWith("--"))throw Error("worker_missing_flag_value");l.set(re,G)}if(!v)throw Error("worker_ssh_foreground_required");let D=(z)=>{let re=l.get(z);if(!re)throw Error("worker_required_input_missing");return re},M={alias:D("--ssh"),sshConfig:D("--ssh-config"),remoteCli:D("--remote-cli"),sha256:D("--artifact-sha256")};if(!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/.test(M.alias)||!Is(M.sshConfig))throw Error("worker_ssh_invalid_target");Yd(M),m(M.sshConfig);let L=x.parse(JSON.parse(m(D("--config"))));if(
|
|
104
|
-
`)}if(
|
|
103
|
+
`)){let[D,...M]=v.trim().split(/\s+/);if(["proxyjump","proxycommand"].includes(D??"")&&M.join(" ").toLowerCase()!=="none")throw Error("worker_ssh_proxy_unsupported")}}function $g(e){let l=["artifact_unavailable","hash_tool_unavailable","artifact_mismatch"].find((v)=>e.includes(`worker_ssh_${v}`));return l?`worker_ssh_${l}`:/HOST IDENTIFICATION HAS CHANGED|Host key verification failed|No .*host key is known/i.test(e)?"worker_ssh_host_key_rejected":/Permission denied|authentication failed|expired/i.test(e)?"worker_ssh_authentication_failed":"worker_ssh_connection_failed"}async function Bg(e){await Hg(e);let l=Og("/usr/bin/ssh",Ng(e),{stdio:["pipe","pipe","pipe"],env:Zd()}),v="";l.stderr.on("data",(M)=>{if(Buffer.byteLength(v)+M.length<=65536)v+=M.toString("utf8");else l.kill("SIGKILL")});let D=new Promise((M)=>{l.once("error",()=>M({exitCode:1,errorCode:"worker_ssh_client_unavailable"})),l.once("close",(L)=>{let z=$g(v);v="",M({exitCode:L??1,errorCode:z})})});return{input:l.stdin,output:l.stdout,result:D,close(){if(l.stdin.destroy(),l.exitCode===null&&l.signalCode===null){l.kill("SIGTERM");let M=setTimeout(()=>l.kill("SIGKILL"),2000);M.unref(),D.finally(()=>clearTimeout(M))}}}}function Ug(e){let l=new Map,v=!1;for(let z=0;z<e.length;z++){let re=e[z];if(re==="--foreground"&&!v){v=!0;continue}if(!["--ssh","--ssh-config","--remote-cli","--artifact-sha256","--config","--credential-file"].includes(re)||l.has(re))throw Error("worker_unknown_or_duplicate_flag");let G=e[++z];if(!G||G.startsWith("--"))throw Error("worker_missing_flag_value");l.set(re,G)}if(!v)throw Error("worker_ssh_foreground_required");let D=(z)=>{let re=l.get(z);if(!re)throw Error("worker_required_input_missing");return re},M={alias:D("--ssh"),sshConfig:D("--ssh-config"),remoteCli:D("--remote-cli"),sha256:D("--artifact-sha256")};if(!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/.test(M.alias)||!Is(M.sshConfig))throw Error("worker_ssh_invalid_target");Yd(M),m(M.sshConfig);let L=x.parse(JSON.parse(m(D("--config"))));if(ae(L.workspaceRoot,M.remoteCli))throw Error("worker_ssh_artifact_inside_workspace");return{target:M,config:L,credentialPath:l.get("--credential-file")}}async function Fg(e,l,v,D,M){let{request:L}=Lg.parse(Fi(await e.receive(30000,M)));if(L.lifecycle!==l.lifetime||L.roots[0].execution_mode!==l.executionMode)throw Error("worker_ticket_receipt_mismatch");let z=()=>{if(M.aborted)throw Error("worker_ssh_cancelled")},re=(async()=>{z();let ne=v??jr(l),fe=await(D.enrollmentCredentials??qr)(l,ne);if(z(),!fe)throw Error("worker_session_login_required");if(!W(fe.apiOrigin,l.apiOrigin))throw Error("worker_session_origin_mismatch");if(!fe.scopes.includes("devices:write"))throw Error("worker_devices_write_scope_required");let te=D.createTicketClient?.(fe)??new ge(fe,{credentialsPath:ne}),X=ua(await te.createHeadlessDeviceEnrollmentTicket(L));return z(),{type:"ticket",organizationId:fe.orgId,receipt:X}})(),G;try{let ne=await Promise.race([re,new Promise((fe,te)=>{if(G=()=>te(Error("worker_ssh_cancelled")),M.aborted)G();else M.addEventListener("abort",G,{once:!0})})]);z(),await e.send(ne)}finally{M.removeEventListener("abort",G)}}async function Qd(e,l={}){let{config:v,target:D,credentialPath:M}=Ug(e);if(l.signal?.aborted)throw Error("worker_ssh_cancelled");let L=l.clock??Uo,z=await(l.sshTransport??Bg)(D),re=new Fo(z.output,z.input,L),G=new AbortController,ne=()=>G.abort(),fe,te;if(z.result.then((X)=>{te=X}),process.once("SIGINT",ne),process.once("SIGTERM",ne),l.signal?.addEventListener("abort",ne,{once:!0}),l.signal?.aborted)ne();try{if(G.signal.aborted)throw Error("worker_ssh_cancelled");await re.send({type:"configure",protocol:jo,version:g,config:v});let X=Tg.parse(Fi(await re.receive(30000,G.signal)));if(X.version!==g)throw Error("worker_ssh_version_mismatch");if(!X.enrolled)await Fg(re,v,M,l,AbortSignal.any([G.signal,re.signal]));fe=L.every(1e4,()=>{re.send({type:"ping"}).catch(ne)});let le=!1,be=L.now()+(X.enrolled?0:la)+Bi+5000;while(!0){let ke=le?35000:Math.max(1,be-L.now()),Re=Gd.parse(Fi(await re.receive(ke,G.signal)));if(Re.type==="running"){if(le||Re.lifetime!==v.lifetime||Date.parse(Re.expiresAt)<=Date.now())throw Error("worker_ssh_invalid_readiness");le=!0,(l.io??process).stdout.write(JSON.stringify(Re)+`
|
|
104
|
+
`)}if(Re.type==="stopped"){if(!le)throw Error("worker_ssh_invalid_readiness");return 0}}}catch(X){if(G.signal.aborted){fe?.();try{await re.send({type:"stop"});let le=L.now()+v.shutdownGraceMs+1e4;while(L.now()<le)if(Gd.parse(Fi(await re.receive(Math.max(1,le-L.now())))).type==="stopped")return 0}catch{}throw Error("worker_ssh_stop_unconfirmed")}if(X instanceof Error&&X.message==="worker_ssh_connection_closed"){let le=te??await Promise.race([z.result,new Promise((be)=>setTimeout(be,100))]);if(le?.exitCode)throw Error(le.errorCode)}throw X}finally{fe?.(),process.removeListener("SIGINT",ne),process.removeListener("SIGTERM",ne),l.signal?.removeEventListener("abort",ne),z.close(),re.dispose()}}import{createConnection as Vg}from"net";import{WebSocket as ji}from"ws";var jg=1,Gn=65536,eu=4096,tu=67108864,ru=4194304,zn=V(),qg=h({kind:i("install_only"),authorityId:zn,organizationId:zn,userId:zn,connectionId:zn,attemptId:zn,purpose:i("install"),generation:o().int().positive(),transport:i("reverse_ssh"),expiresAt:I.datetime({offset:!0}),maxDurationMs:i(300000),maxChannels:i(1),allowTcpForwarding:i(!1),allowPty:i(!1)}),zg=t().max(2048).superRefine((e,l)=>{let v;try{v=new URL(e)}catch{l.addIssue({code:"custom",message:"invalid relay url"});return}if(v.protocol!=="ws:"&&v.protocol!=="wss:"){l.addIssue({code:"custom",message:"invalid relay protocol"});return}if(v.username||v.password||v.search||v.hash){l.addIssue({code:"custom",message:"relay credentials or modifiers are not allowed"});return}let D=v.pathname.split("/");if(D.length!==4||D[1]!=="device"||!zn.safeParse(D[2]).success||!/^[a-f0-9]{64}$/.test(D[3]??""))l.addIssue({code:"custom",message:"invalid device relay path"});if(v.protocol==="ws:"&&!["127.0.0.1","[::1]"].includes(v.hostname))l.addIssue({code:"custom",message:"plaintext relay must be loopback"})});var Kg=h({protocol:i(jg),type:i("ssh_install_relay"),authorityToken:t().regex(/^(?:reason|ara)_ssh_install_[A-Za-z0-9_-]{43}$/),authority:qg,relayUrl:zg,endpoint:h({host:i("127.0.0.1"),port:i(22)})});function Os(e,l=Date.now()){let v=Kg.parse(e),D=Date.parse(v.authority.expiresAt);if(!Number.isFinite(D)||D<=l)throw Error("ssh_install_relay_expired");if(D>l+v.authority.maxDurationMs)throw Error("ssh_install_relay_expiry_invalid");return v}function nu(e){let l=JSON.stringify(e);if(Buffer.byteLength(l)>Gn)throw Error("ssh_install_relay_frame_too_large");return l}function ou(e){if(!e||typeof e!=="object"||Array.isArray(e))throw Error("ssh_install_relay_control_invalid");let l=e;if(l.type==="ssh_install_relay_receipt")return{type:l.type,receipt:Os(l.receipt)};if(l.type==="ssh_install_relay_ready"&&typeof l.authorityId==="string")return{type:l.type,authorityId:l.authorityId};throw Error("ssh_install_relay_control_invalid")}var iu="ssh_install_relay_closed";function Jg(e){if(typeof e==="string")return Buffer.byteLength(e,"utf8");if(Buffer.isBuffer(e))return e.length;if(e instanceof ArrayBuffer)return e.byteLength;if(ArrayBuffer.isView(e))return e.byteLength;return Number.POSITIVE_INFINITY}function Gg(e){if(Buffer.isBuffer(e))return e;if(e instanceof ArrayBuffer)return Buffer.from(e);if(ArrayBuffer.isView(e))return Buffer.from(e.buffer,e.byteOffset,e.byteLength);return null}function Yg(e,l=iu){try{e.close(1000,l)}catch{e.terminate()}}async function Xg(e){let l=e.now??(()=>Date.now()),v=Os(e.receipt,l()),M=(e.createWebSocket??((We)=>new ji(We,{followRedirects:!1,perMessageDeflate:!1,maxPayload:Gn})))(v.relayUrl),L=e.connectLocal??(()=>Vg({host:"127.0.0.1",port:22})),z,re=!1,G=!1,ne=0,fe=0,te,X=(We)=>{if(te)clearTimeout(te);te=setTimeout(()=>ke("ssh_install_relay_expired"),Math.max(1,We)),te.unref?.()},le,be=new Promise((We)=>{le=We}),ke=(We=iu)=>{if(G)return;if(G=!0,te)clearTimeout(te);if(e.signal?.removeEventListener("abort",Re),z?.destroy(),M.readyState===ji.OPEN)Yg(M,We);else if(M.readyState!==ji.CLOSED)M.terminate();le()},Re=()=>ke("ssh_install_relay_aborted"),Oe=()=>ke("ssh_install_relay_protocol_error"),Me=(We)=>(ne+=1,fe+=We,We<=Gn&&ne<=eu&&fe<=tu),Ee=(We)=>{if(G||!re||M.readyState!==ji.OPEN||M.bufferedAmount>ru||!Me(We.length)){Oe();return}M.send(We,{binary:!0},($e)=>{if($e)Oe()})};M.on("open",()=>{if(G)return;try{let We=nu({type:"ssh_install_relay_receipt",receipt:v});M.send(We,{binary:!1},($e)=>{if($e)Oe()})}catch{Oe()}}),M.on("message",(We,$e)=>{if(G)return;let Ue=Jg(We);if(Ue>Gn||!Me(Ue))return Oe();if(!re){if($e)return Oe();try{let Ce=ou(JSON.parse(String(We)));if(Ce.type!=="ssh_install_relay_ready"||Ce.authorityId!==v.authority.authorityId)return Oe();re=!0,X(v.authority.maxDurationMs),z=L(),z.setNoDelay(!0),z.on("data",Ee),z.on("error",Oe),z.on("close",()=>ke("ssh_install_relay_peer_closed")),z.on("drain",()=>M._socket?.resume()),z.on("connect",()=>{})}catch{Oe()}return}if(!$e)return Oe();let Ne=Gg(We);if(!Ne||!z||z.destroyed||!z.write(Ne))M._socket?.pause()}),M.on("error",Oe),M.on("close",()=>ke("ssh_install_relay_peer_closed"));let Te=Math.max(1,Math.min(v.authority.maxDurationMs,Date.parse(v.authority.expiresAt)-l()));if(X(Te),e.signal?.addEventListener("abort",Re,{once:!0}),e.signal?.aborted)Re();return{receipt:v,closed:be,close:()=>ke()}}async function au(e=process.stdin){let l=[],v=0;for await(let D of e){let M=Buffer.isBuffer(D)?D:Buffer.from(D);if(v+=M.length,v>Gn)return 1;l.push(M)}try{let D=JSON.parse(Buffer.concat(l).toString("utf8"));return await(await Xg({receipt:D})).closed,0}catch{return 1}}import{randomBytes as Zg}from"crypto";var Sn="ARA_WORKER_PREVIEW_PROBE";async function su(){if(typeof Bun>"u")return 1;let e=Zg(32).toString("base64url"),l,v=new Promise((z)=>{l=z}),D=setTimeout(()=>l(1),5000),M=()=>l(0);process.stdin.once("end",M),process.stdin.resume();let L=Bun.serve({hostname:"127.0.0.1",port:0,fetch(z,re){let G=new URL(z.url).pathname;if(z.method!=="GET")return new Response(null,{status:405});if(G==="/readiness")return new Response(Sn);if((G==="/readiness-ws"||G===`/device/readiness/${e}`)&&re.upgrade(z,{data:{relay:G.startsWith("/device/"),http:"",reported:!1}}))return;return new Response(null,{status:404})},websocket:{maxPayloadLength:8192,message(z,re){if(typeof re!=="string"||re.length>8192){z.close();return}if(!z.data.relay){if(re===Sn)z.send(Sn);else z.close();return}try{let G=gi(re),ne=(fe)=>z.send(JSON.stringify(fe));if(G.type==="hello")ne(G),ne({type:"request",id:"http",method:"GET",path:"/readiness",headers:[],body:"",upgrade:!1});else if(G.type==="head"&&G.id==="http"&&G.status===200)ne({type:"credit",id:"http"});else if(G.type==="data"&&G.id==="http"){if(z.data.http+=Buffer.from(G.data,"base64").toString(),z.data.http.length>Sn.length)throw Error("probe_overflow");ne({type:"credit",id:"http"})}else if(G.type==="end"&&G.id==="http"&&z.data.http===Sn)ne({type:"request",id:"ws",method:"GET",path:"/readiness-ws",headers:[],body:"",upgrade:!0});else if(G.type==="ws"&&G.id==="ws")ne({type:"data",id:"ws",data:Buffer.from(Sn).toString("base64"),binary:!1});else if(G.type==="data"&&G.id==="ws"&&!G.binary&&Buffer.from(G.data,"base64").toString()===Sn&&!z.data.reported)z.data.reported=!0,process.stdout.write(`ready
|
|
105
105
|
`);else throw Error("probe_protocol_failed")}catch{z.close(),l(1)}}}});try{return process.stdout.write(JSON.stringify({port:L.port,token:e})+`
|
|
106
|
-
`),await v}finally{clearTimeout(D),L.stop(!0),process.stdin.removeListener("end",M),process.stdin.pause()}}import{closeSync as tw,createReadStream as rw,fstatSync as nw,readFileSync as ow}from"fs";var cu="/run/sc/instance-generation";var Qg=/^[1-9][0-9]{0,15}\n?$/;function ew(e){return typeof e==="number"&&Number.isSafeInteger(e)&&e>0}function lu(e){if(typeof e!=="string"||!Qg.test(e))return null;let l=Number(e.trim());return ew(l)?l:null}var du=3,iw=600000,aw=65536,sw=500;function uu(e){if(e.length!==3||e[0]!=="standby"||e[1]!=="--handoff-fd"||e[2]!==String(du))throw Error("worker_standby_invalid_invocation");return{handoffFd:du}}function cw(e=(l)=>ow(l,"utf8")){try{return lu(e(cu))}catch{return null}}function lw(e){let l;try{l=JSON.parse(e)}catch{throw Error("worker_standby_handoff_invalid")}if(!l||typeof l!=="object"||Array.isArray(l))throw Error("worker_standby_handoff_invalid");let v=Object.keys(l).sort();if(v.length!==2||v[0]!=="config"||v[1]!=="enrollment")throw Error("worker_standby_handoff_invalid");let D=l,M=x.safeParse(D.config),L=ca.safeParse(D.enrollment);if(!M.success||!L.success)throw Error("worker_standby_handoff_invalid");if(M.data.lifetime!=="ephemeral")throw Error("worker_standby_handoff_invalid");return{config:M.data,enrollment:L.data}}var fu={isPipe:(e)=>nw(e).isFIFO(),stream:(e)=>{let l=rw("",{fd:e,autoClose:!0,highWaterMark:16384});return{chunks:l,close:()=>l.destroy()}},parentPid:()=>process.ppid,now:()=>Date.now(),every:(e,l)=>{let v=setInterval(l,e);return v.unref?.(),()=>clearInterval(v)}};async function dw(e,l=fu){if(!l.isPipe(e.fd)){try{tw(e.fd)}catch{}throw Error("worker_standby_handoff_not_pipe")}let v=l.now()+(e.armMs??iw),D=l.stream(e.fd),M=null,L=()=>{},z=new Promise((G,
|
|
106
|
+
`),await v}finally{clearTimeout(D),L.stop(!0),process.stdin.removeListener("end",M),process.stdin.pause()}}import{closeSync as tw,createReadStream as rw,fstatSync as nw,readFileSync as ow}from"fs";var cu="/run/sc/instance-generation";var Qg=/^[1-9][0-9]{0,15}\n?$/;function ew(e){return typeof e==="number"&&Number.isSafeInteger(e)&&e>0}function lu(e){if(typeof e!=="string"||!Qg.test(e))return null;let l=Number(e.trim());return ew(l)?l:null}var du=3,iw=600000,aw=65536,sw=500;function uu(e){if(e.length!==3||e[0]!=="standby"||e[1]!=="--handoff-fd"||e[2]!==String(du))throw Error("worker_standby_invalid_invocation");return{handoffFd:du}}function cw(e=(l)=>ow(l,"utf8")){try{return lu(e(cu))}catch{return null}}function lw(e){let l;try{l=JSON.parse(e)}catch{throw Error("worker_standby_handoff_invalid")}if(!l||typeof l!=="object"||Array.isArray(l))throw Error("worker_standby_handoff_invalid");let v=Object.keys(l).sort();if(v.length!==2||v[0]!=="config"||v[1]!=="enrollment")throw Error("worker_standby_handoff_invalid");let D=l,M=x.safeParse(D.config),L=ca.safeParse(D.enrollment);if(!M.success||!L.success)throw Error("worker_standby_handoff_invalid");if(M.data.lifetime!=="ephemeral")throw Error("worker_standby_handoff_invalid");return{config:M.data,enrollment:L.data}}var fu={isPipe:(e)=>nw(e).isFIFO(),stream:(e)=>{let l=rw("",{fd:e,autoClose:!0,highWaterMark:16384});return{chunks:l,close:()=>l.destroy()}},parentPid:()=>process.ppid,now:()=>Date.now(),every:(e,l)=>{let v=setInterval(l,e);return v.unref?.(),()=>clearInterval(v)}};async function dw(e,l=fu){if(!l.isPipe(e.fd)){try{tw(e.fd)}catch{}throw Error("worker_standby_handoff_not_pipe")}let v=l.now()+(e.armMs??iw),D=l.stream(e.fd),M=null,L=()=>{},z=new Promise((G,ne)=>{L=(fe)=>{M??=fe,ne(fe)}});z.catch(()=>{});let re=l.every(sw,()=>{if(l.parentPid()!==e.parentPid)L(Error("worker_standby_parent_changed"));else if(l.now()>=v)L(Error("worker_standby_arm_expired"))});try{let G=(async()=>{let fe=[],te=0;for await(let X of D.chunks){if(M)throw M;if(te===0)e.onArriving?.();if(te+=X.length,te>aw)throw Error("worker_standby_handoff_too_large");fe.push(X)}return Buffer.concat(fe).toString("utf8")})(),ne=await Promise.race([G,z]);if(l.parentPid()!==e.parentPid)throw Error("worker_standby_parent_changed");return ne}finally{re(),D.close()}}async function mu(e,l=fu){let v=e.readGeneration??(()=>cw()),D=l.parentPid(),M=v();if(M===null)throw Error("worker_standby_no_instance_generation");e.onBooted?.();let L=await dw({fd:e.fd,parentPid:D,armMs:e.armMs,onArriving:e.onArriving},l);if(v()!==M)throw Error("worker_standby_generation_changed");return lw(L)}var uw=`Usage: reason worker <command> --config PATH [--json]
|
|
107
107
|
|
|
108
108
|
enroll Obtain/redeem a ticket using the current Reason login
|
|
109
109
|
start Run the existing Device daemon in the foreground
|
|
@@ -144,16 +144,16 @@ Pretrust known_hosts. No agent forwarding, automatic installation or detached se
|
|
|
144
144
|
SSH starts with a clean environment. Custom PLAYWRIGHT_BROWSERS_PATH locations
|
|
145
145
|
are not forwarded/supported; running is not a browser-readiness receipt.
|
|
146
146
|
Closing SSH stops foreground work; persistent enrollment remains for restart/revoke.
|
|
147
|
-
`;function fw(e){let[l,...v]=e;if(!l||l==="help"||l==="--help"||l==="-h")return null;if(!["enroll","start","status","doctor","drain","resume","stop","revoke"].includes(l))throw Error("worker_unknown_command");let D,M,L,z=!1;for(let re=0;re<v.length;re++){let G=v[re];if(G==="--json"&&!z){z=!0;continue}if(G!=="--config"&&G!=="--enrollment-file"&&G!=="--credential-file")throw Error("worker_unknown_or_duplicate_flag");let
|
|
148
|
-
`),await L?.stop(),(l.exitProcess??((
|
|
149
|
-
`),l.onStartup?.(G)},re={...l,onStartup:z,onDeviceRevoked:()=>{M=!0,l.onDeviceRevoked?.()},startupTiming:()=>{let G=(
|
|
150
|
-
`)}l.onEvent?.(G)}};try{if(e[0]==="__preview-probe"){if(e.length!==1||pt(l.environment??process.env).length>0)throw Error("worker_invalid_probe_invocation");return await su()}if(e[0]==="attach"||e[0]==="__ssh-bootstrap"||e[0]==="__ssh-reverse"){if(pt(l.environment??process.env).length>0)throw Error("worker_unsafe_environment");if(e[0]==="attach")return await Qd(e.slice(1),l);if(e.length!==1)throw Error("worker_unknown_or_duplicate_flag");if(e[0]==="__ssh-reverse")return await au();return await Jd(l)}if(e[0]==="__update-restart"){let
|
|
151
|
-
`),
|
|
152
|
-
`),te=S(
|
|
153
|
-
`)});try{if(G.action==="start")z("lock_acquired");let
|
|
154
|
-
`);let
|
|
155
|
-
`);return
|
|
156
|
-
`:"",G=(
|
|
147
|
+
`;function fw(e){let[l,...v]=e;if(!l||l==="help"||l==="--help"||l==="-h")return null;if(!["enroll","start","status","doctor","drain","resume","stop","revoke"].includes(l))throw Error("worker_unknown_command");let D,M,L,z=!1;for(let re=0;re<v.length;re++){let G=v[re];if(G==="--json"&&!z){z=!0;continue}if(G!=="--config"&&G!=="--enrollment-file"&&G!=="--credential-file")throw Error("worker_unknown_or_duplicate_flag");let ne=v[++re];if(!ne||ne.startsWith("--"))throw Error("worker_missing_flag_value");if(G==="--config"&&!D)D=ne;else if(G==="--enrollment-file"&&!M&&["enroll","start"].includes(l))M=ne;else if(G==="--credential-file"&&!L&&l==="enroll")L=ne;else throw Error("worker_unknown_or_duplicate_flag")}if(!D)throw Error("worker_required_input_missing");if(L&&M)throw Error("worker_enrollment_inputs_conflict");return{action:l,configPath:D,enrollmentPath:M,credentialPath:L,json:z}}var mw=1e4,pw=2000,pu=15000,hw=50;async function gu(e,l,v,D,M,L){let z=new Ho,re=new AbortController,G,ne,fe=new Promise((Ne,Ce)=>{G=Ne,ne=Ce});if(fe.catch(()=>{}),ie(),e.executionMode==="host")kr();v("enrollment_started");let te=M(z);te.catch(()=>{});let X=null,le=pi(e,l,(Ne)=>{if(!X)throw Error("worker_starting");return X(Ne)});le.catch(()=>{}),v("readiness_started");let be=new AbortController,ke,Re=AbortSignal.any([re.signal,be.signal,...D.signal?[D.signal]:[]]),Oe=L?.matches(e)?L.result:void 0;if(L&&!Oe)await L.stop();if(Oe)Re.addEventListener("abort",()=>void L.stop(),{once:!0});let Me,Ee=new Promise((Ne)=>{Me=Ne}),Te=setTimeout(()=>Me(),mw);Re.addEventListener("abort",()=>Me(),{once:!0});let We,$e=(Ne)=>{if(Ne==="ready")We=setTimeout(()=>Me(),pw);D.onStartup?.(Ne)},Ue=xo(e,D.readinessProbes,Re,fe,void 0,Oe,Ee);Ue.final.catch(()=>{});try{let Ne;try{Ne=await te}catch(Ce){throw re.abort(),ne(Error("worker_enrollment_failed")),await Ue.final.catch(()=>{}),await le.then((Le)=>Le(),()=>{}),Ce}v("enrollment_completed"),ke=setTimeout(()=>be.abort(),Math.max(1,Math.min(pu,Date.parse(Ne.worker?.expiresAt??"")-Date.now()||pu))),G(Ne.roots[0].permissions),qt(e,{version:1,drained:!1,revoked:!1}),await Wo(e,Ne,z,l,{...D,onStartup:$e,prestartedReadiness:Ue,prestartedControl:{closed:le,handle:(Ce)=>{X=Ce}},deferOptionalLanes:!0})}finally{clearTimeout(ke),clearTimeout(Te),clearTimeout(We),re.abort(),z.deleteBinding(),z.deleteKey(),await le.then((Ne)=>Ne(),()=>{})}}async function gw(e,l,v,D){let{handoffFd:M}=uu(e);if(pt(l.environment??process.env).length>0)throw Error("worker_unsafe_environment");if((l.platform??process.platform)!=="linux")throw Error("worker_platform_unsupported");let L,z,re=()=>{let le=v.readinessProbes?v.readinessProbes.boundPty:(be)=>Po(be);if(G||!le)return;try{ie(),kr()}catch{return}if(L=Cl(le),!v.readinessProbes)setImmediate(()=>{if(G)return;try{Ri()}catch{}})},G=!1,ne=()=>{G=!0,clearTimeout(z),(L?.stop()??Promise.resolve()).finally(()=>process.exit(0))};process.once("SIGTERM",ne),process.once("SIGINT",ne);let fe;try{fe=await(l.receiveStandbyHandoff??mu)({fd:M,onBooted:()=>{D("standby_booted"),z=setTimeout(re,hw)},onArriving:()=>clearTimeout(z)})}catch(le){clearTimeout(z);let be=le instanceof Error&&/^worker_standby_[a-z_]+$/.test(le.message)?le.message:"worker_standby_failed";return(l.io??process).stderr.write(`Reason worker: ${be}.
|
|
148
|
+
`),await L?.stop(),(l.exitProcess??((ke)=>process.exit(ke)))(1),1}finally{clearTimeout(z),process.off("SIGTERM",ne),process.off("SIGINT",ne)}if(G)return 0;D("handoff_received");let{config:te,enrollment:X}=fe;try{b(p(te),!0);let le=await wu(te,()=>{});try{if(D("lock_acquired"),S(te))throw Error("worker_ephemeral_requires_fresh_enrollment");return Or(te),await gu(te,le.owner.nonce,D,v,(be)=>Er(te,X,be,l.enroll),L),0}finally{le.release()}}finally{await L?.stop()}}async function Tr(e,l={}){let v=l.io??process,D=!1,M=!1,L=new Map,z=(G)=>{L.set(G,performance.now()),v.stderr.write(JSON.stringify({event:"worker.startup",stage:G,pid:process.pid,timestamp:new Date().toISOString()})+`
|
|
149
|
+
`),l.onStartup?.(G)},re={...l,onStartup:z,onDeviceRevoked:()=>{M=!0,l.onDeviceRevoked?.()},startupTiming:()=>{let G=(le)=>Math.min(tr,Math.max(0,Math.round(le))),ne=L.get("readiness_started"),fe=L.get("readiness_completed"),te=L.get("handoff_received")??0,X=Object.fromEntries(Ys.flatMap((le)=>{let be=L.get(le);return be===void 0?[]:[[le,G(be-te)]]}));return{service_start_to_heartbeat_ms:G(performance.now()-te),stage_ms:X,...ne!==void 0&&fe!==void 0?{readiness_ms:G(fe-ne)}:{}}},onEvent:(G)=>{if(G.type==="error"&&G.diagnostic){D=!0;let ne=G.diagnostic;v.stderr.write(JSON.stringify({event:"worker.connection_failed",timestamp:new Date().toISOString(),stage:ne.stage,category:ne.category,httpStatus:ne.category==="http"?ne.httpStatus:void 0})+`
|
|
150
|
+
`)}l.onEvent?.(G)}};try{if(e[0]==="__preview-probe"){if(e.length!==1||pt(l.environment??process.env).length>0)throw Error("worker_invalid_probe_invocation");return await su()}if(e[0]==="attach"||e[0]==="__ssh-bootstrap"||e[0]==="__ssh-reverse"){if(pt(l.environment??process.env).length>0)throw Error("worker_unsafe_environment");if(e[0]==="attach")return await Qd(e.slice(1),l);if(e.length!==1)throw Error("worker_unknown_or_duplicate_flag");if(e[0]==="__ssh-reverse")return await au();return await Jd(l)}if(e[0]==="__update-restart"){let le=e.length===4&&e[3]==="--changed";if(e[1]!=="--config"||!e[2]||e.length!==3&&!le)throw Error("worker_unknown_or_duplicate_flag");if(pt(l.environment??process.env).length>0)throw Error("worker_unsafe_environment");let be=x.parse(JSON.parse(m(e[2]))),ke=await hi(be,le?void 0:g);return v.stdout.write(JSON.stringify(ke)+`
|
|
151
|
+
`),ke.state==="current"?3:ke.state==="busy"?75:0}if(e[0]==="standby")return await gw(e,l,re,z);let G=fw(e);if(!G)return v.stdout.write(uw),0;if(pt(l.environment??process.env).length>0)throw Error("worker_unsafe_environment");if(!["darwin","linux","win32"].includes(process.platform))throw Error("worker_platform_unsupported");let ne=x.parse(JSON.parse(m(G.configPath))),fe=(le)=>v.stdout.write(JSON.stringify(le)+`
|
|
152
|
+
`),te=S(ne);if(G.action==="status"||G.action==="doctor"){let le=await St(ne,"status"),be=ft(ne),ke={enrolled:!!te||!!le,deviceId:te?.deviceId??le?.deviceId??null,lifetime:ne.lifetime,expired:te||le?Date.parse(te?.worker?.expiresAt??le.expiresAt)<=Date.now():null,drained:be.drained,revoked:be.revoked,live:le};if(G.action==="status")return fe(ke),0;let Re=!0;try{Or(ne)}catch{Re=!1}return fe({...ke,workspace:Re,platform:process.platform,executionMode:ne.executionMode,proofStorage:ne.lifetime==="ephemeral"?"process-memory":te&&xt(ne)instanceof mt?"login-keychain":"owner-only-file",confinement:ne.executionMode==="host"?"explicitly-disabled":"verified-on-start-not-by-doctor",capabilitySource:le?.supportedOperations?"live-worker":"unavailable",reportedOperations:le?.supportedOperations??null,capabilityReadiness:le?.capabilityReadiness??null,ready:le?.executionEligible===!0&&!ke.expired}),Re&&(te||le)&&!ke.revoked&&!ke.expired?0:1}if(["drain","resume","stop"].includes(G.action)){let le=G.action==="drain"?"drain":G.action==="resume"?"resume":"stop",be=await St(ne,le);if(be){if(fe(be),le==="stop"&&ne.lifetime==="ephemeral"&&!G.json)v.stderr.write(yw);return 0}}b(p(ne),!0);let X=await wu(ne,()=>{if(!G.json)v.stderr.write(`Waiting for the previous worker to stop\u2026
|
|
153
|
+
`)});try{if(G.action==="start")z("lock_acquired");let le=S(ne);if(["drain","resume","stop"].includes(G.action)){if(!le)throw Error("worker_not_enrolled");let be=ft(ne);if(be.revoked||Date.parse(le.worker.expiresAt)<=Date.now())throw Error("worker_revoked_or_expired");if(G.action!=="stop")qt(ne,{...be,drained:G.action==="drain"});return fe({running:!1,drained:G.action==="stop"?be.drained:G.action==="drain"}),0}if(G.action==="enroll"){if(ne.lifetime!=="persistent")throw Error("worker_ephemeral_requires_start_enrollment_file");let be=G.enrollmentPath,ke=!be&&ft(ne).revoked;if(le&&!ke)throw Error("worker_already_enrolled");Or(ne);let Re=()=>{Zt(ne),wc(ne)};if(ke)Re();let Oe=async()=>{let Te=Zo(ne),We=be?await da(ne,be,Te,l.enroll):await hu(ne,G.credentialPath,l,Te);return{proof:Te,enrolled:We}},{proof:Me,enrolled:Ee}=await Oe().catch((Te)=>{if(be||!(Te instanceof Rr)||!Te.deviceRemoved)throw Te;return Re(),Oe()});return ce(Ee,f(ne).state,{proofStore:Me}),qt(ne,{version:1,drained:!1,revoked:!1}),fe({enrolled:!0,deviceId:Ee.deviceId,lifetime:ne.lifetime}),0}if(G.action==="revoke"){if(!le)throw Error("worker_not_enrolled");let be=xt(ne),ke=new ar(we(ne.apiOrigin),se(ne.proxy),be);if(qt(ne,{version:1,drained:!0,revoked:!0}),l.revoke)await l.revoke(le,ke);else await ke.disconnect(le,AbortSignal.timeout(30000));return Zt(ne),fe({revoked:!0,localKeyRemoved:!0}),0}if(Or(ne),ne.lifetime==="ephemeral"){if(le)throw Error("worker_ephemeral_requires_fresh_enrollment");await gu(ne,X.owner.nonce,z,re,async(be)=>G.enrollmentPath?da(ne,G.enrollmentPath,be,l.enroll):hu(ne,void 0,l,be,"worker_ephemeral_enrollment_required"))}else{if(G.enrollmentPath)throw Error("worker_start_never_reenrolls_persistent_identity");if(!le)throw Error("worker_not_enrolled");if(ft(ne).revoked)M=!0;await Wo(ne,le,xt(ne),X.owner.nonce,re)}return 0}finally{X.release()}}catch(G){let ne=G instanceof Error&&(G.message==="worker_revoked"||!D&&/^worker_[a-z_]+$/.test(G.message))?G.message:"worker_command_failed";v.stderr.write(`Reason worker: ${ne}.
|
|
154
|
+
`);let fe=e.includes("--json")?void 0:Mn(G instanceof Rr&&G.deviceRemoved?"worker_enrollment_device_removed":ne);if(fe)v.stderr.write(`${fe}
|
|
155
|
+
`);return ne==="worker_revoked"&&M?0:1}}var ww=60000;async function wu(e,l){let v=Date.now()+e.shutdownGraceMs+ww,D=!1;for(;;){let M=oe({path:f(e).lock,runtimeVersion:g});if(M.acquired)return M;let L=await St(e,"status").catch(()=>null);if(!(L?L.phase==="stopping":D)||Date.now()>=v)throw Error("worker_already_running_or_lifecycle_busy");if(!D)D=!0,l();await new Promise((re)=>setTimeout(re,250))}}var yw='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 hu(e,l,v,D,M="worker_session_login_required"){if(v.enrollmentInput&&!l){let G=performance.now();return Er(e,await v.enrollmentInput(e),D,v.enroll,G)}let L=l??jr(e),z=await(v.enrollmentCredentials??qr)(e,L);if(!z)throw Error(M);let re=v.createTicketClient?.(z)??new ge(z,{credentialsPath:L,fetchImpl:se(e.proxy)});return gc(e,z,re,D,v.enroll)}import{spawn as _w}from"child_process";import{readFileSync as bw,unlinkSync as kw}from"fs";import{join as vw}from"path";var Sw=120,Rw=15,Ew=5000;function qi(e={}){let l=e.stateDirectory?vw(e.stateDirectory,Pw):null;if(l)Cw(l);let v=Y();if(!v)return null;let D=process.platform==="win32",M=Math.max(1,Math.floor(e.limitSeconds??Sw)),L=e.pid??process.pid,z=Math.min(Rw,M),re=l?`printf '%s %s %s\\n' "$(date +%s)" ${M+z} ${yu(g)} > ${yu(l)} 2>/dev/null
|
|
156
|
+
`:"",G=(be)=>`[ $((SECONDS - started)) -ge ${Math.max(1,be-1)} ]`,ne=D?":":`[ "$(ps -o ppid= -p $$ | tr -d ' ')" = "${L}" ]`,fe=D?`"$SYSTEMROOT/System32/taskkill.exe" /PID ${L} /F >/dev/null`:`kill -KILL ${L}`,te=`parent_is_worker() { ${ne}; }
|
|
157
157
|
while :; do started=$SECONDS
|
|
158
158
|
IFS= read -r -t ${M} pulse && continue
|
|
159
159
|
${G(M)} && parent_is_worker || exit 0
|
|
@@ -161,11 +161,11 @@ started=$SECONDS
|
|
|
161
161
|
IFS= read -r -t ${z} pulse && continue
|
|
162
162
|
if ${G(z)} && parent_is_worker; then
|
|
163
163
|
echo "Reason: worker_event_loop_stalled; no progress for ${M+z}s, restarting the worker." >&2
|
|
164
|
-
${re}${
|
|
164
|
+
${re}${fe}
|
|
165
165
|
fi
|
|
166
166
|
exit 0
|
|
167
|
-
done`,X=_w(v,["-c",te],{stdio:["pipe","ignore","inherit"],windowsHide:!0,...D?{env:{...process.env,MSYS_NO_PATHCONV:"1"}}:{}});X.on("error",()=>{}),X.stdin.on("error",()=>{});let
|
|
168
|
-
`),Math.min(Ew,M*1000/4));return
|
|
167
|
+
done`,X=_w(v,["-c",te],{stdio:["pipe","ignore","inherit"],windowsHide:!0,...D?{env:{...process.env,MSYS_NO_PATHCONV:"1"}}:{}});X.on("error",()=>{}),X.stdin.on("error",()=>{});let le=setInterval(()=>X.stdin.write(`
|
|
168
|
+
`),Math.min(Ew,M*1000/4));return le.unref(),X.unref(),{stop(){clearInterval(le),X.stdin.end()}}}var Pw="worker-stalled";function yu(e){return`'${e.replaceAll("'","'\\''")}'`}function Cw(e){let l;try{l=bw(e,"utf8"),kw(e)}catch{return}let v=/^(\d{1,12}) (\d{1,6}) ([0-9A-Za-z.+-]{1,64})\n?$/.exec(l);if(!v)return;try{N(Lt(),{event:"worker.previous_exit",runtime_version:v[3],reason_code:"worker_event_loop_stalled",duration_ms:Math.min(86400000,Number(v[2])*1000)},{now:()=>new Date(Number(v[1])*1000)})}catch{}}var Mw=`Share this computer as a machine
|
|
169
169
|
|
|
170
170
|
Usage:
|
|
171
171
|
reason serve This computer, signed in (machine name: its hostname)
|
|
@@ -208,29 +208,29 @@ the worker unless --sandbox is set. Settings live in
|
|
|
208
208
|
~/.reason/workers/NAME@<folder hash>/worker.json, one per folder, so every
|
|
209
209
|
folder served for NAME is its own worker. Use
|
|
210
210
|
\`reason worker status|revoke --config <that file>\` for advanced control.
|
|
211
|
-
`,Tw=/^[A-Za-z0-9][A-Za-z0-9._-]{0,31}$/,Lw=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,bu="Machine NAME must start with a letter or digit and use only letters, digits or hyphens (max 63).",_u=["REASON_TOKEN","REASON_MACHINE_TOKEN"],ku="my-computer";function Ls(e){let l=(e.trim().split(".")[0]??"").toLowerCase().replace(/[^a-z0-9-]+/g,"-").replace(/-{2,}/g,"-").slice(0,63).replace(/^-+|-+$/g,"");return l&&yo(l)&&l!==ui?l:ku}class gt extends Error{}function Ww(e,l){let v,D=new Map,M=new Set;for(let
|
|
212
|
-
`)}catch(G){if(!(G instanceof C)||G.status!==409)throw G}return z.createMachineEnrollmentTicket(e,re)})})}}async function Ru(e,l,v,D){let M=await hi(e,D,()=>is(e,l,v));if(M.state==="current"||M.state==="busy")return M;if(!Ie(e,l,v))return null;return va(e),M}function Ws(e,l){let v=zi(e);if(!u(v))return[];let D=l.toLowerCase();return xw(v).sort().flatMap((M)=>{let L=M.toLowerCase();if(L!==D&&!L.startsWith(`${D}@`))return[];let z=En(v,M,"worker.json"),re=Z(z);return re?[{path:z,config:re}]:[]})}async function Fw(e,l,v,D,M){let L=Ws(l,e.name);if(L.length===0)throw new gt(`No worker for machine "${e.name}" on this computer.`);let z=D.controlWorker??St,re=[];for(let G of L){let
|
|
211
|
+
`,Tw=/^[A-Za-z0-9][A-Za-z0-9._-]{0,31}$/,Lw=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,bu="Machine NAME must start with a letter or digit and use only letters, digits or hyphens (max 63).",_u=["REASON_TOKEN","REASON_MACHINE_TOKEN"],ku="my-computer";function Ls(e){let l=(e.trim().split(".")[0]??"").toLowerCase().replace(/[^a-z0-9-]+/g,"-").replace(/-{2,}/g,"-").slice(0,63).replace(/^-+|-+$/g,"");return l&&yo(l)&&l!==ui?l:ku}class gt extends Error{}function Ww(e,l){let v,D=new Map,M=new Set;for(let ne=0;ne<e.length;ne+=1){let fe=e[ne];if(fe==="--help"||fe==="-h"||fe==="help")return null;if(fe==="--dir"||fe==="--token"||fe==="--org"){let te=e[ne+1];if(!te||te.startsWith("-"))throw new gt(`Missing value after ${fe}.`);if(D.has(fe))throw new gt(`${fe} may be specified only once.`);D.set(fe,te),ne+=1;continue}if(["--once","--sandbox","--yes","-y","--stop","--json","--service"].includes(fe)){M.add(fe==="-y"?"--yes":fe);continue}if(fe.startsWith("-"))throw new gt(`Unknown option: ${fe}. Run \`reason serve --help\`.`);if(v!==void 0)throw new gt("Expected one machine NAME.");v=fe}let L=M.has("--stop");if(v===void 0&&L)throw new gt("Missing machine NAME. Usage: reason stop NAME");if(v!==void 0){if(!yo(v)&&!Tw.test(v))throw new gt(bu);if(v.toLowerCase()===ui)throw new gt(`"${ui}" is reserved for Reason's cloud. Choose another NAME.`)}if(L&&(D.size>0||[...M].some((ne)=>ne!=="--stop"&&ne!=="--json")))throw new gt("--stop takes only NAME and --json.");if(!L&&M.has("--json"))throw new gt("--json is only used with --stop.");if(M.has("--service")&&M.has("--once"))throw new gt("--service keeps the worker running; it cannot be combined with --once.");let z=L?void 0:D.get("--token")??l,re=D.get("--org");if(z!==void 0){if(!z.startsWith("rmt_"))throw new gt("That is not a machine token (they start with rmt_). Create one with: reason machines token NAME");if(re!==void 0&&!Lw.test(re))throw new gt("--org must be a workspace id.")}else if(re!==void 0)throw new gt("--org is only used with --token.");let G=D.get("--dir");return{...v===void 0?{}:{name:v},...G===void 0?{}:{dir:G},once:M.has("--once"),sandbox:M.has("--sandbox"),yes:M.has("--yes"),stop:L,json:M.has("--json"),service:M.has("--service"),...z===void 0?{}:{token:z},...re===void 0?{}:{org:re.toLowerCase()}}}function Ki(e,l){let v=Dw(e,l??"."),D;try{D=process.platform==="win32"?Ts.native(v):Ts(v)}catch{throw new gt(`Folder not found: ${v}`)}if(!Iw(D).isDirectory())throw new gt(`Not a folder: ${D}`);return D}var zi=(e)=>En(e,".reason","workers"),Ds=(e)=>u(f(e).state);function Nw(e,l,v){let D=En(zi(e),l);if(Z(En(D,"worker.json"))?.workspaceRoot===v)return D;return En(zi(e),`${l}@${Aw("sha256").update(v).digest("hex").slice(0,8)}`)}function vu(e){let{stateDirectory:l}=e;if(ae(e.workspaceRoot,l)||ae(l,e.workspaceRoot))throw new gt(`${e.workspaceRoot} contains Reason's machine settings (~/.reason). Pick a project folder with --dir.`);return x.parse({version:1,apiOrigin:e.apiOrigin,channel:e.channel,stateDirectory:l,workspaceRoot:e.workspaceRoot,lifetime:e.once?"ephemeral":"persistent",executionMode:e.sandbox?"confined":"host",name:e.name})}function Z(e){if(!u(e))return null;let l=new gt(`${e} is not a valid worker config. Remove it to start over.`),v;try{v=JSON.parse(m(e))}catch(M){if(M instanceof SyntaxError)throw l;throw M}let D=x.safeParse(v);if(!D.success)throw l;return D.data}function Ms(e){return[`--dir ${e.workspaceRoot}`,...e.executionMode==="confined"?["--sandbox"]:[]].join(" ")}async function Hw(e,l){e.stdout.write(`${l} [y/N] `);let v=await Pa(e.stdin,new AbortController().signal);return/^(y|yes)$/i.test(v?.trim()??"")}function Vi(e){return{write(l){if(l.startsWith('{"event":"worker.startup"'))return!0;return e.write(l)}}}var $w={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 Su(e){try{return await e()}catch(l){let v=l instanceof C?$w[l.code]:void 0;throw v?Error(v):l}}async function Bw(e,l,v,D){let M=vu({...l,name:e.name??ku,stateDirectory:En(zi(v),".token-enrollment")}),L=Kr(M,{stored:!1}),z=await Su(()=>io({apiOrigin:M.apiOrigin,token:e.token,body:L.request,...D.fetchImpl?{fetchImpl:D.fetchImpl}:{}}));if(!yo(z.machine_name))throw Error("worker_ticket_receipt_mismatch");if(e.name!==void 0&&e.name.toLowerCase()!==z.machine_name.toLowerCase())throw new gt(`This token is for machine "${z.machine_name}", not "${e.name}". `+"Run `reason serve --token \u2026` without a NAME, or ask for a token for that machine.");if(e.org!==void 0&&e.org!==z.organization_id.toLowerCase())throw new gt(`This token is for workspace ${z.organization_id}, not ${e.org}. Drop --org; the token names its workspace.`);let re=!1;return{name:e.name??z.machine_name,input:(G)=>{if(re)throw Error("worker_ticket_receipt_mismatch");return re=!0,L.saveInstall(G),L.complete(z.organization_id,z)}}}function Uw(e,l,v,D){return async(M)=>{if(l)return l.input(M);let L=await(v.worker?.enrollmentCredentials??qr)(M);if(!L)throw Error("worker_session_login_required");let z=(v.createApi??((re)=>new ge(re)))(L);return hc(M,L,{createHeadlessDeviceEnrollmentTicket:(re)=>Su(async()=>{try{return await z.createMachineEnrollmentTicket(e,re)}catch(G){if(!(G instanceof C)||G.code!=="machine_not_found")throw G}try{await z.createMachine({name:e}),D.stdout.write(`Created machine "${e}".
|
|
212
|
+
`)}catch(G){if(!(G instanceof C)||G.status!==409)throw G}return z.createMachineEnrollmentTicket(e,re)})})}}async function Ru(e,l,v,D){let M=await hi(e,D,()=>is(e,l,v));if(M.state==="current"||M.state==="busy")return M;if(!Ie(e,l,v))return null;return va(e),M}function Ws(e,l){let v=zi(e);if(!u(v))return[];let D=l.toLowerCase();return xw(v).sort().flatMap((M)=>{let L=M.toLowerCase();if(L!==D&&!L.startsWith(`${D}@`))return[];let z=En(v,M,"worker.json"),re=Z(z);return re?[{path:z,config:re}]:[]})}async function Fw(e,l,v,D,M){let L=Ws(l,e.name);if(L.length===0)throw new gt(`No worker for machine "${e.name}" on this computer.`);let z=D.controlWorker??St,re=[];for(let G of L){let ne=await z(G.config,"stop")!==null,fe=Cn(G.config,M),te=ne||fe!==null;if(re.push({config:G.path,folder:G.config.workspaceRoot,running:te,service:fe?.label??null}),!e.json&&fe)v.stdout.write(`Removed background service ${fe.label} (${G.config.workspaceRoot}); it won't start again.
|
|
213
213
|
`);if(!e.json)v.stdout.write(te?`Stopping machine "${e.name}" in ${G.config.workspaceRoot}; current work finishes first.
|
|
214
214
|
`:`Machine "${e.name}" in ${G.config.workspaceRoot} is not running.
|
|
215
215
|
`)}if(e.json)v.stdout.write(`${JSON.stringify({machine:e.name,workers:re})}
|
|
216
|
-
`);return 0}async function Eu(e,l={}){let v=l.io??{stdout:process.stdout,stderr:process.stderr,stdin:process.stdin,stdinIsTty:Boolean(process.stdin.isTTY),stdoutIsTty:Boolean(process.stdout.isTTY)},D=l.runWorker??Tr,M=l.env??process.env,L=_u.map((z)=>M[z]?.trim()).find(Boolean)||void 0;if(!l.env)for(let z of _u)delete process.env[z];try{let z=Ww(e,L);if(!z)return v.stdout.write(Mw),0;let re=Ts(l.home??s()),G=l.serviceHost??
|
|
217
|
-
Run it with: reason serve ${
|
|
218
|
-
Or remove it first: reason worker revoke --config ${
|
|
216
|
+
`);return 0}async function Eu(e,l={}){let v=l.io??{stdout:process.stdout,stderr:process.stderr,stdin:process.stdin,stdinIsTty:Boolean(process.stdin.isTTY),stdoutIsTty:Boolean(process.stdout.isTTY)},D=l.runWorker??Tr,M=l.env??process.env,L=_u.map((z)=>M[z]?.trim()).find(Boolean)||void 0;if(!l.env)for(let z of _u)delete process.env[z];try{let z=Ww(e,L);if(!z)return v.stdout.write(Mw),0;let re=Ts(l.home??s()),G=l.serviceHost??pe(re);if(z.stop)return await Fw({...z,name:z.name},re,v,l,G);let ne=l.channel??w(),fe=Ki(l.cwd??process.cwd(),z.dir),te=z.service?ze(G,M):void 0,X={channel:ne,apiOrigin:ut(M,ne),workspaceRoot:fe,once:z.once,sandbox:z.sandbox},le=z.token?await Bw({...z,token:z.token},X,re,l):void 0,be=le?.name??z.name??Ls((l.hostname??Ow)()),ke=Nw(re,be,fe),Re=En(ke,"worker.json"),Oe=Z(Re);if(le&&Oe&&Ds(Oe)&&ft(Oe).revoked)Zt(Oe);let Me=!le&&Oe!==null&&Ds(Oe)&&(!R(M,"REASON_API_URL")?.trim()||W(X.apiOrigin,Oe.apiOrigin))?Oe.apiOrigin:void 0,Ee=vu({...X,...Me?{apiOrigin:Me}:{},name:be,stateDirectory:ke}),Te=Oe!==null&&Ds(Oe);if(Te&&O(Oe)!==O(Ee)){if(Ee.lifetime==="ephemeral")throw new gt(`Machine "${be}" is already saved for this folder; --once needs another folder or NAME.`);throw new gt(`Machine "${be}" is already set up with different settings (${Oe.workspaceRoot}, ${Oe.executionMode==="host"?"your user permissions":"sandboxed"}).
|
|
217
|
+
Run it with: reason serve ${be} ${Ms(Oe)}
|
|
218
|
+
Or remove it first: reason worker revoke --config ${Re}`)}let We=Ee.lifetime==="persistent"?qe(Ee,G):null;if(We&&!z.service&&M[xe]!==We.label)return v.stdout.write(`Machine "${be}" in ${fe} already runs as a background service (${We.label}).
|
|
219
219
|
Logs: ${We.logs}
|
|
220
|
-
Stop it with: reason stop ${
|
|
221
|
-
`),0;if(z.service&&Te&&!We&&await(l.controlWorker??St)(
|
|
222
|
-
`);else if($e&&!z.yes&&!
|
|
223
|
-
Re-run with --yes to confirm.`);if(!await(l.confirm??((Ge)=>Hw(v,Ge)))(
|
|
224
|
-
`),1}if(!Te)b(
|
|
225
|
-
`);let Le=await D(["enroll","--config",
|
|
226
|
-
This computer is added to machine "${
|
|
227
|
-
Or try the background service again with: reason serve ${
|
|
228
|
-
`)),0}v.stdout.write([`Reason machine "${
|
|
229
|
-
`));let Ne=We&&M[
|
|
230
|
-
`);l.worker?.onStartup?.(
|
|
220
|
+
Stop it with: reason stop ${be}
|
|
221
|
+
`),0;if(z.service&&Te&&!We&&await(l.controlWorker??St)(Ee,"status")!==null)throw new gt(`Machine "${be}" is already running in ${fe}. Stop it first (Ctrl-C, or reason stop ${be}), then run this again.`);let $e=Ee.lifetime==="ephemeral"||!Te;if($e&&!yo(be))throw new gt(bu);if(Ee.executionMode==="confined")v.stderr.write(`Note: sandboxed machines can't host sessions yet. Drop --sandbox to run sessions here.
|
|
222
|
+
`);else if($e&&!z.yes&&!le){let Ce=`Sessions on "${be}" will run commands in ${fe} with your user permissions (no sandbox). Continue?`,Le=Boolean(v.stdin&&v.stdinIsTty);if(!l.confirm&&!Le)throw new gt(`${Ce.replace(/ Continue\?$/,"")}
|
|
223
|
+
Re-run with --yes to confirm.`);if(!await(l.confirm??((Ge)=>Hw(v,Ge)))(Ce))return v.stderr.write(`Cancelled. Nothing was added.
|
|
224
|
+
`),1}if(!Te)b(Ee.stateDirectory,!0),y(Re,Ee);let Ue={...l.worker,enrollmentInput:Uw(be,le,l,v)};if(Ee.lifetime==="persistent"&&!Te){v.stdout.write(`Adding this computer to machine "${be}"\u2026
|
|
225
|
+
`);let Le=await D(["enroll","--config",Re],{...Ue,io:{stdout:{write:()=>!0},stderr:v.stderr}});if(Le!==0)return Le}if(te){let Ce;try{Ce=xn({config:Ee,launcher:te,path:M.PATH||"/usr/local/bin:/usr/bin:/bin",host:G})}catch(Le){if(!(Le instanceof j))throw Le;throw new gt(`${Le.message}
|
|
226
|
+
This computer is added to machine "${be}". Run it in this terminal with: reason serve ${be} ${Ms(Ee)}
|
|
227
|
+
Or try the background service again with: reason serve ${be} ${Ms(Ee)} --service`)}return v.stdout.write([`Reason machine "${be}" runs in the background`,` Folder: ${fe}`,` Mode: ${Ee.executionMode==="host"?"runs with your user permissions":"sandboxed (can't host sessions yet)"}`,` Service: ${Ce.label} (starts at ${Ce.lingering?"boot":"login"}, restarts if it fails)`,` Logs: ${Ce.logs}`,`Start a session with: reason "\u2026" --on ${be}`,`Stop it with: reason stop ${be}`,...Ce.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(`
|
|
228
|
+
`)),0}v.stdout.write([`Reason machine "${be}"`,` Folder: ${fe}`,` Mode: ${Ee.executionMode==="host"?"runs with your user permissions":"sandboxed (can't host sessions yet)"}`,` Lifetime: ${Ee.lifetime==="persistent"?`saved; run \`reason serve ${be}\` again to reconnect`:"this run only (--once)"}`,"Connecting\u2026",""].join(`
|
|
229
|
+
`));let Ne=We&&M[xe]===We.label&&!l.runWorker?qi({stateDirectory:Ee.stateDirectory}):null;try{return await D(["start","--config",Re],{...Ue,io:{stdout:v.stdout,stderr:Vi(v.stderr)},onStartup:(Ce)=>{if(Ce==="ready")v.stdout.write(`Waiting for sessions\u2026 start one with: reason "\u2026" --on ${be}
|
|
230
|
+
`);l.worker?.onStartup?.(Ce)}})}finally{Ne?.stop()}}catch(z){if(z instanceof gt||z instanceof j){let ne=z instanceof j&&z.code?` (${z.code})`:"";return v.stderr.write(`Reason: ${z.message}${ne}
|
|
231
231
|
`),2}let re=z instanceof Error&&/^worker_[a-z_]+$/.test(z.message)?z.message:null,G=re?Mn(re):void 0;return v.stderr.write(`Reason: ${re?G?`${G} (${re})`:re:"could not prepare this machine."}
|
|
232
232
|
`),1}}var jw=200;var YC=h({version:i(1),session_ids:d(t().min(1).max(200)).max(jw)});function Yn(e){let l=S(e);return l!==null&&Date.parse(l.worker?.expiresAt??"")>Date.now()&&!ft(e).revoked}import{spawnSync as Pu}from"child_process";import{readFileSync as qw,rmdirSync as zw,rmSync as Kw}from"fs";import{join as Ns}from"path";var Vw=["Reason.app","Ara Sidecar.app","Ara Device.app"],Jw="sidecar_retire_failed";function Gw(e){return Ns(e,"Library","Application Support","Ara","Sidecar")}function Yw(e){try{let l=qw(Ns(e,"Contents","Info.plist"),"utf8");return/<key>CFBundleIdentifier<\/key>\s*<string>so\.ara\.sidecar<\/string>/.test(l)}catch{return!1}}function Cu(e,l={}){let v=Gw(e),D=Vw.map((re)=>Ns(v,re)).filter(Yw);if(D.length===0)return{status:"absent"};let M=l.processTable??(()=>Pu("/bin/ps",["-xo","pid=,command="],{encoding:"utf8",timeout:5000}).stdout??""),L=l.signal??((re)=>process.kill(re,"SIGTERM")),z=l.command??((re,G)=>Pu(re,[...G],{stdio:"ignore",timeout:1e4}).status??1);try{for(let re of M().split(`
|
|
233
|
-
`)){let G=re.trim().match(/^(\d+)\s+(.+)$/);if(!G)continue;if(!D.some((
|
|
233
|
+
`)){let G=re.trim().match(/^(\d+)\s+(.+)$/);if(!G)continue;if(!D.some((ne)=>G[2].startsWith(`${ne}/Contents/MacOS/`)))continue;try{L(Number(G[1]))}catch{}}for(let re of D)z(Nn,["-u",re]),Kw(re,{recursive:!0,force:!0});try{zw(v)}catch{}}catch{return{status:"failed",code:Jw}}return{status:"removed",bundles:D}}var ny=`Connect this computer to Reason
|
|
234
234
|
|
|
235
235
|
Usage:
|
|
236
236
|
reason connect Your computer, kept connected in the background
|
|
@@ -301,45 +301,45 @@ Usage:
|
|
|
301
301
|
Reason (all of it when it is the only account here), and it is not kept
|
|
302
302
|
disconnected: the next reason "\u2026" connects it again
|
|
303
303
|
--yes, -y Accepted for scripts; disconnect never asks
|
|
304
|
-
`;class ct extends Error{code;constructor(e,l="worker_connect_refused"){super(e);this.code=l}}var iy=4,Ji={write:()=>!0};function
|
|
305
|
-
`;function $u(e){return e.executionMode==="host"?"runs with your user permissions":"sandboxed (can't host Sessions yet)"}function Bu(e){let{parsed:l,saved:v}=e,D=v?.workspaceRoot??e.home;if(l.folder!==void 0)try{D=Ki(e.options.cwd??process.cwd(),l.folder)}catch(re){throw new ct(re instanceof Error?re.message:String(re))}if(!
|
|
306
|
-
`);return z}function cy(e){let l=null;return{write:(v)=>{for(let D of v.matchAll(/^Reason worker: (worker_[a-z_]{1,70})\.$/gm))l=D[1];return e.write(v)},code:()=>l}}function qo(e,l,v){let D=
|
|
307
|
-
`);let G=await Us(M,L,v,D,void 0);if(G===0&&z(M))return 0;if(G===0&&Gr(M))await Zi(M,L,v,D);if(Zn(M.stateDirectory,{recursive:!0,force:!0}),G!==0)return G;throw new ct("Your sign-in changed while this computer was connecting for it. Run reason connect again.","worker_sign_in_changed")}function Fs(e,l){return l?{...e,enrollmentCredentials:(v)=>oa(v,l)}:{...e}}async function js(e,l,v,D,M,L="connect"){if(await qs(e,D,M,L),L==="connect"&&!await Ku(e,v,D))return!1;if(!await Zi(e,l,v,D))return!1;return sc(e.stateDirectory),Zn(e.stateDirectory,{recursive:!0,force:!0}),!0}async function Zi(e,l,v,D){if(!Gr(e)||ft(e).revoked)return!0;for(let M=1;;M+=1){let L=M===3;if(await(D.runWorker??Tr)(["revoke","--config",l],{...D.worker,io:{stdout:Ji,stderr:L?v.stderr:Ji}})===0)return!0;if(L)return!1;await new Promise((re)=>setTimeout(re,1000))}}async function qs(e,l,v,D="connect",M=!1){let L=l.controlWorker??St,z=async()=>L(e,"status").catch(()=>null),re=await L(e,"stop").catch(()=>null)!==null,G=!M&&Cn(e,v,D);if(re||G){let
|
|
304
|
+
`;class ct extends Error{code;constructor(e,l="worker_connect_refused"){super(e);this.code=l}}var iy=4,Ji={write:()=>!0};function me(e,l,v=!1){let D=Wu(e,l,v);return D.length===1?D[0]:Bt(wt(Bt(e,".config")),...Lu(l,v))}var Lu=(e,l)=>[...e==="production"?[]:[e],l?"connect-once":"connect"];function Wu(e,l,v=!1){let D=e;try{D=Yr(e)}catch{}return["ara","reason"].map((M)=>Bt(D,".config",M,...Lu(l,v))).filter(ay)}function ay(e){try{if(Yr(e)!==e)return!1;return Z(Bt(e,"worker.json"))?.stateDirectory===e}catch{return!1}}var Nu="disconnected.json";function eo(e,l){return u(Bt(me(e,l),Nu))}function Gi(e,l,v){let D=Bt(me(e,l),Nu);if(!v){Zn(D,{force:!0});return}b(Bs(D),!0),y(D,{version:1,disconnected_at:new Date().toISOString()})}function sy(e){let l=new Map,v=new Set;for(let te=0;te<e.length;te+=1){let X=e[te];if(X==="--help"||X==="-h"||X==="help")return null;if(["--to","--token","--folder","--sessions",ri,ni,"--keep-awake","--user-chrome","--cloud-sessions","--local-logins","--api-key","--name","--api-url","--add-folder","--remove-folder"].includes(X)){let le=e[te+1];if(!le||le.startsWith("-"))throw new ct(`Missing value after ${X}.`);if(l.has(X))throw new ct(`${X} may be specified only once.`);l.set(X,le),te+=1;continue}if(["--once","--yes","-y","--minimal"].includes(X)){v.add(X==="-y"?"--yes":X);continue}if(X.startsWith("-"))throw new ct(`Unknown option: ${X}. Run \`reason connect --help\`.`);throw new ct(`Unexpected argument: ${X}. To add this computer to a team machine, use --to ${X}.`)}let D=l.get("--sessions");if(D!==void 0&&!/^[1-4]$/.test(D))throw new ct("--sessions takes a number from 1 to 4.");if(l.has(ni)&&!l.has(ri))throw new ct("--proxy-ca-file requires --proxy.");let M=l.get("--keep-awake");if(M!==void 0&&!["on","off"].includes(M))throw new ct("--keep-awake takes on or off.");if(M!==void 0&&(l.size>1||[...v].some((te)=>te!=="--yes")))throw new ct("Run reason connect --keep-awake on|off on its own.");let L=["--add-folder","--remove-folder"].filter((te)=>l.has(te));if(L.length>0&&(l.size>1||[...v].some((te)=>te!=="--yes")))throw new ct(`Run reason connect ${L[0]} PATH on its own.`);let z=l.get("--user-chrome");if(z!==void 0&&z!=="on"&&z!=="off")throw new ct("--user-chrome takes on or off.");let re=l.get("--cloud-sessions");if(re!==void 0&&re!=="on"&&re!=="off")throw new ct("--cloud-sessions takes on or off.");let G=l.get("--local-logins");if(G!==void 0&&G!=="on"&&G!=="off")throw new ct("--local-logins takes on or off.");let ne=l.get("--name")?.trim();if(ne!==void 0&&(ne.length===0||ne.length>160))throw new ct("--name takes a name of 1 to 160 characters.");let fe=(te,X)=>X===void 0?{}:{[te]:X};return{...fe("to",l.get("--to")),...fe("token",l.get("--token")),...fe("folder",l.get("--folder")),...fe("sessions",D===void 0?void 0:Number(D)),...fe("keepAwake",M===void 0?void 0:M==="on"),...fe("userChrome",z===void 0?void 0:z==="on"),...fe("cloudSessions",re===void 0?void 0:re==="on"),...fe("localLogins",G===void 0?void 0:G==="on"),once:v.has("--once"),yes:v.has("--yes"),minimal:v.has("--minimal"),...fe("proxy",l.get(ri)),...fe("proxyCaFile",l.get(ni)),...fe("apiKey",l.get("--api-key")),...fe("name",ne),...fe("apiUrl",l.get("--api-url")),...fe("addFolder",l.get("--add-folder")),...fe("removeFolder",l.get("--remove-folder"))}}var Gr=(e)=>u(f(e).state),Hu=`Reason: this computer now runs Sessions with your user permissions (its sandbox is gone).
|
|
305
|
+
`;function $u(e){return e.executionMode==="host"?"runs with your user permissions":"sandboxed (can't host Sessions yet)"}function Bu(e){let{parsed:l,saved:v}=e,D=v?.workspaceRoot??e.home;if(l.folder!==void 0)try{D=Ki(e.options.cwd??process.cwd(),l.folder)}catch(re){throw new ct(re instanceof Error?re.message:String(re))}if(!_e(D,e.stateDirectory))throw new ct(`${D} holds Reason's own settings. Pick another folder with --folder.`);let M;try{M=l.apiUrl!==void 0?ut({REASON_API_URL:l.apiUrl},e.channel):v&&!R(e.environment,"REASON_API_URL")?.trim()?v.apiOrigin:ut(e.environment,e.channel)}catch(re){throw new ct(`${l.apiUrl===void 0?"REASON_API_URL":"--api-url"} must be an HTTPS URL (HTTP only on this computer): ${re instanceof Error?re.message:String(re)}`)}if(v&&M!==v.apiOrigin&&W(M,v.apiOrigin))M=v.apiOrigin;if(!Cr(M)&&!Pn(e.channel,M))throw new ct(`${M} is not the ${e.channel} Reason API this CLI connects to.`+(e.channel==="production"?" For staging, use the staging CLI (REASON_CLI_CHANNEL=staging).":""));let L=v?.proxy;if(l.proxy!==void 0)try{L=Wa({proxyUrl:l.proxy,caFile:l.proxyCaFile},{home:e.home,statePath:e.stateDirectory})}catch(re){if(!(re instanceof K))throw re;throw new ct(re.message)}let z=(v?.folders??[]).filter((re)=>re!==D);return x.parse({...z.length?{folders:z}:{},version:1,apiOrigin:M,channel:e.channel,stateDirectory:e.stateDirectory,workspaceRoot:D,lifetime:e.lifetime,executionMode:"host",name:l.name??v?.name??Ls((e.options.hostname??ty)()),slots:l.sessions??v?.slots??iy,...L?{proxy:L}:{},...(l.userChrome??v?.userChrome)===void 0?{}:{userChrome:l.userChrome??v?.userChrome},...l.cloudSessions??v?.cloudSessions?{cloudSessions:!0}:{},...(l.localLogins??v?.localLogins)===void 0?{}:{localLogins:l.localLogins??v?.localLogins}})}function Uu(e,l){if(e.localLogins!==void 0||l)return e;return x.parse({...e,localLogins:!0})}async function Us(e,l,v,D,M){if(ft(e).revoked){if(Gr(e))try{Zt(e)}catch{}ha(e);let re=[];try{re=ey(p(e))}catch{}for(let G of re)if(G!=="workspaces")Zn(Bt(p(e),G),{recursive:!0,force:!0})}else if(Gr(e))Zt(e);b(e.stateDirectory,!0),y(l,e);let L=cy(v.stderr),z=await(D.runWorker??Tr)(["enroll","--config",l],{...Fs(D.worker,M),io:{stdout:Ji,stderr:L}});if(z!==0)v.stderr.write(`Reason: this computer was not connected. (${L.code()??"worker_command_failed"})
|
|
306
|
+
`);return z}function cy(e){let l=null;return{write:(v)=>{for(let D of v.matchAll(/^Reason worker: (worker_[a-z_]{1,70})\.$/gm))l=D[1];return e.write(v)},code:()=>l}}function qo(e,l,v){let D=Se(Q(Rn("REASON_CLI_CHANNEL",l),e));return D&&W(D.apiOrigin,v.apiOrigin)?D.orgId.toLowerCase():null}async function ly(e,l,v,D){let{config:M,configPath:L}=oi(e,l),z=(ne)=>{try{return ne!==null&&Yn(ne)&&S(ne)?.orgId.toLowerCase()===l}catch{return!1}},re=null;try{re=Z(L)}catch{}if(z(re))return 0;v.stdout.write(`Connecting this computer for your account too, beside the account it is already connected for\u2026
|
|
307
|
+
`);let G=await Us(M,L,v,D,void 0);if(G===0&&z(M))return 0;if(G===0&&Gr(M))await Zi(M,L,v,D);if(Zn(M.stateDirectory,{recursive:!0,force:!0}),G!==0)return G;throw new ct("Your sign-in changed while this computer was connecting for it. Run reason connect again.","worker_sign_in_changed")}function Fs(e,l){return l?{...e,enrollmentCredentials:(v)=>oa(v,l)}:{...e}}async function js(e,l,v,D,M,L="connect"){if(await qs(e,D,M,L),L==="connect"&&!await Ku(e,v,D))return!1;if(!await Zi(e,l,v,D))return!1;return sc(e.stateDirectory),Zn(e.stateDirectory,{recursive:!0,force:!0}),!0}async function Zi(e,l,v,D){if(!Gr(e)||ft(e).revoked)return!0;for(let M=1;;M+=1){let L=M===3;if(await(D.runWorker??Tr)(["revoke","--config",l],{...D.worker,io:{stdout:Ji,stderr:L?v.stderr:Ji}})===0)return!0;if(L)return!1;await new Promise((re)=>setTimeout(re,1000))}}async function qs(e,l,v,D="connect",M=!1){let L=l.controlWorker??St,z=async()=>L(e,"status").catch(()=>null),re=await L(e,"stop").catch(()=>null)!==null,G=!M&&Cn(e,v,D);if(re||G){let ne=Date.now()+e.shutdownGraceMs+60000;while(Date.now()<ne&&await z()!==null)await new Promise((fe)=>setTimeout(fe,250))}}function zs(e,l){return l==="darwin"&&e.userChrome!==!1}function Hs(e,l,v){let D=[...zs(e,l)?["your own Chrome profiles"]:[],...e.localLogins?["your Claude Code, Codex and Grok logins"]:[]];return[`\u2713 Connected "${e.name}" \xB7 Sessions run here, ${$u(e).replace(/^runs /,"")}`,...D.length>0?[` Uses ${D.join(" and ")} (reason connect --help to change)`]:[],...v,""].join(`
|
|
308
308
|
`)}function $s(e,l,v,D){return[e,` Name: ${l.name}`,` Folder: ${l.workspaceRoot}`,...(l.folders??[]).map((M)=>` ${M}`)," Sessions: every Session you start",` Mode: ${$u(l)}`,...l.proxy?[` Proxy: ${qa(l.proxy)}`]:[],...zs(l,v)?[" Chrome: your own Chrome profiles (--user-chrome off to stop)"]:[],...l.cloudSessions?[" Cloud: your own turns in cloud Sessions may use it (--cloud-sessions on)"]:[],...l.localLogins?[" Logins: your Claude Code, Codex and Grok logins here serve your Sessions (--local-logins off to stop)"]:[],...D,""].join(`
|
|
309
309
|
`)}async function Au(e,l,v){let{io:D,options:M}=v;if(Wu(v.home,v.channel).length===2)D.stderr.write(`${JSON.stringify({event:"worker.connection_bound_twice",chosen:Bs(l),timestamp:new Date().toISOString()})}
|
|
310
310
|
`);let L=De(Bt(v.home,".config"));if(L.problem)D.stderr.write(`${JSON.stringify({event:"worker.config_rename",code:L.problem,timestamp:new Date().toISOString()})}
|
|
311
|
-
`);ls(v.home,v.host.platform);let z=Lc({home:v.home,channel:v.channel,saved:e,configPath:l,log:(
|
|
312
|
-
`),host:v.host}),re=Ic({...z,log:(
|
|
313
|
-
`)}),{configPath:G}=re,
|
|
314
|
-
`),!0};if(ft(
|
|
315
|
-
`),await Us(x.parse({...
|
|
316
|
-
`))).catch(()=>{});try{for(;;){let
|
|
311
|
+
`);ls(v.home,v.host.platform);let z=Lc({home:v.home,channel:v.channel,saved:e,configPath:l,log:(le)=>D.stderr.write(`${le}
|
|
312
|
+
`),host:v.host}),re=Ic({...z,log:(le)=>D.stderr.write(`${le}
|
|
313
|
+
`)}),{configPath:G}=re,ne=re.saved;if(!ne)return D.stderr.write("Reason: this computer has no saved connection. Run `reason connect`.\n"),0;let fe=(le,be)=>{let ke=Vs(v.home,v.channel),Re;try{let Me=null;try{Me=be.keep?null:S(ne)?.orgId.toLowerCase()??null}catch{}if(Re=si(ne,{prefer:qo(v.home,v.channel,ne),...be}),Re&&Me)ii(Re,Me)}finally{ke()}if(!Re)return!1;ne=Re;let Oe="";try{Oe=` (workspace ${S(Re)?.orgId??"unknown"})`}catch{}return D.stderr.write(`Reason: ${le}; this computer goes on running Sessions for its other Reason account${Oe}.
|
|
314
|
+
`),!0};if(ft(ne).revoked&&!fe("this computer's connection was removed from Reason",{keep:!1}))return D.stderr.write("Reason: this computer was removed from Reason. Run `reason connect` to connect it again.\n"),0;if(ne.executionMode==="confined"||!Yn(ne)){let le=lr(ne.stateDirectory)??void 0,be=le?null:qo(v.home,v.channel,ne);if(!le&&!(be&&wo(ne,be)))fe("this computer's connection expired and its account is not signed in here",{keep:!0,live:!0})}let te=ne.executionMode==="confined";if(te||!Yn(ne)){let le=lr(ne.stateDirectory)??void 0;if(D.stderr.write(te?Hu:`Reason: this computer's connection expired; renewing it with ${le?"its API key":"your login"}\u2026
|
|
315
|
+
`),await Us(x.parse({...ne,executionMode:"host"}),G,D,M,le)!==0)return D.stderr.write(le?"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 X=new AbortController;if(!M.runWorker)import("./ask-relay-eqv9sq9m.js").then(({runBackgroundAskRelay:le})=>le(X.signal,(be)=>D.stderr.write(`${be}
|
|
316
|
+
`))).catch(()=>{});try{for(;;){let le=lr(ne.stateDirectory)===null?{ownerWorkspaces:M.worker?.ownerWorkspaces??{}}:{},be=M.runWorker?null:qi({stateDirectory:ne.stateDirectory}),ke=!1,Re;try{Re=await(M.runWorker??Tr)(["start","--config",G],{deferOptionalLanes:!0,...M.worker,...le,ownComputer:!0,io:{stdout:D.stdout,stderr:D.stderr},onDeviceRevoked:()=>{ke=!0}})}finally{be?.stop()}if(!ke)return Re;if(!fe("this computer's connection was removed from Reason",{keep:!1}))break}return Gi(v.home,v.channel,!0),D.stderr.write("Reason: this computer was removed from Reason. Run `reason connect` to connect it again.\n"),0}finally{X.abort()}}async function dy(e,l,v){let{io:D,options:M,home:L,channel:z,environment:re}=v;if(l&&await(M.controlWorker??St)(l,"status").catch(()=>null))throw new ct("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=me(L,z,!0),ne=Bu({parsed:e,saved:l,stateDirectory:G,lifetime:"ephemeral",home:L,channel:z,options:M,environment:re}),fe=Uu(ne,v.apiKey??(l?lr(l.stateDirectory)??void 0:void 0)),te=Bt(G,"worker.json");return b(G,!0),y(te,fe),D.stdout.write($s(`Reason: connecting "${fe.name}" while this command runs`,fe,v.host.platform,["Connecting\u2026"])),(M.runWorker??Tr)(["start","--config",te],{...Fs(M.worker,v.apiKey),ownComputer:!0,io:{stdout:D.stdout,stderr:Vi(D.stderr)},onStartup:(X)=>{if(X==="ready")D.stdout.write(`Connected. Start Sessions on "${fe.name}" from Reason. Press Ctrl-C to stop.
|
|
317
317
|
`);M.worker?.onStartup?.(X)}})}function uy(e,l,v,D){if(v.platform!=="darwin")throw new ct("--keep-awake is for macOS.");if(!l)throw new ct("This computer is not connected to Reason. Run reason connect first.");b(p(l),!0),$c(f(l).daemon,e);let M=nr(f(l).daemon)==="battery_and_ac";return D.stdout.write(`Keep awake: ${M?"on (this Mac stays awake while it runs Sessions)":"off"}
|
|
318
|
-
`),0}var fy=n({root:n({id:t().min(1).max(160),label:t().max(160),path_fingerprint:t()})});async function Fu(e,l,v,D){let M=await(Fs(D.worker,v).enrollmentCredentials??qr)(e,jr(e));if(!M)throw Error("worker_session_login_required");if(!M.scopes.includes("devices:write"))throw Error("worker_devices_write_scope_required");let L=D.folderApi?.(M)??new
|
|
319
|
-
`:`Removed ${
|
|
320
|
-
`),0}function xu(e,l){let v=Yr(e.home??s()),D=e.env??process.env;return{io:e.io??Ks(),options:e,home:v,channel:e.channel??w(),environment:D,apiKey:l??Vn(D),host:e.serviceHost??
|
|
321
|
-
`)}let
|
|
322
|
-
`),!await js(te,v,M,L,
|
|
323
|
-
`),await py(te,
|
|
324
|
-
`);let Fe=await Us(
|
|
318
|
+
`),0}var fy=n({root:n({id:t().min(1).max(160),label:t().max(160),path_fingerprint:t()})});async function Fu(e,l,v,D){let M=await(Fs(D.worker,v).enrollmentCredentials??qr)(e,jr(e));if(!M)throw Error("worker_session_login_required");if(!M.scopes.includes("devices:write"))throw Error("worker_devices_write_scope_required");let L=D.folderApi?.(M)??new ge(M,{credentialsPath:jr(e),fetchImpl:se(e.proxy)}),z=(re)=>re instanceof C&&re.status===404&&!["device_not_found","root_not_found"].includes(re.code);return{add:async(re)=>{let G=yc(e,re,{...l.roots[0].permissions,expose_mcp:!1}),ne=await L.addDeviceRoot(l.deviceId,{path_fingerprint:G.pathFingerprint,label:G.label,permissions:{...G.permissions,expose_mcp:!1}}).catch((te)=>{if(z(te))throw Error("worker_folders_unavailable");if(te instanceof C&&te.code==="root_limit_reached")throw new ct("This computer already has the most folders Reason allows (32).");throw te}),fe=fy.parse(ne).root;if(fe.path_fingerprint!==G.pathFingerprint)throw Error("worker_enrollment_receipt_mismatch");return{...G,id:fe.id,label:fe.label}},remove:async(re)=>{await L.removeDeviceRoot(l.deviceId,re).catch((G)=>{if(z(G))throw Error("worker_folders_unavailable");if(!(G instanceof C&&G.code==="root_not_found"))throw G})}}}function ju(e,l,v){ce({...l,roots:v,handsSlots:e.slots,worker:{...l.worker,configDigest:O(e)}},f(e).state,{proofStore:xt(e)})}async function my(e,l,v,D){let{io:M,options:L,host:z}=D,re=l&&!D.apiKey&&lr(l.stateDirectory)===null?qo(D.home,D.channel,l):null,G=l&&re&&Gr(l)&&!wo(l,re)?Qt(l).find((Ce)=>Ce.account&&Ce.organizationId===re)??null:void 0;if(G===null)throw new ct("This computer is not connected for your account. Run reason connect first.");let ne=G?G.config:l,fe=G?G.configPath:v,te=ne&&Gr(ne)&&!ft(ne).revoked?S(ne):null;if(!l||!ne||!te||ne.lifetime!=="persistent")throw new ct("This computer is not connected to Reason. Run reason connect first.");let X=e.addFolder!==void 0,le=X?e.addFolder:e.removeFolder,be=L.cwd??process.cwd(),ke;try{ke=Ki(be,le)}catch(Ce){if(X)throw new ct(Ce instanceof Error?Ce.message:String(Ce));ke=ry(be,le)}if(ke===ne.workspaceRoot)throw new ct(`${ke} is this computer's main folder. To use another one, run reason connect --folder PATH.`);let Re=ne.folders??[],Oe=te.roots.slice(1).find((Ce)=>Ce.path===ke);if(!X&&!Oe&&!Re.includes(ke))throw new ct(`${ke} is not one of this computer's folders.`);if(X&&!_e(ke,ne.stateDirectory))throw new ct(`${ke} holds Reason's own settings.`);if(X&&!Oe&&Re.length>=31)throw new ct("This computer already has the most folders Reason allows (32).");let Me=D.apiKey??lr(ne.stateDirectory)??void 0,Ee=await Fu(ne,te,Me,L),Te=te.roots.filter((Ce)=>Ce.path!==ke);if(X)Te=[...Te,await Ee.add(ke)];else if(Oe)await Ee.remove(Oe.id);ju(ne,te,Te);let We=X?[...Re.filter((Ce)=>Ce!==ke),ke]:Re.filter((Ce)=>Ce!==ke),{folders:$e,...Ue}=ne;if(y(fe,x.parse({...Ue,...We.length?{folders:We}:{}})),!await(L.controlWorker??St)(l,"reload_roots").then(()=>!0,()=>!1))Ie(l,z,"connect");return M.stdout.write(X?`Added ${ke}. Sessions on "${ne.name}" may run in it.
|
|
319
|
+
`:`Removed ${ke}. Sessions on "${ne.name}" no longer run in it.
|
|
320
|
+
`),0}function xu(e,l){let v=Yr(e.home??s()),D=e.env??process.env;return{io:e.io??Ks(),options:e,home:v,channel:e.channel??w(),environment:D,apiKey:l??Vn(D),host:e.serviceHost??pe(v)}}async function py(e,l,v,D){let M=S(e),L=M.roots;if(l.workspaceRoot!==e.workspaceRoot){let z=await Fu(e,M,v,D),re=L.find((G)=>G.path===l.workspaceRoot)??await z.add(l.workspaceRoot);await z.remove(L[0].id),L=[re,...L.slice(1).filter((G)=>G.id!==re.id)]}ju(l,M,L)}var qu=Symbol("serve here");async function hy(e,l,v,D){let{io:M,options:L,home:z,channel:re,environment:G,host:ne}=D;if(ne.platform==="darwin"){let Fe=Cu(z);if(Fe.status==="failed")M.stderr.write(`Reason: could not remove the retired Reason Device helper (${Fe.code}).
|
|
321
|
+
`)}let fe=l&&!D.apiKey&&lr(l.stateDirectory)===null?qo(z,re,l):null,te=l&&fe&&ft(l).revoked&&Qt(l).some((Fe)=>Fe.account&&Fe.organizationId===fe)?si(l,{prefer:fe,keep:!1})??l:l,X=Bu({parsed:e,saved:te,stateDirectory:me(z,re),lifetime:"persistent",home:z,channel:re,options:L,environment:G});if(Gi(z,re,!1),te?.executionMode==="confined")M.stdout.write(Hu);let le=te?lr(te.stateDirectory):null,be=Uu(X,D.apiKey??le??void 0),ke=ze(ne,G),Re=te!==null&&Gr(te),Oe=Re&&O(te)===O(be),Me=Oe&&Yn(be),Ee=te?.userChrome!==!1===(be.userChrome!==!1)&&te?.cloudSessions===be.cloudSessions&&te?.localLogins===be.localLogins,Te=D.apiKey??le??void 0,We=fe!==null&&Re&&!ft(te).revoked&&!wo(te,fe);if(We){if(!Oe||!Ee||JSON.stringify(te.proxy)!==JSON.stringify(be.proxy))throw new ct("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 Fe=await ly(te,fe,M,L);if(Fe!==0)return Fe}let $e=We?[` Account: yours too, in workspace ${fe}, beside this computer's other Reason account`]:[],Ue=async()=>{if(e.apiKey===void 0||e.apiKey===le)return;await oa(be,e.apiKey),na(be.stateDirectory,e.apiKey)},Ne=G.PATH||"/usr/local/bin:/usr/bin:/bin",Ce=Me&&JSON.stringify(te?.proxy)===JSON.stringify(be.proxy)&&Ee?qe(be,ne,"connect"):null,Le=Ce?.label===kn(be.channel),Ge=Le?await(L.controlWorker??St)(be,"status").catch(()=>null):null,Ve=Ge!==null,Je=Le&&!Ve&&$i(Ce,ne)&&ss({config:be,launcher:ke,path:Ne,host:ne,kind:"connect"}),it=Ge!==null&&(Ge.activeSessions??Ge.activeClaims)>0;if((Ve||Je)&&(it||[null,g].includes(ko(be)))){await Ue();let Fe=Li(be,ne,"connect");if(Fe==="retired"){let nt=Je?null:await(L.controlWorker??St)(be,"status").catch(()=>null);if(!Je&&(!nt||nt.phase==="stopping"))Ie(be,ne,"connect")}else if(Fe==="current_not_running")Ie(be,ne,"connect");else if(ne.platform==="win32"&&Ge&&(Ge.capabilityReadiness?.["exec.run"]===!1||Ge.supportedOperations?.includes("exec.run")===!1)&&ky())Ie(be,ne,"connect");return await(L.controlWorker??St)(be,"reload_roots").catch(()=>null),M.stdout.write(G.REASON_INSTALLER==="1"?Hs(be,ne.platform,$e):$s("This computer is connected to Reason",be,ne.platform,[...$e,...Je?[" 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 Ye=!Me&&!We;if(Re&&!Oe)if(te.apiOrigin!==be.apiOrigin||te.name!==be.name){if(M.stdout.write(`Reconnecting this computer with its new settings\u2026
|
|
322
|
+
`),!await js(te,v,M,L,ne))throw new ct("Could not remove this computer's previous connection from Reason. Check your network and try again.","worker_previous_connection_not_removed")}else if(te.executionMode==="host"&&Yn(te))M.stdout.write(`Applying the new settings to this computer\u2026
|
|
323
|
+
`),await py(te,be,Te,L),Ye=!1;else await qs(te,L,ne);if(Ye){if(G.REASON_INSTALLER!=="1")M.stdout.write(`Connecting this computer to Reason\u2026
|
|
324
|
+
`);let Fe=await Us(be,v,M,L,Te);if(Fe!==0)return Fe;if(Te)na(be.stateDirectory,Te)}else y(v,be),await Ue();let Be;try{Be=xn({config:be,launcher:ke,path:Ne,host:ne,kind:"connect"})}catch(Fe){if(!(Fe instanceof j))throw Fe;if(Fe.code!=="worker_service_manager_missing")throw new ct(`${Fe.message}
|
|
325
325
|
This computer is set up; run reason connect again to start it.`,Fe.code??"worker_service_start_failed");if(L.serveHere&&G.REASON_INSTALLER!=="1")return M.stdout.write(`No background service here; running in this terminal (Ctrl-C stops it).
|
|
326
|
-
`),qu;if(L.serveHere&&G.REASON_INSTALLER==="1"&&await gy(
|
|
327
|
-
This computer is set up. Keep it connected by running ${
|
|
326
|
+
`),qu;if(L.serveHere&&G.REASON_INSTALLER==="1"&&await gy(be,ke,G,L))return M.stdout.write(Hs(be,ne.platform,[` No service manager here: it runs until this computer restarts (keep it with ${ke} connect under a process manager)`])),0;throw new j(`${Fe.message}
|
|
327
|
+
This computer is set up. Keep it connected by running ${ke} connect in a terminal or under this box's process manager.`,Fe.code)}let Ke=[...$e,...Be.lingering===!1?["Note: it stops when you log out. To keep it running and start it at boot, run: sudo loginctl enable-linger $USER"]:[],...Be.identityProblem?[`Note: Full Disk Access you grant it lasts until the next update (${Be.identityProblem}).`]:[]];return M.stdout.write(G.REASON_INSTALLER==="1"?Hs(be,ne.platform,Ke):$s("This computer is connected to Reason",be,ne.platform,[` Service: ${Be.label} (starts at ${Be.lingering?"boot":"login"}, restarts if it fails)`,` Logs: ${Be.logs}`,`Start Sessions on "${be.name}" from Reason. Remove it with: reason disconnect`,...Ke])),0}async function gy(e,l,v,D){let{REASON_INSTALLER:M,...L}=v;(D.startConnection??zu)(l,L,Bt(e.stateDirectory,"connect.log"));for(let z=0;z<60;z+=1)if(await new Promise((re)=>setTimeout(re,500)),await(D.controlWorker??St)(e,"status").catch(()=>null))return!0;return!1}function zu(e,l,v){let D=Tu(v,"a",384);try{let M=Du(e,["connect"],{detached:!0,stdio:["ignore",D,D],env:l});M.on("error",()=>{return}),M.unref()}finally{Mu(D)}}async function Ku(e,l,v,D=!1){let M=!0;for(let L of Qt(e)){if(D&&L.account)continue;if(L.config&&Gr(L.config)&&!ft(L.config).revoked){if(await(v.runWorker??Tr)(["revoke","--config",L.configPath],{...v.worker,io:{stdout:Ji,stderr:l.stderr}})!==0){M=!1;continue}}Zn(L.directory,{recursive:!0,force:!0})}return M}function Ks(){return{stdout:process.stdout,stderr:process.stderr,stdin:process.stdin,stdinIsTty:Boolean(process.stdin.isTTY),stdoutIsTty:Boolean(process.stdout.isTTY)}}function Vu(e,l){if(e instanceof ct||e instanceof j)return l.stderr.write(`Reason: ${e.message} (${e.code??"worker_service_failed"})
|
|
328
328
|
`),2;let v=e instanceof Error&&/^worker_[a-z_]+$/.test(e.message)?e.message:_y(e);return l.stderr.write(`Reason: ${Mn(v)??"could not connect this computer."} (${v})
|
|
329
329
|
`),1}var wy=new Set(["EACCES","EPERM","ENOENT","ENOSPC","EROFS","ENOTDIR","EEXIST","ELOOP"]),yy=new Set(["ConnectionRefused","ConnectionClosed","FailedToOpenSocket","ECONNREFUSED","ECONNRESET","ENOTFOUND","EAI_AGAIN","ENETUNREACH","EHOSTUNREACH"]);function _y(e){if(e instanceof C)return e.status>=500?"worker_api_unavailable":"worker_api_refused";let l=e?.code;if(typeof l==="string"&&wy.has(l))return`worker_file_${l.toLowerCase()}`;if(typeof l==="string"&&yy.has(l))return"worker_api_unreachable";if(typeof l==="string"&&(/CERT|SSL|TLS/.test(l)||l==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"))return"worker_api_certificate_untrusted";if(e instanceof Error&&e.message.startsWith("Command failed"))return"worker_connect_command_failed";let v=oc(e);if(v==="native_network")return"worker_api_unreachable";return/^native_[a-z_]+$/.test(v)?`worker_connect_${v.slice(7)}`:"worker_connect_unexpected"}function Iu(e,l){if(e.minimal){ts({home:l.home});return}if(e.once||l.options.desktop===!1||!l.io.stdinIsTty||rs({home:l.home})!=="install")return;let v;try{v=ze(l.host,l.environment)}catch{return}if(l.host.platform==="darwin"){let M=Bt(l.home,".local","share","reason","desktop-install.log");(l.options.installDesktop??Ou)(v,l.environment,{log:M}),l.io.stdout.write(`Desktop and browser use install in the background (reason desktop status; log ${M}).
|
|
330
330
|
`);return}l.io.stdout.write(`Installing desktop components first (reason connect --minimal skips them)\u2026
|
|
331
331
|
`);let D=(l.options.installDesktop??Ou)(v,l.environment,null);if(D!==0&&D!==3)l.io.stderr.write(`Reason: desktop components did not install; connecting without them. Retry with reason desktop install. (desktop_install_failed)
|
|
332
332
|
`)}function by(e){if(e.host.platform!=="win32"||!e.io.stdinIsTty)return;cr();let l=Ae();if(!Zw(l)||tn(l))return;e.io.stdout.write(`Setting up the Windows sandbox for confined commands; approve the Windows prompt\u2026
|
|
333
333
|
`);let v=Na(l);if(v!=="installed")e.io.stderr.write(`Reason: the Windows sandbox was not set up (${v==="cancelled"?"prompt declined":"install failed"}); connecting without confined commands. Run reason connect again to retry. (windows_sandbox_unavailable)
|
|
334
|
-
`)}function ky(){if(Y()===null)return!1;return cr(),tn(Ae())}function Ou(e,l,v){if(!v){let M=()=>Xw(e,["desktop","install"],{env:l,stdio:"inherit"}).status??1,L=M();return L===3221225477?M():L}Qw(Bs(v.log),{recursive:!0,mode:448});let D=Tu(v.log,"w",384);try{let M=Du(e,["desktop","install"],{detached:!0,stdio:["ignore",D,D],env:{...l,REASON_DESKTOP_BACKGROUND:"1"}});M.on("error",()=>{return}),M.unref()}finally{Mu(D)}return 0}async function gl(e,l={}){let v=l.io??Ks();try{let D=sy(e);if(!D)return v.stdout.write(ny),0;if(D.to!==void 0||D.token!==void 0){if(D.sessions!==void 0)throw new ct("A machine's workers run one Session at a time; --sessions does not apply to them.");if(D.proxy!==void 0)throw new ct("--proxy is for your own computer; a machine's workers don't take it yet.");if(D.userChrome!==void 0)throw new ct("A machine serves every member of the workspace; --user-chrome is for your own computer.");if(D.cloudSessions!==void 0)throw new ct("A machine serves every member of the workspace; --cloud-sessions is for your own computer.");if(D.localLogins!==void 0)throw new ct("A machine serves every member of the workspace; --local-logins is for your own computer.");for(let[
|
|
335
|
-
`);return 0}if(v!=="disconnect"){let G=await Ry(z,L,e,l,v,D,M);if(G!==null)return G}let re=!1;try{re=await js(z,L,e,l,l.serviceHost??
|
|
334
|
+
`)}function ky(){if(Y()===null)return!1;return cr(),tn(Ae())}function Ou(e,l,v){if(!v){let M=()=>Xw(e,["desktop","install"],{env:l,stdio:"inherit"}).status??1,L=M();return L===3221225477?M():L}Qw(Bs(v.log),{recursive:!0,mode:448});let D=Tu(v.log,"w",384);try{let M=Du(e,["desktop","install"],{detached:!0,stdio:["ignore",D,D],env:{...l,REASON_DESKTOP_BACKGROUND:"1"}});M.on("error",()=>{return}),M.unref()}finally{Mu(D)}return 0}async function gl(e,l={}){let v=l.io??Ks();try{let D=sy(e);if(!D)return v.stdout.write(ny),0;if(D.to!==void 0||D.token!==void 0){if(D.sessions!==void 0)throw new ct("A machine's workers run one Session at a time; --sessions does not apply to them.");if(D.proxy!==void 0)throw new ct("--proxy is for your own computer; a machine's workers don't take it yet.");if(D.userChrome!==void 0)throw new ct("A machine serves every member of the workspace; --user-chrome is for your own computer.");if(D.cloudSessions!==void 0)throw new ct("A machine serves every member of the workspace; --cloud-sessions is for your own computer.");if(D.localLogins!==void 0)throw new ct("A machine serves every member of the workspace; --local-logins is for your own computer.");for(let[ne,fe]of[["--api-key",D.apiKey],["--name",D.name],["--api-url",D.apiUrl]])if(fe!==void 0)throw new ct(`${ne} is for your own computer; reason serve sets up a machine's workers.`);return Iu(D,xu(l)),await(l.runServe??Eu)([...D.to===void 0?[]:[D.to],...D.token===void 0?[]:["--token",D.token],...D.folder===void 0?[]:["--dir",D.folder],...D.yes?["--yes"]:[],D.once?"--once":"--service"],{io:v,...l.cwd?{cwd:l.cwd}:{},...l.home?{home:l.home}:{},...l.channel?{channel:l.channel}:{},...l.env?{env:l.env}:{},...l.serviceHost?{serviceHost:l.serviceHost}:{},...l.worker?{worker:l.worker}:{}})}let M=xu(l,D.apiKey),{channel:L,environment:z}=M;if(!l.env)for(let ne of["REASON_API_KEY","ARA_API_KEY"])delete process.env[ne];if(D.userChrome&&M.host.platform!=="darwin")throw new ct("--user-chrome is for a Mac.");let re=os(z[xe],L),G=re||D.once?()=>{return}:Vs(M.home,L);try{let ne=Bt(me(M.home,L),"worker.json"),fe=Z(ne);if(re)return await Au(fe,ne,M);if(D.keepAwake!==void 0)return uy(D.keepAwake,fe,M.host,v);if(D.addFolder!==void 0||D.removeFolder!==void 0)return await my(D,fe,ne,M);if(Iu(D,M),by(M),D.once)return await dy(D,fe,M);let te=await hy(D,fe,ne,M);if(te!==qu)return te;return G(),G=()=>{return},await Au(Z(ne),ne,M)}finally{G()}}catch(D){return Vu(D,v)}}async function _l(e,l={}){let v=l.io??Ks();try{if(e.some((z)=>["--help","-h","help"].includes(z)))return v.stdout.write(oy),0;let D=e.filter((z)=>!["--yes","-y","--temporary","--account"].includes(z)),M=e.includes("--temporary"),L=e.includes("--account");if(D.length>1||D[0]?.startsWith("-")||(M||L)&&D.length>0||M&&L)throw new ct("Usage: reason disconnect [NAME] [--yes] (--temporary or --account only without NAME)");if(D[0]!==void 0)return await Ey(D[0],v,l);return await vy(v,l,M?"temporary":L?"account":"disconnect")}catch(D){return Vu(D,v)}}async function vy(e,l,v){let D=Yr(l.home??s()),M=l.channel??w(),L=Vs(D,M);try{return await Sy(e,l,v,D,M)}finally{L()}}function Vs(e,l){let v=me(e,l),D=u(v)?bt():null;if(!D)return()=>{return};for(let M=0;M<300;M+=1){let L=D.lock(v);if(L)return L;Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,50)}throw new ct("This computer's connection is busy; try again in a moment.","worker_connection_busy")}async function Sy(e,l,v,D,M){let L=Bt(me(D,M),"worker.json"),z=Z(L);if(!z){if(v==="disconnect")Gi(D,M,!0);if(v!=="logout")e.stdout.write(`This computer is not connected to Reason.
|
|
335
|
+
`);return 0}if(v!=="disconnect"){let G=await Ry(z,L,e,l,v,D,M);if(G!==null)return G}let re=!1;try{re=await js(z,L,e,l,l.serviceHost??pe(D))}finally{if(v!=="temporary")Gi(D,M,!0)}if(!re)return e.stderr.write(`Reason: this computer stopped, but Reason could not be reached to remove it. Run reason disconnect again.
|
|
336
336
|
`),1;return e.stdout.write(`Disconnected "${z.name}". It no longer runs Sessions; run reason connect to connect it again.
|
|
337
|
-
`),0}async function Ry(e,l,v,D,M,L,z){let re=Qt(e).filter((
|
|
338
|
-
`),1;if(M!=="account"||!
|
|
337
|
+
`),0}async function Ry(e,l,v,D,M,L,z){let re=Qt(e).filter((Re)=>Re.account);if(re.length===0)return null;let G=qo(L,z,e),ne=D.controlWorker??St,fe=re.find((Re)=>Re.organizationId===G);if(fe){if(fe.config&&!await Zi(fe.config,fe.configPath,v,D))return v.stderr.write(`Reason: Reason could not be reached to remove your account's Device from this computer. Try again.
|
|
338
|
+
`),1;if(M!=="account"||!fe.config)Zn(fe.directory,{recursive:!0,force:!0});return await ne(e,"reload_roots").catch(()=>null),v.stdout.write(`Disconnected this computer from workspace ${G} for your account. It stays connected for its other Reason accounts.
|
|
339
339
|
`),0}if(!G&&M==="account")throw new ct("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||!wo(e,G)){if(M==="account"&&G)ii(e,G);if(M!=="logout")v.stdout.write(`This computer stays connected for its other Reason accounts; it was not connected for yours.
|
|
340
|
-
`);return 0}let te=D.serviceHost??
|
|
341
|
-
`),1;let
|
|
342
|
-
`),0}async function Ey(e,l,v){let D=Yr(v.home??s()),M=v.serviceHost??
|
|
340
|
+
`);return 0}let te=D.serviceHost??pe(L),X=null;try{X=S(e)?.orgId.toLowerCase()??null}catch{}if(await qs(e,D,te,"connect",!0),!await Ku(e,v,D,!0)||!await Zi(e,l,v,D))return Ie(e,te,"connect"),v.stderr.write(`Reason: Reason could not be reached to remove your account's Devices from this computer. Try again.
|
|
341
|
+
`),1;let le=si(e,{prefer:null,keep:!1});if(!le)return null;if(M==="account"&&X)ii(le,X);let be=Ie(le,te,"connect")!==null,ke="";try{ke=` in workspace ${S(le)?.orgId??""}`}catch{}return v.stdout.write(`Disconnected this computer for your account. It stays connected for its other Reason account${ke}${be?"":"; run reason connect to start it again"}.
|
|
342
|
+
`),0}async function Ey(e,l,v){let D=Yr(v.home??s()),M=v.serviceHost??pe(D),L=Ws(D,e);if(L.length===0)throw new ct(`No worker for machine "${e}" on this computer.`);let z=!1;for(let re of L)if(await js(re.config,re.path,l,v,M,"serve"))l.stdout.write(`Disconnected machine "${e}" in ${re.config.workspaceRoot}.
|
|
343
343
|
`);else z=!0,l.stderr.write(`Reason: machine "${e}" in ${re.config.workspaceRoot} stopped, but Reason could not be reached to remove it. Run reason disconnect ${e} again.
|
|
344
|
-
`);return z?1:0}async function to(e={}){let l=Yr(e.home??s()),v=Z(Bt(
|
|
345
|
-
export{f,S,nr,Z,
|
|
344
|
+
`);return z?1:0}async function to(e={}){let l=Yr(e.home??s()),v=Z(Bt(me(l,e.channel??w()),"worker.json"));if(!v)return null;let D,M=await(e.controlWorker??St)(v,"status").catch((le)=>(D=le instanceof Error?le:Error(String(le)),null)),L=M?ko(v):null,z=e.serviceHost??pe(l),re=qe(v,z,"connect"),G=ft(v).revoked,ne=!G&&!M,fe=(()=>{try{return S(v)}catch{return null}})(),{workspaces:te,off:X}=G||lr(v.stateDirectory)!==null?{workspaces:null,off:null}:Pc(v,M?.phase==="running");return{workspaces:te,workspaces_off:X,workspaces_max:Qo+(te?.filter((le)=>le.account).length??0),name:v.name,device_id:fe?.deviceId??null,organization_id:fe?.orgId??null,folder:v.workspaceRoot,mode:v.executionMode,sessions_max:null,user_chrome:zs(v,z.platform),cloud_sessions:v.cloudSessions===!0,root:fe?.roots[0]?{id:fe.roots[0].id,permissions:fe.roots[0].permissions}:null,roots:fe?.roots.map((le)=>({id:le.id,folder:le.path,permissions:le.permissions}))??[],state:G?"removed":M?M.phase==="running"?"connected":M.phase:"not_running",not_running_reason:ne?Yc(v,D):null,worker_alive:ne&&re?$i(re,z):null,sessions_running:M?.activeSessions??null,version:L,service:re?{label:re.label,logs:re.logs}:null}}function yl(e={}){let l=Yr(e.home??s()),v=Z(Bt(me(l,e.channel??w()),"worker.json"));if(!v)return null;return Ie(v,e.serviceHost??pe(l),"connect")?.label??null}async function wl(e={}){let l=Yr(e.home??s()),v=Z(Bt(me(l,e.channel??w()),"worker.json"));if(!v)return null;let D=e.serviceHost??pe(l),M=await Ru(v,D,"connect",e.current);if(M!==null||qe(v,D,"connect"))return M;return Py(v,D,e)}async function Py(e,l,v){let D=v.controlWorker??St,M=await D(e,"status").catch(()=>null);if(!M)return null;if(v.current!==void 0&&ko(e)===v.current)return{state:"current"};let L=M.activeSessions??M.activeClaims;if(L!==0)return{state:"busy",sessions:L,waitedMs:0};let z;try{z=ze(l,v.env??process.env)}catch{return null}await D(e,"stop").catch(()=>null);let re=Date.now()+e.shutdownGraceMs+60000;while(Date.now()<re&&await D(e,"status").catch(()=>null)!==null)await new Promise((te)=>setTimeout(te,250));let{REASON_INSTALLER:G,REASON_DESKTOP_BACKGROUND:ne,...fe}=v.env??process.env;return(v.startConnection??zu)(z,fe,Bt(e.stateDirectory,"connect.log")),{state:"restarted"}}
|
|
345
|
+
export{f,S,nr,Z,me,eo,gl,_l,to,yl,wl};
|