@reason-machines/cli-linux-arm64 0.2.418 → 0.2.419
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-pn1h0b08.js → connect-cli-k7px2rdj.js} +1 -1
- package/bin/vm-hands/{local-automation-7nc6cgjp.js → local-automation-y36wa5fz.js} +1 -1
- package/bin/vm-hands/{local-capabilities-5f36fr9x.js → local-capabilities-t6fwch4h.js} +1 -1
- package/bin/vm-hands/{local-display-session-zg4dpnf1.js → local-display-session-5cgt72jx.js} +1 -1
- package/bin/vm-hands/local-display-video-3xk3kg9p.js +2 -0
- package/bin/vm-hands/{local-managed-process-gjc8gvgb.js → local-managed-process-bnqnzd8d.js} +1 -1
- package/bin/vm-hands/{managed-runtime-f85h6h7f.js → managed-runtime-wbsp37xw.js} +1 -1
- package/bin/vm-hands/{permissions-bhbnb1bp.js → permissions-vys6xvz7.js} +1 -1
- package/bin/vm-hands/{serve-service-58ea9cwx.js → serve-service-rcvza2vj.js} +1 -1
- package/bin/vm-hands/{status-z9r8nq3y.js → status-5q2w623r.js} +1 -1
- package/bin/vm-hands/version-qgew2890.js +2 -0
- package/bin/vm-hands/{vm-hands-entry-lite-s3cg1dsk.js → vm-hands-entry-lite-03gh7msy.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-nefcet81.js → vm-hands-entry-lite-09sq8090.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-2wzsnnsp.js → vm-hands-entry-lite-2nvhegyc.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-j43nqe8y.js → vm-hands-entry-lite-34z9890s.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-6wt5ja1k.js → vm-hands-entry-lite-706c7f7x.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-2nkj0dpx.js → vm-hands-entry-lite-8h2p4crd.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-stmbekq0.js → vm-hands-entry-lite-ehthgxsx.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-ah6fwqxp.js → vm-hands-entry-lite-ewxc9m4d.js} +1 -1
- package/bin/vm-hands/vm-hands-entry-lite-f1by8av5.js +2 -0
- package/bin/vm-hands/{vm-hands-entry-lite-ppmvge7n.js → vm-hands-entry-lite-p9v963ks.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-hn76pcgk.js → vm-hands-entry-lite-pcvgqrse.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-svvysppj.js → vm-hands-entry-lite-tfra9vjt.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-m8nqnd9j.js → vm-hands-entry-lite-w8ykfw5h.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-w8w451gj.js → vm-hands-entry-lite-wmynasc4.js} +1 -1
- package/bin/vm-hands/vm-hands-entry-lite.js +1 -1
- package/bin/vm-hands/{vm-hands-executor-73b49jkg.js → vm-hands-executor-6357p4cd.js} +1 -1
- package/bin/vm-hands/{vm-hands-op-runner-ef9ts9c6.js → vm-hands-op-runner-7tcv4e0v.js} +1 -1
- package/bin/vm-hands/{vm-hands-runtime-8z6rx1fj.js → vm-hands-runtime-mc2e6wsv.js} +3 -3
- package/package.json +1 -1
- package/bin/vm-hands/local-display-video-remg1c30.js +0 -2
- package/bin/vm-hands/version-p0g28erd.js +0 -2
- package/bin/vm-hands/vm-hands-entry-lite-mmdwr0mf.js +0 -2
package/bin/reason
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{rt,cs,ls,us}from"./vm-hands-entry-lite-
|
|
2
|
+
import{rt,cs,ls,us}from"./vm-hands-entry-lite-03gh7msy.js";import"./vm-hands-entry-lite-ec9jemny.js";import"./vm-hands-entry-lite-z76nfb19.js";import"./vm-hands-entry-lite-50zbqwkv.js";import"./vm-hands-entry-lite-8r31b0ps.js";import"./vm-hands-entry-lite-tfra9vjt.js";import"./vm-hands-entry-lite-8h2p4crd.js";import"./vm-hands-entry-lite-wmynasc4.js";import"./vm-hands-entry-lite-34z9890s.js";import"./vm-hands-entry-lite-beyyy1gz.js";import"./vm-hands-entry-lite-s4bharcb.js";import"./vm-hands-entry-lite-vpz54vwj.js";import"./vm-hands-entry-lite-s5qkb1fk.js";import"./vm-hands-entry-lite-wx4ax7wg.js";import"./vm-hands-entry-lite-bx5zy5bd.js";import"./vm-hands-entry-lite-p9v963ks.js";import"./vm-hands-entry-lite-ewxc9m4d.js";import"./vm-hands-entry-lite-w8ykfw5h.js";import"./vm-hands-entry-lite-nzmkyezg.js";import"./vm-hands-entry-lite-pf5qtbj5.js";import"./vm-hands-entry-lite-21qpxvt8.js";import"./vm-hands-entry-lite-tdgtpx8e.js";import"./vm-hands-entry-lite-hk6trmwa.js";import"./vm-hands-entry-lite-ehthgxsx.js";import"./vm-hands-entry-lite-g4zd2d5n.js";import"./vm-hands-entry-lite-aj139v8j.js";import"./vm-hands-entry-lite-fcvf8md1.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";import"./vm-hands-entry-lite-4vks5phw.js";import"./vm-hands-entry-lite-fbhqfzbq.js";import"./vm-hands-entry-lite-6c67a3jc.js";import"./vm-hands-entry-lite-rfz60hb3.js";export{cs as computerDisconnected,rt as connectionDirectory,ls as connectionReport,us as restartConnection};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{Cn,Os,Is,Ds,Ns,An}from"./vm-hands-entry-lite-
|
|
2
|
+
import{Cn,Os,Is,Ds,Ns,An}from"./vm-hands-entry-lite-p9v963ks.js";import"./vm-hands-entry-lite-ewxc9m4d.js";import"./vm-hands-entry-lite-w8ykfw5h.js";import"./vm-hands-entry-lite-nzmkyezg.js";import"./vm-hands-entry-lite-pf5qtbj5.js";import"./vm-hands-entry-lite-21qpxvt8.js";import"./vm-hands-entry-lite-tdgtpx8e.js";import"./vm-hands-entry-lite-hk6trmwa.js";import"./vm-hands-entry-lite-ehthgxsx.js";import"./vm-hands-entry-lite-g4zd2d5n.js";import"./vm-hands-entry-lite-aj139v8j.js";import"./vm-hands-entry-lite-fcvf8md1.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";import"./vm-hands-entry-lite-4vks5phw.js";import"./vm-hands-entry-lite-fbhqfzbq.js";import"./vm-hands-entry-lite-6c67a3jc.js";import"./vm-hands-entry-lite-rfz60hb3.js";export{Is as ensureLocalBrowser,Cn as localAutomationAvailable,Ds as localBrowserProfile,Os as localUserChromeHost,Ns as runAutomationCallLocally,An as runLocalAutomation};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{Wo,$i,un,Vo,Go,Es,xs,Ko,Jo,ks,Cs,As,Ps}from"./vm-hands-entry-lite-
|
|
2
|
+
import{Wo,$i,un,Vo,Go,Es,xs,Ko,Jo,ks,Cs,As,Ps}from"./vm-hands-entry-lite-8h2p4crd.js";import"./vm-hands-entry-lite-wmynasc4.js";import"./vm-hands-entry-lite-34z9890s.js";import"./vm-hands-entry-lite-beyyy1gz.js";import"./vm-hands-entry-lite-s4bharcb.js";import"./vm-hands-entry-lite-vpz54vwj.js";import"./vm-hands-entry-lite-s5qkb1fk.js";import"./vm-hands-entry-lite-wx4ax7wg.js";import"./vm-hands-entry-lite-bx5zy5bd.js";import"./vm-hands-entry-lite-p9v963ks.js";import"./vm-hands-entry-lite-ewxc9m4d.js";import"./vm-hands-entry-lite-w8ykfw5h.js";import"./vm-hands-entry-lite-nzmkyezg.js";import"./vm-hands-entry-lite-pf5qtbj5.js";import"./vm-hands-entry-lite-21qpxvt8.js";import"./vm-hands-entry-lite-tdgtpx8e.js";import"./vm-hands-entry-lite-hk6trmwa.js";import"./vm-hands-entry-lite-ehthgxsx.js";import"./vm-hands-entry-lite-g4zd2d5n.js";import"./vm-hands-entry-lite-aj139v8j.js";import"./vm-hands-entry-lite-fcvf8md1.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";import"./vm-hands-entry-lite-4vks5phw.js";import"./vm-hands-entry-lite-fbhqfzbq.js";import"./vm-hands-entry-lite-6c67a3jc.js";import"./vm-hands-entry-lite-rfz60hb3.js";import{r}from"./vm-hands-entry-lite-qy9xg6em.js";export{r as LocalCapabilityError,Wo as SHORT_REQUEST_CAPABILITIES,ks as capabilityInventoryForRoots,$i as confinedExecutionShell,Vo as defaultLocalCommandRunner,Cs as deliverLocalHandsEnvironment,Jo as enrolledRootPaths,Ps as executeLocalOperation,xs as grantLocalHandsWorkspaceControl,Es as openHandsWorkspaceGrant,As as rebindLocalHandsControl,Go as runFileCapability,Ko as runTransferCapability,un as spawnCaptured};
|
package/bin/vm-hands/{local-display-session-zg4dpnf1.js → local-display-session-5cgt72jx.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{$t,Ls,G,qe,Bt}from"./vm-hands-entry-lite-
|
|
2
|
+
import{$t,Ls,G,qe,Bt}from"./vm-hands-entry-lite-ewxc9m4d.js";import"./vm-hands-entry-lite-w8ykfw5h.js";import"./vm-hands-entry-lite-nzmkyezg.js";import"./vm-hands-entry-lite-pf5qtbj5.js";import"./vm-hands-entry-lite-21qpxvt8.js";import"./vm-hands-entry-lite-tdgtpx8e.js";import"./vm-hands-entry-lite-hk6trmwa.js";import"./vm-hands-entry-lite-aj139v8j.js";import"./vm-hands-entry-lite-fcvf8md1.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";import"./vm-hands-entry-lite-fbhqfzbq.js";import"./vm-hands-entry-lite-6c67a3jc.js";import"./vm-hands-entry-lite-rfz60hb3.js";export{qe as ensureLinuxDesktop,$t as localDisplayAvailable,Ls as localDisplayReady,G as privateDirectory,Bt as runLocalDisplayStream};
|
|
@@ -0,0 +1,2 @@
|
|
|
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};
|
package/bin/vm-hands/{local-managed-process-gjc8gvgb.js → local-managed-process-bnqnzd8d.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{nt,ur,Ts,Rs}from"./vm-hands-entry-lite-
|
|
2
|
+
import{nt,ur,Ts,Rs}from"./vm-hands-entry-lite-wmynasc4.js";import"./vm-hands-entry-lite-34z9890s.js";import"./vm-hands-entry-lite-beyyy1gz.js";import"./vm-hands-entry-lite-s4bharcb.js";import"./vm-hands-entry-lite-s5qkb1fk.js";import"./vm-hands-entry-lite-wx4ax7wg.js";import"./vm-hands-entry-lite-pf5qtbj5.js";import"./vm-hands-entry-lite-21qpxvt8.js";import"./vm-hands-entry-lite-tdgtpx8e.js";import"./vm-hands-entry-lite-hk6trmwa.js";import"./vm-hands-entry-lite-aj139v8j.js";import"./vm-hands-entry-lite-fcvf8md1.js";import"./vm-hands-entry-lite-jev771b3.js";import"./vm-hands-entry-lite-3krzmhkk.js";import"./vm-hands-entry-lite-4vks5phw.js";import"./vm-hands-entry-lite-fbhqfzbq.js";import"./vm-hands-entry-lite-6c67a3jc.js";import"./vm-hands-entry-lite-rfz60hb3.js";export{nt as ManagedProcessStoppedError,Ts as controlManagedDeviceProcess,Rs as retireManagedDeviceProcess,ur as runManagedDeviceProcess};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{ms,gs,_s,ys,bs,vs,Ss}from"./vm-hands-entry-lite-
|
|
2
|
+
import{ms,gs,_s,ys,bs,vs,Ss}from"./vm-hands-entry-lite-tfra9vjt.js";import"./vm-hands-entry-lite-wx4ax7wg.js";import"./vm-hands-entry-lite-fcvf8md1.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";import"./vm-hands-entry-lite-6c67a3jc.js";import"./vm-hands-entry-lite-rfz60hb3.js";export{bs as acquireManagedRuntimeDirectoryLock,_s as currentManagedRuntimeVersion,Ss as flushManagedRuntimeLifecycleEvents,ys as isManagedRuntimeVersionExecutable,gs as legacyManagedRuntimePaths,ms as managedRuntimePaths,vs as recordManagedRuntimeLifecycle};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{Qo,es,zs,qs}from"./vm-hands-entry-lite-
|
|
2
|
+
import{Qo,es,zs,qs}from"./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{qs as allowMacPermissions,zs as permissionsSummary,es as readMacPermissions,Qo as reasonIdentity};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{zr,Ee,J,Hn,$s,ho,Bs,Xe,Yo,zn,Fs,js,qr,Us,Hs}from"./vm-hands-entry-lite-
|
|
2
|
+
import{zr,Ee,J,Hn,$s,ho,Bs,Xe,Yo,zn,Fs,js,qr,Us,Hs}from"./vm-hands-entry-lite-ehthgxsx.js";import"./vm-hands-entry-lite-g4zd2d5n.js";import"./vm-hands-entry-lite-aj139v8j.js";import"./vm-hands-entry-lite-fcvf8md1.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";import"./vm-hands-entry-lite-6c67a3jc.js";import"./vm-hands-entry-lite-rfz60hb3.js";export{zr as WORKER_SERVICE_ENV,J as WorkerServiceError,ho as connectServiceLabel,Ee as defaultWorkerServiceHost,js as installWorkerService,Xe as installedWorkerService,Bs as isConnectServiceLabel,Hs as removeWorkerService,qr as restartWorkerService,Us as retargetWorkerServiceLogs,Yo as retireLegacyWorkerService,Fs as workerServiceDefinitionCurrent,Hn as workerServiceLauncher,zn as workerServiceProcessRunning,$s as workerServiceRetargetPending};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import"./vm-hands-entry-lite-8r31b0ps.js";import"./vm-hands-entry-lite-fcvf8md1.js";import{g}from"./vm-hands-entry-lite-aj139v8j.js";import"./vm-hands-entry-lite-3krzmhkk.js";import"./vm-hands-entry-lite-rfz60hb3.js";import"./vm-hands-entry-lite-50zbqwkv.js";import{Ht,lt}from"./vm-hands-entry-lite-pf5qtbj5.js";import{w,M,lr,Fe,rt}from"./vm-hands-entry-lite-
|
|
2
|
+
import"./vm-hands-entry-lite-8r31b0ps.js";import"./vm-hands-entry-lite-fcvf8md1.js";import{g}from"./vm-hands-entry-lite-aj139v8j.js";import"./vm-hands-entry-lite-3krzmhkk.js";import"./vm-hands-entry-lite-rfz60hb3.js";import"./vm-hands-entry-lite-50zbqwkv.js";import{Ht,lt}from"./vm-hands-entry-lite-pf5qtbj5.js";import{w,M,lr,Fe,rt}from"./vm-hands-entry-lite-03gh7msy.js";import"./vm-hands-entry-lite-4vks5phw.js";import"./vm-hands-entry-lite-8h2p4crd.js";import"./vm-hands-entry-lite-34z9890s.js";import"./vm-hands-entry-lite-f1by8av5.js";import"./vm-hands-entry-lite-s5qkb1fk.js";import"./vm-hands-entry-lite-vpz54vwj.js";import"./vm-hands-entry-lite-z76nfb19.js";import"./vm-hands-entry-lite-w8ykfw5h.js";import"./vm-hands-entry-lite-jzz73e3f.js";import"./vm-hands-entry-lite-pcvgqrse.js";import"./vm-hands-entry-lite-09sq8090.js";import"./vm-hands-entry-lite-hk6trmwa.js";import"./vm-hands-entry-lite-tfra9vjt.js";import"./vm-hands-entry-lite-g4zd2d5n.js";import"./vm-hands-entry-lite-ehthgxsx.js";import"./vm-hands-entry-lite-bx5zy5bd.js";import"./vm-hands-entry-lite-tdgtpx8e.js";import"./vm-hands-entry-lite-beyyy1gz.js";import"./vm-hands-entry-lite-21qpxvt8.js";import"./vm-hands-entry-lite-wmynasc4.js";import"./vm-hands-entry-lite-fbhqfzbq.js";import"./vm-hands-entry-lite-nzmkyezg.js";import"./vm-hands-entry-lite-ewxc9m4d.js";import"./vm-hands-entry-lite-p9v963ks.js";import"./vm-hands-entry-lite-ec9jemny.js";import"./vm-hands-entry-lite-s4bharcb.js";import"./vm-hands-entry-lite-wx4ax7wg.js";import{a}from"./vm-hands-entry-lite-jev771b3.js";import{t,o,u,i,s,n}from"./vm-hands-entry-lite-avc65bd7.js";import"./vm-hands-entry-lite-6c67a3jc.js";import{readFileSync as me,realpathSync as k,renameSync as ge,unlinkSync as fe,writeFileSync as he}from"fs";import{dirname as ye,join as I}from"path";function h(e){return`claude mcp add --transport http reason ${e}`}function C(e){return`codex mcp add reason --url ${e}
|
|
3
3
|
codex mcp login reason`}var F=h("https://mcp.reasonmachines.com/mcp"),z=C("https://mcp.reasonmachines.com/mcp"),B=`https://claude.ai/settings/connectors?add=custom&url=${encodeURIComponent("https://mcp.reasonmachines.com/mcp")}`,H=`https://cursor.com/install-mcp?name=reason&config=${encodeURIComponent(btoa(JSON.stringify({url:"https://mcp.reasonmachines.com/mcp"})))}`;var b="https://github.com/reason-machines/reason-plugins",X=`Connect a coding agent to Reason over MCP
|
|
4
4
|
|
|
5
5
|
Usage:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{g,go,xe}from"./vm-hands-entry-lite-aj139v8j.js";import{l,Ut,Ge,Dr,Ht,Lr,lt}from"./vm-hands-entry-lite-pf5qtbj5.js";import{wt,or}from"./vm-hands-entry-lite-4vks5phw.js";import{ln}from"./vm-hands-entry-lite-
|
|
2
|
+
import{g,go,xe}from"./vm-hands-entry-lite-aj139v8j.js";import{l,Ut,Ge,Dr,Ht,Lr,lt}from"./vm-hands-entry-lite-pf5qtbj5.js";import{wt,or}from"./vm-hands-entry-lite-4vks5phw.js";import{ln}from"./vm-hands-entry-lite-8h2p4crd.js";import{B,m,te,Ue}from"./vm-hands-entry-lite-34z9890s.js";import{F}from"./vm-hands-entry-lite-w8ykfw5h.js";import{Ro}from"./vm-hands-entry-lite-pcvgqrse.js";import{Ee,Xe,zn,qr}from"./vm-hands-entry-lite-ehthgxsx.js";import{f,v,h}from"./vm-hands-entry-lite-wx4ax7wg.js";import{a}from"./vm-hands-entry-lite-jev771b3.js";import{$o,nn,y,t,k,xt,o,d,Ie,u,i,c,_,is,s,n,on}from"./vm-hands-entry-lite-avc65bd7.js";import{closeSync as Dh,existsSync as Th,mkdirSync as Wh,openSync as Nh,readdirSync as Hh,realpathSync as pe,rmSync as $h}from"fs";import{dirname as Uh,join as J,resolve as Fh}from"path";import{createHash as Pt}from"crypto";import{platform as Ct}from"os";import{join as At}from"path";var It=_("store",[c({version:n(1),store:n("keychain")}),c({version:n(1),store:n("file"),api_key:t().min(1).max(4096)})]),We=(e)=>At(e,"api-key.json");function Ne(e){let r=Pt("sha256").update(`reason-connect-api-key
|
|
3
3
|
${e}`).digest("hex");return new Ge(Ut(),Ct(),r)}function we(e,r=Ne(e)){if(!f(We(e)))return null;let p=It.parse(JSON.parse(h(We(e))));if(p.store==="file")return p.api_key;try{let b=r.loadBinding();return b?new TextDecoder().decode(b):null}catch(b){if(!(b instanceof l))throw b;throw Error("worker_api_key_unreadable")}}import{readdirSync as Gt,renameSync as Fn,rmSync as jn}from"fs";import{join as ee}from"path";import{createHash as Mt}from"crypto";import{platform as Dt}from"os";import{join as N}from"path";function w(e){return{state:N(m(e),"device.json"),control:N(m(e),"control.json"),lock:N(m(e),"lifecycle.lock"),socket:N(m(e),"control.sock"),daemon:N(m(e),"daemon.json"),releaseCheck:N(m(e),"release-check.json"),updateDeferral:N(m(e),"update-deferral.json"),firstHeartbeat:N(m(e),"first-heartbeat.json")}}var rn=i({version:n(1),device_id:t().min(1).max(160),offer:Ie().optional(),enrollment_ms:o().int().nonnegative().max(or).optional()});function z(e,r=!1){v(m(e),r);let p=["local-device.key","local-device.binding","device.json"].filter((b)=>{let R=N(m(e),b);if(!f(R))return!1;return h(R),!0});return e.lifetime==="persistent"&&p.join()==="device.json"?Tt(e):new Dr(m(e))}function Tt(e){return new Ge(Ut(),Dt(),Wt(e))}function Wt(e){let r=Bt(e);return Mt("sha256").update(`reason-worker
|
|
4
4
|
${r?.directory??m(e)}`).digest("hex")}var Nt="keychain-scope.json";var $t=c({version:n(1),directory:t().min(1),devicePublicKey:t().min(1)});function Bt(e){let r=N(m(e),Nt);if(!f(r))return null;let p=$t.safeParse(JSON.parse(h(r))),b=w(e).state;if(!p.success||!f(b))return null;return JSON.parse(h(b))?.devicePublicKey===p.data.devicePublicKey?p.data:null}function M(e){if(!f(m(e)))return null;let r=Lr(w(e).state,{proofStore:z(e),repair:!1}),p=r!==null&&go(e.apiOrigin,r.apiOrigin),b=p?[te(e),te({...e,apiOrigin:r.apiOrigin})]:[te(e)];if(r&&(!b.includes(r.worker?.configDigest??"")||r.worker.lifetime!==e.lifetime||r.apiOrigin!==e.apiOrigin&&!p||r.roots.length>32||r.roots[0]?.path!==e.workspaceRoot||r.handsSlots!==e.slots))throw Error("worker_config_binding_mismatch");return r}var Ft=c({version:n(1),drained:d(),revoked:d()});function H(e){let r=w(e).control;return f(r)?Ft.parse(JSON.parse(h(r))):{version:1,drained:!1,revoked:!1}}var qt=c({read:d(),write:d(),execute:d(),discover_environment:d(),expose_mcp:n(!1)}),zt=c({version:n(1),organization_id:t().min(1).max(160),enrollment_ticket:t().min(1).max(4096),code_verifier:t().regex(/^[A-Za-z0-9._~-]{43,128}$/),root_fingerprint_key:t().regex(/^[a-f0-9]{64}$/),root:c({path_fingerprint:t().regex(/^[a-f0-9]{64}$/),permissions:qt,execution_mode:s(["confined","host"]).default("confined")}),folders:u(c({path_fingerprint:t().regex(/^[a-f0-9]{64}$/)})).min(1).max(31).optional()}),_n=i({device_id:t().min(1).max(160),organization_id:t().min(1).max(160),auth_scheme:n("p256"),protocol_version:n(2),roots:u(i({id:t().min(1),label:t(),path_fingerprint:t()})).min(1).max(32),headless:i({lifecycle:s(["persistent","ephemeral"]),expires_at:y.datetime({offset:!0})}),first_heartbeat:Ie().optional()});var Nn=c({version:n(1),install_id:k(),fingerprint_key:t().regex(/^[a-f0-9]{64}$/)}),Hn=i({enrollment_ticket:t().min(1).max(4096),expires_at:y.datetime({offset:!0}),device_kind:n("headless"),lifecycle:s(["persistent","ephemeral"]),device_expires_at:y.datetime({offset:!0})});var $n=i({credentialKind:s(["oauth","api_key"]).optional(),apiOrigin:xt(),clientId:t(),accessToken:t().min(1).max(32768),refreshToken:t().max(32768),expiresAt:y.datetime({offset:!0}),scopes:u(t().max(128)).max(128),orgId:t().min(1).max(160)});var je=8;var Yt=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,_e=(e)=>ee(m(e),"workspaces"),Xt="account.json",Zt=(e)=>f(ee(e,Xt));function ve(e){let r;try{r=Gt(_e(e))}catch{return[]}return r.filter((p)=>Yt.test(p)).sort().map((p)=>{let b=ee(_e(e),p),R=ee(b,"worker.json"),S=null;try{let P=B.safeParse(JSON.parse(h(R)));if(P.success&&P.data.stateDirectory===b)S=P.data}catch{}return{organizationId:p,directory:b,configPath:R,config:S,account:Zt(b)}})}var Qt=(e)=>ee(_e(e),"listed.json");function er(e){try{let r=JSON.parse(h(Qt(e))),p=r.names&&typeof r.names==="object"&&!Array.isArray(r.names)?Object.fromEntries(Object.entries(r.names).filter((b)=>typeof b[1]==="string")):{};return{listed:r.listed===!0,reason:r.reason==="sign_in"?"sign_in":null,blocked:Array.isArray(r.blocked)?r.blocked.filter((b)=>typeof b==="string"):[],names:p}}catch{return null}}function qe(e,r){let p=ve(e),b=p.filter((C)=>C.account),R=p.filter((C)=>!C.account),S=er(e),P=S&&!S.listed?S.reason:null,E=P||R.length===0&&S&&!S.listed?[]:R;if(b.length===0&&E.length===0&&(P||S&&!S.listed))return{workspaces:null,off:P};return{off:P,workspaces:[...b,...E].map(({organizationId:C,config:L,account:x})=>{let A=!1,D=null,T=!1,he=null;try{A=L?H(L).revoked:!1,D=L&&!A?M(L):null;let Te=L?lt(w(L).daemon):null;T=r&&!!D&&Te?.state==="connected",he=T?Ht(Te,D):null}catch{}return{...he?{permission_recovery:he}:{},organization_id:C,device_id:D?.deviceId??null,name:S?.names?.[C]??null,root:D?.roots[0]?{id:D.roots[0].id,permissions:D.roots[0].permissions}:null,state:A?"removed":T?"connected":"not_running",blocked:!x&&!A&&!T&&(S?.blocked.includes(C)??!1),...x?{account:!0}:{}}})}}import{readFileSync as rr}from"fs";function lr(e){try{let r=JSON.parse(rr(`${e}.keep-awake.json`,"utf8"));return r!==null&&typeof r==="object"&&"version"in r&&r.version===1&&"enabled"in r&&r.enabled===!0?"battery_and_ac":void 0}catch(r){return r.code==="ENOENT"?"battery_and_ac":void 0}}import{chmodSync as Ni,lstatSync as Ze,mkdtempSync as Hi,realpathSync as nr,rmdirSync as $i,rmSync as Bi,unlinkSync as Ui}from"fs";import{createConnection as ir,createServer as ji}from"net";import{basename as Ve,dirname as Je,join as oe}from"path";var ar=s(["status","drain","resume","stop","reload_roots"]),sr=c({version:n(1),instanceId:t(),deviceId:t(),phase:s(["starting","running","reconnecting","stopping"]),drained:d(),activeClaims:o().int().nonnegative(),activeSessions:o().int().nonnegative().optional(),executionEligible:d(),supportedOperations:u(s(wt)).max(wt.length).optional(),capabilityReadiness:is(s(wt),d()).optional(),lastHeartbeat:t().nullable(),expiresAt:t()}),Gi=c({nonce:t(),action:ar}),cr=i({nonce:k()}),dr=c({version:n(1),nonce:k(),socketPath:t().max(100)});function ur(e){return oe(w(e).lock,"control.json")}function Qe(e){return v(w(e).lock),cr.parse(JSON.parse(h(oe(w(e).lock,"owner.json"))))}function Ye(e){if(!f(e))return!1;let r=Ze(e);if(!r.isSocket()||r.uid!==process.getuid?.()||(r.mode&63)!==0)throw Error("worker_control_socket_not_private");return!0}function et(e,r){let p=ur(e);if(!f(p)){let S=w(e).socket;if(!f(S)||!Ze(S).isSocket())return null;return Ye(S)?S:null}let b=dr.parse(JSON.parse(h(p)));if(b.nonce!==r)throw Error("worker_instance_changed");if(process.platform==="win32"){if(!fr.test(b.socketPath))throw Error("worker_control_endpoint_invalid");return b.socketPath}let R=Je(b.socketPath);if(Je(R)!==nr("/tmp")||!/^(?:reason|ara)-worker-[A-Za-z0-9]{6}$/.test(Ve(R))||Ve(b.socketPath)!=="control.sock"||Buffer.byteLength(b.socketPath)>100)throw Error("worker_control_endpoint_invalid");if(!f(R))return null;return v(R),Ye(b.socketPath)?b.socketPath:null}var fr=/^\\\\\.\\pipe\\reason-worker-[0-9a-f-]{36}$/;function mr(e,r){try{let p=JSON.parse(h(oe(w(e).lock,"owner.json"))),b=p&&typeof p==="object"?p[r]:void 0;return typeof b==="string"?b:null}catch{return null}}function tt(e){return mr(e,"runtime_version")}function ot(e,r){if(r)return r.message==="worker_control_timeout"?"socket_timeout":"bad_reply";try{if(!f(oe(w(e).lock,"owner.json")))return"no_lock";return et(e,Qe(e).nonce)?"socket_refused":"no_socket"}catch{return"bad_reply"}}var Yi=c({instance:t().nullable(),since:o().int().nonnegative()});async function G(e,r){let p=w(e);if(!f(oe(p.lock,"owner.json")))return null;let b=Qe(e),R=et(e,b.nonce);if(!R)return null;return new Promise((S,P)=>{let E=ir(R),C="",L=!1,x=(A,D)=>{if(L)return;if(L=!0,E.destroy(),D)P(D);else S(A)};E.setTimeout(2000,()=>E.destroy(Error("worker_control_timeout"))),E.on("connect",()=>E.write(JSON.stringify({nonce:b.nonce,action:r})+`
|
|
5
5
|
`)),E.on("data",(A)=>{if(C+=A.toString(),Buffer.byteLength(C)>16384)E.destroy(Error("worker_control_oversize"))}),E.on("error",(A)=>{if("code"in A&&["ECONNREFUSED","ENOENT"].includes(String(A.code)))x(null);else x(null,A.message==="worker_control_timeout"?A:Error("worker_control_unavailable"))}),E.on("end",()=>{try{let A=sr.parse(JSON.parse(C));if(A.instanceId!==b.nonce)throw Error("worker_instance_changed");x(A)}catch{x(null,Error("worker_control_invalid_response"))}}),E.once("close",()=>x(null,Error("worker_control_unavailable")))})}import{realpathSync as wr}from"fs";import{constants as Se}from"fs";import{open as pr}from"fs/promises";var oa={platform:process.platform,home:a,async openFile(e){let r=await pr(e,Se.O_RDONLY|Se.O_NOFOLLOW|Se.O_NONBLOCK);return{isFile:async()=>(await r.stat()).isFile(),close:()=>r.close()}}};var Ha=Ro(wr(process.execPath));var ms=Buffer.from([0,255,3,4]);import{execFile as Zr}from"child_process";import{promisify as Qr}from"util";var vr=new RegExp("^/media/pr-screenshots/([0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/([0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/([a-z0-9][a-z0-9._-]*)\\.(png|jpe?g|gif|webp|webm|mp4)$","i");var Sr=new Set(["png","jpg","jpeg","gif","webp"]),Rr=new Set(["webm","mp4"]);function Er(e){if(!e)return null;try{return new URL(e).origin}catch{return null}}function at(e,r){let p;try{p=new URL(e)}catch{return null}let b=Er(r),R=p.hostname==="ara.so"||p.hostname.endsWith(".ara.so")||p.hostname==="reasonmachines.ai"||p.hostname.endsWith(".reasonmachines.ai")||p.hostname==="reasonmachines.com"||p.hostname.endsWith(".reasonmachines.com");if(p.protocol!=="https:"||!R&&p.origin!==b||p.username||p.password||p.port||p.search||p.hash)return null;let S=vr.exec(p.pathname);if(!S)return null;let P=S[1]?.toLowerCase(),E=S[2]?.toLowerCase(),C=S[3]?.toLowerCase(),L=S[4]?.toLowerCase();if(!P||!E||!C||!L)return null;let x=Sr.has(L)?"image":Rr.has(L)?"video":null;if(!x)return null;let A=/^(before|after)[\s:_-]+/.exec(C),D=p.pathname.replace(/^\/media\//,"");return{url:p.toString(),storagePath:D,runId:P,artifactId:E,fileName:`${C}.${L}`,kind:x,phase:A?.[1]==="before"||A?.[1]==="after"?A[1]:null}}var Pr=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,st=(e)=>Boolean(e&&typeof e==="object"&&!Array.isArray(e)),K=()=>{throw Error("cloud_browser_media_request_invalid")};function Pe(e){if(!st(e)||Object.keys(e).some((S)=>!["runId","configuredMediaOrigin","media"].includes(S))||typeof e.runId!=="string"||!Pr.test(e.runId)||typeof e.configuredMediaOrigin!=="string"||e.configuredMediaOrigin.length>2048||!Array.isArray(e.media)||e.media.length<1||e.media.length>8)return K();let r;try{r=new URL(e.configuredMediaOrigin)}catch{return K()}if(r.protocol!=="https:"||r.username||r.password||r.port||!Ue(r.origin,{mode:"public_web"}).allowed)return K();let p=e.runId.toLowerCase(),b=new Set,R=e.media.map((S)=>{if(!st(S)||Object.keys(S).some((E)=>!["url","sourceUrl","kind"].includes(E))||typeof S.url!=="string"||S.url.length>2048||typeof S.sourceUrl!=="string"||S.sourceUrl.length>8192||!["image","video"].includes(String(S.kind)))return K();let P=at(S.url,r.origin);if(!P||new URL(P.url).origin!==r.origin||P.runId!==p||P.kind!==S.kind||P.url!==S.url||b.has(S.url))return K();if(b.add(S.url),S.sourceUrl!==S.url){let E;try{E=new URL(S.sourceUrl)}catch{return K()}let C=/^\/(?:[a-f0-9]{40}|[a-f0-9]{64})\/([a-f0-9]+)$/.exec(E.pathname)?.[1];if(S.kind!=="image"||E.origin!=="https://camo.githubusercontent.com"||E.username||E.password||E.search||E.hash||!C||C.length%2!==0||Buffer.from(C,"hex").toString("utf8")!==S.url)return K()}return{url:S.url,sourceUrl:S.sourceUrl,kind:S.kind}});return{runId:e.runId,configuredMediaOrigin:r.origin,media:R}}var I=t().uuid(),X=t().regex(/^[a-f0-9]{64}$/),V=y.datetime({precision:3}),Ce=t().regex(/^[a-zA-Z0-9_-]{1,160}$/),ut=t().max(2048).regex(/^https:\/\/github\.com\/[A-Za-z0-9_-]+\/[A-Za-z0-9_.-]+\/pull\/[1-9][0-9]*$/).refine((e)=>![".",".."].includes(e.split("/")[4])),U=i({kind:n("primary_mac"),version:n(1),organizationId:Ce,userId:Ce,sessionId:Ce,runId:I,deviceId:I,rootId:I,rootRevision:t().min(1).max(64),binding:s(["workspace_source","mcp_control"]),targetRevision:o().int().nonnegative(),generation:I,profile:t().regex(/^(Default|Profile [0-9]+)$/),extensionInstanceId:t().min(1).max(1024)}).strict().refine((e)=>e.binding!=="workspace_source"||e.targetRevision===0),Cr=on().transform((e,r)=>{try{return ln(e)}catch{return r.addIssue({code:"custom",message:"proof_visual_contract_invalid"}),$o}}),ue=i({version:n(1),owner:U,contextId:I,preparedAt:V,expiresAt:V,prUrl:ut,headSha:t().regex(/^[a-f0-9]{40}$/),skillDigest:X,evidenceKind:s(["image","video"]),visualPlan:Cr.optional(),uploadOrigin:t().url().refine((e)=>{let r=new URL(e);return r.protocol==="https:"&&r.origin===e&&!r.username&&!r.password}).optional()}).strict().refine((e)=>Date.parse(e.expiresAt)>Date.parse(e.preparedAt)&&Date.parse(e.expiresAt)-Date.parse(e.preparedAt)<=300000),Ar=i({version:n(1),producer:n("primary_mac"),context:ue,captureId:I,operationId:I,attemptId:I,tabId:o().int().positive(),startedAt:V,finishedAt:V,sha256:X,media:_("contentType",[i({contentType:n("image/png"),sizeBytes:o().int().min(24).max(8388608),width:o().int().min(1).max(4096),height:o().int().min(1).max(4096)}).strict(),i({contentType:n("video/webm"),sizeBytes:o().int().min(128).max(10485760),durationSeconds:o().min(0.05).max(15),frameCount:o().int().min(1).max(450),receivedFrameCount:o().int().min(1).max(2000)}).strict()])}).strict().superRefine((e,r)=>{let p=Date.parse(e.startedAt),b=Date.parse(e.finishedAt);if(p<Date.parse(e.context.preparedAt)||b<p||b>Date.parse(e.context.expiresAt)||b-p>30000||e.media.contentType==="video/webm"&&(e.media.receivedFrameCount<e.media.frameCount||Math.abs((b-p)/1000-e.media.durationSeconds)>0.1))r.addIssue({code:"custom",message:"mac_pr_proof_capture_chronology_invalid"})}),dc=_("action",[i({action:n("screenshot"),context_id:I,tab_id:o().int().positive()}).strict(),i({action:n("start_video"),context_id:I,tab_id:o().int().positive(),seconds:o().int().min(1).max(15)}).strict(),i({action:n("stop_video"),recording_operation_id:I}).strict()]),fe=i({login:t().regex(/^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?$/),id:t().regex(/^[1-9][0-9]{0,19}$/).nullable()}).strict(),ce=t().regex(/^[1-9][0-9]{0,19}$/),le=i({version:n(1),owner:U,expectedActorId:ce.nullable(),repositoryId:ce,repositoryFullName:t().max(200).regex(/^[A-Za-z0-9_-]+\/[A-Za-z0-9_.-]+$/).refine((e)=>![".",".."].includes(e.split("/")[1]))}).strict(),Ir=["browser_unavailable","github_page_unavailable","identity_check_failed","operation_incomplete","attachment_unavailable"],xr=_("status",[le.extend({status:n("ready"),observedActor:fe,checkedAt:V}),le.extend({status:n("not_ready"),reason:s(["authentication_required","identity_mismatch","authority_lost","unavailable"]),cause:s(Ir).optional()})]).refine((e)=>e.status!=="ready"||e.expectedActorId===null||e.observedActor.id===e.expectedActorId),Y=i({version:n(1),owner:U,expectedActorId:ce.nullable(),authenticatedActor:fe,attemptId:I,captureId:I,prUrl:ut,repositoryId:ce,headSha:t().regex(/^[a-f0-9]{40}$/),sha256:X,sizeBytes:o().int().min(128).max(10485760),contentType:n("video/webm")}).strict(),ft=t().regex(/^https:\/\/github\.com\/user-attachments\/assets\/[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/),Or=_("status",[Y.extend({status:n("not_attempted"),reason:s(["authentication_required","attachment_unavailable","identity_mismatch","capture_invalid","authority_lost"])}),Y.extend({status:n("uncertain"),reason:n("upload_outcome_unknown")}),Y.extend({status:n("uploaded"),observedActor:fe,nativeUrl:ft,uploadedAt:V})]).refine((e)=>(e.expectedActorId===null||e.authenticatedActor.id===e.expectedActorId)&&(e.status!=="uploaded"||e.observedActor.id===e.authenticatedActor.id&&e.observedActor.login===e.authenticatedActor.login)),de=Y.extend({nativeUrl:ft,observedActor:fe,bodySha256:X}),Mr=_("status",[de.extend({status:n("incomplete"),reason:s(["authentication_required","identity_mismatch","playback_unverified","authority_lost"])}),de.extend({status:n("verified"),sourceSha256:X,width:o().int().min(1).max(4096),height:o().int().min(1).max(4096),durationSeconds:o().positive().max(30),advancedSeconds:o().min(0.05).max(10),advancedFrames:o().int().positive(),playbackRestored:n(!0),verifiedAt:V})]).refine((e)=>(e.expectedActorId===null||e.authenticatedActor.id===e.expectedActorId)&&e.observedActor.id===e.authenticatedActor.id&&e.observedActor.login===e.authenticatedActor.login&&(e.status!=="verified"||e.sourceSha256===e.sha256)),Tr=on().transform((e,r)=>{try{let p=Pe(e);if(p.media.some((b)=>b.kind!=="image"))throw Error();return p}catch{return r.addIssue({code:"custom",message:"proof_media_request_invalid"}),$o}}),Wr=_("action",[i({action:n("auth_check"),input:le}).strict(),i({action:n("prepare"),context:ue}).strict(),i({action:n("capture_png"),owner:U,contextId:I,tabId:o().int().positive()}).strict(),i({action:n("start_video"),owner:U,contextId:I,tabId:o().int().positive(),seconds:o().int().min(1).max(15)}).strict(),i({action:n("inspect_capture"),owner:U,captureId:I}).strict(),i({action:n("publish_video"),input:Y}).strict(),i({action:n("verify_png_media"),owner:U,media:Tr}).strict().refine((e)=>e.media.runId===e.owner.runId),i({action:n("verify_saved_media"),input:de}).strict(),i({action:n("publish_png"),owner:U,attemptId:I,captureId:I,sha256:X,sizeBytes:o().int().min(24).max(8388608),storagePath:t().max(512),uploadUrl:t().url().max(8192)}).strict()]);var Nr=i({requestId:I,command:Wr}).strict();var Hr={type:"object",required:["action"],properties:{action:{type:"string",enum:["screenshot","start_video","stop_video"]},context_id:{type:"string",format:"uuid"},tab_id:{type:"integer",minimum:1},seconds:{type:"integer",minimum:1,maximum:15},recording_operation_id:{type:"string",format:"uuid"}},additionalProperties:!1},ct={type:"string",format:"uuid",description:"capture_context_id from tools.pr.prepareProof."},dt={type:"integer",minimum:1,description:"An already-owned tab's id."},uc={...Hr,oneOf:[{type:"object",required:["action","context_id","tab_id"],additionalProperties:!1,properties:{action:{type:"string",const:"screenshot"},context_id:ct,tab_id:dt}},{type:"object",required:["action","context_id","tab_id","seconds"],additionalProperties:!1,properties:{action:{type:"string",const:"start_video"},context_id:ct,tab_id:dt,seconds:{type:"integer",minimum:1,maximum:15}}},{type:"object",required:["action","recording_operation_id"],additionalProperties:!1,properties:{action:{type:"string",const:"stop_video"},recording_operation_id:{type:"string",format:"uuid",description:"The recording_operation_id start_video returned."}}}]};var gc=i({operationId:t().uuid(),attemptId:t().uuid(),contextId:t().uuid(),tabId:o().int().positive()}).strict();var $r=String.raw`async (media) => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{Ye,mt}from"./vm-hands-entry-lite-jzz73e3f.js";import{_t}from"./vm-hands-entry-lite-
|
|
2
|
+
import{Ye,mt}from"./vm-hands-entry-lite-jzz73e3f.js";import{_t}from"./vm-hands-entry-lite-f1by8av5.js";import{Po,le,Xr,gt,To}from"./vm-hands-entry-lite-pcvgqrse.js";import{E}from"./vm-hands-entry-lite-dk79tnax.js";import{a,tr}from"./vm-hands-entry-lite-jev771b3.js";import{spawnSync as H}from"child_process";import{dirname as w}from"path";import{spawn as A}from"child_process";import{accessSync as _,constants as v}from"fs";import{basename as C,join as O}from"path";var l=null;function S(e){if(l===e)l=null;if(e.exitCode===null&&e.signalCode===null)e.kill("SIGTERM")}var Jr=(e,t)=>{if(l)S(l);let s=O(e,Po);try{_(s,v.X_OK)}catch{return()=>{}}let n;try{n=A(s,["--app",e,"--name",C(e,".app"),"--permission",t==="screen"?"screen_recording":"accessibility"],{detached:!0,stdio:"ignore"})}catch{return()=>{}}return n.on("error",()=>{if(l===n)l=null}),n.once("exit",()=>{if(l===n)l=null}),n.unref(),l=n,()=>S(n)};import{chmodSync as ne,existsSync as se,mkdirSync as re,readFileSync as D,realpathSync as ie,renameSync as oe,statSync as j,writeFileSync as ae}from"fs";import{dirname as de,isAbsolute as G,join as N,resolve as T,sep as b}from"path";function F(e=a()){return N(tr(e),"reason","protected-path-grants.json")}var f=null;function L(e){let t=JSON.parse(e);if(!Array.isArray(t?.grants))return[];return t.grants.flatMap((s)=>{let n=s;return n&&typeof n.path==="string"&&G(n.path)&&(n.kind==="file"||n.kind==="folder")&&typeof n.grantedAt==="number"?[{path:n.path,kind:n.kind,grantedAt:n.grantedAt}]:[]})}function y(e=F()){try{let{mtimeMs:t}=j(e);if(f&&f.file===e&&f.mtimeMs===t)return f.grants;let s=L(D(e,"utf8"));return f={file:e,mtimeMs:t,grants:s},s}catch{return[]}}function W(e,t){return e.kind==="file"?t===e.path:t===e.path||t.startsWith(`${e.path}${b}`)}function U(e,t){let s=T(e);return y(t).some((n)=>W(n,s))}function yo(e,t){return E(e)&&!U(e,t)}function wo(e,t,s){let n=t?"file-read* file-write*":"file-read*";return y(s).filter((r)=>r.path===e||r.path.startsWith(`${e}${b}`)).map((r)=>`(allow ${n} (${r.kind==="file"?"literal":"subpath"} ${JSON.stringify(r.path)}))`)}var P="x-apple.systempreferences:com.apple.preference.security",J="curl -fsSL https://reasonmachines.com/install.sh | bash",q=180000,B=2000;var k={screen:{label:"Screen & System Audio Recording",purpose:"desktop video, computer-use screenshots",level:"required",pane:`${P}?Privacy_ScreenCapture`},accessibility:{label:"Accessibility",purpose:"computer-use clicks and typing, desktop input",level:"required",pane:`${P}?Privacy_Accessibility`},disk:{label:"Full Disk Access",purpose:"Sessions in Desktop, Documents, Downloads, iCloud Drive and Mail",level:"recommended",pane:`${P}?Privacy_AllFiles`}};function R(e){return e.executable}function K(e,t){if(e==="computer_use_identity_missing")return`Reason's background identity is not installed (${e}); reinstall Reason: ${J}`;if(e==="computer_use_identity_outdated")return`Reason's background identity is outdated (${Xr(t)??"unknown"}; this CLI is ${_t}) (${e}); \`reason update\` installs this release's`;return`Reason's background identity cannot run computer use for this CLI (${e}); run the installed \`reason\``}function Qo(e=a()){let t=gt(e);if(t.length>0)return{state:"ready",path:w(w(w(t[0]))),prefix:t};let s=To(t,e)??"computer_use_identity_unavailable";return{state:s,path:le(e),detail:K(s,e)}}function V(){return{identity:()=>Qo(),grants:(e)=>Ye(e),request:(e,t)=>mt(e,t),worker:async()=>(await import("./status-5q2w623r.js")).connectionMacState(),open:(e)=>{H("/usr/bin/open",e,{stdio:"ignore",timeout:1e4})},tile:Jr,restartConnection:async()=>(await import("./connect-cli-k7px2rdj.js")).restartConnection(),sleep:(e)=>new Promise((t)=>setTimeout(t,e)),now:()=>Date.now()}}function M(e,t,s){if(e.state!=="ready"||!t)return"unknown";return t[s]?"granted":"missing"}async function es(e){let t=e.identity(),s=t.state==="ready"?await e.grants(t.prefix):null,n=await e.worker(),r=n?R(n):null,i=!r||n?.full_disk_access==="unknown"?"unknown":n?.full_disk_access==="granted"?"granted":"missing",c=(u,d,o)=>{let{label:p,purpose:h,level:m}=k[u];return{id:u,label:p,purpose:h,level:m,state:d,holder:o}};return{identity:{state:t.state,path:t.path,detail:t.state==="ready"?null:t.detail},worker_detail:r?null:"Full Disk Access is read from this computer's running worker; `reason connect` starts it.",permissions:[c("screen",M(t,s,"screen"),t.path),c("accessibility",M(t,s,"accessibility"),t.path),c("disk",i,r)]}}function zs(e){let t=e.identity.state==="ready"?null:e.identity.state,s=e.permissions.filter((i)=>i.state==="granted").length,n=[...t?[t]:[],...e.permissions.filter((i)=>i.state!=="granted"&&!(t&&i.id!=="disk")).map((i)=>`${i.label} ${i.state}`)],r=!t&&e.permissions.some((i)=>i.state==="missing");return`Permissions: ${s} of ${e.permissions.length}${n.length>0?` (${n.join(", ")})`:""}`+(r?" \u2014 reason permissions allow":n.length>0?" \u2014 reason permissions":"")}async function x(e,t){let s=t.now()+q;for(;;){if(await e())return!0;if(t.now()>=s)return!1;await t.sleep(B)}}async function qs(e,t){let s=t.host??V(),{io:n}=t,r=await es(s),i=r.permissions.filter((o)=>e.includes(o.id)&&o.state!=="granted");if(i.length===0)return n.stdout.write(`Reason permissions: ${e.map((o)=>k[o].label).join(", ")} already allowed.
|
|
3
3
|
`),0;let c=!1,u=!1,d=s.identity();for(let o of i){let{label:p,pane:h}=k[o.id];if(o.id!=="disk"){if(d.state!=="ready"){if(!c)n.stderr.write(`Reason permissions: ${d.detail}
|
|
4
4
|
`);c=!0;continue}let g=o.id;await s.request(d.prefix,g),s.open([h]);let I=s.tile(d.path,g);if(n.stdout.write(`Allow Reason in System Settings > Privacy & Security > ${p}.
|
|
5
5
|
`),!t.wait)continue;if(n.stdout.write(`Waiting for it (Ctrl-C to stop)\u2026
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{r}from"./vm-hands-entry-lite-qy9xg6em.js";import{readdirSync as b,readFileSync as P}from"fs";import{userInfo as k}from"os";var ar="--vm-hands-op-runner-kind=person",cr="--vm-hands-op-runner-kind=surface",Ct="--vm-hands-surface-uid=",At="--vm-hands-surface-dir=",Pt=new Set(["automation.call.v1","display.stream.v1","preview.serve.v1"]);function R(t){let c=new Set([t]),l=[];try{l=b("/proc")}catch{}for(let o of l){if(!/^\d+$/.test(o))continue;try{let d=P(`/proc/${o}/stat`,"utf8");if(Number(d.slice(d.lastIndexOf(")")+2).split(" ")[3])===t)c.add(Number(o))}catch{}}for(let o of c)try{process.kill(o,"SIGKILL")}catch{}}var A=(t)=>{let c=globalThis.Bun;if(!c)throw new r("pty_unavailable","Reason terminals require the Bun runtime.");let l=c.spawn({cmd:[t.shell,...t.args],cwd:t.cwd,env:{...t.environment,TERM:"xterm-256color"},terminal:{cols:t.cols,rows:t.rows,data:(i,s)=>t.onData(s)}}),o=l.terminal,d=()=>{R(l.pid);try{o?.close()}catch{}};if(!o)throw d(),new r("pty_unavailable","Reason could not allocate a pseudo-terminal.");return{write:(i)=>o.write(i),resize:(i,s)=>o.resize(i,s),kill:d,exited:l.exited.then((i)=>typeof i==="number"?i:null,()=>null)}};function x(){let t=(()=>{try{return k().username}catch{return}})();return{PATH:process.env.PATH,HOME:process.env.HOME,SHELL:process.env.SHELL,LANG:"C.UTF-8",...t?{USER:t,LOGNAME:t}:{}}}async function E(t){let[{localAutomationAvailable:c},{localDisplayReady:l},{localDisplayVideoAvailable:o},{probeWorkerPreview:d},y]=await Promise.all([import("./local-automation-
|
|
2
|
+
import{r}from"./vm-hands-entry-lite-qy9xg6em.js";import{readdirSync as b,readFileSync as P}from"fs";import{userInfo as k}from"os";var ar="--vm-hands-op-runner-kind=person",cr="--vm-hands-op-runner-kind=surface",Ct="--vm-hands-surface-uid=",At="--vm-hands-surface-dir=",Pt=new Set(["automation.call.v1","display.stream.v1","preview.serve.v1"]);function R(t){let c=new Set([t]),l=[];try{l=b("/proc")}catch{}for(let o of l){if(!/^\d+$/.test(o))continue;try{let d=P(`/proc/${o}/stat`,"utf8");if(Number(d.slice(d.lastIndexOf(")")+2).split(" ")[3])===t)c.add(Number(o))}catch{}}for(let o of c)try{process.kill(o,"SIGKILL")}catch{}}var A=(t)=>{let c=globalThis.Bun;if(!c)throw new r("pty_unavailable","Reason terminals require the Bun runtime.");let l=c.spawn({cmd:[t.shell,...t.args],cwd:t.cwd,env:{...t.environment,TERM:"xterm-256color"},terminal:{cols:t.cols,rows:t.rows,data:(i,s)=>t.onData(s)}}),o=l.terminal,d=()=>{R(l.pid);try{o?.close()}catch{}};if(!o)throw d(),new r("pty_unavailable","Reason could not allocate a pseudo-terminal.");return{write:(i)=>o.write(i),resize:(i,s)=>o.resize(i,s),kill:d,exited:l.exited.then((i)=>typeof i==="number"?i:null,()=>null)}};function x(){let t=(()=>{try{return k().username}catch{return}})();return{PATH:process.env.PATH,HOME:process.env.HOME,SHELL:process.env.SHELL,LANG:"C.UTF-8",...t?{USER:t,LOGNAME:t}:{}}}async function E(t){let[{localAutomationAvailable:c},{localDisplayReady:l},{localDisplayVideoAvailable:o},{probeWorkerPreview:d},y]=await Promise.all([import("./local-automation-y36wa5fz.js"),import("./local-display-session-5cgt72jx.js"),import("./local-display-video-3xk3kg9p.js"),import("./worker-preview-readiness-w62n91kr.js"),import("fs")]),i=AbortSignal.timeout(15000),s=null;try{y.mkdirSync(t,{recursive:!0,mode:448}),s=y.mkdtempSync(`${t}/probe-`);let[g,p,m]=await Promise.all([Promise.resolve().then(()=>c()).catch(()=>!1),l().catch(()=>!1),d(s,i).catch(()=>!1)]);return{t:"readiness",display_video:p&&await o().catch(()=>!1),lanes:{"automation.call.v1":g,"display.stream.v1":p,"preview.serve.v1":m,"tunnel.open":m,"tunnel.close":m}}}finally{if(s)y.rmSync(s,{recursive:!0,force:!0})}}async function as(){let[{executeLocalOperation:t,spawnCaptured:c},{runLocalPtySession:l},{configureDesktopAccount:o,desktopAccount:d},{configureWorkerSandbox:y}]=await Promise.all([import("./local-capabilities-t6fwch4h.js"),import("./local-pty-session-rpk05ap5.js"),import("./desktop-account-6sjrxy69.js"),import("./worker-sandbox-2r5nseff.js")]);y();let i=process.argv.includes(ar),s=process.argv.includes(cr),g=(a,e,u)=>c(a,e[0]==="-lic"?["-lc",...e.slice(1)]:e,u),p=(process.geteuid?.()??0)!==0;if(s){p=!1;let a=process.argv.find((e)=>e.startsWith(Ct))?.slice(Ct.length);if((process.geteuid?.()??-1)===0&&a)try{p=o({value:a})!==null&&d()!==null}catch{p=!1}}let m=new Map,v=new Map,f=(a)=>{try{process.send?.(a)}catch{}};if(process.on("message",(a)=>{let e=a;if(e?.t==="cancel"){m.get(e.id)?.abort();return}if(e?.t==="control"){let n=v.get(e.id);if(s&&n&&e.control&&typeof e.control.kind==="string")import("./local-managed-process-bnqnzd8d.js").then(({controlManagedDeviceProcess:_})=>_(n,{kind:e.control.kind,payload:e.control.payload??{}})).catch(()=>!1);return}if(e?.t==="retire"){if(s&&typeof e.operation_id==="string"&&typeof e.status==="string")import("./local-managed-process-bnqnzd8d.js").then(({retireManagedDeviceProcess:n})=>n(e.operation_id,e.status)).catch(()=>!1);return}if(e?.t!=="op")return;if(!p){f({t:"done",id:e.id,completion:{status:"failed",error_code:"vm_hands_payload_account_unavailable"}});return}let u=e.claim.capability;if(u==="pty.start"&&!i){f({t:"done",id:e.id,completion:{status:"failed",error_code:"capability_not_granted"}});return}if(Pt.has(u)!==s){f({t:"done",id:e.id,completion:{status:"failed",error_code:"capability_not_granted"}});return}let w=new AbortController;m.set(e.id,w),v.set(e.id,e.claim);let S=u==="pty.start"?{runPtySession:(n)=>l(n,{spawnPty:A,environment:x(),loadProxy:()=>null})}:{worker:e.worker,...u==="exec.full"?{spawnFullControl:g}:{}};t(e.state,e.claim,{...S,signal:w.signal,emit:(n)=>{let{deliverySignal:_,...h}=n;f({t:"event",id:e.id,event:h})}}).then((n)=>f({t:"done",id:e.id,completion:n}),(n)=>f({t:"done",id:e.id,completion:{status:"failed",error_code:n&&typeof n==="object"&&"code"in n&&typeof n.code==="string"?n.code:"vm_hands_op_failed"}})).finally(()=>{m.delete(e.id),v.delete(e.id)})}),process.on("disconnect",()=>process.exit(0)),s){let a=process.argv.find((u)=>u.startsWith(At))?.slice(At.length),e={t:"readiness",display_video:!1,lanes:{}};f(p&&a?await E(a).catch(()=>e):e)}await new Promise(()=>{})}
|
|
3
3
|
export{ar,cr,Ct,At,Pt,as};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{zt,j}from"./vm-hands-entry-lite-pf5qtbj5.js";import{ue,Ce,Z,Ae,de,rr,Qe,X,O,H,tn}from"./vm-hands-entry-lite-3krzmhkk.js";import{_o,Vn}from"./vm-hands-entry-lite-aj139v8j.js";import{lo,P,Ke,ve,Je,ne,Ze,Bn,Se,Gt,ae,U,N,ce,Ur,Hr,jn}from"./vm-hands-entry-lite-tdgtpx8e.js";import{Pe,oe,pe,Y,Oe,q,Q}from"./vm-hands-entry-lite-4vks5phw.js";import{It,Sr,st,V,D,R,b}from"./vm-hands-entry-lite-beyyy1gz.js";import{xr,kr,bn,io,ze,vn}from"./vm-hands-entry-lite-s5qkb1fk.js";import{K}from"./vm-hands-entry-lite-hk6trmwa.js";import{Ii}from"./vm-hands-entry-lite-fbhqfzbq.js";import{p,He,Dt,at,Yi,_e,we}from"./vm-hands-entry-lite-s4bharcb.js";import{v,h,oo}from"./vm-hands-entry-lite-wx4ax7wg.js";import{E}from"./vm-hands-entry-lite-dk79tnax.js";import{er}from"./vm-hands-entry-lite-6wt5ja1k.js";import{a,ie,Do}from"./vm-hands-entry-lite-jev771b3.js";import{L,Pi,Ti,Bo,y,t,k,xt,o,d,u,i,c,_,ee,s,n}from"./vm-hands-entry-lite-avc65bd7.js";import{Oi}from"./vm-hands-entry-lite-hbs3tpdg.js";import{jo,se,Uo,C,Ne,$e,A}from"./vm-hands-entry-lite-6c67a3jc.js";import{r}from"./vm-hands-entry-lite-qy9xg6em.js";var li=()=>{let e={string:{unit:"characters",verb:"to have"},file:{unit:"bytes",verb:"to have"},array:{unit:"items",verb:"to have"},set:{unit:"items",verb:"to have"},map:{unit:"entries",verb:"to have"}};function l(w){return e[w]??null}let f={regex:"input",email:"email address",url:"URL",emoji:"emoji",uuid:"UUID",uuidv4:"UUIDv4",uuidv6:"UUIDv6",nanoid:"nanoid",guid:"GUID",cuid:"cuid",cuid2:"cuid2",ulid:"ULID",xid:"XID",ksuid:"KSUID",datetime:"ISO datetime",date:"ISO date",time:"ISO time",duration:"ISO duration",ipv4:"IPv4 address",ipv6:"IPv6 address",mac:"MAC address",cidrv4:"IPv4 range",cidrv6:"IPv6 range",base64:"base64-encoded string",base64url:"base64url-encoded string",json_string:"JSON string",e164:"E.164 number",jwt:"JWT",template_literal:"input"},g={nan:"NaN"};return(w)=>{switch(w.code){case"invalid_type":{let S=g[w.expected]??w.expected,I=Bo(w.input),W=g[I]??I;return`Invalid input: expected ${S}, received ${W}`}case"invalid_value":if(w.values.length===1)return`Invalid input: expected ${Ti(w.values[0])}`;return`Invalid option: expected one of ${Pi(w.values,"|")}`;case"too_big":{let S=w.inclusive?"<=":"<",I=l(w.origin);if(I)return`Too big: expected ${w.origin??"value"} to have ${S}${w.maximum.toString()} ${I.unit??"elements"}`;return`Too big: expected ${w.origin??"value"} to be ${S}${w.maximum.toString()}`}case"too_small":{let S=w.inclusive?">=":">",I=l(w.origin);if(I)return`Too small: expected ${w.origin} to have ${S}${w.minimum.toString()} ${I.unit}`;return`Too small: expected ${w.origin} to be ${S}${w.minimum.toString()}`}case"invalid_format":{let S=w;if(S.format==="starts_with")return`Invalid string: must start with "${S.prefix}"`;if(S.format==="ends_with")return`Invalid string: must end with "${S.suffix}"`;if(S.format==="includes")return`Invalid string: must include "${S.includes}"`;if(S.format==="regex")return`Invalid string: must match pattern ${S.pattern}`;return`Invalid ${f[S.format]??w.format}`}case"not_multiple_of":return`Invalid number: must be a multiple of ${w.divisor}`;case"unrecognized_keys":return`Unrecognized key${w.keys.length>1?"s":""}: ${Pi(w.keys,", ")}`;case"invalid_key":return`Invalid key in ${w.origin}`;case"invalid_union":if(w.options&&Array.isArray(w.options)&&w.options.length>0)return`Invalid discriminator value. Expected ${w.options.map((I)=>`'${I}'`).join(" | ")}`;return"Invalid input";case"invalid_element":return`Invalid value in ${w.origin}`;default:return"Invalid input"}}};function En(){return{localeError:li()}}L(En());class _t extends Error{}function Ro(e){let l;try{l=new URL(e)}catch{throw new _t("The proxy must be a URL like https://proxy.example.com:3128.")}if(l.protocol!=="https:"&&l.protocol!=="http:")throw new _t("The proxy URL must use the https or http scheme.");if(!l.hostname)throw new _t("The proxy URL must name a host.");if(l.port!==""&&Number(l.port)<1)throw new _t("The proxy URL must use a port between 1 and 65535.");if(l.pathname!==""&&l.pathname!=="/"||l.search||l.hash)throw new _t("The proxy URL must not carry a path, query, or fragment.");return l.toString()}import{createHash as ui}from"crypto";import{isAbsolute as Oo,join as xo,relative as Po,resolve as Yt,sep as Io}from"path";var qt=t().min(1).refine(Oo,"absolute path required"),On=c({version:n(1),apiOrigin:xt(),channel:s(["staging","production"]),stateDirectory:qt,workspaceRoot:qt,lifetime:s(["persistent","ephemeral"]),executionMode:s(["confined","host"]).default("confined"),name:t().min(1).max(160).default("Reason headless worker"),slots:o().int().min(1).max(4).default(1),shutdownGraceMs:o().int().min(0).max(300000).default(30000),proxy:c({version:n(zt),url:t().refine((e)=>{try{return Ro(e)===e}catch{return!1}},"invalid proxy URL"),caFile:qt.optional()}).optional(),userChrome:d().optional(),cloudSessions:n(!0).optional(),localLogins:d().optional(),folders:u(qt).min(1).max(31).optional()}),fi=/^https:\/\/[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.trycloudflare\.com$/,B=_("channel",[On,On.extend({channel:n("pr"),apiOrigin:t(),prEnvironment:t()}),On.extend({channel:n("local-qa"),apiOrigin:t()})]).superRefine((e,l)=>{if(e.channel==="local-qa"){if(!fi.test(e.apiOrigin))l.addIssue({code:"custom",message:"local QA worker requires an exact HTTPS trycloudflare.com quick-tunnel origin"})}else if(e.channel==="pr"){let g=e.prEnvironment,w=/^https:\/\/([a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)\.up\.railway\.app$/.exec(e.apiOrigin),S=w?.[1]?.match(/(?:^|-)pr-[0-9]+(?=-|$)/g)?.map((I)=>I.replace(/^-/,""));if(!g||/^pr-[1-9][0-9]*$/.exec(g)?.[0]!==g||w?.[0]!==e.apiOrigin||S?.length!==1||S[0]!==g)l.addIssue({code:"custom",message:"PR worker requires explicit prEnvironment and an exact same-PR HTTPS Railway origin"})}else{let g=new URL(e.apiOrigin);if(g.origin!==e.apiOrigin||g.username||g.password||g.protocol!=="https:"&&!(g.protocol==="http:"&&Vn(g.origin))||!Vn(g.origin)&&!_o(e.channel,g.origin))l.addIssue({code:"custom",message:"API origin must match channel (or loopback)"})}if(!je(e.workspaceRoot,e.stateDirectory))l.addIssue({code:"custom",message:"state and workspace must be disjoint"});let f=e.folders??[];if(new Set([e.workspaceRoot,...f]).size!==f.length+1||f.some((g)=>!je(g,e.stateDirectory)))l.addIssue({code:"custom",message:"folders must be distinct and disjoint from state"})});function m(e){return xo(e.stateDirectory,`headless-${e.channel==="pr"?e.prEnvironment:e.channel}`)}function je(e,l){if($r(l,e))return!1;return!$r(e,l)||E(xo(Io,Po(Yt(e),Yt(l))))}function $r(e,l){let f=Po(Yt(e),Yt(l));return f===""||f!==".."&&!f.startsWith(`..${Io}`)&&!Oo(f)}function te(e){let{proxy:l,userChrome:f,cloudSessions:g,localLogins:w,folders:S,...I}=e;return ui("sha256").update(JSON.stringify(I)).digest("hex")}var pi=4,_i=[2375,2376,9222,9229];function dr(e){let l=new Set(_i);for(let f of e){let g=new URL(f);l.add(Number(g.port||(["https:","wss:"].includes(g.protocol)?443:80)))}return l}function Vr(){throw new r("preview_unavailable","The live Hands preview binding is unavailable or stale.")}var mi=60000;function Ao(e){let l=new AbortController,f=new Map,g=(x)=>JSON.stringify([x.jobId,x.port]);function w(x){let M=e.authority.owner;if(l.signal.aborted||!e.isCurrent()||e.expiresAtMs<=Date.now()||x.organization_id!==M.organization_id||x.user_id!==M.user_id||x.device_id!==M.device_id)Vr()}function S(x){let M;try{M=e.environment.current()}catch{return null}return M.binding.target_generation===x.generation&&M.binding.target_fence_id===x.fenceId&&M.run_id===e.runId&&M.device_id===e.authority.owner.device_id&&M.root_id===e.authority.rootId?M:null}async function I(x,M,G){let F=await W(x,M,G);if(F!=="moved")return F;let T=await W(x,M,G);return T==="moved"?null:T}async function W(x,M,G){try{w(e.authority.owner);let F=e.identity();if(!F||G.aborted||x.expiresAtMs<=Date.now()||x.expiresAtMs>e.expiresAtMs)return null;let T=M.opened,re=T!==void 0&&F.generation>T.generation,J=S(F);if(re){if(J){if(J.revision<=T.revision||x.expiresAtMs>Date.parse(J.expires_at)||J.binding.target_revision!==T.attachmentRevision||J.binding.root_grant_revision!==T.grantRevision)return null;M.recoveringSinceMs=void 0}else if(Date.now()-(M.recoveringSinceMs??=Date.now())>mi)return null}else if(!J||x.expiresAtMs>Date.parse(J.expires_at)||T&&(F.generation!==T.generation||F.fenceId!==T.fenceId))return null;let z=await e.inspect(x.jobId,G),fe=e.identity(),ke=fe&&S(fe);w(e.authority.owner);let be=J&&{generation:F.generation,fenceId:F.fenceId,snapshotId:J.snapshot_id,revision:J.revision,attachmentRevision:J.binding.target_revision,grantRevision:J.binding.root_grant_revision},Re=re?T:be;if(G.aborted||!fe)return null;if(fe.generation!==F.generation||fe.fenceId!==F.fenceId||ke?.snapshot_id!==J?.snapshot_id||ke?.revision!==J?.revision)return"moved";let Fe=z.ok&&z.job.environmentSnapshotId!==void 0&&z.job.environmentRevision!==void 0?{snapshotId:z.job.environmentSnapshotId,revision:z.job.environmentRevision}:null;if(!z.ok||z.generation!==F.generation||!Re||!Fe)return null;if((Fe.snapshotId!==Re.snapshotId||Fe.revision!==Re.revision)&&(re||!e.environment.carried(Fe.snapshotId,Fe.revision)))return null;if(!T&&F.generation===x.generation&&F.fenceId===x.fenceId)M.opened={...Re,...Fe};return{executorLaunchId:e.executorLaunchId,job:z.job,binding:{organizationId:e.authority.owner.organization_id,userId:e.authority.owner.user_id,deviceId:e.authority.owner.device_id,rootId:e.authority.rootId,runId:e.runId,attachmentRevision:Re.attachmentRevision,grantRevision:Re.grantRevision,generation:Re.generation,fenceId:Re.fenceId,jobId:z.job.jobId,port:x.port,expiresAtMs:x.expiresAtMs}}}catch{return null}}return{async open(x,M,G){w(M);let{binding:F,deviceRelayUrl:T}=at(x);if(G.aborted||F.expiresAtMs<=Date.now()||F.expiresAtMs>Date.now()+p.lifetimeMs||new URL(T).origin!==e.authority.relayOrigin)Vr();let re=g(F),J=f.get(re);if(J){if(!He(J.binding,F)||J.relay!==T)Vr();if(await J.opened,!await Dt(()=>J.port.check())||G.aborted||J.abort.signal.aborted)Vr();return{opened:!0,binding:F}}if(f.size>=pi)Vr();let z=new AbortController,fe={},ke=we({binding:F,deniedPorts:e.authority.deniedPorts,readCurrentJob:()=>I(F,fe,z.signal)}),be=()=>z.abort();if(G.addEventListener("abort",be,{once:!0}),l.signal.addEventListener("abort",be,{once:!0}),G.aborted||l.signal.aborted)be();let Re=_e({binding:F,deviceRelayUrl:T,port:ke,signal:z.signal}),Fe={binding:F,relay:T,abort:z,port:ke,opened:Re};f.set(re,Fe);let Ye=()=>{if(G.removeEventListener("abort",be),l.signal.removeEventListener("abort",be),f.get(re)===Fe)f.delete(re)};try{if((await Re).closed.then(Ye),G.removeEventListener("abort",be),w(M),z.signal.aborted||!await Dt(()=>ke.check()))Vr();return{opened:!0,binding:F}}catch{z.abort(),Ye(),Vr()}},async close(x,M){w(M);let{binding:G}=Yi(x),F=f.get(g(G));if(!F||!He(F.binding,G))Vr();return F.abort.abort(),await F.opened.then((T)=>T.closed,()=>{return}),{closed:!0,binding:G}},dispose(){l.abort();for(let x of f.values())x.abort.abort();f.clear()}}}import{WebSocket as xn}from"ws";var To=(e)=>("data"in e)?e.data.length:e.bytes,Co=2*Ze;function cr(e){throw new r(e,"The bound Hands terminal is unavailable or its outcome is unconfirmed.")}var mt=(e)=>!["starting","running"].includes(e.state);function Hi(e,l,f=Date.now()){let g=["relay_url","session_id","expires_at","cols","rows","pty","workspace"];if(Object.keys(e).length!==g.length||Object.keys(e).some((M)=>!g.includes(M))||!ae(l)||!ae(e.session_id)||typeof e.expires_at!=="string"||typeof e.relay_url!=="string"||e.relay_url.length>4096||![e.cols,e.rows].every((M)=>Number.isSafeInteger(M)&&Number(M)>=1&&Number(M)<=Se))cr("invalid_pty_request");let w=e.pty;if(!w||typeof w!=="object"||Array.isArray(w))cr("invalid_pty_request");let S=w;if(Object.keys(S).length!==2||S.version!==1||!ce(S.jobId))cr("invalid_pty_request");let I;try{I=new URL(e.relay_url)}catch{return cr("invalid_pty_request")}if(!["ws:","wss:"].includes(I.protocol)||I.username||I.password||I.hash||I.protocol==="ws:"&&!["127.0.0.1","[::1]","localhost"].includes(I.hostname))cr("invalid_pty_request");let W=Date.parse(e.expires_at);if(!Number.isSafeInteger(W)||W<=f)cr("invalid_pty_request");return{workspace:H(e.workspace)??cr("invalid_pty_request"),session:{jobId:S.jobId,sessionId:e.session_id,operationId:l,relayUrl:I.href,cols:Number(e.cols),rows:Number(e.rows),leaseExpiresAtMs:Math.min(W,f+43200000)}}}async function Ho(e){let{session:l,binding:f}=e;if(f.assertCurrent(),e.signal.aborted||Date.now()>=l.leaseExpiresAtMs)cr("cancelled");let g=new xn(l.relayUrl,{followRedirects:!1,perMessageDeflate:!1,maxPayload:ne}),w=new AbortController,S=()=>{},I=()=>{w.abort(),S()};e.signal.addEventListener("abort",I,{once:!0});let W=setTimeout(I,Math.max(1,l.leaseExpiresAtMs-Date.now())),x=[],M=0,G=0,F=0,T=!1,re=!1,J=!1,z,fe,ke,be=(le)=>{ke=new r(le,"Bound terminal input was refused."),I()};g.on("error",()=>be("pty_relay_unavailable")),g.on("close",I),g.on("message",(le,he)=>{if(w.signal.aborted)return;if(!re){be("pty_not_ready");return}let xe=Array.isArray(le)?Buffer.concat(le):le instanceof ArrayBuffer?Buffer.from(le):le;if(xe.length===0)return;let Ge=x.at(-1),Le=he&&Ge!==void 0&&"data"in Ge&&Ge.data.length+xe.length<=ne;if(xe.length>ne||M+xe.length>Bn){be("pty_input_backpressure");return}if(Le)Ge.data=Buffer.concat([Ge.data,xe]);else if(he)x.push({data:Buffer.from(xe)});else try{let Be=JSON.parse(xe.toString("utf8"));if(Be&&Be.t==="close"&&Object.keys(Be).length===1){J=!0,I();return}if(!Be||Be.t!=="resize"||Object.keys(Be).length!==3||![Be.cols,Be.rows].every((Ee)=>Number.isSafeInteger(Ee)&&Ee>=1&&Ee<=Se))throw Error("invalid_control");x.push({cols:Be.cols,rows:Be.rows,bytes:xe.length})}catch{be("invalid_pty_control");return}M+=xe.length,S()});function Re(le){return jn(JSON.stringify({...f.scope,version:1,sessionId:l.sessionId,operationId:l.operationId,job:{...le,output:[],pty:le.pty?{...le.pty,output:[]}:void 0}}))}function Fe(le){if(!le.ok)cr(le.error);let he=le.job;if(le.generation!==f.scope.generation||he.jobId!==l.jobId||!he.pty||he.leaseExpiresAtMs>l.leaseExpiresAtMs||he.process&&he.process.executorLaunchId!==f.scope.executorLaunchId||he.process&&fe&&(he.process.pid!==fe.pid||he.process.processGroupId!==fe.processGroupId)||he.state!=="starting"&&(he.environmentRevision!==f.environment.revision||he.environmentSnapshotId!==f.environment.snapshotId))cr("pty_binding_changed");if(Re(he),he.process)fe??={...he.process};return he}async function Ye(le){f.assertCurrent();let he=await f.request(le,w.signal);if(f.assertCurrent(),w.signal.aborted)cr("cancelled");let xe=Fe(he);if(xe.inputSequence!==G)cr("job_input_sequence");if(!mt(xe)&&xe.leaseExpiresAtMs<=Date.now())cr("pty_binding_changed");return xe}function ye(le){if(f.assertCurrent(),w.signal.aborted||g.readyState!==xn.OPEN||g.bufferedAmount+Buffer.byteLength(le)>Co)cr("pty_output_backpressure");g.send(le)}function We(le){if(le.firstCursor>F+1)F=le.firstCursor-1;for(let he of le.pty.output){if(he.cursor<=F)continue;if(he.cursor!==F+1)cr("pty_output_gap");let xe=Buffer.from(he.dataBase64,"base64");if(g.bufferedAmount+xe.length>Co)return!1;ye(xe),F=he.cursor}if(F!==le.nextCursor)cr("pty_output_gap");return!0}async function qe(le,he){let xe;try{await Promise.race([e.emit(le,he),new Promise((Ge,Le)=>{xe=setTimeout(()=>Le(new r("pty_event_unavailable","Terminal metadata delivery timed out.")),2000)})])}finally{clearTimeout(xe)}}async function Te(){let le=AbortSignal.timeout(Gt),he=f.request({jobId:l.jobId,action:"cancel",input:{}},le),xe,Ge=new Promise((Le,Be)=>{if(xe=()=>Be(new r("pty_cleanup_unconfirmed","Terminal cleanup acknowledgement was not observed within authority.")),le.addEventListener("abort",xe,{once:!0}),le.aborted)xe()});try{let Le=await Promise.race([he,Ge]);if(le.aborted)cr("pty_cleanup_unconfirmed");return Fe(Le)}finally{le.removeEventListener("abort",xe)}}try{await new Promise((Le,Be)=>{let Ee=setTimeout(()=>{I(),Be(new r("pty_relay_unavailable","Terminal pairing timed out."))},5000),Me=()=>{clearTimeout(Ee),Be(new r("cancelled","Terminal pairing was cancelled."))};if(w.signal.addEventListener("abort",Me,{once:!0}),g.once("open",()=>{clearTimeout(Ee),w.signal.removeEventListener("abort",Me),Le()}),w.signal.aborted)Me()}),f.assertCurrent(),T=!0,z=await Ye({jobId:l.jobId,action:"start",input:{mode:"pty",cols:l.cols,rows:l.rows,leaseExpiresAtMs:l.leaseExpiresAtMs}});let le=Date.now()+5000;while(z.state==="starting"){if(Date.now()>=le)cr("pty_not_ready");await new Promise((Le)=>setTimeout(Le,25)),z=await Ye({jobId:l.jobId,action:"inspect",input:{after:F}})}if(z.state!=="running"||z.inputSequence!==0||z.leaseExpiresAtMs<=Date.now())cr("pty_not_ready");await qe("pty.ready",Re(z)),re=!0,ye(JSON.stringify({t:"open",cols:z.pty.cols,rows:z.pty.rows,receipt:Re(z)}));let he=!1,xe=0,Ge=!1;while(!w.signal.aborted){let Le=z.firstCursor>F+1,Be=We(z);if(mt(z)){if(Be)break}else if(Le)he=!0;else if(he&&Be&&Date.now()>=xe){he=!1,xe=Date.now()+1000;let{cols:Me,rows:or}=z.pty;for(let sr of[{cols:Me,rows:or>1?or-1:2},{cols:Me,rows:or}]){if(mt(z))break;let Ir=++G;if(z=await Ye({jobId:l.jobId,action:"resize",input:{sequence:Ir,...sr}}),z.inputSequence!==Ir)cr("job_input_sequence")}continue}let Ee=mt(z)||Ge?void 0:x.shift();if(Ee){M-=To(Ee);let Me=++G;try{z=await Ye("data"in Ee?{jobId:l.jobId,action:"input",input:{sequence:Me,dataBase64:Ee.data.toString("base64")}}:{jobId:l.jobId,action:"resize",input:{sequence:Me,cols:Ee.cols,rows:Ee.rows}})}catch(or){if(!(or instanceof r)||or.code!=="job_input_backpressure")throw or;G-=1,x.unshift(Ee),M+=To(Ee),Ge=!0;continue}if(z.inputSequence!==Me)cr("job_input_sequence")}else if(await new Promise((Me)=>{let or=setTimeout(Me,Ge||!Be?10:50);if(S=()=>{clearTimeout(or),Me()},w.signal.aborted||!Ge&&x.length)S()}),Ge=!1,S=()=>{},!w.signal.aborted&&Be)try{z=await Ye({jobId:l.jobId,action:"inspect",input:{after:F}})}catch(Me){if(!J||!(Me instanceof r)||Me.code!=="cancelled")throw Me}}}catch(le){ke??=le}finally{if(re=!1,x.length=0,clearTimeout(W),e.signal.removeEventListener("abort",I),I(),T&&(!z||!mt(z)))try{z=await Te()}catch{z=void 0}try{if(!z||!mt(z)||z.pty?.cleanup!=="confirmed")cr("pty_cleanup_unconfirmed");let le=Re(z);if(g.readyState===xn.OPEN)await new Promise((he)=>{let xe=setTimeout(he,500);g.send(JSON.stringify({t:"exit",code:z.exitCode,receipt:le}),()=>{clearTimeout(xe),he()})});await qe("pty.stopped",le)}catch(le){ke??=le}g.terminate()}if(ke)throw ke;if(e.signal.aborted)cr("cancelled");if(!z)cr("pty_cleanup_unconfirmed");return{receipt:Re(z)}}import{createHash as hi,randomUUID as An}from"crypto";import{spawnSync as Wo}from"child_process";import{closeSync as No,constants as Pn,fstatSync as gi,fsyncSync as bi,lstatSync as Bt,mkdirSync as wi,mkdtempSync as Fo,openSync as Lo,readFileSync as yi,readdirSync as zo,realpathSync as Lt,rmSync as In,unlinkSync as vi}from"fs";import{createConnection as ki}from"net";import{dirname as Si,join as nt,sep as Ei}from"path";import{tmpdir as Ri}from"os";var Pr=new Map,qr=new Map;function Kr(e,l){return hi("sha256").update(JSON.stringify([e,l])).digest("hex")}function ht(e){try{wi(e,{mode:448})}catch(f){if(!(f instanceof Error&&("code"in f)&&f.code==="EEXIST"))throw f}let l=Bt(e);if(!l.isDirectory()||l.isSymbolicLink()||!A(l)||Lt(e)!==e)throw new r("hands_jobs_unavailable","Hands job state must be a private canonical directory.")}function xi(e){let l;try{l=Bt(e)}catch(f){if(f instanceof Error&&"code"in f&&f.code==="ENOENT")return!1;throw f}return!l.isDirectory()||l.isSymbolicLink()||zo(e).length>0}function pr(e){let l=Kr(e.root,e.runId),f=e.previousRuntimeDirectories?.find((I)=>xi(nt(I,"jobs",l.slice(0,16))))??e.runtimeDirectory;ht(f);let g=nt(f,"jobs");ht(g);let w=nt(g,l.slice(0,16));if(e.maxScopes!==void 0){let I=zo(g);if(!Number.isSafeInteger(e.maxScopes)||e.maxScopes<1||I.length>e.maxScopes||!I.includes(l.slice(0,16))&&I.length>=e.maxScopes)throw new r("process_journal_capacity","Managed process receipt capacity is full; preserve uncertain jobs and reconcile their existing receipts before starting more work.")}ht(w);let S=Fo(nt(Uo(),"reason-j-"));try{return ht(S),{journalDirectory:w,scopeId:l,launchDirectory:S,socketPath:process.platform==="win32"?`\\\\.\\pipe\\reason-jobs-${An()}`:nt(S,"control.sock"),disposeSocket:()=>In(S,{recursive:!0,force:!0})}}catch(I){throw In(S,{recursive:!0,force:!0}),I}}var Ai=60000,Di=5000;function Ci(e){if(process.platform==="win32")return Ni(e);let l=Wo("ps",["-o","lstart=","-p",String(e)],{encoding:"utf8",timeout:2000,env:{...process.env,LC_ALL:"C",LANG:"C"}}),f=l.status===0?/^\w{3} (\w{3}) +(\d{1,2}) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/.exec(l.stdout.trim()):null,g=f?"JanFebMarAprMayJunJulAugSepOctNovDec".indexOf(f[1]):-1;if(!f||g<0||g%3!==0)return null;let w=new Date(Number(f[6]),g/3,Number(f[2]),Number(f[3]),Number(f[4]),Number(f[5])).getTime();return Number.isFinite(w)?w:null}function Ni(e){let l=Wo(C("powershell"),["-NoProfile","-NonInteractive","-Command",`(Get-Process -Id ${e}).StartTime.ToUniversalTime().ToString('o')`],{encoding:"utf8",timeout:5000,windowsHide:!0,env:Ne()}),f=l.status===0?Date.parse(l.stdout.trim()):Number.NaN;return Number.isFinite(f)?f:null}function $o(e,l={}){let f=nt(e.journalDirectory,"owner.lock"),g;try{g=Lo(f,Pn.O_RDONLY|Pn.O_NOFOLLOW)}catch{return null}try{let w=gi(g);if(!w.isFile()||w.nlink!==1||!A(w)||w.size>4096)return null;let S=null;try{S=JSON.parse(yi(g,"utf8"))}catch{}let I;if(S===null){if((l.now??Date.now)()-w.mtimeMs<Ai)return null;I={reason:"never_written",executorLaunchId:null}}else{let{version:M,scopeId:G,pid:F,createdAtMs:T,executorLaunchId:re}=S;if(M!==1||G!==e.scopeId||typeof re!=="string"||typeof F!=="number"||!Number.isSafeInteger(F)||F<1||F===process.pid||typeof T!=="number"||!Number.isSafeInteger(T))return null;if(!(l.exists??((z)=>{try{return process.kill(z,0),!0}catch(fe){return!(fe instanceof Error&&("code"in fe)&&fe.code==="ESRCH")}}))(F))I={reason:"owner_exited",executorLaunchId:re};else{let z=(l.startedAtMs??Ci)(F);if(z===null||z<=T+Di)return null;I={reason:"pid_reused",executorLaunchId:re}}}let W=Bt(f);if(W.dev!==w.dev||W.ino!==w.ino)return null;vi(f);let x=Lo(e.journalDirectory,Pn.O_RDONLY);try{bi(x)}finally{No(x)}return I}catch{return null}finally{No(g)}}function Ko(e){let l={...e,workspace:e.workspace&&Object.freeze({...e.workspace}),previewAuthority:e.previewAuthority&&Object.freeze({...e.previewAuthority,owner:Object.freeze({...e.previewAuthority.owner}),deniedPorts:new Set(e.previewAuthority.deniedPorts)})},f=Kr(l.root,l.runId);if(Pr.has(f)||l.operationId!==void 0&&qr.has(l.operationId))throw new r("hands_jobs_busy","The Session already has a live Hands job supervisor.");let g={binding:l,key:f,terminals:new Map};if(l.previewAuthority&&l.environment)g.previews=Ao({authority:l.previewAuthority,runId:l.runId,expiresAtMs:l.expiresAtMs,executorLaunchId:l.executorLaunchId,environment:l.environment,isCurrent:()=>Pr.get(g.key)===g,identity:()=>{try{return gt(l)}catch{return null}},inspect:(w,S)=>{if(Pr.get(g.key)!==g)throw new r("preview_unavailable","The Hands supervisor is no longer current.");return Go(l,{jobId:w,action:"inspect",input:{after:0}},S)}});if(Pr.set(f,g),l.operationId!==void 0)qr.set(l.operationId,g);return()=>{if(Pr.get(g.key)===g)Pr.delete(g.key);if(l.operationId!==void 0&&qr.get(l.operationId)===g)qr.delete(l.operationId);g.previews?.dispose();for(let w of g.terminals.values())w.abort()}}var Li=5000,Bi=20;async function zi(e){let l=(w)=>{throw new r("hands_rebind_unavailable",w)};if(!N(e.operationId)||!N(e.runId)||!N(e.fenceId)||!U(e.targetGeneration))l("Reason sent an invalid Hands rebind.");let f=qr.get(e.operationId);if(!f||f.binding.root!==e.root)return l("No live Hands supervisor owns this operation.");for(let w=Date.now()+Li;;){if(e.signal?.aborted)l("The Hands rebind was cancelled.");if(qr.get(e.operationId)!==f)l("The Hands supervisor is no longer current.");let S=null;try{S=gt(f.binding)}catch{}if(S&&S.generation===e.targetGeneration&&S.fenceId===e.fenceId)break;if(S&&S.generation>e.targetGeneration||Date.now()>=w)l("The executor did not adopt this take.");await new Promise((I)=>setTimeout(I,Bi))}if(qr.get(e.operationId)!==f||Pr.get(f.key)!==f)l("The Hands supervisor is no longer current.");let g=Kr(e.root,e.runId);if(f.key===g)return;if(Pr.has(g))l("The taking run already has a live Hands job supervisor.");Pr.delete(f.key);for(let w of f.terminals.values())w.abort();f.key=g,Pr.set(g,f)}function it(e){let l="operationId"in e?qr.get(e.operationId):Pr.get(Kr(e.root,e.runId)),f=l&&l.binding.root===e.root?l.binding:void 0;if(!f?.environment||f.expiresAtMs<=Date.now())throw new r("environment_unavailable","No live Hands supervisor owns this environment.");return f.environment.install(e.payload)}async function qi(e){let l=Pr.get(Kr(e.root,e.runId));if(!l?.previews||!e.owner)throw new r("preview_unavailable","No authenticated Hands supervisor owns this preview.");return l.previews.open(e.payload,e.owner,e.signal)}async function Wi(e){let l=Pr.get(Kr(e.root,e.runId));if(!l?.previews||!e.owner||e.signal.aborted)throw new r("preview_unavailable","No authenticated Hands supervisor owns this preview.");return l.previews.close(e.payload,e.owner)}async function Vi(e){let l=Kr(e.root,e.runId),f=Pr.get(l),g=f?.binding,w=g?.runId,S=g?.previewAuthority,I=g?.environment,W=e.owner&&{...e.owner},x=e.authority&&{...e.authority},M=()=>{throw new r("pty_binding_unavailable","No current authenticated Hands scope owns this terminal.")};if(!f||!g||!S||!I||!W||!x||!g.workspace)return M();let G=Object.freeze({...g.workspace}),F=gt(g),T=I.current(),re=()=>{if(Pr.get(l)!==f||W.organization_id!==S.owner.organization_id||W.user_id!==S.owner.user_id||W.device_id!==S.owner.device_id||e.deviceId!==S.owner.device_id||e.rootId!==S.rootId||O(e.workspace)!==O(G))M();let z=gt(g),fe=I.current();if(z.generation!==F.generation||z.fenceId!==F.fenceId||fe.run_id!==w||fe.device_id!==e.deviceId||fe.root_id!==e.rootId||fe.snapshot_id!==T.snapshot_id||fe.revision!==T.revision||fe.binding.target_generation!==F.generation||fe.binding.target_fence_id!==F.fenceId||x.device_id!==e.deviceId||x.binding!==fe.binding.kind||x.target_revision!==fe.binding.target_revision||x.root_grant_revision!==fe.binding.root_grant_revision||x.target_generation!==F.generation||x.target_fence_id!==F.fenceId)M()};if(re(),new URL(e.session.relayUrl).origin!==S.relayOrigin||f.terminals.has(e.session.jobId)||f.terminals.size>=4)return M();let J=new AbortController;f.terminals.set(e.session.jobId,J);try{return await Ho({session:{...e.session,leaseExpiresAtMs:Math.min(e.session.leaseExpiresAtMs,F.expiresAtMs,Date.parse(T.expires_at))},signal:AbortSignal.any([e.signal,J.signal]),emit:e.emit,binding:{assertCurrent:re,environment:{revision:T.revision,snapshotId:T.snapshot_id},scope:{runId:e.runId,deviceId:e.deviceId,rootId:e.rootId,workspace:G,binding:T.binding.kind,targetRevision:T.binding.target_revision,rootGrantRevision:T.binding.root_grant_revision,generation:F.generation,fenceId:F.fenceId,executorLaunchId:F.executorLaunchId},request:(z,fe)=>hr(F,Ur(JSON.stringify({...z,type:"job",version:2,generation:F.generation,id:An()})),fe)}})}finally{if(f.terminals.get(e.session.jobId)===J)f.terminals.delete(e.session.jobId)}}async function Gi(e){if(ce(e.payload.jobId))throw new r("pty_binding_required","PTY jobs require the bound terminal capability.");let l=Pr.get(Kr(e.root,e.runId))?.binding;if(!l||l.expiresAtMs<=Date.now())throw new r("hands_jobs_unavailable","No live Hands supervisor owns this Session and root.");return Go(l,e.payload,e.signal)}var ji=1e4,Mi=20,Fi=ve/2,Ui=Ke/2,$i=(e)=>e.output.reduce((l,f)=>l+f.text.length,0);async function Go(e,l,f){if(Object.keys(l).some((M)=>!["jobId","action","input","waitForExitMs"].includes(M)))throw new r("invalid_payload","Unexpected job control field.");let{waitForExitMs:g,...w}=l;if(g!==void 0&&(w.action!=="start"||typeof w.input!=="object"||w.input===null||!("script"in w.input)||typeof g!=="number"||!Number.isSafeInteger(g)||g<1||g>ji))throw new r("invalid_payload","Only a script start may wait for its job, within its bound.");let S=(M)=>{let G=gt(e);return hr(G,Ur(JSON.stringify({...M,type:"job",version:2,generation:G.generation,id:An()})),f)},I=await S(w);if(g===void 0)return I;let W=Date.now()+g,x=I;while(x.ok&&["starting","running"].includes(x.job.state)&&x.job.output.length<Fi&&$i(x.job)<Ui&&!f.aborted&&Date.now()<W){if(await new Promise((M)=>setTimeout(M,Math.min(Mi,W-Date.now()))),f.aborted)break;try{let M=await S({jobId:w.jobId,action:"inspect",input:{after:0}});if(!M.ok)break;x=M}catch{break}}return x}function gt(e){if(e.expiresAtMs<=Date.now())throw new r("hands_jobs_unavailable","Hands authority expired.");let l=e.readIdentity?e.readIdentity():e;if(!l||!U(l.generation)||!N(l.fenceId)||l.generation<e.generation||l.generation===e.generation&&l.fenceId!==e.fenceId)throw new r("hands_jobs_unavailable","The live Hands fencing identity could not be verified.");return e.generation=l.generation,e.fenceId=l.fenceId,{...e}}function hr(e,l,f){if(f.aborted)return Promise.reject(new r("cancelled","Job control was cancelled."));return new Promise((g,w)=>{let S=ki(e.socketPath),I="",W=!1,x,M=(F,T)=>{if(W)return;if(W=!0,clearTimeout(x),f.removeEventListener("abort",G),S.destroy(),F)w(F);else g(T)},G=()=>M(new r("cancelled","Job control waiter cancelled; inspect before retrying mutations."));f.addEventListener("abort",G,{once:!0}),S.setEncoding("utf8"),x=setTimeout(()=>M(new r("hands_job_result_unknown","Job control timed out; inspect before retrying mutations.")),Math.min(1e4,Math.max(1,e.expiresAtMs-Date.now()))),S.on("error",()=>M(new r("hands_job_result_unknown","Hands job control connection failed."))),S.once("connect",()=>S.write(JSON.stringify({version:1,scopeId:e.scopeId,fenceId:e.fenceId,executorLaunchId:e.executorLaunchId,request:l})+`
|
|
2
|
+
import{zt,j}from"./vm-hands-entry-lite-pf5qtbj5.js";import{ue,Ce,Z,Ae,de,rr,Qe,X,O,H,tn}from"./vm-hands-entry-lite-3krzmhkk.js";import{_o,Vn}from"./vm-hands-entry-lite-aj139v8j.js";import{lo,P,Ke,ve,Je,ne,Ze,Bn,Se,Gt,ae,U,N,ce,Ur,Hr,jn}from"./vm-hands-entry-lite-tdgtpx8e.js";import{Pe,oe,pe,Y,Oe,q,Q}from"./vm-hands-entry-lite-4vks5phw.js";import{It,Sr,st,V,D,R,b}from"./vm-hands-entry-lite-beyyy1gz.js";import{xr,kr,bn,io,ze,vn}from"./vm-hands-entry-lite-s5qkb1fk.js";import{K}from"./vm-hands-entry-lite-hk6trmwa.js";import{Ii}from"./vm-hands-entry-lite-fbhqfzbq.js";import{p,He,Dt,at,Yi,_e,we}from"./vm-hands-entry-lite-s4bharcb.js";import{v,h,oo}from"./vm-hands-entry-lite-wx4ax7wg.js";import{E}from"./vm-hands-entry-lite-dk79tnax.js";import{er}from"./vm-hands-entry-lite-706c7f7x.js";import{a,ie,Do}from"./vm-hands-entry-lite-jev771b3.js";import{L,Pi,Ti,Bo,y,t,k,xt,o,d,u,i,c,_,ee,s,n}from"./vm-hands-entry-lite-avc65bd7.js";import{Oi}from"./vm-hands-entry-lite-hbs3tpdg.js";import{jo,se,Uo,C,Ne,$e,A}from"./vm-hands-entry-lite-6c67a3jc.js";import{r}from"./vm-hands-entry-lite-qy9xg6em.js";var li=()=>{let e={string:{unit:"characters",verb:"to have"},file:{unit:"bytes",verb:"to have"},array:{unit:"items",verb:"to have"},set:{unit:"items",verb:"to have"},map:{unit:"entries",verb:"to have"}};function l(w){return e[w]??null}let f={regex:"input",email:"email address",url:"URL",emoji:"emoji",uuid:"UUID",uuidv4:"UUIDv4",uuidv6:"UUIDv6",nanoid:"nanoid",guid:"GUID",cuid:"cuid",cuid2:"cuid2",ulid:"ULID",xid:"XID",ksuid:"KSUID",datetime:"ISO datetime",date:"ISO date",time:"ISO time",duration:"ISO duration",ipv4:"IPv4 address",ipv6:"IPv6 address",mac:"MAC address",cidrv4:"IPv4 range",cidrv6:"IPv6 range",base64:"base64-encoded string",base64url:"base64url-encoded string",json_string:"JSON string",e164:"E.164 number",jwt:"JWT",template_literal:"input"},g={nan:"NaN"};return(w)=>{switch(w.code){case"invalid_type":{let S=g[w.expected]??w.expected,I=Bo(w.input),W=g[I]??I;return`Invalid input: expected ${S}, received ${W}`}case"invalid_value":if(w.values.length===1)return`Invalid input: expected ${Ti(w.values[0])}`;return`Invalid option: expected one of ${Pi(w.values,"|")}`;case"too_big":{let S=w.inclusive?"<=":"<",I=l(w.origin);if(I)return`Too big: expected ${w.origin??"value"} to have ${S}${w.maximum.toString()} ${I.unit??"elements"}`;return`Too big: expected ${w.origin??"value"} to be ${S}${w.maximum.toString()}`}case"too_small":{let S=w.inclusive?">=":">",I=l(w.origin);if(I)return`Too small: expected ${w.origin} to have ${S}${w.minimum.toString()} ${I.unit}`;return`Too small: expected ${w.origin} to be ${S}${w.minimum.toString()}`}case"invalid_format":{let S=w;if(S.format==="starts_with")return`Invalid string: must start with "${S.prefix}"`;if(S.format==="ends_with")return`Invalid string: must end with "${S.suffix}"`;if(S.format==="includes")return`Invalid string: must include "${S.includes}"`;if(S.format==="regex")return`Invalid string: must match pattern ${S.pattern}`;return`Invalid ${f[S.format]??w.format}`}case"not_multiple_of":return`Invalid number: must be a multiple of ${w.divisor}`;case"unrecognized_keys":return`Unrecognized key${w.keys.length>1?"s":""}: ${Pi(w.keys,", ")}`;case"invalid_key":return`Invalid key in ${w.origin}`;case"invalid_union":if(w.options&&Array.isArray(w.options)&&w.options.length>0)return`Invalid discriminator value. Expected ${w.options.map((I)=>`'${I}'`).join(" | ")}`;return"Invalid input";case"invalid_element":return`Invalid value in ${w.origin}`;default:return"Invalid input"}}};function En(){return{localeError:li()}}L(En());class _t extends Error{}function Ro(e){let l;try{l=new URL(e)}catch{throw new _t("The proxy must be a URL like https://proxy.example.com:3128.")}if(l.protocol!=="https:"&&l.protocol!=="http:")throw new _t("The proxy URL must use the https or http scheme.");if(!l.hostname)throw new _t("The proxy URL must name a host.");if(l.port!==""&&Number(l.port)<1)throw new _t("The proxy URL must use a port between 1 and 65535.");if(l.pathname!==""&&l.pathname!=="/"||l.search||l.hash)throw new _t("The proxy URL must not carry a path, query, or fragment.");return l.toString()}import{createHash as ui}from"crypto";import{isAbsolute as Oo,join as xo,relative as Po,resolve as Yt,sep as Io}from"path";var qt=t().min(1).refine(Oo,"absolute path required"),On=c({version:n(1),apiOrigin:xt(),channel:s(["staging","production"]),stateDirectory:qt,workspaceRoot:qt,lifetime:s(["persistent","ephemeral"]),executionMode:s(["confined","host"]).default("confined"),name:t().min(1).max(160).default("Reason headless worker"),slots:o().int().min(1).max(4).default(1),shutdownGraceMs:o().int().min(0).max(300000).default(30000),proxy:c({version:n(zt),url:t().refine((e)=>{try{return Ro(e)===e}catch{return!1}},"invalid proxy URL"),caFile:qt.optional()}).optional(),userChrome:d().optional(),cloudSessions:n(!0).optional(),localLogins:d().optional(),folders:u(qt).min(1).max(31).optional()}),fi=/^https:\/\/[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.trycloudflare\.com$/,B=_("channel",[On,On.extend({channel:n("pr"),apiOrigin:t(),prEnvironment:t()}),On.extend({channel:n("local-qa"),apiOrigin:t()})]).superRefine((e,l)=>{if(e.channel==="local-qa"){if(!fi.test(e.apiOrigin))l.addIssue({code:"custom",message:"local QA worker requires an exact HTTPS trycloudflare.com quick-tunnel origin"})}else if(e.channel==="pr"){let g=e.prEnvironment,w=/^https:\/\/([a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)\.up\.railway\.app$/.exec(e.apiOrigin),S=w?.[1]?.match(/(?:^|-)pr-[0-9]+(?=-|$)/g)?.map((I)=>I.replace(/^-/,""));if(!g||/^pr-[1-9][0-9]*$/.exec(g)?.[0]!==g||w?.[0]!==e.apiOrigin||S?.length!==1||S[0]!==g)l.addIssue({code:"custom",message:"PR worker requires explicit prEnvironment and an exact same-PR HTTPS Railway origin"})}else{let g=new URL(e.apiOrigin);if(g.origin!==e.apiOrigin||g.username||g.password||g.protocol!=="https:"&&!(g.protocol==="http:"&&Vn(g.origin))||!Vn(g.origin)&&!_o(e.channel,g.origin))l.addIssue({code:"custom",message:"API origin must match channel (or loopback)"})}if(!je(e.workspaceRoot,e.stateDirectory))l.addIssue({code:"custom",message:"state and workspace must be disjoint"});let f=e.folders??[];if(new Set([e.workspaceRoot,...f]).size!==f.length+1||f.some((g)=>!je(g,e.stateDirectory)))l.addIssue({code:"custom",message:"folders must be distinct and disjoint from state"})});function m(e){return xo(e.stateDirectory,`headless-${e.channel==="pr"?e.prEnvironment:e.channel}`)}function je(e,l){if($r(l,e))return!1;return!$r(e,l)||E(xo(Io,Po(Yt(e),Yt(l))))}function $r(e,l){let f=Po(Yt(e),Yt(l));return f===""||f!==".."&&!f.startsWith(`..${Io}`)&&!Oo(f)}function te(e){let{proxy:l,userChrome:f,cloudSessions:g,localLogins:w,folders:S,...I}=e;return ui("sha256").update(JSON.stringify(I)).digest("hex")}var pi=4,_i=[2375,2376,9222,9229];function dr(e){let l=new Set(_i);for(let f of e){let g=new URL(f);l.add(Number(g.port||(["https:","wss:"].includes(g.protocol)?443:80)))}return l}function Vr(){throw new r("preview_unavailable","The live Hands preview binding is unavailable or stale.")}var mi=60000;function Ao(e){let l=new AbortController,f=new Map,g=(x)=>JSON.stringify([x.jobId,x.port]);function w(x){let M=e.authority.owner;if(l.signal.aborted||!e.isCurrent()||e.expiresAtMs<=Date.now()||x.organization_id!==M.organization_id||x.user_id!==M.user_id||x.device_id!==M.device_id)Vr()}function S(x){let M;try{M=e.environment.current()}catch{return null}return M.binding.target_generation===x.generation&&M.binding.target_fence_id===x.fenceId&&M.run_id===e.runId&&M.device_id===e.authority.owner.device_id&&M.root_id===e.authority.rootId?M:null}async function I(x,M,G){let F=await W(x,M,G);if(F!=="moved")return F;let T=await W(x,M,G);return T==="moved"?null:T}async function W(x,M,G){try{w(e.authority.owner);let F=e.identity();if(!F||G.aborted||x.expiresAtMs<=Date.now()||x.expiresAtMs>e.expiresAtMs)return null;let T=M.opened,re=T!==void 0&&F.generation>T.generation,J=S(F);if(re){if(J){if(J.revision<=T.revision||x.expiresAtMs>Date.parse(J.expires_at)||J.binding.target_revision!==T.attachmentRevision||J.binding.root_grant_revision!==T.grantRevision)return null;M.recoveringSinceMs=void 0}else if(Date.now()-(M.recoveringSinceMs??=Date.now())>mi)return null}else if(!J||x.expiresAtMs>Date.parse(J.expires_at)||T&&(F.generation!==T.generation||F.fenceId!==T.fenceId))return null;let z=await e.inspect(x.jobId,G),fe=e.identity(),ke=fe&&S(fe);w(e.authority.owner);let be=J&&{generation:F.generation,fenceId:F.fenceId,snapshotId:J.snapshot_id,revision:J.revision,attachmentRevision:J.binding.target_revision,grantRevision:J.binding.root_grant_revision},Re=re?T:be;if(G.aborted||!fe)return null;if(fe.generation!==F.generation||fe.fenceId!==F.fenceId||ke?.snapshot_id!==J?.snapshot_id||ke?.revision!==J?.revision)return"moved";let Fe=z.ok&&z.job.environmentSnapshotId!==void 0&&z.job.environmentRevision!==void 0?{snapshotId:z.job.environmentSnapshotId,revision:z.job.environmentRevision}:null;if(!z.ok||z.generation!==F.generation||!Re||!Fe)return null;if((Fe.snapshotId!==Re.snapshotId||Fe.revision!==Re.revision)&&(re||!e.environment.carried(Fe.snapshotId,Fe.revision)))return null;if(!T&&F.generation===x.generation&&F.fenceId===x.fenceId)M.opened={...Re,...Fe};return{executorLaunchId:e.executorLaunchId,job:z.job,binding:{organizationId:e.authority.owner.organization_id,userId:e.authority.owner.user_id,deviceId:e.authority.owner.device_id,rootId:e.authority.rootId,runId:e.runId,attachmentRevision:Re.attachmentRevision,grantRevision:Re.grantRevision,generation:Re.generation,fenceId:Re.fenceId,jobId:z.job.jobId,port:x.port,expiresAtMs:x.expiresAtMs}}}catch{return null}}return{async open(x,M,G){w(M);let{binding:F,deviceRelayUrl:T}=at(x);if(G.aborted||F.expiresAtMs<=Date.now()||F.expiresAtMs>Date.now()+p.lifetimeMs||new URL(T).origin!==e.authority.relayOrigin)Vr();let re=g(F),J=f.get(re);if(J){if(!He(J.binding,F)||J.relay!==T)Vr();if(await J.opened,!await Dt(()=>J.port.check())||G.aborted||J.abort.signal.aborted)Vr();return{opened:!0,binding:F}}if(f.size>=pi)Vr();let z=new AbortController,fe={},ke=we({binding:F,deniedPorts:e.authority.deniedPorts,readCurrentJob:()=>I(F,fe,z.signal)}),be=()=>z.abort();if(G.addEventListener("abort",be,{once:!0}),l.signal.addEventListener("abort",be,{once:!0}),G.aborted||l.signal.aborted)be();let Re=_e({binding:F,deviceRelayUrl:T,port:ke,signal:z.signal}),Fe={binding:F,relay:T,abort:z,port:ke,opened:Re};f.set(re,Fe);let Ye=()=>{if(G.removeEventListener("abort",be),l.signal.removeEventListener("abort",be),f.get(re)===Fe)f.delete(re)};try{if((await Re).closed.then(Ye),G.removeEventListener("abort",be),w(M),z.signal.aborted||!await Dt(()=>ke.check()))Vr();return{opened:!0,binding:F}}catch{z.abort(),Ye(),Vr()}},async close(x,M){w(M);let{binding:G}=Yi(x),F=f.get(g(G));if(!F||!He(F.binding,G))Vr();return F.abort.abort(),await F.opened.then((T)=>T.closed,()=>{return}),{closed:!0,binding:G}},dispose(){l.abort();for(let x of f.values())x.abort.abort();f.clear()}}}import{WebSocket as xn}from"ws";var To=(e)=>("data"in e)?e.data.length:e.bytes,Co=2*Ze;function cr(e){throw new r(e,"The bound Hands terminal is unavailable or its outcome is unconfirmed.")}var mt=(e)=>!["starting","running"].includes(e.state);function Hi(e,l,f=Date.now()){let g=["relay_url","session_id","expires_at","cols","rows","pty","workspace"];if(Object.keys(e).length!==g.length||Object.keys(e).some((M)=>!g.includes(M))||!ae(l)||!ae(e.session_id)||typeof e.expires_at!=="string"||typeof e.relay_url!=="string"||e.relay_url.length>4096||![e.cols,e.rows].every((M)=>Number.isSafeInteger(M)&&Number(M)>=1&&Number(M)<=Se))cr("invalid_pty_request");let w=e.pty;if(!w||typeof w!=="object"||Array.isArray(w))cr("invalid_pty_request");let S=w;if(Object.keys(S).length!==2||S.version!==1||!ce(S.jobId))cr("invalid_pty_request");let I;try{I=new URL(e.relay_url)}catch{return cr("invalid_pty_request")}if(!["ws:","wss:"].includes(I.protocol)||I.username||I.password||I.hash||I.protocol==="ws:"&&!["127.0.0.1","[::1]","localhost"].includes(I.hostname))cr("invalid_pty_request");let W=Date.parse(e.expires_at);if(!Number.isSafeInteger(W)||W<=f)cr("invalid_pty_request");return{workspace:H(e.workspace)??cr("invalid_pty_request"),session:{jobId:S.jobId,sessionId:e.session_id,operationId:l,relayUrl:I.href,cols:Number(e.cols),rows:Number(e.rows),leaseExpiresAtMs:Math.min(W,f+43200000)}}}async function Ho(e){let{session:l,binding:f}=e;if(f.assertCurrent(),e.signal.aborted||Date.now()>=l.leaseExpiresAtMs)cr("cancelled");let g=new xn(l.relayUrl,{followRedirects:!1,perMessageDeflate:!1,maxPayload:ne}),w=new AbortController,S=()=>{},I=()=>{w.abort(),S()};e.signal.addEventListener("abort",I,{once:!0});let W=setTimeout(I,Math.max(1,l.leaseExpiresAtMs-Date.now())),x=[],M=0,G=0,F=0,T=!1,re=!1,J=!1,z,fe,ke,be=(le)=>{ke=new r(le,"Bound terminal input was refused."),I()};g.on("error",()=>be("pty_relay_unavailable")),g.on("close",I),g.on("message",(le,he)=>{if(w.signal.aborted)return;if(!re){be("pty_not_ready");return}let xe=Array.isArray(le)?Buffer.concat(le):le instanceof ArrayBuffer?Buffer.from(le):le;if(xe.length===0)return;let Ge=x.at(-1),Le=he&&Ge!==void 0&&"data"in Ge&&Ge.data.length+xe.length<=ne;if(xe.length>ne||M+xe.length>Bn){be("pty_input_backpressure");return}if(Le)Ge.data=Buffer.concat([Ge.data,xe]);else if(he)x.push({data:Buffer.from(xe)});else try{let Be=JSON.parse(xe.toString("utf8"));if(Be&&Be.t==="close"&&Object.keys(Be).length===1){J=!0,I();return}if(!Be||Be.t!=="resize"||Object.keys(Be).length!==3||![Be.cols,Be.rows].every((Ee)=>Number.isSafeInteger(Ee)&&Ee>=1&&Ee<=Se))throw Error("invalid_control");x.push({cols:Be.cols,rows:Be.rows,bytes:xe.length})}catch{be("invalid_pty_control");return}M+=xe.length,S()});function Re(le){return jn(JSON.stringify({...f.scope,version:1,sessionId:l.sessionId,operationId:l.operationId,job:{...le,output:[],pty:le.pty?{...le.pty,output:[]}:void 0}}))}function Fe(le){if(!le.ok)cr(le.error);let he=le.job;if(le.generation!==f.scope.generation||he.jobId!==l.jobId||!he.pty||he.leaseExpiresAtMs>l.leaseExpiresAtMs||he.process&&he.process.executorLaunchId!==f.scope.executorLaunchId||he.process&&fe&&(he.process.pid!==fe.pid||he.process.processGroupId!==fe.processGroupId)||he.state!=="starting"&&(he.environmentRevision!==f.environment.revision||he.environmentSnapshotId!==f.environment.snapshotId))cr("pty_binding_changed");if(Re(he),he.process)fe??={...he.process};return he}async function Ye(le){f.assertCurrent();let he=await f.request(le,w.signal);if(f.assertCurrent(),w.signal.aborted)cr("cancelled");let xe=Fe(he);if(xe.inputSequence!==G)cr("job_input_sequence");if(!mt(xe)&&xe.leaseExpiresAtMs<=Date.now())cr("pty_binding_changed");return xe}function ye(le){if(f.assertCurrent(),w.signal.aborted||g.readyState!==xn.OPEN||g.bufferedAmount+Buffer.byteLength(le)>Co)cr("pty_output_backpressure");g.send(le)}function We(le){if(le.firstCursor>F+1)F=le.firstCursor-1;for(let he of le.pty.output){if(he.cursor<=F)continue;if(he.cursor!==F+1)cr("pty_output_gap");let xe=Buffer.from(he.dataBase64,"base64");if(g.bufferedAmount+xe.length>Co)return!1;ye(xe),F=he.cursor}if(F!==le.nextCursor)cr("pty_output_gap");return!0}async function qe(le,he){let xe;try{await Promise.race([e.emit(le,he),new Promise((Ge,Le)=>{xe=setTimeout(()=>Le(new r("pty_event_unavailable","Terminal metadata delivery timed out.")),2000)})])}finally{clearTimeout(xe)}}async function Te(){let le=AbortSignal.timeout(Gt),he=f.request({jobId:l.jobId,action:"cancel",input:{}},le),xe,Ge=new Promise((Le,Be)=>{if(xe=()=>Be(new r("pty_cleanup_unconfirmed","Terminal cleanup acknowledgement was not observed within authority.")),le.addEventListener("abort",xe,{once:!0}),le.aborted)xe()});try{let Le=await Promise.race([he,Ge]);if(le.aborted)cr("pty_cleanup_unconfirmed");return Fe(Le)}finally{le.removeEventListener("abort",xe)}}try{await new Promise((Le,Be)=>{let Ee=setTimeout(()=>{I(),Be(new r("pty_relay_unavailable","Terminal pairing timed out."))},5000),Me=()=>{clearTimeout(Ee),Be(new r("cancelled","Terminal pairing was cancelled."))};if(w.signal.addEventListener("abort",Me,{once:!0}),g.once("open",()=>{clearTimeout(Ee),w.signal.removeEventListener("abort",Me),Le()}),w.signal.aborted)Me()}),f.assertCurrent(),T=!0,z=await Ye({jobId:l.jobId,action:"start",input:{mode:"pty",cols:l.cols,rows:l.rows,leaseExpiresAtMs:l.leaseExpiresAtMs}});let le=Date.now()+5000;while(z.state==="starting"){if(Date.now()>=le)cr("pty_not_ready");await new Promise((Le)=>setTimeout(Le,25)),z=await Ye({jobId:l.jobId,action:"inspect",input:{after:F}})}if(z.state!=="running"||z.inputSequence!==0||z.leaseExpiresAtMs<=Date.now())cr("pty_not_ready");await qe("pty.ready",Re(z)),re=!0,ye(JSON.stringify({t:"open",cols:z.pty.cols,rows:z.pty.rows,receipt:Re(z)}));let he=!1,xe=0,Ge=!1;while(!w.signal.aborted){let Le=z.firstCursor>F+1,Be=We(z);if(mt(z)){if(Be)break}else if(Le)he=!0;else if(he&&Be&&Date.now()>=xe){he=!1,xe=Date.now()+1000;let{cols:Me,rows:or}=z.pty;for(let sr of[{cols:Me,rows:or>1?or-1:2},{cols:Me,rows:or}]){if(mt(z))break;let Ir=++G;if(z=await Ye({jobId:l.jobId,action:"resize",input:{sequence:Ir,...sr}}),z.inputSequence!==Ir)cr("job_input_sequence")}continue}let Ee=mt(z)||Ge?void 0:x.shift();if(Ee){M-=To(Ee);let Me=++G;try{z=await Ye("data"in Ee?{jobId:l.jobId,action:"input",input:{sequence:Me,dataBase64:Ee.data.toString("base64")}}:{jobId:l.jobId,action:"resize",input:{sequence:Me,cols:Ee.cols,rows:Ee.rows}})}catch(or){if(!(or instanceof r)||or.code!=="job_input_backpressure")throw or;G-=1,x.unshift(Ee),M+=To(Ee),Ge=!0;continue}if(z.inputSequence!==Me)cr("job_input_sequence")}else if(await new Promise((Me)=>{let or=setTimeout(Me,Ge||!Be?10:50);if(S=()=>{clearTimeout(or),Me()},w.signal.aborted||!Ge&&x.length)S()}),Ge=!1,S=()=>{},!w.signal.aborted&&Be)try{z=await Ye({jobId:l.jobId,action:"inspect",input:{after:F}})}catch(Me){if(!J||!(Me instanceof r)||Me.code!=="cancelled")throw Me}}}catch(le){ke??=le}finally{if(re=!1,x.length=0,clearTimeout(W),e.signal.removeEventListener("abort",I),I(),T&&(!z||!mt(z)))try{z=await Te()}catch{z=void 0}try{if(!z||!mt(z)||z.pty?.cleanup!=="confirmed")cr("pty_cleanup_unconfirmed");let le=Re(z);if(g.readyState===xn.OPEN)await new Promise((he)=>{let xe=setTimeout(he,500);g.send(JSON.stringify({t:"exit",code:z.exitCode,receipt:le}),()=>{clearTimeout(xe),he()})});await qe("pty.stopped",le)}catch(le){ke??=le}g.terminate()}if(ke)throw ke;if(e.signal.aborted)cr("cancelled");if(!z)cr("pty_cleanup_unconfirmed");return{receipt:Re(z)}}import{createHash as hi,randomUUID as An}from"crypto";import{spawnSync as Wo}from"child_process";import{closeSync as No,constants as Pn,fstatSync as gi,fsyncSync as bi,lstatSync as Bt,mkdirSync as wi,mkdtempSync as Fo,openSync as Lo,readFileSync as yi,readdirSync as zo,realpathSync as Lt,rmSync as In,unlinkSync as vi}from"fs";import{createConnection as ki}from"net";import{dirname as Si,join as nt,sep as Ei}from"path";import{tmpdir as Ri}from"os";var Pr=new Map,qr=new Map;function Kr(e,l){return hi("sha256").update(JSON.stringify([e,l])).digest("hex")}function ht(e){try{wi(e,{mode:448})}catch(f){if(!(f instanceof Error&&("code"in f)&&f.code==="EEXIST"))throw f}let l=Bt(e);if(!l.isDirectory()||l.isSymbolicLink()||!A(l)||Lt(e)!==e)throw new r("hands_jobs_unavailable","Hands job state must be a private canonical directory.")}function xi(e){let l;try{l=Bt(e)}catch(f){if(f instanceof Error&&"code"in f&&f.code==="ENOENT")return!1;throw f}return!l.isDirectory()||l.isSymbolicLink()||zo(e).length>0}function pr(e){let l=Kr(e.root,e.runId),f=e.previousRuntimeDirectories?.find((I)=>xi(nt(I,"jobs",l.slice(0,16))))??e.runtimeDirectory;ht(f);let g=nt(f,"jobs");ht(g);let w=nt(g,l.slice(0,16));if(e.maxScopes!==void 0){let I=zo(g);if(!Number.isSafeInteger(e.maxScopes)||e.maxScopes<1||I.length>e.maxScopes||!I.includes(l.slice(0,16))&&I.length>=e.maxScopes)throw new r("process_journal_capacity","Managed process receipt capacity is full; preserve uncertain jobs and reconcile their existing receipts before starting more work.")}ht(w);let S=Fo(nt(Uo(),"reason-j-"));try{return ht(S),{journalDirectory:w,scopeId:l,launchDirectory:S,socketPath:process.platform==="win32"?`\\\\.\\pipe\\reason-jobs-${An()}`:nt(S,"control.sock"),disposeSocket:()=>In(S,{recursive:!0,force:!0})}}catch(I){throw In(S,{recursive:!0,force:!0}),I}}var Ai=60000,Di=5000;function Ci(e){if(process.platform==="win32")return Ni(e);let l=Wo("ps",["-o","lstart=","-p",String(e)],{encoding:"utf8",timeout:2000,env:{...process.env,LC_ALL:"C",LANG:"C"}}),f=l.status===0?/^\w{3} (\w{3}) +(\d{1,2}) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/.exec(l.stdout.trim()):null,g=f?"JanFebMarAprMayJunJulAugSepOctNovDec".indexOf(f[1]):-1;if(!f||g<0||g%3!==0)return null;let w=new Date(Number(f[6]),g/3,Number(f[2]),Number(f[3]),Number(f[4]),Number(f[5])).getTime();return Number.isFinite(w)?w:null}function Ni(e){let l=Wo(C("powershell"),["-NoProfile","-NonInteractive","-Command",`(Get-Process -Id ${e}).StartTime.ToUniversalTime().ToString('o')`],{encoding:"utf8",timeout:5000,windowsHide:!0,env:Ne()}),f=l.status===0?Date.parse(l.stdout.trim()):Number.NaN;return Number.isFinite(f)?f:null}function $o(e,l={}){let f=nt(e.journalDirectory,"owner.lock"),g;try{g=Lo(f,Pn.O_RDONLY|Pn.O_NOFOLLOW)}catch{return null}try{let w=gi(g);if(!w.isFile()||w.nlink!==1||!A(w)||w.size>4096)return null;let S=null;try{S=JSON.parse(yi(g,"utf8"))}catch{}let I;if(S===null){if((l.now??Date.now)()-w.mtimeMs<Ai)return null;I={reason:"never_written",executorLaunchId:null}}else{let{version:M,scopeId:G,pid:F,createdAtMs:T,executorLaunchId:re}=S;if(M!==1||G!==e.scopeId||typeof re!=="string"||typeof F!=="number"||!Number.isSafeInteger(F)||F<1||F===process.pid||typeof T!=="number"||!Number.isSafeInteger(T))return null;if(!(l.exists??((z)=>{try{return process.kill(z,0),!0}catch(fe){return!(fe instanceof Error&&("code"in fe)&&fe.code==="ESRCH")}}))(F))I={reason:"owner_exited",executorLaunchId:re};else{let z=(l.startedAtMs??Ci)(F);if(z===null||z<=T+Di)return null;I={reason:"pid_reused",executorLaunchId:re}}}let W=Bt(f);if(W.dev!==w.dev||W.ino!==w.ino)return null;vi(f);let x=Lo(e.journalDirectory,Pn.O_RDONLY);try{bi(x)}finally{No(x)}return I}catch{return null}finally{No(g)}}function Ko(e){let l={...e,workspace:e.workspace&&Object.freeze({...e.workspace}),previewAuthority:e.previewAuthority&&Object.freeze({...e.previewAuthority,owner:Object.freeze({...e.previewAuthority.owner}),deniedPorts:new Set(e.previewAuthority.deniedPorts)})},f=Kr(l.root,l.runId);if(Pr.has(f)||l.operationId!==void 0&&qr.has(l.operationId))throw new r("hands_jobs_busy","The Session already has a live Hands job supervisor.");let g={binding:l,key:f,terminals:new Map};if(l.previewAuthority&&l.environment)g.previews=Ao({authority:l.previewAuthority,runId:l.runId,expiresAtMs:l.expiresAtMs,executorLaunchId:l.executorLaunchId,environment:l.environment,isCurrent:()=>Pr.get(g.key)===g,identity:()=>{try{return gt(l)}catch{return null}},inspect:(w,S)=>{if(Pr.get(g.key)!==g)throw new r("preview_unavailable","The Hands supervisor is no longer current.");return Go(l,{jobId:w,action:"inspect",input:{after:0}},S)}});if(Pr.set(f,g),l.operationId!==void 0)qr.set(l.operationId,g);return()=>{if(Pr.get(g.key)===g)Pr.delete(g.key);if(l.operationId!==void 0&&qr.get(l.operationId)===g)qr.delete(l.operationId);g.previews?.dispose();for(let w of g.terminals.values())w.abort()}}var Li=5000,Bi=20;async function zi(e){let l=(w)=>{throw new r("hands_rebind_unavailable",w)};if(!N(e.operationId)||!N(e.runId)||!N(e.fenceId)||!U(e.targetGeneration))l("Reason sent an invalid Hands rebind.");let f=qr.get(e.operationId);if(!f||f.binding.root!==e.root)return l("No live Hands supervisor owns this operation.");for(let w=Date.now()+Li;;){if(e.signal?.aborted)l("The Hands rebind was cancelled.");if(qr.get(e.operationId)!==f)l("The Hands supervisor is no longer current.");let S=null;try{S=gt(f.binding)}catch{}if(S&&S.generation===e.targetGeneration&&S.fenceId===e.fenceId)break;if(S&&S.generation>e.targetGeneration||Date.now()>=w)l("The executor did not adopt this take.");await new Promise((I)=>setTimeout(I,Bi))}if(qr.get(e.operationId)!==f||Pr.get(f.key)!==f)l("The Hands supervisor is no longer current.");let g=Kr(e.root,e.runId);if(f.key===g)return;if(Pr.has(g))l("The taking run already has a live Hands job supervisor.");Pr.delete(f.key);for(let w of f.terminals.values())w.abort();f.key=g,Pr.set(g,f)}function it(e){let l="operationId"in e?qr.get(e.operationId):Pr.get(Kr(e.root,e.runId)),f=l&&l.binding.root===e.root?l.binding:void 0;if(!f?.environment||f.expiresAtMs<=Date.now())throw new r("environment_unavailable","No live Hands supervisor owns this environment.");return f.environment.install(e.payload)}async function qi(e){let l=Pr.get(Kr(e.root,e.runId));if(!l?.previews||!e.owner)throw new r("preview_unavailable","No authenticated Hands supervisor owns this preview.");return l.previews.open(e.payload,e.owner,e.signal)}async function Wi(e){let l=Pr.get(Kr(e.root,e.runId));if(!l?.previews||!e.owner||e.signal.aborted)throw new r("preview_unavailable","No authenticated Hands supervisor owns this preview.");return l.previews.close(e.payload,e.owner)}async function Vi(e){let l=Kr(e.root,e.runId),f=Pr.get(l),g=f?.binding,w=g?.runId,S=g?.previewAuthority,I=g?.environment,W=e.owner&&{...e.owner},x=e.authority&&{...e.authority},M=()=>{throw new r("pty_binding_unavailable","No current authenticated Hands scope owns this terminal.")};if(!f||!g||!S||!I||!W||!x||!g.workspace)return M();let G=Object.freeze({...g.workspace}),F=gt(g),T=I.current(),re=()=>{if(Pr.get(l)!==f||W.organization_id!==S.owner.organization_id||W.user_id!==S.owner.user_id||W.device_id!==S.owner.device_id||e.deviceId!==S.owner.device_id||e.rootId!==S.rootId||O(e.workspace)!==O(G))M();let z=gt(g),fe=I.current();if(z.generation!==F.generation||z.fenceId!==F.fenceId||fe.run_id!==w||fe.device_id!==e.deviceId||fe.root_id!==e.rootId||fe.snapshot_id!==T.snapshot_id||fe.revision!==T.revision||fe.binding.target_generation!==F.generation||fe.binding.target_fence_id!==F.fenceId||x.device_id!==e.deviceId||x.binding!==fe.binding.kind||x.target_revision!==fe.binding.target_revision||x.root_grant_revision!==fe.binding.root_grant_revision||x.target_generation!==F.generation||x.target_fence_id!==F.fenceId)M()};if(re(),new URL(e.session.relayUrl).origin!==S.relayOrigin||f.terminals.has(e.session.jobId)||f.terminals.size>=4)return M();let J=new AbortController;f.terminals.set(e.session.jobId,J);try{return await Ho({session:{...e.session,leaseExpiresAtMs:Math.min(e.session.leaseExpiresAtMs,F.expiresAtMs,Date.parse(T.expires_at))},signal:AbortSignal.any([e.signal,J.signal]),emit:e.emit,binding:{assertCurrent:re,environment:{revision:T.revision,snapshotId:T.snapshot_id},scope:{runId:e.runId,deviceId:e.deviceId,rootId:e.rootId,workspace:G,binding:T.binding.kind,targetRevision:T.binding.target_revision,rootGrantRevision:T.binding.root_grant_revision,generation:F.generation,fenceId:F.fenceId,executorLaunchId:F.executorLaunchId},request:(z,fe)=>hr(F,Ur(JSON.stringify({...z,type:"job",version:2,generation:F.generation,id:An()})),fe)}})}finally{if(f.terminals.get(e.session.jobId)===J)f.terminals.delete(e.session.jobId)}}async function Gi(e){if(ce(e.payload.jobId))throw new r("pty_binding_required","PTY jobs require the bound terminal capability.");let l=Pr.get(Kr(e.root,e.runId))?.binding;if(!l||l.expiresAtMs<=Date.now())throw new r("hands_jobs_unavailable","No live Hands supervisor owns this Session and root.");return Go(l,e.payload,e.signal)}var ji=1e4,Mi=20,Fi=ve/2,Ui=Ke/2,$i=(e)=>e.output.reduce((l,f)=>l+f.text.length,0);async function Go(e,l,f){if(Object.keys(l).some((M)=>!["jobId","action","input","waitForExitMs"].includes(M)))throw new r("invalid_payload","Unexpected job control field.");let{waitForExitMs:g,...w}=l;if(g!==void 0&&(w.action!=="start"||typeof w.input!=="object"||w.input===null||!("script"in w.input)||typeof g!=="number"||!Number.isSafeInteger(g)||g<1||g>ji))throw new r("invalid_payload","Only a script start may wait for its job, within its bound.");let S=(M)=>{let G=gt(e);return hr(G,Ur(JSON.stringify({...M,type:"job",version:2,generation:G.generation,id:An()})),f)},I=await S(w);if(g===void 0)return I;let W=Date.now()+g,x=I;while(x.ok&&["starting","running"].includes(x.job.state)&&x.job.output.length<Fi&&$i(x.job)<Ui&&!f.aborted&&Date.now()<W){if(await new Promise((M)=>setTimeout(M,Math.min(Mi,W-Date.now()))),f.aborted)break;try{let M=await S({jobId:w.jobId,action:"inspect",input:{after:0}});if(!M.ok)break;x=M}catch{break}}return x}function gt(e){if(e.expiresAtMs<=Date.now())throw new r("hands_jobs_unavailable","Hands authority expired.");let l=e.readIdentity?e.readIdentity():e;if(!l||!U(l.generation)||!N(l.fenceId)||l.generation<e.generation||l.generation===e.generation&&l.fenceId!==e.fenceId)throw new r("hands_jobs_unavailable","The live Hands fencing identity could not be verified.");return e.generation=l.generation,e.fenceId=l.fenceId,{...e}}function hr(e,l,f){if(f.aborted)return Promise.reject(new r("cancelled","Job control was cancelled."));return new Promise((g,w)=>{let S=ki(e.socketPath),I="",W=!1,x,M=(F,T)=>{if(W)return;if(W=!0,clearTimeout(x),f.removeEventListener("abort",G),S.destroy(),F)w(F);else g(T)},G=()=>M(new r("cancelled","Job control waiter cancelled; inspect before retrying mutations."));f.addEventListener("abort",G,{once:!0}),S.setEncoding("utf8"),x=setTimeout(()=>M(new r("hands_job_result_unknown","Job control timed out; inspect before retrying mutations.")),Math.min(1e4,Math.max(1,e.expiresAtMs-Date.now()))),S.on("error",()=>M(new r("hands_job_result_unknown","Hands job control connection failed."))),S.once("connect",()=>S.write(JSON.stringify({version:1,scopeId:e.scopeId,fenceId:e.fenceId,executorLaunchId:e.executorLaunchId,request:l})+`
|
|
3
3
|
`)),S.on("data",(F)=>{if(I+=F,Buffer.byteLength(I)>Je)M(new r("hands_job_result_unknown","Hands job result exceeded its bound."))}),S.once("end",()=>{if(Date.now()>=e.expiresAtMs){M(new r("hands_job_result_unknown","Hands authority expired before the result was acknowledged."));return}try{let F=Hr(I.trim());if(F.id!==l.id||F.generation!==e.generation||F.ok&&F.job.jobId!==l.jobId)throw Error("identity");M(void 0,F)}catch{M(new r("hands_job_result_unknown","Hands job response identity or shape was invalid."))}}),S.once("close",()=>{if(!W)M(new r("hands_job_result_unknown","Hands job control closed before an acknowledged result."))})})}function Mo(e){let l=Lt(e.root),f=e.authority,g=Date.parse(e.leaseUntil),w=()=>{if(e.signal.throwIfAborted(),!Number.isFinite(g)||g<=Date.now())throw Error("local_device_gh_lease_expired")};if(w(),f.readOnly&&f.generation===null)return{root:l,readOnly:!0,signal:e.signal,deadlineMs:g,assertCurrent:w};let S=Kr(l,e.runId),I=Pr.get(S),W=I?.binding;if(!W?.environment||!W.workspace||W.localGithubConfinement!==!0)throw Error("local_device_gh_confinement_unavailable");let x=W.environment.current(),M=()=>{w();let F=W.environment.current(),T=gt(W);if(Pr.get(S)!==I||F.github_auth!=="local_gh"||F.run_id!==W.runId||f.runId!==e.runId||F.device_id!==f.deviceId||F.root_id!==f.rootId||String(F.binding.root_grant_revision)!==f.rootRevision||F.binding.target_generation!==f.generation||F.binding.target_fence_id!==f.fenceId||T.generation!==f.generation||T.fenceId!==f.fenceId||F.snapshot_id!==x.snapshot_id||F.revision!==x.revision)throw Error("local_device_gh_authority_changed")};M();let G=ie(l,W.workspace);return{root:G.boundary,signal:e.signal,deadlineMs:g,privateDirectory:Si(W.environment.path),repoPath:G.path,readOnly:f.readOnly,forbiddenSecretValues:Object.values(x.variables),secretNames:(F)=>Object.entries(x.variables).filter(([,T])=>T.trim()===F.trim()).map(([T])=>`variable ${T}`),assertCurrent:M}}async function Ki(e,l){let f=Pe.parse(e.request),g=oe.parse(e.authority);if(g.contributorRefresh&&f.kind==="read"&&g.readOnly)return l(Mo(e));let w=Boolean(g.contributorRefresh);if(w&&(g.merge||f.kind!=="pr_mutation"||f.mutation.action!=="edit"||typeof f.mutation.body!=="string"||f.mutation.title!==void 0||f.mutation.base!==void 0||g.readOnly||g.runId!==e.runId||g.repoFullName!==f.repoFullName))throw Error("local_device_gh_contributor_refresh_authority_invalid");if(f.kind!=="pr_merge"&&!w){if(g.merge)throw Error("local_device_gh_merge_authority_invalid");return l(Mo(e))}if(!w&&(!g.merge||g.readOnly||g.runId!==e.runId||g.repoFullName!==f.repoFullName||g.merge.source==="agent"&&(g.generation===null||g.fenceId===null)))throw Error("local_device_gh_merge_authority_invalid");let S=Lt(e.root),I=Bt(S),W=Date.parse(e.leaseUntil);if(!Number.isFinite(W)||W<=Date.now())throw Error("local_device_gh_lease_expired");let x=Lt(Ri());if(x===S||x.startsWith(S+Ei))throw Error("local_device_gh_private_scope_unavailable");let M=Fo(nt(x,"reason-gh-merge-"));try{ht(M);let G=()=>{if(e.signal.throwIfAborted(),Date.now()>=W)throw Error("local_device_gh_lease_expired");let F=Bt(e.root);if(F.isSymbolicLink()||F.dev!==I.dev||F.ino!==I.ino||Lt(e.root)!==S)throw Error("local_device_gh_authority_changed");ht(M)};return G(),await l({root:S,readOnly:!1,privateDirectory:M,forbiddenSecretValues:[],signal:e.signal,deadlineMs:W,assertCurrent:G})}finally{In(M,{recursive:!0,force:!0})}}var qo=43200000;function bt(e){return Number.isSafeInteger(e)&&Math.abs(e)<=8640000000000000?e:null}function Jo(e){return e!==null&&typeof e==="object"&&!Array.isArray(e)}function Vo(e,l){return Object.keys(e).length===l.length&&l.every((f)=>Object.hasOwn(e,f))}function Ji(e){if(!Jo(e)||!Vo(e,["version","outcome","clock_source","validation_now_ms","expiry_ms","remaining_ms","maximum_lifetime_ms","cli_artifact"])||e.version!==1||e.maximum_lifetime_ms!==43200000||typeof e.outcome!=="string"||!["accepted","parse","noncanonical","expired","over_cap"].includes(e.outcome)||typeof e.clock_source!=="string"||!["date_now","injected"].includes(e.clock_source))return null;for(let g of["validation_now_ms","expiry_ms"]){let w=e[g];if(w!==null&&(typeof w!=="number"||bt(w)===null))return null}if(e.remaining_ms!==null&&(typeof e.remaining_ms!=="number"||!Number.isSafeInteger(e.remaining_ms)))return null;let l=typeof e.expiry_ms==="number"&&typeof e.validation_now_ms==="number"?e.expiry_ms-e.validation_now_ms:null;if(e.remaining_ms!==(l!==null&&Number.isSafeInteger(l)?l:null))return null;if(e.outcome==="parse"&&e.expiry_ms!==null)return null;if(e.outcome!=="parse"&&e.expiry_ms===null)return null;if(e.outcome==="expired"&&!(typeof l==="number"&&l<=0))return null;if(e.outcome==="over_cap"&&!(typeof l==="number"&&l>43200000))return null;if(e.outcome==="accepted"&&!(typeof l==="number"&&l>0&&l<=43200000))return null;let f=e.cli_artifact;if(!Jo(f)||!Vo(f,["kind","status","sha256","observed_at_ms"])||f.observed_at_ms!==null&&(typeof f.observed_at_ms!=="number"||bt(f.observed_at_ms)===null))return null;if(f.kind==="entrypoint_file"){if(f.status!=="observed"||typeof f.sha256!=="string"||!/^[a-f0-9]{64}$/.test(f.sha256)||f.observed_at_ms===null)return null}else if(f.kind!=="unavailable"||f.sha256!==null||typeof f.status!=="string"||!["unsupported_entrypoint","read_failed","file_changed","size_limit","time_limit"].includes(f.status))return null;return e}var Tn=c({kind:s(["workspace_source","mcp_control"]),target_revision:o().int().nonnegative(),root_grant_revision:o().int().positive()}),Yo=new RegExp(st.tokenPattern),Qi=c({token_url:xt().max(2048),request_token:t().min(1).max(8192).regex(Yo),aws_credentials_url:xt().max(2048).nullable()});function Xo(e,l){let f=(g,w)=>{try{let S=new URL(g);return S.origin===new URL(l).origin&&S.pathname===w&&!S.username&&!S.password&&!S.search&&!S.hash}catch{return!1}};if(!Yo.test(e.request_token)||!f(e.token_url,st.tokenPath)||e.aws_credentials_url!==null&&!f(e.aws_credentials_url,st.awsPath))return null;return{REASON_OIDC_TOKEN_URL:e.token_url,REASON_OIDC_REQUEST_TOKEN:e.request_token,...e.aws_credentials_url!==null?{AWS_CONTAINER_CREDENTIALS_FULL_URI:e.aws_credentials_url,AWS_CONTAINER_AUTHORIZATION_TOKEN:e.request_token}:{}}}function Zo(e){return new TextEncoder().encode(e).byteLength}function ea(e){return Zo(JSON.stringify(e)+`
|
|
4
4
|
`)}var fr=c({version:n(1),snapshot_id:k(),revision:o().int().positive(),run_id:t().min(1).max(160),device_id:k(),root_id:k(),binding:Tn.extend({target_generation:o().int().positive(),target_fence_id:k()}),expires_at:y.datetime({offset:!0}),variables:ee(t().max(128).regex(It),t().refine((e)=>!e.includes("\x00")&&Zo(e)<=V.valueBytes)).refine((e)=>Object.keys(e).length<=V.variables),github_auth:n("local_gh").optional(),git:c({base_url:xt().max(2048),token:t().min(1).max(4096).regex(/^[A-Za-z0-9._~-]+$/),expires_at:y.datetime({offset:!0})}).nullable(),cloud_access:Qi.optional()}).refine((e)=>e.github_auth!=="local_gh"||e.git===null,"conflicting git authority").refine((e)=>ea(e)<=V.snapshotBytes,"snapshot too large");import{spawn as ra}from"child_process";import{basename as ta,isAbsolute as Eu}from"path";var na=0,Qo=120000,es=15000,oa=65536;function Dn(e=process.execPath,l=process.argv[1]){let f=ta(e),g=(f.startsWith("bun")||f.startsWith("node"))&&typeof l==="string"&&l.length>0;return{command:e,prefix:g?[l]:[]}}function Zi(e={}){let{command:l,prefix:f}=Dn(e.executablePath,e.sourceEntrypoint),g=e.spawnProcess??ra,w=e.now??Date.now,S=null,I=0,W=!1,x=(G)=>{try{G.kill("SIGKILL")}catch{}},M=()=>{if(W)return;if(S&&w()-I<Qo-es)return;if(S){let F=S;S=null,x(F)}let G;try{G=g(l,[...f,"__device","__hands-worker","--handoff-fd",String(na)],{cwd:"/",env:{PATH:process.env.PATH??"/usr/local/bin:/usr/bin:/bin"},shell:!1,stdio:["pipe","ignore","pipe"]})}catch{return}S=G,I=w(),G.on("error",()=>{if(S===G)S=null}),G.once("exit",(F,T)=>{if(S!==G)return;S=null,e.log?.("hands.worker_prespawn_exited",{exit_code:F,exit_signal:T})}),e.log?.("hands.worker_prespawned",{pid:G.pid??null})};return{arm:M,take(G){let F=S;if(!F||W)return null;let T=G.args.at(-1),re=G.options.env,J=G.options.cwd,z=[...f,"__device","__hands-worker","--config"];if(G.command!==l||G.args.length!==z.length+1||z.some((Re,Fe)=>G.args[Fe]!==Re)||typeof T!=="string"||!re||typeof J!=="string"||G.options.shell||JSON.stringify(G.options.stdio)!==JSON.stringify(["ignore","ignore","pipe"]))return null;S=null;let fe=F.stdin,ke={configPath:T,cwd:J,env:Object.fromEntries(Object.entries(re).filter((Re)=>typeof Re[1]==="string"))},be=JSON.stringify(ke);if(F.exitCode!==null||F.signalCode!==null||!fe||fe.destroyed||w()-I>=Qo-es||Buffer.byteLength(be,"utf8")>oa)return x(F),null;return fe.on("error",()=>{return}),fe.end(be),F.once("exit",()=>{M()}),e.log?.("hands.worker_prespawn_taken",{pid:F.pid??null}),F},adopt(G){G.once("exit",()=>{M()})},close(){if(W=!0,S)x(S);S=null}}}import{accessSync as la,constants as ua,statSync as fa}from"fs";import{homedir as pa,tmpdir as _a,userInfo as ma}from"os";import{delimiter as ha,win32 as ga}from"path";var sa=new Set(["ALL_PROXY","BUN_BE_BUN","BUN_OPTIONS","CURL_CA_BUNDLE","GIT_SSL_CAINFO","GRPC_DEFAULT_SSL_ROOTS_FILE_PATH","HTTPS_PROXY","HTTP_PROXY","NO_PROXY","NODE_EXTRA_CA_CERTS","NODE_OPTIONS","NODE_TLS_REJECT_UNAUTHORIZED","REQUESTS_CA_BUNDLE","SSLKEYLOGFILE","SSL_CERT_DIR","SSL_CERT_FILE","all_proxy","http_proxy","https_proxy","no_proxy"]);var ia=["BUN_CONFIG_","BUN_INSPECT","DYLD_","NODE_DEBUG"],aa=new Set(["BUN_INSTALL"]);var ca=/^--(?:max-old-space-size|max-semi-space-size|stack-size)=\d{1,9}$/;function da(e){return(e??"").split(/\s+/).filter(Boolean).every((l)=>ca.test(l.replaceAll("_","-")))}function rs(e){return Object.keys(e).filter((l)=>sa.has(l)&&!(l==="NODE_OPTIONS"&&da(e[l]))||ia.some((f)=>l.startsWith(f))||l.startsWith("BUN_")&&!aa.has(l)).sort()}var ba=new Set(["HOME","PATH","PWD","OLDPWD","SHLVL","_","TMPDIR","TMP","TEMP","SHELL","BASH_ENV","ENV","ZDOTDIR","PROMPT_COMMAND","IFS","CDPATH","GLOBIGNORE","SHELLOPTS","BASHOPTS","NODE_PATH"]),wa=/^(?:ARA_|REASON_|PI_|GIT_|GH_|GITHUB_|LD_|DYLD_|BUN_|BASH_FUNC_|SSH_)/,ya=/TOKEN|SECRET|PASSW|PASSPHRASE|CREDENTIAL|API_?KEY|ACCESS_?KEY|PRIVATE_?KEY|AUTH/i,va=/^[A-Za-z_][A-Za-z0-9_]*$/;function mr(e=process.env){let l=(w)=>{if(!(process.platform==="win32"?ga.isAbsolute(w):w.startsWith("/"))||/[\0\r\n]/.test(w)||w.length>32768)throw Error("invalid_host_execution_environment");return w};if(e.PATH!==void 0&&(/[\0\r\n]/.test(e.PATH)||e.PATH.length>32768))throw Error("invalid_host_execution_environment");let f=new Set(rs(e)),g=Object.fromEntries(Object.entries(e).filter((w)=>{let[S,I]=w;return typeof I==="string"&&I.length<=32768&&!I.includes("\x00")&&S.length<=128&&va.test(S)&&!f.has(S)&&!ba.has(S)&&!wa.test(S)&&!ya.test(S)}).sort(([w],[S])=>w.localeCompare(S)).slice(0,512));return{home:l(e.HOME||(process.platform==="win32"?e.USERPROFILE:void 0)||pa()),path:((w)=>process.platform==="win32"?vn(w):w)(kr(e.PATH??"").join(ha)||xr),temporaryDirectory:l(e.TMPDIR||e.TMP||e.TEMP||_a()),variables:g}}function gr(e=process.env,l=()=>ma().shell){if(process.platform==="win32")return se();let f=(w)=>{if(!w||!/^\/[A-Za-z0-9._/-]*\/(?:bash|zsh)$/.test(w))return!1;try{return la(w,ua.X_OK),fa(w).isFile()}catch{return!1}};if(f(e.SHELL))return e.SHELL;let g;try{g=l()}catch{g=void 0}return f(g)?g:"/bin/zsh"}import{readdir as ka}from"fs/promises";var Sa=15000;function hn(e){let l=e instanceof Error&&"code"in e?e.code:null;return l==="EPERM"||l==="EACCES"}function fn(e){return new r("folder_access_denied",`macOS blocked Reason from opening ${e}. Allow Reason in System Settings \u203A Privacy & Security \u203A Files and Folders `+"(or Full Disk Access), then try again.")}async function ts(e,{timeoutMs:l=Sa,open:f=(g)=>ka(g)}={}){let g,w=new Promise((S)=>{g=setTimeout(()=>S("pending"),l)});try{if(await Promise.race([f(e).then(()=>"open"),w])==="pending")throw new r("folder_access_pending",`macOS is asking whether Reason may open ${e}. Answer the prompt on this Mac, then try again.`)}catch(S){if(hn(S))throw fn(e);if(S instanceof r)throw S}finally{clearTimeout(g)}}import{chmodSync as rc,closeSync as tc,constants as $n,fstatSync as nc,lstatSync as vs,openSync as oc,readSync as sc,realpathSync as Kn,unlinkSync as ic}from"fs";import{lookup as ac}from"dns/promises";import{createRequire as cc}from"module";import{request as dc}from"http";import{request as lc}from"https";import dt from"net";import{platform as Os}from"os";import{basename as uc,extname as fc,isAbsolute as ks,relative as Gn,resolve as vt,sep as Jn}from"path";var ns=String.raw`
|
|
5
5
|
async (roots) => {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var er={name:"github-native-engineer-device-worker-production",version:"0.2.
|
|
2
|
+
var er={name:"github-native-engineer-device-worker-production",version:"0.2.419",private:!0,type:"module",engines:{node:">=22",bun:">=1.3.0"},workspaces:["../../packages/runtime-distribution"],dependencies:{"@anthropic-ai/sandbox-runtime":"^0.0.73","@earendil-works/pi-tui":"1.0.0","@modelcontextprotocol/sdk":"^1.29.0","@reason/runtime-distribution":"workspace:*","playwright-core":"1.60.0",zod:"^4.4.3"},overrides:{"@hono/node-server":"^1.19.15","@earendil-works/pi-agent-core":"1.0.0","@earendil-works/pi-ai":"1.0.0","@earendil-works/pi-coding-agent":"1.0.0","@earendil-works/chord":"1.0.0","@earendil-works/pi-codemode":"1.0.0","@earendil-works/pi-mcp":"1.0.0","@earendil-works/pi-telemetry":"1.0.0","@earendil-works/pi-tui":"1.0.0","brace-expansion":"2.1.7",axios:"^1.20.0","basic-ftp":"^6.2.1","@grpc/grpc-js":"^1.14.5",browserslist:"^4.28.8","engine.io":"^6.6.7","fast-uri":"^3.1.8",hono:"^4.13.7","ip-address":"^10.7.1",nanoid:"^3.3.18",dompurify:"^3.4.17",postcss:"^8.5.23",qs:"^6.16.0","shell-quote":"^1.11.0","socket.io-parser":"^4.2.7",tmp:"^0.2.7",toml:"^4.2.0",undici:"^8.10.2",ws:"^8.21.0","js-yaml":"^4.3.2","@modelcontextprotocol/sdk":"^1.31.0","proxy-addr":"^2.0.8","source-map-js":"^1.2.2"}};
|
|
3
3
|
export{er};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{ct,Lt,Cr,Sn,Ar,En,xn,kn}from"./vm-hands-entry-lite-bx5zy5bd.js";import{Pe,ir,Qn,yt,No,oe,Lo,Mo,et,Te,rn,ti,bt,Re,vt,ni,ii,oi,si,ai,ci,li,ui,di,pi,hi,fi,mi,gi,_i,pe,Y,Oe,q,yi,wi,bi,vi,Si,Ei,xi,ki,St,Ci}from"./vm-hands-entry-lite-4vks5phw.js";import{ue,Z,O}from"./vm-hands-entry-lite-3krzmhkk.js";import{P,Wt}from"./vm-hands-entry-lite-tdgtpx8e.js";import{dr,Hi,zi,it,qi,Wi,Vi,Gi,Ki,Ji,fr,mr,gr,hn,fn,_r,Xi,mn,yr,me,ge,Rt,wr,vr,Ot}from"./vm-hands-entry-lite-
|
|
2
|
+
import{ct,Lt,Cr,Sn,Ar,En,xn,kn}from"./vm-hands-entry-lite-bx5zy5bd.js";import{Pe,ir,Qn,yt,No,oe,Lo,Mo,et,Te,rn,ti,bt,Re,vt,ni,ii,oi,si,ai,ci,li,ui,di,pi,hi,fi,mi,gi,_i,pe,Y,Oe,q,yi,wi,bi,vi,Si,Ei,xi,ki,St,Ci}from"./vm-hands-entry-lite-4vks5phw.js";import{ue,Z,O}from"./vm-hands-entry-lite-3krzmhkk.js";import{P,Wt}from"./vm-hands-entry-lite-tdgtpx8e.js";import{dr,Hi,zi,it,qi,Wi,Vi,Gi,Ki,Ji,fr,mr,gr,hn,fn,_r,Xi,mn,yr,me,ge,Rt,wr,vr,Ot}from"./vm-hands-entry-lite-34z9890s.js";import{D,R,b}from"./vm-hands-entry-lite-beyyy1gz.js";import{Bi,Fi,dn,ji,pn,Ui,nt,ur}from"./vm-hands-entry-lite-wmynasc4.js";import{K}from"./vm-hands-entry-lite-hk6trmwa.js";import{ze}from"./vm-hands-entry-lite-s5qkb1fk.js";import{j}from"./vm-hands-entry-lite-pf5qtbj5.js";import{Er,wn,no}from"./vm-hands-entry-lite-vpz54vwj.js";import{bo,vo,ft,So,Eo,xo,ko,Co}from"./vm-hands-entry-lite-jzz73e3f.js";import{Rr,jt,Or,Dn,Nn}from"./vm-hands-entry-lite-nzmkyezg.js";import{$t,qe,Bt}from"./vm-hands-entry-lite-ewxc9m4d.js";import{In,x,co}from"./vm-hands-entry-lite-w8ykfw5h.js";import{yo,wo}from"./vm-hands-entry-lite-09sq8090.js";import{Mt,Cn,An}from"./vm-hands-entry-lite-p9v963ks.js";import{ye,Qi,eo}from"./vm-hands-entry-lite-s4bharcb.js";import{be}from"./vm-hands-entry-lite-yretc2th.js";import{Nt}from"./vm-hands-entry-lite-np07qyeq.js";import{ke,Zt,Xt,Yt,E}from"./vm-hands-entry-lite-dk79tnax.js";import{a,ie}from"./vm-hands-entry-lite-jev771b3.js";import{t,k,o,d,u,i,W,_,ee,s,n,Fo}from"./vm-hands-entry-lite-avc65bd7.js";import{fe,Le,Me,$e,sn}from"./vm-hands-entry-lite-6c67a3jc.js";import{Be}from"./vm-hands-entry-lite-zp6naptr.js";import{r}from"./vm-hands-entry-lite-qy9xg6em.js";import{request as Ul}from"http";import{request as Hl}from"https";import{lookup as jl}from"dns/promises";import{isIP as ql}from"net";async function Wl(e){let l=new URL(e.url);return await new Promise((c,p)=>{let m=(l.protocol==="https:"?Hl:Ul)(l,{method:"POST",headers:{...e.headers,"accept-encoding":"identity"},signal:e.signal,timeout:Sn},(f)=>c({response:f,close:()=>{f.destroy(),m.destroy(),f.socket?.destroy()}}));m.once("error",p),m.once("timeout",()=>m.destroy(Object.assign(Error("custom_endpoint_timeout"),{code:"ETIMEDOUT"}))),m.end(e.body)})}var os=new Set(["ENOTFOUND","EAI_AGAIN","EAI_NONAME","EAI_NODATA","EAI_FAIL","DNSException"]),Gl=new Set(["ECONNREFUSED","ETIMEDOUT","ECONNRESET","EHOSTUNREACH","ENETUNREACH","EHOSTDOWN","ENETDOWN","EPIPE","ECONNABORTED","EADDRNOTAVAIL","ConnectionRefused","ConnectionClosed","ConnectionTimedOut","Timeout"]);function is(e,l=0){if(!e||typeof e!=="object"||l>3)return null;let c=e.code;if(typeof c==="string"){if(os.has(c))return"custom_endpoint_host_not_found";if(Gl.has(c))return"custom_endpoint_connection_failed";if(/^(?:ERR_TLS_|ERR_SSL_|CERT_|UNABLE_TO_(?:GET|VERIFY|DECRYPT)|DEPTH_ZERO_SELF_SIGNED|SELF_SIGNED_CERT|HOSTNAME_MISMATCH|EPROTO$)/.test(c))return"custom_endpoint_tls_failed"}for(let p of[...e instanceof AggregateError?e.errors:[],e.cause]){let m=is(p,l+1);if(m)return m}return null}async function zl(e,l){let c=is(e),p=new URL(l).hostname.replace(/^\[|\]$/g,"");if(c!==null&&c!=="custom_endpoint_connection_failed"||ql(p)!==0)return c;let m;return await Promise.race([jl(p).then(()=>!0,(h)=>!os.has(String(h?.code))),new Promise((h)=>{m=setTimeout(()=>h(!0),5000)})]).finally(()=>clearTimeout(m))?c:"custom_endpoint_host_not_found"}function Vl(e){for(let l=42;;l++){if(l===127)l=256;let c=String.fromCodePoint(l);if(!e.includes(c))return c}}function Kl(e,l){let c=Buffer.from(e),p=Buffer.from(l),m=new Uint32Array(c.length);for(let h=1,y=0;h<c.length;h++){while(y&&c[h]!==c[y])y=m[y-1];if(c[h]===c[y])y++;m[h]=y}let f=0;return(h,y=!1)=>{let S=Buffer.allocUnsafe(h.length*p.length+f),w=0;for(let g of h){while(f&&c[f]!==g){let v=m[f-1];w+=c.copy(S,w,0,f-v),f=v}if(c[f]===g){if(f++,f===c.length)w+=p.copy(S,w),f=0}else S[w++]=g}if(y)w+=c.copy(S,w,0,f),f=0;return S.subarray(0,w)}}async function ss(e){e.signal.throwIfAborted();let l=En.safeParse(e.payload);if(!l.success)throw new r("custom_endpoint_invalid_request","Invalid local model request.");let c=l.data,p=xn.parse(await e.credential(e.signal));if(!Ar(c,{baseUrl:c.baseUrl,api:p.api,execution:"device"}))throw new r("custom_endpoint_invalid_request","The request does not match the configured API.");e.signal.throwIfAborted();let m,f,h=0,y=0,S=0,w=Vl(p.apiKey),g=Kl(p.apiKey,w),v=async(A,I)=>{e.signal.throwIfAborted(),await new Promise((M,N)=>{let L=()=>{e.signal.removeEventListener("abort",L),N(e.signal.reason)};if(e.signal.addEventListener("abort",L,{once:!0}),e.signal.aborted){L();return}Promise.resolve().then(()=>(e.signal.throwIfAborted(),e.emit(A,I))).then(()=>{e.signal.removeEventListener("abort",L),M()},(B)=>{e.signal.removeEventListener("abort",L),N(B)})})},C=async(A)=>{if(h+=A.length,h>Lt)throw new r("custom_endpoint_response_too_large","Local model response exceeds the transport limit.");for(let I=0;I<A.length;I+=ct){if(S>=Cr)throw new r("custom_endpoint_response_too_large","Local model response exceeds the chunk limit.");await v(`custom_endpoint.chunk.${S++}`,{eof:!1,data:A.subarray(I,I+ct).toString("base64")})}};try{let A=await Wl({url:c.url,body:c.body,signal:e.signal,headers:{...c.headers,...p.api==="anthropic-messages"?{"x-api-key":p.apiKey}:{authorization:`Bearer ${p.apiKey}`}}});m=A.response,f=A.close;let I=m.statusCode??500;if(I>=300&&I<400)throw new r("custom_endpoint_redirect_refused","Local model redirects are not followed.");if(m.headers["content-encoding"]&&m.headers["content-encoding"]!=="identity")throw new r("custom_endpoint_encoding_unsupported","The local server must honor identity encoding.");let M={};for(let N of["content-type","retry-after","x-request-id","request-id"]){let L=m.headers[N];if(typeof L==="string")M[N]=L.replaceAll(p.apiKey,w).slice(0,4096)}await v("custom_endpoint.headers",{status:I,statusText:(m.statusMessage??"").replaceAll(p.apiKey,w).slice(0,256),headers:M});for await(let N of m){e.signal.throwIfAborted();let L=Buffer.isBuffer(N)?N:Buffer.from(N);if(y+=L.length,y>Lt)throw new r("custom_endpoint_response_too_large","Local model response exceeds the transport limit.");await C(g(L))}return await C(g(Buffer.alloc(0),!0)),await v(`custom_endpoint.chunk.${S}`,{eof:!0}),{bytes:h,chunks:S}}catch(A){if(e.signal.throwIfAborted(),A instanceof r)throw A;throw new r((m?null:await zl(A,c.url))??"custom_endpoint_request_failed","The local model server could not complete the request.")}finally{f?.()}}import{join as as}from"path";function Yl(e,l){return e===as(l,".ara","workspace")||e===as(l,".reason","workspace")}function ls(e,l){let c=e.filter((p)=>Yl(p.path,l));return c.length===1?c[0].path:null}var Xl=/^[a-f0-9]{64}$/;var gn=32,Jl=/^\/[^\x00-\x1f\x7f\\]*$/;function kr(e){if(typeof e!=="string"||e.length>4096||!Jl.test(e))return!1;if(e==="/")return!0;return e.split("/").slice(1).every((l)=>l!==""&&l!=="."&&l!=="..")}function Tr(e,l){let c=l==="win32"?/^([A-Za-z]):[\\/]*(.*)$/.exec(e):null;if(!c)return e;let p=c[2].split(/[\\/]+/).filter(Boolean).join("/");return`/${c[1].toUpperCase()}:${p?`/${p}`:""}`}function _n(e){if(!e||typeof e!=="object"||Array.isArray(e))return;let l=e;if(!kr(l.home)||!Array.isArray(l.roots)||l.roots.length>gn)return;let c=[];for(let p of l.roots){if(!p||typeof p!=="object"||Array.isArray(p))return;let{path_fingerprint:m,path:f}=p;if(typeof m!=="string"||!Xl.test(m)||!kr(f))return;c.push({path_fingerprint:m,path:f})}return{home:l.home,roots:c}}function Zl(e){let l=/^Reason contributor (rc_[0-9a-f]{32})$/.exec(e.name)?.[1];return e.email.toLowerCase()==="343777287+reason-contributors@users.noreply.github.com"&&l?l:void 0}function Ql(e){return Zl(e)??e.email.toLowerCase()}function yn(e){let l=/^Co-authored-by:\s*([^<>\r\n]+) <([^<>\s]+)>$/i.exec(e.trim());return l?Ql({name:l[1],email:l[2]}):e.trim().toLowerCase()}var zt=(e)=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/[a-z]/gi,(l)=>`[${l.toLowerCase()}${l.toUpperCase()}]`),ec=[...ke.map((e)=>`/(${e.map(zt).join("/")})(/|$)`),...Zt.map((e)=>`/(${e.map(zt).join("/")})(/|$)`),...[...Xt].map((e)=>`/(${zt(e)})$`),`/${zt(".env.")}[^/]*$`,...Yt.map((e)=>`/[^/]*${zt(e)}$`)],cs=`function localGithubSandboxProfile(root, temporary) {
|
|
3
3
|
return ['(version 1)','(deny default)','(import "system.sb")','(allow process-exec process-fork)',
|
|
4
4
|
'(allow file-read* (subpath "/bin") (subpath "/sbin") (subpath "/usr/bin") (subpath "/usr/sbin") (subpath "/usr/libexec") (subpath "/usr/share") (subpath "/private/var/select") (literal "/private/var/db/xcode_select_link"))',
|
|
5
5
|
'(allow file-read-metadata (path-ancestors "/opt/homebrew/bin") (path-ancestors "/usr/local/bin") (path-ancestors "/Library/Developer/CommandLineTools"))',
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{T}from"./vm-hands-entry-lite-fcvf8md1.js";import{g}from"./vm-hands-entry-lite-aj139v8j.js";import{Wr,qn,Vr,Wn}from"./vm-hands-entry-lite-g4zd2d5n.js";import{Xn,Qt,Oo}from"./vm-hands-entry-lite-
|
|
2
|
+
import{T}from"./vm-hands-entry-lite-fcvf8md1.js";import{g}from"./vm-hands-entry-lite-aj139v8j.js";import{Wr,qn,Vr,Wn}from"./vm-hands-entry-lite-g4zd2d5n.js";import{Xn,Qt,Oo}from"./vm-hands-entry-lite-pcvgqrse.js";import{C}from"./vm-hands-entry-lite-6c67a3jc.js";import{spawnSync as v}from"child_process";import{createHash as ke,randomUUID as Se}from"crypto";import{chmodSync as we,existsSync as P,mkdirSync as $e,readdirSync as Ve,readFileSync as k,renameSync as ye,rmSync as u,statSync as ve,writeFileSync as be}from"fs";import{dirname as We,isAbsolute as q,join as p}from"path";import{spawnSync as de}from"child_process";import{readFileSync as me}from"fs";import{userInfo as D}from"os";import{join as fe}from"path";var ge="REASON_SCHEDULED_TASK";function H(r){return fe(r,"AppData","Local","Reason","Tasks")}function w(r){if(/[\0-\x1f\x7f"%]/.test(r))throw Error(`A background task cannot use a value with a double quote, percent sign or control character: ${r}`);return`'${r.replace(/['\u2018\u2019\u201a\u201b]/g,"$&$&")}'`}function M(r){if(!/^[A-Za-z0-9._-]+$/.test(r))throw Error(`Invalid Windows Scheduled Task name: ${r}`);return`$env:${ge}=${w(r)};`}function K(r){let e=Object.entries(r.environment).map(([t,i])=>{if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(t))throw Error(`Invalid Windows Scheduled Task environment name: ${t}`);return`$env:${t}=${w(i)};`}),n=`$global:LASTEXITCODE=1; & ${[r.program,...r.args].map(w).join(" ")} 2>&1 | ForEach-Object { Add-Content -LiteralPath ${w(r.log)} -Value $_.ToString() -Encoding UTF8 }; $c=$LASTEXITCODE;`;return[M(r.name),...e,"$ErrorActionPreference='Continue';",r.keepAlive?`do { ${n} if ($c) { Start-Sleep -Seconds 10 } } while ($c)`:`${n} exit $c`].join(" ")}function I(r){return r.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function pe(){let r=process.env.USERDOMAIN?.trim();return r?`${r}\\${D().username}`:D().username}function U(r){let e=I(r.user??pe()),n=r.schedule==="logon",t=r.schedule==="logon"?`<LogonTrigger><Enabled>true</Enabled><UserId>${e}</UserId></LogonTrigger>`:`<TimeTrigger><Repetition><Interval>PT${r.schedule.everyMinutes}M</Interval><StopAtDurationEnd>false</StopAtDurationEnd></Repetition><StartBoundary>2026-01-01T00:00:00</StartBoundary><Enabled>true</Enabled></TimeTrigger>`,i=`-NoProfile -NonInteractive -ExecutionPolicy Bypass -WindowStyle Hidden -Command "${r.script}"`;return`<?xml version="1.0" encoding="UTF-16"?>
|
|
3
3
|
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
|
|
4
4
|
<RegistrationInfo>
|
|
5
5
|
<Description>${I(r.description)}</Description>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
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-
|
|
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
3
|
# The native Blaxel image ships no feh, hsetroot or compositor, but it does ship
|
|
4
4
|
# python3-gi and libX11. tint2 reads _XROOTPMAP_ID to draw its transparent panel.
|
|
5
5
|
# Usage: DISPLAY=:99 python3 set-root-wallpaper.py IMAGE
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{We,so,F,Ve,Ft,Tr,x}from"./vm-hands-entry-lite-
|
|
2
|
+
import{We,so,F,Ve,Ft,Tr,x}from"./vm-hands-entry-lite-w8ykfw5h.js";import{K}from"./vm-hands-entry-lite-hk6trmwa.js";import{mt}from"./vm-hands-entry-lite-jzz73e3f.js";import{gt}from"./vm-hands-entry-lite-pcvgqrse.js";import{Jr}from"./vm-hands-entry-lite-09sq8090.js";import{kt,Di}from"./vm-hands-entry-lite-fbhqfzbq.js";import{G,qe}from"./vm-hands-entry-lite-ewxc9m4d.js";import{Ee,Hn}from"./vm-hands-entry-lite-ehthgxsx.js";import{St}from"./vm-hands-entry-lite-4vks5phw.js";import{a}from"./vm-hands-entry-lite-jev771b3.js";import{C}from"./vm-hands-entry-lite-6c67a3jc.js";import{r}from"./vm-hands-entry-lite-qy9xg6em.js";import{spawn as R,spawnSync as tt}from"child_process";import{createHash as ot,randomUUID as me}from"crypto";import{closeSync as rt,copyFileSync as se,existsSync as M,fstatSync as nt,mkdirSync as ie,openSync as st,readdirSync as U,readFileSync as X,readlinkSync as it,renameSync as fe,rmSync as at,statSync as ct,writeFileSync as lt}from"fs";import{connect as ut}from"net";import{tmpdir as L,userInfo as ge}from"os";import{basename as ae,delimiter as dt,dirname as B,join as f}from"path";var z=`import { spawn, execFileSync } from "node:child_process";
|
|
3
3
|
import { createHash, randomUUID } from "node:crypto";
|
|
4
4
|
import { readFileSync, readlinkSync, lstatSync, realpathSync, statSync, mkdtempSync, mkdirSync, chmodSync, writeFileSync, readdirSync, rmSync, openSync, readSync, closeSync, renameSync } from "node:fs";
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{_t}from"./vm-hands-entry-lite-
|
|
2
|
+
import{_t}from"./vm-hands-entry-lite-f1by8av5.js";import{a}from"./vm-hands-entry-lite-jev771b3.js";import{randomUUID as L}from"crypto";import{spawnSync as b}from"child_process";import{chmodSync as ee,cpSync as te,existsSync as x,lstatSync as A,mkdirSync as Y,readdirSync as ne,readFileSync as w,readlinkSync as re,realpathSync as T,renameSync as E,rmdirSync as ie,rmSync as g,symlinkSync as M,writeFileSync as oe}from"fs";import{dirname as I,join as u,relative as se,resolve as ce}from"path";var Xn="so.ara.cli",k=[Xn,"com.reasonmachines.cli"],F="5LJFSBRY2F";function Zr(e){return`(${e.map((t)=>`identifier "${t}"`).join(" or ")}) and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists and certificate leaf[field.1.2.840.113635.100.6.1.13] exists and certificate leaf[subject.OU] = "${F}"`}var G="ReasonBackgroundIdentity",Po="Contents/Helpers/ReasonPermissionTile",ae="so.ara.cli.permission-tile",Ne=Zr([ae,"com.reasonmachines.cli.permission-tile"]),v="AraBackgroundIdentity",ue="Reason",Ce=Zr(k),de=`anchor apple generic and (${k.map((e)=>`identifier "${e}"`).join(" or ")}) and certificate leaf[subject.OU] = "${F}"`;class h extends Error{code;constructor(e,t){super(t);this.code=e;this.name="MacOSBackgroundIdentityError"}}var R="/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister";function le(e=a()){return u(e,"Library","Application Support","Reason","Background","Reason.app")}function O(e=a()){return u(e,"Library","Application Support","Ara","Background","Ara.app")}function fe(e){try{return A(e).isFile()}catch{return!1}}function D(e){return[G,v].map((t)=>u(e,"Contents","MacOS",t)).find(fe)??null}function d(e){try{if(!A(e).isDirectory())return!1;let t=w(u(e,"Contents","Info.plist"),"utf8");return k.some((n)=>t.includes(`<string>${n}</string>`))&&(t.includes(`<string>${ue}</string>`)||t.includes("<string>Ara</string>"))&&D(e)!==null}catch{return!1}}function Xr(e=a()){let t=le(e);if(!d(t))return null;try{let n=w(u(t,"Contents","Info.plist"),"utf8");return/<key>CFBundleVersion<\/key>\s*<string>(\d+\.\d+\.\d+)<\/string>/.exec(n)?.[1]??null}catch{return null}}function pe(e,t=a()){let n=Xr(t);return n===null||j(N(n.split(".")),N(e.split(/[.-]/).slice(0,3)))}var ge=1e4;function K(e,t){return b(e,[...t],{stdio:"ignore",timeout:ge}).status??1}var W=new Set;function H(e){if(process.env.REASON_TEST_REFUSE_REAL_IDENTITY!=="1")return;let t=(n)=>{try{return T(n)}catch{return ce(n)}};if(e!==void 0&&t(e)!==t(a()))return;throw Error("A test tried to change this computer's real Reason background identity; pass a temporary home. Refused by scripts/test-env.ts.")}var V=/\/(?:runtime|CLI)\/versions\/(\d+)\.(\d+)\.(\d+)[^/]*\/[^/]+$|\/\.(?:ara|reason)(?:-staging)?-worker-(\d+)\.(\d+)\.(\d+)[^/]*\/[^/]+$/,J=new Set(["ara","ara.exe","reason","reason.exe"]);function N(e){return e.map((t)=>Number(t))}function j(e,t){for(let n=0;n<3;n+=1)if(e[n]!==t[n])return e[n]<t[n];return!1}var ye=[0,2,161];function me(e){if(e===null)return!0;let t=ye,n=null;try{n=T(process.execPath)}catch{}return e.some((r)=>{let i=V.exec(r);if(i){let f=i[1]===void 0?i.slice(4,7):i.slice(1,4);return j(N(f),t)}let o=r.slice(r.lastIndexOf("/")+1);return J.has(o)&&r!==n&&r!==process.execPath})}function Ee(){let e=b("/bin/ps",["-xo","pid=,comm="],{encoding:"utf8",timeout:5000});if(e.status!==0)return null;let t=[];for(let n of e.stdout.split(`
|
|
3
3
|
`)){let r=/^\s*(\d+)\s+(\S.*)$/.exec(n);if(!r||Number(r[1])===process.pid)continue;let i=r[2].trimEnd(),o=i.slice(i.lastIndexOf("/")+1);if(!V.test(i)&&J.has(o)){let c=b("/usr/sbin/lsof",["-a","-p",r[1],"-d","txt","-Fn"],{encoding:"utf8",timeout:5000}).stdout?.split(`
|
|
4
4
|
`).find((l)=>l.startsWith("n/"));if(c)i=c.slice(1)}t.push(i)}return t}function _e(e){if(H(e.home),!d(e.sourceApp))throw new h("identity_invalid","The packaged Reason background identity is missing or invalid.");let t=e.command??K,n=le(e.home),r=I(n);Y(r,{recursive:!0,mode:448}),ee(r,448);let i=T(e.sourceApp),o=null;try{o=T(n)}catch{}if(i!==o){let f=`${process.pid}.${L()}`,c=u(r,`.Reason.app.${f}.tmp`),l=u(r,`.Reason.app.${f}.old`),y=!1;try{if(te(i,c,{recursive:!0,errorOnExist:!0,preserveTimestamps:!0}),!d(c))throw new h("identity_invalid","The copied Reason background identity is invalid.");let _=e.releaseSigned?["--test-requirement",`=${de}`]:[];if(t("/usr/bin/codesign",["--verify","--strict",..._,c])!==0)throw new h("identity_invalid_signature","The installed Reason background identity has an invalid signature.");let S=!1;for(let p=0;p<4;p+=1){let m=!1;try{E(n,l),m=!0,y=!0}catch(s){if(s.code!=="ENOENT")throw s}if(p===0)e.beforePublish?.();try{E(c,n),S=!0}catch(s){let Z=s.code;if(!["EEXIST","ENOTEMPTY"].includes(Z??""))throw s;if(m)g(l,{recursive:!0,force:!0}),y=!1;if(p===3)throw s;continue}if(m)g(l,{recursive:!0,force:!0}),y=!1;break}if(!S)throw Error("Could not publish Reason's background identity.")}catch(_){if(y&&!x(n)&&x(l))E(l,n);throw _}finally{g(c,{recursive:!0,force:!0}),g(l,{recursive:!0,force:!0})}}return z(n,e,{verified:i!==o}),n}function X(e){return u(I(e),".Reason.app.registered")}function q(e){try{let t=A(e);return t.isDirectory()?`${t.ino}:${t.birthtimeMs}`:null}catch{return null}}function C(e){let t=q(e);try{return t!==null&&w(X(e),"utf8")===t}catch{return!1}}function Q(e){if(d(e))return"bundle";try{if(A(u(e,"Contents","Info.plist"),{throwIfNoEntry:!1}))return null;return A(u(e,"Contents","MacOS",v)).isSymbolicLink()?"retired":null}catch{return null}}function z(e,t,n={}){let r=t.command??K;if(!n.verified&&r("/usr/bin/codesign",["--verify","--strict",e])!==0)throw new h("identity_invalid_signature","The installed Reason background identity has an invalid signature.");if(r(R,["-f",e])!==0)throw new h("identity_register_failed","Could not register Reason's macOS background identity.");let i=q(e);try{if(i)oe(X(e),i,{mode:384})}catch{}try{Se(e,t.home,r,t.runningExecutables??Ee)}catch(o){let f=o.code??"unknown";process.stderr.write(`Reason background identity: legacy_identity_retire_failed (${f})
|
|
5
5
|
`)}}function Se(e,t,n,r){let i=D(e);if(!i)return;let o=O(t),f=I(o),c=(s)=>u(s,"Contents","MacOS",v),l=se(I(c(o)),i),y=`${process.pid}.${L()}`,_=Q(o);if(_===null)return;let S=_==="bundle";if(S)n(R,["-u",o]);let p=u(f,`.Ara.app.${y}.old`);if(!W.has(o)&&!me(r())){if(!S)n(R,["-u",o]);try{E(o,p)}catch(s){if(s.code==="ENOENT")return;throw s}g(p,{recursive:!0,force:!0}),Ie(f);return}if(!S){if(re(c(o))===l)return;let s=`${c(o)}.${y}`;M(l,s);try{E(s,c(o))}finally{g(s,{force:!0})}return}let m=u(f,`.Ara.app.${y}.shim`);Y(I(c(m)),{recursive:!0}),M(l,c(m));try{try{E(o,p)}catch(s){if(s.code==="ENOENT")return;throw s}try{E(m,o)}catch(s){if(x(o))return;throw E(p,o),s}}finally{g(m,{recursive:!0,force:!0}),g(p,{recursive:!0,force:!0})}}function Ie(e){try{if(ne(e).some((n)=>n!==".DS_Store"))return;g(u(e,".DS_Store"),{force:!0}),ie(e)}catch{}}var B=new Map;function Yn(e=a()){let t=B.get(e);if(t)return t;if(process.platform!=="darwin")return[];let n=U(e);if(n===null&&x(I(le(e))))Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,100),n=U(e);if(n===null)return[];return B.set(e,n),n}function U(e){let t=le(e),n=O(e);if(!d(t)||!C(t))try{he({home:e,skipWhenSettled:!0})}catch{}let r=d(t)&&(C(t)||!d(n))?t:d(n)?n:null,i=r?D(r):null;if(!i)return null;if(r===n)W.add(n);let o=b(i,["--can-spawn"],{env:{},timeout:2000,encoding:"utf8"});return o.status===0&&o.stdout===`spawn
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{T}from"./vm-hands-entry-lite-fcvf8md1.js";import{Zr}from"./vm-hands-entry-lite-
|
|
2
|
+
import{T}from"./vm-hands-entry-lite-fcvf8md1.js";import{Zr}from"./vm-hands-entry-lite-pcvgqrse.js";import{dt}from"./vm-hands-entry-lite-5dtfehjv.js";import{a}from"./vm-hands-entry-lite-jev771b3.js";import{A}from"./vm-hands-entry-lite-6c67a3jc.js";import{randomUUID as f}from"crypto";import{chmodSync as U,closeSync as h,constants as g,existsSync as me,fstatSync as F,lstatSync as R,mkdirSync as B,openSync as G,readFileSync as Y,readdirSync as z,readlinkSync as J,realpathSync as P,renameSync as _,rmSync as p,statSync as K,symlinkSync as _t,unlinkSync as M,writeFileSync as L}from"fs";import{basename as vt,dirname as S,isAbsolute as fe,join as c,relative as ge,resolve as b,sep as _e}from"path";import{createRequire as H}from"module";var q=1,j=1,ye=128,ve=65536;var he=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;var D=/^[a-z0-9_.-]{1,80}$/,be=64,Ee="so.ara.device-broker",Me=[Ee,"com.reasonmachines.device-broker"],Pt=Zr(Me);var we=["service.install_started","service.install_completed","service.install_failed","service.launcher_adopted","service.launcher_conflict","service.started","service.reconnecting","service.reconnected","service.idle_sleep_held","service.idle_sleep_released","service.idle_sleep_failed","service.start_failed","service.stopped","service.exit_failed","service.singleton_rejected","credential.migration_started","credential.migration_completed","credential.migration_failed","credential.store_started","credential.store_completed","credential.store_failed","credential.delete_started","credential.delete_completed","credential.delete_failed","update.check_started","update.not_available","update.download_started","update.downloaded","update.verified","update.activated","update.rollback","update.failed","executor.update.check_started","executor.update.not_available","executor.update.download_started","executor.update.downloaded","executor.update.verified","executor.update.activated","executor.update.rollback","executor.update.failed","identity.refresh_completed","identity.refresh_failed","update.device_moved","update.components_installed","update.deferred","update.deferral_expired","worker.previous_exit","worker.capabilities_withheld","identity.computer_use_unavailable"];function X(e){return Boolean(e)&&typeof e==="object"&&!Array.isArray(e)}function W(e,t,n=[]){let r=new Set([...t,...n]);return t.every((i)=>(i in e))&&Object.keys(e).every((i)=>r.has(i))}function E(e){return typeof e==="string"&&he.test(e)}function Z(e){return typeof e==="string"&&!Number.isNaN(Date.parse(e))&&new Date(e).toISOString()===e}function k(e){B(e,{recursive:!0,mode:448}),U(e,448)}function Re(e,t){k(S(e));let n=`${e}.${process.pid}.${f()}.tmp`;try{L(n,t,{mode:384,flag:"wx"}),U(n,384),_(n,e)}finally{if(me(n))M(n)}}function ms(e={}){if((e.platform??process.platform)!=="darwin")throw new dt("unsupported_platform","The managed Reason runtime is currently available only on macOS.");let n=e.environment??process.env,r=T(n,"REASON_CLI_CHANNEL")==="staging",i=r?T(n,"REASON_MANAGED_RUNTIME_ROOT")?.trim():void 0,o=e.root!==void 0||Boolean(i&&fe(i))?null:c(e.home??a(),"Library","Application Support"),d=e.root??(o?c(o,r?"Reason Staging":"Reason","CLI"):i);return{executableName:"reason",root:d,...o?{legacyRoot:c(o,"Ara",...r?["staging","runtime"]:["runtime"])}:{},versions:c(d,"versions"),current:c(d,"current"),previous:c(d,"previous"),brokerLock:c(d,"broker.lock"),transitionLock:c(d,"transition.lock"),lifecycleEvents:c(d,"lifecycle-events")}}function gs(e){let t=e.legacyRoot;if(!t)return null;return{root:t,versions:c(t,"versions"),current:c(t,"current"),previous:c(t,"previous"),brokerLock:c(t,"broker.lock"),transitionLock:c(t,"transition.lock"),lifecycleEvents:c(t,"lifecycle-events")}}function pe(e,t){let n;try{if(!R(e).isSymbolicLink())return null;n=J(e)}catch{return null}let r=n.match(/^versions\/(\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?)\/(ara|Reason|reason)$/);return r&&(r[2]==="ara"||r[2]===t)?r[1]:null}function _s(e){return pe(e.current,e.executableName)}function O(e,t,n){let i=ge(t,e).split(_e);return i.length===2&&E(i[0])&&(i[1]==="ara"||n!==void 0&&i[1]===n)?i[0]:null}function Le(e,t){try{return R(t).isSymbolicLink()&&b(S(t),J(t))===b(e.current)}catch{return!1}}function ys(e,t=process.execPath){try{return O(P(t),P(e.versions),e.executableName)!==null}catch{let n=b(t);return n===b(e.current)||Le(e,n)||O(n,b(e.versions),e.executableName)!==null}}function Ae(e){return X(e)&&W(e,["schema_version","pid","nonce","started_at","runtime_version"])&&e.schema_version===q&&typeof e.pid==="number"&&Number.isSafeInteger(e.pid)&&e.pid>0&&typeof e.nonce==="string"&&/^[0-9a-f-]{36}$/.test(e.nonce)&&Z(e.started_at)&&E(e.runtime_version)}function Q(e,t){try{let n=R(e);if(!n.isDirectory()||!A(n))return null;let r=G(c(e,t),g.O_RDONLY|g.O_NOFOLLOW|g.O_NONBLOCK);try{let i=F(r);if(!i.isFile()||i.nlink!==1||!A(i)||i.size>4096)return null;return Y(r,"utf8")}finally{h(r)}}catch{return null}}function N(e){try{let t=JSON.parse(Q(e,"owner.json")??"null");return Ae(t)?t:null}catch{return null}}function ee(e){try{return process.kill(e,0),!0}catch(t){return!(t instanceof Error&&("code"in t)&&t.code==="ESRCH")}}var C="lease",Ne=2,Se=4,y;function ke(){if(y!==void 0)return y;if(y=null,process.platform!=="linux"&&process.platform!=="darwin")return null;let e;try{e=H(import.meta.url)("bun:ffi")}catch{return null}let t=process.platform==="darwin"?"__error":"__errno_location",n=process.platform==="darwin"?["/usr/lib/libSystem.B.dylib"]:["libc.so.6",`libc.musl-${process.arch==="arm64"?"aarch64":"x86_64"}.so.1`];for(let r of n)try{let i=e.dlopen(r,{flock:{args:[e.FFIType.i32,e.FFIType.i32],returns:e.FFIType.i32},[t]:{args:[],returns:e.FFIType.ptr}}),s=i.symbols[t]();if(s===null)continue;return y={flock:(o,d)=>i.symbols.flock(o,d),errno:()=>e.read.i32(s),wouldBlock:process.platform==="darwin"?35:11},y}catch{}return null}var v,Ie=3221225472,Te=4,xe=128,Pe=32;function De(e){if(v===void 0){v=null;try{let s=H(import.meta.url)("bun:ffi"),{FFIType:o}=s;v={kernel:s.dlopen("kernel32.dll",{CreateFileW:{args:[o.ptr,o.u32,o.u32,o.ptr,o.u32,o.u32,o.ptr],returns:o.i64_fast},CloseHandle:{args:[o.i64_fast],returns:o.i32},GetLastError:{args:[],returns:o.u32}}).symbols,ptr:(l)=>s.ptr(l)}}catch{return null}}if(!v)return null;let{kernel:t,ptr:n}=v,r=Buffer.from(`${e}\x00`,"utf16le"),i=t.CreateFileW(n(r),Ie,0,null,Te,xe,null);if(Number(i)===-1)return t.GetLastError()===Pe?"busy":null;return{release:()=>{t.CloseHandle(i)}}}function Oe(e){if(process.platform==="win32")return De(`${e}.lease`);let t=ke();if(!t)return null;let n=G(`${e}.lease`,g.O_RDWR|g.O_CREAT|g.O_NOFOLLOW,384);try{let r=F(n);if(!r.isFile()||r.nlink!==1||!A(r))return h(n),"busy";if(t.flock(n,Ne|Se)===0)return{release:()=>h(n)};let i=t.errno();return h(n),i===t.wouldBlock?"busy":null}catch(r){throw h(n),r}}function bs(e){k(S(e.path));let t=Oe(e.path);if(t==="busy")return{acquired:!1,owner:N(e.path),recoveredStaleOwner:!1};let n=t!==null;try{let r=Ce(e,t);if(r.acquired)n=!1;return r}finally{if(n)t.release()}}function Ce(e,t){let n=e.alive??ee,r=!1;for(let i=0;i<4;i+=1){let s={schema_version:q,pid:e.pid??process.pid,nonce:e.nonce?.()??f(),started_at:(e.now?.()??new Date).toISOString(),runtime_version:e.runtimeVersion},o=`${e.path}.init-${process.pid}-${f()}`,d=!1;try{if(B(o,{mode:448}),L(c(o,"owner.json"),`${JSON.stringify(s)}
|
|
3
3
|
`,{mode:384,flag:"wx"}),t!==null)L(c(o,C),`flock
|
|
4
4
|
`,{mode:384,flag:"wx"});e.beforePublish?.();try{throw R(e.path),Object.assign(Error("Managed runtime lock exists."),{code:"EEXIST"})}catch(m){if(m.code!=="ENOENT")throw m}_(o,e.path),d=!0;let l=!1;return{acquired:!0,owner:s,recoveredStaleOwner:r,release(){if(l)return;if(l=!0,N(e.path)?.nonce===s.nonce)p(e.path,{recursive:!0,force:!0});t?.release()}}}catch(l){let m=l.code;if(!["EEXIST","ENOTEMPTY"].includes(m??""))throw l;let u=N(e.path),re=(e.now?.()??new Date).getTime(),ie=u&&e.staleAfterMs!==void 0?re-Date.parse(u.started_at)<e.staleAfterMs:!1,ae=u!==null&&!(t!==null&&Q(e.path,C)!==null)&&n(u.pid);if(!u||ae||ie)return{acquired:!1,owner:u,recoveredStaleOwner:!1};let I=`${e.path}.stale-${process.pid}-${f()}`;try{_(e.path,I),p(I,{recursive:!0,force:!0}),r=!0}catch(x){let oe=x.code;if(!["ENOENT","EEXIST"].includes(oe??""))throw x}}finally{if(!d)p(o,{recursive:!0,force:!0})}}throw new dt("lock_unavailable","Could not acquire the managed Reason runtime lock.")}function te(e){return X(e)&&W(e,["schema_version","event_id","occurred_at","event","runtime_version"],["from_version","to_version","reason_code","duration_ms","attempt_count","retry_in_ms","capabilities"])&&e.schema_version===j&&typeof e.event_id==="string"&&/^[0-9a-f-]{36}$/.test(e.event_id)&&Z(e.occurred_at)&&typeof e.event==="string"&&we.includes(e.event)&&E(e.runtime_version)&&(e.from_version===void 0||E(e.from_version))&&(e.to_version===void 0||E(e.to_version))&&(e.reason_code===void 0||typeof e.reason_code==="string"&&D.test(e.reason_code))&&(e.duration_ms===void 0||typeof e.duration_ms==="number"&&Number.isSafeInteger(e.duration_ms)&&e.duration_ms>=0&&e.duration_ms<=86400000)&&(e.attempt_count===void 0||typeof e.attempt_count==="number"&&Number.isSafeInteger(e.attempt_count)&&e.attempt_count>=1&&e.attempt_count<=1e5)&&(e.retry_in_ms===void 0||typeof e.retry_in_ms==="number"&&Number.isSafeInteger(e.retry_in_ms)&&e.retry_in_ms>=0&&e.retry_in_ms<=30000)&&(e.capabilities===void 0||Array.isArray(e.capabilities)&&e.capabilities.length<=be&&e.capabilities.every((t)=>typeof t==="string"&&D.test(t)))}var Ve=/^(\d{22}-[0-9a-f-]{36}\.json)$/,Ue=/^(\d{22}-[0-9a-f-]{36}\.json)\.sending-(\d+)-[0-9a-f-]{36}$/,Fe=300000,w=0n;function Be(e){let t=BigInt(new Date(e.occurred_at).getTime())*1000000n;return w=t>w?t:w+1n,`${String(w).padStart(22,"0")}-${e.event_id}.json`}function ne(e){try{return z(e.lifecycleEvents).filter((t)=>Ve.test(t)).sort()}catch{return[]}}function V(e){try{let t=JSON.parse(Y(e,"utf8"));return te(t)?t:null}catch{return null}}function $e(e,t=ee,n=Date.now()){let r;try{r=z(e.lifecycleEvents)}catch{return}for(let i of r){let s=i.match(Ue);if(!s)continue;let o=c(e.lifecycleEvents,i),d=c(e.lifecycleEvents,s[1]),l=!t(Number(s[2]));if(!l)try{l=n-K(o).mtimeMs>=Fe}catch{continue}if(!l)continue;try{_(o,d)}catch(m){let u=m.code;if(u==="EEXIST")M(o);else if(u!=="ENOENT")throw m}}}function Ge(e){let n=ne(e).flatMap((i)=>{try{return[{name:i,size:K(c(e.lifecycleEvents,i)).size}]}catch{return[]}}),r=n.reduce((i,s)=>i+s.size,0);while(n.length>ye||r>ve){let i=n.shift();if(!i)break;try{M(c(e.lifecycleEvents,i.name)),r-=i.size}catch(s){if(s.code!=="ENOENT")throw s}}}function vs(e,t,n={}){let r={schema_version:j,event_id:n.eventId?.()??f(),occurred_at:(n.now?.()??new Date).toISOString(),...t};if(!te(r))throw new dt("invalid_lifecycle_event","Managed runtime lifecycle event is invalid.");return k(e.lifecycleEvents),Re(c(e.lifecycleEvents,Be(r)),`${JSON.stringify(r)}
|
|
5
5
|
`),Ge(e),r}async function Ss(e,t,n){$e(e);let r=0;for(let i of ne(e)){let s=c(e.lifecycleEvents,i);if(n){let l=V(s);if(!l||!n(l))continue}let o=`${s}.sending-${process.pid}-${f()}`;try{_(s,o)}catch(l){if(l.code==="ENOENT")continue;throw l}let d=V(o);if(!d){M(o);continue}try{await t(d),M(o),r+=1}catch{try{_(o,s)}catch(l){if(l.code!=="ENOENT")throw l}break}}return r}export{ms,gs,_s,ys,bs,vs,Ss};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{S,Jt,Kn,Ye,Jn,Zn}from"./vm-hands-entry-lite-jzz73e3f.js";import{Yn}from"./vm-hands-entry-lite-
|
|
2
|
+
import{S,Jt,Kn,Ye,Jn,Zn}from"./vm-hands-entry-lite-jzz73e3f.js";import{Yn}from"./vm-hands-entry-lite-pcvgqrse.js";import{Un}from"./vm-hands-entry-lite-hk6trmwa.js";import{r}from"./vm-hands-entry-lite-qy9xg6em.js";import{execFile as ys,spawn as Xe}from"child_process";import{existsSync as ws}from"fs";import{connect as xs}from"net";function pn(){let e=new Set,t=null,n=(s)=>({holder:t?.viewer??null,you:t===s,same_user:Boolean(t?.viewer&&s.viewer&&t.viewer.user_id===s.viewer.user_id)}),o=()=>{for(let s of e)s.notify(n(s))};return{join(s){return e.add(s),s.notify(n(s)),()=>{if(!e.delete(s))return;if(t!==s)return;t=null,o()}},claim(s){if(t===s||!e.has(s))return;t=s,o()}}}var ut=pn();import{createHash as St}from"crypto";import{once as Sn}from"events";import{createWriteStream as vn,existsSync as mr,mkdirSync as gr,mkdtempSync as hr,readFileSync as le,readdirSync as br,renameSync as yr,realpathSync as En,rmSync as Dn,statSync as Ne,writeFileSync as wr}from"fs";import{delimiter as _r,dirname as vt,join as b}from"path";import{finished as Cn}from"stream/promises";var We="omljlfpmafedpplnpkkahegadhkimdje",so="https://chromewebstore.google.com/detail/reason/omljlfpmafedpplnpkkahegadhkimdje";var O={ocu:{repository:"https://github.com/iFurySt/open-codex-computer-use.git",revision:"386a260d1ab8b690adbbb27f7471595cf0c2b752",version:"0.3.5"},obu:{repository:"https://github.com/iFurySt/open-browser-use.git",revision:"ac015846df75928fbcf0f3a0f3ba3a210ce1a507",version:"0.1.42"}},H={version:"155.0.8059.84",macArm64Sha256:"13b9e98ce56f5ce18e100a009f455c9285f399e7c9dc8a76fdf2f3a9755bb5f2",linux64Sha256:"cf0f049892dea22e6a6db26d47ed0d7776b7158edcbec4634086633df8bafcbc",win64Sha256:"507f2a031441d10c62b5e3d4e863f09ac1198a571c1419976cbd8387f639afde"};var J={ocu:{url:`https://registry.npmjs.org/open-computer-use/-/open-computer-use-${O.ocu.version}.tgz`,sha256:"7c16a87c8cd357787b02c0ebd040dd5f93880c1fb51c1901caa2e0c05d063130",size_bytes:5844280},obu:{url:`https://registry.npmjs.org/open-browser-use/-/open-browser-use-${O.obu.version}.tgz`,sha256:"9386d8ce0a147b3f55e1807b68edf736836378807541c457c9b5f6ca2cabaa4e",size_bytes:21372018},extension:{url:`https://github.com/iFurySt/open-browser-use/releases/download/v${O.obu.version}/open-browser-use-chrome-extension-${O.obu.version}.zip`,sha256:"c9c07bec1175e12ea6985b0e7784a5ef01fd03f014b958224a1e17dcd838a241",size_bytes:31070}},F="pnbmoicbkopffjjgfgfglopechaiemkp";import{spawn as Me}from"child_process";import{createRequire as fn}from"module";import{join as mn}from"path";var gn=30000,hn=1048576;function Te(){return process.env.SystemRoot??"C:\\Windows"}function bn(){return mn(Te(),"System32","WindowsPowerShell","v1.0","powershell.exe")}var yn=String.raw`
|
|
3
3
|
$ErrorActionPreference = "Stop"
|
|
4
4
|
Add-Type -TypeDefinition @"
|
|
5
5
|
using System;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{H}from"./vm-hands-entry-lite-3krzmhkk.js";import{D,R,b}from"./vm-hands-entry-lite-beyyy1gz.js";import{je,pr,hr,gn,_n,ot}from"./vm-hands-entry-lite-
|
|
2
|
+
import{H}from"./vm-hands-entry-lite-3krzmhkk.js";import{D,R,b}from"./vm-hands-entry-lite-beyyy1gz.js";import{je,pr,hr,gn,_n,ot}from"./vm-hands-entry-lite-34z9890s.js";import{Nr}from"./vm-hands-entry-lite-pf5qtbj5.js";import{p,at,yn,_e,we}from"./vm-hands-entry-lite-s4bharcb.js";import{v,h}from"./vm-hands-entry-lite-wx4ax7wg.js";import{a,tr,Io}from"./vm-hands-entry-lite-jev771b3.js";import{nn,y,t,k,o,d,rs,Ie,Ri,u,i,W,_,ee,s,n,on}from"./vm-hands-entry-lite-avc65bd7.js";import{se,A}from"./vm-hands-entry-lite-6c67a3jc.js";import{r}from"./vm-hands-entry-lite-qy9xg6em.js";import{randomUUID as Q}from"crypto";import{spawn as Le}from"child_process";import{existsSync as Z,lstatSync as me,mkdirSync as We,readFileSync as Ne,realpathSync as G,rmSync as Ve,writeFileSync as He}from"fs";import{dirname as Ue,join as j,relative as qe,sep as Je}from"path";var Se=["process.run.v1","process.full.v1"],xe=600000,Pe=1800000,Ee=20000,ne="process.cancel.v1",ie=i({action:n("start"),request_id:t().uuid(),command:t().min(1).max(16000).refine((e)=>!e.includes("\x00")),cwd:t().min(1).max(4096).refine((e)=>!e.includes("\x00")&&!e.startsWith("/")&&!e.split(/[\\/]/).includes("..")).describe("Path relative to the granted device root; omit to use that root. Must not start with /, contain a .. path segment, or contain a NUL character.").optional(),mode:s(["host","confined"]).default("host"),timeout_ms:o().int().min(1000).max(Pe).default(xe).describe("Absolute process budget including queue and startup time. Defaults to ten minutes; longer explicit requests require the selected root's advertised max_timeout_ms. Retrying never renews the deadline.")}).strict(),K={device_id:t().uuid(),root_id:t().uuid()},Re=_("action",[ie.extend(K),i({...K,action:n("inspect"),process_id:t().uuid(),after:o().int().min(0).default(0),wait_ms:o().int().min(0).max(Ee).default(0).describe("Wait for new output or a state change, bounded by this call's wait budget. Expiring this wait does not cancel the process or extend its deadline.")}).strict(),i({...K,action:n("cancel"),process_id:t().uuid()}).strict()]),Fe=nn(Re,{io:"input"}),Ke=ie.extend({process_brain_fence:t().uuid(),process_expires_at:y.datetime()}).strict(),J=i({version:n(1),process_id:t().uuid(),state:s(["starting","running","exited","cancelled","expired","uncertain"]),exit_code:o().int().nullable(),first_cursor:o().int().min(0),next_cursor:o().int().min(0),truncated:d(),observed_at:y.datetime(),output:u(i({cursor:o().int().min(1),stream:s(["stdout","stderr"]),text:t().max(32768)}).strict()).max(128)}).strict().refine((e)=>{if(Buffer.byteLength(JSON.stringify(e))>1e5||e.next_cursor<e.first_cursor-1)return!1;if((e.state==="starting"||e.state==="running"||e.state==="uncertain")&&e.exit_code!==null)return!1;if(e.state==="exited"&&(e.exit_code===null||e.exit_code<0||e.exit_code>255))return!1;if(e.state==="cancelled"&&e.exit_code!==130||e.state==="expired"&&e.exit_code!==124)return!1;let f=e.first_cursor-1;for(let l of e.output){if(l.cursor<=f||l.cursor>e.next_cursor)return!1;f=l.cursor}return!0});function ae(e){return Se.includes(e)}var Xe=i({operation_constraints:ee(t(),Ie())}),Ye=i({ready:n(!0),version:n(1),execution_mode:s(["host","confined"]),max_timeout_ms:o().int().min(1000).optional()});var De=i({version:n(1),process_id:t().uuid(),state:s(["queued","cancelled_before_start","not_started"]),exit_code:rs(),output:u(Ri()).length(0),first_cursor:n(0),next_cursor:n(0),truncated:n(!1),cancellation_requested:n(!1),reason_code:s(["cancelled_before_start","process_journal_capacity","path_not_found","process_timeout_unsupported"]).optional(),expires_at:y.datetime().optional().describe("Accepted absolute process deadline. Reading, waiting and retrying do not extend it.")}).strict(),Ce=i({...J.shape,state:s(["queued","starting","running","exited","cancelled","expired","uncertain","cancelled_before_start","not_started"]),observed_at:y.datetime().optional(),expires_at:y.datetime().optional().describe("Accepted absolute process deadline. Reading, waiting and retrying do not extend it."),cancellation_requested:d(),reason_code:t().nullable().optional(),execution_authority:n("lost").optional().describe("Historical receipt only; the current Brain cannot control this older-generation process."),recovery:i({cause:n("brain_generation_changed"),terminal_confirmed:d(),next_step:s(["inspect_until_terminal","reconcile_effects_before_new_intent"])}).strict().optional().describe("Historical process recovery only. An unconfirmed outcome forbids replay. A confirmed terminal observation proves the old process stopped, not that its command had no effects. Reconcile the result; only restart still-needed, safely repeatable work with a new request_id and current authority. Respect user cancellation."),last_observed_state:J.shape.state.or(n("cancelled_before_start")).nullable().optional().describe("Last saved observation before authority was lost; a running observation does not establish current child liveness.")}).strict(),$e=nn(Ce),Qe=W([J,De.refine((e)=>e.state==="cancelled_before_start")]),X=i({version:n(1),process_id:t().uuid(),state:s(["exited","cancelled","expired"]),exit_code:o().int().min(0).max(255),observed_at:y.datetime()}).strict().refine((e)=>(e.state!=="cancelled"||e.exit_code===130)&&(e.state!=="expired"||e.exit_code===124)),Ze=i({process_terminal_observation:X}).strict();var Bi="preview.serve.v1",Fi=43200000;var ce="preview.open.v1",de=1,dn="gid_proxy_v1",ji="egress",pn=/^(?:\*\.)?[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?(?::[1-9][0-9]{0,4})?$/,Ae=i({version:n(dn),allowed_domains:u(t().max(260).regex(pn)).max(1024)}).strict(),ke=on((e)=>H(e)!==null,"invalid workspace"),Oe=i({version:n(1),request_id:k(),session_id:k(),command:t().min(1).max(16000).refine((e)=>!e.includes("\x00")),port:o().int().min(1024).max(65535),workspace:ke,egress:Ae.optional()}).strict(),Ui=Oe.extend({expires_at:y.datetime()}).strict();var Me=4,Te=5000;function Y(e,c,f){let l=null;try{l=at(e)}catch{}yn({deviceRelayUrl:l?.deviceRelayUrl??"",binding:l?.binding??null,jobId:c,port:l?.binding.port??0,reason:l?f:"binding_invalid"})}function le(e){let c=new Map;return{open(f){let l=(x)=>Y(f,e.claim.operation_id,x),C;try{C=at(f)}catch{return l("binding_invalid")}let{binding:w,deviceRelayUrl:z}=C,E=e.claim.owner;if(!E||w.organizationId!==E.organization_id||w.userId!==E.user_id||w.deviceId!==E.device_id||w.rootId!==e.claim.root_id||w.jobId!==e.claim.operation_id||w.fenceId!==e.claim.operation_id||w.generation!==de||w.expiresAtMs>Math.min(Date.now()+p.lifetimeMs+Te,e.expiresAtMs))return l("binding_mismatch");if(w.expiresAtMs<=Date.now())return l("binding_expired");if(c.get(w.port)?.abort(),c.delete(w.port),c.size>=Me)return l("preview_capacity");let L=new AbortController;c.set(w.port,L);let P=we({binding:w,deniedPorts:e.deniedPorts,readCurrentJob:async()=>{if(L.signal.aborted)return null;let x=await e.inspect();return x?{binding:w,executorLaunchId:e.executorLaunchId,job:x}:null}});_e({binding:w,deviceRelayUrl:z,port:P,signal:L.signal}).then((x)=>x.closed,(x)=>{let I=x instanceof Error?x.message:"preview_failed";if(I!=="preview_not_authorized")process.stderr.write(`${JSON.stringify({event:"worker_preview.open_failed",job_id:w.jobId,port:w.port,reason_code:I})}
|
|
3
3
|
`)}).finally(()=>{if(c.get(w.port)===L)c.delete(w.port)})},dispose(){for(let f of c.values())f.abort();c.clear()}}}class nt extends r{observation;constructor(e){super("process_authority_lost","Process authority was lost; the owned process group has stopped.");this.observation=e}}var fe=256,B=new Map,he="preview.serve.v1",V=new Map;function be(e){let c=V.get(e.operation_id);if(c){if(c.claim!==e)throw M("process_authority_lost");return c}if(V.size>=fe)throw M("process_journal_capacity");let f={claim:e,executing:!1,cancelRequested:!1,phase:"pending"};return V.set(e.operation_id,f),f}function pe(e){return{version:1,process_id:e,state:"cancelled_before_start",exit_code:null,output:[],first_cursor:0,next_cursor:0,truncated:!1,cancellation_requested:!1,reason_code:"cancelled_before_start"}}var ue=(e)=>new Promise((c)=>setTimeout(c,e)),M=(e="process_outcome_uncertain")=>new r(e,"The managed process outcome could not be confirmed; inspect its saved receipt before starting another intent.");function ze(e=a(),c=Ge()){let f=Ue(Nr({},e)),l=qe(tr(e),f),[C,...w]=l.split(Je);return{directory:j(c,l,"processes"),previous:[j(f,"processes"),...C==="reason"?[j(c,"ara",...w,"processes")]:[]]}}function Ge(){if(process.platform!=="darwin")throw new r("process_unavailable","Managed Mac process execution is unavailable.");let e=Io();if(!e)throw new r("process_unavailable","The private per-user process directory is unavailable.");return e}async function ur(e){if(!e.claim.owner||e.signal.aborted||e.expiresAtMs<=Date.now())throw M("process_authority_lost");let c=be(e.claim);if(c.executing)throw M("process_busy");if(c.executing=!0,c.cancelRequested)return c.phase="settling",pe(e.claim.operation_id);c.phase="starting";let f=e.journals??ze();We(f.directory,{recursive:!0,mode:448});let l=pr({runtimeDirectory:G(f.directory),previousRuntimeDirectories:(f.previous??[]).filter((m)=>Z(m)).map((m)=>G(m)),root:e.root,runId:JSON.stringify([e.claim.owner,e.claim.run_id,e.claim.root_id,e.claim.operation_id]),maxScopes:fe});try{for(let m of[e.root,e.cwd])if(!je(G(m),l.journalDirectory))throw new r("process_journal_inside_workspace","The selected root contains the private process journal. Select an existing narrower granted workspace root outside the journal; no command was dispatched.")}catch(m){throw l.disposeSocket(),m}let C=me(l.journalDirectory),w=e.claim.capability===he,z=()=>B.set(e.claim.operation_id,{path:l.journalDirectory,ino:C.ino,dev:C.dev,anyCompletion:w}),E=l.launchDirectory,L=j(E,"config.json"),P={url:"",transport:"local_job_ipc",directShell:{mode:e.mode,executable:e.shell,jobId:e.claim.operation_id},workerVersion:D,protocolVersion:2,workerArtifactSha256:b,workerEntrypoint:R,targetGeneration:1,fenceId:Q(),...process.platform==="win32"?{bashExecutable:se()}:{},workRoot:e.root,workspaceAliasPath:e.root,repoPath:e.cwd,jobEnvPath:j(E,"unused.env"),replSocketPath:j(E,"unused.sock"),readyPath:j(E,"ready.json"),directTerminalReceiptPath:j(E,"terminal.json"),launchId:Q(),expiresAtMs:e.expiresAtMs+5000,bashTimeoutMs:60000,replTimeoutMs:1000,allowedTools:["bash"],managedJobs:{journalDirectory:l.journalDirectory,scopeId:l.scopeId},jobControlSocketPath:l.socketPath,...e.prefix?{bashCommandPrefix:e.prefix}:{},...e.jobsUser?{jobsUser:e.jobsUser}:{}},x;try{He(L,JSON.stringify(P),{mode:384});let m=gn({configPath:L,root:e.cwd,grantedRoot:e.root,workRoot:e.root,temporaryDirectory:E});x=e.spawnWorker?.(L,P)??Le(m.command,m.args,{...m.options,env:e.environment,stdio:[_n,"ignore","ignore"]})}catch(m){throw l.disposeSocket(),m}let I=!1,F=new Promise((m,S)=>{x.once("exit",(g)=>{I=!0,m(g)}),x.once("error",(g)=>{I=!0,S(g)})});F.catch(()=>{});let ge={root:e.root,runId:e.claim.run_id,scopeId:l.scopeId,socketPath:l.socketPath,generation:1,fenceId:P.fenceId,executorLaunchId:P.launchId,expiresAtMs:P.expiresAtMs},N=async(m)=>{let S=await hr(ge,{type:"job",version:2,generation:1,id:Q(),jobId:e.claim.operation_id,...m==="start"?{action:m,input:{script:e.command,leaseExpiresAtMs:e.expiresAtMs}}:m==="inspect"?{action:m,input:{after:0}}:m==="probe"?{action:"inspect",input:{after:Number.MAX_SAFE_INTEGER}}:{action:m,input:{}}},new AbortController().signal);if(!S.ok)throw M(S.error);return S.job},U=!1,q=!1,te,re=()=>{U=!0,ot(x,"SIGTERM")};e.signal.addEventListener("abort",re,{once:!0});let T,oe=0,ve=async(m)=>{let S=[...m.output],g={version:1,process_id:e.claim.operation_id,state:m.state,exit_code:m.exitCode,first_cursor:m.firstCursor,next_cursor:m.nextCursor,truncated:m.truncated,output:S,observed_at:new Date().toISOString()};while(Buffer.byteLength(JSON.stringify(g))>90000&&S.length)S.shift(),g.truncated=!0,g.first_cursor=S[0]?.cursor??g.next_cursor+1;T=J.parse(g),await e.emit(T),oe=Date.now()};try{let m=Math.min(Date.now()+1e4,e.expiresAtMs);while(!Z(P.readyPath)){if(I)throw new r("process_start_failed","The managed process supervisor exited before accepting a command; no command was dispatched.");if(e.signal.aborted||Date.now()>=m)throw M("process_start_unconfirmed");await ue(25)}let S=JSON.parse(Ne(P.readyPath,"utf8"));if(S.launchId!==P.launchId||S.fenceId!==P.fenceId||S.workerArtifactSha256!==b)throw M();if(e.signal.throwIfAborted(),c.cancelRequested)return pe(e.claim.operation_id);let g;try{q=!0,g=await N("start")}catch(O){if(!(O instanceof r)||O.code!=="hands_job_result_unknown")throw O;g=await N("inspect")}if(c.phase="running",c.cancel=async()=>{await N("cancel")},w&&e.preview)c.tunnels=le({claim:e.claim,executorLaunchId:P.launchId,expiresAtMs:e.expiresAtMs,deniedPorts:e.preview.deniedPorts,inspect:async()=>c.phase==="running"&&!I?await N("probe"):null});if(c.cancelRequested)await c.cancel(),g=await N("inspect");for(;;){if(!["starting","running"].includes(g.state))c.phase="settling",c.cancel=void 0;if(!T||T.state!==g.state||T.next_cursor!==g.nextCursor&&Date.now()-oe>=5000)await ve(g);if(!["starting","running"].includes(g.state))break;if(e.signal.aborted||I)throw M();await ue(1000);try{g=await N("inspect"),te=void 0}catch(O){if(!(O instanceof r)||O.code!=="hands_job_result_unknown"||e.signal.aborted||I||Date.now()-(te??=Date.now())>120000)throw O}}if(!T||T.state==="uncertain")throw M();return T}finally{if(c.phase="settling",c.cancel=void 0,c.tunnels?.dispose(),c.tunnels=void 0,await c.cancelInFlight?.catch(()=>{}),e.signal.removeEventListener("abort",re),!I&&!U)ot(x,"SIGTERM");let m,S=await Promise.race([F.then((g)=>({code:g})),new Promise((g)=>{m=setTimeout(()=>g(null),6000)})]).finally(()=>{clearTimeout(m)});if(!S){try{ot(x,"SIGKILL")}catch{}try{await F}finally{if(I)l.disposeSocket()}throw M("process_cleanup_unconfirmed")}try{if((U||e.signal.aborted)&&S.code===0&&q){v(E);let g=JSON.parse(h(P.directTerminalReceiptPath)),O=X.safeParse(g.observation);if(Object.keys(g).length===4&&g.launch_id===P.launchId&&g.fence_id===P.fenceId&&g.scope_id===l.scopeId&&O.success&&O.data.process_id===e.claim.operation_id){if(w)z();throw new nt(O.data)}}}catch(g){if(g instanceof nt)throw g}finally{if(I)l.disposeSocket()}if(S.code!==0&&!U&&q)throw M("process_cleanup_unconfirmed");if(!U&&S.code===0&&(T&&["exited","cancelled","expired"].includes(T.state)||!q&&c.cancelRequested)||w&&S.code===0&&!q)z()}}async function Ts(e,c){if(c.kind===ce&&e.capability===he){let C=V.get(e.operation_id);if(C?.claim===e&&C.tunnels)C.tunnels.open(c.payload);else Y(c.payload,e.operation_id,"server_not_running");return!0}if(c.kind!==ne||!ae(e.capability)||!e.owner||c.payload.process_id!==e.operation_id)return!1;let f=V.get(e.operation_id);if(f&&f.claim!==e)return!1;let l=be(e);if(l.cancelRequested=!0,l.phase==="running"&&l.cancel)l.cancelInFlight??=l.cancel(),await l.cancelInFlight;return!0}function Rs(e,c){V.delete(e);let f=B.get(e);if(!f||c!=="succeeded"&&!f.anyCompletion)return B.delete(e),!1;try{let l=me(f.path);if(!l.isDirectory()||l.isSymbolicLink()||l.ino!==f.ino||l.dev!==f.dev||!A(l)||G(f.path)!==f.path||Z(j(f.path,"owner.lock")))return!1;return Ve(f.path,{recursive:!0}),B.delete(e),!0}catch{return!1}}
|
|
4
4
|
export{Bi,Fi,dn,ji,pn,Ui,nt,ur,Ts,Rs};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
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(`
|
|
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-ef9ts9c6.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-8z6rx1fj.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=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};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
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-
|
|
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
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
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
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(`
|
|
@@ -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-2nvhegyc.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-2nvhegyc.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-qgew2890.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-6357p4cd.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-t6fwch4h.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-6357p4cd.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-t6fwch4h.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-m8nqnd9j.js";import"./vm-hands-entry-lite-hk6trmwa.js";import"./vm-hands-entry-lite-nefcet81.js";import"./vm-hands-entry-lite-jzz73e3f.js";import"./vm-hands-entry-lite-hn76pcgk.js";import"./vm-hands-entry-lite-mmdwr0mf.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};
|