@reason-machines/cli-linux-arm64-musl 0.2.380 → 0.2.382
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/bin/ara +2 -2
- package/bin/vm-hands/api-credentials-xppmbg0m.js +2 -0
- package/bin/vm-hands/api-xmpbsm6b.js +2 -0
- package/bin/vm-hands/{ask-relay-9pm7kj1s.js → ask-relay-zjqyxvxe.js} +3 -3
- package/bin/vm-hands/connect-cli-ehxeg8m5.js +2 -0
- package/bin/vm-hands/{custom-endpoint-device-zhpake9f.js → custom-endpoint-device-bm94e9r0.js} +1 -1
- package/bin/vm-hands/desktop-account-3tnm4z5w.js +2 -0
- package/bin/vm-hands/{device-workspace-vbcry9d6.js → device-workspace-0xsj5ykf.js} +1 -1
- package/bin/vm-hands/hands-worker-source-azdrrhsz.js +2 -0
- package/bin/vm-hands/{index-bbk6a9sk.js → index-7f2kwwen.js} +1 -1
- package/bin/vm-hands/{install-receipt-7x81ek76.js → install-receipt-3xyx3rdd.js} +1 -1
- package/bin/vm-hands/local-automation-ynx1qr9v.js +2 -0
- package/bin/vm-hands/local-capabilities-855ch0dq.js +2 -0
- package/bin/vm-hands/local-desktop-users-ajb81vjm.js +2 -0
- package/bin/vm-hands/local-display-mac-9h6btvvq.js +2 -0
- package/bin/vm-hands/local-display-session-f9ywkbba.js +2 -0
- package/bin/vm-hands/local-pty-session-cjas515w.js +2 -0
- package/bin/vm-hands/managed-runtime-dars4628.js +2 -0
- package/bin/vm-hands/{network-contract-zqvt1v0t.js → network-contract-dsw79qkc.js} +1 -1
- package/bin/vm-hands/package-smk3nqjs.js +2 -0
- package/bin/vm-hands/permissions-pdmhp2s3.js +2 -0
- package/bin/vm-hands/{reason-hands-protocol-8fxjynte.js → reason-hands-protocol-7d7xj1h3.js} +1 -1
- package/bin/vm-hands/serve-service-n6xd6323.js +2 -0
- package/bin/vm-hands/status-2m75kz1h.js +96 -0
- package/bin/vm-hands/version-74zqccyz.js +2 -0
- package/bin/vm-hands/vm-hands-entry-lite-06qnb2w1.js +458 -0
- package/bin/vm-hands/{vm-hands-entry-lite-7shpbsw8.js → vm-hands-entry-lite-1gxktkpe.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-wf1ek4f0.js → vm-hands-entry-lite-23bb8ce4.js} +2 -2
- package/bin/vm-hands/vm-hands-entry-lite-245929bs.js +346 -0
- package/bin/vm-hands/vm-hands-entry-lite-2e18tm6w.js +245 -0
- package/bin/vm-hands/{vm-hands-entry-lite-g036gtem.js → vm-hands-entry-lite-2t0vcvd8.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-8yy5ttfw.js → vm-hands-entry-lite-2tcjqgfp.js} +3 -3
- package/bin/vm-hands/vm-hands-entry-lite-3n3xh0xv.js +540 -0
- package/bin/vm-hands/vm-hands-entry-lite-50n6vbfx.js +251 -0
- package/bin/vm-hands/{vm-hands-entry-lite-j2q1k9vb.js → vm-hands-entry-lite-51hmj6am.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-zfwg7ehq.js → vm-hands-entry-lite-5n4vsm6b.js} +2 -2
- package/bin/vm-hands/vm-hands-entry-lite-8fj07njx.js +3 -0
- package/bin/vm-hands/{vm-hands-entry-lite-r8twmzjc.js → vm-hands-entry-lite-8zawqa9q.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-3hbe4em3.js → vm-hands-entry-lite-9cmfthkq.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-45j8qwsf.js → vm-hands-entry-lite-9w5vs9zv.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-qyzgxd9g.js → vm-hands-entry-lite-aj1ccphg.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-za55dtte.js → vm-hands-entry-lite-ammr3xbc.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-de2rkr5h.js → vm-hands-entry-lite-ch7y4b1b.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-439yqbn5.js → vm-hands-entry-lite-cwe16c51.js} +174 -16
- package/bin/vm-hands/vm-hands-entry-lite-dh5gwmyf.js +3 -0
- package/bin/vm-hands/vm-hands-entry-lite-dsdwzasy.js +105 -0
- package/bin/vm-hands/{vm-hands-entry-lite-5pm6bhb8.js → vm-hands-entry-lite-e0gdt6r5.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-5kgvss4p.js → vm-hands-entry-lite-e2mjbqmr.js} +2 -2
- package/bin/vm-hands/vm-hands-entry-lite-ejm5er3h.js +7 -0
- package/bin/vm-hands/{vm-hands-entry-lite-mh0xecf3.js → vm-hands-entry-lite-f02906k8.js} +4 -4
- package/bin/vm-hands/vm-hands-entry-lite-f5230h6t.js +67 -0
- package/bin/vm-hands/{vm-hands-entry-lite-zh8p7ndn.js → vm-hands-entry-lite-fb5dzy9x.js} +2 -2
- package/bin/vm-hands/vm-hands-entry-lite-fyvgav60.js +3 -0
- package/bin/vm-hands/vm-hands-entry-lite-g7h6wjqy.js +3 -0
- package/bin/vm-hands/vm-hands-entry-lite-h8dbw0c7.js +4 -0
- package/bin/vm-hands/{vm-hands-entry-lite-nhtb458c.js → vm-hands-entry-lite-hnsm5t36.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-r6pap1kh.js → vm-hands-entry-lite-ma001vzh.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-anmv8hp7.js → vm-hands-entry-lite-mn64e4pt.js} +286 -104
- package/bin/vm-hands/{vm-hands-entry-lite-9cgm6g8t.js → vm-hands-entry-lite-pk3q774c.js} +1 -1
- package/bin/vm-hands/vm-hands-entry-lite-qef2ndkd.js +6 -0
- package/bin/vm-hands/vm-hands-entry-lite-qnnfvm5r.js +5 -0
- package/bin/vm-hands/vm-hands-entry-lite-qwf78yqr.js +11 -0
- package/bin/vm-hands/vm-hands-entry-lite-r8qg3wp1.js +3 -0
- package/bin/vm-hands/vm-hands-entry-lite-rd0ak4ye.js +4 -0
- package/bin/vm-hands/{vm-hands-entry-lite-00qsbphw.js → vm-hands-entry-lite-rpn0frzb.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-g9rvf5qk.js → vm-hands-entry-lite-rtt2w6c6.js} +1 -1
- package/bin/vm-hands/vm-hands-entry-lite-sex82vb1.js +3 -0
- package/bin/vm-hands/{vm-hands-entry-lite-dgxxsdwb.js → vm-hands-entry-lite-xrthfx3q.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-kxdw4myj.js → vm-hands-entry-lite-y2s2w174.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-hc3p6r9p.js → vm-hands-entry-lite-zjfr0zh8.js} +2 -2
- package/bin/vm-hands/vm-hands-entry-lite.js +1 -1
- package/bin/vm-hands/{vm-hands-executor-a05whg1y.js → vm-hands-executor-yx6mxa2p.js} +1 -1
- package/bin/vm-hands/vm-hands-op-runner-yt3v3v6w.js +2 -0
- package/bin/vm-hands/{vm-hands-runtime-ky9jhq5h.js → vm-hands-runtime-ygddqgbs.js} +3 -3
- package/bin/vm-hands/worker-sandbox-tgqbmy6b.js +2 -0
- package/package.json +1 -1
- package/bin/vm-hands/api-af9g18n7.js +0 -2
- package/bin/vm-hands/api-credentials-65mrr3tn.js +0 -2
- package/bin/vm-hands/connect-cli-w0z9jzv5.js +0 -2
- package/bin/vm-hands/desktop-account-5zvgspyw.js +0 -2
- package/bin/vm-hands/hands-worker-source-h0b1j53p.js +0 -2
- package/bin/vm-hands/local-automation-nm3xtj0a.js +0 -2
- package/bin/vm-hands/local-capabilities-bbrr6j7v.js +0 -2
- package/bin/vm-hands/local-desktop-users-0hadyvx1.js +0 -2
- package/bin/vm-hands/local-display-mac-v1pc7177.js +0 -2
- package/bin/vm-hands/local-display-session-n0kagkex.js +0 -2
- package/bin/vm-hands/local-pty-session-hs7rq03x.js +0 -2
- package/bin/vm-hands/managed-runtime-n7ftmmx7.js +0 -2
- package/bin/vm-hands/package-3cd7cfyv.js +0 -2
- package/bin/vm-hands/permissions-bfwdxyr5.js +0 -2
- package/bin/vm-hands/serve-service-g12x52xn.js +0 -2
- package/bin/vm-hands/status-t3jrf9fn.js +0 -96
- package/bin/vm-hands/version-m89hab1m.js +0 -2
- package/bin/vm-hands/vm-hands-entry-lite-1085xsma.js +0 -5
- package/bin/vm-hands/vm-hands-entry-lite-4m40gwkf.js +0 -3
- package/bin/vm-hands/vm-hands-entry-lite-5q1q991e.js +0 -181
- package/bin/vm-hands/vm-hands-entry-lite-bdp2578c.js +0 -540
- package/bin/vm-hands/vm-hands-entry-lite-bvbfcp1k.js +0 -4
- package/bin/vm-hands/vm-hands-entry-lite-c01eyep6.js +0 -3
- package/bin/vm-hands/vm-hands-entry-lite-dcynw6t2.js +0 -3
- package/bin/vm-hands/vm-hands-entry-lite-g6912hkd.js +0 -62
- package/bin/vm-hands/vm-hands-entry-lite-hh24bq0d.js +0 -3
- package/bin/vm-hands/vm-hands-entry-lite-jb2sr2r7.js +0 -3
- package/bin/vm-hands/vm-hands-entry-lite-sb9a1jcn.js +0 -4
- package/bin/vm-hands/vm-hands-entry-lite-sky5eg5d.js +0 -11
- package/bin/vm-hands/vm-hands-entry-lite-ynzy9k5z.js +0 -340
- package/bin/vm-hands/vm-hands-entry-lite-ze9msfq1.js +0 -3
- package/bin/vm-hands/vm-hands-entry-lite-zq42mcjc.js +0 -459
- package/bin/vm-hands/vm-hands-op-runner-69sca90a.js +0 -2
- package/bin/vm-hands/worker-sandbox-wpzkvwer.js +0 -2
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{Hc as pZ,Ic as uZ,Jc as C4,Kc as T4,Lc as M8,Mc as lZ}from"./vm-hands-entry-lite-qef2ndkd.js";import{Nc as fZ,Oc as H8,Pc as t9,Qc as _0,Rc as M9,Sc as a0,Zc as K0}from"./vm-hands-entry-lite-mn64e4pt.js";import{ad as B8,bd as W8,cd as aQ}from"./vm-hands-entry-lite-h8dbw0c7.js";import{De as MZ,if as f9,jf as t0,kf as T8,lf as m0,pf as C0,ye as NZ}from"./vm-hands-entry-lite-5n4vsm6b.js";import{Fg as aZ,Lg as $8,Mg as s8}from"./vm-hands-entry-lite-xrthfx3q.js";import{Rg as j4}from"./vm-hands-entry-lite-fb5dzy9x.js";import{Ah as O0,Bh as o9,Ih as d8,Jh as TZ,Kh as HZ,Ug as SQ,Xg as N9,eh as jZ,fh as qZ,hh as CZ,jh as i9,kh as FZ,lh as VZ,mh as h8,ph as a9,yh as g8,zh as w0}from"./vm-hands-entry-lite-ammr3xbc.js";import{ti as rZ,ui as a8}from"./vm-hands-entry-lite-e2mjbqmr.js";import{Vi as b0}from"./vm-hands-entry-lite-sex82vb1.js";import{lj as _8,mj as r9,pj as M4}from"./vm-hands-entry-lite-fyvgav60.js";import{Kj as A$,qj as O8,rj as o0,sj as D8,tj as r0,uj as W9,vj as V8,wj as H$,xj as i0,yj as u0,zj as KZ}from"./vm-hands-entry-lite-pk3q774c.js";import{Pj as TQ}from"./vm-hands-entry-lite-23bb8ce4.js";import{ik as x}from"./vm-hands-entry-lite-zjfr0zh8.js";import{ok as q4}from"./vm-hands-entry-lite-rd0ak4ye.js";import{Ak as N4,Bk as J9,rk as L4,tk as e9,uk as OZ,vk as d$,wk as DZ,xk as d9}from"./vm-hands-entry-lite-r8qg3wp1.js";import{Ek as q}from"./vm-hands-entry-lite-51hmj6am.js";import{Fk as u1,Kk as qQ}from"./vm-hands-entry-lite-2t0vcvd8.js";import{execFile as b4}from"child_process";import{createRequire as k4}from"module";import{win32 as p9}from"path";var f4=250,m4=50,y4=250,g4=4194304;function v$($){let Z=/^(?:\[([^\]]+)\]|([^:]+)):([0-9]{1,5})$/.exec($??""),Q=Number(Z?.[3]);return Z&&Q<=65535?{address:Z[1]??Z[2],port:Q}:null}function h4($){let Z=[];for(let Q of $.split(/\r?\n/)){let X=Q.trim().split(/\s+/);if(X[0]!=="TCP"||X.length<5)continue;let J=v$(X[1]),Y=v$(X[2]),z=Number(X.at(-1));if(!J||!Y||!Number.isSafeInteger(z)||z<0)continue;Z.push({pid:z,localAddress:J.address,localPort:J.port,remoteAddress:Y.address,remotePort:Y.port,listening:Y.port===0})}return Z}function v4($){if($.localAddress==="0.0.0.0"||$.localAddress==="::")return`*:${$.localPort}`;return $.localAddress.includes(":")?`[${$.localAddress}]:${$.localPort}`:`${$.localAddress}:${$.localPort}`}var S8=($)=>new Promise((Z,Q)=>b4(p9.join(d$("win32").split(";")[0],"NETSTAT.EXE"),["-ano"],{timeout:$,maxBuffer:g4,encoding:"utf8",windowsHide:!0,env:d9()},(X,J)=>X?Q(X):Z(J)));function O9($){let Z=p9.normalize($.startsWith("\\\\?\\")?$.slice(4):$);return Z.length>3&&Z.endsWith("\\")?Z.slice(0,-1):Z}function c4($,Z){let Q=$.toLowerCase(),X=Z.toLowerCase();return X===Q||X.startsWith(Q.endsWith("\\")?Q:`${Q}\\`)}function p$($,Z,Q){let X=$.cwd(Q),J=X?O9(X):null;return J&&p9.isAbsolute(J)&&c4(Z,J)?J:null}var T9;function u9(){if(T9!==void 0)return T9;if(T9=null,process.platform!=="win32"||!["x64","arm64"].includes(process.arch))return null;let $;try{$=k4(import.meta.url)("bun:ffi")}catch{return null}let{FFIType:Z,ptr:Q}=$,X,J;try{X=$.dlopen("kernel32.dll",{CreateToolhelp32Snapshot:{args:[Z.u32,Z.u32],returns:Z.u64},Process32FirstW:{args:[Z.u64,Z.ptr],returns:Z.i32},Process32NextW:{args:[Z.u64,Z.ptr],returns:Z.i32},OpenProcess:{args:[Z.u32,Z.i32,Z.u32],returns:Z.u64},ReadProcessMemory:{args:[Z.u64,Z.u64,Z.ptr,Z.u64,Z.ptr],returns:Z.i32},CloseHandle:{args:[Z.u64],returns:Z.i32}}).symbols,J=$.dlopen("ntdll.dll",{NtQueryInformationProcess:{args:[Z.u64,Z.i32,Z.ptr,Z.u32,Z.ptr],returns:Z.i32}}).symbols}catch{return null}let Y=0xFFFF_FFFF_FFFF_FFFFn,z=2,F=1040,G=568,V=(B,H,K)=>{let L=Buffer.alloc(K);return X.ReadProcessMemory(B,H,Q(L),K,null)?L:null};return T9={processes(){let B=BigInt(X.CreateToolhelp32Snapshot(z,0));if(B===Y)throw new q("process_inspection_failed","Reading this computer's processes did not complete.");try{let H=Buffer.alloc(G);H.writeUInt32LE(G,0);let K=Q(H),L=[];for(let W=X.Process32FirstW(B,K);W;W=X.Process32NextW(B,K)){let U=H.toString("utf16le",44,G),j=U.slice(0,U.includes("\x00")?U.indexOf("\x00"):void 0),O=H.readUInt32LE(8);if(O>0)L.push({pid:O,parentPid:H.readUInt32LE(32),command:j.replace(/\.exe$/i,"")||null})}return L}finally{X.CloseHandle(B)}},cwd(B){let H=BigInt(X.OpenProcess(F,0,B));if(H===0n)return null;try{let K=Buffer.alloc(48);if(J.NtQueryInformationProcess(H,0,Q(K),K.length,null)!==0)return null;let L=V(H,K.readBigUInt64LE(8)+0x20n,8)?.readBigUInt64LE(0),W=L?V(H,L+0x38n,16):null,U=W?.readUInt16LE(0)??0;if(!W||U===0||U%2!==0)return null;return V(H,W.readBigUInt64LE(8),U)?.toString("utf16le")??null}finally{X.CloseHandle(H)}}},T9}function w8($){if(!$)throw new q("process_inspection_failed","Reading this computer's processes is unavailable.");return $}async function u$($,Z){let Q;try{Q=await $(Z)}catch{throw new q("process_inspection_failed","Reading this computer's ports did not complete.")}return h4(Q)}async function O2($,Z=u9()){let Q=w8(Z),X=O9($),J=[];for(let Y of Q.processes()){if(J.length>=f4)break;let z=p$(Q,X,Y.pid);if(z)J.push({pid:Y.pid,command:Y.command,cwd:p9.relative(X,z)||"."})}return{processes:J}}async function D2($,Z=u9(),Q=S8){let X=w8(Z),J=O9($),Y=(await u$(Q,5000)).filter((V)=>V.listening&&V.pid>0).map((V)=>({pid:V.pid,port:V.localPort,address:v4(V)})).sort((V,B)=>V.pid-B.pid||V.port-B.port||(V.address<B.address?-1:V.address>B.address?1:0)),z=[...new Set(Y.map((V)=>V.pid))].slice(0,m4),F=new Set(z.filter((V)=>p$(X,J,V)!==null));if(F.size===0)return{ports:[]};let G=new Map(X.processes().map((V)=>[V.pid,V.command]));return{ports:Y.filter((V)=>F.has(V.pid)).slice(0,y4).map((V)=>({pid:V.pid,command:G.get(V.pid)??null,address:V.address}))}}function c$($,Z){let Q=new Set([Z]);for(let X=!0;X;){X=!1;for(let J of $)if(!Q.has(J.pid)&&Q.has(J.parentPid)&&J.pid!==J.parentPid)Q.add(J.pid),X=!0}return Q}function d4($,Z,Q,X){let J=(Y)=>Y==="127.0.0.1"||Y==="::ffff:127.0.0.1"||Y==="::1";return $.flatMap((Y)=>{if(!Z.has(Y.pid)||Y.localPort!==X)return[];let z=Y.listening&&(J(Y.localAddress)||["0.0.0.0","::"].includes(Y.localAddress)),F=!Y.listening&&J(Y.localAddress)&&J(Y.remoteAddress);if(!z&&!F)return[];let G=`${Y.localAddress}:${Y.localPort}>${Y.remoteAddress}:${Y.remotePort}`;return[{pid:Y.pid,processGroupId:Q,descriptor:String(Y.pid),kernelId:G,state:z?"listen":"established",port:X,peerPort:z?null:Y.remotePort,host:Y.localAddress==="::1"?"::1":"127.0.0.1"}]})}async function l$($,Z,Q=u9(),X=S8){let J=w8(Q),Y=c$(J.processes(),$),z=await u$(X,1000),F=c$(J.processes(),$);return d4(z,new Set([...Y].filter((G)=>F.has(G))),$,Z)}async function _2($,Z=u9(),Q=S8){if(!Z||$.aborted)return!1;let X=Z.processes().some((F)=>F.pid===process.pid),J=Z.cwd(process.pid),Y=J!==null&&O9(J).toLowerCase()===O9(process.cwd()).toLowerCase(),z=await Q(5000).then((F)=>/^\s*TCP\s/m.test(F),()=>!1);return X&&Y&&z&&!$.aborted}var v={chunk:32768,upload:1048576,total:536870912,streams:16,queued:512,buffered:262144,relayBuffered:8388608,requestMs:30000,lifetimeMs:600000,authorizationMs:2000,window:8};function l9($){return $!==null&&typeof $==="object"&&!Array.isArray($)}function I0($,Z,Q=Number.MAX_SAFE_INTEGER){return typeof $==="number"&&Number.isSafeInteger($)&&$>=Z&&$<=Q}function n$($){return typeof $==="string"&&/^[a-zA-Z0-9_-]{1,160}$/.test($)}function i$($,Z){let Q=Buffer.from($,"latin1");return Buffer.concat([Buffer.from([Q.length]),Q,Z])}function R0($){if(!l9($)||Object.keys($).length!==12||![$.organizationId,$.userId,$.runId,$.deviceId,$.rootId,$.jobId,$.fenceId].every(n$)||!I0($.attachmentRevision,0)||!I0($.grantRevision,1)||!I0($.generation,1)||!I0($.port,1024,65535)||!I0($.expiresAtMs,1))throw Error("preview_binding_invalid");return Object.freeze({...$})}function d0($,Z){return Object.keys($).every((Q)=>$[Q]===Z[Q])}function _9($){if($.length>4096||!$.startsWith("/")||$.startsWith("//")||/[\\\x00-\x20\x7f#]/.test($))throw Error("preview_path_invalid");let Z=decodeURIComponent($);if(Z.startsWith("//")||/[\\\x00-\x1f\x7f]/.test(Z))throw Error("preview_path_invalid");return $}function s$($){return Array.isArray($)&&$.length<=64&&$.every((Z)=>Array.isArray(Z)&&Z.length===2&&typeof Z[0]==="string"&&/^[a-zA-Z0-9-]{1,80}$/.test(Z[0])&&typeof Z[1]==="string"&&Z[1].length<=4096&&!/[\x00-\x1f\x7f]/.test(Z[1]))}function D9($,Z=v.chunk){if($.length>Math.ceil(Z/3)*4||!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test($))throw Error("preview_data_invalid");let Q=Buffer.from($,"base64");if(Q.length>Z)throw Error("preview_data_too_large");return Q}function a$($){if(Array.isArray($))return Buffer.concat($);if(typeof $==="string")return Buffer.from($,"utf8");if($ instanceof ArrayBuffer)return Buffer.from($);return $}function o$($){if(Buffer.byteLength($)>v.upload*1.4+300000)throw Error("preview_frame_too_large");let Z=JSON.parse($);if(!l9(Z))throw Error("preview_frame_invalid");if(Z.type==="hello")return{type:"hello",binding:R0(Z.binding),...I0(Z.messages,v.chunk,v.upload)?{messages:Z.messages}:{},...I0(Z.window,1,v.window)?{window:Z.window}:{},...Z.bytes===!0?{bytes:!0}:{}};if(Z.type==="refused"&&typeof Z.reason==="string"&&/^[a-z_]{1,32}$/.test(Z.reason))return{type:"refused",binding:R0(Z.binding),reason:Z.reason};if(!n$(Z.id))throw Error("preview_frame_invalid");if(Z.type==="end"||Z.type==="cancel"||Z.type==="credit")return{type:Z.type,id:Z.id};if(Z.type==="ws"&&typeof Z.protocol==="string"&&/^[a-zA-Z0-9._-]{0,100}$/.test(Z.protocol))return{type:"ws",id:Z.id,protocol:Z.protocol};if(Z.type==="data"&&typeof Z.data==="string"&&typeof Z.binary==="boolean")return D9(Z.data,v.upload),{type:"data",id:Z.id,data:Z.data,binary:Z.binary};if(Z.type==="head"&&I0(Z.status,200,599)&&s$(Z.headers))return{type:"head",id:Z.id,status:Z.status,headers:Z.headers};if(Z.type==="request"&&typeof Z.method==="string"&&/^(GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS)$/.test(Z.method)&&typeof Z.path==="string"&&s$(Z.headers)&&typeof Z.body==="string"&&typeof Z.upgrade==="boolean")return D9(Z.body,v.upload),{type:"request",id:Z.id,method:Z.method,path:_9(Z.path),headers:Z.headers,body:Z.body,upgrade:Z.upgrade};throw Error("preview_frame_invalid")}function b8($){let Z=[...$],Q=new Set(Z.filter(([J])=>J.toLowerCase()==="connection").flatMap(([,J])=>J.toLowerCase().split(",").map((Y)=>Y.trim()))),X=new Set(["authorization","proxy-authorization","cookie","set-cookie","host","origin","referer","connection","upgrade","keep-alive","transfer-encoding","te","trailer","content-length","forwarded","alt-svc","service-worker-allowed","clear-site-data","refresh"]);return Z.filter(([J])=>!X.has(J.toLowerCase())&&!Q.has(J.toLowerCase())&&!/^(x-forwarded-|x-ara-|sec-websocket-|access-control-)/i.test(J))}async function k8($){let Z;try{return await Promise.race([Promise.resolve().then($).then((Q)=>Q===!0||(Q===!1?!1:void 0),()=>{return}),new Promise((Q)=>{Z=setTimeout(()=>Q(void 0),v.authorizationMs)})])}finally{clearTimeout(Z)}}async function A9($){return await k8($)===!0}function s9($,Z){let Q=new URL($);if(Q.username||Q.password||Q.search||Q.hash||!(Q.protocol==="wss:"||Q.protocol==="ws:"&&["127.0.0.1","[::1]"].includes(Q.hostname))||!new RegExp(`^/${Z}/[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]{32,}$`).test(Q.pathname))throw Error("preview_relay_invalid");return Q.href}function r$($){if(!l9($)||Object.keys($).length!==2||typeof $.deviceRelayUrl!=="string")throw Error("preview_open_invalid");return{binding:R0($.binding),deviceRelayUrl:s9($.deviceRelayUrl,"device")}}function t$($){if(!l9($)||Object.keys($).length!==1||!("binding"in $))throw Error("preview_close_invalid");return{binding:R0($.binding)}}import{request as s4}from"http";import{pipeline as n4}from"stream";import{constants as f8,createBrotliCompress as i4,createGzip as a4}from"zlib";import{WebSocket as x9}from"ws";import{randomBytes as p4,timingSafeEqual as u4}from"crypto";import{createServer as l4}from"net";var e$="x-preview-connection";async function $Z($,Z){if(Z.aborted)throw Error("preview_closed");let Q=p4(32).toString("base64url"),X=new Set,J=!1,Y=l4((G)=>{if(J||Z.aborted||X.size>=v.streams*2)return G.destroy();X.add(G);let V=new AbortController;G.once("close",()=>{X.delete(G),V.abort()}),G.on("error",()=>G.destroy()),G.setTimeout(2000,()=>G.destroy());let B=Buffer.alloc(0),H=(L)=>{B=Buffer.concat([B,L]);let W=B.indexOf(`\r
|
|
3
|
+
\r
|
|
4
|
+
`);if(W<0){if(B.length>16384)G.destroy();return}if(G.pause(),G.off("data",H),W>16384||B.length>v.upload+16384)return G.destroy();K(B,W).catch(()=>G.destroy())};G.on("data",H);async function K(L,W){let U=L.subarray(0,W).toString("latin1").split(`\r
|
|
5
|
+
`),j=/^(GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS) (\S+) HTTP\/1\.1$/.exec(U.shift()??"");if(!j)throw Error("preview_request_invalid");_9(j[2]);let O=!1,C=0,A=[];for(let T of U){let S=/^([a-zA-Z0-9-]+):[ \t]*([^\x00-\x08\x0a-\x1f\x7f]*)$/.exec(T);if(!S)throw Error("preview_header_invalid");if(S[1].toLowerCase()===e$){C++;let m=Buffer.from(S[2].trim());O=m.length===Q.length&&u4(m,Buffer.from(Q))}else if(S[1].toLowerCase()!=="host")A.push(T)}if(!O||C!==1||J||V.signal.aborted)throw Error("preview_connection_denied");let R=await $.connect(V.signal);if(J||V.signal.aborted)throw R.destroy(),Error("preview_closed");X.add(R),R.on("error",()=>G.destroy()),R.once("close",()=>{X.delete(R),G.destroy()}),G.once("close",()=>R.destroy()),G.setTimeout(0);let P=[`${j[1]} ${j[2]} HTTP/1.1`,`Host: 127.0.0.1:${R.remotePort}`,...A,"",""].join(`\r
|
|
6
|
+
`);R.write(Buffer.concat([Buffer.from(P,"latin1"),L.subarray(W+4)])),R.pipe(G),G.pipe(R),G.resume()}});await new Promise((G,V)=>{Y.once("error",V),Y.listen(0,"127.0.0.1",G)});let z=Y.address();if(!z||typeof z==="string")throw Y.close(),Error("preview_bind_failed");function F(){if(J)return;J=!0,Z.removeEventListener("abort",F);for(let G of X)G.destroy();X.clear(),Y.close()}if(Z.addEventListener("abort",F,{once:!0}),Z.aborted)F();return{port:z.port,headers:{[e$]:Q},close:F}}var o4=60000,r4=1e4,t4=5000,e4=/^(?:text\/(?!event-stream)|application\/(?:(?:x-)?javascript|json|[a-z.+-]*\+json|xml|[a-z.+-]*\+xml|wasm)|image\/svg\+xml)/i;function $3($,Z,Q,X){let J=(G)=>Z.find(([V])=>V.toLowerCase()===G)?.[1],Y=(G)=>X.find(([V])=>V.toLowerCase()===G)?.[1],z=Number(Y("content-length")??Number.NaN);if($!=="GET"||Q!==200||J("range")!==void 0||Y("content-encoding")!==void 0||!e4.test(Y("content-type")??"")||/\bno-transform\b/i.test(Y("cache-control")??"")||z<1024)return null;let F=(G)=>new RegExp(`(?:^|,)\\s*${G}\\s*(?:,|$|;\\s*q=(?:1|0?\\.0*[1-9]))`,"i").test(J("accept-encoding")??"");return F("br")?"br":F("gzip")?"gzip":null}function Z3($,Z){let Q=$.filter(([X])=>X.toLowerCase()==="vary").map(([,X])=>X).join(", ");return[...$.filter(([X])=>!["vary","etag","content-md5"].includes(X.toLowerCase())),...$.filter(([X])=>X.toLowerCase()==="etag").map(([X,J])=>[X,J.startsWith("W/")?J:`W/${J}`]),["Content-Encoding",Z],["Vary",Q.split(",").some((X)=>/^\s*(?:accept-encoding|\*)\s*$/i.test(X))?Q:Q?`${Q}, Accept-Encoding`:"Accept-Encoding"]]}async function Q3($){process.stderr.write(`${JSON.stringify({event:"worker_preview.open_refused",job_id:$.jobId,port:$.port,reason_code:$.reason})}
|
|
7
|
+
`);let Z=$.binding,Q;try{Q=s9($.deviceRelayUrl,"device")}catch{return}if(!Z)return;await new Promise((X)=>{let J=new x9(Q,{followRedirects:!1,perMessageDeflate:!1,maxPayload:4096}),Y=setTimeout(()=>{J.terminate(),X()},v.authorizationMs*2);J.addEventListener("open",()=>{J.send(JSON.stringify({type:"refused",binding:Z,reason:$.reason})),J.close(1000,`worker_refused_${$.reason}`)}),J.addEventListener("error",()=>{clearTimeout(Y),X()}),J.addEventListener("close",()=>{clearTimeout(Y),X()})})}async function X3($,Z){let Q=Date.now()+r4,X;for(;;){if(!Z())return"closed";let J=X??=$.refusal().finally(()=>{X=void 0}),Y,z=await Promise.race([J.catch(()=>"port_unproved"),new Promise((F)=>{Y=setTimeout(()=>F("port_check_timeout"),v.authorizationMs)})]).finally(()=>clearTimeout(Y));if(z===null)return null;if(!["listener_unproved","port_check_timeout"].includes(z)||Date.now()+500>=Q)return z;await new Promise((F)=>setTimeout(F,500))}}async function ZZ($){let Z=R0($.binding),Q=()=>!$.signal.aborted&&Date.now()<Z.expiresAtMs,X=Z.expiresAtMs>Date.now()+v.lifetimeMs+t4?"binding_mismatch":await X3($.port,Q);if(X)throw await Q3({deviceRelayUrl:$.deviceRelayUrl,binding:Z,jobId:Z.jobId,port:Z.port,reason:X}),Error("preview_not_authorized",{cause:X});let J=s9($.deviceRelayUrl,"device"),Y=await $Z($.port,$.signal),z;try{z=new x9(J,{followRedirects:!1,perMessageDeflate:!1,maxPayload:v.upload*1.4+300000})}catch(N){throw Y.close(),N}let F=new Map,G=!1,V=!1,B=0,H=!1,K,L,W,U=new Promise((N)=>{W=N}),j,O,C=new Promise((N,M)=>{j=N,O=M}),A=!1,R=(N)=>{let M=Buffer.isBuffer(N)?N:JSON.stringify(N);if(B+=Buffer.byteLength(M),!Q()||V||z.readyState!==x9.OPEN)return P(Q()?"relay_closed":"expired");if(z.bufferedAmount>v.relayBuffered)return P("relay_backlog");if(B>v.total)return P("quota");z.send(M)};function P(N="closed"){if(V)return;V=!0,clearInterval(m),clearTimeout(S),$.signal.removeEventListener("abort",T);for(let M of F.values())M.stop();F.clear(),Y.close(),z.close(1000,`worker_${N}`),O(Error("preview_closed")),W()}let T=()=>P("aborted"),S=setTimeout(()=>P("pair_timeout"),v.requestMs),m=setInterval(async()=>{if(!Q())return P($.signal.aborted?"aborted":"expired");if(H)return;H=!0;try{let N=K??=Promise.resolve().then(()=>$.port.check()).finally(()=>{K=void 0}),M=await k8(()=>N);if(M===!1)return P("port_refused");if(M){L=void 0;return}if(Date.now()-(L??=Date.now())>o4)return P("port_unknown");for(let D of F.values())D.stop()}finally{H=!1}},1000);if($.signal.addEventListener("abort",T,{once:!0}),!Q())P($.signal.aborted?"aborted":"expired");z.addEventListener("open",()=>R({type:"hello",binding:Z,messages:v.upload,window:v.window})),z.addEventListener("close",()=>P("relay_closed")),z.addEventListener("error",()=>P("relay_error")),z.addEventListener("message",(N)=>{try{if(!Q()||V)return P($.signal.aborted?"aborted":"expired");if(typeof N.data!=="string")throw Error("preview_frame_invalid");if(B+=Buffer.byteLength(N.data),B>v.total)return P("quota");let M=o$(N.data);if(!G){if(M.type!=="hello"||!d0(Z,M.binding))return P("binding_mismatch");G=!0,A=M.bytes===!0,clearTimeout(S),j();return}if(M.type==="hello"||M.type==="refused")return P("invalid_frame");if(M.type==="request"){E(M).catch(()=>P("invalid_request"));return}let D=F.get(M.id);if(!D)return;if(M.type==="cancel"||M.type==="end")D.stop();else if(M.type==="credit"&&D.credit)D.credit();else if(M.type==="data"&&D.ws){if(D.ws.readyState!==x9.OPEN||D.ws.bufferedAmount>v.buffered)return D.stop();let w=D9(M.data,v.upload);D.ws.send(M.binary?w:w.toString("utf8"))}else P("invalid_frame")}catch{P("invalid_frame")}});async function E(N){if(F.has(N.id)||F.size>=v.streams)return P("stream_limit");if(!Q())return P($.signal.aborted?"aborted":"expired");let M=new AbortController,D,w,k,f=0,_=(b=!1)=>{if(!F.delete(N.id))return;clearTimeout(D),M.abort(),w?.close(1000,"preview_closed"),k?.(),R({type:b?"end":"cancel",id:N.id})},y={stop:()=>_(),credit:()=>{f++,k?.()}};if(F.set(N.id,y),D=setTimeout(_,v.requestMs),!await A9(()=>$.port.check())||!Q()||M.signal.aborted)return _();let c=_9(N.path);if(N.upgrade){if(N.method!=="GET"||N.body)return _();let b=N.headers.find(([h])=>h.toLowerCase()==="sec-websocket-protocol")?.[1].split(",").map((h)=>h.trim());if(b?.some((h)=>!/^[a-zA-Z0-9._-]{1,100}$/.test(h))||(b?.length??0)>8)return _();w=new x9(`ws://127.0.0.1:${Y.port}${c}`,b,{headers:Y.headers,followRedirects:!1,perMessageDeflate:!1,maxPayload:v.upload}),y.ws=w,w.binaryType="arraybuffer",w.addEventListener("open",()=>{clearTimeout(D),R({type:"ws",id:N.id,protocol:w.protocol})}),w.addEventListener("message",(h)=>{let d=typeof h.data!=="string",n=a$(h.data);if(n.length>v.upload)return _();R({type:"data",id:N.id,data:n.toString("base64"),binary:d})}),w.addEventListener("error",()=>_()),w.addEventListener("close",(h)=>_(h.wasClean));return}let u=D9(N.body,v.upload),r=s4({hostname:"127.0.0.1",port:Y.port,path:c,method:N.method,headers:{...Object.fromEntries(b8(N.headers)),...Y.headers,connection:"close"},signal:M.signal,agent:!1,maxHeaderSize:16384},async(b)=>{try{let h=[];for(let M0=0;M0<b.rawHeaders.length;M0+=2)h.push([b.rawHeaders[M0],b.rawHeaders[M0+1]]);let d=b.statusCode??502,n=$3(N.method,N.headers,d,h),G0=n==="br"?i4({flush:f8.BROTLI_OPERATION_FLUSH,params:{[f8.BROTLI_PARAM_QUALITY]:5}}):n==="gzip"?a4({level:6,flush:f8.Z_SYNC_FLUSH}):void 0;if(R({type:"head",id:N.id,status:d,headers:b8(n?Z3(h,n):h)}),clearTimeout(D),G0)n4(b,G0,()=>{});for await(let M0 of G0??b){let U0=Buffer.from(M0);for(let W0=0;W0<U0.length;W0+=v.chunk){if(f===0&&!M.signal.aborted)await new Promise((T0)=>{k=T0});if(k=void 0,M.signal.aborted)return;f--;let g0=U0.subarray(W0,W0+v.chunk);R(A?i$(N.id,g0):{type:"data",id:N.id,data:g0.toString("base64"),binary:!0})}}_(!0)}catch{_()}});r.on("error",()=>_()),r.end(u)}return await C,{close:P,closed:U}}import{execFile as J3}from"child_process";import{readFile as Y3,readdir as G3,readlink as z3}from"fs/promises";import{connect as K3}from"net";import{setTimeout as F3}from"timers/promises";var V3={directory:G3,text:($)=>Y3($,"utf8"),link:z3};class m8 extends Error{code;constructor($="port_unproved"){super("preview_port_ownership_unproved");this.code=$}}var $0=($)=>new m8($),n9="preview_listener_unproved",QZ="00000000000000000000000001000000";async function H3($,Z,Q=V3){let X=new Map;for(let z of["tcp","tcp6"]){let F=await Q.text(`/proc/net/${z}`);if(F.length>4194304)throw $0();for(let G of F.split(`
|
|
8
|
+
`).slice(1)){let V=G.trim().split(/\s+/);if(V.length<10||!["0A","01"].includes(V[3]))continue;let[B,H]=V[1].split(":"),[K,L]=V[2].split(":");if(Number.parseInt(H,16)!==Z)continue;let W=(O)=>O==="0100007F"||O==="0000000000000000FFFF00000100007F"||O===QZ,U=V[3]==="0A";if(!(W(B)||U&&/^0+$/.test(B??"")))continue;if(!U&&!W(K))continue;let j=V[9];if(!/^[1-9][0-9]*$/.test(j))continue;X.set(j,{kernelId:j,port:Z,peerPort:U?null:Number.parseInt(L,16),state:U?"listen":"established",host:B===QZ?"::1":"127.0.0.1"})}}let J=await Q.directory("/proc");if(J.length>8192)throw $0();let Y=[];for(let z of J){if(!/^[1-9][0-9]*$/.test(z))continue;try{let F=await Q.text(`/proc/${z}/stat`),G=F.slice(F.lastIndexOf(")")+2).trim().split(/\s+/);if(Number(G[2])!==$)continue;let V=await Q.directory(`/proc/${z}/fd`);if(V.length>1024)throw $0();let B=[];for(let L of V){if(!/^[0-9]+$/.test(L))continue;let W=await Q.link(`/proc/${z}/fd/${L}`).catch(()=>""),U=/^socket:\[([0-9]+)\]$/.exec(W)?.[1],j=U?X.get(U):void 0;if(j)B.push({...j,pid:Number(z),processGroupId:$,descriptor:L})}let H=await Q.text(`/proc/${z}/stat`),K=H.slice(H.lastIndexOf(")")+2).trim().split(/\s+/);if(G[19]===K[19]&&G[2]===K[2])Y.push(...B)}catch(F){if(F instanceof Error&&F.message==="preview_port_ownership_unproved")throw F}}return Y}function U3($,Z,Q){if($.length>2097152)throw $0();let X=0,J=0,Y="",z="",F="",G="",V=[],B=()=>{if(X<1||J!==Z||!/^\d+$/.test(Y)||!/^0x[0-9a-f]+$/i.test(z))return;let H=G==="LISTEN"&&["*","127.0.0.1","[::ffff:127.0.0.1]","[::1]"].some((L)=>F===`${L}:${Q}`),K=new RegExp(`^(?:127\\.0\\.0\\.1|\\[::ffff:127\\.0\\.0\\.1\\]|\\[::1\\]):${Q}->(?:127\\.0\\.0\\.1|\\[::ffff:127\\.0\\.0\\.1\\]|\\[::1\\]):([0-9]+)$`).exec(F);if(H||G==="ESTABLISHED"&&K)V.push({pid:X,processGroupId:J,descriptor:Y,kernelId:z,state:H?"listen":"established",port:Q,peerPort:H?null:Number(K[1]),host:F.startsWith("[::1]:")?"::1":"127.0.0.1"})};for(let H of $.split(/[\0\n]/)){let K=H.slice(1);if(H[0]==="p")B(),X=Number(K),J=0,Y=z=F=G="";else if(H[0]==="g")J=Number(K);else if(H[0]==="f")B(),Y=K,z=F=G="";else if(H[0]==="d")z=K;else if(H[0]==="n")F=K;else if(H.startsWith("TST="))G=H.slice(4)}return B(),V}async function W3($,Z){if(process.platform==="linux")return H3($,Z);if(process.platform==="win32")return l$($,Z);if(process.platform!=="darwin")throw $0();let Q=await new Promise((X,J)=>J3("/usr/sbin/lsof",["-nP","-a","-g",String($),`-iTCP:${Z}`,"-F0pgfdnT"],{timeout:1000,maxBuffer:2097152,encoding:"utf8",env:{PATH:"/usr/bin:/bin",LC_ALL:"C"}},(Y,z)=>Y?J($0()):X(z)));return U3(Q,$,Z)}function XZ($,Z={}){let Q=R0($.binding),X=Z.inspectSockets??W3,J=Z.monotonicNow??(()=>performance.now());async function Y(){let K=()=>{if(Date.now()>=Q.expiresAtMs)throw $0("binding_expired");if($.deniedPorts.has(Q.port))throw $0("port_denied")};K();let L=await $.readCurrentJob(),W=L?.job,U=W?.process;if(K(),!L)throw $0("server_stopped");if(!d0(Q,L.binding)||W?.jobId!==Q.jobId)throw $0("binding_changed");if(W.state!=="running"||W.finishedAtMs!==null||W.leaseExpiresAtMs<Q.expiresAtMs)throw $0("job_not_running");if(!U||U.pid<1||U.pid!==U.processGroupId||U.executorLaunchId!==L.executorLaunchId)throw $0("process_unproved");return{pid:U.pid,launch:U.executorLaunchId,started:W.startedAtMs}}let z,F;async function G(){let K=await Y(),L=await X(K.pid,Q.port).catch(()=>{throw Error(n9)}),W=await Y();if(K.pid!==W.pid||K.launch!==W.launch||K.started!==W.started)throw $0("job_restarted");return L}async function V(K){for(;;){if(F&&F.startedAt>=K)return F.sockets;if(z&&z.startedAt>=K)return await z.sockets;if(z){await z.sockets.catch(()=>{});continue}let L={startedAt:J(),sockets:G()};z=L;try{let W=await L.sockets;if(!F||F.startedAt<=L.startedAt)F={startedAt:L.startedAt,sockets:W};return W}finally{if(z===L)z=void 0}}}async function B(K=()=>{},L=J()){K();let W=await V(L);if(K(),Date.now()>=Q.expiresAtMs)throw $0("binding_expired");if(!W.some((U)=>U.state==="listen"))throw Error(n9);return W}async function H(){try{return await B(()=>{},J()-1000),null}catch(K){if(K instanceof Error&&K.message===n9)return"listener_unproved";return K instanceof m8?K.code:"port_unproved"}}return{refusal:H,async check(){let K=await H();if(K==="listener_unproved")throw Error(n9);return K===null},async connect(K){if(K.aborted)throw $0();let L=J()+2000,W=new AbortController,U=new Promise((P)=>W.signal.addEventListener("abort",()=>P(null),{once:!0})),j,O=()=>{W.abort(),j?.destroy()},C=setTimeout(O,2000);K.addEventListener("abort",O,{once:!0});let A=()=>{if(W.signal.aborted||K.aborted||J()>=L||j?.destroyed)throw O(),$0()};async function R(P){A();let T=await Promise.race([P().then((S)=>({value:S})),U]);if(A(),!T)throw $0();return T.value}try{let P=await R(()=>B(A,J()-1000));A();let T=P.some((N)=>N.state==="listen"&&N.host==="127.0.0.1")?"127.0.0.1":"::1",S=K3({host:T,port:Q.port,signal:K});j=S,S.once("close",O),await R(()=>new Promise((N,M)=>{S.once("connect",N),S.once("error",M)}));let m=S.localPort;if(!m)throw $0();let E=J();while(!(await R(()=>B(A,E))).some((N)=>N.state==="established"&&N.peerPort===m))await R(()=>F3(Math.min(20,Math.max(1,L-J())),void 0,{signal:W.signal})),E=J();return A(),S}catch(P){throw O(),P}finally{clearTimeout(C),K.removeEventListener("abort",O),j?.off("close",O),W.abort()}}}}var B3=4,L3=[2375,2376,9222,9229];function JZ($){let Z=new Set(L3);for(let Q of $){let X=new URL(Q);Z.add(Number(X.port||(["https:","wss:"].includes(X.protocol)?443:80)))}return Z}function E0(){throw new q("preview_unavailable","The live Hands preview binding is unavailable or stale.")}var N3=60000;function YZ($){let Z=new AbortController,Q=new Map,X=(G)=>JSON.stringify([G.jobId,G.port]);function J(G){let V=$.authority.owner;if(Z.signal.aborted||!$.isCurrent()||$.expiresAtMs<=Date.now()||G.organization_id!==V.organization_id||G.user_id!==V.user_id||G.device_id!==V.device_id)E0()}function Y(G){let V;try{V=$.environment.current()}catch{return null}return V.binding.target_generation===G.generation&&V.binding.target_fence_id===G.fenceId&&V.run_id===$.runId&&V.device_id===$.authority.owner.device_id&&V.root_id===$.authority.rootId?V:null}async function z(G,V,B){let H=await F(G,V,B);if(H!=="moved")return H;let K=await F(G,V,B);return K==="moved"?null:K}async function F(G,V,B){try{J($.authority.owner);let H=$.identity();if(!H||B.aborted||G.expiresAtMs<=Date.now()||G.expiresAtMs>$.expiresAtMs)return null;let K=V.opened,L=K!==void 0&&H.generation>K.generation,W=Y(H);if(L){if(W){if(W.revision<=K.revision||G.expiresAtMs>Date.parse(W.expires_at)||W.binding.target_revision!==K.attachmentRevision||W.binding.root_grant_revision!==K.grantRevision)return null;V.recoveringSinceMs=void 0}else if(Date.now()-(V.recoveringSinceMs??=Date.now())>N3)return null}else if(!W||G.expiresAtMs>Date.parse(W.expires_at)||K&&(H.generation!==K.generation||H.fenceId!==K.fenceId))return null;let U=await $.inspect(G.jobId,B),j=$.identity(),O=j&&Y(j);J($.authority.owner);let C=W&&{generation:H.generation,fenceId:H.fenceId,snapshotId:W.snapshot_id,revision:W.revision,attachmentRevision:W.binding.target_revision,grantRevision:W.binding.root_grant_revision},A=L?K:C;if(B.aborted||!j)return null;if(j.generation!==H.generation||j.fenceId!==H.fenceId||O?.snapshot_id!==W?.snapshot_id||O?.revision!==W?.revision)return"moved";let R=U.ok&&U.job.environmentSnapshotId!==void 0&&U.job.environmentRevision!==void 0?{snapshotId:U.job.environmentSnapshotId,revision:U.job.environmentRevision}:null;if(!U.ok||U.generation!==H.generation||!A||!R)return null;if((R.snapshotId!==A.snapshotId||R.revision!==A.revision)&&(L||!$.environment.carried(R.snapshotId,R.revision)))return null;if(!K&&H.generation===G.generation&&H.fenceId===G.fenceId)V.opened={...A,...R};return{executorLaunchId:$.executorLaunchId,job:U.job,binding:{organizationId:$.authority.owner.organization_id,userId:$.authority.owner.user_id,deviceId:$.authority.owner.device_id,rootId:$.authority.rootId,runId:$.runId,attachmentRevision:A.attachmentRevision,grantRevision:A.grantRevision,generation:A.generation,fenceId:A.fenceId,jobId:U.job.jobId,port:G.port,expiresAtMs:G.expiresAtMs}}}catch{return null}}return{async open(G,V,B){J(V);let{binding:H,deviceRelayUrl:K}=r$(G);if(B.aborted||H.expiresAtMs<=Date.now()||H.expiresAtMs>Date.now()+v.lifetimeMs||new URL(K).origin!==$.authority.relayOrigin)E0();let L=X(H),W=Q.get(L);if(W){if(!d0(W.binding,H)||W.relay!==K)E0();if(await W.opened,!await A9(()=>W.port.check())||B.aborted||W.abort.signal.aborted)E0();return{opened:!0,binding:H}}if(Q.size>=B3)E0();let U=new AbortController,j={},O=XZ({binding:H,deniedPorts:$.authority.deniedPorts,readCurrentJob:()=>z(H,j,U.signal)}),C=()=>U.abort();if(B.addEventListener("abort",C,{once:!0}),Z.signal.addEventListener("abort",C,{once:!0}),B.aborted||Z.signal.aborted)C();let A=ZZ({binding:H,deviceRelayUrl:K,port:O,signal:U.signal}),R={binding:H,relay:K,abort:U,port:O,opened:A};Q.set(L,R);let P=()=>{if(B.removeEventListener("abort",C),Z.signal.removeEventListener("abort",C),Q.get(L)===R)Q.delete(L)};try{if((await A).closed.then(P),B.removeEventListener("abort",C),J(V),U.signal.aborted||!await A9(()=>O.check()))E0();return{opened:!0,binding:H}}catch{U.abort(),P(),E0()}},async close(G,V){J(V);let{binding:B}=t$(G),H=Q.get(X(B));if(!H||!d0(H.binding,B))E0();return H.abort.abort(),await H.opened.then((K)=>K.closed,()=>{return}),{closed:!0,binding:B}},dispose(){Z.abort();for(let G of Q.values())G.abort.abort();Q.clear()}}}import{WebSocket as y8}from"ws";var GZ=($)=>("data"in $)?$.data.length:$.bytes,zZ=2*FZ;function i($){throw new q($,"The bound Hands terminal is unavailable or its outcome is unconfirmed.")}var Z9=($)=>!["starting","running"].includes($.state);function $X($,Z,Q=Date.now()){let X=["relay_url","session_id","expires_at","cols","rows","pty","workspace"];if(Object.keys($).length!==X.length||Object.keys($).some((V)=>!X.includes(V))||!g8(Z)||!g8($.session_id)||typeof $.expires_at!=="string"||typeof $.relay_url!=="string"||$.relay_url.length>4096||![$.cols,$.rows].every((V)=>Number.isSafeInteger(V)&&Number(V)>=1&&Number(V)<=h8))i("invalid_pty_request");let J=$.pty;if(!J||typeof J!=="object"||Array.isArray(J))i("invalid_pty_request");let Y=J;if(Object.keys(Y).length!==2||Y.version!==1||!o9(Y.jobId))i("invalid_pty_request");let z;try{z=new URL($.relay_url)}catch{return i("invalid_pty_request")}if(!["ws:","wss:"].includes(z.protocol)||z.username||z.password||z.hash||z.protocol==="ws:"&&!["127.0.0.1","[::1]","localhost"].includes(z.hostname))i("invalid_pty_request");let F=Date.parse($.expires_at);if(!Number.isSafeInteger(F)||F<=Q)i("invalid_pty_request");return{workspace:KZ($.workspace)??i("invalid_pty_request"),session:{jobId:Y.jobId,sessionId:$.session_id,operationId:Z,relayUrl:z.href,cols:Number($.cols),rows:Number($.rows),leaseExpiresAtMs:Math.min(F,Q+43200000)}}}async function UZ($){let{session:Z,binding:Q}=$;if(Q.assertCurrent(),$.signal.aborted||Date.now()>=Z.leaseExpiresAtMs)i("cancelled");let X=new y8(Z.relayUrl,{followRedirects:!1,perMessageDeflate:!1,maxPayload:i9}),J=new AbortController,Y=()=>{},z=()=>{J.abort(),Y()};$.signal.addEventListener("abort",z,{once:!0});let F=setTimeout(z,Math.max(1,Z.leaseExpiresAtMs-Date.now())),G=[],V=0,B=0,H=0,K=!1,L=!1,W=!1,U,j,O,C=(N)=>{O=new q(N,"Bound terminal input was refused."),z()};X.on("error",()=>C("pty_relay_unavailable")),X.on("close",z),X.on("message",(N,M)=>{if(J.signal.aborted)return;if(!L){C("pty_not_ready");return}let D=Array.isArray(N)?Buffer.concat(N):N instanceof ArrayBuffer?Buffer.from(N):N;if(D.length===0)return;let w=G.at(-1),k=M&&w!==void 0&&"data"in w&&w.data.length+D.length<=i9;if(D.length>i9||V+D.length>VZ){C("pty_input_backpressure");return}if(k)w.data=Buffer.concat([w.data,D]);else if(M)G.push({data:Buffer.from(D)});else try{let f=JSON.parse(D.toString("utf8"));if(f&&f.t==="close"&&Object.keys(f).length===1){W=!0,z();return}if(!f||f.t!=="resize"||Object.keys(f).length!==3||![f.cols,f.rows].every((_)=>Number.isSafeInteger(_)&&_>=1&&_<=h8))throw Error("invalid_control");G.push({cols:f.cols,rows:f.rows,bytes:D.length})}catch{C("invalid_pty_control");return}V+=D.length,Y()});function A(N){return HZ(JSON.stringify({...Q.scope,version:1,sessionId:Z.sessionId,operationId:Z.operationId,job:{...N,output:[],pty:N.pty?{...N.pty,output:[]}:void 0}}))}function R(N){if(!N.ok)i(N.error);let M=N.job;if(N.generation!==Q.scope.generation||M.jobId!==Z.jobId||!M.pty||M.leaseExpiresAtMs>Z.leaseExpiresAtMs||M.process&&M.process.executorLaunchId!==Q.scope.executorLaunchId||M.process&&j&&(M.process.pid!==j.pid||M.process.processGroupId!==j.processGroupId)||M.state!=="starting"&&(M.environmentRevision!==Q.environment.revision||M.environmentSnapshotId!==Q.environment.snapshotId))i("pty_binding_changed");if(A(M),M.process)j??={...M.process};return M}async function P(N){Q.assertCurrent();let M=await Q.request(N,J.signal);if(Q.assertCurrent(),J.signal.aborted)i("cancelled");let D=R(M);if(D.inputSequence!==B)i("job_input_sequence");if(!Z9(D)&&D.leaseExpiresAtMs<=Date.now())i("pty_binding_changed");return D}function T(N){if(Q.assertCurrent(),J.signal.aborted||X.readyState!==y8.OPEN||X.bufferedAmount+Buffer.byteLength(N)>zZ)i("pty_output_backpressure");X.send(N)}function S(N){if(N.firstCursor>H+1)H=N.firstCursor-1;for(let M of N.pty.output){if(M.cursor<=H)continue;if(M.cursor!==H+1)i("pty_output_gap");let D=Buffer.from(M.dataBase64,"base64");if(X.bufferedAmount+D.length>zZ)return!1;T(D),H=M.cursor}if(H!==N.nextCursor)i("pty_output_gap");return!0}async function m(N,M){let D;try{await Promise.race([$.emit(N,M),new Promise((w,k)=>{D=setTimeout(()=>k(new q("pty_event_unavailable","Terminal metadata delivery timed out.")),2000)})])}finally{clearTimeout(D)}}async function E(){let N=AbortSignal.timeout(a9),M=Q.request({jobId:Z.jobId,action:"cancel",input:{}},N),D,w=new Promise((k,f)=>{if(D=()=>f(new q("pty_cleanup_unconfirmed","Terminal cleanup acknowledgement was not observed within authority.")),N.addEventListener("abort",D,{once:!0}),N.aborted)D()});try{let k=await Promise.race([M,w]);if(N.aborted)i("pty_cleanup_unconfirmed");return R(k)}finally{N.removeEventListener("abort",D)}}try{await new Promise((k,f)=>{let _=setTimeout(()=>{z(),f(new q("pty_relay_unavailable","Terminal pairing timed out."))},5000),y=()=>{clearTimeout(_),f(new q("cancelled","Terminal pairing was cancelled."))};if(J.signal.addEventListener("abort",y,{once:!0}),X.once("open",()=>{clearTimeout(_),J.signal.removeEventListener("abort",y),k()}),J.signal.aborted)y()}),Q.assertCurrent(),K=!0,U=await P({jobId:Z.jobId,action:"start",input:{mode:"pty",cols:Z.cols,rows:Z.rows,leaseExpiresAtMs:Z.leaseExpiresAtMs}});let N=Date.now()+5000;while(U.state==="starting"){if(Date.now()>=N)i("pty_not_ready");await new Promise((k)=>setTimeout(k,25)),U=await P({jobId:Z.jobId,action:"inspect",input:{after:H}})}if(U.state!=="running"||U.inputSequence!==0||U.leaseExpiresAtMs<=Date.now())i("pty_not_ready");await m("pty.ready",A(U)),L=!0,T(JSON.stringify({t:"open",cols:U.pty.cols,rows:U.pty.rows,receipt:A(U)}));let M=!1,D=0,w=!1;while(!J.signal.aborted){let k=U.firstCursor>H+1,f=S(U);if(Z9(U)){if(f)break}else if(k)M=!0;else if(M&&f&&Date.now()>=D){M=!1,D=Date.now()+1000;let{cols:y,rows:c}=U.pty;for(let u of[{cols:y,rows:c>1?c-1:2},{cols:y,rows:c}]){if(Z9(U))break;let r=++B;if(U=await P({jobId:Z.jobId,action:"resize",input:{sequence:r,...u}}),U.inputSequence!==r)i("job_input_sequence")}continue}let _=Z9(U)||w?void 0:G.shift();if(_){V-=GZ(_);let y=++B;try{U=await P("data"in _?{jobId:Z.jobId,action:"input",input:{sequence:y,dataBase64:_.data.toString("base64")}}:{jobId:Z.jobId,action:"resize",input:{sequence:y,cols:_.cols,rows:_.rows}})}catch(c){if(!(c instanceof q)||c.code!=="job_input_backpressure")throw c;B-=1,G.unshift(_),V+=GZ(_),w=!0;continue}if(U.inputSequence!==y)i("job_input_sequence")}else if(await new Promise((y)=>{let c=setTimeout(y,w||!f?10:50);if(Y=()=>{clearTimeout(c),y()},J.signal.aborted||!w&&G.length)Y()}),w=!1,Y=()=>{},!J.signal.aborted&&f)try{U=await P({jobId:Z.jobId,action:"inspect",input:{after:H}})}catch(y){if(!W||!(y instanceof q)||y.code!=="cancelled")throw y}}}catch(N){O??=N}finally{if(L=!1,G.length=0,clearTimeout(F),$.signal.removeEventListener("abort",z),z(),K&&(!U||!Z9(U)))try{U=await E()}catch{U=void 0}try{if(!U||!Z9(U)||U.pty?.cleanup!=="confirmed")i("pty_cleanup_unconfirmed");let N=A(U);if(X.readyState===y8.OPEN)await new Promise((M)=>{let D=setTimeout(M,500);X.send(JSON.stringify({t:"exit",code:U.exitCode,receipt:N}),()=>{clearTimeout(D),M()})});await m("pty.stopped",N)}catch(N){O??=N}X.terminate()}if(O)throw O;if($.signal.aborted)i("cancelled");if(!U)i("pty_cleanup_unconfirmed");return{receipt:A(U)}}import{createHash as M3,randomUUID as p8}from"crypto";import{spawnSync as _Z}from"child_process";import{closeSync as WZ,constants as v8,fstatSync as j3,fsyncSync as q3,lstatSync as I9,mkdirSync as C3,mkdtempSync as AZ,openSync as BZ,readFileSync as T3,readdirSync as xZ,realpathSync as P9,rmSync as c8,unlinkSync as O3}from"fs";import{createConnection as D3}from"net";import{dirname as _3,join as p0,sep as A3}from"path";import{tmpdir as x3}from"os";var Z0=new Map,S0=new Map;function D0($,Z){return M3("sha256").update(JSON.stringify([$,Z])).digest("hex")}function Q9($){try{C3($,{mode:448})}catch(Q){if(!(Q instanceof Error&&("code"in Q)&&Q.code==="EEXIST"))throw Q}let Z=I9($);if(!Z.isDirectory()||Z.isSymbolicLink()||!J9(Z)||P9($)!==$)throw new q("hands_jobs_unavailable","Hands job state must be a private canonical directory.")}function P3($){let Z;try{Z=I9($)}catch(Q){if(Q instanceof Error&&"code"in Q&&Q.code==="ENOENT")return!1;throw Q}return!Z.isDirectory()||Z.isSymbolicLink()||xZ($).length>0}function PZ($){let Z=D0($.root,$.runId),Q=$.previousRuntimeDirectories?.find((z)=>P3(p0(z,"jobs",Z.slice(0,16))))??$.runtimeDirectory;Q9(Q);let X=p0(Q,"jobs");Q9(X);let J=p0(X,Z.slice(0,16));if($.maxScopes!==void 0){let z=xZ(X);if(!Number.isSafeInteger($.maxScopes)||$.maxScopes<1||z.length>$.maxScopes||!z.includes(Z.slice(0,16))&&z.length>=$.maxScopes)throw new q("process_journal_capacity","Managed process receipt capacity is full; preserve uncertain jobs and reconcile their existing receipts before starting more work.")}Q9(J);let Y=AZ(p0(OZ(),"reason-j-"));try{return Q9(Y),{journalDirectory:J,scopeId:Z,launchDirectory:Y,socketPath:process.platform==="win32"?`\\\\.\\pipe\\reason-jobs-${p8()}`:p0(Y,"control.sock"),disposeSocket:()=>c8(Y,{recursive:!0,force:!0})}}catch(z){throw c8(Y,{recursive:!0,force:!0}),z}}var I3=60000,R3=5000;function E3($){if(process.platform==="win32")return S3($);let Z=_Z("ps",["-o","lstart=","-p",String($)],{encoding:"utf8",timeout:2000,env:{...process.env,LC_ALL:"C",LANG:"C"}}),Q=Z.status===0?/^\w{3} (\w{3}) +(\d{1,2}) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/.exec(Z.stdout.trim()):null,X=Q?"JanFebMarAprMayJunJulAugSepOctNovDec".indexOf(Q[1]):-1;if(!Q||X<0||X%3!==0)return null;let J=new Date(Number(Q[6]),X/3,Number(Q[2]),Number(Q[3]),Number(Q[4]),Number(Q[5])).getTime();return Number.isFinite(J)?J:null}function S3($){let Z=_Z(DZ("powershell"),["-NoProfile","-NonInteractive","-Command",`(Get-Process -Id ${$}).StartTime.ToUniversalTime().ToString('o')`],{encoding:"utf8",timeout:5000,windowsHide:!0,env:d9()}),Q=Z.status===0?Date.parse(Z.stdout.trim()):Number.NaN;return Number.isFinite(Q)?Q:null}function IZ($,Z={}){let Q=p0($.journalDirectory,"owner.lock"),X;try{X=BZ(Q,v8.O_RDONLY|v8.O_NOFOLLOW)}catch{return null}try{let J=j3(X);if(!J.isFile()||J.nlink!==1||!J9(J)||J.size>4096)return null;let Y=null;try{Y=JSON.parse(T3(X,"utf8"))}catch{}let z;if(Y===null){if((Z.now??Date.now)()-J.mtimeMs<I3)return null;z={reason:"never_written",executorLaunchId:null}}else{let{version:V,scopeId:B,pid:H,createdAtMs:K,executorLaunchId:L}=Y;if(V!==1||B!==$.scopeId||typeof L!=="string"||typeof H!=="number"||!Number.isSafeInteger(H)||H<1||H===process.pid||typeof K!=="number"||!Number.isSafeInteger(K))return null;if(!(Z.exists??((U)=>{try{return process.kill(U,0),!0}catch(j){return!(j instanceof Error&&("code"in j)&&j.code==="ESRCH")}}))(H))z={reason:"owner_exited",executorLaunchId:L};else{let U=(Z.startedAtMs??E3)(H);if(U===null||U<=K+R3)return null;z={reason:"pid_reused",executorLaunchId:L}}}let F=I9(Q);if(F.dev!==J.dev||F.ino!==J.ino)return null;O3(Q);let G=BZ($.journalDirectory,v8.O_RDONLY);try{q3(G)}finally{WZ(G)}return z}catch{return null}finally{WZ(X)}}function RZ($){let Z={...$,workspace:$.workspace&&Object.freeze({...$.workspace}),previewAuthority:$.previewAuthority&&Object.freeze({...$.previewAuthority,owner:Object.freeze({...$.previewAuthority.owner}),deniedPorts:new Set($.previewAuthority.deniedPorts)})},Q=D0(Z.root,Z.runId);if(Z0.has(Q)||Z.operationId!==void 0&&S0.has(Z.operationId))throw new q("hands_jobs_busy","The Session already has a live Hands job supervisor.");let X={binding:Z,key:Q,terminals:new Map};if(Z.previewAuthority&&Z.environment)X.previews=YZ({authority:Z.previewAuthority,runId:Z.runId,expiresAtMs:Z.expiresAtMs,executorLaunchId:Z.executorLaunchId,environment:Z.environment,isCurrent:()=>Z0.get(X.key)===X,identity:()=>{try{return X9(Z)}catch{return null}},inspect:(J,Y)=>{if(Z0.get(X.key)!==X)throw new q("preview_unavailable","The Hands supervisor is no longer current.");return EZ(Z,{jobId:J,action:"inspect",input:{after:0}},Y)}});if(Z0.set(Q,X),Z.operationId!==void 0)S0.set(Z.operationId,X);return()=>{if(Z0.get(X.key)===X)Z0.delete(X.key);if(Z.operationId!==void 0&&S0.get(Z.operationId)===X)S0.delete(Z.operationId);X.previews?.dispose();for(let J of X.terminals.values())J.abort()}}var w3=5000,b3=20;async function NX($){let Z=(J)=>{throw new q("hands_rebind_unavailable",J)};if(!O0($.operationId)||!O0($.runId)||!O0($.fenceId)||!w0($.targetGeneration))Z("Reason sent an invalid Hands rebind.");let Q=S0.get($.operationId);if(!Q||Q.binding.root!==$.root)return Z("No live Hands supervisor owns this operation.");for(let J=Date.now()+w3;;){if($.signal?.aborted)Z("The Hands rebind was cancelled.");if(S0.get($.operationId)!==Q)Z("The Hands supervisor is no longer current.");let Y=null;try{Y=X9(Q.binding)}catch{}if(Y&&Y.generation===$.targetGeneration&&Y.fenceId===$.fenceId)break;if(Y&&Y.generation>$.targetGeneration||Date.now()>=J)Z("The executor did not adopt this take.");await new Promise((z)=>setTimeout(z,b3))}if(S0.get($.operationId)!==Q||Z0.get(Q.key)!==Q)Z("The Hands supervisor is no longer current.");let X=D0($.root,$.runId);if(Q.key===X)return;if(Z0.has(X))Z("The taking run already has a live Hands job supervisor.");Z0.delete(Q.key);for(let J of Q.terminals.values())J.abort();Q.key=X,Z0.set(X,Q)}function MX($){let Z="operationId"in $?S0.get($.operationId):Z0.get(D0($.root,$.runId)),Q=Z&&Z.binding.root===$.root?Z.binding:void 0;if(!Q?.environment||Q.expiresAtMs<=Date.now())throw new q("environment_unavailable","No live Hands supervisor owns this environment.");return Q.environment.install($.payload)}async function jX($){let Z=Z0.get(D0($.root,$.runId));if(!Z?.previews||!$.owner)throw new q("preview_unavailable","No authenticated Hands supervisor owns this preview.");return Z.previews.open($.payload,$.owner,$.signal)}async function qX($){let Z=Z0.get(D0($.root,$.runId));if(!Z?.previews||!$.owner||$.signal.aborted)throw new q("preview_unavailable","No authenticated Hands supervisor owns this preview.");return Z.previews.close($.payload,$.owner)}async function CX($){let Z=D0($.root,$.runId),Q=Z0.get(Z),X=Q?.binding,J=X?.runId,Y=X?.previewAuthority,z=X?.environment,F=$.owner&&{...$.owner},G=$.authority&&{...$.authority},V=()=>{throw new q("pty_binding_unavailable","No current authenticated Hands scope owns this terminal.")};if(!Q||!X||!Y||!z||!F||!G||!X.workspace)return V();let B=Object.freeze({...X.workspace}),H=X9(X),K=z.current(),L=()=>{if(Z0.get(Z)!==Q||F.organization_id!==Y.owner.organization_id||F.user_id!==Y.owner.user_id||F.device_id!==Y.owner.device_id||$.deviceId!==Y.owner.device_id||$.rootId!==Y.rootId||u0($.workspace)!==u0(B))V();let U=X9(X),j=z.current();if(U.generation!==H.generation||U.fenceId!==H.fenceId||j.run_id!==J||j.device_id!==$.deviceId||j.root_id!==$.rootId||j.snapshot_id!==K.snapshot_id||j.revision!==K.revision||j.binding.target_generation!==H.generation||j.binding.target_fence_id!==H.fenceId||G.device_id!==$.deviceId||G.binding!==j.binding.kind||G.target_revision!==j.binding.target_revision||G.root_grant_revision!==j.binding.root_grant_revision||G.target_generation!==H.generation||G.target_fence_id!==H.fenceId)V()};if(L(),new URL($.session.relayUrl).origin!==Y.relayOrigin||Q.terminals.has($.session.jobId)||Q.terminals.size>=4)return V();let W=new AbortController;Q.terminals.set($.session.jobId,W);try{return await UZ({session:{...$.session,leaseExpiresAtMs:Math.min($.session.leaseExpiresAtMs,H.expiresAtMs,Date.parse(K.expires_at))},signal:AbortSignal.any([$.signal,W.signal]),emit:$.emit,binding:{assertCurrent:L,environment:{revision:K.revision,snapshotId:K.snapshot_id},scope:{runId:$.runId,deviceId:$.deviceId,rootId:$.rootId,workspace:B,binding:K.binding.kind,targetRevision:K.binding.target_revision,rootGrantRevision:K.binding.root_grant_revision,generation:H.generation,fenceId:H.fenceId,executorLaunchId:H.executorLaunchId},request:(U,j)=>SZ(H,d8(JSON.stringify({...U,type:"job",version:2,generation:H.generation,id:p8()})),j)}})}finally{if(Q.terminals.get($.session.jobId)===W)Q.terminals.delete($.session.jobId)}}async function TX($){if(o9($.payload.jobId))throw new q("pty_binding_required","PTY jobs require the bound terminal capability.");let Z=Z0.get(D0($.root,$.runId))?.binding;if(!Z||Z.expiresAtMs<=Date.now())throw new q("hands_jobs_unavailable","No live Hands supervisor owns this Session and root.");return EZ(Z,$.payload,$.signal)}var k3=1e4,f3=20,m3=qZ/2,y3=jZ/2,g3=($)=>$.output.reduce((Z,Q)=>Z+Q.text.length,0);async function EZ($,Z,Q){if(Object.keys(Z).some((V)=>!["jobId","action","input","waitForExitMs"].includes(V)))throw new q("invalid_payload","Unexpected job control field.");let{waitForExitMs:X,...J}=Z;if(X!==void 0&&(J.action!=="start"||typeof J.input!=="object"||J.input===null||!("script"in J.input)||typeof X!=="number"||!Number.isSafeInteger(X)||X<1||X>k3))throw new q("invalid_payload","Only a script start may wait for its job, within its bound.");let Y=(V)=>{let B=X9($);return SZ(B,d8(JSON.stringify({...V,type:"job",version:2,generation:B.generation,id:p8()})),Q)},z=await Y(J);if(X===void 0)return z;let F=Date.now()+X,G=z;while(G.ok&&["starting","running"].includes(G.job.state)&&G.job.output.length<m3&&g3(G.job)<y3&&!Q.aborted&&Date.now()<F){if(await new Promise((V)=>setTimeout(V,Math.min(f3,F-Date.now()))),Q.aborted)break;try{let V=await Y({jobId:J.jobId,action:"inspect",input:{after:0}});if(!V.ok)break;G=V}catch{break}}return G}function X9($){if($.expiresAtMs<=Date.now())throw new q("hands_jobs_unavailable","Hands authority expired.");let Z=$.readIdentity?$.readIdentity():$;if(!Z||!w0(Z.generation)||!O0(Z.fenceId)||Z.generation<$.generation||Z.generation===$.generation&&Z.fenceId!==$.fenceId)throw new q("hands_jobs_unavailable","The live Hands fencing identity could not be verified.");return $.generation=Z.generation,$.fenceId=Z.fenceId,{...$}}function SZ($,Z,Q){if(Q.aborted)return Promise.reject(new q("cancelled","Job control was cancelled."));return new Promise((X,J)=>{let Y=D3($.socketPath),z="",F=!1,G,V=(H,K)=>{if(F)return;if(F=!0,clearTimeout(G),Q.removeEventListener("abort",B),Y.destroy(),H)J(H);else X(K)},B=()=>V(new q("cancelled","Job control waiter cancelled; inspect before retrying mutations."));Q.addEventListener("abort",B,{once:!0}),Y.setEncoding("utf8"),G=setTimeout(()=>V(new q("hands_job_result_unknown","Job control timed out; inspect before retrying mutations.")),Math.min(1e4,Math.max(1,$.expiresAtMs-Date.now()))),Y.on("error",()=>V(new q("hands_job_result_unknown","Hands job control connection failed."))),Y.once("connect",()=>Y.write(JSON.stringify({version:1,scopeId:$.scopeId,fenceId:$.fenceId,executorLaunchId:$.executorLaunchId,request:Z})+`
|
|
9
|
+
`)),Y.on("data",(H)=>{if(z+=H,Buffer.byteLength(z)>CZ)V(new q("hands_job_result_unknown","Hands job result exceeded its bound."))}),Y.once("end",()=>{if(Date.now()>=$.expiresAtMs){V(new q("hands_job_result_unknown","Hands authority expired before the result was acknowledged."));return}try{let H=TZ(z.trim());if(H.id!==Z.id||H.generation!==$.generation||H.ok&&H.job.jobId!==Z.jobId)throw Error("identity");V(void 0,H)}catch{V(new q("hands_job_result_unknown","Hands job response identity or shape was invalid."))}}),Y.once("close",()=>{if(!F)V(new q("hands_job_result_unknown","Hands job control closed before an acknowledged result."))})})}function LZ($){let Z=P9($.root),Q=$.authority,X=Date.parse($.leaseUntil),J=()=>{if($.signal.throwIfAborted(),!Number.isFinite(X)||X<=Date.now())throw Error("local_device_gh_lease_expired")};if(J(),Q.readOnly&&Q.generation===null)return{root:Z,readOnly:!0,signal:$.signal,deadlineMs:X,assertCurrent:J};let Y=D0(Z,$.runId),z=Z0.get(Y),F=z?.binding;if(!F?.environment||!F.workspace||F.localGithubConfinement!==!0)throw Error("local_device_gh_confinement_unavailable");let G=F.environment.current(),V=()=>{J();let H=F.environment.current(),K=X9(F);if(Z0.get(Y)!==z||H.github_auth!=="local_gh"||H.run_id!==F.runId||Q.runId!==$.runId||H.device_id!==Q.deviceId||H.root_id!==Q.rootId||String(H.binding.root_grant_revision)!==Q.rootRevision||H.binding.target_generation!==Q.generation||H.binding.target_fence_id!==Q.fenceId||K.generation!==Q.generation||K.fenceId!==Q.fenceId||H.snapshot_id!==G.snapshot_id||H.revision!==G.revision)throw Error("local_device_gh_authority_changed")};V();let B=r9(Z,F.workspace);return{root:B.boundary,signal:$.signal,deadlineMs:X,privateDirectory:_3(F.environment.path),repoPath:B.path,readOnly:Q.readOnly,forbiddenSecretValues:Object.values(G.variables),secretNames:(H)=>Object.entries(G.variables).filter(([,K])=>K.trim()===H.trim()).map(([K])=>`variable ${K}`),assertCurrent:V}}async function OX($,Z){let Q=NZ.parse($.request),X=MZ.parse($.authority);if(X.contributorRefresh&&Q.kind==="read"&&X.readOnly)return Z(LZ($));let J=Boolean(X.contributorRefresh);if(J&&(X.merge||Q.kind!=="pr_mutation"||Q.mutation.action!=="edit"||typeof Q.mutation.body!=="string"||Q.mutation.title!==void 0||Q.mutation.base!==void 0||X.readOnly||X.runId!==$.runId||X.repoFullName!==Q.repoFullName))throw Error("local_device_gh_contributor_refresh_authority_invalid");if(Q.kind!=="pr_merge"&&!J){if(X.merge)throw Error("local_device_gh_merge_authority_invalid");return Z(LZ($))}if(!J&&(!X.merge||X.readOnly||X.runId!==$.runId||X.repoFullName!==Q.repoFullName||X.merge.source==="agent"&&(X.generation===null||X.fenceId===null)))throw Error("local_device_gh_merge_authority_invalid");let Y=P9($.root),z=I9(Y),F=Date.parse($.leaseUntil);if(!Number.isFinite(F)||F<=Date.now())throw Error("local_device_gh_lease_expired");let G=P9(x3());if(G===Y||G.startsWith(Y+A3))throw Error("local_device_gh_private_scope_unavailable");let V=AZ(p0(G,"reason-gh-merge-"));try{Q9(V);let B=()=>{if($.signal.throwIfAborted(),Date.now()>=F)throw Error("local_device_gh_lease_expired");let H=I9($.root);if(H.isSymbolicLink()||H.dev!==z.dev||H.ino!==z.ino||P9($.root)!==Y)throw Error("local_device_gh_authority_changed");Q9(V)};return B(),await Z({root:Y,readOnly:!1,privateDirectory:V,forbiddenSecretValues:[],signal:$.signal,deadlineMs:F,assertCurrent:B})}finally{c8(V,{recursive:!0,force:!0})}}var kZ=43200000;function Y9($){return Number.isSafeInteger($)&&Math.abs($)<=8640000000000000?$:null}function wZ($){return $!==null&&typeof $==="object"&&!Array.isArray($)}function bZ($,Z){return Object.keys($).length===Z.length&&Z.every((Q)=>Object.hasOwn($,Q))}function _X($){if(!wZ($)||!bZ($,["version","outcome","clock_source","validation_now_ms","expiry_ms","remaining_ms","maximum_lifetime_ms","cli_artifact"])||$.version!==1||$.maximum_lifetime_ms!==43200000||typeof $.outcome!=="string"||!["accepted","parse","noncanonical","expired","over_cap"].includes($.outcome)||typeof $.clock_source!=="string"||!["date_now","injected"].includes($.clock_source))return null;for(let X of["validation_now_ms","expiry_ms"]){let J=$[X];if(J!==null&&(typeof J!=="number"||Y9(J)===null))return null}if($.remaining_ms!==null&&(typeof $.remaining_ms!=="number"||!Number.isSafeInteger($.remaining_ms)))return null;let Z=typeof $.expiry_ms==="number"&&typeof $.validation_now_ms==="number"?$.expiry_ms-$.validation_now_ms:null;if($.remaining_ms!==(Z!==null&&Number.isSafeInteger(Z)?Z:null))return null;if($.outcome==="parse"&&$.expiry_ms!==null)return null;if($.outcome!=="parse"&&$.expiry_ms===null)return null;if($.outcome==="expired"&&!(typeof Z==="number"&&Z<=0))return null;if($.outcome==="over_cap"&&!(typeof Z==="number"&&Z>43200000))return null;if($.outcome==="accepted"&&!(typeof Z==="number"&&Z>0&&Z<=43200000))return null;let Q=$.cli_artifact;if(!wZ(Q)||!bZ(Q,["kind","status","sha256","observed_at_ms"])||Q.observed_at_ms!==null&&(typeof Q.observed_at_ms!=="number"||Y9(Q.observed_at_ms)===null))return null;if(Q.kind==="entrypoint_file"){if(Q.status!=="observed"||typeof Q.sha256!=="string"||!/^[a-f0-9]{64}$/.test(Q.sha256)||Q.observed_at_ms===null)return null}else if(Q.kind!=="unavailable"||Q.sha256!==null||typeof Q.status!=="string"||!["unsupported_entrypoint","read_failed","file_changed","size_limit","time_limit"].includes(Q.status))return null;return $}var u8=x.strictObject({kind:x.enum(["workspace_source","mcp_control"]),target_revision:x.number().int().nonnegative(),root_grant_revision:x.number().int().positive()}),mZ=new RegExp(t9.tokenPattern),h3=x.strictObject({token_url:x.url().max(2048),request_token:x.string().min(1).max(8192).regex(mZ),aws_credentials_url:x.url().max(2048).nullable()});function yZ($,Z){let Q=(X,J)=>{try{let Y=new URL(X);return Y.origin===new URL(Z).origin&&Y.pathname===J&&!Y.username&&!Y.password&&!Y.search&&!Y.hash}catch{return!1}};if(!mZ.test($.request_token)||!Q($.token_url,t9.tokenPath)||$.aws_credentials_url!==null&&!Q($.aws_credentials_url,t9.awsPath))return null;return{REASON_OIDC_TOKEN_URL:$.token_url,REASON_OIDC_REQUEST_TOKEN:$.request_token,...$.aws_credentials_url!==null?{AWS_CONTAINER_CREDENTIALS_FULL_URI:$.aws_credentials_url,AWS_CONTAINER_AUTHORIZATION_TOKEN:$.request_token}:{}}}function gZ($){return new TextEncoder().encode($).byteLength}function v3($){return gZ(JSON.stringify($)+`
|
|
10
|
+
`)}var hZ=x.strictObject({version:x.literal(1),snapshot_id:x.uuid(),revision:x.number().int().positive(),run_id:x.string().min(1).max(160),device_id:x.uuid(),root_id:x.uuid(),binding:u8.extend({target_generation:x.number().int().positive(),target_fence_id:x.uuid()}),expires_at:x.iso.datetime({offset:!0}),variables:x.record(x.string().max(128).regex(fZ),x.string().refine(($)=>!$.includes("\x00")&&gZ($)<=_0.valueBytes)).refine(($)=>Object.keys($).length<=_0.variables),github_auth:x.literal("local_gh").optional(),git:x.strictObject({base_url:x.url().max(2048),token:x.string().min(1).max(4096).regex(/^[A-Za-z0-9._~-]+$/),expires_at:x.iso.datetime({offset:!0})}).nullable(),cloud_access:h3.optional()}).refine(($)=>$.github_auth!=="local_gh"||$.git===null,"conflicting git authority").refine(($)=>v3($)<=_0.snapshotBytes,"snapshot too large");import{spawn as c3}from"child_process";import{basename as d3,isAbsolute as wX}from"path";var p3=0,vZ=120000,cZ=15000,u3=65536;function l8($=process.execPath,Z=process.argv[1]){let Q=d3($),X=(Q.startsWith("bun")||Q.startsWith("node"))&&typeof Z==="string"&&Z.length>0;return{command:$,prefix:X?[Z]:[]}}function bX($={}){let{command:Z,prefix:Q}=l8($.executablePath,$.sourceEntrypoint),X=$.spawnProcess??c3,J=$.now??Date.now,Y=null,z=0,F=!1,G=(B)=>{try{B.kill("SIGKILL")}catch{}},V=()=>{if(F)return;if(Y&&J()-z<vZ-cZ)return;if(Y){let H=Y;Y=null,G(H)}let B;try{B=X(Z,[...Q,"__device","__hands-worker","--handoff-fd",String(p3)],{cwd:"/",env:{PATH:process.env.PATH??"/usr/local/bin:/usr/bin:/bin"},shell:!1,stdio:["pipe","ignore","pipe"]})}catch{return}Y=B,z=J(),B.on("error",()=>{if(Y===B)Y=null}),B.once("exit",(H,K)=>{if(Y!==B)return;Y=null,$.log?.("hands.worker_prespawn_exited",{exit_code:H,exit_signal:K})}),$.log?.("hands.worker_prespawned",{pid:B.pid??null})};return{arm:V,take(B){let H=Y;if(!H||F)return null;let K=B.args.at(-1),L=B.options.env,W=B.options.cwd,U=[...Q,"__device","__hands-worker","--config"];if(B.command!==Z||B.args.length!==U.length+1||U.some((A,R)=>B.args[R]!==A)||typeof K!=="string"||!L||typeof W!=="string"||B.options.shell||JSON.stringify(B.options.stdio)!==JSON.stringify(["ignore","ignore","pipe"]))return null;Y=null;let j=H.stdin,O={configPath:K,cwd:W,env:Object.fromEntries(Object.entries(L).filter((A)=>typeof A[1]==="string"))},C=JSON.stringify(O);if(H.exitCode!==null||H.signalCode!==null||!j||j.destroyed||J()-z>=vZ-cZ||Buffer.byteLength(C,"utf8")>u3)return G(H),null;return j.on("error",()=>{return}),j.end(C),H.once("exit",()=>{V()}),$.log?.("hands.worker_prespawn_taken",{pid:H.pid??null}),H},adopt(B){B.once("exit",()=>{V()})},close(){if(F=!0,Y)G(Y);Y=null}}}import{accessSync as o3,constants as r3,statSync as t3}from"fs";import{homedir as e3,tmpdir as $1,userInfo as Z1}from"os";import{delimiter as Q1,win32 as X1}from"path";var l3=new Set(["ALL_PROXY","BUN_BE_BUN","BUN_OPTIONS","CURL_CA_BUNDLE","GIT_SSL_CAINFO","GRPC_DEFAULT_SSL_ROOTS_FILE_PATH","HTTPS_PROXY","HTTP_PROXY","NO_PROXY","NODE_EXTRA_CA_CERTS","NODE_OPTIONS","NODE_TLS_REJECT_UNAUTHORIZED","REQUESTS_CA_BUNDLE","SSLKEYLOGFILE","SSL_CERT_DIR","SSL_CERT_FILE","all_proxy","http_proxy","https_proxy","no_proxy"]);var s3=["BUN_CONFIG_","BUN_INSPECT","DYLD_","NODE_DEBUG"],n3=new Set(["BUN_INSTALL"]);var i3=/^--(?:max-old-space-size|max-semi-space-size|stack-size)=\d{1,9}$/;function a3($){return($??"").split(/\s+/).filter(Boolean).every((Z)=>i3.test(Z.replaceAll("_","-")))}function dZ($){return Object.keys($).filter((Z)=>l3.has(Z)&&!(Z==="NODE_OPTIONS"&&a3($[Z]))||s3.some((Q)=>Z.startsWith(Q))||Z.startsWith("BUN_")&&!n3.has(Z)).sort()}var J1=new Set(["HOME","PATH","PWD","OLDPWD","SHLVL","_","TMPDIR","TMP","TEMP","SHELL","BASH_ENV","ENV","ZDOTDIR","PROMPT_COMMAND","IFS","CDPATH","GLOBIGNORE","SHELLOPTS","BASHOPTS","NODE_PATH"]),Y1=/^(?:ARA_|REASON_|PI_|GIT_|GH_|GITHUB_|LD_|DYLD_|BUN_|BASH_FUNC_|SSH_)/,G1=/TOKEN|SECRET|PASSW|PASSPHRASE|CREDENTIAL|API_?KEY|ACCESS_?KEY|PRIVATE_?KEY|AUTH/i,z1=/^[A-Za-z_][A-Za-z0-9_]*$/;function sZ($=process.env){let Z=(J)=>{if(!(process.platform==="win32"?X1.isAbsolute(J):J.startsWith("/"))||/[\0\r\n]/.test(J)||J.length>32768)throw Error("invalid_host_execution_environment");return J};if($.PATH!==void 0&&(/[\0\r\n]/.test($.PATH)||$.PATH.length>32768))throw Error("invalid_host_execution_environment");let Q=new Set(dZ($)),X=Object.fromEntries(Object.entries($).filter((J)=>{let[Y,z]=J;return typeof z==="string"&&z.length<=32768&&!z.includes("\x00")&&Y.length<=128&&z1.test(Y)&&!Q.has(Y)&&!J1.has(Y)&&!Y1.test(Y)&&!G1.test(Y)}).sort(([J],[Y])=>J.localeCompare(Y)).slice(0,512));return{home:Z($.HOME||(process.platform==="win32"?$.USERPROFILE:void 0)||e3()),path:((J)=>process.platform==="win32"?lZ(J):J)(uZ($.PATH??"").join(Q1)||pZ),temporaryDirectory:Z($.TMPDIR||$.TMP||$.TEMP||$1()),variables:X}}function nZ($=process.env,Z=()=>Z1().shell){if(process.platform==="win32")return e9();let Q=(J)=>{if(!J||!/^\/[A-Za-z0-9._/-]*\/(?:bash|zsh)$/.test(J))return!1;try{return o3(J,r3.X_OK),t3(J).isFile()}catch{return!1}};if(Q($.SHELL))return $.SHELL;let X;try{X=Z()}catch{X=void 0}return Q(X)?X:"/bin/zsh"}import{readFileSync as oZ,realpathSync as iZ,statSync as K1}from"fs";import{homedir as F1}from"os";import{dirname as V1,isAbsolute as H1,join as R9,sep as U1}from"path";var z5="--proxy",K5="--proxy-ca-file",W1=262144;class J0 extends Error{}function n8($){let Z;try{Z=new URL($)}catch{throw new J0("The proxy must be a URL like https://proxy.example.com:3128.")}if(Z.protocol!=="https:"&&Z.protocol!=="http:")throw new J0("The proxy URL must use the https or http scheme.");if(!Z.hostname)throw new J0("The proxy URL must name a host.");if(Z.port!==""&&Number(Z.port)<1)throw new J0("The proxy URL must use a port between 1 and 65535.");if(Z.pathname!==""&&Z.pathname!=="/"||Z.search||Z.hash)throw new J0("The proxy URL must not carry a path, query, or fragment.");return Z.toString()}function F5($){let Z=new URL($.url),Q=Z.port||(Z.protocol==="https:"?"443":"80");return`${Z.hostname}:${Q}`}function B1($={}){let Z=$.home??F1(),Q=$.statePath??aZ();return[V1(Q),R9(Z,".ssh"),R9(Z,".aws"),R9(Z,".gnupg"),R9(Z,".kube"),R9(Z,"Library","Keychains")]}function L1($,Z){return Z===$||Z.startsWith($+U1)}function N1($,Z={}){if(!H1($))throw new J0("The proxy CA file must be an absolute path.");let Q,X,J;try{Q=iZ($);let F=K1(Q);X=F.size,J=F.isFile()}catch{throw new J0("The proxy CA file does not exist or is not readable.")}if(!J)throw new J0("The proxy CA file must be a regular file.");if(X>W1)throw new J0("The proxy CA file must be 256 KB or smaller.");let Y=B1(Z).flatMap((F)=>{try{let G=iZ(F);return G===F?[F]:[F,G]}catch{return[F]}});for(let F of[$,Q])if(Y.some((G)=>L1(G,F)))throw new J0("The proxy CA file must not live inside a credential directory.");let z;try{z=oZ(Q,"utf8")}catch{throw new J0("The proxy CA file is not readable.")}if(!z.includes("-----BEGIN CERTIFICATE-----"))throw new J0("The proxy CA file must be a PEM certificate bundle.");return Q}function V5($,Z={}){if(!$.proxyUrl)throw new J0("A proxy URL is required.");let Q=n8($.proxyUrl),X=$.caFile===void 0?void 0:N1($.caFile,Z);return{version:$8,url:Q,...X===void 0?{}:{caFile:X}}}function H5($,Z=fetch){if(!$)return Z;let Q,X=!1;return(Y,z)=>{if(!X){if($.caFile)try{Q=oZ($.caFile,"utf8")}catch{throw new J0(`The configured proxy CA file is not readable: ${$.caFile}`)}X=!0}let F={...z,proxy:$.url,...Q===void 0?{}:{tls:{ca:Q}}};return Z(Y,F)}}import{createHash as M1}from"crypto";import{isAbsolute as tZ,join as eZ,relative as $Q,resolve as Q8,sep as ZQ}from"path";var Z8=x.string().min(1).refine(tZ,"absolute path required"),i8=x.strictObject({version:x.literal(1),apiOrigin:x.url(),channel:x.enum(["staging","production"]),stateDirectory:Z8,workspaceRoot:Z8,lifetime:x.enum(["persistent","ephemeral"]),executionMode:x.enum(["confined","host"]).default("confined"),name:x.string().min(1).max(160).default("Reason headless worker"),slots:x.number().int().min(1).max(4).default(1),shutdownGraceMs:x.number().int().min(0).max(300000).default(30000),proxy:x.strictObject({version:x.literal($8),url:x.string().refine(($)=>{try{return n8($)===$}catch{return!1}},"invalid proxy URL"),caFile:Z8.optional()}).optional(),userChrome:x.boolean().optional(),cloudSessions:x.literal(!0).optional(),localLogins:x.boolean().optional(),folders:x.array(Z8).min(1).max(31).optional()}),j1=/^https:\/\/[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.trycloudflare\.com$/,C5=x.discriminatedUnion("channel",[i8,i8.extend({channel:x.literal("pr"),apiOrigin:x.string(),prEnvironment:x.string()}),i8.extend({channel:x.literal("local-qa"),apiOrigin:x.string()})]).superRefine(($,Z)=>{if($.channel==="local-qa"){if(!j1.test($.apiOrigin))Z.addIssue({code:"custom",message:"local QA worker requires an exact HTTPS trycloudflare.com quick-tunnel origin"})}else if($.channel==="pr"){let X=$.prEnvironment,J=/^https:\/\/([a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)\.up\.railway\.app$/.exec($.apiOrigin),Y=J?.[1]?.match(/(?:^|-)pr-[0-9]+(?=-|$)/g)?.map((z)=>z.replace(/^-/,""));if(!X||/^pr-[1-9][0-9]*$/.exec(X)?.[0]!==X||J?.[0]!==$.apiOrigin||Y?.length!==1||Y[0]!==X)Z.addIssue({code:"custom",message:"PR worker requires explicit prEnvironment and an exact same-PR HTTPS Railway origin"})}else{let X=new URL($.apiOrigin);if(X.origin!==$.apiOrigin||X.username||X.password||X.protocol!=="https:"&&!(X.protocol==="http:"&&a8(X.origin))||!a8(X.origin)&&!rZ($.channel,X.origin))Z.addIssue({code:"custom",message:"API origin must match channel (or loopback)"})}if(!E9($.workspaceRoot,$.stateDirectory))Z.addIssue({code:"custom",message:"state and workspace must be disjoint"});let Q=$.folders??[];if(new Set([$.workspaceRoot,...Q]).size!==Q.length+1||Q.some((X)=>!E9(X,$.stateDirectory)))Z.addIssue({code:"custom",message:"folders must be distinct and disjoint from state"})});function q1($){return eZ($.stateDirectory,`headless-${$.channel==="pr"?$.prEnvironment:$.channel}`)}function T5($,Z={},Q={}){let X=$.executionMode==="host"?"unsandboxed":"sandboxed";return{worker:Object.freeze({executionMode:X,runtimeDirectory:q1($),handsSlots:$.slots,...Q.ownComputer?{ownComputer:!0}:{},readiness:Object.freeze({...Z}),...Q.persistentTerminals?{persistentTerminals:!0}:{},...Q.probing?.length?{probing:Object.freeze([...Q.probing])}:{},...Q.displayVideo?{displayVideo:!0}:{},...Q.handsBrowser&&Z["hands.connect"]===!0?{handsBrowser:!0}:{},...Q.githubSignedIn===void 0?{}:{githubSignedIn:Q.githubSignedIn},...$.userChrome!==!1&&Q.userChrome?{userChrome:Q.userChrome}:{},...$.cloudSessions&&Z["automation.call.v1"]===!0?{cloudSessions:!0}:{}}),proxy:$.proxy??null}}function E9($,Z){if(A0(Z,$))return!1;return!A0($,Z)||b0(eZ(ZQ,$Q(Q8($),Q8(Z))))}function A0($,Z){let Q=$Q(Q8($),Q8(Z));return Q===""||Q!==".."&&!Q.startsWith(`..${ZQ}`)&&!tZ(Q)}function O5($){let{proxy:Z,userChrome:Q,cloudSessions:X,localLogins:J,folders:Y,...z}=$;return M1("sha256").update(JSON.stringify(z)).digest("hex")}import{readdir as C1}from"fs/promises";var T1=15000;function O1($){let Z=$ instanceof Error&&"code"in $?$.code:null;return Z==="EPERM"||Z==="EACCES"}function D1($){return new q("folder_access_denied",`macOS blocked Reason from opening ${$}. Allow Reason in System Settings \u203A Privacy & Security \u203A Files and Folders `+"(or Full Disk Access), then try again.")}async function QQ($,{timeoutMs:Z=T1,open:Q=(X)=>C1(X)}={}){let X,J=new Promise((Y)=>{X=setTimeout(()=>Y("pending"),Z)});try{if(await Promise.race([Q($).then(()=>"open"),J])==="pending")throw new q("folder_access_pending",`macOS is asking whether Reason may open ${$}. Answer the prompt on this Mac, then try again.`)}catch(Y){if(O1(Y))throw D1($);if(Y instanceof q)throw Y}finally{clearTimeout(X)}}import{chmodSync as Q7,closeSync as X7,constants as Y$,fstatSync as J7,lstatSync as xQ,openSync as Y7,readSync as G7,realpathSync as G$,unlinkSync as z7}from"fs";import{lookup as K7}from"dns/promises";import{createRequire as F7}from"module";import{request as V7}from"http";import{request as H7}from"https";import n0 from"net";import{platform as wQ}from"os";import{basename as U7,extname as W7,isAbsolute as PQ,relative as z$,resolve as F9,sep as K$}from"path";var XQ=String.raw`
|
|
11
|
+
async (roots) => {
|
|
12
|
+
"use strict";
|
|
13
|
+
const version = 2;
|
|
14
|
+
if (globalThis.__araHandsRepl && globalThis.__araHandsRepl.version === version) return;
|
|
15
|
+
const hostCall = globalThis.__araHandsRpc;
|
|
16
|
+
if (typeof hostCall !== "function") throw new Error("Reason Hands browser bridge is not installed");
|
|
17
|
+
try { delete globalThis.__araHandsRpc; } catch (error) {
|
|
18
|
+
if (!(error instanceof TypeError)) throw error;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const handles = new WeakMap();
|
|
22
|
+
const bytes = new WeakMap();
|
|
23
|
+
const routes = new WeakMap();
|
|
24
|
+
const derived = new Set([
|
|
25
|
+
"browser", "context", "frame", "frameLocator", "getByAltText", "getByLabel",
|
|
26
|
+
"getByPlaceholder", "getByRole", "getByTestId", "getByText", "getByTitle",
|
|
27
|
+
"contentFrame", "locator", "nth", "mainFrame", "newContext", "newPage", "opener", "owner", "page", "parentFrame",
|
|
28
|
+
]);
|
|
29
|
+
const locatorMethods = new Set([
|
|
30
|
+
"all", "allInnerTexts", "allTextContents", "and", "ariaSnapshot", "blur",
|
|
31
|
+
"boundingBox", "check", "clear", "click", "contentFrame", "count", "dblclick",
|
|
32
|
+
"dragTo", "evaluate", "evaluateAll", "fill", "filter", "focus", "getAttribute",
|
|
33
|
+
"hover", "innerHTML", "innerText", "inputValue", "isChecked", "isEditable",
|
|
34
|
+
"isEnabled", "isHidden", "isVisible", "or", "page", "press", "pressSequentially",
|
|
35
|
+
"screenshot", "scrollIntoViewIfNeeded", "selectOption", "setInputFiles", "tap",
|
|
36
|
+
"textContent", "type", "uncheck", "waitFor",
|
|
37
|
+
]);
|
|
38
|
+
const pageMethods = new Set([
|
|
39
|
+
"addInitScript", "addScriptTag", "addStyleTag", "bringToFront", "close", "content",
|
|
40
|
+
"emulateMedia", "evaluate", "frameLocator", "frames", "goBack", "goForward", "goto",
|
|
41
|
+
"isClosed", "pdf", "reload", "route", "screenshot", "captureScreenshot", "selectOption", "setContent",
|
|
42
|
+
"setDefaultNavigationTimeout", "setDefaultTimeout", "setExtraHTTPHeaders", "setInputFiles",
|
|
43
|
+
"setViewportSize", "title", "unroute", "url", "viewportSize", "waitForFunction",
|
|
44
|
+
"waitForLoadState", "waitForNavigation", "waitForTimeout", "waitForURL",
|
|
45
|
+
]);
|
|
46
|
+
const contextMethods = new Set([
|
|
47
|
+
"startRecording", "stopRecording",
|
|
48
|
+
"addCookies", "addInitScript", "clearCookies", "clearPermissions", "close", "cookies",
|
|
49
|
+
"grantPermissions", "pages", "route", "setDefaultNavigationTimeout", "setDefaultTimeout",
|
|
50
|
+
"setExtraHTTPHeaders", "setGeolocation", "setHTTPCredentials", "setOffline",
|
|
51
|
+
"setViewportSize", "storageState", "unroute", "viewportSize",
|
|
52
|
+
]);
|
|
53
|
+
const browserMethods = new Set(["close", "contexts", "isConnected", "version"]);
|
|
54
|
+
const frameMethods = new Set([
|
|
55
|
+
"addScriptTag", "addStyleTag", "childFrames", "content", "evaluate", "frameLocator",
|
|
56
|
+
"goto", "isDetached", "name", "parentFrame", "setContent", "title", "url",
|
|
57
|
+
"waitForFunction", "waitForLoadState", "waitForNavigation", "waitForTimeout", "waitForURL",
|
|
58
|
+
]);
|
|
59
|
+
|
|
60
|
+
function record(value) {
|
|
61
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return false;
|
|
62
|
+
const proto = Object.getPrototypeOf(value);
|
|
63
|
+
return proto === Object.prototype || proto === null;
|
|
64
|
+
}
|
|
65
|
+
function handle(value) {
|
|
66
|
+
return record(value) && value.$handsRepl === "handle"
|
|
67
|
+
&& typeof value.id === "string" && typeof value.kind === "string";
|
|
68
|
+
}
|
|
69
|
+
function clone(value, stack) {
|
|
70
|
+
if (value === null || typeof value === "boolean" || typeof value === "string") return value;
|
|
71
|
+
if (typeof value === "number") {
|
|
72
|
+
if (!Number.isFinite(value)) throw new TypeError("Reason Hands bridge accepts only finite numbers");
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
if (!value || typeof value !== "object") throw new TypeError("Reason Hands bridge accepts only JSON data");
|
|
76
|
+
if (stack.has(value)) throw new TypeError("Reason Hands bridge does not accept cyclic data");
|
|
77
|
+
stack.add(value);
|
|
78
|
+
try {
|
|
79
|
+
if (Array.isArray(value)) return value.map((item) => clone(item, stack));
|
|
80
|
+
if (!record(value)) throw new TypeError("Reason Hands bridge accepts only plain objects");
|
|
81
|
+
const output = Object.create(null);
|
|
82
|
+
for (const key of Object.keys(value)) {
|
|
83
|
+
if (key === "__proto__" || key === "constructor" || key === "prototype") {
|
|
84
|
+
throw new TypeError("Reason Hands bridge rejects unsafe object keys");
|
|
85
|
+
}
|
|
86
|
+
output[key] = clone(value[key], stack);
|
|
87
|
+
}
|
|
88
|
+
return output;
|
|
89
|
+
} finally { stack.delete(value); }
|
|
90
|
+
}
|
|
91
|
+
function data(value) { return clone(value, new WeakSet()); }
|
|
92
|
+
function refOf(value) {
|
|
93
|
+
const ref = value && typeof value === "object" ? handles.get(value) : undefined;
|
|
94
|
+
if (!ref) throw new TypeError("Reason Hands operation needs a browser target");
|
|
95
|
+
return ref;
|
|
96
|
+
}
|
|
97
|
+
async function wire(value) {
|
|
98
|
+
const target = value && typeof value === "object" ? handles.get(value) : undefined;
|
|
99
|
+
if (target) return (await target).handle;
|
|
100
|
+
const binary = value && typeof value === "object" ? bytes.get(value) : undefined;
|
|
101
|
+
if (binary) return binary;
|
|
102
|
+
const route = value && typeof value === "object" ? routes.get(value) : undefined;
|
|
103
|
+
if (route) return route;
|
|
104
|
+
if (value === null || typeof value === "boolean" || typeof value === "string") return value;
|
|
105
|
+
if (typeof value === "number") {
|
|
106
|
+
if (!Number.isFinite(value)) throw new TypeError("Reason Hands bridge accepts only finite numbers");
|
|
107
|
+
return value;
|
|
108
|
+
}
|
|
109
|
+
if (Array.isArray(value)) return await Promise.all(value.map(wire));
|
|
110
|
+
if (!record(value)) throw new TypeError("Reason Hands bridge accepts only JSON data");
|
|
111
|
+
const output = Object.create(null);
|
|
112
|
+
for (const key of Object.keys(value)) output[key] = await wire(value[key]);
|
|
113
|
+
return output;
|
|
114
|
+
}
|
|
115
|
+
function decode(value) {
|
|
116
|
+
if (handle(value)) return makeTarget(value);
|
|
117
|
+
if (record(value) && value.$handsRepl === "bytes" && typeof value.base64 === "string") {
|
|
118
|
+
const output = Object.freeze({ $handsRepl: "bytes", base64: value.base64 });
|
|
119
|
+
bytes.set(output, output);
|
|
120
|
+
return output;
|
|
121
|
+
}
|
|
122
|
+
if (record(value) && value.$handsRepl === "undefined") return undefined;
|
|
123
|
+
if (Array.isArray(value)) return value.map(decode);
|
|
124
|
+
if (!record(value)) return value;
|
|
125
|
+
const output = Object.create(null);
|
|
126
|
+
for (const key of Object.keys(value)) output[key] = decode(value[key]);
|
|
127
|
+
return output;
|
|
128
|
+
}
|
|
129
|
+
async function rpc(request) { return decode(await hostCall(request)); }
|
|
130
|
+
async function invoke(ref, method, args) {
|
|
131
|
+
return await rpc({ type: "call", target: ref.handle, method, args: await Promise.all(args.map(wire)) });
|
|
132
|
+
}
|
|
133
|
+
function targetFrom(value) {
|
|
134
|
+
const ref = value && typeof value === "object" ? handles.get(value) : undefined;
|
|
135
|
+
if (!ref) throw new Error("Reason Hands bridge received an invalid target");
|
|
136
|
+
return ref;
|
|
137
|
+
}
|
|
138
|
+
function lazy(refPromise) {
|
|
139
|
+
const object = Object.create(null);
|
|
140
|
+
const ready = Promise.resolve(refPromise);
|
|
141
|
+
const proxy = new Proxy(object, {
|
|
142
|
+
get(_object, key) {
|
|
143
|
+
if (key === "then") return (resolve, reject) => {
|
|
144
|
+
// Derived targets carry the bridge's internal { handle, kind } ref,
|
|
145
|
+
// not the wire handle accepted by makeTarget. Passing the wrapper
|
|
146
|
+
// used to throw inside this detached fulfillment callback; because
|
|
147
|
+
// that rejection was not forwarded to the thenable consumer, every
|
|
148
|
+
// await context.newPage() / await page.context() hung until an
|
|
149
|
+
// outer tool deadline destroyed the evaluator execution context.
|
|
150
|
+
ready.then((ref) => {
|
|
151
|
+
try { resolve(makeTarget(ref.handle)); } catch (error) { reject(error); }
|
|
152
|
+
}, reject);
|
|
153
|
+
};
|
|
154
|
+
if (typeof key !== "string") return undefined;
|
|
155
|
+
if (key === "first" || key === "last") return lazy(ready.then(async (ref) => targetFrom(await invoke(ref, key, []))));
|
|
156
|
+
if (derived.has(key)) return (...args) => lazy(ready.then(async (ref) => targetFrom(await invoke(ref, key, args))));
|
|
157
|
+
if (key === "evaluate" || key === "evaluateAll") return (source, argument) => ready.then((ref) => evaluateInTarget(ref, source, argument));
|
|
158
|
+
return (...args) => ready.then((ref) => invoke(ref, key, args));
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
handles.set(proxy, ready);
|
|
162
|
+
return proxy;
|
|
163
|
+
}
|
|
164
|
+
function makeTarget(handleValue) {
|
|
165
|
+
if (!handle(handleValue)) throw new Error("Reason Hands bridge received an invalid handle");
|
|
166
|
+
const ref = { handle: Object.freeze({ $handsRepl: "handle", id: handleValue.id, kind: handleValue.kind }), kind: handleValue.kind };
|
|
167
|
+
const object = Object.create(null);
|
|
168
|
+
// Preserve the existing synchronous viewport facade. URL reads use the
|
|
169
|
+
// dispatcher: a human can navigate the real page without an agent goto,
|
|
170
|
+
// and a new evaluator must not invent about:blank for that live page.
|
|
171
|
+
const meta = {
|
|
172
|
+
viewport: ref.kind === "page" && ref.handle.id === roots.page.id
|
|
173
|
+
? { width: 1440, height: 900 }
|
|
174
|
+
: undefined,
|
|
175
|
+
};
|
|
176
|
+
const invokeDerived = (method, args) => lazy(Promise.resolve(invoke(ref, method, args)).then(targetFrom));
|
|
177
|
+
const get = (_object, key) => {
|
|
178
|
+
if (key === "first" || key === "last") return invokeDerived(key, []);
|
|
179
|
+
if (typeof key !== "string") return undefined;
|
|
180
|
+
if (key === "evaluate" || key === "evaluateAll") return (source, argument) => evaluateInTarget(ref, source, argument);
|
|
181
|
+
if (ref.kind === "page" && key === "viewportSize" && meta.viewport) {
|
|
182
|
+
return () => ({ ...meta.viewport });
|
|
183
|
+
}
|
|
184
|
+
if (ref.kind === "page" && key === "setViewportSize") {
|
|
185
|
+
return (next) => invoke(ref, key, [next]).then((value) => {
|
|
186
|
+
if (record(next) && typeof next.width === "number" && typeof next.height === "number") {
|
|
187
|
+
meta.viewport = { width: next.width, height: next.height };
|
|
188
|
+
}
|
|
189
|
+
return value;
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
if ((ref.kind === "page" || ref.kind === "context") && key === "route") {
|
|
193
|
+
return async (url, handler) => {
|
|
194
|
+
if (typeof handler !== "function") return await invoke(ref, key, [url, handler]);
|
|
195
|
+
let fulfillment;
|
|
196
|
+
const route = Object.freeze({
|
|
197
|
+
fulfill: async (options) => {
|
|
198
|
+
if (fulfillment) throw new TypeError("route() can register one fulfillment action");
|
|
199
|
+
fulfillment = routeFulfill(options);
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
await handler(route);
|
|
203
|
+
if (!fulfillment) {
|
|
204
|
+
throw new TypeError("route() supports a data-only route.fulfill({ ... }) callback");
|
|
205
|
+
}
|
|
206
|
+
return await invoke(ref, key, [url, fulfillment]);
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
if (derived.has(key)) return (...args) => invokeDerived(key, args);
|
|
210
|
+
const methods = ref.kind === "browser" ? browserMethods
|
|
211
|
+
: ref.kind === "context" ? contextMethods
|
|
212
|
+
: ref.kind === "page" ? pageMethods
|
|
213
|
+
: ref.kind === "frame" ? frameMethods
|
|
214
|
+
: locatorMethods;
|
|
215
|
+
if (!methods.has(key)) return undefined;
|
|
216
|
+
return (...args) => invoke(ref, key, args);
|
|
217
|
+
};
|
|
218
|
+
const proxy = new Proxy(object, { get });
|
|
219
|
+
handles.set(proxy, Promise.resolve(ref));
|
|
220
|
+
return proxy;
|
|
221
|
+
}
|
|
222
|
+
async function evaluateInTarget(ref, source, argument) {
|
|
223
|
+
const text = typeof source === "function" ? Function.prototype.toString.call(source) : source;
|
|
224
|
+
if (typeof text !== "string" || !text.trim()) throw new TypeError("evaluate() needs a function or expression string");
|
|
225
|
+
const value = argument === undefined ? undefined : JSON.stringify(await wire(argument));
|
|
226
|
+
let renderer;
|
|
227
|
+
if (ref.kind === "locator") {
|
|
228
|
+
renderer = typeof source === "function"
|
|
229
|
+
? "(element) => (" + text + ")(element" + (value === undefined ? "" : ", " + value) + ")"
|
|
230
|
+
: text;
|
|
231
|
+
} else {
|
|
232
|
+
renderer = typeof source === "function"
|
|
233
|
+
? "(" + text + ")(" + (value === undefined ? "" : value) + ")"
|
|
234
|
+
: value === undefined ? text : "(" + text + ")(" + value + ")";
|
|
235
|
+
}
|
|
236
|
+
return await invoke(ref, "evaluate", [renderer]);
|
|
237
|
+
}
|
|
238
|
+
function routeFulfill(options) {
|
|
239
|
+
const token = Object.freeze(Object.create(null));
|
|
240
|
+
routes.set(token, { $handsRepl: "routeFulfill", options: data(options) });
|
|
241
|
+
return token;
|
|
242
|
+
}
|
|
243
|
+
const replConsole = Object.freeze({
|
|
244
|
+
log: (...values) => { logs.push(values.map(render).join(" ")); },
|
|
245
|
+
info: (...values) => { logs.push(values.map(render).join(" ")); },
|
|
246
|
+
warn: (...values) => { logs.push("[warn] " + values.map(render).join(" ")); },
|
|
247
|
+
error: (...values) => { logs.push("[error] " + values.map(render).join(" ")); },
|
|
248
|
+
});
|
|
249
|
+
function render(value) {
|
|
250
|
+
if (value === undefined) return "undefined";
|
|
251
|
+
if (typeof value === "string") return value;
|
|
252
|
+
try { const text = JSON.stringify(value); return text === undefined ? String(value) : text; } catch { return "[unrenderable]"; }
|
|
253
|
+
}
|
|
254
|
+
const logs = [];
|
|
255
|
+
const browser = makeTarget(roots && roots.browser);
|
|
256
|
+
const context = makeTarget(roots && roots.context);
|
|
257
|
+
const page = makeTarget(roots && roots.page);
|
|
258
|
+
const state = Object.create(null);
|
|
259
|
+
async function a11y(target) {
|
|
260
|
+
const ref = target === undefined ? await refOf(page) : await refOf(target);
|
|
261
|
+
return await rpc({ type: "a11y", target: ref.handle });
|
|
262
|
+
}
|
|
263
|
+
async function view(source, options) {
|
|
264
|
+
return await rpc({ type: "view", source: await wire(source), options: options === undefined ? Object.create(null) : await wire(options) });
|
|
265
|
+
}
|
|
266
|
+
async function evaluate(code) {
|
|
267
|
+
if (typeof code !== "string") throw new TypeError("Reason Hands REPL code must be a string");
|
|
268
|
+
logs.length = 0;
|
|
269
|
+
let program;
|
|
270
|
+
let statementList = false;
|
|
271
|
+
try { program = new Function('"use strict"; return (async () => await (' + code + "\n))();"); }
|
|
272
|
+
catch {
|
|
273
|
+
statementList = true;
|
|
274
|
+
const strictCode = '"use strict";\n' + code;
|
|
275
|
+
program = new Function(
|
|
276
|
+
'"use strict"; return (async () => (0, eval)(' + JSON.stringify(strictCode) + '))();',
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
let value;
|
|
280
|
+
try {
|
|
281
|
+
value = await program();
|
|
282
|
+
} catch (error) {
|
|
283
|
+
// Indirect eval preserves a statement-list completion value but cannot
|
|
284
|
+
// parse top-level await or return. Those programs retain the prior async
|
|
285
|
+
// block behavior; a syntax failure occurs before any user code executes.
|
|
286
|
+
if (!statementList || !(error instanceof SyntaxError)) throw error;
|
|
287
|
+
program = new Function('"use strict"; return (async () => {' + code + "\n})();");
|
|
288
|
+
value = await program();
|
|
289
|
+
}
|
|
290
|
+
const output = render(value);
|
|
291
|
+
return logs.length === 0 ? output : value === undefined ? logs.join("\n") : logs.join("\n") + "\n" + output;
|
|
292
|
+
}
|
|
293
|
+
function install(name, value) { Object.defineProperty(globalThis, name, { value, configurable: false, enumerable: false, writable: false }); }
|
|
294
|
+
install("browser", browser); install("context", context); install("page", page);
|
|
295
|
+
install("state", state); install("browserState", state);
|
|
296
|
+
install("a11y", a11y); install("view", view); install("routeFulfill", routeFulfill); install("console", replConsole);
|
|
297
|
+
install("__araHandsRepl", Object.freeze({ version, evaluate }));
|
|
298
|
+
}
|
|
299
|
+
`.trim(),JQ=String.raw`
|
|
300
|
+
async (input) => {
|
|
301
|
+
const bridge = globalThis.__araHandsRepl;
|
|
302
|
+
if (!bridge || typeof bridge.evaluate !== "function") throw new Error("Reason Hands browser bridge is not installed");
|
|
303
|
+
return await bridge.evaluate(typeof input === "string" ? input : input && input.code);
|
|
304
|
+
}
|
|
305
|
+
`.trim();import{Buffer as G9}from"buffer";import{randomUUID as _1}from"crypto";class KQ extends Error{code;constructor($){super($==="hands_repl_private_profile_attribute_denied"?"Private browser attribute read denied.":$);this.code=$;this.name="HandsReplBrowserDispatcherError"}}var FQ=new Set(["__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__","__proto__","constructor","prototype"]),YQ=/^hands_[A-Za-z0-9_-]{8,128}$/,A1=2048,VQ=32,HQ=1e4,x1=new Set(["href","src","alt","title","role","aria-label","aria-expanded","aria-checked","aria-selected","aria-disabled","placeholder","type","name","data-testid"]);function P1($){let Z=$.split("+"),Q=(Z.pop()??"").replace(/^Key/,"").toLowerCase();if(Q==="f12")return!0;if(Z.some((X)=>["Control","ControlOrMeta","Meta"].includes(X))&&["l","n","t","j","i","p","s","w","u","o","r","tab","pageup","pagedown"].includes(Q))return!0;if(Z.some((X)=>["Control","ControlOrMeta","Meta"].includes(X))&&Z.includes("Shift")&&Q==="c")return!0;return Z.includes("Alt")&&["d","arrowleft","arrowright","home"].includes(Q)}var I1=($)=>{let Z=$.closest("a[href],area[href]");return{password:$.tagName==="INPUT"&&$.type==="password",executableLink:Boolean(Z&&!/^(https?:|about:blank)/i.test(Z.href))}},UQ={browser:{close:{returns:"void"},contexts:{returns:"context[]"},isConnected:{returns:"json"},version:{returns:"json"}},context:{addCookies:{returns:"void"},addInitScript:{returns:"void"},browser:{returns:"browser"},clearCookies:{returns:"void"},clearPermissions:{returns:"void"},close:{returns:"void"},cookies:{returns:"json"},grantPermissions:{returns:"void"},newPage:{returns:"page"},pages:{returns:"page[]"},setDefaultNavigationTimeout:{returns:"void"},setDefaultTimeout:{returns:"void"},setExtraHTTPHeaders:{returns:"void"},setGeolocation:{returns:"void"},setHTTPCredentials:{returns:"void"},setOffline:{returns:"void"},setViewportSize:{returns:"void"},storageState:{returns:"json"},viewportSize:{returns:"json",special:"contextViewportSize"}},page:{addInitScript:{returns:"void"},addScriptTag:{returns:"void"},addStyleTag:{returns:"void"},bringToFront:{returns:"void"},close:{returns:"void"},content:{returns:"json"},context:{returns:"context"},emulateMedia:{returns:"void"},evaluate:{returns:"json",requiresStringSource:!0},frame:{returns:"frame"},frameLocator:{returns:"frameLocator"},frames:{returns:"frame[]"},getByAltText:{returns:"locator"},getByLabel:{returns:"locator"},getByPlaceholder:{returns:"locator"},getByRole:{returns:"locator"},getByTestId:{returns:"locator"},getByText:{returns:"locator"},getByTitle:{returns:"locator"},goBack:{returns:"void"},goForward:{returns:"void"},goto:{returns:"void"},isClosed:{returns:"json"},locator:{returns:"locator"},mainFrame:{returns:"frame"},opener:{returns:"page"},pdf:{returns:"bytes"},reload:{returns:"void"},screenshot:{returns:"bytes"},selectOption:{returns:"json"},setContent:{returns:"void"},setDefaultNavigationTimeout:{returns:"void"},setDefaultTimeout:{returns:"void"},setExtraHTTPHeaders:{returns:"void"},setInputFiles:{returns:"void"},setViewportSize:{returns:"void"},title:{returns:"json"},url:{returns:"json"},viewportSize:{returns:"json"},waitForFunction:{returns:"void",requiresStringSource:!0},waitForLoadState:{returns:"void"},waitForNavigation:{returns:"void"},waitForTimeout:{returns:"void"},waitForURL:{returns:"void"}},locator:{all:{returns:"locator[]"},allInnerTexts:{returns:"json"},allTextContents:{returns:"json"},and:{returns:"locator"},ariaSnapshot:{returns:"json"},blur:{returns:"void"},boundingBox:{returns:"json"},check:{returns:"void"},clear:{returns:"void"},click:{returns:"void"},contentFrame:{returns:"frameLocator"},count:{returns:"json"},dblclick:{returns:"void"},dragTo:{returns:"void"},evaluate:{returns:"json",requiresStringSource:!0},evaluateAll:{returns:"json",requiresStringSource:!0},fill:{returns:"void"},filter:{returns:"locator"},first:{returns:"locator",special:"property"},focus:{returns:"void"},getAttribute:{returns:"json"},getByAltText:{returns:"locator"},getByLabel:{returns:"locator"},getByPlaceholder:{returns:"locator"},getByRole:{returns:"locator"},getByTestId:{returns:"locator"},getByText:{returns:"locator"},getByTitle:{returns:"locator"},hover:{returns:"void"},innerHTML:{returns:"json"},innerText:{returns:"json"},inputValue:{returns:"json"},isChecked:{returns:"json"},isEditable:{returns:"json"},isEnabled:{returns:"json"},isHidden:{returns:"json"},isVisible:{returns:"json"},last:{returns:"locator",special:"property"},locator:{returns:"locator"},nth:{returns:"locator"},or:{returns:"locator"},page:{returns:"page"},press:{returns:"void"},pressSequentially:{returns:"void"},scrollIntoViewIfNeeded:{returns:"void"},screenshot:{returns:"bytes"},selectOption:{returns:"json"},setInputFiles:{returns:"void"},tap:{returns:"void"},textContent:{returns:"json"},type:{returns:"void"},uncheck:{returns:"void"},waitFor:{returns:"void"}},frame:{addScriptTag:{returns:"void"},addStyleTag:{returns:"void"},childFrames:{returns:"frame[]"},content:{returns:"json"},evaluate:{returns:"json",requiresStringSource:!0},frameLocator:{returns:"frameLocator"},getByAltText:{returns:"locator"},getByLabel:{returns:"locator"},getByPlaceholder:{returns:"locator"},getByRole:{returns:"locator"},getByTestId:{returns:"locator"},getByText:{returns:"locator"},getByTitle:{returns:"locator"},goto:{returns:"void"},isDetached:{returns:"json"},locator:{returns:"locator"},name:{returns:"json"},page:{returns:"page"},parentFrame:{returns:"frame"},setContent:{returns:"void"},title:{returns:"json"},url:{returns:"json"},waitForFunction:{returns:"void",requiresStringSource:!0},waitForLoadState:{returns:"void"},waitForNavigation:{returns:"void"},waitForTimeout:{returns:"void"},waitForURL:{returns:"void"}},frameLocator:{getByAltText:{returns:"locator"},getByLabel:{returns:"locator"},getByPlaceholder:{returns:"locator"},getByRole:{returns:"locator"},getByTestId:{returns:"locator"},getByText:{returns:"locator"},getByTitle:{returns:"locator"},locator:{returns:"locator"},owner:{returns:"locator"}}};function I($){throw new KQ($)}function z0($){if(!$||typeof $!=="object"||Array.isArray($))return!1;let Z=Object.getPrototypeOf($);return Z===Object.prototype||Z===null}function z9($,Z=0,Q={nodes:0}){if(Z>VQ||++Q.nodes>HQ)I("hands_repl_json_too_complex");if($===null||typeof $==="boolean"||typeof $==="string")return;if(typeof $==="number"){if(!Number.isFinite($))I("hands_repl_invalid_json");return}if(Array.isArray($)){for(let X of $)z9(X,Z+1,Q);return}if(!z0($))I("hands_repl_invalid_json");for(let[X,J]of Object.entries($)){if(FQ.has(X))I("hands_repl_invalid_json");z9(J,Z+1,Q)}}function o8($){return typeof $==="string"&&Object.hasOwn(UQ,$)}function R1($){if(!$.endsWith("[]"))return null;let Z=$.slice(0,-2);return o8(Z)?Z:null}function GQ($){return z0($)&&Object.keys($).length===2&&$.$handsRepl==="bytes"&&typeof $.base64==="string"}function E1($){return z0($)&&Object.keys($).length===1&&$.$handsRepl==="undefined"}function zQ($){return z0($)&&Object.keys($).length===2&&$.$handsRepl==="routeFulfill"&&"options"in $}function k0($){return!!$&&typeof $==="object"}function X8(){return Object.freeze({$handsRepl:"undefined"})}function S1($){if(!G9.isBuffer($)&&!($ instanceof Uint8Array))I("hands_repl_expected_bytes");return Object.freeze({$handsRepl:"bytes",base64:G9.from($).toString("base64")})}function WQ($){if(!k0($.browser)||!k0($.context)||!k0($.page))I("hands_repl_invalid_roots");if(typeof $.a11y!=="function"||typeof $.view!=="function")I("hands_repl_invalid_callbacks");let Z=$.maxHandles??A1;if(!Number.isInteger(Z)||Z<3||Z>1e5)I("hands_repl_invalid_handle_limit");let Q=new Map,X=new WeakMap,J=$.createOpaqueId??_1,Y=(K,L)=>{if(!k0(L))I("hands_repl_expected_target");let W=X.get(L)?.get(K);if(W)return W;if(Q.size>=Z)I("hands_repl_handle_limit");let U="";for(let C=0;C<16;C+=1){let A=`hands_${J()}`;if(YQ.test(A)&&!Q.has(A)){U=A;break}}if(!U)I("hands_repl_invalid_opaque_id");let j=Object.freeze({$handsRepl:"handle",id:U,kind:K});Q.set(U,{kind:K,target:L});let O=X.get(L);if(!O)O=new Map,X.set(L,O);return O.set(K,j),j},z=Object.freeze({browser:Y("browser",$.browser),context:Y("context",$.context),page:Y("page",$.page)}),F=(K)=>{if(!z0(K)||Object.keys(K).length!==3||K.$handsRepl!=="handle"||typeof K.id!=="string"||!YQ.test(K.id)||!o8(K.kind))I("hands_repl_invalid_handle");let L=Q.get(K.id);if(!L||L.kind!==K.kind)I("hands_repl_unknown_handle");return L},G=(K,L=0,W=new Set)=>{if(L>VQ)I("hands_repl_json_too_complex");if(K===void 0)return X8();if(K===null||typeof K==="boolean"||typeof K==="string")return K;if(typeof K==="number"){if(!Number.isFinite(K))I("hands_repl_non_json_result");return K}if(Array.isArray(K)){if(W.has(K))I("hands_repl_cyclic_result");W.add(K);try{return K.map((U)=>G(U,L+1,W))}finally{W.delete(K)}}if(!z0(K))I("hands_repl_non_json_result");if(W.has(K))I("hands_repl_cyclic_result");W.add(K);try{let U=Object.create(null);for(let j of Object.keys(K)){let O=Object.getOwnPropertyDescriptor(K,j);if(!O||!("value"in O))continue;U[j]=G(O.value,L+1,W)}return U}finally{W.delete(K)}},V=(K,L)=>{if(L==="void")return X8();if(L==="json")return G(K);if(L==="bytes")return S1(K);let W=R1(L);if(W){if(!Array.isArray(K))I("hands_repl_expected_target_list");if(W==="context"&&K.some((U)=>U!==$.context))I("hands_repl_foreign_context");return K.map((U)=>Y(W,U))}if(K===null||K===void 0)return X8();if(!o8(L))I("hands_repl_invalid_return_kind");if(L==="context"&&K!==$.context)I("hands_repl_foreign_context");return Y(L,K)},B=(K)=>{if(z0(K)&&K.$handsRepl==="handle")return F(K).target;if(GQ(K))return G9.from(K.base64,"base64");if(E1(K))return;if(zQ(K))I("hands_repl_route_fulfill_only");if(Array.isArray(K))return K.map(B);if(!z0(K))return K;let L=Object.create(null);for(let[W,U]of Object.entries(K))L[W]=B(U);return L};return Object.freeze({roots:z,dispatch:async(K)=>{if(!z0(K)||typeof K.type!=="string")I("hands_repl_invalid_request");if(K.type==="a11y"){let T=K.target===void 0?Q.get(z.page.id):F(K.target);if(!T||T.kind!=="page"&&T.kind!=="locator")I("hands_repl_invalid_a11y_target");return G(await $.a11y(T.target))}if(K.type==="view"){if(z9(K.source),K.options!==void 0)z9(K.options);let T=GQ(K.source)?G9.from(K.source.base64,"base64"):K.source;if($.privateProfile&&!G9.isBuffer(T))I("hands_repl_profile_requires_image_bytes");return G(await $.view(T,K.options))}if(K.type!=="call")I("hands_repl_invalid_request");if(typeof K.method!=="string"||K.method.length===0||K.method.length>128)I("hands_repl_invalid_method");if(FQ.has(K.method))I("hands_repl_forbidden_method");let L=F(K.target),W=K.args??[];if(!Array.isArray(W))I("hands_repl_invalid_arguments");if(z9(W),L.kind==="page"&&K.method==="captureScreenshot"){if(W.length!==0)I("hands_repl_invalid_arguments");if(!$.screenshotExport)I("hands_repl_screenshot_export_unavailable");return G(await $.screenshotExport(L.target))}if(L.kind==="context"&&["startRecording","stopRecording"].includes(K.method)){if(!$.recording||L.target!==$.context)I("hands_repl_recording_unavailable");if(W.length>(K.method==="startRecording"?1:0))I("hands_repl_invalid_arguments");return G(K.method==="startRecording"?await $.recording.start(W[0]):await $.recording.stop())}if($.privateProfile){let T=K.method;if(["evaluate","evaluateAll","waitForFunction","addInitScript","addScriptTag","addStyleTag","setContent","setInputFiles","route","content","cookies","storageState","addCookies","clearCookies","setExtraHTTPHeaders","setHTTPCredentials","grantPermissions","clearPermissions","innerHTML","textContent","allTextContents"].includes(T)||L.kind==="browser"&&T==="close"||L.kind==="context"&&T==="close")I("hands_repl_private_profile_method_denied");if(L.kind==="browser"&&T==="contexts")return V([$.context],"context[]");if((T==="screenshot"||T==="pdf")&&z0(W[0])&&(("path"in W[0])||("style"in W[0])))I("hands_repl_private_profile_path_denied");if(T==="goto"){if(typeof W[0]!=="string")I("hands_repl_private_profile_url_denied");try{let S=new URL(W[0]);if(!["http:","https:"].includes(S.protocol)&&W[0]!=="about:blank")I("hands_repl_private_profile_url_denied")}catch{I("hands_repl_private_profile_url_denied")}}if(T==="getAttribute"&&(typeof W[0]!=="string"||!x1.has(W[0].toLowerCase())))I("hands_repl_private_profile_attribute_denied");if(L.kind==="locator"&&["innerText","allInnerTexts","getAttribute"].includes(T)){let S=[L.target];if(T==="allInnerTexts"){let m=Reflect.get(L.target,"all");if(typeof m!=="function")I("hands_repl_private_profile_probe_unavailable");let E=await Reflect.apply(m,L.target,[]);if(!Array.isArray(E)||E.length>HQ||!E.every(k0))I("hands_repl_private_profile_probe_unavailable");S=E}for(let m of S){let E=Reflect.get(m,"isVisible");if(typeof E!=="function"||!await Reflect.apply(E,m,[]))I("hands_repl_private_profile_hidden_value_denied")}}if(T==="press"&&typeof W[0]==="string"&&P1(W[0]))I("hands_repl_private_profile_browser_shortcut_denied");if(L.kind==="locator"&&["inputValue","click","dblclick","tap","press"].includes(T)){let S=Reflect.get(L.target,"evaluate");if(typeof S!=="function")I("hands_repl_private_profile_probe_unavailable");let m=await Reflect.apply(S,L.target,[I1]);if(!z0(m)||typeof m.password!=="boolean"||typeof m.executableLink!=="boolean")I("hands_repl_private_profile_probe_unavailable");if(T==="inputValue"&&m.password)I("hands_repl_private_profile_password_denied");if(T!=="inputValue"&&m.executableLink)I("hands_repl_private_profile_url_denied");if(T==="inputValue"){let E=Reflect.get(L.target,"isVisible");if(typeof E!=="function"||!await Reflect.apply(E,L.target,[]))I("hands_repl_private_profile_hidden_value_denied")}}}let U=UQ[L.kind][K.method];if(!U)I("hands_repl_method_not_allowed");if(U.requiresStringSource&&typeof W[0]!=="string")I("hands_repl_string_source_required");if(L.kind==="browser"&&K.method==="contexts")return[z.context];if(["addInitScript","addScriptTag","addStyleTag","screenshot","pdf","storageState"].includes(K.method)&&W.some((T)=>z0(T)&&("path"in T)))I("hands_repl_file_path_not_allowed");if(K.method==="goto"&&typeof W[0]==="string"){let T;try{T=new URL(W[0]).protocol}catch{I("hands_repl_invalid_url")}if(!["http:","https:","data:","about:","blob:"].includes(T))I("hands_repl_file_path_not_allowed")}if(U.special==="contextViewportSize"){let T=Reflect.get(L.target,"pages");if(typeof T!=="function")I("hands_repl_method_unavailable");let S=await Reflect.apply(T,L.target,[]),m=Array.isArray(S)?S[0]:void 0,E=k0(m)?Reflect.get(m,"viewportSize"):void 0;if(typeof E!=="function")return X8();return V(await Reflect.apply(E,m,[]),U.returns)}if(U.special==="property"){let T=Reflect.get(L.target,K.method);return V(typeof T==="function"?Reflect.apply(T,L.target,[]):T,U.returns)}let j=Reflect.get(L.target,K.method);if(typeof j!=="function")I("hands_repl_method_unavailable");if(U.special==="route"){let T=W[1];if(!zQ(T))I("hands_repl_invalid_route_handler");z9(T.options);let S=B(T.options),m=async(M)=>{if(!k0(M))I("hands_repl_invalid_route");let D=Reflect.get(M,"fulfill");if(typeof D!=="function")I("hands_repl_invalid_route");await Reflect.apply(D,M,[S])},E=[B(W[0]??null),m],N=await Reflect.apply(j,L.target,E);return V(N,U.returns)}let O=W.map(B);if(K.method==="setInputFiles"){let T=L.kind==="locator"?0:1,S=async(E)=>{if(typeof E!=="string"){if(!z0(E)||typeof E.name!=="string"||typeof E.mimeType!=="string"||!G9.isBuffer(E.buffer))I("hands_repl_invalid_file_input");return E}if(!$.readWorkspaceFile)I("hands_repl_workspace_required");return $.readWorkspaceFile(E)},m=O[T];O[T]=Array.isArray(m)?await Promise.all(m.map(S)):await S(m)}if(K.method==="goto")await $.beforeNavigation?.();let C=$.actionRecorder?.(),A=await Reflect.apply(j,L.target,O),P={click:"Click browser element",tap:"Click browser element",dblclick:"Double click browser element",fill:"Type text",type:"Type text",pressSequentially:"Type text",clear:"Clear browser field",press:"Press key",scrollIntoViewIfNeeded:"Scroll browser element into view",dragTo:"Drag on computer",selectOption:"Select browser option",check:"Check browser control",uncheck:"Uncheck browser control",hover:"Hover browser element",focus:"Focus browser element",goto:"Open browser page",reload:"Reload browser page",goBack:"Go back in browser",goForward:"Go forward in browser",screenshot:"Take browser screenshot"}[K.method];if(P){let T=Reflect.get(L.target,"page"),S=L.kind==="page"?L.target:typeof T==="function"?Reflect.apply(T,L.target,[]):void 0;C?.(P,k0(S)?S:void 0)}return V(A,U.returns)}})}import{isIP as jQ}from"net";import{Resolver as w1}from"dns/promises";import{isIP as Y8}from"net";var b1=[["0.0.0.0",8],["10.0.0.0",8],["100.64.0.0",10],["127.0.0.0",8],["169.254.0.0",16],["172.16.0.0",12],["192.0.0.0",24],["192.0.2.0",24],["192.168.0.0",16],["198.18.0.0",15],["198.51.100.0",24],["203.0.113.0",24],["224.0.0.0",4],["240.0.0.0",4]];function r8($){if(Y8($)!==4)return null;let Z=$.split(".");if(Z.length!==4)return null;let Q=0;for(let X of Z){let J=Number(X);if(!Number.isInteger(J)||J<0||J>255)return null;Q=Q*256+J}return Q>>>0}function k1($,Z,Q){let X=r8(Z);if(X===null)return!1;let J=Q===0?0:4294967295<<32-Q>>>0;return($&J)>>>0===(X&J)>>>0}function BQ($){let Z=r8($);if(Z===null)return!0;return b1.some(([Q,X])=>k1(Z,Q,X))}function f1($){if(Y8($)!==6)return null;let Z=$.toLowerCase(),Q=Z.indexOf("%");if(Q>=0)Z=Z.slice(0,Q);let X=[],J=Z.lastIndexOf(":"),Y=J>=0?Z.slice(J+1):"";if(Y.includes(".")){let K=r8(Y);if(K===null)return null;X=[K>>>16&65535,K&65535],Z=Z.slice(0,J+1)+"0:0"}let z=Z.split("::");if(z.length>2)return null;let F=(K)=>{if(K==="")return[];let L=[];for(let W of K.split(":")){if(W===""||W.length>4||!/^[0-9a-f]+$/.test(W))return null;L.push(Number.parseInt(W,16))}return L},G=F(z[0]??"");if(G===null)return null;if(z.length===1){let K=G;if(K.length!==8)return null;return X.length>0?K.slice(0,6).concat(X):K}let V=F(z[1]??"");if(V===null)return null;let B=8-G.length-V.length;if(B<0)return null;let H=G.concat(Array(B).fill(0),V);if(H.length!==8)return null;return X.length>0?H.slice(0,6).concat(X):H}function m1($,Z){return`${$>>8&255}.${$&255}.${Z>>8&255}.${Z&255}`}function y1($){let Z=f1($);if(Z===null)return!0;let[Q,X,J]=Z;if((Q&57344)!==8192)return!0;if(Q===8193&&(X&65024)===0)return!0;if(Q===8193&&X===3512)return!0;if(Q===16383&&(X&61440)===0)return!0;if(Q===8194)return BQ(m1(X,J));return!1}function LQ($){return $.replace(/^\[|\]$/g,"")}function J8($){let Z=LQ($.trim()),Q=Y8(Z);if(Q===4)return BQ(Z);if(Q===6)return y1(Z);return!0}function NQ($){if($ instanceof Error&&$.name==="TimeoutError")return"dns_timeout";switch(typeof $==="object"&&$!==null&&"code"in $?$.code:void 0){case"ENOTFOUND":return"dns_not_found";case"ENODATA":return"dns_empty";case"EAI_AGAIN":case"ESERVFAIL":case"ECONNREFUSED":return"dns_temporary";case"ETIMEOUT":case"ETIMEDOUT":return"dns_timeout";default:return"dns_failed"}}var MQ=5000;function g1($){return async(Z,Q)=>{if(Q?.aborted)throw Error("aborted");let X=new w1({timeout:MQ,tries:1});if($)X.setServers($);let J=()=>X.cancel();Q?.addEventListener("abort",J,{once:!0});try{let[Y,z]=await Promise.allSettled([X.resolve4(Z),X.resolve6(Z)]),F=[...Y.status==="fulfilled"?Y.value:[],...z.status==="fulfilled"?z.value:[]];if(F.length>0)return F;let G=[Y,z].flatMap((B)=>B.status==="rejected"?[B.reason]:[]);throw G.find((B)=>["dns_temporary","dns_timeout"].includes(NQ(B)))??G[0]??Object.assign(Error("DNS returned no addresses"),{code:"ENODATA"})}finally{Q?.removeEventListener("abort",J)}}}var h1=g1();async function v1($,Z,Q,X){if(X?.aborted)throw Error("aborted");let J=new AbortController,Y,z,F=Z($,J.signal);F.catch(()=>{});try{return await Promise.race([F,new Promise((G,V)=>{if(Y=setTimeout(()=>V(new DOMException("DNS lookup timed out","TimeoutError")),Q),X)z=()=>V(Error("aborted")),X.addEventListener("abort",z,{once:!0})})])}finally{if(Y!==void 0)clearTimeout(Y);if(X&&z)X.removeEventListener("abort",z);J.abort()}}async function b5($,Z=h1,Q){let X=LQ($);if(Y8(X))return J8(X)?{ok:!1,reason:"non_public_ip"}:{ok:!0,addresses:[X]};let J;try{J=await v1(X,Z,MQ,Q)}catch(Y){return{ok:!1,reason:Q?.aborted?Q.reason instanceof Error&&Q.reason.name==="TimeoutError"?"dns_timeout":"aborted":NQ(Y)}}if(J.length===0)return{ok:!1,reason:"dns_empty"};if(J.some(J8))return{ok:!1,reason:"non_public_ip"};return{ok:!0,addresses:J}}var c1=/^(?:\*\.)?[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?$/;function t8($){return $.length<=253&&c1.test($.toLowerCase())}function d1($,Z){let Q=$.trim().toLowerCase();if(!t8(Q))return!1;if(Q.startsWith("*.")){let X=Q.slice(2);return Z===X||Z.endsWith(`.${X}`)}return Q===Z}function p1($){let Z=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec($);if(!Z)return null;let Q=Z.slice(1).map(Number);return Q.some((X)=>X>255)?null:Q}function e8($,Z=[]){let Q=(X)=>{if(X=X.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.$/,""),!X.includes(":"))return X;try{X=new URL(`http://[${X}]/`).hostname.slice(1,-1)}catch{return X}let J=/^::ffff:([\da-f]+):([\da-f]+)$/.exec(X);if(!J)return X;let Y=parseInt(J[1],16),z=parseInt(J[2],16);return`${Y>>8}.${Y&255}.${z>>8}.${z&255}`};return Z.some((X)=>Q(X)===Q($))}function l0($){$=$.toLowerCase().replace(/^\[|\]$/g,"");let Z=p1($);if(Z){let[Y,z,F]=Z;if(Y===127)return"loopback";return Y===0||Y===10||Y>=224||Y===100&&z>=64&&z<=127||Y===169&&z===254||Y===172&&z>=16&&z<=31||Y===192&&(z===168||z===0&&(F===0||F===2)||z===88&&F===99)||Y===198&&(z===18||z===19||z===51&&F===100)||Y===203&&z===0&&F===113?"private":"public"}if(!$.includes(":"))return"hostname";try{$=new URL(`http://[${$}]/`).hostname.slice(1,-1)}catch{return"private"}if($==="::1")return"loopback";let Q=/^::ffff:([\da-f]+):([\da-f]+)$/.exec($);if(Q){let Y=parseInt(Q[1],16),z=parseInt(Q[2],16);return l0(`${Y>>8}.${Y&255}.${z>>8}.${z&255}`)==="public"?"public":"private"}let[X,J=0]=$.split(":").map((Y)=>parseInt(Y||"0",16));return X<8192||X>16383||X===8194||X===8193&&(J<512||J===3512)||X===16383&&J<4096?"private":"public"}function S9($,Z){let Q;try{Q=new URL($)}catch{return{allowed:!1,url:$,host:null,reason:"invalid_url"}}if(["about:","data:","blob:"].includes(Q.protocol))return{allowed:!0,url:$,host:null,reason:"local_document"};if(!["http:","https:","ws:","wss:"].includes(Q.protocol))return{allowed:!1,url:$,host:Q.hostname||null,reason:"unsupported_protocol"};let X=Q.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.$/,"");if(Z.mode==="off")return{allowed:!0,url:$,host:X,reason:"policy_off"};let J=(F)=>({allowed:!1,url:$,host:X,reason:F});if(Q.username||Q.password)return J("invalid_url");if(Z.mode==="public_web"){let F=l0(X)!=="public"&&l0(X)!=="hostname"||X==="localhost"||/\.(?:localhost|local|internal|arpa)$/.test(X)||!X.includes(".")&&!jQ(X)||Boolean(jQ(X)&&J8(X));return{allowed:!F,url:$,host:X,reason:F?"private_network":"public_web"}}let Y=Number(Q.port||(["https:","wss:"].includes(Q.protocol)?443:80));if(Z.deniedPorts?.includes(Y)||e8(X,Z.deniedHosts))return J("destination_not_allowed");let z=l0(X);if(z==="private"||["local","internal","arpa"].some((F)=>X===F||X.endsWith(`.${F}`)))return J("private_network");if(z==="loopback"||X==="localhost"||X.endsWith(".localhost"))return Z.allowedLoopbackPorts?.includes(Y)?{allowed:!0,url:$,host:X,reason:"loopback"}:J("destination_not_allowed");if(Z.allowedDomains.some((F)=>d1(F,X)))return{allowed:!0,url:$,host:X,reason:"allowed_domain"};return{allowed:!1,url:$,host:X,reason:"destination_not_allowed"}}import CQ from"child_process";import{accessSync as l1,constants as s1,readFileSync as n1,statSync as OQ}from"fs";import{createRequire as DQ}from"module";import{homedir as $$}from"os";import{dirname as i1,isAbsolute as Z$,join as s0,resolve as a1,win32 as o1}from"path";var G8=Object.freeze({schemaVersion:1,driver:"playwright-core",driverVersion:TQ.dependencies["playwright-core"],browser:"chromium"}),_Q=["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","/Applications/Brave Browser.app/Contents/MacOS/Brave Browser","/Applications/Chromium.app/Contents/MacOS/Chromium"],Q$=["/usr/bin/chromium","/usr/bin/chromium-browser","/usr/bin/google-chrome","/usr/bin/google-chrome-stable"];function r1($=process.env){let Z=[$.ProgramFiles??"C:\\Program Files",$["ProgramFiles(x86)"]??"C:\\Program Files (x86)"],Q=$.LOCALAPPDATA?[$.LOCALAPPDATA]:[],X=(J,...Y)=>J.map((z)=>o1.join(z,...Y));return[...X([...Z,...Q],"Google","Chrome","Application","chrome.exe"),...X(Z,"Microsoft","Edge","Application","msedge.exe"),...X([...Z,...Q],"BraveSoftware","Brave-Browser","Application","brave.exe")]}function w9($){try{return l1($,s1.X_OK),Z$($)&&OQ($).isFile()}catch{return!1}}function X$($,Z=process.platform){let Q=Z==="darwin"?_Q:Z==="linux"?Q$:Z==="win32"?r1():null;return Q?($??Q).find(w9)??null:null}function t1(){if(!process.versions.bun)return;let $=Symbol.for("ara.headless-browser.bun-pipe-owners");if(Object.hasOwn(globalThis,$))return;let Z=[];CQ.spawn=new Proxy(CQ.spawn,{apply(Q,X,J){let Y=Reflect.apply(Q,X,J),z=J[1],F=J[2]?.stdio;if(Array.isArray(z)&&z.includes("--remote-debugging-pipe")&&Array.isArray(F)&&F[3]==="pipe"&&F[4]==="pipe")Z.push(Y);return Y}}),Object.defineProperty(globalThis,$,{value:Z})}async function z8($){if(t1(),$!==void 0){if(!Z$($))throw Error("hands_browser_driver_path_must_be_absolute");let X=s0($,"package.json"),J=JSON.parse(n1(X,"utf8"));if(J.name!==G8.driver)throw Error("hands_browser_wrong_driver");let Y=DQ(X)($),z=Y.default?.chromium??Y.chromium;if(!z)throw Error("hands_browser_missing_chromium");return{version:J.version,chromium:z}}let[Z,Q]=await Promise.all([import("./index-7f2kwwen.js"),import("./package-smk3nqjs.js").then((m)=>u1(m.default,1))]);return{version:Q.default.version,chromium:Z.chromium}}var e1=($,Z=G8.driverVersion)=>({status:"unavailable",reason:$,expectedDriverVersion:Z}),$7=($)=>$.loadDriver?.()??z8($.driverModuleDirectory),Z7={"1.60.0":"1223"};function u5(){let $=process.platform,Z=Z7[G8.driverVersion];if(!Z||$!=="linux"&&$!=="darwin"&&$!=="win32")return!1;let Q=(X)=>process.env[X]??process.env[`npm_config_${X.toLowerCase()}`]??process.env[`npm_package_config_${X.toLowerCase()}`];try{let X=Q("PLAYWRIGHT_BROWSERS_PATH"),J=X==="0"?s0(i1(DQ(import.meta.url).resolve("playwright-core/package.json")),".local-browsers"):X?a1(Q("INIT_CWD")||process.cwd(),X):s0($==="darwin"?s0($$(),"Library","Caches"):$==="win32"?process.env.LOCALAPPDATA||s0($$(),"AppData","Local"):process.env.XDG_CACHE_HOME||s0($$(),".cache"),"ms-playwright");return OQ(s0(J,`chromium-${Z}`,"INSTALLATION_COMPLETE")).isFile()}catch{return!1}}async function K9($={}){return AQ($,G8.driverVersion)}async function J$($,Z={}){if($.driverVersion!=="1.61.1"||!Z$($.driverModuleDirectory))throw Error("hands_browser_invalid_managed_compatibility");return AQ({...Z,driverModuleDirectory:$.driverModuleDirectory,allowSystemBrowser:!0},$.driverVersion)}async function AQ($,Z){let Q=(G)=>e1(G,Z),X=$.platform??process.platform;if(X!=="linux"&&X!=="darwin"&&X!=="win32")return Q("unsupported_platform");let J;try{J=await $7($)}catch{return Q("driver_missing")}if(J.version!==Z)return Q("driver_version_mismatch");let Y=(G,V)=>({status:"resolved",executablePath:G,source:V,driverVersion:J.version});if($.executablePath!==void 0)return w9($.executablePath)?Y($.executablePath,"configured"):Q("executable_missing");let z=J.chromium.executablePath();if(w9(z))return Y(z,"managed");let F=$.allowSystemBrowser===!0?X$($.systemCandidates,X):null;return F?Y(F,"system"):Q("executable_missing")}var B7=["/usr/local/bin/chromium",...Q$];function L7($,Z=wQ()){return X$($??(Z==="linux"?B7:void 0),Z)}async function N7(){try{return(await z8()).chromium}catch{return F7(import.meta.url)("playwright-core").chromium}}var M7=1048576,j7=105000,q7=20000,IQ=5000,C7=2000,T7=1000,O7=30000,RQ=81920,D7={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".gif":"image/gif"};async function _7($,Z){let Q=new URL($.url()),X={...await $.allHeaders(),host:Q.host};for(let J of Object.keys(X))if(/^(?:proxy-|connection$|upgrade$|transfer-encoding$|content-length$)/i.test(J))delete X[J];return new Promise((J,Y)=>{let F=(Q.protocol==="https:"?H7:V7)(Q,{method:$.method(),headers:X,agent:!1,lookup:(V,B,H)=>{let K=n0.isIP(Z);if(B.all)H(null,[{address:Z,family:K}]);else H(null,Z,K)}},(V)=>{let B=[],H=0;V.on("data",(K)=>{if(H+=K.length,H>33554432)F.destroy(Error("hands_browser_response_too_large"));else B.push(K)}),V.on("error",Y),V.on("end",()=>{let K={};for(let[L,W]of Object.entries(V.headers))if(W!==void 0&&!["transfer-encoding","connection","content-length"].includes(L))K[L]=Array.isArray(W)?W.join(`
|
|
306
|
+
`):W;J({status:V.statusCode??502,headers:K,body:Buffer.concat(B)})})}),G=setTimeout(()=>F.destroy(Error("hands_browser_fetch_timeout")),O7);F.once("close",()=>clearTimeout(G)),F.on("error",Y),F.end($.postDataBuffer()??void 0)})}async function A7($,Z,Q=()=>{},X={lookup:(J)=>K7(J,{all:!0}),fetch:_7}){let J=new WeakSet,Y=new WeakMap,z=(F)=>{let G=Y.get(F);if(G)return G;let V=(async()=>{if(!$.newCDPSession)return;let B=await $.newCDPSession(F),H=new Map;B.on("Network.loadingFinished",({requestId:K})=>H.delete(K)),B.on("Network.loadingFailed",({requestId:K})=>H.delete(K)),B.on("Fetch.requestPaused",async(K)=>{let L=K.networkId??K.requestId,W=K.redirectedRequestId?(H.get(L)??0)+1:0;H.set(L,W);let U=S9(K.request.url,Z),j=Z.mode==="enforce"&&Boolean(K.redirectedRequestId)&&U.host!==null&&!n0.isIP(U.host),O=!U.allowed?U:j?{...U,allowed:!1,reason:"destination_not_allowed"}:W>20?{...U,allowed:!1,reason:"redirect_not_supported"}:null;try{if(O)Q(O),await B.send("Fetch.failRequest",{requestId:K.requestId,errorReason:"BlockedByClient"});else await B.send("Fetch.continueRequest",{requestId:K.requestId})}catch{await B.send("Fetch.failRequest",{requestId:K.requestId,errorReason:"Failed"}).catch(()=>{})}}),await B.send("Network.enable"),await B.send("Fetch.enable",{patterns:[{urlPattern:"*",requestStage:"Request"}]}),J.add(F)})();return Y.set(F,V),V};return await $.route("**/*",async(F)=>{let G=F.request().url(),V=S9(G,Z);if(V.allowed&&Z.mode==="public_web"){await F.continue();return}let B=F.request();if(V.allowed&&V.host&&n0.isIP(V.host)&&B.isNavigationRequest?.()){let H=B.frame();if(J.has(H.page())&&H===H.page().mainFrame()){await F.continue();return}}if(V.allowed&&(Z.mode==="off"||V.reason==="local_document")){await F.continue();return}if(V.allowed&&V.host)try{let H=V.host,K=l0(H),L,W=await(async()=>{if(K!=="hostname")return[{address:H,family:n0.isIP(H)}];if(V.reason==="loopback")return[{address:"127.0.0.1",family:4}];try{return await Promise.race([X.lookup(H),new Promise((U,j)=>{L=setTimeout(()=>j(Error("hands_browser_dns_timeout")),5000)})])}finally{if(L)clearTimeout(L)}})();if(!W.length||W.some(({address:U})=>{let j=l0(U);return!n0.isIP(U)||Z.mode==="enforce"&&e8(U,Z.deniedHosts)||(V.reason==="loopback"?j!=="loopback":j!=="public")}))V={...V,allowed:!1,reason:"private_network"};else{let U=await X.fetch(F.request(),W[0].address);if(U.status>=300&&U.status<400){let j=U.headers.location??G;try{j=new URL(j,G).href}catch{}let O=S9(j,Z);V=O.allowed?{...O,allowed:!1,reason:"redirect_not_supported"}:O}else{await F.fulfill(U);return}}}catch{await F.abort("failed");return}Q(V),await F.abort("blockedbyclient")}),await $.routeWebSocket("**/*",async(F)=>{let G=S9(F.url(),Z);if(Z.mode==="enforce"&&G.allowed&&(!G.host||!n0.isIP(G.host)))G={...G,allowed:!1,reason:"destination_not_allowed"};if(G.allowed){F.connectToServer();return}Q(G),await F.close({code:1008,reason:"Reason egress policy denied"})}),Z.mode==="off"?void 0:{preparePage:z}}async function bQ($,Z=wQ(),Q){if(Q){let J=await J$(Q,{platform:Z,systemCandidates:$});return J.status==="resolved"?J.executablePath:null}if($!==void 0){let J=L7($,Z);if(J)return J}let X=await K9({platform:Z,systemCandidates:$,allowSystemBrowser:!0});return X.status==="resolved"?X.executablePath:null}function EQ($,Z){if(!$)throw Error("hands_repl_workspace_required");let Q=G$($),X=F9($),J=z$(X,F9(X,Z)),z=J!==".."&&!J.startsWith(`..${K$}`)&&!PQ(J)?F9(Q,J):F9(Q,Z);if(b0(F9(X,Z))||b0(z))throw Error("hands_repl_protected_path");let F=(W)=>{let U=z$(Q,W);return U!==""&&U!==".."&&!U.startsWith(`..${K$}`)&&!PQ(U)},G=G$(z);if(b0(G))throw Error("hands_repl_protected_path");if(!F(z)||!F(G))throw Error("hands_repl_file_outside_workspace");let V=z$(Q,z).split(K$),B=[Q,...V.map((W,U)=>F9(Q,...V.slice(0,U+1)))],H=B.map((W)=>xQ(W));if(H.some((W)=>W.isSymbolicLink()))throw Error("hands_repl_file_symlink");let K=H[H.length-1];if(!K.isFile()||K.nlink!==1||K.size>16777216)throw Error("hands_repl_file_not_regular_or_too_large");let L=Y7(z,Y$.O_RDONLY|Y$.O_NOFOLLOW|Y$.O_NONBLOCK);try{let W=J7(L);if(W.dev!==K.dev||W.ino!==K.ino||!W.isFile())throw Error("hands_repl_file_changed");for(let C=0;C<B.length;C++){let A=xQ(B[C]);if(A.dev!==H[C].dev||A.ino!==H[C].ino||A.isSymbolicLink())throw Error("hands_repl_file_changed")}if(!F(G$(z)))throw Error("hands_repl_file_outside_workspace");let U=Buffer.alloc(16777217),j=0;while(j<U.length){let C=G7(L,U,j,U.length-j,null);if(!C)break;j+=C}if(j===U.length)throw Error("hands_repl_file_too_large");let O=U.subarray(0,j);return{name:U7(z),mimeType:D7[W7(z).toLowerCase()]??"application/octet-stream",buffer:O}}finally{X7(L)}}function V9($,Z){$.end(`${JSON.stringify(Z)}
|
|
307
|
+
`)}function K8($){try{z7($)}catch{}}async function kQ($){if($.managedBrowser&&$.driverModuleDirectory!==void 0)throw Error("hands_browser_ambiguous_driver_configuration");let Z=$.launch||$.targetContext?null:$.managedBrowser?await J$($.managedBrowser,{executablePath:$.browserExecutablePath}):await K9({executablePath:$.browserExecutablePath,driverModuleDirectory:$.driverModuleDirectory});if(Z?.status==="unavailable")throw Error(`hands_browser_${Z.reason}`);let Q=Z?.status==="resolved"?Z.executablePath:$.browserExecutablePath;if(!Q||!w9(Q))throw Error("hands_browser_unavailable");let X=$.launch??(async(N)=>($.targetContext?await N7():(await z8($.managedBrowser?.driverModuleDirectory??$.driverModuleDirectory)).chromium).launch(N)),J=[],Y={},z=null,F=null,G=null,V=null,B=!1,H=null,K=new Map,L=new WeakMap,W=null,U=()=>{if(B)throw Error("hands_repl_stopped");if(V)throw V},j=(N)=>{let M=L.get(N);if(M)return M;let D=Promise.resolve().then(()=>N.close()).then(()=>{K.delete(N)});return L.set(N,D),D},O=async()=>{let N=[...K.entries()].reverse(),M=W??=performance.now()+T7,D=Promise.allSettled(N.filter(([,_])=>_==="context").map(([_])=>j(_))),w;try{await Promise.race([D,new Promise((_)=>{w=setTimeout(_,Math.max(0,M-performance.now()))})])}finally{if(w)clearTimeout(w)}let k=await Promise.allSettled(N.map(([_])=>j(_))),f=[];for(let[_,y]of k.entries()){if(y.status!=="rejected")continue;let c=y.reason instanceof Error&&["Error","TimeoutError","ProtocolError"].includes(y.reason.name)?y.reason.name:"unknown";f.push(Error(`hands_repl_close_failed: ${N[_][1]}: ${c}`))}if(f.length)throw AggregateError(f,"hands_repl_stop_unconfirmed")},C=(N,M)=>{if(K.set(N,M),B||V)j(N).catch(()=>{return}),U();return N},A=async()=>{let N=await X({executablePath:Q,headless:!0,chromiumSandbox:$.managedBrowser===void 0,args:["--disable-background-networking","--disable-quic","--disable-dev-shm-usage","--disable-gpu","--disable-software-rasterizer","--dns-prefetch-disable","--force-webrtc-ip-handling-policy=disable_non_proxied_udp","--no-pings"]}),M=null;try{C(N,"browser"),M=$.targetContext??C(await N.newContext({viewport:{width:1440,height:900},screen:{width:1440,height:900},serviceWorkers:"block",acceptDownloads:!1}),"context");let D=await A7(M,$.networkPolicy??{mode:"off"},$.onEgressDenied);if(U(),D){let b=M.newPage.bind(M);M.newPage=async()=>{let h=await b();return await D.preparePage(h),h}}let k=M.pages()[0]??await M.newPage();await D?.preparePage(k),U();let f=async(b=k)=>{let h=b;if(typeof h.ariaSnapshot==="function")return h.ariaSnapshot({timeout:1e4});return k.locator("body").innerText({timeout:1e4})},_=async(b,h={})=>{let d=h&&typeof h==="object"&&!Array.isArray(h)?h:{},n,G0="image/png";if(Buffer.isBuffer(b)||b instanceof Uint8Array)n=Buffer.from(b);else if(typeof b==="string"&&(b.startsWith("data:")||/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(b)))n=Buffer.from(b.replace(/^data:[^,]*,/,""),"base64");else if(typeof b==="string"){let T0=EQ($.workspaceRoot,b);n=T0.buffer,G0=T0.mimeType}else throw Error("view() needs a Buffer, a base64 string, or a path to an image file");if(n.length===0)throw Error("view(): the image is empty");let M0=String(d.label??"").replace(/[\r\n>]+/g," ").trim().slice(0,120),U0=Number(d.maxWidth)||1024,W0=Number(d.quality)||72,g0=$.targetContext?await N.newPage():await M.newPage();try{let T0=`data:${G0};base64,${n.toString("base64")}`;for(let t=0;t<5;t+=1){let j0=await g0.evaluate(async(B0)=>{let q0=new Image;q0.src=B0.url,await q0.decode();let h0=Math.min(1,B0.maxWidth/q0.naturalWidth),Y0=document.createElement("canvas");Y0.width=Math.max(1,Math.round(q0.naturalWidth*h0)),Y0.height=Math.max(1,Math.round(q0.naturalHeight*h0));let X0=Y0.getContext("2d");if(!X0)throw Error("view(): canvas unavailable");return X0.fillStyle="#ffffff",X0.fillRect(0,0,Y0.width,Y0.height),X0.drawImage(q0,0,0,Y0.width,Y0.height),{data:Y0.toDataURL("image/jpeg",B0.q/100).split(",")[1]??"",width:Y0.width,height:Y0.height,sourceWidth:q0.naturalWidth,sourceHeight:q0.naturalHeight}},{url:T0,maxWidth:U0,q:W0}),e0=Buffer.from(j0.data,"base64");if(e0.length<=RQ){let B0=M0||"image";return`<<<ARA_VIEW_IMAGE ${j0.data} image/jpeg ${B0}>>>
|
|
308
|
+
Viewing ${B0} (${j0.sourceWidth}x${j0.sourceHeight} source, sent at ${j0.width}x${j0.height}, ${Math.round(e0.length/1024)}KB).`}if(U0>640)U0=Math.round(U0*0.75);else W0=Math.max(30,W0-15)}throw Error(`view(): could not reduce the image under ${Math.round(RQ/1024)}KB`)}finally{await g0.close().catch(()=>{return})}},y=WQ({browser:$.targetContext?.browser()??N,context:M,page:k,a11y:f,view:_,readWorkspaceFile:(b)=>EQ($.workspaceRoot,b),privateProfile:$.privateProfile,beforeNavigation:$.beforeNavigation,recording:$.recording,screenshotExport:$.screenshotExport,actionRecorder:()=>{let b=J,h=Y;return(d,n)=>{if(b.length<SQ)b.push(d);if(n)h.page=n}}}),c=async(b)=>{U();let h=C(await N.newContext({serviceWorkers:"block",acceptDownloads:!1}),"context");try{await h.route("**/*",(n)=>n.abort()),U(),await h.routeWebSocket("**/*",(n)=>n.close({code:1008,reason:"Reason evaluator network denied"})),U(),await h.exposeBinding("__araHandsRpc",async(n,G0)=>$.onBrowserOperation?$.onBrowserOperation(b,()=>y.dispatch(G0)):y.dispatch(G0)),U();let d=await h.newPage();return U(),await d.goto("data:text/html,<title>Reason Hands evaluator</title>"),U(),await d.evaluate(`(${XQ})(${JSON.stringify(y.roots)})`),{context:h,page:d,runId:b}}catch(d){throw await j(h).catch(()=>{return}),d}},u=await c(),r={browser:N,context:M,page:k,evaluator:u,async captureProgressFrame(b){return _(await b.screenshot({type:"jpeg",quality:65,timeout:2000}),{label:"Screen after browser action"})},async resetEvaluator(b){await j(r.evaluator.context),r.evaluator=await c(b)}};return U(),r}catch(D){throw await O().catch(()=>{return}),D}},R=async()=>{if(U(),z)return z;if(!G){F=A();let N;G=Promise.race([F,new Promise((M,D)=>{N=setTimeout(()=>D(Error("hands_browser_unavailable: startup timed out")),q7)})]).then((M)=>{return U(),z=M,M}).catch(async()=>{V=Error("hands_browser_unavailable: startup failed or timed out");let M;try{await Promise.race([O(),new Promise((D,w)=>{M=setTimeout(()=>w(Error("hands_repl_stop_timeout")),IQ)})])}catch{V=Error("hands_browser_unavailable: startup cleanup unconfirmed")}finally{if(M)clearTimeout(M)}throw V}).finally(()=>{if(N)clearTimeout(N)})}return G},P=async(N,M,D=!1)=>{let w=await R(),k=Y;if($.onBrowserOperation&&w.evaluator.runId!==M)await w.resetEvaluator(M);let _=(async()=>{let u=await w.evaluator.page.evaluate(`(${JQ})(${JSON.stringify({code:N})})`);if(typeof u!=="string")throw Error("hands_repl_invalid_evaluator_output");let r=k.page;if(D&&r&&!u.includes("<<<ARA_VIEW_IMAGE")){let b=()=>w.captureProgressFrame(r);try{let h=await($.onBrowserOperation?$.onBrowserOperation(M,b):b());return k.automaticProgressImage=!0,`${u}
|
|
309
|
+
${h}`}catch{return`${u}
|
|
310
|
+
Screen capture unavailable.`}}return u})(),y,c=new Promise((u,r)=>{y=setTimeout(()=>r(Error("REPL evaluation timed out after 105 seconds")),j7)});try{return await Promise.race([_,c])}catch(u){if(u instanceof Error&&u.message.includes("timed out"))_.catch(()=>{return}),await w.resetEvaluator(M).catch(()=>{return});throw u}finally{if(y)clearTimeout(y)}},T=Promise.resolve(),S=new Set,m=new Set;K8($.socketPath);let E=n0.createServer((N)=>{S.add(N),N.once("close",()=>{S.delete(N),m.delete(N)}),N.setEncoding("utf8");let M="",D=!1;N.on("data",(w)=>{if(D)return;if(M+=w,M.length>M7){D=!0,V9(N,{ok:!1,error:"REPL request exceeds 1 MiB"});return}let k=M.indexOf(`
|
|
311
|
+
`);if(k===-1)return;D=!0;let f=M.slice(0,k);if($.onControl)try{let _=JSON.parse(f);if(typeof _.action==="string"&&_.action!=="evaluate")m.add(N)}catch{}T=T.then(async()=>{if(N.destroyed)return;J=[],Y={};try{let _=JSON.parse(f);if(_.action==="probe"){let b=await R();await P("undefined",b.evaluator.runId),V9(N,{ok:!0,output:"ARA_HANDS_REPL_READY"});return}if(typeof _.action==="string"&&_.action!=="evaluate"&&$.onControl){V9(N,{ok:!0,output:await $.onControl(_.action,_)});return}if(_.action!=="evaluate"||typeof _.code!=="string")throw Error("Invalid REPL request");let y=_.code,c=typeof _.runId==="string"?_.runId:void 0,u=()=>P(y,c,_.includeProgressCapture===!0),r=await($.onEvaluate?$.onEvaluate(_,u):u());V9(N,{ok:!0,output:r,browserActions:J,...Y.automaticProgressImage?{automaticProgressImage:!0}:{}})}catch(_){V9(N,{ok:!1,error:_ instanceof Error?_.message:String(_),stack:_ instanceof Error?_.stack:void 0,browserActions:J})}}).catch((_)=>{V9(N,{ok:!1,error:_ instanceof Error?_.message:String(_)})})})});try{await new Promise((N,M)=>{E.once("error",M),E.listen($.socketPath,()=>{E.off("error",M);try{if(process.platform!=="win32")Q7($.socketPath,384);N()}catch(D){E.close(()=>M(D))}})})}catch(N){throw K8($.socketPath),N}return{socketPath:$.socketPath,browserExecutablePath:Q,stop(){if(H)return H;B=!0;let N=m.size?setTimeout(()=>{for(let k of m)k.destroy()},C7):void 0,M=new Promise((k)=>E.close(()=>{if(N)clearTimeout(N);k()}));for(let k of S)if(!m.has(k))k.destroy();T.catch(()=>{return});let D=async()=>{await M,K8($.socketPath);let k=[O()];if(F)k.push(F.then(()=>{return},()=>{return}));let f=await Promise.allSettled(k),_=await Promise.allSettled([O()]),y=[...f,..._].filter((c)=>c.status==="rejected");if(y.length)throw AggregateError(y.map((c)=>c.reason),"hands_repl_stop_unconfirmed")},w;return H=Promise.race([D(),new Promise((k,f)=>{w=setTimeout(()=>f(Error("hands_repl_stop_timeout")),IQ)})]).finally(()=>{if(w)clearTimeout(w);K8($.socketPath)}),H}}}var x7=["private_runtime","runtime_root","temporary_directory","granted_root","workspace_layout","jobs","browser_socket","relay_url","environment_owner","job_environment","config_write"],P7=["ENOENT","EACCES","EPERM","EINVAL","ENOTDIR","EISDIR","ELOOP","EROFS","ENOSPC","EMFILE","ENFILE","EEXIST"];function fQ($,Z){if(!$||!x7.includes($))return null;let Q=typeof Z==="object"&&Z!==null&&"code"in Z?Z.code:null;return{workspace_stage:$,workspace_errno:typeof Q==="string"&&P7.includes(Q)?Q:"unknown"}}import{lstatSync as I7,readFileSync as R7}from"fs";var E7="/run/sc/egress-guard",S7=10002,F$=10003;function mQ($=process.platform,Z=E7){if($!=="linux")return!1;try{let Q=I7(Z);if(!Q.isFile()||Q.uid!==0||(Q.mode&18)!==0)return!1;return R7(Z,"utf8")===`v1 ${S7} ${F$}
|
|
312
|
+
`}catch{return!1}}var w7=/^(\/.+)-sidechat-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/;function yQ($){let Z=w7.exec($.replace(/\/+$/,""));return Z?`${Z[1]}/repo`:null}import{randomUUID as I6}from"crypto";import{spawn as R6,spawnSync as E6}from"child_process";import{chmodSync as m9,closeSync as S6,constants as O$,fchmodSync as w6,fstatSync as b6,openSync as k6,copyFileSync as f6,existsSync as _$,lstatSync as o,statSync as y9,mkdtempSync as m6,mkdirSync as j9,realpathSync as s,renameSync as q8,rmSync as y6,writeFileSync as C8}from"fs";import{homedir as g6,tmpdir as O4}from"os";import{basename as h6,dirname as H0,join as a,resolve as D4,sep as v6}from"path";var b7={"navigation.ara-egress.invalid":"canary_navigation","fetch.ara-egress.invalid":"canary_fetch","subresource.ara-egress.invalid":"canary_subresource","codeload.github.com":"canary_redirect","websocket.ara-egress.invalid":"canary_websocket"};function gQ($){return $===null?"other":b7[$]??"other"}function V0($,Z){if($===void 0||Z===void 0)return null;let Q=Math.round(Z-$);return Number.isSafeInteger(Q)&&Q>=0&&Q<=600000?Q:null}var p="workspace_mode",f0="granted_root",L0="project_root",H9="terminal_root",U9="terminal_benchmark_tool_profile",k7=["bash","bash-node-repl","bash-node-repl-files"],hQ="hands_node_repl_persistent_execution_unsupported";function vQ($){return $==="bash"?null:"hands_node_repl_persistent_execution_unsupported"}function V$($){return k7.includes($)}function BJ($){return cQ($)&&$.workspace_mode==="terminal_root"&&V$($.terminal_benchmark_tool_profile)}var N0="tool_scoped_standby";function LJ($){return cQ($)&&$[N0]===!0}function cQ($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var CJ=x.object({device_id:x.string().uuid(),root_id:x.string().uuid()}),U$=/^reason\/[0-9a-f]{8}$/,f7=x.strictObject({source_path:x.string().refine(i0).optional(),branch:x.string().regex(U$)}),TJ=x.object({checkout_mode:x.enum(["worktree","direct"]).optional(),project_workspace_source:x.object({kind:x.literal("local_device"),device_id:x.string().uuid(),root_id:x.string().uuid(),path:x.string().refine(i0).optional(),worktree:f7.optional()})});import{execFile as m7}from"child_process";var y7=20000,g7=1e4,dQ=/^[0-9a-f]{40}(?:[0-9a-f]{24})?$/,h7=["-c","core.hooksPath=/dev/null","-c","core.fsmonitor=false","-c","gc.auto=0","-c","maintenance.auto=false"];async function pQ($,Z=v7){let Q=(j,O=g7)=>Z([...h7,"-C",$,...j],O),X=async(j)=>{let O=await Q(j);return O.status===0?O.stdout.trim():null},J=await X(["rev-parse","--verify","--quiet","HEAD^{commit}"]);if(!J||!dQ.test(J))return null;let Y=J.slice(0,12),z=(j)=>({commit:J,from:"head",note:`reason: started from ${j}`}),F=await X(["symbolic-ref","--quiet","HEAD"]);if(!F?.startsWith("refs/heads/"))return z(`the checkout's detached HEAD ${Y}`);let G=F.slice(11),V=await Q(["--no-optional-locks","status","--porcelain=v1","--untracked-files=no"]);if(V.status!==0||V.stdout.trim())return z(`${G} at ${Y}: the checkout has uncommitted changes, which stay there`);let B=await X(["config","--get",`branch.${G}.remote`]),H=await X(["config","--get",`branch.${G}.merge`]);if(!B||!H?.startsWith("refs/")||B.startsWith("-"))return z(`${G} at ${Y}: it has no upstream to catch up with`);let K=B==="."||(await Q(["fetch","--quiet","--no-tags","--no-write-fetch-head","--no-recurse-submodules",B,H],y7)).status===0,L=await X(["rev-parse","--abbrev-ref","--symbolic-full-name","@{upstream}"]),W=L?await X(["rev-parse","--verify","--quiet","@{upstream}^{commit}"]):null;if(!L||!W||!dQ.test(W))return z(`${G} at ${Y}: ${K?"it has no upstream to catch up with":`fetching ${B} failed`}`);if(!K)return z(`${G} at ${Y}: fetching ${L} failed, so it may be behind`);if(W===J)return z(`${G} at ${Y}, the same commit as ${L} after fetching it`);if((await Q(["merge-base","--is-ancestor",J,W])).status!==0)return z(`${G} at ${Y}: it has commits that ${L} does not`);let U=await X(["rev-list","--count",`${J}..${W}`]);return{commit:W,from:"upstream",note:`reason: started from ${L} at ${W.slice(0,12)}, fetched just now: ${G} had no commits of its own and was ${U??"some"} commits behind it`}}function v7($,Z){return new Promise((Q)=>{m7("git",$,{encoding:"utf8",timeout:Z,maxBuffer:1048576,env:{...process.env,GIT_TERMINAL_PROMPT:"0"}},(X,J)=>{let Y=X?typeof X.code==="number"?X.code:null:0;Q({status:Y,stdout:String(J??"")})})})}import{execFile as c7}from"child_process";import{lstatSync as L$,readdirSync as W$,readFileSync as sQ,realpathSync as F8,rmdirSync as uQ,unlinkSync as d7,writeFileSync as p7}from"fs";import{readFile as u7}from"fs/promises";import{join as x0,resolve as lQ}from"path";var b9=".reason-device",l7=86400000,s7=500,n7=60000;function nQ($,Z,Q){let X=Z.split("/"),J=W9.split("/");if(X.length!==J.length+2||J.some((Y,z)=>X[z]!==Y)||!V8.test(X[J.length]))return;try{let Y=iQ($,X[J.length]);p7(x0(Y,b9),Q,{flag:"wx",mode:384})}catch{}}function iQ($,Z){let Q=()=>new q("session_worktree_outside_workspace","Reason removes only Session folders in ~/.reason/workspace/sessions.");if(!V8.test(Z))throw Q();let X=x0(F8($),W9),J=x0(X,Z);if(!L$(J).isDirectory()||F8(J)!==J)throw Q();return J}async function i7($,Z,Q=o7){let X;try{X=iQ($,Z)}catch(J){if(B$(J))return!0;throw J}for(let J of W$(X,{withFileTypes:!0})){if(J.name===b9||!J.isDirectory())continue;let Y=x0(X,J.name),z=await a7(Y);if(z){let F=["-c","core.hooksPath=/dev/null","-c","core.fsmonitor=false",`--git-dir=${z}`,"worktree"];if((await Q([...F,"remove","--force",Y])).status===0)await Q([...F,"prune"])}else try{uQ(Y)}catch{}}if(W$(X).some((J)=>J!==b9))return!1;try{d7(x0(X,b9))}catch(J){if(!B$(J))throw J}return uQ(X),!0}async function a7($){try{let Z=x0($,".git");if(!L$(Z).isFile())return null;let Q=/^gitdir: (.+)$/m.exec(sQ(Z,"utf8"));if(!Q)return null;let X=lQ($,Q[1].trim());return lQ(X,(await u7(x0(X,"commondir"),"utf8")).trim())}catch{return null}}async function SJ($){let Z;try{if(Z=x0(F8($.home),W9),!L$(Z).isDirectory())return{status:"skipped",reason:"workspace_untrusted"};if(F8(Z)!==Z)return{status:"skipped",reason:"workspace_untrusted"}}catch(Y){if(B$(Y))return{status:"skipped",reason:"no_workspace"};throw Y}let Q=W$(Z,{withFileTypes:!0}).filter((Y)=>Y.isDirectory()&&V8.test(Y.name)).map((Y)=>Y.name).filter((Y)=>{try{return sQ(x0(Z,Y,b9),"utf8")===$.deviceId}catch{return!1}}).sort().slice(0,s7);if(!Q.length)return{status:"done",removed:[],kept:[],failed:[]};let X=await $.liveIds(Q);if(X===null)return{status:"skipped",reason:"server_unsupported"};let J={status:"done",removed:[],kept:Q.filter((Y)=>X.includes(Y)),failed:[]};for(let Y of Q.filter((z)=>!X.includes(z)))(await i7($.home,Y,$.runGit).catch(()=>!1)?J.removed:J.failed).push(Y);return J}function wJ($,Z,Q=l7){if(Z.aborted)return;let X=!1,J=()=>{if(X||Z.aborted)return;X=!0,$().catch(()=>{return}).finally(()=>{X=!1})},Y=setInterval(J,Q);Y.unref?.(),Z.addEventListener("abort",()=>clearInterval(Y),{once:!0}),J()}function B$($){return typeof $==="object"&&$!==null&&$.code==="ENOENT"}function o7($){return new Promise((Z)=>{c7("git",$,{encoding:"utf8",timeout:n7,maxBuffer:1048576,env:{...process.env,GIT_TERMINAL_PROMPT:"0"}},(Q,X,J)=>{let Y=Q&&typeof Q.code==="number"?Q.code:null;Z({status:Q?Y??1:0,stderr:J??""})})})}import{createHash as r7}from"crypto";import{join as t7}from"path";function e7($){return H8($)}function P0(){throw new q("environment_unavailable","The private Session environment is unavailable or stale.")}function U8($){return r7("sha256").update(JSON.stringify({...$,variables:Object.fromEntries(Object.entries($.variables).sort(([Z],[Q])=>Z.localeCompare(Q)))})).digest("hex")}function oQ($,Z){B8($);let Q=t7($,"environment.json"),X,J=new Set,Y=(F,G)=>`${G}:${F}`,z=(F)=>{let G=hZ.safeParse(F);if(!G.success)return P0();let V=G.data,B=Z.identity(),H=Date.parse(V.expires_at);if(!B||V.run_id!==Z.runId||V.device_id!==Z.deviceId||V.root_id!==Z.rootId||V.binding.kind!==Z.binding.kind||V.binding.target_revision!==Z.binding.target_revision||V.binding.root_grant_revision!==Z.binding.root_grant_revision||V.binding.target_generation!==B.generation||V.binding.target_fence_id!==B.fenceId||H<=Date.now()||H>Z.expiresAtMs||Z.expiresAtMs<=Date.now()||Object.keys(V.variables).some((K)=>!e7(K)))return P0();if(V.git){let K=new URL(Z.apiOrigin),L=new URL(V.git.base_url),W=Date.parse(V.git.expires_at);if(L.origin!==K.origin)throw new q("environment_git_origin_mismatch","The delivered Git broker is not on this worker's API origin.");if(!["/git","/git/"].includes(L.pathname)||L.username||L.password||L.search||L.hash||W<=Date.now()||W>H)return P0()}if(V.cloud_access&&!yZ(V.cloud_access,Z.apiOrigin))throw new q("environment_cloud_access_origin_mismatch","The delivered cloud access is not on this worker's API origin.");return V};return{path:Q,install(F){let G=z(F),V=U8(G);if(X&&(G.revision<X.revision||G.revision===X.revision&&(V!==X.hash||G.snapshot_id!==X.snapshotId)))return P0();if(!X||G.revision>X.revision){if(aQ(Q,G,_0.snapshotBytes),U8(z(JSON.parse(W8(Q,_0.snapshotBytes))))!==V)return P0();let B=X;if(X={revision:G.revision,hash:V,snapshotId:G.snapshot_id,generation:G.binding.target_generation},B&&B.generation<X.generation)J.add(Y(B.snapshotId,B.revision))}else if(U8(z(JSON.parse(W8(Q,_0.snapshotBytes))))!==X.hash)return P0();return{installed:!0,snapshot_id:G.snapshot_id,installed_revision:G.revision}},current(){if(!X)return P0();try{let F=z(JSON.parse(W8(Q,_0.snapshotBytes)));if(U8(F)!==X.hash)return P0();return F}catch{return P0()}},carried:(F,G)=>J.has(Y(F,G))}}var B9=Object.freeze([Object.freeze({version:"0.2.61",artifact_sha256:"02ffcd514bf7cc0a9e73d4ce31ecea32709429cd0adf79e7062c1b70ff9ab8b8",legacy_linux_x64_sha256:"cdc0828abde3157e39afc6a64e033deee52ff7cfb09b55a42e60394df24980b9"}),Object.freeze({version:"0.2.62",artifact_sha256:"20a77fff617e18315c60777d46a2de2c433e42eba4e1c5e0b5535d967847303d",legacy_linux_x64_sha256:"cce594365d518b680abfb2378d234c8ef4e3daf257df83adef650a4523fb2d92"}),Object.freeze({version:"0.2.63",artifact_sha256:"20a77fff617e18315c60777d46a2de2c433e42eba4e1c5e0b5535d967847303d"}),Object.freeze({version:"0.2.64",artifact_sha256:"830afe8cffb1f4ebb2663b5f86e5d2a7c9965fa03706178b251eea5d415917d2"}),Object.freeze({version:"0.2.65",artifact_sha256:"830afe8cffb1f4ebb2663b5f86e5d2a7c9965fa03706178b251eea5d415917d2"}),Object.freeze({version:"0.2.66",artifact_sha256:"830afe8cffb1f4ebb2663b5f86e5d2a7c9965fa03706178b251eea5d415917d2"}),Object.freeze({version:"0.2.67",artifact_sha256:"830afe8cffb1f4ebb2663b5f86e5d2a7c9965fa03706178b251eea5d415917d2"}),Object.freeze({version:"0.2.68",artifact_sha256:"830afe8cffb1f4ebb2663b5f86e5d2a7c9965fa03706178b251eea5d415917d2"}),Object.freeze({version:"0.2.69",artifact_sha256:"830afe8cffb1f4ebb2663b5f86e5d2a7c9965fa03706178b251eea5d415917d2"}),Object.freeze({version:"0.2.70",artifact_sha256:"830afe8cffb1f4ebb2663b5f86e5d2a7c9965fa03706178b251eea5d415917d2"}),Object.freeze({version:"0.2.71",artifact_sha256:"830afe8cffb1f4ebb2663b5f86e5d2a7c9965fa03706178b251eea5d415917d2"}),Object.freeze({version:"0.2.72",artifact_sha256:"6071ba92082b8378f5484e8dce446d3f0c3bde61d5b5ca48efa6f72389d3ab64"}),Object.freeze({version:"0.2.73",artifact_sha256:"6071ba92082b8378f5484e8dce446d3f0c3bde61d5b5ca48efa6f72389d3ab64"}),Object.freeze({version:"0.2.74",artifact_sha256:"6071ba92082b8378f5484e8dce446d3f0c3bde61d5b5ca48efa6f72389d3ab64"}),Object.freeze({version:"0.2.75",artifact_sha256:"a6e0648894f1f4876affd77c0ff42642c1f9cbe9bb752de19d7a97a5fb3b820e"}),Object.freeze({version:"0.2.76",artifact_sha256:"857446b7e0b25fe1cc21e58860c7d984ee9a1c28efb4a4c49bc573a2d70bb3c0"}),Object.freeze({version:"0.2.77",artifact_sha256:"857446b7e0b25fe1cc21e58860c7d984ee9a1c28efb4a4c49bc573a2d70bb3c0"}),Object.freeze({version:"0.2.78",artifact_sha256:"0a7a7ece14850a28b8f972d66e4eef570eb2bb75d58f8a82f4e9afe91424e27f",pi_tools_v1:!0}),Object.freeze({version:"0.2.79",artifact_sha256:"96f52656b454fc5b9ffe520f5c5d55720b5173eb084cd326d2710e434623897b",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.80",artifact_sha256:"6ee0ed70889e2771bd9b239ee039b549361b56ce870e08956ec7cce7fa199cd7",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.81",artifact_sha256:"c8909b36f4ee9316c0c3e298cb9adb5fc821a6ec5ca365cab60043eb942c258a",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.82",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.83",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.84",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.85",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.86",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.87",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.88",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.89",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.90",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.91",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.92",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.93",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.94",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.95",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.96",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.97",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.98",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.99",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.100",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.101",artifact_sha256:"38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.102",artifact_sha256:"53da53b31916c077bd63814db6cef8646785352d628b06a9ded927a94b08ecdd",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.103",artifact_sha256:"53da53b31916c077bd63814db6cef8646785352d628b06a9ded927a94b08ecdd",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.104",artifact_sha256:"53da53b31916c077bd63814db6cef8646785352d628b06a9ded927a94b08ecdd",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.105",artifact_sha256:"53da53b31916c077bd63814db6cef8646785352d628b06a9ded927a94b08ecdd",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.106",artifact_sha256:"53da53b31916c077bd63814db6cef8646785352d628b06a9ded927a94b08ecdd",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.107",artifact_sha256:"53da53b31916c077bd63814db6cef8646785352d628b06a9ded927a94b08ecdd",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.108",artifact_sha256:"53da53b31916c077bd63814db6cef8646785352d628b06a9ded927a94b08ecdd",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.109",artifact_sha256:"7a82b33611b9f47478fb181d0da6f49a04f7e4bc401a7752530fecffb2dc5864",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.110",artifact_sha256:"00b7dcc9078a7d7ea4814414fbf92dcf9ba3b0fd51186aac1b967e9ae306a377",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.111",artifact_sha256:"7688e992667a48defe6fefb3b8624012b918e8776498faf9e5b20b69c13d7520",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.112",artifact_sha256:"7688e992667a48defe6fefb3b8624012b918e8776498faf9e5b20b69c13d7520",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.113",artifact_sha256:"cc134e4d22b3f4032099d9f3c18a95815177598e0e6658840702e0dafaf5c7ad",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.114",artifact_sha256:"cc134e4d22b3f4032099d9f3c18a95815177598e0e6658840702e0dafaf5c7ad",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.115",artifact_sha256:"cc134e4d22b3f4032099d9f3c18a95815177598e0e6658840702e0dafaf5c7ad",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.116",artifact_sha256:"cc134e4d22b3f4032099d9f3c18a95815177598e0e6658840702e0dafaf5c7ad",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.117",artifact_sha256:"cc134e4d22b3f4032099d9f3c18a95815177598e0e6658840702e0dafaf5c7ad",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.118",artifact_sha256:"cc134e4d22b3f4032099d9f3c18a95815177598e0e6658840702e0dafaf5c7ad",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.119",artifact_sha256:"cc134e4d22b3f4032099d9f3c18a95815177598e0e6658840702e0dafaf5c7ad",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.120",artifact_sha256:"cc134e4d22b3f4032099d9f3c18a95815177598e0e6658840702e0dafaf5c7ad",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.121",artifact_sha256:"cc134e4d22b3f4032099d9f3c18a95815177598e0e6658840702e0dafaf5c7ad",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.122",artifact_sha256:"cc134e4d22b3f4032099d9f3c18a95815177598e0e6658840702e0dafaf5c7ad",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.123",artifact_sha256:"ae68959cc57c3d3e360ba16883479d0706a0c2e742fe61a66b78e12fbbf5463e",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.124",artifact_sha256:"ae68959cc57c3d3e360ba16883479d0706a0c2e742fe61a66b78e12fbbf5463e",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.125",artifact_sha256:"503ec2935bd73740bca494782cea6e6740667ce416d1a526c8cdf152ab3d0090",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.126",artifact_sha256:"503ec2935bd73740bca494782cea6e6740667ce416d1a526c8cdf152ab3d0090",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.127",artifact_sha256:"503ec2935bd73740bca494782cea6e6740667ce416d1a526c8cdf152ab3d0090",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.128",artifact_sha256:"852f8b11cee963d2f077f010b5c836fab0ee84e0026c4762bc4c7ef28e4deb2b",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.129",artifact_sha256:"852f8b11cee963d2f077f010b5c836fab0ee84e0026c4762bc4c7ef28e4deb2b",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.130",artifact_sha256:"852f8b11cee963d2f077f010b5c836fab0ee84e0026c4762bc4c7ef28e4deb2b",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.131",artifact_sha256:"39e5173130068852fd81ffbe0f75cf52d7afcfcd92d640fedda85e1993960527",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.132",artifact_sha256:"39e5173130068852fd81ffbe0f75cf52d7afcfcd92d640fedda85e1993960527",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.133",artifact_sha256:"39e5173130068852fd81ffbe0f75cf52d7afcfcd92d640fedda85e1993960527",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.134",artifact_sha256:"39e5173130068852fd81ffbe0f75cf52d7afcfcd92d640fedda85e1993960527",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.135",artifact_sha256:"39e5173130068852fd81ffbe0f75cf52d7afcfcd92d640fedda85e1993960527",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.136",artifact_sha256:"39e5173130068852fd81ffbe0f75cf52d7afcfcd92d640fedda85e1993960527",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.137",artifact_sha256:"39e5173130068852fd81ffbe0f75cf52d7afcfcd92d640fedda85e1993960527",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.138",artifact_sha256:"39e5173130068852fd81ffbe0f75cf52d7afcfcd92d640fedda85e1993960527",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.139",artifact_sha256:"39e5173130068852fd81ffbe0f75cf52d7afcfcd92d640fedda85e1993960527",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.140",artifact_sha256:"39e5173130068852fd81ffbe0f75cf52d7afcfcd92d640fedda85e1993960527",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.141",artifact_sha256:"39e5173130068852fd81ffbe0f75cf52d7afcfcd92d640fedda85e1993960527",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.142",artifact_sha256:"39e5173130068852fd81ffbe0f75cf52d7afcfcd92d640fedda85e1993960527",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.143",artifact_sha256:"ddd5382224321a671a5e338ccc8f9aae09ad876b534e6a8bfec07dc04c5b57d3",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.144",artifact_sha256:"ddd5382224321a671a5e338ccc8f9aae09ad876b534e6a8bfec07dc04c5b57d3",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.145",artifact_sha256:"ddd5382224321a671a5e338ccc8f9aae09ad876b534e6a8bfec07dc04c5b57d3",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0}),Object.freeze({version:"0.2.146",artifact_sha256:"8b2959fed27dff6769a0124ecbbddceaa671dc2dd502f5f77d54dbe69c99e4b5",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0}),Object.freeze({version:"0.2.147",artifact_sha256:"8b2959fed27dff6769a0124ecbbddceaa671dc2dd502f5f77d54dbe69c99e4b5",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0}),Object.freeze({version:"0.2.148",artifact_sha256:"8b2959fed27dff6769a0124ecbbddceaa671dc2dd502f5f77d54dbe69c99e4b5",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0}),Object.freeze({version:"0.2.149",artifact_sha256:"8b2959fed27dff6769a0124ecbbddceaa671dc2dd502f5f77d54dbe69c99e4b5",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0}),Object.freeze({version:"0.2.150",artifact_sha256:"8b2959fed27dff6769a0124ecbbddceaa671dc2dd502f5f77d54dbe69c99e4b5",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0}),Object.freeze({version:"0.2.151",artifact_sha256:"8b2959fed27dff6769a0124ecbbddceaa671dc2dd502f5f77d54dbe69c99e4b5",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0}),Object.freeze({version:"0.2.152",artifact_sha256:"065b5bfc86ec87cf2907d83864ffef9912a8cb18b2b36db435c74cfd3891b8f8",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0}),Object.freeze({version:"0.2.153",artifact_sha256:"065b5bfc86ec87cf2907d83864ffef9912a8cb18b2b36db435c74cfd3891b8f8",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0}),Object.freeze({version:"0.2.154",artifact_sha256:"065b5bfc86ec87cf2907d83864ffef9912a8cb18b2b36db435c74cfd3891b8f8",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0}),Object.freeze({version:"0.2.155",artifact_sha256:"065b5bfc86ec87cf2907d83864ffef9912a8cb18b2b36db435c74cfd3891b8f8",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0}),Object.freeze({version:"0.2.156",artifact_sha256:"065b5bfc86ec87cf2907d83864ffef9912a8cb18b2b36db435c74cfd3891b8f8",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0}),Object.freeze({version:"0.2.157",artifact_sha256:"065b5bfc86ec87cf2907d83864ffef9912a8cb18b2b36db435c74cfd3891b8f8",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0}),Object.freeze({version:"0.2.158",artifact_sha256:"065b5bfc86ec87cf2907d83864ffef9912a8cb18b2b36db435c74cfd3891b8f8",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0}),Object.freeze({version:"0.2.159",artifact_sha256:"cc806ca6df14c39d45a944d1e1db9827dae35b3e66e0265ededb3eea3d883dcb",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.160",artifact_sha256:"0b8f6c4598a19acbeff93929efc237dbc4e356ccb26abf6957e297bfc1b551e8",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.161",artifact_sha256:"d570f5035bfc5916c31f4954ce5bcc00013eec83edb020edbbfbd3260b9c17d0",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.162",artifact_sha256:"6e52c44af7a3ea3633a4dc28aa63696143cd80044bca7f67a57c4c156985566f",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.163",artifact_sha256:"8c14891abb51ab566864387137ea4af511db7ef9c565afb63e4f2b49c91260b6",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.164",artifact_sha256:"8c14891abb51ab566864387137ea4af511db7ef9c565afb63e4f2b49c91260b6",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.165",artifact_sha256:"8c14891abb51ab566864387137ea4af511db7ef9c565afb63e4f2b49c91260b6",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.166",artifact_sha256:"8c14891abb51ab566864387137ea4af511db7ef9c565afb63e4f2b49c91260b6",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.167",artifact_sha256:"62658de309f9b9c8fd70041c83898d8625d85fed303ac6e60c3a17afc85477e2",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.168",artifact_sha256:"24d7efe74218b862a90f48cf71dc59dce1d0dba29b167168aca06649bbfab364",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.169",artifact_sha256:"83879d03741c3f37c1502535d128685421cd7a498bc22543516a23ef2b21e496",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.170",artifact_sha256:"386b975277972e253599e5168b654e35c50b5eed9cbe711d7359e2efedd78f31",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.171",artifact_sha256:"386b975277972e253599e5168b654e35c50b5eed9cbe711d7359e2efedd78f31",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.172",artifact_sha256:"7a01a820961bd03b31007e46ba4f09df0a621ea5bfc9ee84548d6acdfd750169",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.173",artifact_sha256:"82c9ece017e109cf8b4b54734ac7a81b1ecb2ff35a426998369b6c3e690fd1ae",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.174",artifact_sha256:"07fa1db4f84afe909ad4de4bcdbda9bc785cf2598b51769b1f5620bb86b3743b",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.175",artifact_sha256:"07fa1db4f84afe909ad4de4bcdbda9bc785cf2598b51769b1f5620bb86b3743b",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0}),Object.freeze({version:"0.2.176",artifact_sha256:"ba3e211489877d0622aeca87be98e235d245f39d2b57f275cd924168d05f98ce",pi_tools_v1:!0,background_bash_v1:!0,machine_sdk_v1:!0,pi_tools_confinement_v1:!0,home_folder_v1:!0})]),$6="16befed856b4414dee65733e82549e1db74fe0ff3841d2571cfd8605d3ee970b",Z6=Object.freeze(["ea63410f321f70848139a63ddcaa9f3f0a48daa3641898cc1db9f0e15ddfbb13","6cd101ddb09f87ed6996aa92a93911b1759b5ae33e9579c3dff8225ecfcbe1b6",$6]),rQ=Object.freeze(["0f57db3036c275f78064796a72827d0f47fe702475e5feebb31e1569bcb5a0cf","38e82c8fefcc4ef98468eb3b4f0df450e4e196a8bd1063bb4de14ffef951a0c2"]),iJ=Object.freeze(["pi_tools_v1","background_bash_v1","machine_sdk_v1","pi_tools_confinement_v1","home_folder_v1","workspace_before_v1"]),aJ=new Set([K0,...B9.map(($)=>$.artifact_sha256),...Z6,...rQ]);var oJ=new Set([K0,...B9.filter(($)=>$.pi_tools_v1).map(($)=>$.artifact_sha256),...rQ]);var rJ=new Set([K0,...B9.filter(($)=>$.pi_tools_confinement_v1).map(($)=>$.artifact_sha256)]);var tJ=new Set([K0,...B9.filter(($)=>$.home_folder_v1).map(($)=>$.artifact_sha256)]);var eJ=new Set([K0,...B9.filter(($)=>$.background_bash_v1).map(($)=>$.artifact_sha256)]);var $Y=new Set([K0,...B9.filter(($)=>$.machine_sdk_v1).map(($)=>$.artifact_sha256)]);var Q6=[a0,"reason-hands-worker.cjs"];function tQ($){return typeof $==="string"&&Q6.includes($)}var X6;function eQ(){return X6??{kind:"unavailable",status:"unsupported_entrypoint",sha256:null,observed_at_ms:null}}import{closeSync as J6,constants as N$,fstatSync as $4,lstatSync as Y6,openSync as G6,readSync as z6,realpathSync as K6,watch as F6}from"fs";import{dirname as Z4}from"path";function L8($,Z){let Q;try{let X=Z4($),J=Y6(X);if(!J.isDirectory()||J.isSymbolicLink()||!J9(J,18)||K6(X)!==X)return null;Q=G6($,N$.O_RDONLY|N$.O_NOFOLLOW|N$.O_NONBLOCK);let Y=$4(Q);if(!Y.isFile()||Y.nlink!==1||!J9(Y)||Y.size<1||Y.size>8192)return null;let z=Buffer.alloc(8193),F=z6(Q,z,0,z.length,0),G=$4(Q);if(F!==Y.size||G.size!==Y.size||G.nlink!==1||G.mtimeMs!==Y.mtimeMs||G.ctimeMs!==Y.ctimeMs)return null;let V=JSON.parse(z.subarray(0,F).toString("utf8"));if(!V||V.pid!==Z.pid||!Number.isSafeInteger(V.pid)||V.pid<1||V.launchId!==Z.launchId||V.workerVersion!==Z.workerVersion||V.protocolVersion!==Z.protocolVersion||V.workerArtifactSha256!==Z.workerArtifactSha256||V.workerEntrypoint!==Z.workerEntrypoint||V.workspaceAliasReady!==!0||!w0(V.targetGeneration)||!w0(V.generation)||!O0(V.fenceId))return null;return{...Z,generation:V.generation,targetGeneration:V.targetGeneration,fenceId:V.fenceId,workspaceAliasReady:!0}}catch{return null}finally{if(Q!==void 0)J6(Q)}}var V6=($,Z,Q)=>{let X=F6($,{persistent:!1},Z);return X.on("error",Q),X};function Q4($){let Z=new AbortController,Q=$.initial,X=Q.targetGeneration,J=!1,Y=!1,z,F,G=()=>{if(Y)return;Y=!0,z?.close(),z=void 0,clearInterval(F),$.signal.removeEventListener("abort",G),Z.abort()},V=()=>{if(Y)return;if(!$.isAlive()){G();return}let B=L8($.path,$.initial);if(!B||B.generation<Q.generation||B.targetGeneration<Q.targetGeneration||B.targetGeneration===Q.targetGeneration&&B.fenceId!==Q.fenceId)return;if(Q=B,J||B.targetGeneration<=X)return;X=B.targetGeneration,J=!0,Promise.resolve().then(()=>{return Z.signal.throwIfAborted(),$.publish(B,Z.signal)}).catch(()=>{if(!Y)G(),$.failed?.()}).finally(()=>{J=!1,V()})};if($.signal.aborted)return G(),{stop:G};$.signal.addEventListener("abort",G,{once:!0});try{z=($.watch??V6)(Z4($.path),V,()=>{z?.close(),z=void 0})}catch{}return F=setInterval(V,1000),F.unref?.(),V(),{stop:G}}import{spawn as H6}from"child_process";import{chmodSync as U6,mkdtempSync as W6,realpathSync as B6,rmSync as L6,unlinkSync as N6,writeFileSync as M6}from"fs";import j6 from"net";import{platform as q6,tmpdir as C6}from"os";import{join as X4}from"path";var J4=1048576,q$=105000,T6=2000,O6=String.raw`
|
|
313
|
+
const { writeSync } = require("node:fs");
|
|
314
|
+
const { createRequire } = require("node:module");
|
|
315
|
+
const { join } = require("node:path");
|
|
316
|
+
const { createInterface } = require("node:readline");
|
|
317
|
+
const { formatWithOptions, inspect } = require("node:util");
|
|
318
|
+
const vm = require("node:vm");
|
|
319
|
+
|
|
320
|
+
const timeoutMs = ${q$};
|
|
321
|
+
const maxLogChars = 524288;
|
|
322
|
+
let activeOutput = [];
|
|
323
|
+
let activeOutputChars = 0;
|
|
324
|
+
function appendOutput(value) {
|
|
325
|
+
if (activeOutputChars >= maxLogChars) return;
|
|
326
|
+
const kept = String(value).slice(0, maxLogChars - activeOutputChars);
|
|
327
|
+
activeOutput.push(kept);
|
|
328
|
+
activeOutputChars += kept.length;
|
|
329
|
+
}
|
|
330
|
+
const replConsole = Object.fromEntries(
|
|
331
|
+
["log", "info", "warn", "error", "debug"].map((method) => [
|
|
332
|
+
method,
|
|
333
|
+
(...args) => {
|
|
334
|
+
const formatted = formatWithOptions({ colors: false }, ...args);
|
|
335
|
+
appendOutput(formatted + "\n");
|
|
336
|
+
},
|
|
337
|
+
]),
|
|
338
|
+
);
|
|
339
|
+
const originalProcessKill = process.kill.bind(process);
|
|
340
|
+
function selfOnlyProcessKill(pid, signal) {
|
|
341
|
+
if (pid !== process.pid) {
|
|
342
|
+
const error = new Error("kill EPERM");
|
|
343
|
+
error.code = "EPERM";
|
|
344
|
+
error.errno = -1;
|
|
345
|
+
error.syscall = "kill";
|
|
346
|
+
throw error;
|
|
347
|
+
}
|
|
348
|
+
return originalProcessKill(pid, signal);
|
|
349
|
+
}
|
|
350
|
+
Object.defineProperty(process, "kill", {
|
|
351
|
+
value: selfOnlyProcessKill,
|
|
352
|
+
configurable: false,
|
|
353
|
+
enumerable: true,
|
|
354
|
+
writable: false,
|
|
355
|
+
});
|
|
356
|
+
Object.defineProperty(process, "_kill", {
|
|
357
|
+
value: selfOnlyProcessKill,
|
|
358
|
+
configurable: false,
|
|
359
|
+
enumerable: false,
|
|
360
|
+
writable: false,
|
|
361
|
+
});
|
|
362
|
+
const localRequire = createRequire(join(process.cwd(), "__ara_hands_node_repl__.js"));
|
|
363
|
+
const context = vm.createContext({
|
|
364
|
+
AbortController,
|
|
365
|
+
AbortSignal,
|
|
366
|
+
Buffer,
|
|
367
|
+
URL,
|
|
368
|
+
URLSearchParams,
|
|
369
|
+
clearImmediate,
|
|
370
|
+
clearInterval,
|
|
371
|
+
clearTimeout,
|
|
372
|
+
console: replConsole,
|
|
373
|
+
fetch,
|
|
374
|
+
process,
|
|
375
|
+
queueMicrotask,
|
|
376
|
+
require: localRequire,
|
|
377
|
+
setImmediate,
|
|
378
|
+
setInterval,
|
|
379
|
+
setTimeout,
|
|
380
|
+
structuredClone,
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
async function evaluate(code) {
|
|
384
|
+
activeOutput = [];
|
|
385
|
+
activeOutputChars = 0;
|
|
386
|
+
const originalStdoutWrite = process.stdout.write;
|
|
387
|
+
process.stdout.write = function(chunk, encoding, callback) {
|
|
388
|
+
const normalizedEncoding = typeof encoding === "string" ? encoding : undefined;
|
|
389
|
+
appendOutput(Buffer.isBuffer(chunk) ? chunk.toString(normalizedEncoding) : chunk);
|
|
390
|
+
const completed = typeof encoding === "function" ? encoding : callback;
|
|
391
|
+
if (typeof completed === "function") queueMicrotask(completed);
|
|
392
|
+
return true;
|
|
393
|
+
};
|
|
394
|
+
const script = new vm.Script(code, { filename: "reason-hands-node-repl.js" });
|
|
395
|
+
let timer;
|
|
396
|
+
try {
|
|
397
|
+
const value = script.runInContext(context, { timeout: timeoutMs });
|
|
398
|
+
const resolved = await Promise.race([
|
|
399
|
+
Promise.resolve(value),
|
|
400
|
+
new Promise((_, reject) => {
|
|
401
|
+
timer = setTimeout(
|
|
402
|
+
() => reject(new Error("REPL evaluation timed out after 105 seconds")),
|
|
403
|
+
timeoutMs,
|
|
404
|
+
);
|
|
405
|
+
}),
|
|
406
|
+
]);
|
|
407
|
+
const inspected = inspect(resolved, {
|
|
408
|
+
depth: 8,
|
|
409
|
+
colors: false,
|
|
410
|
+
maxArrayLength: 200,
|
|
411
|
+
maxStringLength: 16_000,
|
|
412
|
+
breakLength: 120,
|
|
413
|
+
});
|
|
414
|
+
const emitted = activeOutput.join("");
|
|
415
|
+
return emitted.length === 0
|
|
416
|
+
? inspected
|
|
417
|
+
: emitted + (emitted.endsWith("\n") ? "" : "\n") + inspected;
|
|
418
|
+
} finally {
|
|
419
|
+
if (timer) clearTimeout(timer);
|
|
420
|
+
process.stdout.write = originalStdoutWrite;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// Ordinary stdout is just an untrusted result stream, not a control authority.
|
|
425
|
+
// The parent must terminate and reap this process before accepting any result.
|
|
426
|
+
function respond(payload) { writeSync(1, JSON.stringify(payload) + "\n"); }
|
|
427
|
+
|
|
428
|
+
let queue = Promise.resolve();
|
|
429
|
+
const lines = createInterface({ input: process.stdin, crlfDelay: Infinity });
|
|
430
|
+
lines.on("line", (line) => {
|
|
431
|
+
queue = queue.then(async () => {
|
|
432
|
+
try {
|
|
433
|
+
const request = JSON.parse(line);
|
|
434
|
+
if (request.action === "probe") {
|
|
435
|
+
respond({ ok: true, output: "ARA_HANDS_REPL_READY" });
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
if (request.action !== "evaluate" || typeof request.code !== "string") {
|
|
439
|
+
throw new Error("Invalid REPL request");
|
|
440
|
+
}
|
|
441
|
+
respond({ ok: true, output: await evaluate(request.code) });
|
|
442
|
+
} catch (error) {
|
|
443
|
+
respond({
|
|
444
|
+
ok: false,
|
|
445
|
+
error: error instanceof Error ? error.message : String(error),
|
|
446
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
}).catch((error) => respond({ ok: false, error: String(error) }));
|
|
450
|
+
});
|
|
451
|
+
`;function D6($=process.execPath,Z=process.versions.bun){return Z?"node":$}function M$($){try{N6($)}catch{}}function N8($,Z){$.end(`${JSON.stringify(Z)}
|
|
452
|
+
`)}function j$($){return JSON.stringify($)}function _6($){let Z=W6(X4(C6(),"reason-node-repl-")),Q=X4(Z,"node-repl.sb"),J=["(version 1)","(deny default)",'(import "system.sb")',"(allow process*)","(deny network*)",`(allow file-read* ${["/System","/usr","/bin","/opt/homebrew","/usr/local"].map((z)=>`(subpath ${j$(z)})`).join(" ")})`,`(allow file-read* file-write* (subpath ${j$($.workRoot)}) (subpath ${j$(Z)}))`].join(`
|
|
453
|
+
`);M6(Q,J,{mode:384});let Y=!1;return{command:"/usr/bin/sandbox-exec",args:["-f",Q,$.nodeExecutable,...$.nodeArgs],cwd:$.workRoot,env:{...$.environment,TMPDIR:Z},async cleanup(){if(Y)return;Y=!0,L6(Z,{recursive:!0,force:!0})}}}async function A6($){let Z=B6($.workRoot),Q=$.nodeExecutable??D6(),X=["--max-old-space-size=512","--permission",`--allow-fs-read=${Z}`,`--allow-fs-write=${Z}`,"-e",O6],J=M8({home:Z,temporaryDirectory:Z}),Y=$.platformName??q6();if(Y==="linux")return{command:Q,args:X,cwd:Z,env:J,async cleanup(){}};if(Y==="darwin")return _6({nodeExecutable:Q,nodeArgs:X,workRoot:Z,environment:J});throw Error("hands_node_repl_platform_unsupported")}async function k9($){let Z;try{await Promise.race([$,new Promise((Q,X)=>{Z=setTimeout(()=>X(Error("hands_node_repl_child_cleanup_timeout")),T6)})])}finally{clearTimeout(Z)}}async function Y4($){if($.executionMode!=="single-evaluation")throw Error(hQ);let Z=await A6($),Q;try{Q=H6(Z.command,Z.args,{cwd:Z.cwd,env:Z.env,stdio:["pipe","pipe","pipe"]})}catch(C){throw await Z.cleanup(),C}let X=new Promise((C)=>Q.once("close",()=>C())),J;Q.once("error",(C)=>{J=C});let Y=!1,z=!1,F="";Q.stderr.setEncoding("utf8"),Q.stderr.on("data",(C)=>{F=`${F}${C}`.slice(-16384)});let G=Q.stdout,V,B=(C,A,R)=>{if(R)C.failure??=R;if(C.finishing)return;C.finishing=!0,z=!0,Q.kill("SIGKILL"),k9(X).then(()=>{if(C.failure)C.reject(C.failure);else C.resolve(A??{})},(P)=>C.reject(P))},H=()=>{if(z=!0,V)B(V,void 0,Error("hands_node_repl_state_lost"));else Q.kill("SIGKILL")},K="";G?.setEncoding("utf8"),G?.on("data",(C)=>{if(V?.finishing||z)return;if(K+=C,K.length>J4){H();return}while(!0){let A=K.indexOf(`
|
|
454
|
+
`);if(A===-1)return;let R=K.slice(0,A);K=K.slice(A+1);let P=V;if(!P){H();return}try{let T=JSON.parse(R);if(P.action==="probe")P.resolve(T);else{B(P,T);return}}catch{B(P,void 0,Error("invalid_hands_node_repl_child_response"));return}}});let L=(C)=>{let A=F.trim(),R=C??Error(A?`hands_node_repl_child_exited:${A}`:"hands_node_repl_child_exited");if(z=!0,V&&!V.finishing)B(V,void 0,R)};Q.once("error",L),Q.once("close",()=>L()),Q.stdin.on("error",L);let W=(C)=>new Promise((A,R)=>{if(Y||z||Q.exitCode!==null||Q.signalCode!==null){R(Error(z?"hands_node_repl_state_lost":"hands_node_repl_stopped"));return}let P=setTimeout(H,C.action==="probe"?1e4:Math.max(1,Math.min($.evaluationTimeoutMs??q$-1000,q$-1000))),T={action:C.action,finishing:!1,resolve(S){if(V===T)V=void 0;clearTimeout(P),A(S)},reject(S){if(V===T)V=void 0;clearTimeout(P),R(S)}};V=T,Q.stdin.write(`${JSON.stringify(C)}
|
|
455
|
+
`,(S)=>{if(!S)return;B(T,void 0,S)})});try{if(!G){if(Q.pid===void 0)await k9(X);throw J??Error("hands_node_repl_control_pipe_missing")}let C=await W({action:"probe"});if(C.ok!==!0||C.output!=="ARA_HANDS_REPL_READY")throw Error("hands_node_repl_probe_failed")}catch(C){Y=!0,Q.kill("SIGKILL");try{await k9(X)}finally{await Z.cleanup()}throw C}let U=Promise.resolve(),j=new Set;M$($.socketPath);let O=j6.createServer((C)=>{j.add(C),C.once("close",()=>j.delete(C)),C.setEncoding("utf8");let A="",R=!1,P=!1;C.once("close",()=>{if(P)H()}),C.on("error",()=>C.destroy()),C.on("data",(T)=>{if(R)return;if(A+=T,A.length>J4){R=!0,N8(C,{ok:!1,error:"REPL request exceeds 1 MiB"});return}let S=A.indexOf(`
|
|
456
|
+
`);if(S===-1)return;R=!0;let m=A.slice(0,S);U=U.then(async()=>{if(C.destroyed)return;try{let E=JSON.parse(m);if(E.action!=="evaluate"||typeof E.code!=="string")throw Error("Invalid REPL request");P=!0;let N=await W({action:"evaluate",code:E.code});if(P=!1,N.ok!==!0||typeof N.output!=="string")throw Error(typeof N.error==="string"?N.error:"hands_node_repl_failed");N8(C,{ok:!0,output:N.output})}catch(E){P=!1,N8(C,{ok:!1,error:E instanceof Error?E.message:String(E),stack:E instanceof Error?E.stack:void 0})}}).catch((E)=>{N8(C,{ok:!1,error:E instanceof Error?E.message:String(E)})})})});try{await new Promise((C,A)=>{O.once("error",A),O.listen($.socketPath,()=>{O.off("error",A);try{U6($.socketPath,384),C()}catch(R){O.close(()=>A(R))}})})}catch(C){Y=!0,Q.kill("SIGKILL");try{await k9(X)}finally{await Z.cleanup(),M$($.socketPath)}throw C}return{socketPath:$.socketPath,async stop(){if(Y)return;Y=!0;let C=new Promise((A)=>O.close(()=>A()));for(let A of j)A.destroy();await C,U.catch(()=>{return}),H();try{await k9(X)}finally{await Z.cleanup(),M$($.socketPath)}}}}var C$=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;var G4="/workspace",z4="/var/lib/reason/sessions",x6="/var/lib/reason/session-controls";function K4($){let Z=`${z4}/`;if(!$.startsWith(Z))return null;let Q=$.slice(Z.length);if(!C$.test(Q)||Q!==Q.toLowerCase())throw Error("personal_computer_invalid_runtime_root");return`${x6}/${Q}/job.env`}function P6($){if(!C$.test($))throw Error("personal_computer_invalid_identity");return $.toLowerCase()}function j8($){let Z=P6($);return{runtimeRoot:`${z4}/${Z}`,workspaceRoot:`${G4}/sessions/${Z}`,sharedRoot:G4}}var F4="/root/.ara/cloud-browser/repl.sock";function T$($){return $==="compute"}function V4($,Z,Q="linux"){if($)j8($);if(Q!=="linux")throw Error("cloud_browser_os_invalid");if(Z!==void 0&&(!$||!/^[1-9][0-9]{0,18}$/.test(Z)))throw Error("cloud_browser_generation_invalid");let X=$?`/var/lib/reason/browsers/${$.toLowerCase()}`:"/root/.ara/cloud-browser",J=$?`${X}/${Z?`g${Z}`:"current"}`:X,Y=$?`/root/.b/${$.toLowerCase().replaceAll("-","")}`:X;return{temporarySessionDirectory:Y,temporaryDirectory:$?`${Y}/${Z??"current"}`:`${J}/tmp`,directory:J,sessionDirectory:X,config:`${J}/config.json`,status:`${J}/status.json`,socket:`${J}/repl.sock`,bundle:`${J}/driver.mjs`,processName:$?`ara-browser-${$.toLowerCase()}${Z?`-${Z}`:""}`:"ara-cloud-browser"}}var D$="browser_egress",H4=kZ,c6=45000,d6=a9+1500,y0=/^[A-Za-z0-9._:-]{1,160}$/,p6="/run/ara-hands";function u6($,Z,Q=O4()){if($==="darwin")return{temporaryRoot:Q,prepareRoot:!1,sessionMode:448};return{temporaryRoot:Z??p6,prepareRoot:!0,sessionMode:457}}function U4($,Z=process.platform,Q=process.geteuid?.()){return $===!0&&Z==="linux"&&Q===0}function x$($=j4(),Z=process.platform,Q=process.geteuid?.()){return $&&Z==="linux"&&Q===0?{uid:$.uid,gid:$.gid,home:$.home,username:$.username}:null}function l6($=x$(),Z=mQ){return $&&Z()?F$:null}function NG($=x$(),Z=process.platform,Q=process.geteuid?.()){return Z!=="linux"||Q!==0||$!==null}function MG($=process.platform,Z=process.geteuid?.()){return $!=="linux"||Z!==0}function s6($,Z){if(!Z&&($??"linux")==="linux")return F4;return V4(Z,void 0,$??"linux").socket}function n6($){return $[N0]===!0?"sandbox_loopback":"ara_device_wss"}function L9($){return Boolean($)&&typeof $==="object"&&!Array.isArray($)}function _4($){let Z=$.toLowerCase().replace(/^\[|\]$/g,"");return Z==="localhost"||Z.endsWith(".localhost")||Z==="::1"||Z==="0:0:0:0:0:0:0:1"||Z==="0.0.0.0"||Z.startsWith("127.")}class A4 extends q{expiryDiagnostic;constructor($){super("invalid_hands_expiry","Reason Hands connection expiry is invalid.");this.expiryDiagnostic=$}}function i6($){return L9($)&&Object.keys($).every((Z)=>Z==="source_path"||Z==="branch")&&($.source_path===void 0||i0($.source_path))&&typeof $.branch==="string"&&U$.test($.branch)}function a6($,Z,Q){let X=Z===void 0?Date.now():Z,J=["relay_url","session_id","environment_id","expires_at","policy_mode","policy_version","hands_protocol_version","hands_worker_version","hands_worker_artifact_sha256","hands_worker_entrypoint","target_generation","target_fence_id"],Y=new Set([...J,"workspace_id","legacy_workspace_id",o0,r0,"environment_binding","cloud_browser","sandbox_provider","sandbox_os","personal_workspace","workspace_path","workspace_worktree",p,N0,D$,U9,C0,t0,m0]),z=L9($)?$:null,F=z?.[D$],G=z?.[U9],V=z?.[t0],B=F===void 0||(z?.[p]===f0||V===f9&&z?.[p]===void 0)&&L9(F)&&Object.keys(F).every((C)=>C==="mode"||C==="allowed_domains")&&F.mode==="enforce"&&Array.isArray(F.allowed_domains)&&F.allowed_domains.length<=256&&F.allowed_domains.every((C)=>typeof C==="string"&&t8(C));if(!L9($)||J.some((C)=>!(C in $))||Object.keys($).some((C)=>!Y.has(C))||!B||V!==void 0&&V!==f9||z?.[m0]!==void 0&&z[m0]!==T8||z?.personal_workspace!==void 0&&(z.personal_workspace!==!0||z[p]!==f0)||z?.cloud_browser!==void 0&&(z.cloud_browser!==!0||z[p]!==f0)||z?.sandbox_provider!==void 0&&!T$(z.sandbox_provider)||z?.sandbox_os!==void 0&&z.sandbox_os!=="linux"||G!==void 0&&(z?.[p]!==H9||!V$(G))||p in $&&$[p]!==f0&&$[p]!==H9&&$[p]!==L0||N0 in $&&$[N0]!==!0||$.workspace_path!==void 0&&(!i0($.workspace_path)||$[p]!==L0)||$.workspace_worktree!==void 0&&($.workspace_path===void 0||!i6($.workspace_worktree))||typeof $.relay_url!=="string"||typeof $.session_id!=="string"||!y0.test($.session_id)||$.workspace_id!==void 0&&(typeof $.workspace_id!=="string"||!y0.test($.workspace_id))||$.legacy_workspace_id!==void 0&&(typeof $.legacy_workspace_id!=="string"||!y0.test($.legacy_workspace_id))||$[o0]!==void 0&&($[o0]!==O8||(p in $))||$[r0]!==void 0&&($[r0]!==D8||(p in $))||$[C0]!==void 0&&(typeof $[C0]!=="string"||!y0.test($[C0]))||typeof $.environment_id!=="string"||!y0.test($.environment_id)||typeof $.expires_at!=="string"||$.policy_mode!=="full_access"||$.policy_version!==1||$.hands_protocol_version!==N9||$.hands_worker_version!==M9||$.hands_worker_artifact_sha256!==K0||!tQ($.hands_worker_entrypoint)||!w0($.target_generation)||!O0($.target_fence_id))throw new q("invalid_hands_payload","Reason Hands connection payload is invalid.");let H;try{H=new URL($.relay_url)}catch{throw new q("invalid_hands_relay","Reason Hands relay URL is invalid.")}let K=$[N0]===!0,L=_4(H.hostname);if((K?H.protocol!=="ws:"||!L:L?H.protocol!=="ws:":H.protocol!=="wss:")||H.username||H.password||H.hash||!/^\/device\/[A-Za-z0-9-]+\/[A-Za-z0-9]+$/.test(H.pathname))throw new q("invalid_hands_relay","Reason Hands relay URL is not allowed.");let W=Date.parse($.expires_at),U=Number.isNaN(W)?"parse":new Date(W).toISOString()!==$.expires_at?"noncanonical":W<=X?"expired":W-X>H4?"over_cap":"accepted",j={version:1,outcome:U,clock_source:Z===void 0?"date_now":"injected",validation_now_ms:Y9(X),expiry_ms:Y9(W),remaining_ms:Number.isSafeInteger(W-X)?W-X:null,maximum_lifetime_ms:H4,cli_artifact:eQ()};if(U!=="accepted")throw new A4(j);try{Q?.(j)}catch{}let O=$.environment_binding===void 0?void 0:u8.safeParse($.environment_binding);if(O&&!O.success)throw new q("invalid_hands_request","Reason Hands environment binding is invalid.");return{...$.cloud_browser===!0?{cloud_browser:!0}:{},...T$($.sandbox_provider)?{sandbox_provider:$.sandbox_provider}:{},...$.sandbox_os==="linux"?{sandbox_os:$.sandbox_os}:{},...$.personal_workspace===!0?{personal_workspace:!0}:{},relay_url:H.toString(),...O?.success?{environment_binding:O.data}:{},session_id:$.session_id,...$.workspace_id===void 0?{}:{workspace_id:$.workspace_id},...$.legacy_workspace_id===void 0?{}:{legacy_workspace_id:$.legacy_workspace_id},...$[o0]===O8?{[o0]:O8}:{},...$[r0]===D8?{[r0]:D8}:{},...typeof $[C0]==="string"?{[C0]:$[C0]}:{},...$[t0]===f9?{[t0]:f9}:{},...$[m0]===T8?{[m0]:T8}:{},...typeof $.workspace_path==="string"?{workspace_path:$.workspace_path}:{},...L9($.workspace_worktree)?{workspace_worktree:{...typeof $.workspace_worktree.source_path==="string"?{source_path:$.workspace_worktree.source_path}:{},branch:String($.workspace_worktree.branch)}}:{},environment_id:$.environment_id,expires_at:$.expires_at,policy_mode:"full_access",policy_version:1,hands_protocol_version:N9,hands_worker_version:M9,hands_worker_artifact_sha256:K0,hands_worker_entrypoint:a0,target_generation:$.target_generation,target_fence_id:$.target_fence_id,...p in $?{[p]:$[p]}:{},...K?{[N0]:!0}:{},...G===void 0?{}:{[U9]:G},...F===void 0?{}:{[D$]:{mode:"enforce",allowed_domains:[...new Set(F.allowed_domains)].sort()}}}}function o6(){let $=new Map;return{acquire(Z,Q){if($.has(Z))return null;let X=[...$.values()],J=(z)=>Q.group!==void 0&&z.group===Q.group;if(Q.exclusive?!X.every(J):X.some((z)=>z.exclusive))return null;if(Q.limit!==void 0&&!X.some(J)&&new Set(X.map((z,F)=>z.group??F)).size>=Q.limit)return null;$.set(Z,Q);let Y=!1;return()=>{if(Y)return;Y=!0,$.delete(Z)}},activeOwners:()=>[...$.keys()]}}var r6=o6();function t6($,Z){j9($,{recursive:!0,mode:448});let Q=s($),X=()=>new q("invalid_hands_workspace","Reason Hands managed workspace ancestor must be a real directory, not a link.");for(let z of Z.split("/")){let F=a(Q,z);try{let V=o(F);if(V.isSymbolicLink()||!V.isDirectory())throw X()}catch(V){if(!(V&&typeof V==="object"&&("code"in V)&&V.code==="ENOENT"))throw V;try{j9(F,{mode:448})}catch(B){if(!(B&&typeof B==="object"&&("code"in B)&&B.code==="EEXIST"))throw B}}let G=o(F);if(G.isSymbolicLink()||!G.isDirectory()||s(F)!==F)throw X();Q=F}if(process.platform==="win32"){let z=o(Q);if(z.isSymbolicLink()||!z.isDirectory()||s(Q)!==Q||!A0(s($),Q))throw X();return Q}let J=o(Q),Y=k6(Q,O$.O_RDONLY|O$.O_DIRECTORY|O$.O_NOFOLLOW);try{let z=b6(Y);if(!z.isDirectory()||z.dev!==J.dev||z.ino!==J.ino||s(Q)!==Q)throw X();w6(Y,448)}finally{S6(Y)}return Q}function e6($,Z=M4(),Q,X,J){if(!y0.test($)||Q!==void 0&&!y0.test(Q))throw new q("invalid_hands_workspace","Reason Hands run identity is invalid.");let Y=H0(u0({kind:"managed",workspaceId:$,...X?{base:X}:{},...J?{layout:J}:{}})),z=t6(Z,H0(Y)),F=a(z,h6(Y)),G=!1;try{let K=o(F);if(G=!0,K.isSymbolicLink())throw new q("invalid_hands_workspace","Reason Hands workspace cannot be a symbolic link.");if(!K.isDirectory())throw new q("invalid_hands_workspace","Reason Hands workspace must be a managed directory.")}catch(K){if(K instanceof q||!(K&&typeof K==="object"&&("code"in K)&&K.code==="ENOENT"))throw K}if(J&&!G)try{let K=a(s(Z),H0(u0({kind:"managed",workspaceId:$,...X?{base:X}:{}}))),L=o(K);if(!L.isSymbolicLink()&&L.isDirectory()&&s(K)===K)q8(K,F),G=!0}catch{}if(Q&&Q!==$){let K=a(z,Q);try{let L=o(K);if(L.isSymbolicLink()||!L.isDirectory())throw new q("invalid_hands_workspace","Reason Hands legacy workspace must be a managed directory.");let W=s(K);if(H0(W)!==z)throw new q("invalid_hands_workspace","Reason Hands legacy workspace escaped its managed parent.");let U=null;if(G){U=a(z,`.${$}.previous`);try{throw o(U),new q("invalid_hands_workspace","Reason Hands previous workspace backup already exists.")}catch(j){if(j instanceof q||!(j&&typeof j==="object"&&("code"in j)&&j.code==="ENOENT"))throw j}q8(F,U)}try{q8(W,F)}catch(j){if(U)q8(U,F);throw j}G=!0}catch(L){if(L instanceof q||!(L&&typeof L==="object"&&("code"in L)&&L.code==="ENOENT"))throw L}}j9(F,{recursive:!0,mode:448}),m9(F,448);let V=s(F);if(H0(V)!==z)throw new q("invalid_hands_workspace","Reason Hands workspace escaped its managed parent.");let B=a(V,"repo");try{let K=o(B);if(K.isSymbolicLink()||!K.isDirectory())throw new q("invalid_hands_workspace","Reason Hands repository must be a managed directory.")}catch(K){if(K instanceof q||!(K&&typeof K==="object"&&("code"in K)&&K.code==="ENOENT"))throw K}j9(B,{recursive:!0,mode:448}),m9(B,448);let H=s(B);if(H0(H)!==V)throw new q("invalid_hands_workspace","Reason Hands repository escaped its managed run workspace.");return{workRoot:V,repoPath:H}}function x4($){let Z=null;try{Z=o($)}catch{}if(!Z||Z.isSymbolicLink()||!Z.isDirectory()||Z.uid!==0||Z.gid!==0||(Z.mode&4095)!==493)throw new q("cloud_workspace_root_invalid","This cloud Session's workspace root is not root's 0755 directory, so Reason Hands cannot use it.")}function $2($,Z){let Q="/";for(let X of["",...$.split("/"),...Z.split("/")].filter((J,Y)=>Y===0||J)){if(X)Q=a(Q,X);let J;try{J=o(Q)}catch{return null}if(J.uid!==0)return J.uid;if((J.mode&2)!==0&&(J.mode&512)===0&&!J.isSymbolicLink())return-1;if(J.isSymbolicLink()||!J.isDirectory())return null}return null}function Z2($,Z,Q,X=process.geteuid?.(),J){if(!y0.test(Z))return null;let Y,z;try{Y=s($),z=H0(u0({kind:"managed",workspaceId:Z,...Q?{base:Q}:{},...J?{layout:J}:{}}))}catch{return null}let F=a(Y,z),G=A$(F)!==null,V=(W)=>new q("cloud_workspace_root_invalid",W),B;if(X===0){let W=$2(Y,z);if(W===null)return null;if(!G)throw new q("invalid_hands_workspace","As root, Reason Hands never prepares a workspace in folders another user owns.");B=W}else{if(!G)return null;let W,U;try{W=o(H0(F)),U=o(F)}catch{return null}if(W.isSymbolicLink()||!W.isDirectory()||W.uid===0||U.uid!==0)return null;B=W.uid}let H=Y;for(let W of z.split("/")){let U=a(H,W),j=!1;try{let O=o(U);j=!O.isSymbolicLink()&&O.isDirectory()&&s(U)===U}catch{}if(!j)throw V("This cloud Session's workspace root is missing or is not a real directory.");H=U}x4(F);let K;try{K=P4(F)}catch(W){if(W instanceof q)throw W;throw V("This cloud Session's workspace root changed while Reason Hands checked it.")}let L=null;try{L=y9(K.repoPath).uid}catch{}if(L!==B)throw new q("invalid_hands_workspace","Reason Hands repository must belong to the cloud Session's user.");return K}function P4($,Z=!1){let Q=s($),X=a(Q,"repo"),J;try{J=o(X)}catch{throw new q("invalid_hands_workspace","Reason Hands repository is missing from the granted root.")}if(Z){if(!/^\/var\/lib\/reason\/sessions\/[0-9a-f-]{36}$/.test(Q))throw new q("invalid_hands_workspace","Personal runtime identity is invalid.");if(j8(Q.slice(Q.lastIndexOf("/")+1)).runtimeRoot!==Q)throw new q("invalid_hands_workspace","Personal runtime identity is invalid.");let F=s("/workspace"),G=s(X);if(F!=="/workspace"||!y9(G).isDirectory()||!G.startsWith("/workspace/"))throw new q("invalid_hands_workspace","Personal files escaped the personal computer.");return{workRoot:Q,repoPath:G}}let Y=yQ(Q);if(Y&&J.isSymbolicLink()){let F=s(X);if(F!==s(Y)||!y9(F).isDirectory())throw new q("invalid_hands_workspace","Side chat repository must be its parent's checkout.");return{workRoot:Q,repoPath:F}}if(J.isSymbolicLink()||!J.isDirectory())throw new q("invalid_hands_workspace","Reason Hands repository must be a managed directory.");let z=s(X);if(H0(z)!==Q)throw new q("invalid_hands_workspace","Reason Hands repository escaped its granted root.");return{workRoot:Q,repoPath:z}}function P$($,Z,Q){if(Z!==void 0&&!i0(Z))throw new q("invalid_hands_workspace",`Reason Hands ${Q} is invalid.`);let X=D4($,Z??".");if(!A0($,X))throw new q("invalid_hands_workspace",`Reason Hands ${Q} escapes its granted root.`);return X}function I4($,Z,Q){if(H$(Z)){let X=s(Q);return{anchor:X,target:D4(X,Z),boundary:a(X,W9)}}return{anchor:$,target:P$($,Z,"folder"),boundary:$}}function Q2($,Z){if(!A0($,Z))throw new q("invalid_hands_workspace","Reason Hands folder escapes its granted root.");let Q=$;for(let X of Z.slice($.length).split(v6).filter(Boolean)){Q=a(Q,X);let J=null;try{J=o(Q)}catch(Y){if(Y.code!=="ENOENT")throw Y}if(!J)j9(Q,{mode:448});else if(J.isSymbolicLink()||!J.isDirectory())throw new q("invalid_hands_workspace","Reason Hands folder must be made of real directories.")}}function R4($,Z){let Q=s(P$($,Z.source_path,"repository"));if(!A0($,Q)||!y9(Q).isDirectory())throw new q("invalid_hands_workspace","Reason Hands repository must be a folder in its granted root.");return Q}async function X2($,Z,Q,X=_8()){try{let J=s($);if(_$(I4(J,Z,X).target))return;return await pQ(R4(J,Q))??void 0}catch{return}}function J2($,Z,Q,X,J=Y2,Y=_8()){let z=s($),{target:F,boundary:G,anchor:V}=I4(z,Z,Y);if(Q&&!_$(F)){let K=R4(z,Q);Q2(V,H0(F));let L=["-c","core.hooksPath=/dev/null","-C",K];if(X)J([...L,"update-ref","--create-reflog","-m",X.note,`refs/heads/${Q.branch}`,X.commit,""]);let W=X?J([...L,"worktree","add",F,Q.branch]):J([...L,"worktree","add","-b",Q.branch,F]);if(!X&&W.status!==0&&/already exists/.test(W.stderr)&&!_$(F))W=J([...L,"worktree","add",F,Q.branch]);if(W.status!==0)throw new q(/not a git repository/i.test(W.stderr)?"workspace_not_git_repository":"workspace_worktree_failed","Reason could not create this Session's git worktree.")}let B;try{B=o(F)}catch{throw new q("workspace_folder_missing","This Session's folder no longer exists.")}let H=s(F);if(B.isSymbolicLink()&&!A0(G,H))throw new q("invalid_hands_workspace","Reason Hands folder resolves outside its granted root.");if(!y9(H).isDirectory()||!A0(G,H))throw new q("invalid_hands_workspace","Reason Hands folder must be a directory in its granted root.");if(b0(H))throw new q("protected_path","Credential and secret folders are unavailable to Sessions.");return H}function Y2($){let Z=L4();if(!Z)return{status:null,stderr:"git was not found. Install Git for Windows (https://git-scm.com/download/win)."};let Q=E6(Z,$,{encoding:"utf8",timeout:60000,env:{...process.env,GIT_TERMINAL_PROMPT:"0"},stdio:["ignore","ignore","pipe"]});return{status:Q.status,stderr:Q.stderr??""}}function E4($){return K4($)??A$($)?.jobEnv??a($,"job.env")}function G2($,Z){let Q=E4($),X=o(Q);if(X.isSymbolicLink()||!X.isFile())throw new q("invalid_hands_workspace","Reason Hands job environment must be a managed regular file.");f6(Q,Z),m9(Z,384)}function z2($){if($.workspaceMode===L0&&$.workspacePath!==void 0){let z=$.home??_8(),F=J2($.grantedRoot,$.workspacePath,$.workspaceWorktree,$.workspaceWorktreeStart,void 0,z);if($.workspaceWorktree&&$.deviceId)nQ(z,$.workspacePath,$.deviceId);return{workRoot:F,repoPath:F,workspace:{kind:"root",path:$.workspacePath},jobEnvPath:a($.temporaryDirectory,"job.env"),workspacePoolPath:null,managedWorkspace:!0}}if($.workspaceMode===f0)return{...P4($.grantedRoot,$.personalWorkspace),workspace:{kind:"root"},jobEnvPath:a($.temporaryDirectory,"job.env"),workspacePoolPath:null,managedWorkspace:!1};if($.workspaceMode===H9||$.workspaceMode===L0){let z=o($.grantedRoot);if(z.isSymbolicLink()||!z.isDirectory())throw new q("invalid_hands_workspace","Reason Hands root must be a real directory.");let F=s($.grantedRoot);return{workRoot:F,repoPath:F,workspace:{kind:"root"},jobEnvPath:a($.temporaryDirectory,"job.env"),workspacePoolPath:null,managedWorkspace:!0}}let Z=$.workspaceId??$.runId,Q={kind:"managed",workspaceId:Z,...$.workspaceBase?{base:$.workspaceBase}:{},...$.workspaceLayout?{layout:$.workspaceLayout}:{}},X=r9($.grantedRoot,Q,$.home).anchor,J=Z2(X,Z,$.workspaceBase,void 0,$.workspaceLayout);if(J)return{...J,workspace:Q,jobEnvPath:a($.temporaryDirectory,"job.env"),workspacePoolPath:null,managedWorkspace:!1,cloudSessionRoot:!0};let Y=e6(Z,X,$.legacyWorkspaceId,$.workspaceBase,$.workspaceLayout);return{...Y,workspace:Q,jobEnvPath:a($.temporaryDirectory,"job.env"),workspacePoolPath:H0(Y.workRoot),managedWorkspace:!0}}function K2($){let{command:Z,prefix:Q}=l8($.executablePath,$.sourceEntrypoint),X=M8({home:g6(),temporaryDirectory:$.temporaryDirectory,path:$.path});if(X.REASON_DEVICE_ROOT=X.ARA_DEVICE_ROOT=$.grantedRoot,X.REASON_HANDS_WORKSPACE=X.ARA_HANDS_WORKSPACE=$.workRoot,X.REASON_HANDS_REPO=X.ARA_HANDS_REPO=$.root,$.workspacePoolPath)X.REASON_HANDS_WORKSPACE_POOL=X.ARA_HANDS_WORKSPACE_POOL=$.workspacePoolPath;return{command:Z,args:[...Q,"__device","__hands-worker","--config",$.configPath],options:{cwd:$.root,env:X,shell:!1,stdio:[F2,"ignore","pipe"]}}}var F2=process.platform==="win32"?"pipe":"ignore";function W4($,Z){if(process.platform!=="win32")return $.kill(Z);if(Z==="SIGTERM")$.stdin?.end();else if($.pid)N4($.pid);return!0}function V2($,Z){let Q="",X=!1,J=Date.now(),Y=0,z=new Set(["connecting","open","dial_pending","socket_error","close","claim_accepted","claim_rejected","stopping","stopped","request_cancelled","permission_denied"].map((H)=>`hands.worker.${H}`)),F=new Set([null,"open_not_received","current_connection","obsolete_connection","request_aborted","request_timeout","client_closed","driver_stopped","driver_handoff","run_cancelled","run_finished","other","frame_too_large","invalid_json","invalid_claim","executor_mismatch","stale_generation","fence_conflict","SIGTERM","SIGINT","SIGHUP","expired","cleanup_complete","cleanup_failed","cancelled","settled","unsupported","unconfirmed",...["sandbox_policy","os_permission_unknown"].flatMap((H)=>["bash","read","write","edit"].map((K)=>`${H}:${K}`))]),G=["timestampMs","connectionAttempt","connectionGeneration","targetGeneration","activeRequestCount","remainingLifetimeMs","suppressedDiagnostics"],V=["peerGeneration","socketState","closeCode"],B=new Set(["event","reason","launchId",...G,...V]);return(H)=>{for(let K of H.toString().split(/(?<=\n)/)){let L=K.endsWith(`
|
|
457
|
+
`);if(!X&&Q.length+K.length<=2048)Q+=K;else X=!0;if(!L)continue;let W=Q;if(Q="",X){X=!1;continue}try{let U=JSON.parse(W);if(!U||typeof U!=="object"||Array.isArray(U)||Object.keys(U).some((j)=>!B.has(j))||!z.has(U.event)||!F.has(U.reason)||U.event==="hands.worker.permission_denied"!==(typeof U.reason==="string"&&U.reason.includes(":"))||U.launchId!==$||G.some((j)=>!Number.isSafeInteger(U[j])||U[j]<0)||V.some((j)=>U[j]!==null&&(!Number.isSafeInteger(U[j])||U[j]<0)))continue;if(Date.now()-J>=60000)J=Date.now(),Y=0;if(Y>=122)continue;Y+=1,Z(U)}catch{}}}}async function H2($){let Z=$.now()+$.timeoutMs;while($.now()<Z){if($.signal.aborted)throw new q("cancelled","Reason Hands start was cancelled.");if($.spawnFailed?.()||$.child.exitCode!==null||$.child.signalCode!==null)throw new q("hands_worker_exited","Reason Hands exited before ready.");let Q=L8($.path,{pid:$.child.pid??-1,launchId:$.launchId,workerVersion:M9,protocolVersion:N9,workerArtifactSha256:K0,workerEntrypoint:a0});if(Q?.targetGeneration===$.targetGeneration&&Q.fenceId===$.fenceId)return Q;await new Promise((X)=>setTimeout(X,10))}throw new q("hands_ready_timeout","Reason Hands did not become ready.")}async function U2($,Z){let Q=()=>$.exitCode===0&&$.signalCode===null;if($.exitCode!==null||$.signalCode!==null)return Q()?"stopped":"already_exited";let X=new Promise((z)=>$.once("exit",()=>z()));try{if(!W4($,"SIGTERM"))return Q()?"stopped":"unobserved"}catch{return Q()?"stopped":"unobserved"}if(await B4(X,Z))return Q()?"stopped":"unobserved";try{W4($,"SIGKILL")}catch{}return await B4(X,Z)?"forced":"unobserved"}async function B4($,Z){let Q;try{return await Promise.race([$.then(()=>!0),new Promise((X)=>{Q=setTimeout(()=>X(!1),Z)})])}finally{clearTimeout(Q)}}function W2($){return new Promise((Z)=>{let Q=!1,X=(F)=>{if(Q)return;Q=!0,clearTimeout(z),$.signal.removeEventListener("abort",J),$.child.off("exit",Y),Z(F)},J=()=>X("cancelled"),Y=()=>X("exited"),z=setTimeout(()=>X("expired"),Math.max(0,$.expiresAt-$.now()));if($.signal.addEventListener("abort",J,{once:!0}),$.child.once("exit",Y),$.signal.aborted)J();else if($.child.exitCode!==null||$.child.signalCode!==null)Y()})}var S4=T4();function B2($,Z){if(!($ instanceof Error)||$ instanceof q)return!1;let Q=["hands_browser_driver_missing","hands_browser_driver_version_mismatch","hands_browser_executable_missing","hands_browser_unsupported_platform","hands_browser_unavailable"].includes($.message),X=["ENOENT","EACCES","EPERM"].includes($.code??"");if(!Q&&!X)return!1;try{return o(Z),!1}catch(J){return L9(J)&&J.code==="ENOENT"}}function L2($){return $.sandbox_provider==="compute"&&!$.cloud_browser&&!$[N0]&&$[p]===f0}function N2($,Z,Q){return $===void 0?{}:{dispatch_stages:{version:1,claim_to_entered_ms:V0($,Z),...Q===void 0?{}:{worker_prespawned:Q}}}}function jG(){S4().catch(()=>{return}),K9().catch(()=>{return})}async function qG($,Z={}){let Q=Z.logDiagnostic??((N)=>console.warn(N)),X=new Map,J=(N)=>{let M=Date.now();X.set(N,M);try{Q(JSON.stringify({event:"sandbox.hands_startup",stage:N,timestampMs:M}))}catch{}};J("entered");let Y=$.claimEnvironment;$.claimEnvironment=void 0;let z=Z.now??Date.now,F,G=a6($.payload,Z.now?.(),(N)=>{F=N});if($.managedPty&&($.managedPty.version!==1||!$.headless||!$.runtimeDirectory||![void 0,!0].includes($.managedPty.startupVerified)||!$.deviceIdentity||!$.claimOwner||$.claimOwner.device_id!==$.deviceIdentity.deviceId||!G.environment_binding||!["darwin","linux","win32"].includes(process.platform)))throw new q("pty_unsupported","Bound PTY requires qualified headless Hands with private jobs and environment.");let V=async(N)=>{let M;try{await Promise.race([N,new Promise((D,w)=>{M=setTimeout(()=>w(new q("hands_event_delivery_unavailable","Hands event delivery did not settle within its deadline.")),Math.max(1,Math.min(Z.eventDeliveryTimeoutMs??5000,5000)))})])}finally{clearTimeout(M)}},B=async(N,M)=>V($.emitEvent(N,M));if($.headless&&(G.cloud_browser===!0||$.managedBrowser!==void 0||G[N0]!==void 0||G[U9]!==void 0||G[p]!==void 0&&G[p]!==L0))throw new q("invalid_hands_request","Managed sandbox extensions are unavailable to a headless worker.");let H=x$(),K=G[m0]===void 0?null:l6(H);if(G[m0]!==void 0&&(K===null||!$.headless||!U4($.hostExecution,Z.hostIdentity?.platform,Z.hostIdentity?.euid)))throw new q("hands_model_jobs_egress_unavailable","This worker cannot hold its jobs to the guest egress guard; the Hands did not start.");if(G[t0]!==void 0&&!($.headless&&U4($.hostExecution,Z.hostIdentity?.platform,Z.hostIdentity?.euid)))throw new q("hands_confinement_unavailable","Confined Hands need a root Linux worker in host mode.");if(G.cloud_browser&&process.platform!=="linux")throw new q("cloud_browser_target_invalid","Cloud browser is available only on a cloud machine.");let L=`${$.operationId}:${$.attemptId}`,W=G[p]===H9,U=$.headless||process.platform==="darwin"&&$.managedBrowser===void 0&&!G.cloud_browser&&!G.browser_egress&&!G[N0]&&(G[p]===void 0||G[p]===L0)||L2(G),j=W?G[U9]??"bash":null,O=j?vQ(j):null;if(O)throw new q(O,"Persistent Node REPL execution is unavailable; this benchmark profile cannot start.");let C=G[p],A=$.headless===!0&&$.ownComputer!==!0?$.handsSlots??1:void 0,R=(Z.slot??r6).acquire(L,{exclusive:A===1||C!==void 0&&C!==L0,...A!==void 0&&A>1?{limit:A}:{},...$.headless===!0&&G[C0]!==void 0?{group:G[C0]}:{}});if(!R)throw new q("hands_slot_busy",A!==void 0&&A>1?`This Reason worker runs at most ${A} sessions at a time.`:"This Reason Device runs one session at a time.");let P=$.headless===!0?q4($.runId):null,T=null,S=null,m,E;try{J("browser_resolution");let N=$.headless&&Z.browserExecutablePath===void 0?await K9():null,M=W||G.cloud_browser?null:Z.browserExecutablePath===void 0?$.headless?N?.status==="resolved"?N.executablePath:null:await bQ(void 0,process.platform,$.managedBrowser):Z.browserExecutablePath;if(!W&&!G.cloud_browser&&!U&&!M)throw new q("hands_browser_unavailable","Reason Hands requires Chrome, Edge, Brave, Chromium, or a Playwright Chromium install.");J("path_resolution");let D;try{D=await(Z.resolvePathEnvironment??S4)()}catch{D={path:C4(),source:"fallback"}}if(J("workspace_setup"),process.platform==="darwin"){let l=G[p]===L0&&G.workspace_path!==void 0?P$($.root,G.workspace_worktree?G.workspace_worktree.source_path:G.workspace_path,"folder"):null;for(let e of new Set([$.root,...l?[l]:[]]))await QQ(e)}let k=G[p]===f0||G[p]===H9?u6(process.platform,Z.sandboxRuntimeRoot):null,f=$.headless&&$.runtimeDirectory?$.runtimeDirectory:k?k.temporaryRoot:O4();if(T="private_runtime",$.headless&&$.runtimeDirectory){B8(f);let l=s($.root);if(!E9(l,f))throw new q("invalid_hands_workspace","Private worker state must not overlap the granted workspace.")}if($.headless&&$.runtimeDirectory&&(!$.deviceIdentity||!G.environment_binding))throw new q("environment_unavailable","Headless Hands requires a server-bound private environment.");if(T="runtime_root",k?.prepareRoot)j9(f,{recursive:!0,mode:457}),m9(f,457);T="temporary_directory";let _=s(m6(a(f,"reason-hands-session-")));S=_,m9(_,k?.sessionMode??448);let y=a(_,"hands-config.json"),c=a(_,"hands-ready.json"),u=I6(),r=G.target_fence_id;if($.workspaceGrant){T="workspace_grant",J("workspace_grant_wait");let l=$.workspaceGrant;await new Promise((e,c0)=>{let $9=()=>c0(new q("cancelled","Reason Hands was cancelled."));if($.signal.aborted){$9();return}$.signal.addEventListener("abort",$9,{once:!0}),l.then(e,c0).finally(()=>$.signal.removeEventListener("abort",$9))})}T="granted_root";let b=s($.root);T="workspace_layout";let h=G[p]===L0&&G.workspace_path!==void 0&&G.workspace_worktree?await X2(b,G.workspace_path,G.workspace_worktree):void 0,{workRoot:d,repoPath:n,jobEnvPath:G0,workspacePoolPath:M0,managedWorkspace:U0,workspace:W0,cloudSessionRoot:g0}=z2({grantedRoot:b,personalWorkspace:G.personal_workspace===!0,runId:$.runId,workspaceId:G.workspace_id,legacyWorkspaceId:G.legacy_workspace_id,workspaceBase:G[o0],workspaceLayout:G[r0],temporaryDirectory:_,workspaceMode:G[p],applicationSupportPath:Z.applicationSupportPath,...G.workspace_path===void 0?{}:{workspacePath:G.workspace_path},...G.workspace_worktree?{workspaceWorktree:G.workspace_worktree}:{},...h?{workspaceWorktreeStart:h}:{},...$.deviceIdentity?{deviceId:$.deviceIdentity.deviceId}:{}}),T0=n6(G);T="jobs";let t=$.headless&&$.runtimeDirectory?PZ({runtimeDirectory:$.runtimeDirectory,root:b,runId:$.runId}):void 0;m=t?.disposeSocket;let j0=t?IZ(t):null;if(j0)try{Q(JSON.stringify({event:"hands.journal_owner_retired",run_id:$.runId,reason:j0.reason,prior_executor_launch_id:j0.executorLaunchId}))}catch{}if(t&&[d,n].some((l)=>!E9(l,t.journalDirectory)))throw new q("invalid_hands_workspace","A Session can't work in the folder that holds this worker's settings; start it in a project or repository inside it.");let e0=G.personal_workspace?d.slice(d.lastIndexOf("/")+1):void 0;if(e0&&e0!==G.workspace_id)throw new q("invalid_hands_workspace","Personal session identity does not match its Device grant.");T="browser_socket";let B0=G.cloud_browser?s6(G.sandbox_os,e0):process.platform==="win32"?`\\\\.\\pipe\\reason-repl-${u}`:a(t?t.launchDirectory:_,"repl.sock");T="relay_url";let q0=_4(new URL(G.relay_url).hostname),h0=T0==="ara_device_wss"&&!q0?(Z.loadProxy??s8)()?.url:void 0,Y0;T="environment_owner";let X0=$.headless&&$.deviceIdentity&&G.environment_binding?oQ(_,{runId:$.runId,...$.deviceIdentity,binding:G.environment_binding,expiresAtMs:Date.parse(G.expires_at),identity:()=>Y0?.()??null}):void 0;T="job_environment";let q9=!X0&&W0.kind==="managed"&&U0?a(d,"job.env"):null;if(q9)try{C8(q9,"",{mode:384,flag:"wx"})}catch(l){if(!(l instanceof Error&&("code"in l)&&l.code==="EEXIST"))throw l}let A8={url:G.relay_url,transport:T0,...h0===void 0?{}:{proxyUrl:h0},...$.localGithubConfinement?{localGithubConfinement:!0}:{},...G[t0]&&X0?{gitCredentialEnvironment:!0}:{},workerVersion:M9,protocolVersion:N9,workerArtifactSha256:K0,workerEntrypoint:a0,...process.platform==="win32"?{bashExecutable:e9()}:{},targetGeneration:G.target_generation,fenceId:r,workRoot:d,workspaceAliasPath:d,jobEnvPath:G0,...X0?{environmentSnapshotPath:X0.path,...$.hostExecution?{executionEnvironment:sZ()}:{},environmentExpectedBinding:{runId:$.runId,...$.deviceIdentity,binding:G.environment_binding}}:q9?{jobEnvSourcePath:q9,workspacePoolPath:H0(d)}:U0?{}:{jobEnvSourcePath:E4(d)},repoPath:n,replSocketPath:B0,...G.cloud_browser?{browserRunId:$.runId}:{},readyPath:c,launchId:u,expiresAtMs:Date.parse(G.expires_at),bashTimeoutMs:300000,replTimeoutMs:120000,...t?{managedJobs:{journalDirectory:t.journalDirectory,scopeId:t.scopeId},jobControlSocketPath:t.socketPath}:{},...t&&H?{jobsUser:{...H,...K!==null?{modelGid:K}:{}}}:{},...$.managedPty&&t&&X0?{managedPty:{version:1,...$.managedPty.startupVerified===!0?{persistent:!0}:{},...process.platform==="darwin"?{shell:nZ()}:{}}}:{},...U&&!M?{allowedTools:["bash","read","write","edit"]}:W?{allowedTools:j==="bash"?["bash"]:["bash","repl"]}:{}};if(X0||U0&&!q9)C8(G0,"",{mode:384});else G2(d,G0);T="config_write",C8(y,JSON.stringify(A8),{mode:384}),T=null;let v0={session_id:G.session_id,environment_id:G.environment_id,hands_protocol_version:N9,hands_worker_version:M9,hands_worker_artifact_sha256:K0,hands_worker_entrypoint:a0,target_generation:G.target_generation,target_fence_id:G.target_fence_id,executor_launch_id:u},g9=null,I$=!1,R$=!1,E$,Q0=null,S$,w$,h9="failed",b$=null,x8=Promise.resolve(),k$=null,P8=async(l,e)=>{try{await B(l,e)}catch{}};try{J("event_started");let l,e=(async()=>{await $.emitEvent("hands.started",{...v0,policy_mode:"full_access",policy_version:1,path_source:D.source}),l=Date.now()})();e.catch(()=>{return}),J("worker_setup");let c0=G.browser_egress?{mode:"enforce",allowedDomains:G.browser_egress.allowed_domains}:{mode:"off"};if(j&&j!=="bash")g9=await(Z.startNodeRepl??Y4)({socketPath:B0,workRoot:d});else if(!W&&!G.cloud_browser&&M)g9=await(Z.startRepl??kQ)({socketPath:B0,browserExecutablePath:M,workspaceRoot:n,...$.managedBrowser?{managedBrowser:$.managedBrowser}:{},...$.desktopRecording?{recording:$.desktopRecording}:{},networkPolicy:c0,onEgressDenied:(g)=>{let F0=gQ(g.host);Q(JSON.stringify({event:"sandbox.repl_egress_denied",destination_id:F0,reason:g.reason,run_id:$.runId})),x8=x8.then(()=>B("hands.browser_egress_denied",{destination_id:F0,reason:g.reason})).catch((c9)=>{k$??=c9})}}).catch((g)=>{if(!U||$.signal.aborted||z()>=Date.parse(G.expires_at)||!B2(g,B0))throw g;return Object.assign(A8,{allowedTools:["bash","read","write","edit"]}),C8(y,JSON.stringify(A8),{mode:384}),R$=!0,null});let $9=K2({configPath:y,root:n,grantedRoot:b,workRoot:d,workspacePoolPath:M0,temporaryDirectory:_,path:D.path,executablePath:Z.executablePath,sourceEntrypoint:Z.sourceEntrypoint}),I8=Date.now(),R8,f$,E8=Z.takePrespawnedWorker?.($9)??null;if(E$=Z.takePrespawnedWorker?E8!==null:void 0,Q0=E8??(Z.spawnWorker??((g)=>R6(g.command,g.args,g.options)))($9),!E8)Z.adoptSpawnedWorker?.(Q0);Q0.stderr?.on("data",V2(u,(g)=>{if(g.event==="hands.worker.connecting")R8??=g.timestampMs;else if(g.event==="hands.worker.open")f$??=g.timestampMs;if(Q(JSON.stringify({...g,run_id:$.runId})),g.event==="hands.worker.permission_denied"&&typeof g.reason==="string"){let[F0,c9]=g.reason.split(":");if(["sandbox_policy","os_permission_unknown"].includes(F0??"")&&["bash","read","write","edit"].includes(c9??""))B("permission.denied",{provenance:F0,operation:c9}).catch(()=>{return})}}));let m$=!1;Q0.on("error",()=>{m$=!0}),Q0.once("exit",(g,F0)=>{try{Q(JSON.stringify({event:"hands.worker.exited",run_id:$.runId,launchId:u,exit_code:g,exit_signal:F0}))}catch{}}),E=Q0,J("worker_ready_wait");let C9=await H2({path:c,launchId:u,fenceId:r,targetGeneration:G.target_generation,child:Q0,spawnFailed:()=>m$,signal:$.signal,timeoutMs:Z.readyTimeoutMs??c6,now:z}),w4=Date.now();if(Y0=()=>{if(!Q0||Q0.exitCode!==null||Q0.signalCode!==null)return null;let g=L8(c,C9);return g?{generation:g.targetGeneration,fenceId:g.fenceId}:null},t){let g={root:b,runId:$.runId,operationId:$.operationId,scopeId:t.scopeId,socketPath:t.socketPath,generation:C9.targetGeneration,fenceId:C9.fenceId,executorLaunchId:u,expiresAtMs:Date.parse(G.expires_at),readIdentity:Y0,workspace:W0,localGithubConfinement:$.localGithubConfinement===!0};if(X0)g.environment=X0;if($.claimOwner&&$.deviceIdentity&&$.claimOwner.device_id===$.deviceIdentity.deviceId){let F0=[$.deviceIdentity.apiOrigin,G.relay_url];if(h0)F0.push(h0);g.previewAuthority={owner:Object.freeze({...$.claimOwner}),rootId:$.deviceIdentity.rootId,relayOrigin:new URL(G.relay_url).origin,deniedPorts:JZ(F0)}}w$=RZ(g)}if(await new Promise((g)=>{setImmediate(g)}),g0)x4(d);let v9;if(Y&&X0){try{let g=X0.install(Y);v9={snapshot_id:g.snapshot_id,installed_revision:g.installed_revision}}catch{}try{Q(JSON.stringify({event:"hands.environment_at_claim",run_id:$.runId,installed:v9!==void 0}))}catch{}}Y=void 0,J("event_ready");let y$=V(e);y$.catch(()=>{return});let g$=Date.now();I$=!0,await B("hands.ready",{...v0,expiry_diagnostic:F,startup_stages:{version:1,browser_resolution_ms:V0(X.get("browser_resolution"),X.get("path_resolution")),path_resolution_ms:V0(X.get("path_resolution"),X.get("workspace_setup")),workspace_setup_ms:V0(X.get("workspace_setup"),X.get("event_started")),repl_setup_ms:V0(X.get("worker_setup"),I8),worker_boot_ms:V0(I8,R8),worker_dial_ms:V0(R8,f$),worker_ready_ms:V0(I8,w4),started_event_ms:V0(X.get("event_started"),l),started_join_wait_ms:V0(X.get("event_ready"),g$),total_ms:V0(X.get("entered"),g$)},...N2($.claimedAtMs,X.get("entered"),E$),...$.managedPty?.startupVerified===!0?{managed_pty:{version:1,execution_mode:"host",descendant_cleanup_verified:!0}}:{},policy_mode:"full_access",policy_version:1,path_source:D.source,connection_generation:C9.generation,...v9?{environment_installed:v9}:{},...U&&!g9?{browser_state:"unavailable",browser_reason_code:R$?"setup_failed":"not_resolved"}:{viewport_width:1440,viewport_height:900}}),await y$,J("ready"),S$=Q4({path:c,initial:C9,signal:$.signal,isAlive:()=>Q0!==null&&Q0.exitCode===null&&Q0.signalCode===null&&z()<Date.parse(G.expires_at),publish:(g,F0)=>$.emitEvent("hands.reconnected",{...v0,target_generation:g.targetGeneration,target_fence_id:g.fenceId,connection_generation:g.generation},F0),failed:()=>Q(JSON.stringify({event:"hands.worker.generation_proof_failed",run_id:$.runId,executor_launch_id:u}))});let h$=await W2({child:Q0,signal:$.signal,expiresAt:Date.parse(G.expires_at),now:z});if(h$==="cancelled"){let g=$.signal.reason instanceof q?$.signal.reason.code:"cancelled";throw h9=g,new q(g,"Reason Hands was cancelled.")}if(h$==="exited")throw new q("hands_worker_exited","Reason Hands exited unexpectedly.");return h9="expired",{...v0,policy_mode:"full_access",policy_version:1,ended:"expired"}}catch(l){b$=l;let e=l instanceof q?l.code:"hands_failed",c0=e==="cancelled"||["run_finished","run_cancelled","driver_handoff","driver_stopped"].includes(e);if(h9=c0?e:"failed",!c0)await P8("hands.failed",{...v0,reason_code:e});throw l}finally{S$?.stop(),w$?.();let l=Q0?await U2(Q0,Z.stopTimeoutMs??d6):null,e=!1;await $.desktopRecording?.close();try{await g9?.stop()}catch{e=!0}if(await x8,(l==="stopped"||l==="already_exited"&&!I$)&&!e)await P8("hands.stopped",{...v0,reason_code:h9});else if(l!==null||e){if(await P8("hands.failed",{...v0,reason_code:l==="forced"?"hands_stop_forced":"hands_stop_unconfirmed"}),b$===null||e)throw new q("hands_stop_unconfirmed","Reason Hands resource cleanup could not be proven.")}if(k$!==null)throw new q("hands_egress_audit_failed","Reason Hands could not persist a browser egress denial receipt.")}}catch(N){let M=fQ(T,N);if(M)try{Q(JSON.stringify({event:"sandbox.hands_workspace_failed",...M}))}catch{}throw N}finally{try{if(!E||E.exitCode!==null||E.signalCode!==null)m?.();if(S!==null&&(!E||E.exitCode!==null||E.signalCode!==null))y6(S,{recursive:!0,force:!0})}finally{P?.(),R()}}}
|
|
458
|
+
export{v as ib,o$ as jb,r$ as kb,Q3 as lb,ZZ as mb,u9 as nb,O2 as ob,D2 as pb,_2 as qb,XZ as rb,JZ as sb,$X as tb,PZ as ub,NX as vb,MX as wb,jX as xb,qX as yb,CX as zb,TX as Ab,SZ as Bb,OX as Cb,_X as Db,p as Eb,L0 as Fb,BJ as Gb,LJ as Hb,SJ as Ib,wJ as Jb,hZ as Kb,oQ as Lb,bX as Mb,dZ as Nb,sZ as Ob,nZ as Pb,z5 as Qb,K5 as Rb,J0 as Sb,F5 as Tb,V5 as Ub,H5 as Vb,C5 as Wb,q1 as Xb,T5 as Yb,E9 as Zb,A0 as _b,O5 as $b,u5 as ac,O1 as bc,D1 as cc,LQ as dc,b5 as ec,S9 as fc,L7 as gc,C$ as hc,K4 as ic,U4 as jc,x$ as kc,l6 as lc,NG as mc,MG as nc,A4 as oc,o6 as pc,x4 as qc,P4 as rc,K2 as sc,F2 as tc,W4 as uc,jG as vc,qG as wc};
|