@reason-machines/cli-linux-arm64 0.2.419 → 0.2.422
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/reason +1 -1
- package/bin/vm-hands/{connect-cli-k7px2rdj.js → connect-cli-qtbe4v66.js} +1 -1
- package/bin/vm-hands/{local-automation-y36wa5fz.js → local-automation-0gmnztwx.js} +1 -1
- package/bin/vm-hands/{local-capabilities-t6fwch4h.js → local-capabilities-vfteeg61.js} +1 -1
- package/bin/vm-hands/{local-display-session-5cgt72jx.js → local-display-session-bnc6whgt.js} +1 -1
- package/bin/vm-hands/local-display-video-mtd0gnyg.js +2 -0
- package/bin/vm-hands/{local-managed-process-bnqnzd8d.js → local-managed-process-khhmd6pe.js} +1 -1
- package/bin/vm-hands/{managed-runtime-wbsp37xw.js → managed-runtime-hv0hwf1j.js} +1 -1
- package/bin/vm-hands/{permissions-vys6xvz7.js → permissions-rr3e1yd5.js} +1 -1
- package/bin/vm-hands/{serve-service-rcvza2vj.js → serve-service-pb0ch11d.js} +1 -1
- package/bin/vm-hands/{status-5q2w623r.js → status-4pmpra54.js} +1 -1
- package/bin/vm-hands/version-8z9rdrb0.js +2 -0
- package/bin/vm-hands/vm-hands-entry-lite-1pabvq5q.js +2 -0
- package/bin/vm-hands/{vm-hands-entry-lite-ehthgxsx.js → vm-hands-entry-lite-1qpwpdcc.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-pcvgqrse.js → vm-hands-entry-lite-2e15739v.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-706c7f7x.js → vm-hands-entry-lite-3tx0tkeq.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-03gh7msy.js → vm-hands-entry-lite-6gv0d400.js} +5 -5
- package/bin/vm-hands/{vm-hands-entry-lite-8h2p4crd.js → vm-hands-entry-lite-7m9dr2mg.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-tfra9vjt.js → vm-hands-entry-lite-94bm9vgk.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-34z9890s.js → vm-hands-entry-lite-aapdds5x.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-2nvhegyc.js → vm-hands-entry-lite-bknthqy2.js} +1 -1
- package/bin/vm-hands/vm-hands-entry-lite-dht2p1vj.js +128 -0
- package/bin/vm-hands/{vm-hands-entry-lite-09sq8090.js → vm-hands-entry-lite-dzv12jpj.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-p9v963ks.js → vm-hands-entry-lite-jjwcsywg.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-w8ykfw5h.js → vm-hands-entry-lite-kz0b5h2f.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-wmynasc4.js → vm-hands-entry-lite-xvmeb9e8.js} +1 -1
- package/bin/vm-hands/vm-hands-entry-lite.js +2 -2
- package/bin/vm-hands/vm-hands-executor-z222kmvg.js +11 -0
- package/bin/vm-hands/{vm-hands-op-runner-7tcv4e0v.js → vm-hands-op-runner-34d38g9f.js} +1 -1
- package/bin/vm-hands/{vm-hands-runtime-mc2e6wsv.js → vm-hands-runtime-h0trw0xr.js} +3 -3
- package/package.json +1 -1
- package/bin/vm-hands/local-display-video-3xk3kg9p.js +0 -2
- package/bin/vm-hands/version-qgew2890.js +0 -2
- package/bin/vm-hands/vm-hands-entry-lite-ewxc9m4d.js +0 -128
- package/bin/vm-hands/vm-hands-entry-lite-f1by8av5.js +0 -2
- package/bin/vm-hands/vm-hands-executor-6357p4cd.js +0 -11
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{ei,bt,Re,vt,ri,Ai}from"./vm-hands-entry-lite-4vks5phw.js";import{createHash as V,randomBytes as _e}from"crypto";import{closeSync as Ee,fsyncSync as Pe,mkdirSync as Le,openSync as Te,renameSync as Je,rmSync as Ye,statSync as Ae,writeSync as xe,constants as z}from"fs";import{join as ne}from"path";var Xe=1;var te=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function he(e){if(e.environment!==void 0||e.payload.environment!==void 0)throw new l("vm_hands_bind_invalid","bind carries a plaintext environment");if(e.payload.vm_hands_env_deferred===!0&&e.environment_sealed!==void 0)throw new l("vm_hands_bind_invalid","split bind carries an environment");return e.environment_sealed!==void 0}function Ie(e,n){let{payload:i,authority:r}=e;if(!i||typeof i!=="object"||Array.isArray(i)||!r||typeof r!=="object"||Array.isArray(r)||!n.deviceId||!n.rootId||i.run_id!==n.runId||i.device_id!==n.deviceId||r.device_id!==n.deviceId||i.root_id!==n.rootId||n.snapshotId!==void 0&&i.snapshot_id!==n.snapshotId)throw new l("vm_hands_env_invalid","environment does not match this Hands");return i}function Oe(e){if(e.capability!=="hands.connect")throw new l("vm_hands_bind_invalid","not a hands.connect claim");let n=e.payload;return{kind:"vm_hands.bind",v:1,bind_id:e.attempt_id,attempt_id:e.attempt_id,attempt_token:e.attempt_token,run_id:e.run_id,session_id:typeof n.workspace_id==="string"&&te.test(n.workspace_id)?n.workspace_id:e.run_id,brain_generation:n.target_generation,fence_id:n.target_fence_id,lease_until:e.lease_until,policy:{agent_profile:"",confinement_key:String(n.hands_confinement??""),browser_egress:n.browser_egress??null,policy_digest:n.vm_hands_policy_digest},cwd:typeof n.cwd==="string"?n.cwd:"",claim:e,env:he(e)?e.environment_sealed:null,workspace_deferred:Qe(e)}}function Qe(e){let n=e.payload[Re];if(n===void 0)return!1;if(n!==!0||e.payload.vm_hands_env_deferred!==!0||e.environment_sealed!==void 0)throw new l("vm_hands_bind_invalid","a pre-bind must be environment-less");return!0}class l extends Error{code;constructor(e,n){super(n);this.code=e}}var W=(e)=>Buffer.from(e instanceof Uint8Array?e:new Uint8Array(e)).toString("base64url"),G=(e)=>new Uint8Array(Buffer.from(e,"base64url"));function K(e){if(e===null||typeof e!=="object")return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(K).join(",")}]`;return`{${Object.keys(e).sort().map((n)=>`${JSON.stringify(n)}:${K(e[n])}`).join(",")}}`}async function Li(e){let n=await crypto.subtle.importKey("pkcs8",G(e.device_key.pkcs8),{name:"ECDSA",namedCurve:"P-256"},!1,["sign"]),i=G(e.device_key.spki),r=await crypto.subtle.generateKey({name:"ECDH",namedCurve:"P-256"},!1,["deriveKey"]),p=new Uint8Array(await crypto.subtle.exportKey("spki",r.publicKey)),_=V("sha256").update(i).digest("base64url");return{signing:{privateKey:n},agreement:r,signingSpki:i,agreementSpki:p,fingerprint:_}}var Ze=4;class an{init;keys;hooks;options;identity="identity_free";lastBrainGeneration=new Map;bound=new Map;binding=new Map;unbinding=new Set;servedRun=!1;commandsSinceVerified=!1;bootKillPending=!1;unverified=new Set;unverifiedTeardowns=new Map;grants=new Map;structural=Promise.resolve();exclusive(e){let n=this.structural.then(e,e);return this.structural=n.catch(()=>{return}),n}constructor(e,n,i,r){this.init=e;this.keys=n;this.hooks=i;this.options=r;if(!te.test(e.workspace_id)&&!/^ws-[a-z0-9]{8,64}$/.test(e.workspace_id))throw new l("vm_hands_layout_invalid","bad workspace id");if(!Number.isSafeInteger(e.instance_generation)||e.instance_generation<1)throw new l("vm_hands_layout_invalid","bad generation")}get phase(){if(this.identity==="identity_free")return"identity_free";if(this.unbinding.size)return"unbinding";return this.bound.size||this.binding.size?"bound":"registered"}isBoundRun(e){for(let n of this.bound.values())if(n.runId===e)return!0;return!1}bindIdForRun(e){for(let n of this.bound.values())if(n.runId===e)return n.bindId;return null}get liveBindIds(){return[...new Set([...this.bound.keys(),...this.binding.keys(),...this.unbinding])]}get settingUp(){return this.binding.size>0}async environmentInstalled(e,n,i){for(let r=Date.now()+n;;){let p=this.bound.get(e);if(!p)return!1;if(p.envInstalled)return!0;if(Date.now()>=r||i?.aborted)return!1;await new Promise((_)=>setTimeout(_,25))}}opServed(){this.commandsSinceVerified=!0}canSpawn(e){for(let n of this.bound.values())if(n.runId===e)return n.envInstalled;return!1}async registerFrame(e){if(this.identity!=="identity_free")throw new l("vm_hands_register_twice","already registered");if(typeof e!=="string"||e.length<16||e.length>256)throw new l("vm_hands_challenge_invalid","bad register challenge");let n={challenge:e,t:"register",v:Xe,workspace_id:this.init.workspace_id,instance_generation:this.init.instance_generation,credential:this.init.credential,device_public_key:W(this.keys.signingSpki),env_public_key:W(this.keys.agreementSpki),key_fingerprint:this.keys.fingerprint,manifest_digest:this.init.manifest_digest,nonce:W(_e(32)),timestamp_ms:(this.options.now??Date.now)(),vm_hands_attest_hold:!0},i=await crypto.subtle.sign({name:"ECDSA",hash:"SHA-256"},this.keys.signing.privateKey,new TextEncoder().encode(K(n)));return{...n,device_signature:W(i)}}async helloFrame(e,n){if(this.identity==="identity_free")throw new l("vm_hands_not_registered","hello before register");let i=String((this.options.now??Date.now)()),r=W(_e(32)),p=Ai({method:"GET",pathAndQuery:ei,timestamp:i,nonce:r,challenge:e,bodySha256:V("sha256").update("").digest("hex")}),_=new Uint8Array(await crypto.subtle.sign({name:"ECDSA",hash:"SHA-256"},this.keys.signing.privateKey,new Uint8Array(p)));return{t:"hello",timestamp:i,nonce:r,signature:W(en(_)),...n?{vm_hands_previous_connection:n}:{}}}registered(){if(this.identity!=="identity_free")throw new l("vm_hands_register_unexpected","registered twice");this.identity="registered"}async bind(e){if(this.identity!=="registered")throw new l("vm_hands_not_registered","bind before register");if(e.kind!=="vm_hands.bind"||e.v!==1)throw new l("vm_hands_bind_invalid","bad bind");for(let i of[e.bind_id,e.attempt_id,e.run_id,e.session_id,e.fence_id])if(!te.test(i))throw new l("vm_hands_bind_invalid","bad id");if(!Number.isSafeInteger(e.brain_generation)||e.brain_generation<=(this.lastBrainGeneration.get(e.run_id)??0))throw new l("vm_hands_generation_stale","brain generation not strictly higher");if(e.env&&(e.env.aad!==e.bind_id||e.env.alg!=="ECDH-P256+A256GCM"))throw new l("vm_hands_bind_invalid","bad env envelope");if(!/^[0-9a-f]{64}$/.test(e.policy.policy_digest))throw new l("vm_hands_bind_invalid","bad policy or nonce");if(V("sha256").update(K({hands_confinement:e.policy.confinement_key||null,browser_egress:e.policy.browser_egress??null})).digest("hex")!==e.policy.policy_digest)throw new l("vm_hands_policy_mismatch","policy digest does not match the claim");if(this.liveBindIds.includes(e.bind_id)||[...this.bound.values()].some((i)=>i.runId===e.run_id)||[...this.binding.values()].includes(e.run_id))throw new l("vm_hands_busy","this run already holds a bind here");if(this.liveBindIds.length>=Ze)throw new l("vm_hands_busy","every bind slot is held");if(this.grants.size)throw new l("vm_hands_busy","a bind waits for its workspace beside the setup");if(e.workspace_deferred&&(this.liveBindIds.length||this.commandsSinceVerified))throw new l("vm_hands_prebind_unsafe","a pre-bind needs a VM that served nothing since its last full kill");if(this.lastBrainGeneration.set(e.run_id,e.brain_generation),this.binding.set(e.bind_id,e.run_id),e.workspace_deferred){let i,r,p=new Promise((_,m)=>{i=_,r=m});p.catch(()=>{return}),this.grants.set(e.bind_id,{promise:p,resolve:i,reject:r})}return this.exclusive(()=>this.setUp(e))}async setUp(e){let n=[...this.bound.keys()],i=null,r=!1,p=this.grants.get(e.bind_id);try{if(p&&(n.length||this.commandsSinceVerified))throw new l("vm_hands_prebind_unsafe","a pre-bind needs a VM that served nothing since its last full kill");if(n.length===0){if(this.bootKillPending&&!this.servedRun){try{await this.hooks.killProbe()}catch{throw new l("vm_hands_kill_unverified","the boot's scoped kill did not verify")}this.bootKillPending=!1}if(this.commandsSinceVerified)await this.hooks.killAndVerifyPayload(),this.unverified.clear(),this.commandsSinceVerified=!1;else if(this.unverified.size>0)await this.hooks.killAndVerifyPayload({own:!0}),this.unverified.clear()}else if(this.unverified.size>0)await this.hooks.killAndVerifyPayload({keep:n}),this.unverified.clear();this.servedRun=!0,r=!0;let{launchId:_,applied:m,readyData:k}=await this.hooks.startExecutor({bindId:e.bind_id,sessionId:e.session_id,policyDigest:e.policy.policy_digest,confinementKey:e.policy.confinement_key,browserEgress:e.policy.browser_egress,cwd:e.cwd,claim:e.claim,...p?{workspaceGrant:p.promise}:{}}),S=this.hooks.restatLayout();this.hooks.verifyMounts?.();let I=null,b=null;if(e.env){let R=e.claim?.owner??{},C=Ie(await this.openSealed(e.env,e.bind_id),{runId:e.run_id,deviceId:typeof R.device_id==="string"?R.device_id:"",rootId:e.claim?.root_id??""});this.commandsSinceVerified=!0,I=this.hooks.installEnvironment(e.bind_id,C),b=typeof C.snapshot_id==="string"&&C.snapshot_id?C.snapshot_id:null,i=this.writeJobEnvRootOnly(e.bind_id,C)}if(this.unbinding.has(e.bind_id))throw new l("vm_hands_bind_lost","unbound while binding");return this.bound.set(e.bind_id,{bindId:e.bind_id,runId:e.run_id,sessionId:e.session_id,brainGeneration:e.brain_generation,policyDigest:e.policy.policy_digest,launchId:_,envInstalled:I!==null,rootId:e.claim?.root_id??"",envDirectory:i}),this.binding.delete(e.bind_id),this.grants.delete(e.bind_id),{bind_id:e.bind_id,attempt_id:e.attempt_id,attempt_token:e.attempt_token,launch_id:_,snapshot_revision:I,snapshot_id:b,layout:S,...k?{ready_data:k}:{},policy_digest:V("sha256").update(K({hands_confinement:m.hands_confinement??null,browser_egress:m.browser_egress??null})).digest("hex")}}catch(_){if(i)me(i);if(r){let k=[...this.bound.keys()];await this.hooks.killAndVerifyPayload({bindId:e.bind_id,keep:k,own:!0}).catch(()=>{this.unverified.add(e.bind_id)})}this.binding.delete(e.bind_id),this.grants.delete(e.bind_id);let m=_&&typeof _==="object"&&"code"in _&&typeof _.code==="string"&&/^[a-z][a-z0-9_]{2,63}$/.test(_.code)?_.code:"vm_hands_bind_failed";throw _ instanceof l?_:new l(m,"executor refused the bind")}}grantWorkspace(e){let n=this.grants.get(e);if(!n)throw new l("vm_hands_not_binding","no pre-bind waits for a workspace grant");n.resolve()}abandonWorkspaceGrant(e){this.grants.get(e)?.reject(new l("vm_hands_bind_lost","the pre-bind ended before its workspace grant"))}async deliverEnvironment(e){let n=this.bound.get(e.attemptId);if(!n||this.unbinding.has(e.attemptId))throw new l("vm_hands_not_bound","environment delivered while not bound");if(!te.test(e.attemptId)||typeof e.snapshotId!=="string"||!e.snapshotId||e.snapshotId.length>128||e.snapshotId.includes("/"))throw new l("vm_hands_env_invalid","bad snapshot id");let i=`${e.attemptId}/${e.snapshotId}`;if(e.sealed?.alg!=="ECDH-P256+A256GCM"||e.sealed.aad!==i)throw new l("vm_hands_env_invalid","bad env envelope");let r=Ie(await this.openSealed(e.sealed,i),{runId:n.runId,deviceId:e.deviceId,rootId:n.rootId,snapshotId:e.snapshotId});this.commandsSinceVerified=!0;let p=this.hooks.installEnvironment(n.bindId,r);if(n.envInstalled=!0,n.envDirectory)me(n.envDirectory);return n.envDirectory=null,n.envDirectory=this.writeJobEnvRootOnly(`${n.bindId}-r${p}`,r),{snapshot_id:e.snapshotId,installed_revision:p,installed:!0}}async attestFrame(e,n){if(this.identity==="identity_free")throw new l("vm_hands_not_registered","attest before register");if(!e||e.length>65536)throw new l("vm_hands_attest_invalid","no probe script");return this.exclusive(async()=>{if(this.liveBindIds.length)throw new l("vm_hands_attest_invalid","attest beside a bind");let i=await this.hooks.runProbe({nonce:n,script:e});try{await this.hooks.killProbe()}catch{this.bootKillPending=!0}return{t:"attest",nonce:n,exit_code:i.exitCode,markers:i.markers,proof_dir_inode:i.proofDirInode,script_sha256:V("sha256").update(e).digest("hex")}})}executorExited(e){return this.hooks.executorExited?.(e)??new Promise(()=>{})}async boundRefused(e){await this.unbind(e)}async unbind(e){let n=this.bound.get(e)??null;if(this.unbinding.add(e),this.bound.delete(e),this.abandonWorkspaceGrant(e),n)try{this.hooks.freezeBind?.(e)}catch{}return this.exclusive(()=>this.tearDown(e,n))}async retryUnbind(e){if(!this.unverifiedTeardowns.has(e))throw new l("vm_hands_unbind_unknown","no unverified unbind of this bind");return this.exclusive(async()=>{if(!this.unverifiedTeardowns.has(e))throw new l("vm_hands_unbind_unknown","no unverified unbind of this bind");return this.tearDown(e,this.unverifiedTeardowns.get(e)??null,!0)})}async tearDown(e,n,i=!1){try{this.bound.delete(e);let r=[...this.bound.keys()].filter((_)=>_!==e),p=!r.length&&(i||!this.commandsSinceVerified);try{await this.hooks.killAndVerifyPayload(r.length?{bindId:e,keep:r}:p?{bindId:e,own:!0}:void 0)}catch(_){if(this.unverified.add(e),!this.unverifiedTeardowns.has(e))this.unverifiedTeardowns.set(e,n);throw _}if(this.unverified.delete(e),!r.length&&!i)this.unverified.clear(),this.commandsSinceVerified=!1;if(n?.envDirectory)me(n.envDirectory);return this.unverifiedTeardowns.delete(e),{bind_id:n?e:null,killed_verified:!0,shredded:!0,srt_fallbacks:r.length||i?null:this.hooks.takeSrtFallbacks?.()??null}}finally{this.unbinding.delete(e)}}async openSealed(e,n){let i=()=>{throw new l("vm_hands_env_invalid","env did not decrypt")},r=await crypto.subtle.importKey("spki",G(e.epk),{name:"ECDH",namedCurve:"P-256"},!1,[]).catch(i),p=await crypto.subtle.deriveKey({name:"ECDH",public:r},this.keys.agreement.privateKey,{name:"AES-GCM",length:256},!1,["decrypt"]),_=await crypto.subtle.decrypt({name:"AES-GCM",iv:G(e.iv),additionalData:new TextEncoder().encode(n)},p,G(e.ct)).catch(i),m=JSON.parse(new TextDecoder().decode(_));if(!m||typeof m!=="object"||Array.isArray(m))throw new l("vm_hands_env_invalid","env not an object");return m}writeJobEnvRootOnly(e,n){let i=ne(this.options.envRoot,`bind-${e}`);Le(i,{mode:448});let r=Ae(i);if(!r.isDirectory()||(r.mode&63)!==0||r.uid!==(process.getuid?.()??-1))throw new l("vm_hands_env_dir_unsafe","env directory is not root's 0700");let p=n.variables&&typeof n.variables==="object"?n.variables:{},_=Object.entries(p).filter(([S,I])=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(S)&&typeof I==="string").map(([S,I])=>`export ${S}='${String(I).replaceAll("'","'\\''")}'`).join(`
|
|
2
|
+
import{ei,bt,Re,vt,ri,Ai}from"./vm-hands-entry-lite-4vks5phw.js";import{createHash as H,randomBytes as me}from"crypto";import{closeSync as Te,fsyncSync as Ae,mkdirSync as Ye,openSync as xe,renameSync as Xe,rmSync as Qe,statSync as Oe,writeSync as De,constants as F}from"fs";import{join as ie}from"path";var Ze=1;var re=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function he(e){if(e.environment!==void 0||e.payload.environment!==void 0)throw new l("vm_hands_bind_invalid","bind carries a plaintext environment");if(e.payload.vm_hands_env_deferred===!0&&e.environment_sealed!==void 0)throw new l("vm_hands_bind_invalid","split bind carries an environment");return e.environment_sealed!==void 0}function Pe(e,n){let{payload:i,authority:r}=e;if(!i||typeof i!=="object"||Array.isArray(i)||!r||typeof r!=="object"||Array.isArray(r)||!n.deviceId||!n.rootId||i.run_id!==n.runId||i.device_id!==n.deviceId||r.device_id!==n.deviceId||i.root_id!==n.rootId||n.snapshotId!==void 0&&i.snapshot_id!==n.snapshotId)throw new l("vm_hands_env_invalid","environment does not match this Hands");return i}function fe(e){if(e.capability!=="hands.connect")throw new l("vm_hands_bind_invalid","not a hands.connect claim");let n=e.payload;return{kind:"vm_hands.bind",v:1,bind_id:e.attempt_id,attempt_id:e.attempt_id,attempt_token:e.attempt_token,run_id:e.run_id,session_id:typeof n.workspace_id==="string"&&re.test(n.workspace_id)?n.workspace_id:e.run_id,brain_generation:n.target_generation,fence_id:n.target_fence_id,lease_until:e.lease_until,policy:{agent_profile:"",confinement_key:String(n.hands_confinement??""),browser_egress:n.browser_egress??null,policy_digest:n.vm_hands_policy_digest},cwd:typeof n.cwd==="string"?n.cwd:"",claim:e,env:he(e)?e.environment_sealed:null,workspace_deferred:en(e)}}function en(e){let n=e.payload[Re];if(n===void 0)return!1;if(n!==!0||e.payload.vm_hands_env_deferred!==!0||e.environment_sealed!==void 0)throw new l("vm_hands_bind_invalid","a pre-bind must be environment-less");return!0}class l extends Error{code;constructor(e,n){super(n);this.code=e}}var z=(e)=>Buffer.from(e instanceof Uint8Array?e:new Uint8Array(e)).toString("base64url"),V=(e)=>new Uint8Array(Buffer.from(e,"base64url"));function L(e){if(e===null||typeof e!=="object")return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(L).join(",")}]`;return`{${Object.keys(e).sort().map((n)=>`${JSON.stringify(n)}:${L(e[n])}`).join(",")}}`}async function Li(e){let n=await crypto.subtle.importKey("pkcs8",V(e.device_key.pkcs8),{name:"ECDSA",namedCurve:"P-256"},!1,["sign"]),i=V(e.device_key.spki),r=await crypto.subtle.generateKey({name:"ECDH",namedCurve:"P-256"},!1,["deriveKey"]),f=new Uint8Array(await crypto.subtle.exportKey("spki",r.publicKey)),_=H("sha256").update(i).digest("base64url");return{signing:{privateKey:n},agreement:r,signingSpki:i,agreementSpki:f,fingerprint:_}}var nn=16;class an{init;keys;hooks;options;identity="identity_free";lastBrainGeneration=new Map;bound=new Map;binding=new Map;unbinding=new Set;servedRun=!1;bootKillPending=!1;unverified=new Set;unverifiedTeardowns=new Map;grants=new Map;structural=Promise.resolve();exclusive(e){let n=this.structural.then(e,e);return this.structural=n.catch(()=>{return}),n}constructor(e,n,i,r){this.init=e;this.keys=n;this.hooks=i;this.options=r;if(!re.test(e.workspace_id)&&!/^ws-[a-z0-9]{8,64}$/.test(e.workspace_id))throw new l("vm_hands_layout_invalid","bad workspace id");if(!Number.isSafeInteger(e.instance_generation)||e.instance_generation<1)throw new l("vm_hands_layout_invalid","bad generation")}get phase(){if(this.identity==="identity_free")return"identity_free";if(this.unbinding.size)return"unbinding";return this.bound.size||this.binding.size?"bound":"registered"}isBoundRun(e){for(let n of this.bound.values())if(n.runId===e)return!0;return!1}bindIdForRun(e){for(let n of this.bound.values())if(n.runId===e)return n.bindId;return null}get liveBindIds(){return[...new Set([...this.bound.keys(),...this.binding.keys(),...this.unbinding])]}get liveSessionIds(){return[...new Set([...this.bound.values()].map((e)=>e.sessionId.toLowerCase()))]}get settingUp(){return this.binding.size>0}async environmentInstalled(e,n,i){for(let r=Date.now()+n;;){let f=this.bound.get(e);if(!f)return!1;if(f.envInstalled)return!0;if(Date.now()>=r||i?.aborted)return!1;await new Promise((_)=>setTimeout(_,25))}}canSpawn(e){for(let n of this.bound.values())if(n.runId===e)return n.envInstalled;return!1}async registerFrame(e){if(this.identity!=="identity_free")throw new l("vm_hands_register_twice","already registered");if(typeof e!=="string"||e.length<16||e.length>256)throw new l("vm_hands_challenge_invalid","bad register challenge");let n={challenge:e,t:"register",v:Ze,workspace_id:this.init.workspace_id,instance_generation:this.init.instance_generation,credential:this.init.credential,device_public_key:z(this.keys.signingSpki),env_public_key:z(this.keys.agreementSpki),key_fingerprint:this.keys.fingerprint,manifest_digest:this.init.manifest_digest,nonce:z(me(32)),timestamp_ms:(this.options.now??Date.now)(),vm_hands_attest_hold:!0},i=await crypto.subtle.sign({name:"ECDSA",hash:"SHA-256"},this.keys.signing.privateKey,new TextEncoder().encode(L(n)));return{...n,device_signature:z(i)}}async helloFrame(e,n){if(this.identity==="identity_free")throw new l("vm_hands_not_registered","hello before register");let i=String((this.options.now??Date.now)()),r=z(me(32)),f=Ai({method:"GET",pathAndQuery:ei,timestamp:i,nonce:r,challenge:e,bodySha256:H("sha256").update("").digest("hex")}),_=new Uint8Array(await crypto.subtle.sign({name:"ECDSA",hash:"SHA-256"},this.keys.signing.privateKey,new Uint8Array(f)));return{t:"hello",timestamp:i,nonce:r,signature:z(tn(_)),...n?{vm_hands_previous_connection:n}:{}}}registered(){if(this.identity!=="identity_free")throw new l("vm_hands_register_unexpected","registered twice");this.identity="registered"}async bind(e){if(this.identity!=="registered")throw new l("vm_hands_not_registered","bind before register");if(e.kind!=="vm_hands.bind"||e.v!==1)throw new l("vm_hands_bind_invalid","bad bind");for(let i of[e.bind_id,e.attempt_id,e.run_id,e.session_id,e.fence_id])if(!re.test(i))throw new l("vm_hands_bind_invalid","bad id");if(!Number.isSafeInteger(e.brain_generation)||e.brain_generation<=(this.lastBrainGeneration.get(e.run_id)??0))throw new l("vm_hands_generation_stale","brain generation not strictly higher");if(e.env&&(e.env.aad!==e.bind_id||e.env.alg!=="ECDH-P256+A256GCM"))throw new l("vm_hands_bind_invalid","bad env envelope");if(!/^[0-9a-f]{64}$/.test(e.policy.policy_digest))throw new l("vm_hands_bind_invalid","bad policy or nonce");if(H("sha256").update(L({hands_confinement:e.policy.confinement_key||null,browser_egress:e.policy.browser_egress??null})).digest("hex")!==e.policy.policy_digest)throw new l("vm_hands_policy_mismatch","policy digest does not match the claim");if(this.liveBindIds.includes(e.bind_id)||[...this.bound.values()].some((i)=>i.runId===e.run_id)||[...this.binding.values()].includes(e.run_id))throw new l("vm_hands_busy","this run already holds a bind here");if(this.liveBindIds.length>=nn)throw new l("vm_hands_busy","every bind slot is held");if(this.grants.size)throw new l("vm_hands_busy","a bind waits for its workspace beside the setup");if(e.workspace_deferred&&this.liveBindIds.length)throw new l("vm_hands_prebind_unsafe","a pre-bind needs a VM with no other live bind");if(this.lastBrainGeneration.set(e.run_id,e.brain_generation),this.binding.set(e.bind_id,e.run_id),e.workspace_deferred){let i,r,f=new Promise((_,m)=>{i=_,r=m});f.catch(()=>{return}),this.grants.set(e.bind_id,{promise:f,resolve:i,reject:r})}return this.exclusive(()=>this.setUp(e))}async setUp(e){let n=[...this.bound.keys()],i=null,r=!1,f=this.grants.get(e.bind_id);try{if(f&&n.length)throw new l("vm_hands_prebind_unsafe","a pre-bind needs a VM with no other live bind");if(n.length===0){if(this.bootKillPending&&!this.servedRun){try{await this.hooks.killProbe()}catch{throw new l("vm_hands_kill_unverified","the boot's scoped kill did not verify")}this.bootKillPending=!1}if(this.unverified.size>0)await this.hooks.killAndVerifyPayload(),this.unverified.clear()}else if(this.unverified.size>0)await this.hooks.killAndVerifyPayload({keep:n}),this.unverified.clear();this.servedRun=!0,r=!0;let{launchId:_,applied:m,readyData:y}=await this.hooks.startExecutor({bindId:e.bind_id,sessionId:e.session_id,policyDigest:e.policy.policy_digest,confinementKey:e.policy.confinement_key,browserEgress:e.policy.browser_egress,cwd:e.cwd,claim:e.claim,...f?{workspaceGrant:f.promise}:{}}),S=this.hooks.restatLayout();this.hooks.verifyMounts?.();let I=null,w=null;if(e.env){let x=e.claim?.owner??{},B=Pe(await this.openSealed(e.env,e.bind_id),{runId:e.run_id,deviceId:typeof x.device_id==="string"?x.device_id:"",rootId:e.claim?.root_id??""});I=this.hooks.installEnvironment(e.bind_id,B),w=typeof B.snapshot_id==="string"&&B.snapshot_id?B.snapshot_id:null,i=this.writeJobEnvRootOnly(e.bind_id,B)}if(this.unbinding.has(e.bind_id))throw new l("vm_hands_bind_lost","unbound while binding");return this.bound.set(e.bind_id,{bindId:e.bind_id,runId:e.run_id,sessionId:e.session_id,brainGeneration:e.brain_generation,policyDigest:e.policy.policy_digest,launchId:_,envInstalled:I!==null,rootId:e.claim?.root_id??"",envDirectory:i}),this.binding.delete(e.bind_id),this.grants.delete(e.bind_id),{bind_id:e.bind_id,attempt_id:e.attempt_id,attempt_token:e.attempt_token,launch_id:_,snapshot_revision:I,snapshot_id:w,layout:S,...y?{ready_data:y}:{},policy_digest:H("sha256").update(L({hands_confinement:m.hands_confinement??null,browser_egress:m.browser_egress??null})).digest("hex")}}catch(_){if(i)ge(i);if(r){let y=[...this.bound.keys()];await this.hooks.killAndVerifyPayload({bindId:e.bind_id,keep:y,own:!0}).catch(()=>{this.unverified.add(e.bind_id)})}this.binding.delete(e.bind_id),this.grants.delete(e.bind_id);let m=_&&typeof _==="object"&&"code"in _&&typeof _.code==="string"&&/^[a-z][a-z0-9_]{2,63}$/.test(_.code)?_.code:"vm_hands_bind_failed";throw _ instanceof l?_:new l(m,"executor refused the bind")}}grantWorkspace(e){let n=this.grants.get(e);if(!n)throw new l("vm_hands_not_binding","no pre-bind waits for a workspace grant");n.resolve()}abandonWorkspaceGrant(e){this.grants.get(e)?.reject(new l("vm_hands_bind_lost","the pre-bind ended before its workspace grant"))}async deliverEnvironment(e){let n=this.bound.get(e.attemptId);if(!n||this.unbinding.has(e.attemptId))throw new l("vm_hands_not_bound","environment delivered while not bound");if(!re.test(e.attemptId)||typeof e.snapshotId!=="string"||!e.snapshotId||e.snapshotId.length>128||e.snapshotId.includes("/"))throw new l("vm_hands_env_invalid","bad snapshot id");let i=`${e.attemptId}/${e.snapshotId}`;if(e.sealed?.alg!=="ECDH-P256+A256GCM"||e.sealed.aad!==i)throw new l("vm_hands_env_invalid","bad env envelope");let r=Pe(await this.openSealed(e.sealed,i),{runId:n.runId,deviceId:e.deviceId,rootId:n.rootId,snapshotId:e.snapshotId}),f=this.hooks.installEnvironment(n.bindId,r);if(n.envInstalled=!0,n.envDirectory)ge(n.envDirectory);return n.envDirectory=null,n.envDirectory=this.writeJobEnvRootOnly(`${n.bindId}-r${f}`,r),{snapshot_id:e.snapshotId,installed_revision:f,installed:!0}}async attestFrame(e,n){if(this.identity==="identity_free")throw new l("vm_hands_not_registered","attest before register");if(!e||e.length>65536)throw new l("vm_hands_attest_invalid","no probe script");return this.exclusive(async()=>{if(this.liveBindIds.length)throw new l("vm_hands_attest_invalid","attest beside a bind");let i=await this.hooks.runProbe({nonce:n,script:e});try{await this.hooks.killProbe()}catch{this.bootKillPending=!0}return{t:"attest",nonce:n,exit_code:i.exitCode,markers:i.markers,proof_dir_inode:i.proofDirInode,script_sha256:H("sha256").update(e).digest("hex")}})}executorExited(e){return this.hooks.executorExited?.(e)??new Promise(()=>{})}async boundRefused(e){await this.unbind(e)}async unbind(e){let n=this.bound.get(e)??null;if(this.unbinding.add(e),this.bound.delete(e),this.abandonWorkspaceGrant(e),n)try{this.hooks.freezeBind?.(e)}catch{}return this.exclusive(()=>this.tearDown(e,n))}async retryUnbind(e){if(!this.unverifiedTeardowns.has(e))throw new l("vm_hands_unbind_unknown","no unverified unbind of this bind");return this.exclusive(async()=>{if(!this.unverifiedTeardowns.has(e))throw new l("vm_hands_unbind_unknown","no unverified unbind of this bind");return this.tearDown(e,this.unverifiedTeardowns.get(e)??null,!0)})}async tearDown(e,n,i=!1){try{this.bound.delete(e);let r=[...this.bound.keys()].filter((f)=>f!==e);try{await this.hooks.killAndVerifyPayload({bindId:e,keep:r})}catch(f){if(this.unverified.add(e),!this.unverifiedTeardowns.has(e))this.unverifiedTeardowns.set(e,n);throw f}if(this.unverified.delete(e),!r.length&&!i)this.unverified.clear();if(n?.envDirectory)ge(n.envDirectory);return this.unverifiedTeardowns.delete(e),{bind_id:n?e:null,killed_verified:!0,shredded:!0,srt_fallbacks:r.length||i?null:this.hooks.takeSrtFallbacks?.()??null}}finally{this.unbinding.delete(e)}}async openSealed(e,n){let i=()=>{throw new l("vm_hands_env_invalid","env did not decrypt")},r=await crypto.subtle.importKey("spki",V(e.epk),{name:"ECDH",namedCurve:"P-256"},!1,[]).catch(i),f=await crypto.subtle.deriveKey({name:"ECDH",public:r},this.keys.agreement.privateKey,{name:"AES-GCM",length:256},!1,["decrypt"]),_=await crypto.subtle.decrypt({name:"AES-GCM",iv:V(e.iv),additionalData:new TextEncoder().encode(n)},f,V(e.ct)).catch(i),m=JSON.parse(new TextDecoder().decode(_));if(!m||typeof m!=="object"||Array.isArray(m))throw new l("vm_hands_env_invalid","env not an object");return m}writeJobEnvRootOnly(e,n){let i=ie(this.options.envRoot,`bind-${e}`);Ye(i,{mode:448});let r=Oe(i);if(!r.isDirectory()||(r.mode&63)!==0||r.uid!==(process.getuid?.()??-1))throw new l("vm_hands_env_dir_unsafe","env directory is not root's 0700");let f=n.variables&&typeof n.variables==="object"?n.variables:{},_=Object.entries(f).filter(([S,I])=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(S)&&typeof I==="string").map(([S,I])=>`export ${S}='${String(I).replaceAll("'","'\\''")}'`).join(`
|
|
3
3
|
`)+`
|
|
4
|
-
`,m=ne(i,`.job.env.${_e(8).toString("hex")}`),k=Te(m,z.O_WRONLY|z.O_CREAT|z.O_EXCL|z.O_NOFOLLOW,384);try{xe(k,_),Pe(k)}finally{Ee(k)}return Je(m,ne(i,"job.env")),i}}function me(e){try{let n=ne(e,"job.env"),i=Ae(n).size,r=Te(n,z.O_WRONLY|z.O_NOFOLLOW);try{xe(r,Buffer.alloc(i)),Pe(r)}finally{Ee(r)}}catch{}Ye(e,{recursive:!0,force:!0})}function en(e){if(e.length!==64)throw new l("vm_hands_signature_invalid","unexpected ECDSA signature length");let n=(p)=>{let _=0;while(_<p.length-1&&p[_]===0)_++;let m=p.subarray(_),k=m[0]&128?Uint8Array.of(0,...m):m;return Uint8Array.of(2,k.length,...k)},i=n(e.subarray(0,32)),r=n(e.subarray(32));return Uint8Array.of(48,i.length+r.length,...i,...r)}import{randomUUID as nn}from"crypto";var tn="/app/local-runtime/session?register=vm_hands_v1",rn="/app/local-runtime",De=25000,ge=20000,sn=1e4,Be=5000,Me=new Set(["pty.start","jobs.control","tunnel.open","tunnel.close"]),on="preview.serve.v1",dn=60000,fe=75000,cn=2000,ln=1e4,un=new Set(["vm_hands_no_register","vm_hands_register_failed"]),_n=3,mn=20000,hn=250,gn=2000;function je(e){let n=Math.min(hn*2**(e-1),gn);return Math.round(n/2+Math.random()*n/2)}var fn=5000;function pn(e){return e>=500||e===408||e===429}var ie=20000;function Ce(e,n){return typeof e==="string"&&/^[A-Za-z0-9._:-]{1,160}$/.test(e)?e:n}class M extends Error{}var vn=64,qe=[1000,2000,4000,8000,15000,30000,60000,120000];function $e(e){let n=e&&typeof e==="object"&&"code"in e?e.code:null;return typeof n==="string"&&/^[a-z][a-z0-9_]{2,63}$/.test(n)?n:"vm_hands_unbind_failed"}function wn(e,n,i,r,p){let _=i.turn.claim.attempt_id,m=e.healing??=new Set;if(m.has(_))return;m.add(_);let k=i.turn.claim.operation_id;(async()=>{for(let[S,I]of qe.entries()){if(r.aborted)return;if(await new Promise((b)=>{let R=setTimeout(b,I);R.unref?.(),r.addEventListener("abort",()=>{clearTimeout(R),b()},{once:!0})}),r.aborted)return;try{let b=await n.retryUnbind(_);p("vm_hands.unbind_healed",{operation_id:k,attempt:S+1}),e.receipts.push({...i,unbound:b}),e.flushReceipts?.();return}catch(b){let R=$e(b);if(p("vm_hands.unbind_unverified",{operation_id:k,code:R,attempt:S+1}),R==="vm_hands_unbind_unknown")return}}p("vm_hands.unbind_heal_exhausted",{operation_id:k,attempts:qe.length})})().finally(()=>m.delete(_))}async function Ue(e,n){let i=[...e.modelOps.get(n)??[]];for(let r of i)r.abort.abort();await Promise.race([Promise.all(i.map((r)=>r.settled)),new Promise((r)=>setTimeout(r,Be))])}async function bn(e){let n=[...e.personTerminals];for(let i of n)i.abort.abort();if(n.length)await Promise.race([Promise.all(n.map((i)=>i.settled)),new Promise((i)=>setTimeout(i,Be))]);return n.length}async function H(e,n,i){return await Ue(e,i),n.unbind(i)}function re(e){for(let n of e.outbox?.splice(0)??[])n.reject(Error("vm_hands_attempt_ended"))}var Ne=15000,yn=1e4,kn=1000;async function Mi(e){let n=Date.now(),i={deviceId:null,connection:null,turns:new Map,lostAt:0,receipts:[],attest:"pending",attestWaiters:[],modelOps:new Map,personTerminals:new Set,bindsStarting:0},r=e.log??(()=>{}),p=async(k)=>{for(let[S,I]of[...i.turns]){i.turns.delete(S),e.onTurn?.(S,null),re(I);let b=await H(i,e.agent,S).catch(()=>null);if(b)i.receipts.push({turn:I,failure:"vm_hands_bind_lost",unbound:b});r("vm_hands.bound_dropped",{reason:k})}},_=0,m=0;try{for(let k=0;!e.signal.aborted;k++){let S=await Sn(e,i).catch((b)=>{if(b instanceof l&&i.deviceId===null&&b.code==="vm_hands_no_session"&&Date.now()-n<ln)return{closeCode:0,closeReason:"vm_hands_no_session"};if(b instanceof l&&i.deviceId===null&&un.has(b.code)&&_<_n&&Date.now()-n<mn)return _++,m=je(_),r("vm_hands.register_retry",{attempt:_,code:b.code,delay_ms:m}),{closeCode:0,closeReason:"vm_hands_register_retry"};if(b instanceof l&&i.deviceId===null)throw b;return{closeCode:0,closeReason:b instanceof Error?b.message:String(b)}});if(r("vm_hands.session_closed",{close_code:S.closeCode,reason:S.closeReason.slice(0,120),registered:i.deviceId!==null}),S.closeCode===4401||i.attest==="refused")return;if(e.signal.aborted)return;if(i.turns.size&&Date.now()-i.lostAt>=fe)await p("reconnect_deadline");if(i.served)i.served=!1,k=0;let I=S.closeReason==="drain_reconnect"?0:S.closeReason==="vm_hands_register_retry"?m:S.closeReason==="vm_hands_no_session"?Math.min(250*2**Math.min(k,5),2000):i.turns.size?Math.min(250*2**Math.min(k,5),5000,Math.max(0,i.lostAt+fe-Date.now())):Math.min(500*2**k,30000);if(await new Promise((b)=>setTimeout(b,I)),i.turns.size&&Date.now()-i.lostAt>=fe)await p("reconnect_deadline")}}finally{await p("session_ended")}}async function Sn(e,n){let i=n.deviceId,r=e.log??(()=>{}),p=i?`/app/local-runtime/session?device_id=${encodeURIComponent(i)}`:tn,_=`${e.apiOrigin.replace(/^http/,"ws")}${p}`,m=new WebSocket(_),k=0,S="",I=new Map,b=[],R=null,C=new Promise((t)=>{m.onclose=(o)=>{k=o.code,S=o.reason;for(let s of I.values())s.reject(new M(`session closed ${o.code}`));for(let s of n.attestWaiters.splice(0))s(!1);I.clear(),t()}});m.onmessage=(t)=>{let o;try{o=JSON.parse(String(t.data))}catch{m.close(4400);return}if(o.t==="res"){let s=o;I.get(s.id)?.resolve({status:s.status,body:s.body}),I.delete(s.id);return}if(o.t==="reconnect"){let s=Math.max(0,Math.min(Number(o.after_ms)||0,kn));r("vm_hands.drain_reconnect",{after_ms:s}),setTimeout(()=>{try{m.close(4001,"drain_reconnect")}catch{}},s).unref?.();return}if(!R?.(o))b.push(o)};let L=(t,o)=>new Promise((s,a)=>{let u=b.findIndex((v)=>t.includes(v.t));if(u>=0){s(b.splice(u,1)[0]);return}let f=setTimeout(()=>{R=null,a(new l("vm_hands_no_register",`no ${t.join("/")} in ${o} ms`))},o);R=(v)=>{if(!t.includes(v.t))return!1;return clearTimeout(f),R=null,s(v),!0}}),J=(t)=>m.send(JSON.stringify(t)),x=(t,o)=>new Promise((s,a)=>{if(m.readyState!==WebSocket.OPEN){a(new M("session closed"));return}let u=nn(),f=typeof o.wait_ms==="number"?o.wait_ms:0,v=setTimeout(()=>{if(!I.delete(u))return;a(new M(`no answer to ${t.split("/").pop()} in ${f+Ne} ms`)),m.close(4000,"request_timeout")},f+Ne);I.set(u,{reject:(c)=>{clearTimeout(v),a(c)},resolve:({status:c,body:d})=>{clearTimeout(v);let h=null;try{h=d?JSON.parse(d):null}catch{}s({status:c,json:h})}}),J({t:"req",id:u,path:`${rn}${t}`,body:JSON.stringify(o)})}),pe=()=>m.close(1001,"stopping");e.signal.addEventListener("abort",pe,{once:!0});let se,Y=new Map,X=new Map,oe=!1,ae=new Set,de=new Set,ce=Promise.resolve(),ve=()=>{ee().catch(()=>{return})},Q=!1;try{await new Promise((c,d)=>{let h=setTimeout(()=>d(Error("session open timeout")),yn);m.onopen=()=>{clearTimeout(h),r("vm_hands.ws_open",{}),c()},m.onerror=()=>{clearTimeout(h),d(Error("session socket error"))}});let t=await L(["challenge"],5000);r("vm_hands.challenge",{});let o=[],s=null,a;if(i){J(await e.agent.helloFrame(t.challenge,n.connection));let c=await L(["ready"],1e4);if(typeof c.vm_hands_connection==="string")n.connection=c.vm_hands_connection;if(a={device_id:i,...c.cadence?{cadence:c.cadence}:{}},typeof c.vm_hands_probe_script==="string"){if(s=c.vm_hands_probe_script,Q=!0,e.agent.phase==="registered"&&!n.turns.size)n.attest="pending"}n.served=!0,r("vm_hands.reconnected",{device_id:i});let d=Array.isArray(c.vm_hands_binds)?c.vm_hands_binds:c.vm_hands_bind?[c.vm_hands_bind]:[];for(let[h,y]of[...n.turns]){if(d.some((w)=>w&&w.operation_id===y.claim.operation_id&&w.attempt_id===y.claim.attempt_id)){o.push(y),r("vm_hands.bound_resumed",{operation_id:y.claim.operation_id});continue}n.turns.delete(h),e.onTurn?.(h,null),re(y);let T=await H(n,e.agent,h).catch((w)=>Z(w,y,"vm_hands_bind_lost"));if(T)n.receipts.push({turn:y,failure:"vm_hands_bind_lost",unbound:T});r("vm_hands.bound_dropped",{reason:"not_named_on_reconnect"})}}else{J(await e.agent.registerFrame(t.challenge)),r("vm_hands.register_sent",{});let c=await Promise.race([L(["registered","register_refused"],1e4),C.then(()=>{throw new l(S==="register_failed"?"vm_hands_register_failed":"vm_hands_register_closed","session closed before the register was answered")})]);if(c.t==="register_refused")throw new l(c.code,"register refused");e.agent.registered();let d=c;if(a=d,n.deviceId=d.device_id,typeof d.vm_hands_connection==="string")n.connection=d.vm_hands_connection;if(typeof d.vm_hands_probe_script==="string"){if(s=d.vm_hands_probe_script,Q=!0,e.agent.phase==="registered"&&!n.turns.size)n.attest="pending"}n.served=!0,r("vm_hands.registered",{device_id:a.device_id})}let u=async()=>{let c=await x("/heartbeat",await e.heartbeat());if(c.status>=300)throw Error(`heartbeat ${c.status}`)};await u();let f=a.cadence?.presence_interval_ms??30000;if(se=setInterval(()=>{u().catch(()=>m.close())},f),e.onHeartbeatNow?.(()=>{u().catch(()=>m.close())}),n.request=x,C.then(()=>{if(n.request===x)n.request=null}),s&&n.attest!=="accepted"&&e.agent.phase==="registered"&&!n.turns.size)ze(s,t.challenge);let v=(c,d)=>{X.set(c,d().catch(async(h)=>{if(await we(h,c),h instanceof M)m.close();else await ee().catch(()=>{return})}).finally(()=>{X.delete(c)}))};n.flushReceipts=ve;try{await ee();for(let c of o)c.flush=()=>be(c),c.flush(),v(c.claim.attempt_id,()=>ye(c));while(!e.signal.aborted&&m.readyState===WebSocket.OPEN){let c=await x("/operations/claim",{wait_ms:Math.min(a.cadence?.claim_wait_ms??De,De)});if(c.status===204||!c.json)continue;if(c.status>=300)throw Error(`claim ${c.status}`);let d=c.json;if(d.capability==="hands.connect"){if(X.has(d.attempt_id)){A({claim:d,eventSeq:0}).complete("failed",{error_code:"vm_hands_busy"}).catch(()=>{return});continue}v(d.attempt_id,()=>Fe(d))}else Ge(d).catch(()=>{return})}}catch(c){await we(c,null)}}finally{if(se)clearInterval(se);e.signal.removeEventListener("abort",pe);for(let t of n.turns.values())t.flush=null;if(n.flushReceipts===ve)n.flushReceipts=null;m.close(),await C,await Promise.all([...X.values()]);for(let t of e.agent.liveBindIds){if(n.turns.has(t))continue;let o=Y.get(t),s=o?{...o,eventSeq:o.eventSeq+1}:null,a=await H(n,e.agent,t).catch((u)=>s?Z(u,s,"vm_hands_bind_lost"):null);if(a&&s)n.receipts.push({turn:s,failure:"vm_hands_bind_lost",unbound:a});r("vm_hands.bound_dropped",{reason:"bound_after_loss"})}for(let t of ae)t.abort()}return{closeCode:k,closeReason:S};async function we(t,o){if(t instanceof M){if(!oe&&n.turns.size)n.lostAt=Date.now();oe=!0}else{let s=o!==null?[o]:[...new Set([...n.turns.keys(),...e.agent.liveBindIds])];if(o===null)oe=!0;for(let a of s){let u=n.turns.get(a);if(n.turns.delete(a),u)re(u),e.onTurn?.(a,null);if(e.agent.liveBindIds.includes(a)){let f=Y.get(a)??u,v=f?{...f,eventSeq:f.eventSeq+1}:null,c=await H(n,e.agent,a).catch((d)=>v?Z(d,v,"vm_hands_bind_lost"):null);if(c&&v)n.receipts.push({turn:v,failure:"vm_hands_bind_lost",unbound:c})}}}r("vm_hands.session_lost",{error:t instanceof Error?t.message:String(t),bound_kept:n.turns.size})}function A(t,o=x){let s=o,a=t.claim,u={attempt_id:a.attempt_id,attempt_token:a.attempt_token},f=encodeURIComponent(a.operation_id);return{fence:u,op:f,complete:(c,d={})=>s(`/operations/${f}/complete`,{...u,status:c,...d}),emit:(c,d)=>{let h=(t.chain??Promise.resolve()).catch(()=>{return}).then(()=>v(c,d));return t.chain=h,h}};async function v(c,d){let h=t.eventSeq,y=(N)=>s(`/operations/${f}/events`,{...u,event_seq_start:N,events:[{kind:c,payload:{sequence:N,capability:String(a.capability??"hands.connect"),data:d}}]}),T=h,w=await y(T),O=w.status===409?w.json?.expected_event_seq:void 0;if(typeof O==="number"&&O===h+1)w={status:200,json:{duplicate:!0}};else if(typeof O==="number"&&O>=0&&O!==h)T=O,w=await y(T);if(w.status<300)t.eventSeq=T+1;return w}}function We(t){return(o,s)=>new Promise((a,u)=>{if(n.turns.get(t.claim.attempt_id)!==t){u(Error("vm_hands_attempt_ended"));return}if(t.outbox??=[],t.outbox.length>=vn){u(Error("vm_hands_outbox_full"));return}t.outbox.push({kind:o,data:s,resolve:a,reject:u}),t.flush?.()})}function be(t){if(de.has(t))return;de.add(t),(async()=>{try{while(t.outbox?.length&&n.turns.get(t.claim.attempt_id)===t&&m.readyState===WebSocket.OPEN){let o=t.outbox[0],s;try{s=await A(t).emit(o.kind,o.data)}catch(a){if(a instanceof M)return;s={status:500}}if(t.outbox.shift(),s.status<300)o.resolve();else o.reject(Error(`${o.kind} refused ${s.status}`))}}finally{de.delete(t)}})()}async function ze(t,o){try{let s=await e.agent.attestFrame(t,o);if(m.readyState!==WebSocket.OPEN)return;J(s);let a=await L(["attested","attest_refused"],15000);n.attest=a.t==="attested"?"accepted":"refused";for(let u of n.attestWaiters.splice(0))u(n.attest==="accepted");if(r("vm_hands.attest",{result:n.attest,exit_code:s.exit_code,...a.t==="attest_refused"?{code:String(a.code??"")}:{}}),n.attest==="refused")m.close(4401,"attest_refused")}catch(s){r("vm_hands.attest_failed",{code:s instanceof l?s.code:"probe_error"});for(let a of n.attestWaiters.splice(0))a(!1);if(n.attest!=="accepted")m.close(4000,"attest_unanswered")}}async function Fe(t){let o=Q&&n.attest==="pending",s=t.vm_hands_attest,a=s;if(n.attest==="refused"){r("vm_hands.claim_attest_refused",{said:typeof s==="string"?s.slice(0,16):typeof s,local:n.attest}),await A({claim:t,eventSeq:0}).complete("failed",{error_code:"vm_hands_unattested"}).catch(()=>{return});return}if(a==="accepted"){if(!o&&n.attest!=="accepted"){n.attest="accepted";for(let g of n.attestWaiters.splice(0))g(!0)}}else if(a!=="pending"||!o&&n.attest!=="accepted"){r("vm_hands.claim_attest_refused",{said:typeof s==="string"?s.slice(0,16):typeof s,local:n.attest}),await A({claim:t,eventSeq:0}).complete("failed",{error_code:"vm_hands_unattested"}).catch(()=>{return});return}if(n.attest!=="accepted"){let g=Date.parse(t.lease_until)-Date.now()-5000,E=Math.max(0,Math.min(ie,Number.isFinite(g)?g:ie));if(!await new Promise((j)=>{let le=setTimeout(()=>j(!1),E);n.attestWaiters.push((ue)=>{clearTimeout(le),j(ue)})})){await A({claim:t,eventSeq:0}).complete("failed",{error_code:"vm_hands_unattested"}).catch(()=>{return});return}}let u={claim:t,eventSeq:0},{complete:f,emit:v}=A(u),c;try{if(t.capability!=="hands.connect")throw new l("vm_hands_bind_invalid","not hands.connect");c=!he(t)}catch(g){r("vm_hands.bind_refused",{code:g instanceof l?g.code:"unexpected"}),await f("failed",{error_code:g instanceof l?g.code:"vm_hands_bind_invalid"});return}let d,h=null,y=!1;n.bindsStarting++;try{let g=await bn(n);if(g)r("vm_hands.person_terminals_closed",{count:g});let E=Oe(t),P=e.agent.bind(E);if(E.workspace_deferred)y=!0,h=Ve(u,()=>y);d=await P}catch(g){r("vm_hands.bind_refused",{code:g instanceof l?g.code:"unexpected"}),await f("failed",{error_code:g instanceof l?g.code:"vm_hands_bind_failed"});return}finally{y=!1,n.bindsStarting--}let T=h?await h:-1,w={...d.ready_data??e.readyData({launchId:d.launch_id,claim:t})};if(c)delete w.environment_installed;let O=!c&&d.snapshot_revision!==null&&d.snapshot_id!==null?{environment_installed:{snapshot_id:d.snapshot_id,installed_revision:d.snapshot_revision}}:{};Y.set(t.attempt_id,{claim:t,launchId:d.launch_id,readyData:w,eventSeq:u.eventSeq,ackSeq:-1});let N={...w,...O,vm_hands:{layout:d.layout,policy_digest:d.policy_digest,launch_id:d.launch_id}},U=Date.now()+fn,D=1,q=await v("hands.ready",N);while(pn(q.status)&&!e.signal.aborted){let g=je(D);if(Date.now()+g>=U)break;await new Promise((E)=>setTimeout(E,g)),D++,q=await v("hands.ready",N)}if(D>1)r("vm_hands.ready_retried",{attempts:D,status_class:`${Math.floor(q.status/100)}xx`});if(Y.delete(t.attempt_id),q.status>=300){await Ue(n,t.attempt_id),await e.agent.boundRefused(t.attempt_id),await f("failed",{error_code:Ce(q.json?.error,"vm_hands_probe_failed")});return}let B={claim:t,launchId:d.launch_id,readyData:w,eventSeq:u.eventSeq,ackSeq:T};n.turns.set(t.attempt_id,B),B.flush=()=>be(B),e.onTurn?.(t.attempt_id,We(B)),await ye(B)}async function Ve(t,o){let{fence:s,op:a}=A(t),u=t.claim.attempt_id,f=-1;try{for(;;){let v=await x(`/operations/${a}/heartbeat`,{...s,control_ack_seq:f,wait_ms:ge});if(!o())return f;if(v.status>=300)return e.agent.abandonWorkspaceGrant(u),f;let c=(v.json?.controls??[]).slice().sort((d,h)=>d.seq-h.seq);for(let d of c){if(d.seq<=f)continue;if(f=d.seq,d.kind===vt)return r("vm_hands.workspace_granted",{}),e.agent.grantWorkspace(u),f;return r("vm_hands.workspace_grant_abandoned",{control:/^[a-z][a-z0-9._-]{0,63}$/.test(d.kind)?d.kind:"other"}),e.agent.abandonWorkspaceGrant(u),f}}}catch{return e.agent.abandonWorkspaceGrant(u),f}}async function ye(t){let{fence:o,op:s}=A(t),a=null,u=null,f=e.agent.executorExited(t.claim.attempt_id).then((v)=>(u=v,null));e:for(;;){let v=await Promise.race([f,x(`/operations/${s}/heartbeat`,{...o,control_ack_seq:t.ackSeq,wait_ms:ge})]);if(!v){a="vm_hands_executor_exited",r("vm_hands.executor_exited",{reason:u});break}if(v.status>=300)break;let c=(v.json?.controls??[]).slice().sort((d,h)=>d.seq-h.seq);for(let d of c){if(d.seq<=t.ackSeq)continue;if(d.kind==="operation.cancel"||d.kind==="cancel"){t.ackSeq=d.seq;break e}if(d.kind===bt)try{await He(t,d.payload??{})}catch(h){if(h instanceof M)throw h;a=h instanceof l?h.code:"environment_unavailable";let y=h&&typeof h==="object"&&"code"in h&&typeof h.code==="string"&&/^[a-z][a-z0-9_]{2,63}$/.test(h.code)?h.code:null;r("vm_hands.environment_refused",{code:a,cause:y});break e}t.ackSeq=d.seq}}await Ke(t,a)}async function ke(t,o){let s=Date.now()+dn;for(;;){let a=n.request;if(a)try{return await a(t,o)}catch(u){if(!(u instanceof M))throw u}if(Date.now()>=s||e.signal.aborted)throw new M("kept operation has no live session");await new Promise((u)=>setTimeout(u,500))}}async function Ge(t){let o=t,s={claim:o,eventSeq:0},a=String(t.capability??""),u=a===on,{complete:f,emit:v,fence:c,op:d}={...A(s,u?ke:x)},h=t.vm_hands_origin==="person"?"person":"model";if(!e.executeOp){await f("failed",{error_code:"vm_hands_op_unsupported"});return}if(t.vm_hands_attest==="accepted"&&n.attest==="pending"&&!(Q&&n.attest==="pending")){n.attest="accepted";for(let g of n.attestWaiters.splice(0))g(!0)}if(n.attest!=="accepted"){let g=Date.parse(String(t.lease_until??""))-Date.now()-5000,E=n.attest==="refused"?0:Math.max(0,Math.min(ie,Number.isFinite(g)?g:ie));if(!(E>0&&await new Promise((j)=>{let le=setTimeout(()=>j(!1),E);n.attestWaiters.push((ue)=>{clearTimeout(le),j(ue)})}))){await f("failed",{error_code:"vm_hands_unattested"});return}}let y=e.agent.bindIdForRun(o.run_id);if(h==="model"&&y===null){await f("failed",{error_code:"vm_hands_not_bound"});return}let T=a==="pty.start"&&h==="person"&&!t.authority;if(T&&(e.agent.liveBindIds.length>0||n.bindsStarting>0)){await f("failed",{error_code:"vm_hands_bound"});return}if(Me.has(a)&&!T&&e.agent.liveBindIds.length===0){await f("failed",{error_code:"vm_hands_not_bound"});return}if(h==="model"&&y||Me.has(a)&&!T)e.agent.opServed();let w=new AbortController;if(!u)ae.add(w);let O,N=new Promise((g)=>{O=g}),U={abort:w,settled:N};if(T)n.personTerminals.add(U);if(h==="model"&&y&&a!=="preview.serve.v1"){let g=n.modelOps.get(y)??new Set;g.add(U),n.modelOps.set(y,g),await e.agent.environmentInstalled(y,cn,w.signal)}let D=-1,q=!1,B=u?void 0:setInterval(()=>{x(`/operations/${d}/heartbeat`,{...c,control_ack_seq:D,wait_ms:0}).then((g)=>{if(g.status>=300){w.abort();return}let E=g.json?.controls??[];for(let P of E)if(D=Math.max(D,P.seq),P.kind==="operation.cancel"||P.kind==="cancel")w.abort()},()=>w.abort())},sn);if(u)(async()=>{while(!q&&!w.signal.aborted){let g;try{g=await ke(`/operations/${d}/heartbeat`,{...c,control_ack_seq:D,wait_ms:ge})}catch{w.abort();return}if(q)return;if(g.status>=300){w.abort();return}let E=(g.json?.controls??[]).slice().sort((P,j)=>P.seq-j.seq);for(let P of E){if(P.seq<=D)continue;if(P.kind==="operation.cancel"||P.kind==="cancel")w.abort();else await e.controlOp?.({claim:t,control:P}).catch(()=>!1);D=P.seq}}})();try{let g=await e.executeOp({kind:h,claim:t,...h==="model"&&y?{bindId:y}:{},signal:w.signal,emit:async(P)=>{await v(P.kind,P.data??{})}}),E=await f(g.status,{...g.result?{result:g.result}:{},...g.error_code?{error_code:Ce(g.error_code,"vm_hands_op_failed")}:{}});e.opCompleted?.({claim:t,status:g.status,acknowledged:E.status<300}),r("vm_hands.op",{capability:a,kind:h,status:g.status,code:g.error_code??null,...E.status>=300?{complete_status:E.status,complete_error:String(E.json?.error??"").slice(0,64)}:{}})}finally{if(q=!0,clearInterval(B),ae.delete(w),y)n.modelOps.get(y)?.delete(U);n.personTerminals.delete(U),O()}}async function Ke(t,o){let s=t.claim.attempt_id;if(n.turns.get(s)===t)n.turns.delete(s);e.onTurn?.(s,null),re(t);let a=await H(n,e.agent,s).catch((u)=>Z(u,t,o));if(!a)return;n.receipts.push({turn:t,failure:o,unbound:a}),await ee()}function Z(t,o,s){let a=$e(t);return r("vm_hands.unbind_unverified",{operation_id:o.claim.operation_id,code:a,attempt:0}),A(o).emit(ri,{code:a}).catch(()=>{return}),wn(n,e.agent,{turn:o,failure:s},e.signal,r),null}function ee(){return ce=ce.then(Se,Se),ce}async function Se(){while(n.receipts.length){let{turn:t,failure:o,unbound:s}=n.receipts[0],{complete:a,emit:u}=A(t);try{if(await u("hands.stopped",{...t.readyData,reason_code:o?"failed":"cancelled",killed_verified:s.killed_verified,shredded:s.shredded,...s.srt_fallbacks?{vm_hands_srt_fallbacks:s.srt_fallbacks}:{}}),o)await a("failed",{error_code:o});else await a("cancelled",{error_code:"driver_stopped"})}catch(f){if(f instanceof M)return}n.receipts.shift()}}async function He(t,o){let{fence:s,op:a}=A(t),u=o.snapshot_id;if(o.version!==1||typeof u!=="string"||Object.keys(o).length!==2)throw new l("vm_hands_env_invalid","invalid environment delivery");let f=await x(`/operations/${a}/environment`,{...s,snapshot_id:u}),v=f.json?.environment_sealed;if(f.status!==200||!v||f.json?.payload!==void 0)throw new l("vm_hands_env_invalid","environment not delivered sealed");let c=await e.agent.deliverEnvironment({attemptId:t.claim.attempt_id,snapshotId:u,deviceId:n.deviceId??"",sealed:v});if((await x(`/operations/${a}/environment-ack`,{...s,...c})).status>=300)throw new l("vm_hands_env_ack_refused","environment ack refused")}}import{readFileSync as En}from"fs";var In=performance.now();delete process.env.BUN_BE_BUN;var F=(e,n={})=>console.log(JSON.stringify({stage:e,ms:Math.round(performance.now()),...n}));async function Pn(){if(process.argv.includes("--vm-hands-op-runner")){let{runVmHandsOpRunner:_}=await import("./vm-hands-op-runner-7tcv4e0v.js");await _();return}F("parsed",{t0:Math.round(In)});let e="";try{e=En(3,"utf8")}catch{}F("fd3_read",{bytes:e.length});let n=null;if(e.trim())try{n=JSON.parse(e)}catch{n=null}if(!n||typeof n!=="object"||Array.isArray(n))F(e.trim()?"identity_invalid":"identity_free"),await new Promise(()=>{setInterval(()=>{return},1073741824)});let{parseVmHandsInit:i,runVmHands:r}=await import("./vm-hands-runtime-mc2e6wsv.js"),p=i(n);if(!p)F("identity_invalid"),await new Promise(()=>{setInterval(()=>{return},1073741824)});try{await r(p,F)}catch(_){let m=_&&typeof _==="object"&&"code"in _&&typeof _.code==="string"?_.code:"error";throw F("failed",{code:m}),_}process.exit(0)}Pn();export{Li,an,Mi};
|
|
4
|
+
`,m=ie(i,`.job.env.${me(8).toString("hex")}`),y=xe(m,F.O_WRONLY|F.O_CREAT|F.O_EXCL|F.O_NOFOLLOW,384);try{De(y,_),Ae(y)}finally{Te(y)}return Xe(m,ie(i,"job.env")),i}}function ge(e){try{let n=ie(e,"job.env"),i=Oe(n).size,r=xe(n,F.O_WRONLY|F.O_NOFOLLOW);try{De(r,Buffer.alloc(i)),Ae(r)}finally{Te(r)}}catch{}Qe(e,{recursive:!0,force:!0})}function tn(e){if(e.length!==64)throw new l("vm_hands_signature_invalid","unexpected ECDSA signature length");let n=(f)=>{let _=0;while(_<f.length-1&&f[_]===0)_++;let m=f.subarray(_),y=m[0]&128?Uint8Array.of(0,...m):m;return Uint8Array.of(2,y.length,...y)},i=n(e.subarray(0,32)),r=n(e.subarray(32));return Uint8Array.of(48,i.length+r.length,...i,...r)}import{randomUUID as rn}from"crypto";var sn="/app/local-runtime/session?register=vm_hands_v1",on="/app/local-runtime",Me=25000,pe=20000,dn=1e4,Be=5000,cn=new Set(["pty.start","jobs.control","tunnel.open","tunnel.close"]),ln="preview.serve.v1",un=60000,ve=75000,_n=2000,mn=1e4,gn=new Set(["vm_hands_no_register","vm_hands_register_failed"]),hn=3,fn=20000,pn=250,vn=2000;function je(e){let n=Math.min(pn*2**(e-1),vn);return Math.round(n/2+Math.random()*n/2)}var wn=5000;function bn(e){return e>=500||e===408||e===429}var se=20000;function Ce(e,n){return typeof e==="string"&&/^[A-Za-z0-9._:-]{1,160}$/.test(e)?e:n}class q extends Error{}var yn=64,qe=[1000,2000,4000,8000,15000,30000,60000,120000];function $e(e){let n=e&&typeof e==="object"&&"code"in e?e.code:null;return typeof n==="string"&&/^[a-z][a-z0-9_]{2,63}$/.test(n)?n:"vm_hands_unbind_failed"}function kn(e,n,i,r,f){let _=i.turn.claim.attempt_id,m=e.healing??=new Set;if(m.has(_))return;m.add(_);let y=i.turn.claim.operation_id;(async()=>{for(let[S,I]of qe.entries()){if(r.aborted)return;if(await new Promise((w)=>{let x=setTimeout(w,I);x.unref?.(),r.addEventListener("abort",()=>{clearTimeout(x),w()},{once:!0})}),r.aborted)return;try{let w=await n.retryUnbind(_);f("vm_hands.unbind_healed",{operation_id:y,attempt:S+1}),e.receipts.push({...i,unbound:w}),e.flushReceipts?.();return}catch(w){let x=$e(w);if(f("vm_hands.unbind_unverified",{operation_id:y,code:x,attempt:S+1}),x==="vm_hands_unbind_unknown")return}}f("vm_hands.unbind_heal_exhausted",{operation_id:y,attempts:qe.length})})().finally(()=>m.delete(_))}async function Ue(e,n){let i=[...e.modelOps.get(n)??[]];for(let r of i)r.abort.abort();await Promise.race([Promise.all(i.map((r)=>r.settled)),new Promise((r)=>setTimeout(r,Be))])}async function Sn(e,n){let i=[...e.personTerminals].filter((r)=>r.session===null||r.session===n);for(let r of i)r.abort.abort();if(i.length)await Promise.race([Promise.all(i.map((r)=>r.settled)),new Promise((r)=>setTimeout(r,Be))]);return i.length}function In(e){let n=e.payload,i=n?.workspace?.kind==="managed"?n.workspace.workspaceId:void 0;return typeof i==="string"&&/^[0-9a-f-]{36}$/i.test(i)?i.toLowerCase():null}async function J(e,n,i){return await Ue(e,i),n.unbind(i)}function oe(e){for(let n of e.outbox?.splice(0)??[])n.reject(Error("vm_hands_attempt_ended"))}var Ne=15000,En=1e4,Pn=1000;async function Mi(e){let n=Date.now(),i={deviceId:null,connection:null,turns:new Map,lostAt:0,receipts:[],attest:"pending",attestWaiters:[],modelOps:new Map,personTerminals:new Set,bindsStarting:new Map},r=e.log??(()=>{}),f=async(y)=>{for(let[S,I]of[...i.turns]){i.turns.delete(S),e.onTurn?.(S,null),oe(I);let w=await J(i,e.agent,S).catch(()=>null);if(w)i.receipts.push({turn:I,failure:"vm_hands_bind_lost",unbound:w});r("vm_hands.bound_dropped",{reason:y})}},_=0,m=0;try{for(let y=0;!e.signal.aborted;y++){let S=await Tn(e,i).catch((w)=>{if(w instanceof l&&i.deviceId===null&&w.code==="vm_hands_no_session"&&Date.now()-n<mn)return{closeCode:0,closeReason:"vm_hands_no_session"};if(w instanceof l&&i.deviceId===null&&gn.has(w.code)&&_<hn&&Date.now()-n<fn)return _++,m=je(_),r("vm_hands.register_retry",{attempt:_,code:w.code,delay_ms:m}),{closeCode:0,closeReason:"vm_hands_register_retry"};if(w instanceof l&&i.deviceId===null)throw w;return{closeCode:0,closeReason:w instanceof Error?w.message:String(w)}});if(r("vm_hands.session_closed",{close_code:S.closeCode,reason:S.closeReason.slice(0,120),registered:i.deviceId!==null}),S.closeCode===4401||i.attest==="refused")return;if(e.signal.aborted)return;if(i.turns.size&&Date.now()-i.lostAt>=ve)await f("reconnect_deadline");if(i.served)i.served=!1,y=0;let I=S.closeReason==="drain_reconnect"?0:S.closeReason==="vm_hands_register_retry"?m:S.closeReason==="vm_hands_no_session"?Math.min(250*2**Math.min(y,5),2000):i.turns.size?Math.min(250*2**Math.min(y,5),5000,Math.max(0,i.lostAt+ve-Date.now())):Math.min(500*2**y,30000);if(await new Promise((w)=>setTimeout(w,I)),i.turns.size&&Date.now()-i.lostAt>=ve)await f("reconnect_deadline")}}finally{await f("session_ended")}}async function Tn(e,n){let i=n.deviceId,r=e.log??(()=>{}),f=i?`/app/local-runtime/session?device_id=${encodeURIComponent(i)}`:sn,_=`${e.apiOrigin.replace(/^http/,"ws")}${f}`,m=new WebSocket(_),y=0,S="",I=new Map,w=[],x=null,B=new Promise((t)=>{m.onclose=(o)=>{y=o.code,S=o.reason;for(let s of I.values())s.reject(new q(`session closed ${o.code}`));for(let s of n.attestWaiters.splice(0))s(!1);I.clear(),t()}});m.onmessage=(t)=>{let o;try{o=JSON.parse(String(t.data))}catch{m.close(4400);return}if(o.t==="res"){let s=o;I.get(s.id)?.resolve({status:s.status,body:s.body}),I.delete(s.id);return}if(o.t==="reconnect"){let s=Math.max(0,Math.min(Number(o.after_ms)||0,Pn));r("vm_hands.drain_reconnect",{after_ms:s}),setTimeout(()=>{try{m.close(4001,"drain_reconnect")}catch{}},s).unref?.();return}if(!x?.(o))w.push(o)};let Y=(t,o)=>new Promise((s,a)=>{let u=w.findIndex((p)=>t.includes(p.t));if(u>=0){s(w.splice(u,1)[0]);return}let h=setTimeout(()=>{x=null,a(new l("vm_hands_no_register",`no ${t.join("/")} in ${o} ms`))},o);x=(p)=>{if(!t.includes(p.t))return!1;return clearTimeout(h),x=null,s(p),!0}}),X=(t)=>m.send(JSON.stringify(t)),C=(t,o)=>new Promise((s,a)=>{if(m.readyState!==WebSocket.OPEN){a(new q("session closed"));return}let u=rn(),h=typeof o.wait_ms==="number"?o.wait_ms:0,p=setTimeout(()=>{if(!I.delete(u))return;a(new q(`no answer to ${t.split("/").pop()} in ${h+Ne} ms`)),m.close(4000,"request_timeout")},h+Ne);I.set(u,{reject:(c)=>{clearTimeout(p),a(c)},resolve:({status:c,body:d})=>{clearTimeout(p);let g=null;try{g=d?JSON.parse(d):null}catch{}s({status:c,json:g})}}),X({t:"req",id:u,path:`${on}${t}`,body:JSON.stringify(o)})}),we=()=>m.close(1001,"stopping");e.signal.addEventListener("abort",we,{once:!0});let ae,Q=new Map,Z=new Map,de=!1,ce=new Set,le=new Set,ue=Promise.resolve(),be=()=>{te().catch(()=>{return})},ee=!1;try{await new Promise((c,d)=>{let g=setTimeout(()=>d(Error("session open timeout")),En);m.onopen=()=>{clearTimeout(g),r("vm_hands.ws_open",{}),c()},m.onerror=()=>{clearTimeout(g),d(Error("session socket error"))}});let t=await Y(["challenge"],5000);r("vm_hands.challenge",{});let o=[],s=null,a;if(i){X(await e.agent.helloFrame(t.challenge,n.connection));let c=await Y(["ready"],1e4);if(typeof c.vm_hands_connection==="string")n.connection=c.vm_hands_connection;if(a={device_id:i,...c.cadence?{cadence:c.cadence}:{}},typeof c.vm_hands_probe_script==="string"){if(s=c.vm_hands_probe_script,ee=!0,e.agent.phase==="registered"&&!n.turns.size)n.attest="pending"}n.served=!0,r("vm_hands.reconnected",{device_id:i});let d=Array.isArray(c.vm_hands_binds)?c.vm_hands_binds:c.vm_hands_bind?[c.vm_hands_bind]:[];for(let[g,k]of[...n.turns]){if(d.some((P)=>P&&P.operation_id===k.claim.operation_id&&P.attempt_id===k.claim.attempt_id)){o.push(k),r("vm_hands.bound_resumed",{operation_id:k.claim.operation_id});continue}n.turns.delete(g),e.onTurn?.(g,null),oe(k);let E=await J(n,e.agent,g).catch((P)=>ne(P,k,"vm_hands_bind_lost"));if(E)n.receipts.push({turn:k,failure:"vm_hands_bind_lost",unbound:E});r("vm_hands.bound_dropped",{reason:"not_named_on_reconnect"})}}else{X(await e.agent.registerFrame(t.challenge)),r("vm_hands.register_sent",{});let c=await Promise.race([Y(["registered","register_refused"],1e4),B.then(()=>{throw new l(S==="register_failed"?"vm_hands_register_failed":"vm_hands_register_closed","session closed before the register was answered")})]);if(c.t==="register_refused")throw new l(c.code,"register refused");e.agent.registered();let d=c;if(a=d,n.deviceId=d.device_id,typeof d.vm_hands_connection==="string")n.connection=d.vm_hands_connection;if(typeof d.vm_hands_probe_script==="string"){if(s=d.vm_hands_probe_script,ee=!0,e.agent.phase==="registered"&&!n.turns.size)n.attest="pending"}n.served=!0,r("vm_hands.registered",{device_id:a.device_id})}let u=async()=>{let c=await C("/heartbeat",await e.heartbeat());if(c.status>=300)throw Error(`heartbeat ${c.status}`)};await u();let h=a.cadence?.presence_interval_ms??30000;if(ae=setInterval(()=>{u().catch(()=>m.close())},h),e.onHeartbeatNow?.(()=>{u().catch(()=>m.close())}),n.request=C,B.then(()=>{if(n.request===C)n.request=null}),s&&n.attest!=="accepted"&&e.agent.phase==="registered"&&!n.turns.size)ze(s,t.challenge);let p=(c,d)=>{Z.set(c,d().catch(async(g)=>{if(await ye(g,c),g instanceof q)m.close();else await te().catch(()=>{return})}).finally(()=>{Z.delete(c)}))};n.flushReceipts=be;try{await te();for(let c of o)c.flush=()=>ke(c),c.flush(),p(c.claim.attempt_id,()=>Se(c));while(!e.signal.aborted&&m.readyState===WebSocket.OPEN){let c=await C("/operations/claim",{wait_ms:Math.min(a.cadence?.claim_wait_ms??Me,Me)});if(c.status===204||!c.json)continue;if(c.status>=300)throw Error(`claim ${c.status}`);let d=c.json;if(d.capability==="hands.connect"){if(Z.has(d.attempt_id)){O({claim:d,eventSeq:0}).complete("failed",{error_code:"vm_hands_busy"}).catch(()=>{return});continue}p(d.attempt_id,()=>Fe(d))}else Ke(d).catch(()=>{return})}}catch(c){await ye(c,null)}}finally{if(ae)clearInterval(ae);e.signal.removeEventListener("abort",we);for(let t of n.turns.values())t.flush=null;if(n.flushReceipts===be)n.flushReceipts=null;m.close(),await B,await Promise.all([...Z.values()]);for(let t of e.agent.liveBindIds){if(n.turns.has(t))continue;let o=Q.get(t),s=o?{...o,eventSeq:o.eventSeq+1}:null,a=await J(n,e.agent,t).catch((u)=>s?ne(u,s,"vm_hands_bind_lost"):null);if(a&&s)n.receipts.push({turn:s,failure:"vm_hands_bind_lost",unbound:a});r("vm_hands.bound_dropped",{reason:"bound_after_loss"})}for(let t of ce)t.abort()}return{closeCode:y,closeReason:S};async function ye(t,o){if(t instanceof q){if(!de&&n.turns.size)n.lostAt=Date.now();de=!0}else{let s=o!==null?[o]:[...new Set([...n.turns.keys(),...e.agent.liveBindIds])];if(o===null)de=!0;for(let a of s){let u=n.turns.get(a);if(n.turns.delete(a),u)oe(u),e.onTurn?.(a,null);if(e.agent.liveBindIds.includes(a)){let h=Q.get(a)??u,p=h?{...h,eventSeq:h.eventSeq+1}:null,c=await J(n,e.agent,a).catch((d)=>p?ne(d,p,"vm_hands_bind_lost"):null);if(c&&p)n.receipts.push({turn:p,failure:"vm_hands_bind_lost",unbound:c})}}}r("vm_hands.session_lost",{error:t instanceof Error?t.message:String(t),bound_kept:n.turns.size})}function O(t,o=C){let s=o,a=t.claim,u={attempt_id:a.attempt_id,attempt_token:a.attempt_token},h=encodeURIComponent(a.operation_id);return{fence:u,op:h,complete:(c,d={})=>s(`/operations/${h}/complete`,{...u,status:c,...d}),emit:(c,d)=>{let g=(t.chain??Promise.resolve()).catch(()=>{return}).then(()=>p(c,d));return t.chain=g,g}};async function p(c,d){let g=t.eventSeq,k=(T)=>s(`/operations/${h}/events`,{...u,event_seq_start:T,events:[{kind:c,payload:{sequence:T,capability:String(a.capability??"hands.connect"),data:d}}]}),E=g,P=await k(E),D=P.status===409?P.json?.expected_event_seq:void 0;if(typeof D==="number"&&D===g+1)P={status:200,json:{duplicate:!0}};else if(typeof D==="number"&&D>=0&&D!==g)E=D,P=await k(E);if(P.status<300)t.eventSeq=E+1;return P}}function We(t){return(o,s)=>new Promise((a,u)=>{if(n.turns.get(t.claim.attempt_id)!==t){u(Error("vm_hands_attempt_ended"));return}if(t.outbox??=[],t.outbox.length>=yn){u(Error("vm_hands_outbox_full"));return}t.outbox.push({kind:o,data:s,resolve:a,reject:u}),t.flush?.()})}function ke(t){if(le.has(t))return;le.add(t),(async()=>{try{while(t.outbox?.length&&n.turns.get(t.claim.attempt_id)===t&&m.readyState===WebSocket.OPEN){let o=t.outbox[0],s;try{s=await O(t).emit(o.kind,o.data)}catch(a){if(a instanceof q)return;s={status:500}}if(t.outbox.shift(),s.status<300)o.resolve();else o.reject(Error(`${o.kind} refused ${s.status}`))}}finally{le.delete(t)}})()}async function ze(t,o){try{let s=await e.agent.attestFrame(t,o);if(m.readyState!==WebSocket.OPEN)return;X(s);let a=await Y(["attested","attest_refused"],15000);n.attest=a.t==="attested"?"accepted":"refused";for(let u of n.attestWaiters.splice(0))u(n.attest==="accepted");if(r("vm_hands.attest",{result:n.attest,exit_code:s.exit_code,...a.t==="attest_refused"?{code:String(a.code??"")}:{}}),n.attest==="refused")m.close(4401,"attest_refused")}catch(s){r("vm_hands.attest_failed",{code:s instanceof l?s.code:"probe_error"});for(let a of n.attestWaiters.splice(0))a(!1);if(n.attest!=="accepted")m.close(4000,"attest_unanswered")}}async function Fe(t){let o=ee&&n.attest==="pending",s=t.vm_hands_attest,a=s;if(n.attest==="refused"){r("vm_hands.claim_attest_refused",{said:typeof s==="string"?s.slice(0,16):typeof s,local:n.attest}),await O({claim:t,eventSeq:0}).complete("failed",{error_code:"vm_hands_unattested"}).catch(()=>{return});return}if(a==="accepted"){if(!o&&n.attest!=="accepted"){n.attest="accepted";for(let b of n.attestWaiters.splice(0))b(!0)}}else if(a!=="pending"||!o&&n.attest!=="accepted"){r("vm_hands.claim_attest_refused",{said:typeof s==="string"?s.slice(0,16):typeof s,local:n.attest}),await O({claim:t,eventSeq:0}).complete("failed",{error_code:"vm_hands_unattested"}).catch(()=>{return});return}if(n.attest!=="accepted"){let b=Date.parse(t.lease_until)-Date.now()-5000,U=Math.max(0,Math.min(se,Number.isFinite(b)?b:se));if(!await new Promise((A)=>{let R=setTimeout(()=>A(!1),U);n.attestWaiters.push((W)=>{clearTimeout(R),A(W)})})){await O({claim:t,eventSeq:0}).complete("failed",{error_code:"vm_hands_unattested"}).catch(()=>{return});return}}let u={claim:t,eventSeq:0},{complete:h,emit:p}=O(u),c;try{if(t.capability!=="hands.connect")throw new l("vm_hands_bind_invalid","not hands.connect");c=!he(t)}catch(b){r("vm_hands.bind_refused",{code:b instanceof l?b.code:"unexpected"}),await h("failed",{error_code:b instanceof l?b.code:"vm_hands_bind_invalid"});return}let d,g=null,k=!1,E=(()=>{try{return fe(t).session_id.toLowerCase()}catch{return String(t.run_id)}})();n.bindsStarting.set(E,(n.bindsStarting.get(E)??0)+1);try{let b=await Sn(n,E);if(b)r("vm_hands.person_terminals_closed",{count:b});let U=fe(t),v=e.agent.bind(U);if(U.workspace_deferred)k=!0,g=Ge(u,()=>k);d=await v}catch(b){r("vm_hands.bind_refused",{code:b instanceof l?b.code:"unexpected"}),await h("failed",{error_code:b instanceof l?b.code:"vm_hands_bind_failed"});return}finally{k=!1;let b=(n.bindsStarting.get(E)??1)-1;if(b>0)n.bindsStarting.set(E,b);else n.bindsStarting.delete(E)}let P=g?await g:-1,D={...d.ready_data??e.readyData({launchId:d.launch_id,claim:t})};if(c)delete D.environment_installed;let T=!c&&d.snapshot_revision!==null&&d.snapshot_id!==null?{environment_installed:{snapshot_id:d.snapshot_id,installed_revision:d.snapshot_revision}}:{};Q.set(t.attempt_id,{claim:t,launchId:d.launch_id,readyData:D,eventSeq:u.eventSeq,ackSeq:-1});let K={...D,...T,vm_hands:{layout:d.layout,policy_digest:d.policy_digest,launch_id:d.launch_id}},_e=Date.now()+wn,j=1,N=await p("hands.ready",K);while(bn(N.status)&&!e.signal.aborted){let b=je(j);if(Date.now()+b>=_e)break;await new Promise((U)=>setTimeout(U,b)),j++,N=await p("hands.ready",K)}if(j>1)r("vm_hands.ready_retried",{attempts:j,status_class:`${Math.floor(N.status/100)}xx`});if(Q.delete(t.attempt_id),N.status>=300){await Ue(n,t.attempt_id),await e.agent.boundRefused(t.attempt_id),await h("failed",{error_code:Ce(N.json?.error,"vm_hands_probe_failed")});return}let M={claim:t,launchId:d.launch_id,readyData:D,eventSeq:u.eventSeq,ackSeq:P};n.turns.set(t.attempt_id,M),M.flush=()=>ke(M),e.onTurn?.(t.attempt_id,We(M)),await Se(M)}async function Ge(t,o){let{fence:s,op:a}=O(t),u=t.claim.attempt_id,h=-1;try{for(;;){let p=await C(`/operations/${a}/heartbeat`,{...s,control_ack_seq:h,wait_ms:pe});if(!o())return h;if(p.status>=300)return e.agent.abandonWorkspaceGrant(u),h;let c=(p.json?.controls??[]).slice().sort((d,g)=>d.seq-g.seq);for(let d of c){if(d.seq<=h)continue;if(h=d.seq,d.kind===vt)return r("vm_hands.workspace_granted",{}),e.agent.grantWorkspace(u),h;return r("vm_hands.workspace_grant_abandoned",{control:/^[a-z][a-z0-9._-]{0,63}$/.test(d.kind)?d.kind:"other"}),e.agent.abandonWorkspaceGrant(u),h}}}catch{return e.agent.abandonWorkspaceGrant(u),h}}async function Se(t){let{fence:o,op:s}=O(t),a=null,u=null,h=e.agent.executorExited(t.claim.attempt_id).then((p)=>(u=p,null));e:for(;;){let p=await Promise.race([h,C(`/operations/${s}/heartbeat`,{...o,control_ack_seq:t.ackSeq,wait_ms:pe})]);if(!p){a="vm_hands_executor_exited",r("vm_hands.executor_exited",{reason:u});break}if(p.status>=300)break;let c=(p.json?.controls??[]).slice().sort((d,g)=>d.seq-g.seq);for(let d of c){if(d.seq<=t.ackSeq)continue;if(d.kind==="operation.cancel"||d.kind==="cancel"){t.ackSeq=d.seq;break e}if(d.kind===bt)try{await Ve(t,d.payload??{})}catch(g){if(g instanceof q)throw g;a=g instanceof l?g.code:"environment_unavailable";let k=g&&typeof g==="object"&&"code"in g&&typeof g.code==="string"&&/^[a-z][a-z0-9_]{2,63}$/.test(g.code)?g.code:null;r("vm_hands.environment_refused",{code:a,cause:k});break e}t.ackSeq=d.seq}}await He(t,a)}async function Ie(t,o){let s=Date.now()+un;for(;;){let a=n.request;if(a)try{return await a(t,o)}catch(u){if(!(u instanceof q))throw u}if(Date.now()>=s||e.signal.aborted)throw new q("kept operation has no live session");await new Promise((u)=>setTimeout(u,500))}}async function Ke(t){let o=t,s={claim:o,eventSeq:0},a=String(t.capability??""),u=a===ln,{complete:h,emit:p,fence:c,op:d}={...O(s,u?Ie:C)},g=t.vm_hands_origin==="person"?"person":"model";if(!e.executeOp){await h("failed",{error_code:"vm_hands_op_unsupported"});return}if(t.vm_hands_attest==="accepted"&&n.attest==="pending"&&!(ee&&n.attest==="pending")){n.attest="accepted";for(let v of n.attestWaiters.splice(0))v(!0)}if(n.attest!=="accepted"){let v=Date.parse(String(t.lease_until??""))-Date.now()-5000,A=n.attest==="refused"?0:Math.max(0,Math.min(se,Number.isFinite(v)?v:se));if(!(A>0&&await new Promise((W)=>{let Le=setTimeout(()=>W(!1),A);n.attestWaiters.push((Je)=>{clearTimeout(Le),W(Je)})}))){await h("failed",{error_code:"vm_hands_unattested"});return}}let k=e.agent.bindIdForRun(o.run_id);if(g==="model"&&k===null){await h("failed",{error_code:"vm_hands_not_bound"});return}let E=a==="pty.start"&&g==="person"&&!t.authority,P=E?In(t):null;if(E&&((v)=>v===null?e.agent.liveBindIds.length>0||n.bindsStarting.size>0:e.agent.liveSessionIds.includes(v)||n.bindsStarting.has(v))(P)){await h("failed",{error_code:"vm_hands_bound"});return}if(cn.has(a)&&!E&&e.agent.liveBindIds.length===0){await h("failed",{error_code:"vm_hands_not_bound"});return}let T=new AbortController;if(!u)ce.add(T);let K,_e=new Promise((v)=>{K=v}),j={abort:T,settled:_e},N=E?{...j,session:P}:null;if(N)n.personTerminals.add(N);if(g==="model"&&k&&a!=="preview.serve.v1"){let v=n.modelOps.get(k)??new Set;v.add(j),n.modelOps.set(k,v),await e.agent.environmentInstalled(k,_n,T.signal)}let M=-1,b=!1,U=u?void 0:setInterval(()=>{C(`/operations/${d}/heartbeat`,{...c,control_ack_seq:M,wait_ms:0}).then((v)=>{if(v.status>=300){T.abort();return}let A=v.json?.controls??[];for(let R of A)if(M=Math.max(M,R.seq),R.kind==="operation.cancel"||R.kind==="cancel")T.abort()},()=>T.abort())},dn);if(u)(async()=>{while(!b&&!T.signal.aborted){let v;try{v=await Ie(`/operations/${d}/heartbeat`,{...c,control_ack_seq:M,wait_ms:pe})}catch{T.abort();return}if(b)return;if(v.status>=300){T.abort();return}let A=(v.json?.controls??[]).slice().sort((R,W)=>R.seq-W.seq);for(let R of A){if(R.seq<=M)continue;if(R.kind==="operation.cancel"||R.kind==="cancel")T.abort();else await e.controlOp?.({claim:t,control:R}).catch(()=>!1);M=R.seq}}})();try{let v=await e.executeOp({kind:g,claim:t,...g==="model"&&k?{bindId:k}:{},signal:T.signal,emit:async(R)=>{await p(R.kind,R.data??{})}}),A=await h(v.status,{...v.result?{result:v.result}:{},...v.error_code?{error_code:Ce(v.error_code,"vm_hands_op_failed")}:{}});e.opCompleted?.({claim:t,status:v.status,acknowledged:A.status<300}),r("vm_hands.op",{capability:a,kind:g,status:v.status,code:v.error_code??null,...A.status>=300?{complete_status:A.status,complete_error:String(A.json?.error??"").slice(0,64)}:{}})}finally{if(b=!0,clearInterval(U),ce.delete(T),k)n.modelOps.get(k)?.delete(j);if(N)n.personTerminals.delete(N);K()}}async function He(t,o){let s=t.claim.attempt_id;if(n.turns.get(s)===t)n.turns.delete(s);e.onTurn?.(s,null),oe(t);let a=await J(n,e.agent,s).catch((u)=>ne(u,t,o));if(!a)return;n.receipts.push({turn:t,failure:o,unbound:a}),await te()}function ne(t,o,s){let a=$e(t);return r("vm_hands.unbind_unverified",{operation_id:o.claim.operation_id,code:a,attempt:0}),O(o).emit(ri,{code:a}).catch(()=>{return}),kn(n,e.agent,{turn:o,failure:s},e.signal,r),null}function te(){return ue=ue.then(Ee,Ee),ue}async function Ee(){while(n.receipts.length){let{turn:t,failure:o,unbound:s}=n.receipts[0],{complete:a,emit:u}=O(t);try{if(await u("hands.stopped",{...t.readyData,reason_code:o?"failed":"cancelled",killed_verified:s.killed_verified,shredded:s.shredded,...s.srt_fallbacks?{vm_hands_srt_fallbacks:s.srt_fallbacks}:{}}),o)await a("failed",{error_code:o});else await a("cancelled",{error_code:"driver_stopped"})}catch(h){if(h instanceof q)return}n.receipts.shift()}}async function Ve(t,o){let{fence:s,op:a}=O(t),u=o.snapshot_id;if(o.version!==1||typeof u!=="string"||Object.keys(o).length!==2)throw new l("vm_hands_env_invalid","invalid environment delivery");let h=await C(`/operations/${a}/environment`,{...s,snapshot_id:u}),p=h.json?.environment_sealed;if(h.status!==200||!p||h.json?.payload!==void 0)throw new l("vm_hands_env_invalid","environment not delivered sealed");let c=await e.agent.deliverEnvironment({attemptId:t.claim.attempt_id,snapshotId:u,deviceId:n.deviceId??"",sealed:p});if((await C(`/operations/${a}/environment-ack`,{...s,...c})).status>=300)throw new l("vm_hands_env_ack_refused","environment ack refused")}}import{readFileSync as An}from"fs";var Rn=performance.now();delete process.env.BUN_BE_BUN;var G=(e,n={})=>console.log(JSON.stringify({stage:e,ms:Math.round(performance.now()),...n}));async function xn(){if(process.argv.includes("--vm-hands-op-runner")){let{runVmHandsOpRunner:_}=await import("./vm-hands-op-runner-34d38g9f.js");await _();return}G("parsed",{t0:Math.round(Rn)});let e="";try{e=An(3,"utf8")}catch{}G("fd3_read",{bytes:e.length});let n=null;if(e.trim())try{n=JSON.parse(e)}catch{n=null}if(!n||typeof n!=="object"||Array.isArray(n))G(e.trim()?"identity_invalid":"identity_free"),await new Promise(()=>{setInterval(()=>{return},1073741824)});let{parseVmHandsInit:i,runVmHands:r}=await import("./vm-hands-runtime-h0trw0xr.js"),f=i(n);if(!f)G("identity_invalid"),await new Promise(()=>{setInterval(()=>{return},1073741824)});try{await r(f,G)}catch(_){let m=_&&typeof _==="object"&&"code"in _&&typeof _.code==="string"?_.code:"error";throw G("failed",{code:m}),_}process.exit(0)}xn();export{Li,an,Mi};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import"./vm-hands-entry-lite-4vks5phw.js";import"./vm-hands-entry-lite-3krzmhkk.js";import"./vm-hands-entry-lite-tdgtpx8e.js";import"./vm-hands-entry-lite-rfz60hb3.js";import{it,Zi,br,Ot}from"./vm-hands-entry-lite-aapdds5x.js";import"./vm-hands-entry-lite-hk6trmwa.js";import"./vm-hands-entry-lite-beyyy1gz.js";import"./vm-hands-entry-lite-fbhqfzbq.js";import"./vm-hands-entry-lite-fcvf8md1.js";import"./vm-hands-entry-lite-s5qkb1fk.js";import"./vm-hands-entry-lite-aj139v8j.js";import"./vm-hands-entry-lite-pf5qtbj5.js";import"./vm-hands-entry-lite-21qpxvt8.js";import{ar,cr,Ct,At}from"./vm-hands-entry-lite-bknthqy2.js";import"./vm-hands-entry-lite-s4bharcb.js";import"./vm-hands-entry-lite-wx4ax7wg.js";import"./vm-hands-entry-lite-jev771b3.js";import"./vm-hands-entry-lite-6c67a3jc.js";import{spawn as $e}from"child_process";import{chmodSync as Ie,chownSync as Ne,existsSync as K,lstatSync as Q,mkdirSync as E,mkdtempSync as Ae,readdirSync as J,readFileSync as k,realpathSync as De,rmdirSync as le,rmSync as Me,writeFileSync as U}from"fs";import{join as d}from"path";import{readFileSync as se,readlinkSync as oe}from"fs";import{relative as Ce}from"path";var ie=16;function ae(e){return e.replace(/\\([0-7]{3})/g,(r,i)=>String.fromCharCode(Number.parseInt(i,8)))}function Oe(e){let r=[];for(let i of e.split(`
|
|
3
|
+
`)){let n=i.split(" ");if(n.length<10||!/^\d+:\d+$/.test(n[2]))continue;r.push({device:n[2],root:ae(n[3]),mountPoint:ae(n[4])})}return r}function xe(e,r,i){let n=e.replace(/\/+$/,"")||"/",c=(m)=>n==="/"||m===n||m.startsWith(`${n}/`),a=(m)=>new Map(Oe(m).filter((y)=>c(y.mountPoint)).map((y)=>[`${y.mountPoint}\x00${y.device}\x00${y.root}`,y.mountPoint])),l=a(r),p=a(i),h=(m)=>Ce(n,m)||".",P=[...l].filter(([m])=>!p.has(m)).map(([,m])=>h(m)),O=[...p].filter(([m])=>!l.has(m)).map(([,m])=>h(m));return{missing:P,extra:O,referenceCount:l.size,ownCount:p.size}}function ce(e,r,i,n="/proc"){let c,a,l=null;try{c=se(`${n}/1/mountinfo`,"utf8"),a=se(`${n}/self/mountinfo`,"utf8")}catch(y){let I=y&&typeof y==="object"&&"code"in y&&typeof y.code==="string"?y.code:"unreadable";r("vm_hands.mount_check_unavailable",{code:I});return}try{l=oe(`${n}/1/ns/mnt`)===oe(`${n}/self/ns/mnt`)}catch{}let{missing:p,extra:h,referenceCount:P,ownCount:O}=xe(e,c,a),m={reference_count:P,own_count:O,missing_count:p.length,extra_count:h.length,same_namespace:l};if(h.length)r("vm_hands.mount_extra",{...m,extra:h.slice(0,ie)});if(p.length)throw r("vm_hands.mount_mismatch",{...m,missing:p.slice(0,ie)}),i(`${p.length} mount(s) under the Session root are missing from vm-hands' namespace`)}var _e="/sys/fs/cgroup/reason-payload",L="vm-hands",Le="/run/ara-srt/fallbacks.jsonl",j="/reason-person",Te="surface",q=5000,He=1e4,ue="__VM_HANDS_PROOF_DIR__",We="__VM_HANDS_PROBE_NONCE__";class v extends Error{code;constructor(e,r){super(r);this.code=e}}function ze(e,r){if(!/^[0-9a-f-]{36}$/i.test(r))throw new v("vm_hands_bind_invalid","bad bind id");return d(e,L,`b-${r.toLowerCase()}`)}var Be=5000,he=(e)=>`'${e.replaceAll("'","'\\''")}'`;function sn(e){let r=e.cgroup??_e,i=e.init.layout.payload_uid,n=e.log??(()=>{}),c=new Map,a=new Map,l=0,p=()=>{try{let t=k("/run/ara-srt/starts.jsonl","utf8"),o=t.slice(l>t.length?0:l).split(`
|
|
4
|
+
`).filter(Boolean);l=t.length;let u=o.map((f)=>{try{return Number(JSON.parse(f).elapsed_ms)||0}catch{return 0}});if(u.length)n("vm_hands.srt_server_starts",{count:u.length,elapsed_ms:u.slice(0,8)})}catch{}},h=null,P=!1,O=e.srtCgroup??"/sys/fs/cgroup/reason-srt",m=()=>{h??=de()},y=0,I=()=>{try{let t=k(Le,"utf8"),o=t.slice(y>t.length?0:y);y=t.length;let u=o.split(`
|
|
5
|
+
`).filter(Boolean).slice(0,1000);if(!u.length)return null;let f={},g=0;for(let b of u)try{let S=JSON.parse(b),_=typeof S.code==="string"&&/^[a-z_]{1,40}$/.test(S.code)?S.code:"other";if(f[_]=(f[_]??0)+1,typeof S.elapsed_ms==="number")g=Math.max(g,S.elapsed_ms)}catch{f.unparsed=(f.unparsed??0)+1}return n("vm_hands.srt_fallbacks",{count:u.length,codes:f,max_elapsed_ms:g}),{count:u.length,codes:f,max_elapsed_ms:g}}catch{return null}},x=(t,o,u)=>F(t,o,u),R=(t)=>(o,u,f)=>$e("/bin/sh",["-c",`echo $$ > ${he(d(t,"cgroup.procs"))} || exit 125; exec "$@"`,"vm-hands-join",o,...u],f),F=R(d(r,L)),N=d(r,L,"probe"),D=(t)=>ze(r,t),Se=(t)=>{let o=D(t);try{E(o,{mode:493})}catch(u){if(!(u&&typeof u==="object"&&("code"in u)&&u.code==="EEXIST"))throw new v("vm_hands_bind_failed","bind cgroup")}return o},ke=(t)=>{try{le(D(t))}catch{}},z=e.prespawn?Zi({spawnProcess:x,...e.relayDependencies?.sourceEntrypoint?{sourceEntrypoint:e.relayDependencies.sourceEntrypoint}:{},log:(t,o)=>n(t,o??{})}):null;z?.arm();let Y=z?setInterval(()=>{z.arm()},Be):null;Y?.unref?.();async function Z(t){let o=c.get(t);if(c.delete(t),!o)return;o.abort.abort(),await o.done}return{bindCgroup:D,async startExecutor(t){if(m(),a.set(t.bindId,de()),P=!0,!t.claim)throw new v("vm_hands_bind_invalid","an executor needs the claim it serves");await Z(t.bindId);let{claim:o,bindId:u}=t,f=Se(u),g=o.owner;if(!g||typeof g.device_id!=="string"||typeof o.root_id!=="string")throw new v("vm_hands_bind_invalid","claim without its owner Device or root");let b=new AbortController,S,_,A=new Promise((s,w)=>{S=s,_=w}),M,C=new Promise((s)=>{M=s}),B=Ot({headless:!0,hostExecution:!0,runtimeDirectory:e.runtimeDirectory,deviceIdentity:{deviceId:g.device_id,rootId:o.root_id,apiOrigin:e.apiOrigin},claimOwner:o.owner,root:e.root,runId:o.run_id,operationId:o.operation_id,attemptId:o.attempt_id,payload:Object.fromEntries(Object.entries(o.payload).filter(([s])=>!s.startsWith("vm_hands_"))),signal:b.signal,...t.workspaceGrant?{workspaceGrant:t.workspaceGrant}:{},emitEvent:async(s,w)=>{if(s==="hands.ready"){S(w);return}if(s==="hands.started"||s==="hands.stopped"||s==="hands.failed")return;await e.forward(u,s,w)}},{...e.relayDependencies,spawnWorker:(s)=>R(f)(s.command,s.args,s.options),...z?{takePrespawnedWorker:(s)=>{let w=z.take(s);if(!w?.pid)return w;try{return U(d(f,"cgroup.procs"),String(w.pid)),w}catch{try{w.kill("SIGKILL")}catch{}return null}},adoptSpawnedWorker:z.adopt}:{}}).then(()=>{M("executor_stopped")},(s)=>{let w=s&&typeof s==="object"&&"code"in s?String(s.code):"executor_failed";_(new v(w,s instanceof Error?s.message:String(s))),M(w)}).finally(()=>_(new v("vm_hands_executor_exited","executor ended before it was ready")));c.set(u,{abort:b,done:B,exited:C,operationId:o.operation_id,runId:o.run_id,expiresAtMs:Date.parse(String(o.payload.expires_at??""))||0});let T=await A,G=T.executor_launch_id;if(typeof G!=="string")throw new v("vm_hands_bind_failed","executor ready without a launch id");return{launchId:G,readyData:T,applied:{hands_confinement:typeof o.payload.hands_confinement==="string"?o.payload.hands_confinement:null,browser_egress:o.payload.browser_egress??null}}},takeSrtFallbacks:I,executorExited(t){return c.get(t)?.exited??new Promise(()=>{})},freezeBind(t){let o=D(t);if(K(d(o,"cgroup.freeze")))U(d(o,"cgroup.freeze"),"1")},async killAndVerifyPayload(t){let o=new Set(t?.keep??[]);if(await Re(t?.bindId??null,o,t?.own===!0),o.size)return;if((P||e.srtWarmLate?.()===!0)&&K(d(O,"cgroup.events")))p(),await ne(O,Date.now()+q,"srt"),e.onSrtReset?.();P=!1},async killProbe(){let t=Date.now()+q;if(K(d(N,"cgroup.events"))){await ne(N,t,"probe");try{le(N)}catch{}}let o=re(process.pid);if(o===null)throw new v("vm_hands_kill_unverified","agent start time unreadable");await Ue(r,o,t);let u=(g)=>{let b=re(g);return b!==null&&b<=o},f=fe(i).filter((g)=>u(g)&&!H(g,j));if(f.length)throw n("vm_hands.kill_survivors",{pids:f.slice(0,16),at:"attest"}),new v("vm_hands_kill_unverified",`${f.length} payload-uid process(es) from before this agent`);if(h!==null){let g=[r,d(r,L)].map((_)=>_.replace(/^\/sys\/fs\/cgroup/,"")),b=O.replace(/^\/sys\/fs\/cgroup/,""),S=pe(h).filter((_)=>_!==process.pid&&!H(_,j)&&!H(_,"/reason-vm-hands")&&!H(_,b)&&!g.some((A)=>ee(_,A)));if(S.length&&P)throw n("vm_hands.kill_strays",{strays:te(S),at:"attest"}),new v("vm_hands_kill_unverified",`${S.length} process(es) the run started survived it`);if(S.length)n("vm_hands.attest_concurrent",{processes:te(S),count:S.length});h=null}},async runProbe({nonce:t,script:o}){if(m(),!o.includes(ue))throw new v("vm_hands_probe_failed","probe names no proof directory");let u=e.proofParent??"/tmp/reason-vm-hands-proof";E(u,{mode:457,recursive:!0});let f=Q(u);if(f.isSymbolicLink()||!f.isDirectory()||f.uid!==(process.getuid?.()??-1)||(f.mode&4095)!==457)throw new v("vm_hands_probe_failed","proof parent is not root's 0711 directory");let g=Ae(d(u,"p-")),b=!1;try{if(!/^[A-Za-z0-9/._-]+$/.test(g)||!/^[A-Za-z0-9_-]{1,128}$/.test(t))throw new v("vm_hands_probe_failed","proof directory path or nonce");Ne(g,i,i),Ie(g,448);let S=Q(g).ino;try{E(N,{mode:493})}catch(C){if(!(C&&typeof C==="object"&&("code"in C)&&C.code==="EEXIST"))throw new v("vm_hands_probe_failed","probe cgroup")}let _=R(N)("/bin/bash",["-c",o.replaceAll(ue,g).replaceAll(We,t)],{cwd:"/",env:{PATH:"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"},stdio:["ignore","pipe","ignore"]}),A="";_.stdout?.on("data",(C)=>{if(A.length<16384)A+=C.toString("utf8").slice(0,16384-A.length)});let M=await new Promise((C)=>{let B=setTimeout(()=>{b=!0,_.kill("SIGKILL"),C(124)},He);_.once("error",()=>{clearTimeout(B),C(127)}),_.once("close",(T)=>{clearTimeout(B),C(T??1)})});return n("vm_hands.probe",{nonce_len:t.length,exit_code:M}),{exitCode:M,markers:A,proofDirInode:S}}finally{if(!b)Me(g,{recursive:!0,force:!0})}},restatLayout(){let{session_root:t,alias:o}=e.init.layout,u="invalid";try{br(t),u="0:0:755"}catch{}let f=!1,g=-1;try{let b=Q(o);g=b.uid,f=u==="0:0:755"&&o===d(t,"repo")&&!b.isSymbolicLink()&&b.isDirectory()&&De(o)===o&&b.uid===i}catch{}return{root_mode:u,alias_ok:f,owner_uid:g}},verifyMounts(){ce(e.init.layout.session_root,n,(t)=>new v("vm_hands_mount_mismatch",t))},installEnvironment(t,o){let u=c.get(t);if(!u)throw new v("environment_unavailable","no executor owns an environment");return it({root:e.root,operationId:u.operationId,payload:o}).installed_revision},async stop(){if(Y)clearInterval(Y);z?.close(),await Promise.all([...c.keys()].map((t)=>Z(t)))}};function Pe(){try{return J(d(r,L),{withFileTypes:!0}).filter((t)=>t.isDirectory()&&/^b-[0-9a-f-]{36}$/.test(t.name)).map((t)=>t.name)}catch{return[]}}async function Re(t,o,u=!1){let f=new Set([...o].map((b)=>b.toLowerCase())),g=Ke();try{await Ge();let b=Date.now()+q,S=new Set(Pe().filter((s)=>!f.has(s.slice(2))).map((s)=>s.slice(2)));if(t)S.add(t.toLowerCase());let _=null;for(let s of S){let w=Z(s).catch(()=>{return}),X=a.get(s);if(X!==void 0)_=_===null?X:Math.min(_,X);if(K(d(D(s),"cgroup.events")))await ne(D(s),b,"bind");await w}let A=[...f].map((s)=>D(s).replace(/^\/sys\/fs\/cgroup/,"")),M=["/",...[r,d(r,L)].map((s)=>s.replace(/^\/sys\/fs\/cgroup/,""))],C=O.replace(/^\/sys\/fs\/cgroup/,""),B=(s)=>H(s,j)||A.some((w)=>H(s,w))||M.some((w)=>ee(s,w)),T=u?[]:fe(i).filter((s)=>!B(s));if(T.length)throw n("vm_hands.kill_survivors",{pids:T.slice(0,16),beside:f.size}),new v("vm_hands_kill_unverified",`${T.length} payload-uid process(es) outside a live bind`);let G=(s)=>!B(s)&&!H(s,"/reason-vm-hands")&&!H(s,C)&&!M.some((w)=>ee(s,w));if(_!==null){let s=pe(_).filter((w)=>w!==process.pid&&G(w));if(s.length)throw n("vm_hands.kill_strays",{strays:te(s),beside:f.size}),new v("vm_hands_kill_unverified",`${s.length} process(es) the run started survived it`)}for(let s of S)a.delete(s),ke(s)}finally{g()}}}function re(e,r="/proc"){try{let i=k(d(r,String(e),"stat"),"utf8"),n=Number(i.slice(i.lastIndexOf(")")+2).split(" ")[19]);return Number.isFinite(n)?n:null}catch{return null}}function ye(e,r="/proc"){try{let i=k(d(r,String(e),"stat"),"utf8"),n=Number(i.slice(i.lastIndexOf(")")+2).split(" ")[1]);return Number.isFinite(n)?n:null}catch{return null}}async function Ue(e,r,i){try{U(d(e,"cgroup.freeze"),"1")}catch(n){throw new v("vm_hands_kill_unverified",`payload cgroup.freeze: ${n instanceof Error?n.message:String(n)}`)}try{for(;;){let n=ve(e).filter((a)=>we(a,e)),c=new Set(n.filter((a)=>{let l=re(a);return l!==null&&l<=r}));for(let a=!0;a;){a=!1;for(let l of n){if(c.has(l))continue;let p=ye(l);if(p!==null&&c.has(p))c.add(l),a=!0}}if(c.size===0)return;if(Date.now()>i)throw new v("vm_hands_kill_unverified",`${c.size} previous-boot process(es) survived`);for(let a of c)try{process.kill(a,"SIGKILL")}catch{}await new Promise((a)=>setTimeout(a,10))}}finally{try{U(d(e,"cgroup.freeze"),"0")}catch{}}}function ee(e,r,i="/proc"){try{return k(d(i,String(e),"cgroup"),"utf8").split(`
|
|
6
|
+
`).find((c)=>c.startsWith("0::"))?.slice(3)===r}catch{return!1}}function H(e,r,i="/proc"){try{let c=k(d(i,String(e),"cgroup"),"utf8").split(`
|
|
7
|
+
`).find((a)=>a.startsWith("0::"))?.slice(3)??"";return c===r||c.startsWith(`${r}/`)}catch{return!1}}var Fe=100;function de(){try{return Math.floor(Number(k("/proc/uptime","utf8").split(" ")[0])*Fe)}catch{return 0}}async function ne(e,r,i){try{U(d(e,"cgroup.freeze"),"1")}catch(n){throw new v("vm_hands_kill_unverified",`${i} cgroup.freeze: ${n instanceof Error?n.message:String(n)}`)}while(!/^populated 0$/m.test(k(d(e,"cgroup.events"),"utf8"))){if(Date.now()>r)throw new v("vm_hands_kill_unverified",`${i} cgroup still populated (left frozen)`);for(let n of ve(e)){if(!we(n,e))continue;try{process.kill(n,"SIGKILL")}catch{}}await new Promise((n)=>setTimeout(n,10))}try{U(d(e,"cgroup.freeze"),"0")}catch(n){throw new v("vm_hands_kill_unverified",`${i} cgroup thaw: ${n instanceof Error?n.message:String(n)}`)}}function we(e,r){let i=r.replace(/^\/sys\/fs\/cgroup/,"")||"/",n="";try{n=k(`/proc/${e}/cgroup`,"utf8").split(`
|
|
8
|
+
`).find((a)=>a.startsWith("0::"))??""}catch{return!1}let c=n.slice(3);return c===i||c.startsWith(`${i}/`)}function ve(e){let r=[],i=(n)=>{try{for(let a of k(d(n,"cgroup.procs"),"utf8").split(`
|
|
9
|
+
`))if(/^\d+$/.test(a))r.push(Number(a))}catch{}let c=[];try{c=J(n,{withFileTypes:!0}).filter((a)=>a.isDirectory()).map((a)=>a.name)}catch{}for(let a of c)i(d(n,a))};return i(e),r}function te(e,r="/proc"){return e.slice(0,16).map((i)=>{let n="?",c="?";try{n=k(d(r,String(i),"comm"),"utf8").trim().slice(0,32)}catch{}try{c=(k(d(r,String(i),"cgroup"),"utf8").split(`
|
|
10
|
+
`).find((a)=>a.startsWith("0::"))??"").slice(3,120)}catch{}return{pid:i,comm:n,ppid:ye(i,r),cgroup:c}})}function pe(e,r="/proc"){let i=[];for(let n of J(r)){if(!/^\d+$/.test(n))continue;let c;try{c=k(d(r,n,"stat"),"utf8")}catch{continue}let a=c.slice(c.lastIndexOf(")")+2).split(" "),l=Number(a[1]),p=Number(a[6]),h=Number(a[19]);if(!((p&2097152)!==0||l===2||n==="2")&&a[0]!=="Z"&&h>=e)i.push(Number(n))}return i}function fe(e,r="/proc"){let i=[];for(let n of J(r)){if(!/^\d+$/.test(n))continue;let c;try{c=k(d(r,n,"status"),"utf8")}catch{continue}let a=/^Uid:\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/m.exec(c);if(a&&a.slice(1).some((l)=>Number(l)===e))i.push(Number(n))}return i}function me(e="/proc/sys/kernel/yama/ptrace_scope"){try{return Number(k(e,"utf8").trim())>=1}catch{return!1}}var W=0,be=[],V=new Set;function Ke(){W++;let e=!1;return()=>{if(e)return;if(e=!0,--W===0)for(let r of be.splice(0))r()}}function je(){return W===0?Promise.resolve():new Promise((e)=>{be.push(e)})}async function ge(){while(W>0)await je()}async function Ge(){let e=Date.now()+1000;while(V.size&&Date.now()<e)await new Promise((r)=>setTimeout(r,2))}function Ee(e,r){let i=r.replace(/^\/sys\/fs\/cgroup/,"");V.add(e);let n=()=>{let c="";try{c=k(`/proc/${e}/cgroup`,"utf8").split(`
|
|
11
|
+
`).find((a)=>a.startsWith("0::"))??""}catch{V.delete(e);return}if(c.slice(3)===i){V.delete(e);return}setTimeout(n,1)};n()}function on(e){let r={person:e.personCgroup??d("/sys/fs/cgroup",j,L),model:e.payloadCgroup??d(_e,L),surface:e.surfaceCgroup??d("/sys/fs/cgroup",j,L,Te)},i=e.entry??process.argv[1]??"",n={},c=(l)=>l.startsWith("model:")&&e.bindCgroup?e.bindCgroup(l.slice(6)):r[l.startsWith("model")?"model":l==="surface"?"surface":"person"],a=(l)=>{let p=l.startsWith("model")?"model":l==="surface"?"surface":"person",h=new Map,P=String(e.payloadUid),O=String(e.payloadGid);if(p==="surface")try{E(c(l),{mode:493})}catch{}let m=p==="surface"?'exec "$@"':`exec /usr/bin/setpriv --no-new-privs --reuid=${P} --regid=${O} --clear-groups -- "$@"`,y=Bun.spawn(["/bin/sh","-c",`echo $$ > ${he(d(c(l),"cgroup.procs"))} || exit 125; ${m}`,"vm-hands-op-join",process.execPath,"--no-install",i,"--vm-hands-op-runner",...p==="person"?[ar]:[],...p==="surface"?[cr,`${Ct}${P}`,`${At}${e.surfaceDirectory??""}`]:[]],{cwd:"/",env:{PATH:process.env.PATH??"/usr/bin:/bin",BUN_BE_BUN:"1",HOME:p==="surface"?process.env.HOME||"/root":"/home/runner",...K("/bin/bash")?{SHELL:"/bin/bash"}:{}},stdio:["ignore","ignore","ignore"],ipc(x){let R=x;if(p==="surface"&&R.t==="readiness"){let N=x;e.log?.("vm_hands.surface_ready",{lanes:Object.keys(N.lanes??{}).filter((D)=>N.lanes[D]===!0),display_video:N.display_video===!0}),e.onSurfaceReadiness?.(N);return}let F=h.get(R.id);if(!F)return;if(R.t==="event"&&R.event)F.onEvent(R.event);if(R.t==="done")h.delete(R.id),F.done(R.completion??{status:"failed",error_code:"vm_hands_op_failed"})}});y.exited.then((x)=>{if(n[l]?.child===y)delete n[l];for(let[,R]of h)R.done({status:"failed",error_code:"vm_hands_op_runner_exited"});if(h.clear(),e.log?.("vm_hands.op_runner_exited",{kind:p,code:x}),p==="surface")e.onSurfaceReadiness?.(null)}),Ee(y.pid,c(l));let I={child:y,pending:h};return n[l]=I,I};return{run(l,p,h,P,O){if(!me())return Promise.resolve({status:"failed",error_code:"vm_hands_ptrace_unprotected"});let m=l==="model"&&O&&e.bindCgroup?`model:${O.toLowerCase()}`:l,y=async()=>{while(!n[m]&&W>0)await ge()};return y().then(async()=>{if(!n[m]&&W>0)await y()}).then(()=>new Promise((I)=>{if(!n[m]&&W>0){I({status:"failed",error_code:"vm_hands_op_runner_unavailable"});return}let x=n[m]??a(m);x.pending.set(p.id,{onEvent:h,done:I}),P.addEventListener("abort",()=>{try{x.child.send({t:"cancel",id:p.id})}catch{}},{once:!0});try{x.child.send({t:"op",...p})}catch{x.pending.delete(p.id),I({status:"failed",error_code:"vm_hands_op_runner_unavailable"})}}))},warm(l){if(!n[l]&&me())ge().then(()=>{if(!n[l]&&W===0)a(l)})},notify(l,p){let h=n[l];if(!h)return!1;try{return h.child.send(p),!0}catch{return!1}},stop(){for(let l of Object.keys(n))n[l]?.child.kill()}}}export{_e as VM_HANDS_PAYLOAD_CGROUP,L as VM_HANDS_PAYLOAD_JOIN,j as VM_HANDS_PERSON_CGROUP,We as VM_HANDS_PROBE_NONCE_TOKEN,ue as VM_HANDS_PROOF_DIR_TOKEN,Te as VM_HANDS_SURFACE_JOIN,v as VmHandsExecutorError,sn as createVmHandsExecutor,on as createVmHandsOpRunners,te as describeProcesses,H as inCgroup,fe as payloadUidProcesses,pe as processesStartedSince,me as ptraceProtected,ve as subtreePids,ze as vmHandsBindCgroup};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{ar,cr,Ct,At,Pt,as}from"./vm-hands-entry-lite-
|
|
2
|
+
import{ar,cr,Ct,At,Pt,as}from"./vm-hands-entry-lite-bknthqy2.js";export{ar as VM_HANDS_OP_RUNNER_PERSON_ARG,cr as VM_HANDS_OP_RUNNER_SURFACE_ARG,At as VM_HANDS_SURFACE_DIRECTORY_ARG,Pt as VM_HANDS_SURFACE_OPS,Ct as VM_HANDS_SURFACE_UID_ARG,as as runVmHandsOpRunner};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{tt}from"./vm-hands-entry-lite-4vks5phw.js";import{Pt}from"./vm-hands-entry-lite-
|
|
3
|
-
`,{mode:420}),r("srt_base_keyed",{})}catch{r("srt_base_keyed_skipped",{reason:"error"})}}function B(r,n){let t=(u)=>(n("srt_warm_skipped",{reason:u}),Promise.resolve());if(typeof r.srt_base_settings!=="string")return t("no_settings");let s=Buffer.from(r.srt_base_settings,"base64");if(s.length===0||s.length>se||s.toString("base64")!==r.srt_base_settings)return t("settings_invalid");let a;try{let u=N(U);if(!u.isDirectory()||u.uid!==0||(u.mode&18)!==0)return t("cgroup_unsafe");let f=oe.find((y)=>N(y,{throwIfNoEntry:!1})!==void 0);if(!f)return t("cgroup_or_exec_missing");a=f;for(let[y,m]of[[a,!1],["/usr/local/bin",!0]]){let _=N(y);if((m?!_.isDirectory():!_.isFile())||_.uid!==0||(_.mode&18)!==0)return t("srt_exec_unsafe")}}catch{return t("cgroup_or_exec_missing")}if((process.getuid?.()??-1)!==0)return t("not_root");let l=performance.now(),g=ne("sha256").update(s).digest("hex"),c=`${O}/srt-base-settings.json`;try{z(c,s,{mode:384,flag:"w"})}catch{return t("settings_write")}let v=ee("/bin/sh",["-c",`echo $$ > ${U}/cgroup.procs || exit 125; exec "$@"`,"vm-hands-srt",a,"--settings",c,"--idle-ms",String(ae),"--","/bin/true"],{cwd:"/",env:{PATH:"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"},stdio:"ignore"});return new Promise((u)=>{v.once("error",()=>{n("srt_warm_failed",{reason:"spawn"}),u()}),v.once("close",(f)=>{n(f===0?"srt_warm_done":"srt_warm_failed",{exit_code:f,warm_ms:Math.round(performance.now()-l),settings_sha256:g}),u()})})}var Y=3000;function Re(r){if(!r||typeof r!=="object"||Array.isArray(r))return null;let n=r,{layout:t,device_key:s,credential:a}=n;return typeof n.workspace_id==="string"&&Number.isSafeInteger(n.instance_generation)&&typeof n.api_origin==="string"&&re.test(n.api_origin)&&typeof n.manifest_digest==="string"&&!!a&&typeof a.key_id==="string"&&Number.isSafeInteger(a.expires_at_ms)&&typeof a.signature==="string"&&!!t&&typeof t.session_root==="string"&&typeof t.alias==="string"&&Number.isSafeInteger(t.payload_uid)&&typeof t.kind==="string"&&!!s&&typeof s.pkcs8==="string"&&typeof s.spki==="string"?n:null}function D(r){j(r,{recursive:!0,mode:448});let n=te(r);if(!n.isDirectory()||(n.mode&63)!==0||n.uid!==(process.getuid?.()??-1))throw Error(`vm_hands_runtime_directory_unsafe: ${r}`)}async function ce(r){let[{CLI_VERSION:n},t,s,a]=await Promise.all([import("./version-
|
|
4
|
-
`)){let t=n.split(":");if(t.length>=4&&Number(t[2])===r&&/^\d+$/.test(t[3]??"")&&Number(t[3])>0)return Number(t[3])}throw Error("vm_hands_payload_account_unavailable")}function fe(r,n){let t=n.owner;if(!t||typeof t.organization_id!=="string"||typeof t.device_id!=="string"||typeof n.root_id!=="string")return null;return{version:4,apiOrigin:r.api_origin,orgId:t.organization_id,deviceId:t.device_id,devicePublicKey:"",displayName:"vm-hands",registeredAt:new Date(0).toISOString(),handsSlots:1,roots:[{id:n.root_id,label:"workspace",path:V,pathFingerprint:"0".repeat(64),permissions:{read:!0,write:!0,execute:!0,discover_environment:!0,expose_mcp:!1}}]}}function we(r=process.platform,n="/proc/self/oom_score_adj"){if(r!=="linux")return null;let t;try{t=G(n,"utf8").trim()}catch{return{value:"unreadable"}}if(!/^-?\d+$/.test(t))return{value:"unreadable"};let s=Number(t);return s<0?{value:s}:null}async function ke(r,n){let t=we();if(t)n("vm_hands.oom_protected",{code:"vm_hands_oom_protected",value:t.value}),await new Promise(()=>{setInterval(()=>{return},1073741824)});D(O),D(W),D(A),ie(n);let s=B(r,n),a=!1,l=async()=>{if(!await Promise.race([s.then(()=>!0),new Promise((o)=>setTimeout(()=>o(!1),Y).unref?.())]))a=!0,n("srt_warm_late",{wait_ms:Y})},[{configureDesktopAccount:g},{configureWorkerSandbox:c}]=await Promise.all([import("./desktop-account-6sjrxy69.js"),import("./worker-sandbox-2r5nseff.js")]);c();try{g({value:String(r.layout.payload_uid)})}catch{n("payload_account_unavailable"),await new Promise(()=>{setInterval(()=>{return},1073741824)})}let v=new AbortController;for(let e of["SIGTERM","SIGINT"])process.on(e,()=>v.abort());let u=new Map,f,y=new Promise((e)=>{f=e}),m=y.then(()=>import("./vm-hands-executor-
|
|
2
|
+
import{tt}from"./vm-hands-entry-lite-4vks5phw.js";import{Pt}from"./vm-hands-entry-lite-bknthqy2.js";import{Li,an,Mi}from"./vm-hands-entry-lite.js";import{spawn as ee}from"child_process";import{createHash as ne}from"crypto";import{lstatSync as N,mkdirSync as j,readFileSync as G,statSync as te,writeFileSync as z}from"fs";var O="/run/reason-vm-hands",W="/run/reason-vm-hands/env",A="/run/reason-vm-hands/surface",V="/home/runner/.reason/workspace",re=/^https:\/\/[a-z0-9.-]+(?::\d{1,5})?$/,U="/sys/fs/cgroup/reason-srt",oe=["/usr/local/bin/reason-srt-exec","/usr/local/bin/ara-srt-exec"],se=65536,ae=21600000;function ie(r,n="/run/ara-srt"){try{if((process.getuid?.()??-1)!==0)return;j(n,{recursive:!0,mode:448});let t=N(n);if(!t.isDirectory()||t.uid!==0||(t.mode&63)!==0){r("srt_base_keyed_skipped",{reason:"socket_dir_unsafe"});return}z(`${n}/base-keyed`,`1
|
|
3
|
+
`,{mode:420}),r("srt_base_keyed",{})}catch{r("srt_base_keyed_skipped",{reason:"error"})}}function B(r,n){let t=(u)=>(n("srt_warm_skipped",{reason:u}),Promise.resolve());if(typeof r.srt_base_settings!=="string")return t("no_settings");let s=Buffer.from(r.srt_base_settings,"base64");if(s.length===0||s.length>se||s.toString("base64")!==r.srt_base_settings)return t("settings_invalid");let a;try{let u=N(U);if(!u.isDirectory()||u.uid!==0||(u.mode&18)!==0)return t("cgroup_unsafe");let f=oe.find((y)=>N(y,{throwIfNoEntry:!1})!==void 0);if(!f)return t("cgroup_or_exec_missing");a=f;for(let[y,m]of[[a,!1],["/usr/local/bin",!0]]){let _=N(y);if((m?!_.isDirectory():!_.isFile())||_.uid!==0||(_.mode&18)!==0)return t("srt_exec_unsafe")}}catch{return t("cgroup_or_exec_missing")}if((process.getuid?.()??-1)!==0)return t("not_root");let l=performance.now(),g=ne("sha256").update(s).digest("hex"),c=`${O}/srt-base-settings.json`;try{z(c,s,{mode:384,flag:"w"})}catch{return t("settings_write")}let v=ee("/bin/sh",["-c",`echo $$ > ${U}/cgroup.procs || exit 125; exec "$@"`,"vm-hands-srt",a,"--settings",c,"--idle-ms",String(ae),"--","/bin/true"],{cwd:"/",env:{PATH:"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"},stdio:"ignore"});return new Promise((u)=>{v.once("error",()=>{n("srt_warm_failed",{reason:"spawn"}),u()}),v.once("close",(f)=>{n(f===0?"srt_warm_done":"srt_warm_failed",{exit_code:f,warm_ms:Math.round(performance.now()-l),settings_sha256:g}),u()})})}var Y=3000;function Re(r){if(!r||typeof r!=="object"||Array.isArray(r))return null;let n=r,{layout:t,device_key:s,credential:a}=n;return typeof n.workspace_id==="string"&&Number.isSafeInteger(n.instance_generation)&&typeof n.api_origin==="string"&&re.test(n.api_origin)&&typeof n.manifest_digest==="string"&&!!a&&typeof a.key_id==="string"&&Number.isSafeInteger(a.expires_at_ms)&&typeof a.signature==="string"&&!!t&&typeof t.session_root==="string"&&typeof t.alias==="string"&&Number.isSafeInteger(t.payload_uid)&&typeof t.kind==="string"&&!!s&&typeof s.pkcs8==="string"&&typeof s.spki==="string"?n:null}function D(r){j(r,{recursive:!0,mode:448});let n=te(r);if(!n.isDirectory()||(n.mode&63)!==0||n.uid!==(process.getuid?.()??-1))throw Error(`vm_hands_runtime_directory_unsafe: ${r}`)}async function ce(r){let[{CLI_VERSION:n},t,s,a]=await Promise.all([import("./version-8z9rdrb0.js"),import("./hands-worker-source-kddz4y15.js"),import("./network-contract-trkxqc0w.js"),import("./device-workspace-s50q53sz.js")]),{REASON_HANDS_PROTOCOL_VERSION:l}=await import("./reason-hands-protocol-xn3ddz70.js");return{reason_runtime_version:n,bridge_version:n,protocol_version:tt,execution_eligible:!0,instance_generation:r.instance_generation,capabilities:{supported_operations:["hands.connect"],hands_worker_artifact_sha256:t.REASON_HANDS_WORKER_ARTIFACT_SHA256,hands_worker_entrypoint:t.REASON_HANDS_WORKER_ENTRYPOINT,hands_slots:1,max_payload_bytes:s.LOCAL_OPERATION_MAX_BYTES,max_result_bytes:s.LOCAL_OPERATION_MAX_BYTES,operation_constraints:{"hands.connect":{ready:!0,execution_mode:"host",transport:"wss_relay",worker:"ara_hands",slots:1,session_group:s.HANDS_SESSION_GROUP,worker_version:t.REASON_HANDS_WORKER_VERSION,protocol_version:l,worker_artifact_sha256:t.REASON_HANDS_WORKER_ARTIFACT_SHA256,worker_entrypoint:t.REASON_HANDS_WORKER_ENTRYPOINT,policy_mode:"full_access",policy_version:1,workspace_base:a.REASON_WORKSPACE_BASE,workspace_layout:a.SESSION_WORKSPACE_LAYOUT,browser_state:"optional_headless",desktop:!1,max_session_ms:43200000,environment_delivery:s.HANDS_ENVIRONMENT_DELIVERY,[s.HANDS_ENVIRONMENT_AT_CLAIM_KEY]:s.HANDS_ENVIRONMENT_AT_CLAIM,[s.HANDS_CLOUD_ACCESS_KEY]:s.HANDS_CLOUD_ACCESS,[s.HANDS_LARGE_ENVIRONMENT_KEY]:s.HANDS_LARGE_ENVIRONMENT,[s.HANDS_CONFINEMENT_KEY]:s.HANDS_CONFINEMENT,[s.HANDS_JOBS_USER_KEY]:s.HANDS_JOBS_USER,vm_hands:"v1"}}}}}var I=["fs.read","fs.write","fs.export","fs.import","exec.run","exec.full","process.list","ports.list","pty.start","jobs.control"],X=["automation.call.v1","display.stream.v1","preview.serve.v1","tunnel.open","tunnel.close"],de=new Set(["pty.start","jobs.control","tunnel.open","tunnel.close"]),ue=60000,le=30000;function J(r,n){return{executionMode:"unsandboxed",runtimeDirectory:n,readiness:{...Object.fromEntries(I.map((t)=>[t,!0])),...r.lanes},...r.probing?{probing:X.filter((t)=>r.lanes[t]!==!0)}:{},...r.displayVideo?{displayVideo:!0}:{}}}function _e(r,n,t){let s=n([{id:"vm-hands",label:"workspace",path:V,pathFingerprint:"0".repeat(64),permissions:{read:!0,write:!0,execute:!0,discover_environment:!0,expose_mcp:!1}}],{worker:J(t,A)}),a=r.capabilities,l={...a.operation_constraints};for(let c of I)l[c]={...s.operation_constraints?.[c]??{},ready:!0,execution_mode:s.operation_constraints?.[c]?.execution_mode??"host"};let g=X.filter((c)=>s.operation_constraints?.[c]!==void 0);for(let c of g)l[c]=s.operation_constraints[c];return{...r,capabilities:{...a,supported_operations:["hands.connect",...I,...g],operation_constraints:l}}}function pe(r){for(let n of G("/etc/passwd","utf8").split(`
|
|
4
|
+
`)){let t=n.split(":");if(t.length>=4&&Number(t[2])===r&&/^\d+$/.test(t[3]??"")&&Number(t[3])>0)return Number(t[3])}throw Error("vm_hands_payload_account_unavailable")}function fe(r,n){let t=n.owner;if(!t||typeof t.organization_id!=="string"||typeof t.device_id!=="string"||typeof n.root_id!=="string")return null;return{version:4,apiOrigin:r.api_origin,orgId:t.organization_id,deviceId:t.device_id,devicePublicKey:"",displayName:"vm-hands",registeredAt:new Date(0).toISOString(),handsSlots:1,roots:[{id:n.root_id,label:"workspace",path:V,pathFingerprint:"0".repeat(64),permissions:{read:!0,write:!0,execute:!0,discover_environment:!0,expose_mcp:!1}}]}}function we(r=process.platform,n="/proc/self/oom_score_adj"){if(r!=="linux")return null;let t;try{t=G(n,"utf8").trim()}catch{return{value:"unreadable"}}if(!/^-?\d+$/.test(t))return{value:"unreadable"};let s=Number(t);return s<0?{value:s}:null}async function ke(r,n){let t=we();if(t)n("vm_hands.oom_protected",{code:"vm_hands_oom_protected",value:t.value}),await new Promise(()=>{setInterval(()=>{return},1073741824)});D(O),D(W),D(A),ie(n);let s=B(r,n),a=!1,l=async()=>{if(!await Promise.race([s.then(()=>!0),new Promise((o)=>setTimeout(()=>o(!1),Y).unref?.())]))a=!0,n("srt_warm_late",{wait_ms:Y})},[{configureDesktopAccount:g},{configureWorkerSandbox:c}]=await Promise.all([import("./desktop-account-6sjrxy69.js"),import("./worker-sandbox-2r5nseff.js")]);c();try{g({value:String(r.layout.payload_uid)})}catch{n("payload_account_unavailable"),await new Promise(()=>{setInterval(()=>{return},1073741824)})}let v=new AbortController;for(let e of["SIGTERM","SIGINT"])process.on(e,()=>v.abort());let u=new Map,f,y=new Promise((e)=>{f=e}),m=y.then(()=>import("./vm-hands-executor-z222kmvg.js")).then(({createVmHandsExecutor:e})=>{let o=e({init:r,root:V,runtimeDirectory:O,apiOrigin:r.api_origin,prespawn:!0,onSrtReset:()=>{a=!1,s=B(r,n)},srtWarmLate:()=>a,forward:(d,i,E)=>u.get(d)?.(i,E)??Promise.reject(Error("vm_hands_not_bound")),log:(d,i)=>n(d,i)});return n("executor_loaded"),o}),_=(e)=>async(...o)=>(await m)[e](...o),x=null;m.then((e)=>{x=(o)=>e.executorExited(o)});let S={startExecutor:async(...e)=>(await l(),_("startExecutor")(...e)),killAndVerifyPayload:_("killAndVerifyPayload"),killProbe:_("killProbe"),runProbe:async(...e)=>(await l(),_("runProbe")(...e)),restatLayout:()=>{throw Error("replaced below")},verifyMounts:()=>{throw Error("replaced below")},installEnvironment:()=>{throw Error("replaced below")},executorExited:(e)=>x?x(e):new Promise(()=>{}),takeSrtFallbacks:()=>null};m.then((e)=>{S.restatLayout=()=>e.restatLayout(),S.verifyMounts=()=>e.verifyMounts(),S.installEnvironment=(o,d)=>e.installEnvironment(o,d),S.freezeBind=(o)=>e.freezeBind(o),S.takeSrtFallbacks=()=>e.takeSrtFallbacks?.()??null});let q=await Li(r),C=new an(r,q,S,{envRoot:W}),M=ce(r),w={probing:!0,lanes:{},displayVideo:!1},L=null,K=null,Q=Promise.all([M,import("./local-capabilities-vfteeg61.js")]).then(([e,o])=>{K=()=>_e(e,o.capabilityInventoryForRoots,w),n("device_ops_loaded")}).catch((e)=>n("device_ops_unavailable",{error:e instanceof Error?e.name:"error"})),H,R=(e)=>{clearTimeout(H),w=e,L?.()},b=y.then(()=>import("./vm-hands-executor-z222kmvg.js")).then(({createVmHandsOpRunners:e,vmHandsBindCgroup:o,VM_HANDS_PAYLOAD_CGROUP:d})=>e({payloadUid:r.layout.payload_uid,payloadGid:pe(r.layout.payload_uid),bindCgroup:(i)=>o(d,i),surfaceDirectory:A,onSurfaceReadiness:(i)=>{if(i)R({probing:!1,lanes:i.lanes??{},displayVideo:i.display_video===!0});else if(w.probing)R({probing:!1,lanes:{},displayVideo:!1})},log:(i,E)=>n(i,E)})).catch(()=>null);b.then((e)=>e?.warm("person")),b.then(async(e)=>{if(!e){R({probing:!1,lanes:{},displayVideo:!1});return}let o=Date.now()+le;while(C.settingUp&&Date.now()<o)await new Promise((d)=>setTimeout(d,250));H=setTimeout(()=>{if(w.probing)R({probing:!1,lanes:{},displayVideo:!1})},ue),H.unref?.(),e.warm("surface")}),n("agent_ready"),await Mi({apiOrigin:r.api_origin,agent:C,signal:v.signal,heartbeat:async()=>K?.()??await M,onHeartbeatNow:(e)=>{L=e},executeOp:async({kind:e,claim:o,bindId:d,signal:i,emit:E})=>{let k=fe(r,o);if(!k)return{status:"failed",error_code:"vm_hands_bind_invalid"};let F={executionMode:"unsandboxed",runtimeDirectory:O,readiness:{...Object.fromEntries(I.map((p)=>[p,!0])),"tunnel.open":w.lanes["tunnel.open"]===!0,"tunnel.close":w.lanes["tunnel.close"]===!0}},T=(p)=>{let h=typeof p.kind==="string"?p.kind:"";if(h)E({kind:h,...p.data&&typeof p.data==="object"?{data:p.data}:{}})};if(o.capability==="exec.full"&&e!=="person")return{status:"failed",error_code:"capability_not_granted"};if(o.capability==="automation.call.v1"&&e!=="model")return{status:"failed",error_code:"capability_not_granted"};let Z=o.capability==="pty.start"&&e==="person"&&!o.authority;if(de.has(String(o.capability))&&!Z){let{executeLocalOperation:p}=await import("./local-capabilities-vfteeg61.js");return p(k,o,{worker:F,signal:i,emit:(h)=>T(h)})}let P=await b;if(!P)return{status:"failed",error_code:"vm_hands_payload_account_unavailable"};if(Pt.has(String(o.capability))){if(w.lanes[String(o.capability)]!==!0)return{status:"failed",error_code:"capability_unavailable"};return P.run("surface",{id:String(o.attempt_id),claim:o,state:k,worker:J(w,A)},T,i)}return P.run(e,{id:String(o.attempt_id),claim:o,state:k,worker:F},T,i,d)},controlOp:async({claim:e,control:o})=>Pt.has(String(e.capability))&&((await b)?.notify("surface",{t:"control",id:String(e.attempt_id),control:{kind:o.kind,payload:o.payload??{}}})??!1),opCompleted:({claim:e,status:o,acknowledged:d})=>{if(d&&e.capability==="preview.serve.v1")b.then((i)=>i?.notify("surface",{t:"retire",operation_id:String(e.operation_id),status:o}))},readyData:({launchId:e})=>({executor_launch_id:e}),log:(e,o)=>{if(e==="vm_hands.registered"||e==="vm_hands.reconnected")f();n(e,o)},onTurn:(e,o)=>{if(o)u.set(e,o);else u.delete(e)}}),await(await m).stop(),(await b)?.stop()}export{Re as parseVmHandsInit,ke as runVmHands};
|
package/package.json
CHANGED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{Tn,Rn,On,In,Pr}from"./vm-hands-entry-lite-w8ykfw5h.js";import"./vm-hands-entry-lite-hk6trmwa.js";import"./vm-hands-entry-lite-09sq8090.js";import"./vm-hands-entry-lite-jzz73e3f.js";import"./vm-hands-entry-lite-pcvgqrse.js";import"./vm-hands-entry-lite-f1by8av5.js";import"./vm-hands-entry-lite-jev771b3.js";import"./vm-hands-entry-lite-3krzmhkk.js";export{Tn as MAC_SCREEN,Rn as WINDOWS_SCREEN,On as createDisplayVideoLane,Pr as localDisplayVideoAvailable,In as simulatorVideoFfmpeg};
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{Gn,Ao,Jt}from"./vm-hands-entry-lite-jzz73e3f.js";import{Pn,Ve,ao,Tn,Rn,On,Pr,x}from"./vm-hands-entry-lite-w8ykfw5h.js";import{kt}from"./vm-hands-entry-lite-fbhqfzbq.js";import{Ir}from"./vm-hands-entry-lite-nzmkyezg.js";import{j}from"./vm-hands-entry-lite-pf5qtbj5.js";import{a}from"./vm-hands-entry-lite-jev771b3.js";import{r}from"./vm-hands-entry-lite-qy9xg6em.js";import{execFile as Y,spawn as z}from"child_process";import{randomBytes as Te}from"crypto";import{chmodSync as he,existsSync as H,lstatSync as Qe,mkdirSync as _e,readFileSync as De,rmSync as I,writeFileSync as C}from"fs";import{connect as we}from"net";import{join as y}from"path";var P=32,w=76;var W="./desktop-wallpaper-0pjhgyfk.jpg";var B="./dock-browser-afp005mt.png";var O="./dock-files-rywdm96b.png";var F="./dock-terminal-s41cj1jp.png";var k=`# Sets the X root window background and _XROOTPMAP_ID, as feh --bg-fill does.
|
|
3
|
-
# The native Blaxel image ships no feh, hsetroot or compositor, but it does ship
|
|
4
|
-
# python3-gi and libX11. tint2 reads _XROOTPMAP_ID to draw its transparent panel.
|
|
5
|
-
# Usage: DISPLAY=:99 python3 set-root-wallpaper.py IMAGE
|
|
6
|
-
import ctypes, sys
|
|
7
|
-
import gi
|
|
8
|
-
gi.require_version("GdkPixbuf", "2.0")
|
|
9
|
-
from gi.repository import GdkPixbuf
|
|
10
|
-
x = ctypes.cdll.LoadLibrary("libX11.so.6")
|
|
11
|
-
x.XOpenDisplay.restype = ctypes.c_void_p
|
|
12
|
-
x.XOpenDisplay.argtypes = [ctypes.c_char_p]
|
|
13
|
-
d = x.XOpenDisplay(None)
|
|
14
|
-
if not d: sys.exit("no display")
|
|
15
|
-
for name, res, args in [
|
|
16
|
-
("XDefaultScreen", ctypes.c_int, [ctypes.c_void_p]),
|
|
17
|
-
("XRootWindow", ctypes.c_ulong, [ctypes.c_void_p, ctypes.c_int]),
|
|
18
|
-
("XDisplayWidth", ctypes.c_int, [ctypes.c_void_p, ctypes.c_int]),
|
|
19
|
-
("XDisplayHeight", ctypes.c_int, [ctypes.c_void_p, ctypes.c_int]),
|
|
20
|
-
("XDefaultDepth", ctypes.c_int, [ctypes.c_void_p, ctypes.c_int]),
|
|
21
|
-
("XDefaultVisual", ctypes.c_void_p, [ctypes.c_void_p, ctypes.c_int]),
|
|
22
|
-
("XDefaultGC", ctypes.c_void_p, [ctypes.c_void_p, ctypes.c_int]),
|
|
23
|
-
("XCreatePixmap", ctypes.c_ulong, [ctypes.c_void_p, ctypes.c_ulong, ctypes.c_uint, ctypes.c_uint, ctypes.c_uint]),
|
|
24
|
-
("XCreateImage", ctypes.c_void_p, [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint, ctypes.c_int, ctypes.c_int, ctypes.c_char_p, ctypes.c_uint, ctypes.c_uint, ctypes.c_int, ctypes.c_int]),
|
|
25
|
-
("XPutImage", ctypes.c_int, [ctypes.c_void_p, ctypes.c_ulong, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_uint, ctypes.c_uint]),
|
|
26
|
-
("XInternAtom", ctypes.c_ulong, [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int]),
|
|
27
|
-
("XChangeProperty", ctypes.c_int, [ctypes.c_void_p, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_int, ctypes.c_int, ctypes.c_void_p, ctypes.c_int]),
|
|
28
|
-
("XSetWindowBackgroundPixmap", ctypes.c_int, [ctypes.c_void_p, ctypes.c_ulong, ctypes.c_ulong]),
|
|
29
|
-
("XClearWindow", ctypes.c_int, [ctypes.c_void_p, ctypes.c_ulong]),
|
|
30
|
-
("XSetCloseDownMode", ctypes.c_int, [ctypes.c_void_p, ctypes.c_int]),
|
|
31
|
-
("XCloseDisplay", ctypes.c_int, [ctypes.c_void_p]),
|
|
32
|
-
]:
|
|
33
|
-
f = getattr(x, name); f.restype = res; f.argtypes = args
|
|
34
|
-
s = x.XDefaultScreen(d); root = x.XRootWindow(d, s)
|
|
35
|
-
w, h = x.XDisplayWidth(d, s), x.XDisplayHeight(d, s)
|
|
36
|
-
if x.XDefaultDepth(d, s) != 24: sys.exit("unsupported depth")
|
|
37
|
-
# Scale to cover the screen, then crop the centre.
|
|
38
|
-
src = GdkPixbuf.Pixbuf.new_from_file(sys.argv[1])
|
|
39
|
-
k = max(w / src.get_width(), h / src.get_height())
|
|
40
|
-
sw, sh = max(w, round(src.get_width() * k)), max(h, round(src.get_height() * k))
|
|
41
|
-
pb = src.scale_simple(sw, sh, GdkPixbuf.InterpType.BILINEAR).new_subpixbuf((sw - w) // 2, (sh - h) // 2, w, h).copy()
|
|
42
|
-
if pb.get_has_alpha(): pb = pb.composite_color_simple(w, h, GdkPixbuf.InterpType.NEAREST, 255, 1, 0, 0)
|
|
43
|
-
rgb, stride = pb.get_pixels(), pb.get_rowstride()
|
|
44
|
-
bgrx = bytearray(w * h * 4)
|
|
45
|
-
for y in range(h):
|
|
46
|
-
row = rgb[y * stride:y * stride + w * 3]; o = y * w * 4
|
|
47
|
-
bgrx[o:o + w * 4:4] = row[2::3]; bgrx[o + 1:o + w * 4:4] = row[1::3]; bgrx[o + 2:o + w * 4:4] = row[0::3]
|
|
48
|
-
buf = ctypes.create_string_buffer(bytes(bgrx), len(bgrx))
|
|
49
|
-
pix = x.XCreatePixmap(d, root, w, h, 24)
|
|
50
|
-
img = x.XCreateImage(d, x.XDefaultVisual(d, s), 24, 2, 0, buf, w, h, 32, 0) # ZPixmap
|
|
51
|
-
x.XPutImage(d, pix, x.XDefaultGC(d, s), img, 0, 0, 0, 0, w, h)
|
|
52
|
-
ref = ctypes.c_ulong(pix)
|
|
53
|
-
for atom in (b"_XROOTPMAP_ID", b"ESETROOT_PMAP_ID"):
|
|
54
|
-
x.XChangeProperty(d, root, x.XInternAtom(d, atom, 0), 20, 32, 0, ctypes.byref(ref), 1) # XA_PIXMAP, PropModeReplace
|
|
55
|
-
x.XSetWindowBackgroundPixmap(d, root, pix)
|
|
56
|
-
x.XClearWindow(d, root)
|
|
57
|
-
x.XSetCloseDownMode(d, 1) # RetainPermanent: the pixmap outlives this process
|
|
58
|
-
x.XCloseDisplay(d)
|
|
59
|
-
`;function ce(e){return`<?xml version="1.0" encoding="UTF-8"?>
|
|
60
|
-
<openbox_config xmlns="http://openbox.org/3.4/rc">
|
|
61
|
-
<theme><keepBorder>no</keepBorder></theme>
|
|
62
|
-
<applications>
|
|
63
|
-
<!-- Debian Chromium is "Chromium"; Chrome for Testing is "Chromium-browser". -->
|
|
64
|
-
<application class="Chromium*">
|
|
65
|
-
<decor>no</decor>
|
|
66
|
-
<position force="yes"><x>${P}</x><y>${P}</y></position>
|
|
67
|
-
<size><width>${e.width-P*2}</width><height>${e.height-P-w}</height></size>
|
|
68
|
-
</application>
|
|
69
|
-
</applications>
|
|
70
|
-
</openbox_config>`}var be=`# Remote sandbox dock \u2014 launcher icons only, centred, no panel fill
|
|
71
|
-
panel_items = L
|
|
72
|
-
panel_size = 100% 46
|
|
73
|
-
panel_margin = 0 10
|
|
74
|
-
panel_padding = 0 0 10
|
|
75
|
-
panel_position = bottom center horizontal
|
|
76
|
-
panel_shrink = 1
|
|
77
|
-
panel_background_id = 0
|
|
78
|
-
panel_layer = top
|
|
79
|
-
mouse_effects = 1
|
|
80
|
-
mouse_hover_icon_asb = 100 0 12
|
|
81
|
-
mouse_pressed_icon_asb = 100 0 -12
|
|
82
|
-
|
|
83
|
-
launcher_icon_size = 46
|
|
84
|
-
launcher_padding = 0 0 10
|
|
85
|
-
launcher_background_id = 0
|
|
86
|
-
launcher_tooltip = 1
|
|
87
|
-
|
|
88
|
-
launcher_item_app = /tmp/ara-chromium.desktop
|
|
89
|
-
launcher_item_app = /tmp/ara-terminal.desktop
|
|
90
|
-
launcher_item_app = /tmp/ara-files.desktop
|
|
91
|
-
`,ye=`corner-radius = 12;
|
|
92
|
-
rounded-corners-exclude = [
|
|
93
|
-
"class_g = 'tint2'",
|
|
94
|
-
"window_type = 'dock'",
|
|
95
|
-
"window_type = 'desktop'"
|
|
96
|
-
];
|
|
97
|
-
backend = "xrender";
|
|
98
|
-
shadow = false;
|
|
99
|
-
fading = false;
|
|
100
|
-
vsync = false;
|
|
101
|
-
inactive-opacity = 1.0;
|
|
102
|
-
active-opacity = 1.0;
|
|
103
|
-
`,le="/tmp/ara-dock-browser.png",ue=`[Desktop Entry]
|
|
104
|
-
Name=Chrome
|
|
105
|
-
Exec=chromium --no-sandbox %U
|
|
106
|
-
Icon=${le}
|
|
107
|
-
Type=Application
|
|
108
|
-
Categories=Network;WebBrowser;
|
|
109
|
-
`,Pe=`[Desktop Entry]
|
|
110
|
-
Name=Terminal
|
|
111
|
-
Exec=bash -c "DISPLAY=:99 xterm -fa DejaVuSansMono -fs 11 -bg black -fg white"
|
|
112
|
-
Icon=/tmp/ara-dock-terminal.png
|
|
113
|
-
Type=Application
|
|
114
|
-
Categories=System;TerminalEmulator;
|
|
115
|
-
`,Se=`[Desktop Entry]
|
|
116
|
-
Name=Files
|
|
117
|
-
Exec=bash -c "DISPLAY=:99 pcmanfm --no-desktop"
|
|
118
|
-
Icon=/tmp/ara-dock-files.png
|
|
119
|
-
Type=Application
|
|
120
|
-
Categories=System;FileManager;
|
|
121
|
-
`;var K={"wallpaper.jpg":W,"dock-browser.png":B,"dock-terminal.png":F,"dock-files.png":O},Xe=k,fe='set_wallpaper() { if command -v feh >/dev/null 2>&1; then feh --bg-fill "$1"; else python3 "$2" "$1"; fi; }';function v(e){let s=(i)=>i.replaceAll("DISPLAY=:99",`DISPLAY=${e.display}`).replaceAll("/tmp/ara-",`${e.root}/ara-`),p=new Set(e.absent??[]),n=be.split(`
|
|
122
|
-
`).filter((i)=>!(p.has("terminal")&&i.endsWith("/ara-terminal.desktop"))&&!(p.has("files")&&i.endsWith("/ara-files.desktop"))).join(`
|
|
123
|
-
`);return{files:{"openbox/rc.xml":ce(e.screen),"tint2/tint2rc":s(n),"picom/picom.conf":ye,...p.has("terminal")?{}:{"ara-terminal.desktop":s(Pe)},...p.has("files")?{}:{"ara-files.desktop":s(Se)},"ara-chromium.desktop":s(ue).replace("chromium --no-sandbox %U",e.browserExec),"ara-set-root-wallpaper.py":Xe},start:['ticks() { line=$(cat "/proc/$1/stat" 2>/dev/null) || return 1; rest=${line##*) }; case $rest in Z*|X*) return 1;; esac; printf "%s" "$rest" | cut -d " " -f20; }','alive() { [ -f "$ROOT/$1.pid" ] || return 1; read -r pid start <"$ROOT/$1.pid"; current=$(ticks "$pid") || return 1; [ "$current" = "$start" ] && kill -0 "$pid" 2>/dev/null; }','launch() { name=$1; shift; "$@" 9>&- >"$ROOT/$name.log" 2>&1 & pid=$!; start=$(ticks "$pid"); printf "%s %s\\n" "$pid" "$start" >"$ROOT/$name.pid"; }',fe,'[ ! -f "$ROOT/ara-wallpaper.jpg" ] || set_wallpaper "$ROOT/ara-wallpaper.jpg" "$ROOT/ara-set-root-wallpaper.py" || true','if ! alive tint2 && command -v tint2 >/dev/null 2>&1; then launch tint2 tint2 -c "$ROOT/tint2/tint2rc"; fi','if ! alive picom && command -v picom >/dev/null 2>&1; then launch picom picom --config "$ROOT/picom/picom.conf"; fi']}}var Re=43200000,_=":99",de=60000,D=15000,L={width:1280,height:800},Ae=/^[A-Za-z0-9._:-]{1,160}$/;function Ne(e){return Boolean(e)&&typeof e==="object"&&!Array.isArray(e)}var Ee=["video","viewer","viewer_same_network","viewer_network"];function Le(e,s=Date.now()){let p=["relay_url","session_id","expires_at"];if(!Ne(e)||p.some((c)=>!(c in e))||Object.keys(e).some((c)=>!p.includes(c)&&!Ee.includes(c)))throw new r("invalid_display_request","Reason desktop request is malformed.");let n="video"in e?Ao(e.video):void 0,t="viewer"in e?Gn(e.viewer):null;if(n===null)throw new r("invalid_display_request","Reason desktop video request is invalid.");let o=null;try{o=typeof e.relay_url==="string"?new URL(e.relay_url):null}catch{}if(!o||o.protocol!=="wss:"&&o.protocol!=="ws:"||o.username||o.password)throw new r("invalid_display_request","Reason desktop relay URL is invalid.");if(typeof e.session_id!=="string"||!Ae.test(e.session_id))throw new r("invalid_display_request","Reason desktop session identity is invalid.");let i=typeof e.expires_at==="string"?Date.parse(e.expires_at):Number.NaN;if(!Number.isFinite(i)||i<=s)throw new r("invalid_display_request","Reason desktop session has already expired.");return{relay_url:e.relay_url,session_id:e.session_id,expires_at:new Date(Math.min(i,s+Re)).toISOString(),...n?{video:n}:{},...t?{viewer:t}:{},...n&&e.viewer_same_network===!0?{viewer_same_network:!0}:{}}}function $t(e=process.platform){return(e==="linux"||e==="darwin"||e==="win32")&&x()?.features.display===!0}async function Ls(){if(process.platform==="win32")return $t()&&await Pr();if(process.platform!=="darwin")return $t();return await Pr()}function G(e){_e(e,{recursive:!0,mode:448});let s=Qe(e);if(!s.isDirectory()||s.isSymbolicLink()||process.getuid&&s.uid!==process.getuid())throw new r("display_unavailable","Reason desktop state directory is not private.");he(e,448)}function Je(e,s){let p=(t)=>{let o=Buffer.alloc(2);return o.writeUInt16BE(t.length),Buffer.concat([o,t])},n=Buffer.from([255,255]);return Buffer.concat([n,p(Buffer.alloc(0)),p(Buffer.from(e)),p(Buffer.from("MIT-MAGIC-COOKIE-1")),p(s)])}function f(e,s,p=2000){return new Promise((n)=>{let t=we(e),o="",i=(c)=>{t.destroy(),n(c)};t.setTimeout(p,()=>i(!1)),t.once("error",()=>i(!1)),t.once("close",()=>i(!1)),t.once("connect",()=>{if(!s)i(!0)}),t.on("data",(c)=>{if(o+=c.toString("latin1"),o.length>=4)i(o.startsWith("RFB "))})})}async function U(e,s){let p=Date.now()+s;while(Date.now()<p){if(await e())return!0;await new Promise((n)=>setTimeout(n,100))}return!1}function R(e,s,p){return new Promise((n)=>{let t=z(e,s,{detached:!0,stdio:"ignore",env:p});t.once("error",()=>n(-1)),t.once("exit",(o)=>n(o)),t.unref(),setTimeout(()=>n(null),D).unref()})}var J=null;function qe(e=a()){return J??=Ce(e).finally(()=>{J=null}),J}async function Ce(e){let s=x({home:e});if(!s?.xvfb||!s.x11vnc||!s.openbox)throw new r("display_unavailable","Run `reason desktop install` on this machine to enable its desktop.");kt({root:s.root,automation:s.automation,extensionDir:s.extensionDir});let p=y(s.root,"display");G(p);let n=await ge(e,p,s.x11vnc);if(n)return n;let t={display:_,xauthority:y(p,"Xauthority"),rfbSocket:y(p,"rfb.sock")},o=y(p,"pulse"),i=(async()=>{try{G(o)}catch{return null}return await ao(o,s.pulseaudio)})();G(y(p,"home"));let c=ee(p,t,s.pulseaudio),T=async()=>({...t,sound:await i});if(await f({path:t.rfbSocket},!0))return await T();if(!H(t.xauthority))C(t.xauthority,Je(_.slice(1),Te(16)),{mode:384,flag:"wx"});let l=se(y(p,"theme"),t.display,L),S={path:`/tmp/.X11-unix/X${_.slice(1)}`};if(!await f(S,!1)){let q=`${L.width}x${L.height}`;if(s.xvnc)I(t.rfbSocket,{force:!0}),R(s.xvnc,[t.display,"-geometry",q,"-depth","24","-nolisten","tcp","-auth",t.xauthority,"-rfbport","-1","-rfbunixpath",t.rfbSocket,"-SecurityTypes","None","-AlwaysShared","-desktop","Reason"],c);else R(s.xvfb,[t.display,"-screen","0",`${q}x24`,"-nolisten","tcp","-auth",t.xauthority],c);if(!await U(()=>f(S,!1),D)||s.xvnc&&!await U(()=>f({path:t.rfbSocket},!0),D))throw new r("display_unavailable","Reason could not start the virtual display.");R(s.openbox,["--config-file",l.openboxConfig],c)}if(await te(l,c),!await re(s.x11vnc,t,p,"x11vnc.log",c))throw new r("display_unavailable","Reason could not start the desktop server.");return await T()}function ee(e,s,p){let n={HOME:y(e,"home"),PATH:"/usr/local/bin:/usr/bin:/bin",DISPLAY:s.display,XAUTHORITY:s.xauthority};if(p)n.PULSE_SERVER=Ve(Pn(y(e,"pulse")));return n}async function re(e,s,p,n,t){if(await f({path:s.rfbSocket},!0))return!0;I(s.rfbSocket,{force:!0});let o=await R(e,["-display",s.display,"-auth",s.xauthority,"-rfbport","0","-rfbportv6","-1","-unixsock",s.rfbSocket,"-nopw","-forever","-shared","-noxdamage","-sb","0","-rfbversion","3.7","-quiet","-bg","-o",y(p,n)],t);if(o!==null&&o!==0)return!1;return await U(()=>f({path:s.rfbSocket},!0),D)}async function Ue(){let e=["DISPLAY","XAUTHORITY","WAYLAND_DISPLAY","XDG_SESSION_TYPE"],s=(p)=>Object.fromEntries(e.flatMap((n)=>p[n]?[[n,p[n]]]:[]));if(process.env.DISPLAY)return s(process.env);try{let p=await new Promise((n,t)=>Y("systemctl",["--user","show-environment"],{encoding:"utf8",timeout:2000},(o,i)=>o?t(o):n(i)));return s(Object.fromEntries(p.split(`
|
|
124
|
-
`).flatMap((n)=>{let t=n.indexOf("=");return t>0?[[n.slice(0,t),n.slice(t+1)]]:[]})))}catch{return{}}}var V=new Set;async function ge(e,s,p){let n=await Ue(),t=/^:(\d+)(?:\.\d+)?$/.exec(n.DISPLAY??"")?.[1];if(!t||`:${t}`===_||n.WAYLAND_DISPLAY||n.XDG_SESSION_TYPE==="wayland")return null;let o={display:`:${t}`,xauthority:n.XAUTHORITY??y(e,".Xauthority"),rfbSocket:y(s,`rfb-${t}.sock`)},i=`${o.display} ${o.xauthority}`;if(V.has(i)||!await f({path:`/tmp/.X11-unix/X${t}`},!1))return null;let c={HOME:e,PATH:"/usr/local/bin:/usr/bin:/bin",DISPLAY:o.display,XAUTHORITY:o.xauthority};if(await re(p,o,s,`x11vnc-${t}.log`,c))return{...o,sound:null};return V.add(i),process.stderr.write(`Reason worker: your screen ${o.display} could not be served; using the virtual desktop
|
|
125
|
-
`),null}function se(e,s,p){let n=`chromium --no-first-run --no-default-browser-check${process.geteuid?.()===0?" --no-sandbox":""} %U`,t=[["terminal","xterm"],["files","pcmanfm"]].filter(([,i])=>!H(`/usr/bin/${i}`)).map(([i])=>i),o=v({root:e,display:s,screen:p,browserExec:n,absent:t});for(let i of["","openbox","tint2","picom"])G(y(e,i));for(let[i,c]of Object.entries(o.files))C(y(e,i),c,{mode:384});for(let[i,c]of Object.entries(K))C(y(e,`ara-${i}`),De(c),{mode:384});return{root:e,openboxConfig:y(e,"openbox","rc.xml"),start:o.start}}async function te(e,s){let p=[`ROOT=${JSON.stringify(e.root)}`,...e.start,"openbox --reconfigure >/dev/null 2>&1 || true"].join(`
|
|
126
|
-
`);await new Promise((n)=>{let t=z("/bin/sh",["-c",p],{stdio:"ignore",env:{...s,PATH:"/usr/bin:/bin"}}),o=setTimeout(()=>{t.kill(),n()},D);t.once("error",()=>{clearTimeout(o),n()}),t.once("exit",()=>{clearTimeout(o),n()})})}var me=2073600,Me=320;function We(e,s){let p=Math.min(1,Math.sqrt(me/(e.width*e.height))),n=(t,o)=>Math.min(Math.floor(o/8)*8,Math.max(Me,Math.round(t*p/8)*8));return{width:n(e.width,s.width),height:n(e.height,s.height)}}function ne(e,s,p){return new Promise((n)=>Y(e,s,{env:p,encoding:"utf8",timeout:5000},(t,o)=>n(t?null:o)))}function je(e){let s=/current (\d+) x (\d+), maximum (\d+) x (\d+)/.exec(e),p=e.split(`
|
|
127
|
-
`),n=p.findIndex((o)=>/^\S+ connected/.test(o));if(!s||n<0)return null;let t=[];for(let o of p.slice(n+1)){let i=/^\s+(\d+x\d+)\s/.exec(o);if(!i)break;t.push(i[1])}return{current:{width:Number(s[1]),height:Number(s[2])},maximum:{width:Number(s[3]),height:Number(s[4])},output:p[n].split(" ")[0],modes:t}}async function Be(e,s,p){if(e.display!==_)return null;let n={PATH:"/usr/bin:/bin",DISPLAY:e.display,XAUTHORITY:e.xauthority},t=(T)=>ne("xrandr",T,n),o=je(await t(["--query"])??"");if(!o||o.maximum.width<=o.current.width&&o.maximum.height<=o.current.height)return null;let i=We(s,o.maximum);if(i.width===o.current.width&&i.height===o.current.height)return{size:i,changed:!1};let c=`${i.width}x${i.height}`;if(!o.modes.includes(c)){if(await t(["--newmode",c,"60",...[i.width,i.width,i.width,i.width,i.height,i.height,i.height,i.height].map(String)]),await t(["--addmode",o.output,c])===null)return null}return p(),await t(["--output",o.output,"--mode",c])===null?null:{size:i,changed:!0}}async function Oe(e,s){let p=x({home:a()});if(!p)return;let n=y(p.root,"display"),t=ee(n,e,p.pulseaudio);await te(se(y(n,"theme"),e.display,s),t);let o=s.width-P*2,i=s.height-P-w;await ne("xdotool",["search","--onlyvisible","--class","Chromium","windowsize","%@",String(o),String(i),"windowmove","%@",String(P),String(P)],{...t,PATH:"/usr/bin:/bin"})}var Z=Promise.resolve();function Fe(e,s,p=()=>{}){let n=Z.then(()=>Be(e,s,p));return Z=n.then((t)=>t?.changed?Oe(e,t.size):void 0).catch(()=>{}),n.then((t)=>t?.size??null,()=>null)}async function Bt(e,s={}){let p=s.now??Date.now,n=Le(e.payload,p());if(e.signal.throwIfAborted(),!n.video)throw new r("display_video_required","Reason desktops stream as video now; this request came without it.");let t=s.platform??process.platform;if(t!=="linux"&&t!=="darwin"&&t!=="win32")throw new r("display_video_unsupported","This machine does not serve desktop video.");let o=n.video,i=(s.video?.desktop??(t==="darwin"?async()=>Tn:t==="win32"?async()=>Rn:qe))();return await ke(e.signal,n,s,p,(c)=>On(c,{request:o,desktop:i,...n.viewer?{viewer:n.viewer}:{},viewerSameNetwork:n.viewer_same_network===!0},{resizeDesktop:Fe,...s.video}),(c)=>Jt({type:"error",code:c}))}function ke(e,s,p,n,t,o){let i=n();return new Promise((c,T)=>{let l=null,S=!1,q=!1,g,d,h,m=!1,u=null,X=(b)=>{if(q)return;if(u)b=u;q=!0,clearTimeout(g),clearTimeout(d),e.removeEventListener("abort",N),h?.close();try{l?.close(1000,"display_session_over")}catch{}if("error"in b){T(b.error);return}c({reason:b.reason,...h?.summary(),duration_ms:Math.max(0,n()-i)})},A=()=>X({error:new r("display_relay_unavailable","Reason could not reach the desktop relay.")}),N=()=>{let b=e.reason;X({error:b instanceof r?b:new r("cancelled","Reason closed the desktop session.")})},M=()=>{if(!u||!l)return;let b=u.error;try{l.send(o(b instanceof r?b.code:"display_unavailable"))}catch{}X(u)};if(h=t({get done(){return q||u!==null},get open(){return S&&!q&&u===null},get bufferedAmount(){return l?.bufferedAmount??0},send(b){if(q||u||!S||!l)return;try{l.send(b)}catch{X({reason:"relay_closed"})}},end:(b)=>{if(q||u)return;if(!("error"in b)){X(b);return}if(u=b,m&&S)M()}}),q){h.close();return}if(e.aborted){N();return}e.addEventListener("abort",N,{once:!0}),g=setTimeout(()=>X({reason:"session_expired"}),Math.max(1,Date.parse(s.expires_at)-n())),d=setTimeout(()=>X({reason:"viewer_absent"}),p.viewerWaitMs??de);try{l=(p.connect??Ir)(s.relay_url,(p.loadProxy??j)()?.url)}catch{A();return}l.binaryType="arraybuffer",l.onopen=()=>{if(q||!l)return;S=!0,h?.opened()},l.onmessage=(b)=>{if(q)return;let Q=b.data,E=Q instanceof ArrayBuffer?new Uint8Array(Q):ArrayBuffer.isView(Q)?new Uint8Array(Q.buffer,Q.byteOffset,Q.byteLength):null;if(!E||E.byteLength===0)return;if(clearTimeout(d),m=!0,u){M();return}h?.received(E)},l.onclose=()=>{if(q)return;if(!S){A();return}X({reason:"relay_closed"})},l.onerror=()=>{if(q||S)return;A()}})}
|
|
128
|
-
export{$t,Ls,G,qe,Bt};
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import"./vm-hands-entry-lite-4vks5phw.js";import"./vm-hands-entry-lite-3krzmhkk.js";import"./vm-hands-entry-lite-tdgtpx8e.js";import"./vm-hands-entry-lite-rfz60hb3.js";import{it,Zi,br,Ot}from"./vm-hands-entry-lite-34z9890s.js";import"./vm-hands-entry-lite-hk6trmwa.js";import"./vm-hands-entry-lite-beyyy1gz.js";import"./vm-hands-entry-lite-fbhqfzbq.js";import"./vm-hands-entry-lite-fcvf8md1.js";import"./vm-hands-entry-lite-s5qkb1fk.js";import"./vm-hands-entry-lite-aj139v8j.js";import"./vm-hands-entry-lite-pf5qtbj5.js";import"./vm-hands-entry-lite-21qpxvt8.js";import{ar,cr,Ct,At}from"./vm-hands-entry-lite-2nvhegyc.js";import"./vm-hands-entry-lite-s4bharcb.js";import"./vm-hands-entry-lite-wx4ax7wg.js";import"./vm-hands-entry-lite-jev771b3.js";import"./vm-hands-entry-lite-6c67a3jc.js";import{spawn as Ae}from"child_process";import{chmodSync as De,chownSync as Me,existsSync as G,lstatSync as ne,mkdirSync as Z,mkdtempSync as Le,readdirSync as Q,readFileSync as k,realpathSync as Te,rmdirSync as te,rmSync as He,writeFileSync as j}from"fs";import{join as p}from"path";import{readFileSync as ce,readlinkSync as le}from"fs";import{relative as xe}from"path";var ue=16;function de(n){return n.replace(/\\([0-7]{3})/g,(r,i)=>String.fromCharCode(Number.parseInt(i,8)))}function Ie(n){let r=[];for(let i of n.split(`
|
|
3
|
-
`)){let e=i.split(" ");if(e.length<10||!/^\d+:\d+$/.test(e[2]))continue;r.push({device:e[2],root:de(e[3]),mountPoint:de(e[4])})}return r}function Ne(n,r,i){let e=n.replace(/\/+$/,"")||"/",c=(_)=>e==="/"||_===e||_.startsWith(`${e}/`),a=(_)=>new Map(Ie(_).filter((v)=>c(v.mountPoint)).map((v)=>[`${v.mountPoint}\x00${v.device}\x00${v.root}`,v.mountPoint])),l=a(r),m=a(i),h=(_)=>xe(e,_)||".",P=[...l].filter(([_])=>!m.has(_)).map(([,_])=>h(_)),C=[...m].filter(([_])=>!l.has(_)).map(([,_])=>h(_));return{missing:P,extra:C,referenceCount:l.size,ownCount:m.size}}function pe(n,r,i,e="/proc"){let c,a,l=null;try{c=ce(`${e}/1/mountinfo`,"utf8"),a=ce(`${e}/self/mountinfo`,"utf8")}catch(v){let N=v&&typeof v==="object"&&"code"in v&&typeof v.code==="string"?v.code:"unreadable";r("vm_hands.mount_check_unavailable",{code:N});return}try{l=le(`${e}/1/ns/mnt`)===le(`${e}/self/ns/mnt`)}catch{}let{missing:m,extra:h,referenceCount:P,ownCount:C}=Ne(n,c,a),_={reference_count:P,own_count:C,missing_count:m.length,extra_count:h.length,same_namespace:l};if(h.length)r("vm_hands.mount_extra",{..._,extra:h.slice(0,ue)});if(m.length)throw r("vm_hands.mount_mismatch",{..._,missing:m.slice(0,ue)}),i(`${m.length} mount(s) under the Session root are missing from vm-hands' namespace`)}var ve="/sys/fs/cgroup/reason-payload",D="vm-hands",ze="/run/ara-srt/fallbacks.jsonl",F="/reason-person",We="surface",re=5000,Be=1e4,fe="__VM_HANDS_PROOF_DIR__",Ue="__VM_HANDS_PROBE_NONCE__";class y extends Error{code;constructor(n,r){super(r);this.code=n}}function Fe(n,r){if(!/^[0-9a-f-]{36}$/i.test(r))throw new y("vm_hands_bind_invalid","bad bind id");return p(n,D,`b-${r.toLowerCase()}`)}var Ke=5000,be=(n)=>`'${n.replaceAll("'","'\\''")}'`;function on(n){let r=n.cgroup??ve,i=n.init.layout.payload_uid,e=n.log??(()=>{}),c=new Map,a=new Map,l=0,m=()=>{try{let t=k("/run/ara-srt/starts.jsonl","utf8"),o=t.slice(l>t.length?0:l).split(`
|
|
4
|
-
`).filter(Boolean);l=t.length;let u=o.map((f)=>{try{return Number(JSON.parse(f).elapsed_ms)||0}catch{return 0}});if(u.length)e("vm_hands.srt_server_starts",{count:u.length,elapsed_ms:u.slice(0,8)})}catch{}},h=null,P=!1,C=n.srtCgroup??"/sys/fs/cgroup/reason-srt",_=()=>{h??=ge()},v=0,N=()=>{try{let t=k(ze,"utf8"),o=t.slice(v>t.length?0:v);v=t.length;let u=o.split(`
|
|
5
|
-
`).filter(Boolean).slice(0,1000);if(!u.length)return null;let f={},g=0;for(let b of u)try{let w=JSON.parse(b),d=typeof w.code==="string"&&/^[a-z_]{1,40}$/.test(w.code)?w.code:"other";if(f[d]=(f[d]??0)+1,typeof w.elapsed_ms==="number")g=Math.max(g,w.elapsed_ms)}catch{f.unparsed=(f.unparsed??0)+1}return e("vm_hands.srt_fallbacks",{count:u.length,codes:f,max_elapsed_ms:g}),{count:u.length,codes:f,max_elapsed_ms:g}}catch{return null}},O=!1,I=(t,o,u)=>{if(O)throw Error("vm_hands_pool_held");return K(t,o,u)},z=(t)=>(o,u,f)=>Ae("/bin/sh",["-c",`echo $$ > ${be(p(t,"cgroup.procs"))} || exit 125; exec "$@"`,"vm-hands-join",o,...u],f),K=z(p(r,D)),W=p(r,D,"probe"),B=(t)=>Fe(r,t),Ce=(t)=>{let o=B(t);try{Z(o,{mode:493})}catch(u){if(!(u&&typeof u==="object"&&("code"in u)&&u.code==="EEXIST"))throw new y("vm_hands_bind_failed","bind cgroup")}return o},Oe=(t)=>{try{te(B(t))}catch{}},M=n.prespawn?Zi({spawnProcess:I,...n.relayDependencies?.sourceEntrypoint?{sourceEntrypoint:n.relayDependencies.sourceEntrypoint}:{},log:(t,o)=>e(t,o??{})}):null;M?.arm();let q=M?setInterval(()=>{M.arm()},Ke):null;q?.unref?.();async function E(t){let o=c.get(t);if(c.delete(t),!o)return;o.abort.abort(),await o.done}return{bindCgroup:B,async startExecutor(t){if(_(),a.set(t.bindId,ge()),P=!0,!t.claim)throw new y("vm_hands_bind_invalid","an executor needs the claim it serves");await E(t.bindId);let{claim:o,bindId:u}=t,f=Ce(u),g=o.owner;if(!g||typeof g.device_id!=="string"||typeof o.root_id!=="string")throw new y("vm_hands_bind_invalid","claim without its owner Device or root");let b=new AbortController,w,d,x=new Promise((s,S)=>{w=s,d=S}),L,R=new Promise((s)=>{L=s}),U=Ot({headless:!0,hostExecution:!0,runtimeDirectory:n.runtimeDirectory,deviceIdentity:{deviceId:g.device_id,rootId:o.root_id,apiOrigin:n.apiOrigin},claimOwner:o.owner,root:n.root,runId:o.run_id,operationId:o.operation_id,attemptId:o.attempt_id,payload:Object.fromEntries(Object.entries(o.payload).filter(([s])=>!s.startsWith("vm_hands_"))),signal:b.signal,...t.workspaceGrant?{workspaceGrant:t.workspaceGrant}:{},emitEvent:async(s,S)=>{if(s==="hands.ready"){w(S);return}if(s==="hands.started"||s==="hands.stopped"||s==="hands.failed")return;await n.forward(u,s,S)}},{...n.relayDependencies,spawnWorker:(s)=>z(f)(s.command,s.args,s.options),...M?{takePrespawnedWorker:(s)=>{let S=M.take(s);if(!S?.pid)return S;try{return j(p(f,"cgroup.procs"),String(S.pid)),S}catch{try{S.kill("SIGKILL")}catch{}return null}},adoptSpawnedWorker:M.adopt}:{}}).then(()=>{L("executor_stopped")},(s)=>{let S=s&&typeof s==="object"&&"code"in s?String(s.code):"executor_failed";d(new y(S,s instanceof Error?s.message:String(s))),L(S)}).finally(()=>d(new y("vm_hands_executor_exited","executor ended before it was ready")));c.set(u,{abort:b,done:U,exited:R,operationId:o.operation_id,runId:o.run_id,expiresAtMs:Date.parse(String(o.payload.expires_at??""))||0});let T=await x,V=T.executor_launch_id;if(typeof V!=="string")throw new y("vm_hands_bind_failed","executor ready without a launch id");return{launchId:V,readyData:T,applied:{hands_confinement:typeof o.payload.hands_confinement==="string"?o.payload.hands_confinement:null,browser_egress:o.payload.browser_egress??null}}},takeSrtFallbacks:N,executorExited(t){return c.get(t)?.exited??new Promise(()=>{})},freezeBind(t){let o=B(t);if(G(p(o,"cgroup.freeze")))j(p(o,"cgroup.freeze"),"1")},async killAndVerifyPayload(t){let o=new Set(t?.keep??[]);if(o.size||t?.own)return $e(t?.bindId??null,o,t?.own===!0);O=!0;let u=he();try{await we();let f=Promise.all([...c.keys()].map((d)=>E(d).catch(()=>{return})));m();let g=Date.now()+re;await J(r,g,"payload"),await f;let b=(P||n.srtWarmLate?.()===!0)&&G(p(C,"cgroup.events"));if(b)await J(C,g,"srt");let w=oe(i).filter((d)=>!A(d,F));if(h!==null){let d=se(h).filter((x)=>x!==process.pid&&!A(x,F));if(d.length)throw e("vm_hands.kill_strays",{strays:Y(d)}),new y("vm_hands_kill_unverified",`${d.length} process(es) the run started survived it`);h=null}if(P=!1,b)n.onSrtReset?.();if(w.length)throw e("vm_hands.kill_survivors",{pids:w.slice(0,16)}),new y("vm_hands_kill_unverified",`${w.length} payload-uid process(es) outside the payload cgroup`);a.clear();for(let d of ae())try{te(p(r,D,d))}catch{}}finally{O=!1,u()}if(M)setTimeout(()=>{if(!c.size)M.arm()},100).unref?.()},async killProbe(){let t=Date.now()+re;if(G(p(W,"cgroup.events"))){await J(W,t,"probe");try{te(W)}catch{}}let o=ie(process.pid);if(o===null)throw new y("vm_hands_kill_unverified","agent start time unreadable");await je(r,o,t);let u=(g)=>{let b=ie(g);return b!==null&&b<=o},f=oe(i).filter((g)=>u(g)&&!A(g,F));if(f.length)throw e("vm_hands.kill_survivors",{pids:f.slice(0,16),at:"attest"}),new y("vm_hands_kill_unverified",`${f.length} payload-uid process(es) from before this agent`);if(h!==null){let g=[r,p(r,D)].map((d)=>d.replace(/^\/sys\/fs\/cgroup/,"")),b=C.replace(/^\/sys\/fs\/cgroup/,""),w=se(h).filter((d)=>d!==process.pid&&!A(d,F)&&!A(d,"/reason-vm-hands")&&!A(d,b)&&!g.some((x)=>me(d,x)));if(w.length&&P)throw e("vm_hands.kill_strays",{strays:Y(w),at:"attest"}),new y("vm_hands_kill_unverified",`${w.length} process(es) the run started survived it`);if(w.length)e("vm_hands.attest_concurrent",{processes:Y(w),count:w.length});h=null}},async runProbe({nonce:t,script:o}){if(_(),!o.includes(fe))throw new y("vm_hands_probe_failed","probe names no proof directory");let u=n.proofParent??"/tmp/reason-vm-hands-proof";Z(u,{mode:457,recursive:!0});let f=ne(u);if(f.isSymbolicLink()||!f.isDirectory()||f.uid!==(process.getuid?.()??-1)||(f.mode&4095)!==457)throw new y("vm_hands_probe_failed","proof parent is not root's 0711 directory");let g=Le(p(u,"p-")),b=!1;try{if(!/^[A-Za-z0-9/._-]+$/.test(g)||!/^[A-Za-z0-9_-]{1,128}$/.test(t))throw new y("vm_hands_probe_failed","proof directory path or nonce");Me(g,i,i),De(g,448);let w=ne(g).ino;try{Z(W,{mode:493})}catch(R){if(!(R&&typeof R==="object"&&("code"in R)&&R.code==="EEXIST"))throw new y("vm_hands_probe_failed","probe cgroup")}let d=z(W)("/bin/bash",["-c",o.replaceAll(fe,g).replaceAll(Ue,t)],{cwd:"/",env:{PATH:"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"},stdio:["ignore","pipe","ignore"]}),x="";d.stdout?.on("data",(R)=>{if(x.length<16384)x+=R.toString("utf8").slice(0,16384-x.length)});let L=await new Promise((R)=>{let U=setTimeout(()=>{b=!0,d.kill("SIGKILL"),R(124)},Be);d.once("error",()=>{clearTimeout(U),R(127)}),d.once("close",(T)=>{clearTimeout(U),R(T??1)})});return e("vm_hands.probe",{nonce_len:t.length,exit_code:L}),{exitCode:L,markers:x,proofDirInode:w}}finally{if(!b)He(g,{recursive:!0,force:!0})}},restatLayout(){let{session_root:t,alias:o}=n.init.layout,u="invalid";try{br(t),u="0:0:755"}catch{}let f=!1,g=-1;try{let b=ne(o);g=b.uid,f=u==="0:0:755"&&o===p(t,"repo")&&!b.isSymbolicLink()&&b.isDirectory()&&Te(o)===o&&b.uid===i}catch{}return{root_mode:u,alias_ok:f,owner_uid:g}},verifyMounts(){pe(n.init.layout.session_root,e,(t)=>new y("vm_hands_mount_mismatch",t))},installEnvironment(t,o){let u=c.get(t);if(!u)throw new y("environment_unavailable","no executor owns an environment");return it({root:n.root,operationId:u.operationId,payload:o}).installed_revision},async stop(){if(q)clearInterval(q);M?.close(),await Promise.all([...c.keys()].map((t)=>E(t)))}};function ae(){try{return Q(p(r,D),{withFileTypes:!0}).filter((t)=>t.isDirectory()&&/^b-[0-9a-f-]{36}$/.test(t.name)).map((t)=>t.name)}catch{return[]}}async function $e(t,o,u=!1){let f=new Set([...o].map((b)=>b.toLowerCase())),g=he();try{await we();let b=Date.now()+re,w=new Set(ae().filter((s)=>!f.has(s.slice(2))).map((s)=>s.slice(2)));if(t)w.add(t.toLowerCase());let d=null;for(let s of w){let S=E(s).catch(()=>{return}),ee=a.get(s);if(ee!==void 0)d=d===null?ee:Math.min(d,ee);if(G(p(B(s),"cgroup.events")))await J(B(s),b,"bind");await S}let x=[...f].map((s)=>B(s).replace(/^\/sys\/fs\/cgroup/,"")),L=[r,p(r,D)].map((s)=>s.replace(/^\/sys\/fs\/cgroup/,"")),R=C.replace(/^\/sys\/fs\/cgroup/,""),U=(s)=>A(s,F)||x.some((S)=>A(s,S)),T=u?[]:oe(i).filter((s)=>!U(s));if(T.length)throw e("vm_hands.kill_survivors",{pids:T.slice(0,16),beside:f.size}),new y("vm_hands_kill_unverified",`${T.length} payload-uid process(es) outside a live bind`);let V=(s)=>!U(s)&&!A(s,"/reason-vm-hands")&&!A(s,R)&&!L.some((S)=>me(s,S));if(d!==null){let s=se(d).filter((S)=>S!==process.pid&&V(S));if(s.length)throw e("vm_hands.kill_strays",{strays:Y(s),beside:f.size}),new y("vm_hands_kill_unverified",`${s.length} process(es) the run started survived it`)}for(let s of w)a.delete(s),Oe(s)}finally{g()}}}function ie(n,r="/proc"){try{let i=k(p(r,String(n),"stat"),"utf8"),e=Number(i.slice(i.lastIndexOf(")")+2).split(" ")[19]);return Number.isFinite(e)?e:null}catch{return null}}function Se(n,r="/proc"){try{let i=k(p(r,String(n),"stat"),"utf8"),e=Number(i.slice(i.lastIndexOf(")")+2).split(" ")[1]);return Number.isFinite(e)?e:null}catch{return null}}async function je(n,r,i){try{j(p(n,"cgroup.freeze"),"1")}catch(e){throw new y("vm_hands_kill_unverified",`payload cgroup.freeze: ${e instanceof Error?e.message:String(e)}`)}try{for(;;){let e=Pe(n).filter((a)=>ke(a,n)),c=new Set(e.filter((a)=>{let l=ie(a);return l!==null&&l<=r}));for(let a=!0;a;){a=!1;for(let l of e){if(c.has(l))continue;let m=Se(l);if(m!==null&&c.has(m))c.add(l),a=!0}}if(c.size===0)return;if(Date.now()>i)throw new y("vm_hands_kill_unverified",`${c.size} previous-boot process(es) survived`);for(let a of c)try{process.kill(a,"SIGKILL")}catch{}await new Promise((a)=>setTimeout(a,10))}}finally{try{j(p(n,"cgroup.freeze"),"0")}catch{}}}function me(n,r,i="/proc"){try{return k(p(i,String(n),"cgroup"),"utf8").split(`
|
|
6
|
-
`).find((c)=>c.startsWith("0::"))?.slice(3)===r}catch{return!1}}function A(n,r,i="/proc"){try{let c=k(p(i,String(n),"cgroup"),"utf8").split(`
|
|
7
|
-
`).find((a)=>a.startsWith("0::"))?.slice(3)??"";return c===r||c.startsWith(`${r}/`)}catch{return!1}}var Ge=100;function ge(){try{return Math.floor(Number(k("/proc/uptime","utf8").split(" ")[0])*Ge)}catch{return 0}}async function J(n,r,i){try{j(p(n,"cgroup.freeze"),"1")}catch(e){throw new y("vm_hands_kill_unverified",`${i} cgroup.freeze: ${e instanceof Error?e.message:String(e)}`)}while(!/^populated 0$/m.test(k(p(n,"cgroup.events"),"utf8"))){if(Date.now()>r)throw new y("vm_hands_kill_unverified",`${i} cgroup still populated (left frozen)`);for(let e of Pe(n)){if(!ke(e,n))continue;try{process.kill(e,"SIGKILL")}catch{}}await new Promise((e)=>setTimeout(e,10))}try{j(p(n,"cgroup.freeze"),"0")}catch(e){throw new y("vm_hands_kill_unverified",`${i} cgroup thaw: ${e instanceof Error?e.message:String(e)}`)}}function ke(n,r){let i=r.replace(/^\/sys\/fs\/cgroup/,"")||"/",e="";try{e=k(`/proc/${n}/cgroup`,"utf8").split(`
|
|
8
|
-
`).find((a)=>a.startsWith("0::"))??""}catch{return!1}let c=e.slice(3);return c===i||c.startsWith(`${i}/`)}function Pe(n){let r=[],i=(e)=>{try{for(let a of k(p(e,"cgroup.procs"),"utf8").split(`
|
|
9
|
-
`))if(/^\d+$/.test(a))r.push(Number(a))}catch{}let c=[];try{c=Q(e,{withFileTypes:!0}).filter((a)=>a.isDirectory()).map((a)=>a.name)}catch{}for(let a of c)i(p(e,a))};return i(n),r}function Y(n,r="/proc"){return n.slice(0,16).map((i)=>{let e="?",c="?";try{e=k(p(r,String(i),"comm"),"utf8").trim().slice(0,32)}catch{}try{c=(k(p(r,String(i),"cgroup"),"utf8").split(`
|
|
10
|
-
`).find((a)=>a.startsWith("0::"))??"").slice(3,120)}catch{}return{pid:i,comm:e,ppid:Se(i,r),cgroup:c}})}function se(n,r="/proc"){let i=[];for(let e of Q(r)){if(!/^\d+$/.test(e))continue;let c;try{c=k(p(r,e,"stat"),"utf8")}catch{continue}let a=c.slice(c.lastIndexOf(")")+2).split(" "),l=Number(a[1]),m=Number(a[6]),h=Number(a[19]);if(!((m&2097152)!==0||l===2||e==="2")&&a[0]!=="Z"&&h>=n)i.push(Number(e))}return i}function oe(n,r="/proc"){let i=[];for(let e of Q(r)){if(!/^\d+$/.test(e))continue;let c;try{c=k(p(r,e,"status"),"utf8")}catch{continue}let a=/^Uid:\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/m.exec(c);if(a&&a.slice(1).some((l)=>Number(l)===n))i.push(Number(e))}return i}function _e(n="/proc/sys/kernel/yama/ptrace_scope"){try{return Number(k(n,"utf8").trim())>=1}catch{return!1}}var H=0,Re=[],X=new Set;function he(){H++;let n=!1;return()=>{if(n)return;if(n=!0,--H===0)for(let r of Re.splice(0))r()}}function Ee(){return H===0?Promise.resolve():new Promise((n)=>{Re.push(n)})}async function ye(){while(H>0)await Ee()}async function we(){let n=Date.now()+1000;while(X.size&&Date.now()<n)await new Promise((r)=>setTimeout(r,2))}function Ve(n,r){let i=r.replace(/^\/sys\/fs\/cgroup/,"");X.add(n);let e=()=>{let c="";try{c=k(`/proc/${n}/cgroup`,"utf8").split(`
|
|
11
|
-
`).find((a)=>a.startsWith("0::"))??""}catch{X.delete(n);return}if(c.slice(3)===i){X.delete(n);return}setTimeout(e,1)};e()}function an(n){let r={person:n.personCgroup??p("/sys/fs/cgroup",F,D),model:n.payloadCgroup??p(ve,D),surface:n.surfaceCgroup??p("/sys/fs/cgroup",F,D,We)},i=n.entry??process.argv[1]??"",e={},c=(l)=>l.startsWith("model:")&&n.bindCgroup?n.bindCgroup(l.slice(6)):r[l.startsWith("model")?"model":l==="surface"?"surface":"person"],a=(l)=>{let m=l.startsWith("model")?"model":l==="surface"?"surface":"person",h=new Map,P=String(n.payloadUid),C=String(n.payloadGid);if(m==="surface")try{Z(c(l),{mode:493})}catch{}let _=m==="surface"?'exec "$@"':`exec /usr/bin/setpriv --no-new-privs --reuid=${P} --regid=${C} --clear-groups -- "$@"`,v=Bun.spawn(["/bin/sh","-c",`echo $$ > ${be(p(c(l),"cgroup.procs"))} || exit 125; ${_}`,"vm-hands-op-join",process.execPath,"--no-install",i,"--vm-hands-op-runner",...m==="person"?[ar]:[],...m==="surface"?[cr,`${Ct}${P}`,`${At}${n.surfaceDirectory??""}`]:[]],{cwd:"/",env:{PATH:process.env.PATH??"/usr/bin:/bin",BUN_BE_BUN:"1",HOME:m==="surface"?process.env.HOME||"/root":"/home/runner",...G("/bin/bash")?{SHELL:"/bin/bash"}:{}},stdio:["ignore","ignore","ignore"],ipc(O){let I=O;if(m==="surface"&&I.t==="readiness"){let K=O;n.log?.("vm_hands.surface_ready",{lanes:Object.keys(K.lanes??{}).filter((W)=>K.lanes[W]===!0),display_video:K.display_video===!0}),n.onSurfaceReadiness?.(K);return}let z=h.get(I.id);if(!z)return;if(I.t==="event"&&I.event)z.onEvent(I.event);if(I.t==="done")h.delete(I.id),z.done(I.completion??{status:"failed",error_code:"vm_hands_op_failed"})}});v.exited.then((O)=>{if(e[l]?.child===v)delete e[l];for(let[,I]of h)I.done({status:"failed",error_code:"vm_hands_op_runner_exited"});if(h.clear(),n.log?.("vm_hands.op_runner_exited",{kind:m,code:O}),m==="surface")n.onSurfaceReadiness?.(null)}),Ve(v.pid,c(l));let N={child:v,pending:h};return e[l]=N,N};return{run(l,m,h,P,C){if(!_e())return Promise.resolve({status:"failed",error_code:"vm_hands_ptrace_unprotected"});let _=l==="model"&&C&&n.bindCgroup?`model:${C.toLowerCase()}`:l,v=async()=>{while(!e[_]&&H>0)await ye()};return v().then(async()=>{if(!e[_]&&H>0)await v()}).then(()=>new Promise((N)=>{if(!e[_]&&H>0){N({status:"failed",error_code:"vm_hands_op_runner_unavailable"});return}let O=e[_]??a(_);O.pending.set(m.id,{onEvent:h,done:N}),P.addEventListener("abort",()=>{try{O.child.send({t:"cancel",id:m.id})}catch{}},{once:!0});try{O.child.send({t:"op",...m})}catch{O.pending.delete(m.id),N({status:"failed",error_code:"vm_hands_op_runner_unavailable"})}}))},warm(l){if(!e[l]&&_e())ye().then(()=>{if(!e[l]&&H===0)a(l)})},notify(l,m){let h=e[l];if(!h)return!1;try{return h.child.send(m),!0}catch{return!1}},stop(){for(let l of Object.keys(e))e[l]?.child.kill()}}}export{ve as VM_HANDS_PAYLOAD_CGROUP,D as VM_HANDS_PAYLOAD_JOIN,F as VM_HANDS_PERSON_CGROUP,Ue as VM_HANDS_PROBE_NONCE_TOKEN,fe as VM_HANDS_PROOF_DIR_TOKEN,We as VM_HANDS_SURFACE_JOIN,y as VmHandsExecutorError,on as createVmHandsExecutor,an as createVmHandsOpRunners,Y as describeProcesses,A as inCgroup,oe as payloadUidProcesses,se as processesStartedSince,_e as ptraceProtected,Pe as subtreePids,Fe as vmHandsBindCgroup};
|