@reason-machines/cli-linux-x64 0.2.561 → 0.2.565
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 +2 -2
- package/bin/vm-hands/agent-network-mnv1fm1c.js +2 -0
- package/bin/vm-hands/api-credentials-082cnpn9.js +2 -0
- package/bin/vm-hands/api-sq672f51.js +2 -0
- package/bin/vm-hands/{ask-relay-xx0rzpch.js → ask-relay-v5btnjvb.js} +2 -2
- package/bin/vm-hands/connect-cli-rxb3qtra.js +2 -0
- package/bin/vm-hands/credentials-sk4sag42.js +2 -0
- package/bin/vm-hands/custom-endpoint-device-3jscber1.js +2 -0
- package/bin/vm-hands/desktop-account-xma0330a.js +2 -0
- package/bin/vm-hands/desktop-components-099xyxmz.js +2 -0
- package/bin/vm-hands/desktop-delegate-tch2qzx0.js +2 -0
- package/bin/vm-hands/device-workspace-4bj43nxq.js +2 -0
- package/bin/vm-hands/{fsevents-vxv56sp5.js → fsevents-ezcg3e40.js} +1 -1
- package/bin/vm-hands/hands-worker-source-8pe7yv0m.js +2 -0
- package/bin/vm-hands/{index-03p9c17x.js → index-w92ys6ra.js} +16 -16
- package/bin/vm-hands/install-receipt-68xxg7hn.js +2 -0
- package/bin/vm-hands/local-automation-7pjd5nc1.js +2 -0
- package/bin/vm-hands/local-capabilities-ha0ey4zh.js +2 -0
- package/bin/vm-hands/local-desktop-users-jpf0resr.js +2 -0
- package/bin/vm-hands/local-display-mac-h5yz0ydd.js +2 -0
- package/bin/vm-hands/local-display-session-0mkswxgk.js +2 -0
- package/bin/vm-hands/local-display-video-c3fk87c5.js +2 -0
- package/bin/vm-hands/local-managed-process-ahr2jync.js +2 -0
- package/bin/vm-hands/local-pty-session-tqn2xmph.js +2 -0
- package/bin/vm-hands/managed-runtime-shzb3tr3.js +2 -0
- package/bin/vm-hands/network-auto-update-3m94436w.js +3 -0
- package/bin/vm-hands/network-contract-nkwcf4r9.js +2 -0
- package/bin/vm-hands/{network-sign-in-61gmpmaa.js → network-sign-in-xm79s170.js} +2 -2
- package/bin/vm-hands/package-9w0mmxb5.js +2 -0
- package/bin/vm-hands/permissions-scffy1px.js +2 -0
- package/bin/vm-hands/reason-hands-protocol-pck5har9.js +2 -0
- package/bin/vm-hands/serve-service-grp91ybk.js +2 -0
- package/bin/vm-hands/{status-khqk4cjw.js → status-89999mdn.js} +7 -7
- package/bin/vm-hands/version-wyshazh7.js +2 -0
- package/bin/vm-hands/{vm-hands-entry-lite-zawytz09.js → vm-hands-entry-lite-12ck5swp.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-j10cw3d9.js → vm-hands-entry-lite-13nx02p7.js} +7 -7
- package/bin/vm-hands/{vm-hands-entry-lite-vdv4nm5f.js → vm-hands-entry-lite-1b21avcs.js} +2 -2
- package/bin/vm-hands/vm-hands-entry-lite-1eyg750p.js +48 -0
- package/bin/vm-hands/{vm-hands-entry-lite-2dak7e1h.js → vm-hands-entry-lite-1xhpn3hw.js} +3 -5
- package/bin/vm-hands/{vm-hands-entry-lite-ms99mzp0.js → vm-hands-entry-lite-284z7ct8.js} +3 -3
- package/bin/vm-hands/{vm-hands-entry-lite-a7bf7xr7.js → vm-hands-entry-lite-2qfmabqn.js} +3 -3
- package/bin/vm-hands/{vm-hands-entry-lite-q9s1e2y1.js → vm-hands-entry-lite-33at6g06.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-jgk5z8zc.js → vm-hands-entry-lite-34b4tws6.js} +6 -6
- package/bin/vm-hands/{vm-hands-entry-lite-e3fn8ys2.js → vm-hands-entry-lite-3gc2bn5a.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-hxfxs7r9.js → vm-hands-entry-lite-3q2ng4e9.js} +2 -2
- package/bin/vm-hands/vm-hands-entry-lite-432khjd5.js +150 -0
- package/bin/vm-hands/vm-hands-entry-lite-6vnjgy77.js +81 -0
- package/bin/vm-hands/{vm-hands-entry-lite-ht6hzkgj.js → vm-hands-entry-lite-7r27208j.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-hs6sdn60.js → vm-hands-entry-lite-88dxn9b5.js} +2 -2
- package/bin/vm-hands/vm-hands-entry-lite-997y1m1r.js +3 -0
- package/bin/vm-hands/{vm-hands-entry-lite-zh6ncdjn.js → vm-hands-entry-lite-a3gq377t.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-m1we91g4.js → vm-hands-entry-lite-af45ma9p.js} +10 -10
- package/bin/vm-hands/{vm-hands-entry-lite-0wb1n769.js → vm-hands-entry-lite-b1vanmtv.js} +5 -5
- package/bin/vm-hands/{vm-hands-entry-lite-5y4phfv1.js → vm-hands-entry-lite-bsk184m7.js} +3 -3
- package/bin/vm-hands/{vm-hands-entry-lite-q9djb28r.js → vm-hands-entry-lite-cc8hwgxc.js} +3 -3
- package/bin/vm-hands/vm-hands-entry-lite-chq0qx9f.js +12 -0
- package/bin/vm-hands/{vm-hands-entry-lite-84mc1f7h.js → vm-hands-entry-lite-cmmb9k3g.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-gxpw14jv.js → vm-hands-entry-lite-dy204qh4.js} +7 -7
- package/bin/vm-hands/{vm-hands-entry-lite-ptycjmkc.js → vm-hands-entry-lite-fccn6s4j.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-qf990rxw.js → vm-hands-entry-lite-fn2805g8.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-71ebge0c.js → vm-hands-entry-lite-fxptf351.js} +5 -5
- package/bin/vm-hands/{vm-hands-entry-lite-vkhacd00.js → vm-hands-entry-lite-gcqqnnze.js} +19 -19
- package/bin/vm-hands/{vm-hands-entry-lite-57ajjwmh.js → vm-hands-entry-lite-gxf2r5en.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-hjjbjpd7.js → vm-hands-entry-lite-jj7873n8.js} +3 -3
- package/bin/vm-hands/{vm-hands-entry-lite-9g52kxyj.js → vm-hands-entry-lite-kbnxk71q.js} +2 -2
- package/bin/vm-hands/vm-hands-entry-lite-ncyrz48z.js +4 -0
- package/bin/vm-hands/{vm-hands-entry-lite-y3nz20wb.js → vm-hands-entry-lite-ngn4tafr.js} +105 -105
- package/bin/vm-hands/{vm-hands-entry-lite-52qz0n30.js → vm-hands-entry-lite-ngry8nkq.js} +4 -4
- package/bin/vm-hands/{vm-hands-entry-lite-8xv6c0rm.js → vm-hands-entry-lite-pg7nnyc6.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-h7nk2848.js → vm-hands-entry-lite-pt19vacn.js} +42 -42
- package/bin/vm-hands/{vm-hands-entry-lite-tcmye5ny.js → vm-hands-entry-lite-q62g6sx0.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-v4hr9x9h.js → vm-hands-entry-lite-qjrgvdbj.js} +34 -34
- package/bin/vm-hands/{vm-hands-entry-lite-bj3w2ven.js → vm-hands-entry-lite-rqfhfp09.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-krpqqx12.js → vm-hands-entry-lite-rxydyqke.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-weqam12f.js → vm-hands-entry-lite-s93f3pbv.js} +3 -3
- package/bin/vm-hands/{vm-hands-entry-lite-z0ht62s4.js → vm-hands-entry-lite-sh4mqy93.js} +3 -3
- package/bin/vm-hands/{vm-hands-entry-lite-xvccy3z4.js → vm-hands-entry-lite-sz7z1qby.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-wcgm41jq.js → vm-hands-entry-lite-t43bz0ey.js} +7 -7
- package/bin/vm-hands/{vm-hands-entry-lite-6jxshhps.js → vm-hands-entry-lite-t86kt9jz.js} +6 -6
- package/bin/vm-hands/{vm-hands-entry-lite-7pfhwxn5.js → vm-hands-entry-lite-tnj3483k.js} +1 -1
- package/bin/vm-hands/vm-hands-entry-lite-wnqqjsew.js +3 -0
- package/bin/vm-hands/{vm-hands-entry-lite-pxtycfdv.js → vm-hands-entry-lite-xfak34av.js} +4 -4
- package/bin/vm-hands/{vm-hands-entry-lite-sy7dcccg.js → vm-hands-entry-lite-y0jtj8zz.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-yvws5zpx.js → vm-hands-entry-lite-yg4dk99m.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-2rgf8866.js → vm-hands-entry-lite-z65xva21.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-jpvmkce5.js → vm-hands-entry-lite-zp7chzcc.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-k5ytpgzz.js → vm-hands-entry-lite-zpvr7wc6.js} +19 -19
- package/bin/vm-hands/vm-hands-entry-lite.js +2 -2
- package/bin/vm-hands/vm-hands-executor-kyb5t371.js +12 -0
- package/bin/vm-hands/vm-hands-op-runner-gkt79hcp.js +2 -0
- package/bin/vm-hands/{vm-hands-runtime-1qxf96z7.js → vm-hands-runtime-tdr6j55n.js} +3 -3
- package/bin/vm-hands/worker-preview-readiness-h96yr4wf.js +2 -0
- package/bin/vm-hands/worker-sandbox-6kkhvryn.js +2 -0
- package/package.json +1 -1
- package/bin/vm-hands/agent-network-kk36zca7.js +0 -2
- package/bin/vm-hands/api-credentials-mtfdk175.js +0 -2
- package/bin/vm-hands/api-w6w7vfp3.js +0 -2
- package/bin/vm-hands/connect-cli-dmwph620.js +0 -2
- package/bin/vm-hands/credentials-s7ps7y6s.js +0 -2
- package/bin/vm-hands/custom-endpoint-device-3xnrp33e.js +0 -2
- package/bin/vm-hands/desktop-account-eg8thn79.js +0 -2
- package/bin/vm-hands/device-workspace-h5rsecq8.js +0 -2
- package/bin/vm-hands/hands-worker-source-vk664w8p.js +0 -2
- package/bin/vm-hands/install-receipt-j04hdw1k.js +0 -2
- package/bin/vm-hands/local-automation-vvt9d9xb.js +0 -2
- package/bin/vm-hands/local-capabilities-pwv76ns5.js +0 -2
- package/bin/vm-hands/local-desktop-users-sq4trh07.js +0 -2
- package/bin/vm-hands/local-display-mac-yxcxvg2z.js +0 -2
- package/bin/vm-hands/local-display-session-axh9mfdk.js +0 -2
- package/bin/vm-hands/local-display-video-pxhztqk7.js +0 -2
- package/bin/vm-hands/local-managed-process-4mgqn7tg.js +0 -2
- package/bin/vm-hands/local-pty-session-edd8ttf9.js +0 -2
- package/bin/vm-hands/managed-runtime-pcagtyfz.js +0 -2
- package/bin/vm-hands/network-auto-update-wkzb91qz.js +0 -3
- package/bin/vm-hands/network-contract-8mxtma3w.js +0 -2
- package/bin/vm-hands/package-vwvzjtn0.js +0 -2
- package/bin/vm-hands/permissions-348prrcx.js +0 -2
- package/bin/vm-hands/reason-hands-protocol-1nkpw1v3.js +0 -2
- package/bin/vm-hands/serve-service-3dkyznay.js +0 -2
- package/bin/vm-hands/version-c1hen0wn.js +0 -2
- package/bin/vm-hands/vm-hands-entry-lite-9yfmkd1f.js +0 -3
- package/bin/vm-hands/vm-hands-entry-lite-ab1pq3xg.js +0 -3
- package/bin/vm-hands/vm-hands-entry-lite-hn9pq7zj.js +0 -127
- package/bin/vm-hands/vm-hands-entry-lite-nn6zcvmp.js +0 -3
- package/bin/vm-hands/vm-hands-entry-lite-z213y4pj.js +0 -150
- package/bin/vm-hands/vm-hands-executor-csdtg7kj.js +0 -12
- package/bin/vm-hands/vm-hands-op-runner-z7tsd84c.js +0 -2
- package/bin/vm-hands/worker-preview-readiness-06tygyjs.js +0 -2
- package/bin/vm-hands/worker-sandbox-e1cpkzfz.js +0 -2
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{O,Rn,ns,Xt,is,os}from"./vm-hands-entry-lite-j10cw3d9.js";import{ls}from"./vm-hands-entry-lite-6jxshhps.js";import{Ko}from"./vm-hands-entry-lite-q9djb28r.js";import{s}from"./vm-hands-entry-lite-zawytz09.js";import{r}from"./vm-hands-entry-lite-qy9xg6em.js";import{execFile as _s,spawn as qe}from"child_process";import{existsSync as ks}from"fs";import{connect as vs}from"net";function gn(){let e=new Set,t=null,n=(i)=>({holder:t?.viewer??null,you:t===i,same_user:Boolean(t?.viewer&&i.viewer&&t.viewer.user_id===i.viewer.user_id)}),o=()=>{for(let i of e)i.notify(n(i))};return{join(i){return e.add(i),i.notify(n(i)),()=>{if(!e.delete(i))return;if(t!==i)return;t=null,o()}},claim(i){if(t===i||!e.has(i))return;t=i,o()}}}var ut=gn();import{createHash as vt}from"crypto";import{once as Pn}from"events";import{createWriteStream as Cn,existsSync as Mn,mkdirSync as Tn,mkdtempSync as hr,readFileSync as de,readdirSync as br,renameSync as On,realpathSync as An,rmSync as $n,statSync as Ue,writeFileSync as Ln}from"fs";import{delimiter as wr,dirname as Be,join as y}from"path";import{finished as Nn}from"stream/promises";var Gt="omljlfpmafedpplnpkkahegadhkimdje",lc="https://chromewebstore.google.com/detail/reason/omljlfpmafedpplnpkkahegadhkimdje";var A={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"}},F={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-${A.ocu.version}.tgz`,sha256:"7c16a87c8cd357787b02c0ebd040dd5f93880c1fb51c1901caa2e0c05d063130",size_bytes:5844280},obu:{url:`https://registry.npmjs.org/open-browser-use/-/open-browser-use-${A.obu.version}.tgz`,sha256:"9386d8ce0a147b3f55e1807b68edf736836378807541c457c9b5f6ca2cabaa4e",size_bytes:21372018},extension:{url:`https://github.com/iFurySt/open-browser-use/releases/download/v${A.obu.version}/open-browser-use-chrome-extension-${A.obu.version}.zip`,sha256:"c9c07bec1175e12ea6985b0e7784a5ef01fd03f014b958224a1e17dcd838a241",size_bytes:31070}},le="pnbmoicbkopffjjgfgfglopechaiemkp";import{spawn as Te}from"child_process";import{createRequire as hn}from"module";import{join as bn}from"path";var xn=30000,_n=1048576;function Oe(){return process.env.SystemRoot??"C:\\Windows"}function kn(){return bn(Oe(),"System32","WindowsPowerShell","v1.0","powershell.exe")}var vn=String.raw`
|
|
3
|
-
$ErrorActionPreference = "Stop"
|
|
4
|
-
Add-Type -TypeDefinition @"
|
|
5
|
-
using System;
|
|
6
|
-
using System.Runtime.InteropServices;
|
|
7
|
-
public static class ReasonInput {
|
|
8
|
-
[StructLayout(LayoutKind.Sequential)] public struct MOUSEINPUT { public int dx; public int dy; public int mouseData; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; }
|
|
9
|
-
[StructLayout(LayoutKind.Sequential)] public struct KEYBDINPUT { public ushort wVk; public ushort wScan; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; }
|
|
10
|
-
[StructLayout(LayoutKind.Explicit)] public struct UNION { [FieldOffset(0)] public MOUSEINPUT mi; [FieldOffset(0)] public KEYBDINPUT ki; }
|
|
11
|
-
[StructLayout(LayoutKind.Sequential)] public struct INPUT { public uint type; public UNION u; }
|
|
12
|
-
[DllImport("user32.dll")] static extern uint SendInput(uint count, INPUT[] inputs, int size);
|
|
13
|
-
[DllImport("user32.dll")] public static extern bool SetProcessDPIAware();
|
|
14
|
-
[DllImport("user32.dll")] public static extern int GetSystemMetrics(int index);
|
|
15
|
-
[DllImport("user32.dll")] static extern uint MapVirtualKey(uint code, uint type);
|
|
16
|
-
[DllImport("user32.dll")] public static extern uint GetClipboardSequenceNumber();
|
|
17
|
-
static void Send(INPUT input) { SendInput(1, new INPUT[] { input }, Marshal.SizeOf(typeof(INPUT))); }
|
|
18
|
-
public static void Mouse(uint flags, int x, int y, int data) {
|
|
19
|
-
INPUT input = new INPUT(); input.type = 0;
|
|
20
|
-
input.u.mi.dx = x; input.u.mi.dy = y; input.u.mi.mouseData = data; input.u.mi.dwFlags = flags; Send(input);
|
|
21
|
-
}
|
|
22
|
-
public static void Key(ushort vk, ushort unit, uint flags) {
|
|
23
|
-
INPUT input = new INPUT(); input.type = 1;
|
|
24
|
-
input.u.ki.wVk = vk; input.u.ki.wScan = vk != 0 ? (ushort)MapVirtualKey(vk, 0) : unit; input.u.ki.dwFlags = flags; Send(input);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
"@
|
|
28
|
-
[void][ReasonInput]::SetProcessDPIAware()
|
|
29
|
-
$width = [ReasonInput]::GetSystemMetrics(0)
|
|
30
|
-
$height = [ReasonInput]::GetSystemMetrics(1)
|
|
31
|
-
$session = [Diagnostics.Process]::GetCurrentProcess().SessionId
|
|
32
|
-
[Console]::Out.WriteLine('{"session":' + $session + ',"width":' + $width + ',"height":' + $height + '}')
|
|
33
|
-
[Console]::Out.Flush()
|
|
34
|
-
$mode = "__MODE__"
|
|
35
|
-
if ($mode -eq "probe") { exit 0 }
|
|
36
|
-
if ($mode -eq "clipboard") {
|
|
37
|
-
# Only changes made during this pairing: never export the initial clipboard.
|
|
38
|
-
$parent = Get-Process -Id __PARENT__
|
|
39
|
-
$last = [ReasonInput]::GetClipboardSequenceNumber()
|
|
40
|
-
while (-not $parent.HasExited) {
|
|
41
|
-
Start-Sleep -Milliseconds 100
|
|
42
|
-
$count = [ReasonInput]::GetClipboardSequenceNumber()
|
|
43
|
-
if ($count -eq $last) { continue }
|
|
44
|
-
$last = $count
|
|
45
|
-
try { $text = Get-Clipboard -Raw } catch { continue }
|
|
46
|
-
if (-not $text) { continue }
|
|
47
|
-
$bytes = [Text.Encoding]::UTF8.GetBytes($text)
|
|
48
|
-
if ($bytes.Length -gt __MAX_TEXT_BYTES__) { continue }
|
|
49
|
-
[Console]::Out.WriteLine("c " + [Convert]::ToBase64String($bytes))
|
|
50
|
-
[Console]::Out.Flush()
|
|
51
|
-
}
|
|
52
|
-
exit 0
|
|
53
|
-
}
|
|
54
|
-
$scaleX = 65535.0 / [Math]::Max(1, $width - 1)
|
|
55
|
-
$scaleY = 65535.0 / [Math]::Max(1, $height - 1)
|
|
56
|
-
while ($null -ne ($line = [Console]::In.ReadLine())) {
|
|
57
|
-
$n = $line.Split(" ")
|
|
58
|
-
try {
|
|
59
|
-
switch ($n[0]) {
|
|
60
|
-
"p" { [ReasonInput]::Mouse(0x8001, [int]([int]$n[1] * $scaleX), [int]([int]$n[2] * $scaleY), 0) }
|
|
61
|
-
"b" { [ReasonInput]::Mouse([uint32]$n[1], 0, 0, [int]$n[2]) }
|
|
62
|
-
"k" { [ReasonInput]::Key([uint16]$n[1], [uint16]$n[2], [uint32]$n[3]) }
|
|
63
|
-
"c" { Set-Clipboard -Value ([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($n[1]))) }
|
|
64
|
-
}
|
|
65
|
-
} catch { [Console]::Error.WriteLine("input: $_") }
|
|
66
|
-
}
|
|
67
|
-
`;function Ae(e){let t=vn.replace("__MODE__",e).replace("__PARENT__",String(process.pid)).replace("__MAX_TEXT_BYTES__",String(O));return[kn(),["-NoLogo","-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-EncodedCommand",Buffer.from(t,"utf16le").toString("base64")]]}var Sn=["USERPROFILE","LOCALAPPDATA","APPDATA","TEMP","TMP","PSModuleAnalysisCachePath"];function $e(){let e=Sn.flatMap((t)=>process.env[t]?[[t,process.env[t]]]:[]);return{...Object.fromEntries(e),SystemRoot:Oe(),windir:Oe()}}function ht(e){let t;try{t=JSON.parse(e)}catch{return null}if(!t||typeof t!=="object")return null;let n=t,o=(i,a)=>typeof i==="number"&&Number.isSafeInteger(i)&&i>=a;return o(n.session,0)&&o(n.width,1)&&o(n.height,1)?{session:n.session,width:n.width,height:n.height}:null}function bt(){return new Promise((e)=>{let t=Te(...Ae("probe"),{env:$e(),stdio:["ignore","pipe","ignore"],windowsHide:!0}),n="",o=setTimeout(()=>{t.kill("SIGKILL"),e(null)},xn);t.stdout.setEncoding("utf8").on("data",(i)=>{n+=i}),t.once("error",()=>{clearTimeout(o),e(null)}),t.once("close",()=>{clearTimeout(o),e(ht(n.split(/\r?\n/)[0]??""))})})}var Z;function yt(){if(Z!==void 0)return Z;if(process.platform!=="win32")return Z=!1;try{let e=hn(import.meta.url)("bun:ffi"),{symbols:t}=e.dlopen("kernel32.dll",{GetCurrentProcessId:{args:[],returns:e.FFIType.u32},ProcessIdToSessionId:{args:[e.FFIType.u32,e.FFIType.ptr],returns:e.FFIType.i32}}),n=new Uint32Array(1);return Z=t.ProcessIdToSessionId(t.GetCurrentProcessId(),n)!==0&&n[0]>0}catch{return Z=!1}}var lt=[{bit:1,down:2,up:4},{bit:2,down:32,up:64},{bit:4,down:8,up:16}],dt=2048,pt=4096,En=[[8,dt,120],[16,dt,-120],[32,pt,-120],[64,pt,120]],ft=1,Me=2,Dn=4,In=new Set([65505,65506]),mt=new Set([65507,65508,65511,65512,65513,65514,65027,65515,65516]),gt=new Map([[65505,[160,!1]],[65506,[161,!1]],[65507,[162,!1]],[65508,[163,!0]],[65511,[164,!1]],[65512,[165,!0]],[65513,[164,!1]],[65514,[165,!0]],[65027,[165,!0]],[65515,[91,!0]],[65516,[92,!0]],[65288,[8,!1]],[65289,[9,!1]],[65056,[9,!1]],[65293,[13,!1]],[65307,[27,!1]],[65535,[46,!0]],[65379,[45,!0]],[65360,[36,!0]],[65367,[35,!0]],[65365,[33,!0]],[65366,[34,!0]],[65361,[37,!0]],[65362,[38,!0]],[65363,[39,!0]],[65364,[40,!0]],[65383,[93,!0]],[65509,[20,!1]],[65299,[19,!1]],[65300,[145,!1]],[65377,[44,!0]],[65407,[144,!0]],[32,[32,!1]],[65421,[13,!0]],[65408,[32,!1]],[65450,[106,!1]],[65451,[107,!1]],[65452,[108,!1]],[65453,[109,!1]],[65454,[110,!1]],[65455,[111,!0]],[65429,[36,!1]],[65430,[37,!1]],[65431,[38,!1]],[65432,[39,!1]],[65433,[40,!1]],[65434,[33,!1]],[65435,[34,!1]],[65436,[35,!1]],[65438,[45,!1]],[65439,[46,!1]],...Array.from({length:10},(e,t)=>[65456+t,[96+t,!1]]),...Array.from({length:24},(e,t)=>[65470+t,[112+t,!1]])]);class wt{x=-1;y=-1;mask=0;held=new Set;pressed=new Set;pointer(e,t,n){let o=[];if(e!==this.x||t!==this.y)this.x=e,this.y=t,o.push(`p ${e} ${t}`);for(let i of lt){let a=(this.mask&i.bit)!==0,c=(n&i.bit)!==0;if(a!==c)o.push(`b ${c?i.down:i.up} 0`)}for(let[i,a,c]of En)if(!(this.mask&i)&&n&i)o.push(`b ${a} ${c}`);return this.mask=n,o}key(e,t){let n=e?0:Me;if(In.has(t)||mt.has(t))if(e)this.held.add(t);else this.held.delete(t);let o=gt.get(t);if(o)return[`k ${o[0]} 0 ${n|(o[1]?ft:0)}`];let i=t<256?t:(t&4278190080)===16777216?t&16777215:0,a=String.fromCharCode(i),c=[...this.held].some((w)=>mt.has(w)),p=/^[A-Za-z0-9]$/.test(a)?a.toUpperCase().charCodeAt(0):0;if(p&&(e?c:this.pressed.has(p))){if(e)this.pressed.add(p);else this.pressed.delete(p);return[`k ${p} 0 ${n}`]}if(i<33||i>=127&&i<160||i>65535||i>=55296&&i<57344)return[];return[`k 0 ${i} ${n|Dn}`]}release(){let e=lt.filter((t)=>this.mask&t.bit).map((t)=>`b ${t.up} 0`);for(let t of this.pressed)e.push(`k ${t} 0 ${Me}`);for(let t of this.held){let[n,o]=gt.get(t);e.push(`k ${n} 0 ${Me|(o?ft:0)}`)}return this.mask=0,this.pressed.clear(),this.held.clear(),e}}function xt(e){let t=Te(...Ae("input"),{env:$e(),stdio:["pipe","pipe","ignore"],windowsHide:!0}),n=new wt,o="",i=!1,a=null,c=()=>{if(a?.kill("SIGKILL"),t.exitCode!==null||t.signalCode!==null)return;t.stdin.end(n.release().map((f)=>`${f}
|
|
68
|
-
`).join("")),setTimeout(()=>t.kill("SIGKILL"),2000).unref()},p=(f)=>{if(i)return;i=!0,c(),e.end(f)},w=(f)=>p({error:new r("display_unavailable",f)}),b=(f)=>{if(i||f.length===0)return;if(t.stdin.write(f.map((x)=>`${x}
|
|
69
|
-
`).join("")),t.stdin.writableLength>_n)p({reason:"input_backpressure"})},h=()=>{a=Te(...Ae("clipboard"),{env:$e(),stdio:["ignore","pipe","ignore"],windowsHide:!0});let f="";a.stdout?.on("data",(x)=>{if(i)return;f+=x.toString("ascii");for(let m=f.indexOf(`
|
|
70
|
-
`);m>=0;m=f.indexOf(`
|
|
71
|
-
`)){let R=f.slice(0,m).replace(/\r$/,"");if(f=f.slice(m+1),!R.startsWith("c "))continue;let S=R.slice(2);if(S.length>Math.ceil(O/3)*4||!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(S)){p({reason:"display_protocol"});return}let u=Buffer.from(S,"base64");if(u.byteLength<=O)e.clipboard(u.toString("utf8"));if(i)return}if(f.length>Math.ceil(O/3)*4+4)p({reason:"display_protocol"})}),a.once("error",()=>w("Reason could not watch this computer's desktop clipboard.")),a.once("exit",()=>{if(!i)w("Reason could not watch this computer's desktop clipboard.")})};return t.stdout.on("data",(f)=>{if(i||o===null)return;o+=f.toString("utf8");let x=o.indexOf(`
|
|
72
|
-
`);if(x<0){if(o.length>4096)p({reason:"display_protocol"});return}let m=ht(o.slice(0,x).trim());if(o=null,!m)p({reason:"display_protocol"});else if(m.session===0)w("This Windows worker runs as a service, which has no desktop: run it in the signed-in desktop session.");else h(),e.ready({width:m.width,height:m.height})}),t.stdin.on("error",()=>{return}),t.once("error",()=>w("Reason could not start this computer's desktop input.")),t.once("exit",()=>{if(o!==null)w("Reason could not start this computer's desktop input.");else p({reason:"display_closed"})}),{pointer:(f,x,m)=>b(n.pointer(f,x,m)),key:(f,x)=>b(n.key(f,x)),clipboard:(f)=>b([`c ${Buffer.from(f,"utf8").toString("base64")}`]),close(){i=!0,c()}}}var Un=["none","standard","all"],ue="22.23.4",Bn={"linux-x64":"b8492284c76a54baf58d61668dd0e41ee0fc98adabf9503d30f05d08f55b4406","linux-arm64":"f7a1e486dbc8b286847815b477d4fb5e9fb963ed4489c3e1588853d685f589f9","darwin-arm64":"c9e1dbc748b33ed2d14f42445191ecaf14c56259c7a9a26d0042c49ec2b66428","win32-x64":"cbc74b5e0982c9dbb41525fd8fb5dcd32fbee237863f7829072f4639a1ce5f20","win32-arm64":"a8b8cd79cbbb3062435f449591d98dd63730bbbf30ce2d7cc3a6376c236cb111"},Le={"linux-x64":{ocu:"dist/linux/amd64/open-computer-use",obu:"native/linux-amd64/open-browser-use"},"linux-arm64":{ocu:"dist/linux/arm64/open-computer-use",obu:"native/linux-arm64/open-browser-use"},"darwin-arm64":{ocu:"dist/Open Computer Use.app/Contents/MacOS/OpenComputerUse",obu:"native/darwin-arm64/open-browser-use"},"win32-x64":{ocu:"dist/windows/amd64/open-computer-use.exe",obu:"native/windows-amd64/open-browser-use.exe"},"win32-arm64":{ocu:"dist/windows/arm64/open-computer-use.exe",obu:"native/windows-arm64/open-browser-use.exe"}},St="chrome-mac-arm64/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",Et="chrome-win64/chrome.exe",W={version:"9.0.2",url:"https://ffmpeg.martin-riedl.de/download/macos/arm64/1789931890_9.0.2/ffmpeg.zip",sha256:"c8ed4c4e6978a03c485edbfe4e0a5dc2380f8a30bba5150531b31b094492d924"},Hn={version:W.version,url:"https://ffmpeg.martin-riedl.de/download/macos/arm64/1789931890_9.0.2/ffprobe.zip",sha256:"fcbe839537485eaee7a7a8bc5cbc0f90d53617e80943e8a5b2e31cb851197ea6"},Ne={version:W.version,url:`https://github.com/GyanD/codexffmpeg/releases/download/${W.version}/ffmpeg-${W.version}-essentials_build.zip`,sha256:"60f467265b1e312373dbcd92200c2618a74850f98d3d078e94296bb3fa2047ba"},_t=`ffmpeg-${Ne.version}-essentials_build/bin`,z="com.ifuryst.open_browser_use.extension",Dt="com.reasonmachines.browser_use.extension",yn="/tmp/reason-browser-use",He=["tint2","picom","xterm","pcmanfm"],It=["fonts-droid-fallback"],Pt=["pulseaudio"],Ct=["tigervnc-standalone-server"],Fn=["xvfb","openbox","x11vnc","x11-utils","x11-xserver-utils","xdotool","dbus-x11","at-spi2-core","python3","python3-gi","gir1.2-atspi-2.0","gir1.2-gtk-3.0","fonts-dejavu-core",...It,"galculator","chromium","ffmpeg","tmux",...Pt,...Ct,...He],zn=new Set([...He,...It,...Pt,...Ct]),kt=Fn.filter((e)=>e!=="chromium"&&!zn.has(e)),jn=["Xvfb","openbox","x11vnc","xdotool","dbus-launch","python3","ffmpeg","tmux"],ce="/usr/bin/chromium",Vn=["/usr/local/bin","/usr/bin","/bin","/opt/homebrew/bin"];function Rt(e=process.platform,t=process.arch){let n=`${e}-${t}`;return n==="linux-x64"||n==="linux-arm64"||n==="darwin-arm64"||n==="win32-x64"||n==="win32-arm64"?n:null}function K(e){return e==="win32-x64"||e==="win32-arm64"}function Fe(e){return K(e)?`node-v${ue}-${e.replace("win32","win")}`:`node-v${ue}-${e}`}function pe(e){return{node:{version:ue,url:`https://nodejs.org/dist/v${ue}/${Fe(e)}${K(e)?".zip":".tar.gz"}`,sha256:Bn[e]},open_computer_use:{version:A.ocu.version,url:J.ocu.url,sha256:J.ocu.sha256},open_browser_use:{version:A.obu.version,url:J.obu.url,sha256:J.obu.sha256},...e==="darwin-arm64"?{chrome_for_testing:{version:F.version,url:`https://storage.googleapis.com/chrome-for-testing-public/${F.version}/mac-arm64/chrome-mac-arm64.zip`,sha256:F.macArm64Sha256}}:K(e)?{chrome_for_testing:{version:F.version,url:`https://storage.googleapis.com/chrome-for-testing-public/${F.version}/win64/chrome-win64.zip`,sha256:F.win64Sha256}}:{}}}function Gn(e){let t={extension:le};for(let[n,o]of Object.entries(pe(e)))t[n]=`${o.version}@${o.sha256}`;return t}function Mt(e){return y(e,".local","share","reason","desktop")}function wn(e,t=Ko()){let n=Mt(t),o=(f)=>y(n,f,pe(e)[f]?.version??""),i=o("open_computer_use"),a=o("open_browser_use"),c=e==="darwin-arm64",p=K(e),w=y(t,"Library","Application Support"),b=y(process.platform==="win32"&&process.env.LOCALAPPDATA?process.env.LOCALAPPDATA:y(t,"AppData","Local"),"OpenBrowserUse"),h=c?y(w,"Google","Chrome","NativeMessagingHosts",`${z}.json`):p?y(b,"NativeMessagingHosts",`${z}.json`):y(t,".config","google-chrome","NativeMessagingHosts",`${z}.json`);return{root:n,automation:y(Be(n),"automation"),receipt:y(n,"receipt.json"),minimal:je(t),node:p?y(o("node"),Fe(e),"node.exe"):y(o("node"),"bin","node"),ocuDir:i,ocu:y(i,Le[e].ocu),ocuApp:c?y(i,"dist","Open Computer Use.app"):null,obuDir:a,obu:y(a,"cli","open-browser-use.js"),nativeHost:y(a,Le[e].obu),extensionDir:c?y(w,"OpenBrowserUse","chrome-extension","release"):p?y(b,"chrome-extension","release"):y(t,".local","share","open-browser-use","chrome-extension","release"),setupNativeHostManifest:h,nativeHostManifests:c?[h,y(w,"Google","ChromeForTesting","NativeMessagingHosts",`${z}.json`)]:p?[h]:[y(t,".config","chromium","NativeMessagingHosts",`${z}.json`),y(t,".config","google-chrome-for-testing","NativeMessagingHosts",`${z}.json`)],browser:c?y(o("chrome_for_testing"),St):p?y(o("chrome_for_testing"),Et):ce,userChromeHost:c?y(n,"user-chrome","reason-browser-use"):null,userChromeRegistration:c?y(w,"Google","Chrome","NativeMessagingHosts",`${Dt}.json`):null,ffmpegDir:y(n,"ffmpeg"),ffmpeg:c?y(n,"ffmpeg",W.version,"ffmpeg"):p?y(n,"ffmpeg",Ne.version,_t,"ffmpeg.exe"):null,ffprobe:c?y(n,"ffprobe",Hn.version,"ffprobe"):p?y(n,"ffmpeg",Ne.version,_t,"ffprobe.exe"):null}}function Tt(e){try{let t=JSON.parse(de(e,"utf8"));if(typeof t!=="object"||t===null)return null;let n=t,o=n.pins;if(n.schema_version!==1||typeof n.platform!=="string"||typeof o!=="object"||o===null||!Object.values(o).every((i)=>typeof i==="string")||!Un.includes(n.permissions)||!Array.isArray(n.missing_system_packages)||!n.missing_system_packages.every((i)=>typeof i==="string")||typeof n.updated_at!=="string")return null;return{schema_version:1,platform:n.platform,pins:o,permissions:n.permissions,missing_system_packages:n.missing_system_packages,updated_at:n.updated_at}}catch{return null}}function Wn(e,t,n=384){Tn(Be(e),{recursive:!0,mode:448});let o=`${e}.pending.${process.pid}`;Ln(o,t,{mode:n}),On(o,e)}function L(e){try{return Ue(e).isFile()}catch{return!1}}function Ot(e){try{let t=Ue(e);return t.isFile()&&(t.mode&73)!==0}catch{return!1}}function Kn(e){try{return de(e,"utf8")}catch{return null}}function B(e){for(let t of Vn){let n=y(t,e);try{let o=Ue(n);if(o.isFile()&&(o.mode&73)!==0)return n}catch{}}return null}function Xn(e){try{let t=JSON.parse(de(y(e,"package.json"),"utf8"));return typeof t==="object"&&t!==null&&typeof t.version==="string"?t.version:null}catch{return null}}function qn(e,t,n){let o=pe(n)[e];if(!o)return!1;let i=K(n);if(e==="node")return L(i?y(t,Fe(n),"node.exe"):y(t,"bin","node"));if(e==="chrome_for_testing")return L(y(t,i?Et:St));let a=Le[n][e==="open_computer_use"?"ocu":"obu"];return Xn(t)===o.version&&L(y(t,a))&&(e==="open_computer_use"||L(y(t,"cli","open-browser-use.js")))}function Yn(e){return vt("sha256").update(Buffer.from(e,"base64")).digest("hex").slice(0,32).replace(/./g,(t)=>String.fromCharCode(97+Number.parseInt(t,16)))}function ze(e){try{let t=JSON.parse(de(e,"utf8"));return typeof t==="object"&&t!==null&&!Array.isArray(t)?t:null}catch{return null}}function Jn(e){let t=ze(y(e.extensionDir,"manifest.json"));return t!==null&&t.version===A.obu.version&&typeof t.key==="string"&&Yn(t.key)===le}function Zn(e,t){let n=e?.allowed_origins;return e!==null&&e.name===z&&Array.isArray(n)&&n.length===1&&n[0]===`chrome-extension://${le}/`&&(t===void 0||e.path===t)}function Qn(e){return Jn(e)&&L(e.nativeHost)&&e.nativeHostManifests.every((t)=>Zn(ze(t),e.nativeHost))}function es(e){return`#!/bin/sh
|
|
73
|
-
# Reason's Chrome extension host (reason desktop install): Open Browser Use on Reason's socket directory.
|
|
74
|
-
obu=${`'${e.replaceAll("'","'\\''")}'`}
|
|
75
|
-
case "$1" in
|
|
76
|
-
chrome-extension://*) exec "$obu" host --socket-dir ${yn} ;;
|
|
77
|
-
mcp) shift; exec "$obu" mcp --socket-dir ${yn} "$@" ;;
|
|
78
|
-
esac
|
|
79
|
-
exec "$obu" "$@"
|
|
80
|
-
`}function ts(e){let t=ze(e),n=t?.allowed_origins;return t!==null&&t.name===Dt&&t.type==="stdio"&&Array.isArray(n)&&n.includes(`chrome-extension://${Gt}/`)&&typeof t.path==="string"&&Ot(t.path)}function ss(e,t){if(!e.userChromeHost||!e.userChromeRegistration)return null;if(!t||Kn(e.userChromeHost)!==es(e.nativeHost)||!Ot(e.userChromeHost))return{code:"user_chrome_browser_use_missing"};return ts(e.userChromeRegistration)?{host:e.userChromeHost}:{code:"user_chrome_native_host_unregistered"}}var rs={display:["display","desktop_session","desktop_video"],computer:["display","desktop_session","system_packages","node","open_computer_use"],browser:["display","desktop_session","system_packages","node","open_computer_use","open_browser_use","browser_extension","browser","chrome_for_testing"]};function T(e={}){let t=e.platform===void 0?Rt():e.platform;if(!t)return null;let n=wn(t,e.home),o=Tt(n.receipt),i=Gn(t),a=o!==null&&o.platform===t&&JSON.stringify(Object.entries(o.pins).sort())===JSON.stringify(Object.entries(i).sort()),c=[],p=pe(t);for(let u of["node","open_computer_use","open_browser_use","chrome_for_testing"]){let _=p[u];if(!_)continue;let v=qn(u,y(n.root,u,_.version),t),E=o?.pins[u],N=v&&E===i[u]?"ready":E!==void 0&&E!==i[u]?"outdated":"missing";c.push({name:u,state:N,detail:_.version})}let w=o?.pins.extension===le&&Qn(n);c.push({name:"browser_extension",state:w?"ready":"missing",detail:le});let b=B("Xvfb"),h=B("x11vnc"),f=B("openbox");if(K(t))c.push(yt()?{name:"desktop_session",state:"ready",detail:"signed-in desktop session"}:{name:"desktop_session",state:"missing",detail:"run the worker in the signed-in desktop session, not as a service"}),c.push(n.ffmpeg&&L(n.ffmpeg)?{name:"desktop_video",state:"ready",detail:n.ffmpeg}:{name:"desktop_video",state:"missing",detail:"run `reason desktop install` for desktop video"});else if(t!=="darwin-arm64"){c.push(L(ce)?{name:"browser",state:"ready",detail:ce}:{name:"browser",state:"missing",detail:`non-snap Chromium at ${ce}`});let u=b!==null&&h!==null&&f!==null;c.push({name:"display",state:u?"ready":"missing",detail:"Xvfb + openbox + x11vnc"});let _=jn.filter((I)=>B(I)===null),v=(o?.missing_system_packages??kt).filter((I)=>kt.includes(I)),E=_.length===0&&v.length===0;c.push(E?{name:"system_packages",state:"ready"}:{name:"system_packages",state:"missing",detail:[...new Set([...v,..._])].join(" ")});let N=He.filter((I)=>B(I)===null);c.push(N.length===0?{name:"desktop_look",state:"ready"}:{name:"desktop_look",state:"missing",detail:N.join(" ")})}let x=n.ffmpeg&&L(n.ffmpeg)?n.ffmpeg:B("ffmpeg"),m=!x?null:x===n.ffmpeg?n.ffprobe:y(Be(An(x)),"ffprobe"),R=a&&c.every((u)=>u.state==="ready"),S=(u)=>a&&c.every((_)=>!rs[u].includes(_.name)||_.state==="ready");return{platform:t,root:n.root,automation:n.automation,ready:R,features:{display:S("display"),computer:S("computer"),browser:S("browser")},node:n.node,ocu:n.ocu,obu:n.obu,nativeHost:n.nativeHost,extensionDir:n.extensionDir,browser:n.browser,ffmpeg:x,ffprobe:m&&L(m)?m:null,userChrome:ss(n,a&&["node","open_browser_use"].every((u)=>c.find((_)=>_.name===u)?.state==="ready")),pulseaudio:B("pulseaudio"),xvnc:B("Xvnc"),xvfb:b,x11vnc:h,openbox:f,components:c}}function At(e){return as(e)?ls():[]}function as(e){return e?.platform==="darwin-arm64"&&e.ffmpeg===y(e.root,"ffmpeg",W.version,"ffmpeg")}async function dc(e,t,n,o=fetch){try{let i=await o(e,{redirect:"follow"});if(!i.ok||!i.body)throw Error(`download failed (HTTP ${i.status}): ${e}`);let a=vt("sha256"),c=Cn(n,{mode:384});try{let w=i.body.getReader();for(let b=await w.read();!b.done;b=await w.read())if(a.update(b.value),!c.write(b.value))await Pn(c,"drain")}finally{c.end(),await Nn(c)}let p=a.digest("hex");if(p!==t)throw Error(`digest mismatch for ${e}: expected ${t}, got ${p}`)}catch(i){throw $n(n,{force:!0}),i}}function je(e){return y(Mt(e),"minimal.json")}function cs(e=s()){return Mn(je(e))}function pc(e={}){Wn(je(e.home??s()),`${JSON.stringify({version:1,minimal_at:(e.now?.()??new Date).toISOString()})}
|
|
81
|
-
`)}function hc(e={}){let t=e.platform===void 0?Rt():e.platform;if(t===null)return null;let n=e.home??s();if(Tt(wn(t,n).receipt)!==null)return"refresh";return cs(n)?null:"install"}import{spawn as us}from"child_process";import{existsSync as ds}from"fs";import{connect as ps}from"net";import{join as fe}from"path";var Lt="reason_desktop",Q={sampleRate:48000,channels:2,codec:"opus"},fs=5000,ms=107,gs=262144,zo=(e)=>fe(e,"native"),Kt=(e)=>`unix:${e}`;function Ve(e,t=1000){if(!ds(e))return Promise.resolve(!1);return new Promise((n)=>{let o=ps({path:e}),i=(a)=>{o.destroy(),n(a)};o.setTimeout(t,()=>i(!1)),o.once("error",()=>i(!1)),o.once("close",()=>i(!1)),o.once("connect",()=>i(!0))})}async function uc(e,t){if(!t)return null;let n=zo(e);if(Buffer.byteLength(n)>ms||/["'\\\s]/.test(n))return null;try{if(await Ve(n))return n;let o=us(t,["--daemonize=no","--system=no","--use-pid-file=no","--exit-idle-time=-1","--disallow-exit=yes","--realtime=no","--high-priority=no","--disallow-module-loading=yes","--log-level=warning",`--log-target=file:${fe(e,"pulseaudio.log")}`,"-n",`--load=module-native-protocol-unix socket="${n}" auth-anonymous=1 auth-cookie-enabled=0`,`--load=module-null-sink sink_name=${Lt} rate=${Q.sampleRate} channels=${Q.channels} sink_properties=device.description=Reason_desktop`],{detached:!0,stdio:"ignore",env:{HOME:e,PATH:"/usr/bin:/bin",XDG_RUNTIME_DIR:e,PULSE_RUNTIME_PATH:fe(e,"runtime"),PULSE_STATE_PATH:fe(e,"state")}}),i=!1;o.once("error",()=>{i=!0}),o.once("exit",()=>{i=!0}),o.unref();let a=Date.now()+fs;while(Date.now()<a){if(await Ve(n))return n;if(i)return await Ve(n)?n:null;await new Promise((c)=>setTimeout(c,50))}if(!i)o.kill("SIGKILL");return null}catch{return null}}function Nt(){let{sampleRate:e,channels:t}=Q;return["-hide_banner","-loglevel","error","-nostdin","-fflags","nobuffer","-f","pulse","-sample_rate",String(e),"-channels",String(t),"-fragment_size",String(e*t*2/50),"-i",`${Lt}.monitor`,"-vn","-ac",String(t),"-ar",String(e),"-c:a","libopus","-b:a","64k","-application","lowdelay","-frame_duration","20","-flush_packets","1","-page_duration","20000","-f","ogg","pipe:1"]}var hs=[79,103,103,83],bs=Buffer.from("OpusHead"),ys=Buffer.from("OpusTags"),$t=(e,t)=>e.byteLength>=t.byteLength&&t.every((n,o)=>e[o]===n);class Ge extends Error{constructor(e){super(e);this.name="OggProtocolError"}}class We{buffer=new Uint8Array(0);partial=[];partialBytes=0;push(e){let t=new Uint8Array(this.buffer.byteLength+e.byteLength);t.set(this.buffer),t.set(e,this.buffer.byteLength);let n=[],o=0;while(t.byteLength-o>=27){if(hs.some((x,m)=>t[o+m]!==x)||t[o+4]!==0)throw new Ge("invalid_page");let i=(t[o+5]&1)!==0,a=t[o+26];if(t.byteLength-o<27+a)break;let c=t.subarray(o+27,o+27+a),p=c.reduce((x,m)=>x+m,0),w=27+a+p;if(t.byteLength-o<w)break;if(!i&&this.partialBytes>0)this.resetPartial();let b=i&&this.partialBytes===0,h=o+27+a,f=h;for(let x of c){if(h+=x,x===255)continue;if(this.appendPartial(t.subarray(f,h),b),f=h,!b){let m=this.takePartial();if(m.byteLength>0&&!$t(m,bs)&&!$t(m,ys))n.push(m)}b=!1,this.resetPartial()}if(f<h)this.appendPartial(t.subarray(f,h),b);o+=w}return this.buffer=t.slice(o),n}appendPartial(e,t){if(t||e.byteLength===0)return;if(this.partialBytes+=e.byteLength,this.partialBytes>gs)throw new Ge("packet_too_large");this.partial.push(e.slice())}takePartial(){if(this.partial.length===1)return this.partial[0];let e=new Uint8Array(this.partialBytes),t=0;for(let n of this.partial)e.set(n,t),t+=n.byteLength;return e}resetPartial(){this.partial=[],this.partialBytes=0}}import{spawn as ws}from"child_process";var Ut=1048576,xs=String.raw`
|
|
82
|
-
import gi, json, os, sys
|
|
83
|
-
gi.require_version("Gtk", "3.0")
|
|
84
|
-
from gi.repository import Gtk, Gdk, GLib
|
|
85
|
-
if not Gtk.init_check()[0]:
|
|
86
|
-
sys.exit(1)
|
|
87
|
-
clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
|
|
88
|
-
pending = b""
|
|
89
|
-
generation = 0
|
|
90
|
-
def send(value):
|
|
91
|
-
print(json.dumps(value, ensure_ascii=True), flush=True)
|
|
92
|
-
def changed(clipboard, event):
|
|
93
|
-
global generation
|
|
94
|
-
generation += 1
|
|
95
|
-
current = generation
|
|
96
|
-
def received(clipboard, text, unused):
|
|
97
|
-
if current == generation and text is not None and len(text.encode("utf-8")) <= ${O}:
|
|
98
|
-
send({"text": text})
|
|
99
|
-
clipboard.request_text(received, None)
|
|
100
|
-
# No request_text on startup: never share the pre-existing clipboard.
|
|
101
|
-
clipboard.connect("owner-change", changed)
|
|
102
|
-
def input_ready(fd, condition):
|
|
103
|
-
global pending
|
|
104
|
-
chunk = os.read(fd, 65536)
|
|
105
|
-
if not chunk:
|
|
106
|
-
Gtk.main_quit()
|
|
107
|
-
return False
|
|
108
|
-
pending += chunk
|
|
109
|
-
while b"\n" in pending:
|
|
110
|
-
line, pending = pending.split(b"\n", 1)
|
|
111
|
-
text = json.loads(line)
|
|
112
|
-
if not isinstance(text, str) or len(text.encode("utf-8")) > ${O} or "\x00" in text:
|
|
113
|
-
sys.exit(1)
|
|
114
|
-
clipboard.set_text(text, -1)
|
|
115
|
-
send("ack")
|
|
116
|
-
if len(pending) > ${O*6+2}:
|
|
117
|
-
sys.exit(1)
|
|
118
|
-
return True
|
|
119
|
-
GLib.io_add_watch(0, GLib.IO_IN | GLib.IO_HUP, input_ready)
|
|
120
|
-
send("ready")
|
|
121
|
-
Gtk.main()
|
|
122
|
-
`;function Bt(e,t){let n=ws("/usr/bin/python3",["-I","-u","-c",xs],{env:{DISPLAY:e.display,XAUTHORITY:e.xauthority},stdio:["pipe","pipe","ignore"]}),o=!1,i=!0,a="",c=0,p=[],w=setTimeout(()=>h(),5000),b=()=>{o=!0,clearTimeout(w),p.length=0,n.kill("SIGKILL")},h=()=>{if(o)return;b(),t.end({error:new r("display_unavailable","Reason could not start this Linux desktop's UTF-8 clipboard.")})},f=(x,m=32)=>{if(o)return;if(!i){x();return}if(c+=m,c>Ut)b(),t.end({reason:"input_backpressure"});else p.push({apply:x,bytes:m})};return n.stdout.on("data",(x)=>{if(o)return;a+=x.toString("ascii");for(let m=a.indexOf(`
|
|
123
|
-
`);m>=0;m=a.indexOf(`
|
|
124
|
-
`)){let R=a.slice(0,m);a=a.slice(m+1);let S;try{S=JSON.parse(R)}catch{h();return}if(S==="ready"||S==="ack"){clearTimeout(w),i=!1;while(!i&&!o&&p.length){let u=p.shift();c-=u.bytes,u.apply()}}else if(S&&typeof S==="object"&&"text"in S&&typeof S.text==="string"&&Buffer.byteLength(S.text)<=O)t.clipboard(S.text);else{h();return}if(o)return}if(a.length>O*6+32)h()}),n.stdin.on("error",h),n.once("error",h),n.once("exit",h),{apply:f,write(x){if(Buffer.byteLength(x)>O||x.includes("\x00")){h();return}let m=`${JSON.stringify(x)}
|
|
125
|
-
`;f(()=>{if(i=!0,w=setTimeout(()=>h(),5000),n.stdin.write(m),n.stdin.writableLength>Ut)b(),t.end({reason:"input_backpressure"})},Buffer.byteLength(m))},close:b}}var X={smooth:{fps:60,crf:23,kbps:8000,x264Preset:"ultrafast",threads:2,scale:1},sharp:{fps:30,crf:19,kbps:1e4,x264Preset:"superfast",scale:1},data_saver:{fps:20,crf:28,kbps:2000,x264Preset:"ultrafast",scale:0.75},balanced:{fps:30,crf:23,kbps:4000,x264Preset:"ultrafast",threads:2,scale:1}},Ss="avc1.4D002A",Ht={width:1920,height:1080},Es=262144,Ds=0.2,Is=250,Ps=1e4,Cs=1024,Ke=1e4,Rs=500,Ms=60,Ts=1e4,Os=1000,Ft=1048576,As=-223,$s=-308,qo={kind:"mac_screen",sound:null},Wo={kind:"windows_screen",sound:null},Ls,zt=()=>Ls??=T()?.ffmpeg??null,ge=(e,t,n)=>qe(e,t,{env:n,stdio:["ignore","pipe","ignore"],windowsHide:!0}),Ns,Ye=()=>Ns??=At(T()),jt=(e,t,n)=>{let[o,...i]=[...Ye(),e];return ge(o,[...i,...t],n)},Vt=()=>on?.videotoolbox?"h264_videotoolbox":"libx264",Us=()=>Math.round(performance.now()*1000),Xe=new Set,Wt=!1;function en(e){if(Xe.add(e),e.once("exit",()=>Xe.delete(e)),Wt)return;Wt=!0,process.once("exit",()=>{for(let t of Xe)try{t.kill("SIGKILL")}catch{}})}function tn(e){try{e.stdout?.destroy()}catch{}if(e.exitCode!==null||e.signalCode!==null)return;try{e.kill("SIGTERM")}catch{return}let t=setTimeout(()=>{if(e.exitCode===null&&e.signalCode===null)try{e.kill("SIGKILL")}catch{}},Rs);e.once("exit",()=>clearTimeout(t))}function Bs(e,t,n){return{args:["-f","x11grab","-draw_mouse","1","-framerate",String(e),"-video_size",`${t.width}x${t.height}`,"-i",n],size:t}}function Hs(e){return{args:["-f","avfoundation","-capture_cursor","1","-pixel_format","nv12","-framerate",String(e),"-i","Capture screen 0:none"],size:null}}function Fs(e,t){return{args:["-f","gdigrab","-draw_mouse","1","-framerate",String(e),"-offset_x","0","-offset_y","0","-video_size",`${t.width}x${t.height}`,"-i","desktop"],size:t}}function zs(e){return{args:["-probesize","32","-analyzeduration","0","-f","image2pipe","-c:v","mjpeg","-framerate",String(e),"-i","pipe:0"],size:null}}var nn=1700000;function sn(e){return Math.min(1,Math.round(Math.sqrt(nn/(e.width*e.height))*100)/100)}function js(e,t,n){let o=qe(n.axe,["stream-video","--udid",n.udid,"--format","ffmpeg","--fps","30","--quality","85","--scale",String(Math.min(0.99,sn(n.size)))],{stdio:["ignore","pipe","ignore"]}),i=qe(e,t,{env:{},stdio:["pipe","pipe","ignore"]});o.stdout.pipe(i.stdin),i.stdin.on("error",()=>{});let a=()=>{if(o.exitCode===null&&o.signalCode===null)o.kill("SIGTERM")};return i.once("exit",a),i.once("error",a),o.once("exit",()=>{if(i.exitCode===null&&i.signalCode===null)i.kill("SIGTERM")}),o.once("error",()=>{if(i.exitCode===null&&i.signalCode===null)i.kill("SIGTERM")}),i}function qt(e){let t=Math.min(1,Ht.width/e.width,Ht.height/e.height);return{width:Math.round(e.width*t),height:Math.round(e.height*t)}}function me(e,t,n,o="libx264"){let i=X[e],a=(f)=>Math.max(2,Math.floor(f/2)*2),c={width:a(n.width*i.scale),height:a(n.height*i.scale)},p=c.width!==t.size?.width||c.height!==t.size.height,w=Math.max(1,Math.round(i.kbps*2/i.fps)),b=["-g",String(i.fps*Ms)],h=o==="h264_videotoolbox"?["-c:v","h264_videotoolbox","-realtime","1","-prio_speed","1","-allow_sw","1","-profile:v","main","-level","4.2","-bf","0","-pix_fmt","nv12",...b,"-b:v",`${i.kbps}k`,"-maxrate",`${i.kbps}k`,"-bufsize",`${w}k`,"-bsf:v","h264_metadata=aud=insert"]:["-c:v","libx264","-preset",i.x264Preset,"-tune","zerolatency","-profile:v","main","-level","4.2","-bf","0","-pix_fmt","yuv420p",...i.threads?["-threads",String(i.threads)]:[],"-x264-params","aud=1:repeat-headers=1",...b,"-crf",String(i.crf),"-maxrate",`${i.kbps}k`,"-bufsize",`${w}k`];return["-hide_banner","-loglevel","error","-nostdin","-fflags","nobuffer",...t.args,"-an",...p?["-vf",`scale=${c.width}:${c.height}:flags=fast_bilinear`]:[],...h,"-flush_packets","1","-f","h264","pipe:1"]}class rn{buffer=new Uint8Array(0);scanned=0;key=!1;micros=0;push(e,t){if(this.buffer.byteLength===0)this.micros=t;let n=new Uint8Array(this.buffer.byteLength+e.byteLength);n.set(this.buffer),n.set(e,this.buffer.byteLength),this.buffer=n;let o=[],i=this.scanned;while(i+3<this.buffer.byteLength){if(this.buffer[i]!==0||this.buffer[i+1]!==0||this.buffer[i+2]!==1){i++;continue}let a=this.buffer[i+3]&31,c=i>0&&this.buffer[i-1]===0?i-1:i;if(a===9&&c>0)o.push({data:this.buffer.slice(0,c),key:this.key,micros:this.micros}),this.buffer=this.buffer.subarray(c),this.key=!1,this.micros=t,i-=c;if(a===5)this.key=!0;i+=3}return this.scanned=i,o}}function Vs(e,t){let n=vs({path:e}),o=Buffer.alloc(0),i="version",a=0,c=!1,p=[],w=0,b=!1,h=(u)=>{if(b)return;b=!0,n.destroy(),t.end(u)},f=()=>h({reason:"display_protocol"}),x=(u)=>{if(b)return;if(!c){if(w+=u.byteLength,w>Ft)h({reason:"input_backpressure"});else p.push(u);return}if(n.write(u),n.writableLength>Ft)h({reason:"input_backpressure"})},m=(u)=>{o=o.subarray(u)},R=()=>{switch(i){case"version":{if(o.byteLength<12)return!1;let u=/^RFB (\d{3})\.(\d{3})\n$/.exec(o.subarray(0,12).toString("latin1"));if(!u||Number(u[1])*1000+Number(u[2])<3007)return f(),!1;return m(12),n.write(`RFB 003.007
|
|
126
|
-
`),i="security",!0}case"security":{if(o.byteLength<1)return!1;let u=o[0];if(u===0)return f(),!1;if(o.byteLength<1+u)return!1;if(!o.subarray(1,1+u).includes(1))return f(),!1;return m(1+u),n.write(Buffer.from([1,1])),i="init",!0}case"init":{if(o.byteLength<24)return!1;let u=o.readUInt32BE(20);if(u>65536)return f(),!1;if(o.byteLength<24+u)return!1;let _={width:o.readUInt16BE(0),height:o.readUInt16BE(2)};if(m(24+u),_.width===0||_.height===0)return f(),!1;i="messages";let v=Buffer.alloc(12);v.writeUInt8(2,0),v.writeUInt16BE(2,2),v.writeInt32BE($s,4),v.writeInt32BE(As,8),n.write(v),c=!0;for(let E of p)n.write(E);return p=[],w=0,t.ready(_),!b}case"skip":{let u=Math.min(a,o.byteLength);if(m(u),a-=u,a>0)return!1;return i="messages",!0}case"messages":{if(o.byteLength<1)return!1;switch(o[0]){case 1:{if(o.byteLength<6)return!1;let u=6+o.readUInt16BE(4)*6;if(o.byteLength<u)return!1;return m(u),!0}case 2:return m(1),!0;case 3:{if(o.byteLength<8)return!1;let u=o.readUInt32BE(4);if(u>O/2)return m(8),i="skip",a=u,!0;if(o.byteLength<8+u)return!1;let _=o.subarray(8,8+u).toString("latin1");return m(8+u),t.clipboard(_),!b}default:return f(),!1}}}},S=!1;return n.once("connect",()=>{S=!0}),n.on("data",(u)=>{if(b)return;o=o.byteLength?Buffer.concat([o,u]):u;while(!b&&R());}),n.once("error",()=>{if(!S)h({error:new r("display_unavailable","Reason could not reach this machine's desktop server.")})}),n.once("close",()=>h({reason:"display_closed"})),{pointer(u,_,v){let E=Buffer.alloc(6);E.writeUInt8(5,0),E.writeUInt8(v&255,1),E.writeUInt16BE(u,2),E.writeUInt16BE(_,4),x(E)},key(u,_){let v=Buffer.alloc(8);v.writeUInt8(4,0),v.writeUInt8(u?1:0,1),v.writeUInt32BE(_>>>0,4),x(v)},clipboard(u){if(Array.from(u).some((E)=>E.codePointAt(0)>255)){h({reason:"clipboard_unicode_unsupported"});return}let _=Buffer.from(u,"latin1"),v=Buffer.alloc(8);v.writeUInt8(6,0),v.writeUInt32BE(_.byteLength,4),x(Buffer.concat([v,_]))},close(){b=!0,n.destroy()}}}class Je{run=null;viewers=new Set;get running(){return this.run!==null}start(e,t,n,o){this.viewers.add(e),this.stop();let i;try{i=n()}catch{this.fail();return}en(i);let a={child:i,splitter:new rn};this.run=a;for(let p of[...this.viewers])p.started(t);i.stdout?.on("data",(p)=>{if(this.run!==a)return;for(let w of a.splitter.push(p,o()))for(let b of[...this.viewers])b.unit(w)});let c=()=>{if(this.run!==a)return;this.run=null,this.fail()};i.once("exit",c),i.once("error",c)}leave(e){if(!this.viewers.delete(e))return;if(this.viewers.size===0)this.stop()}stop(){if(!this.run)return;tn(this.run.child),this.run=null}fail(){for(let e of[...this.viewers])e.failed()}}var Yt=new WeakMap;function Gs(e){let t=Yt.get(e);if(!t)Yt.set(e,t=new Je);return t}var ee=new Map;function Vo(e,t,n={}){let o=n.micros??Us,i=new ns,a=t.request.preset,c=null,p=null,w=null,b=!1,h=null,f=!1,x=!1,m=null,R=0,S=0,u=!1,_=null,v=null,E=0,N=null,I=[],te=0,U=[],Ze=new Uint32Array(Ke+1),he=0,be=null,ye=0,q=0,we=0,Qe=0,et=0,ne=null,xe=0,j={frames:0,bytes:0,since:o()},V=[],Y=0,_e,ke=!1,cn=o(),C={},G=()=>Math.round((o()-cn)/1000),tt=n.control??ut,ve=null,Se=null,nt=0,Ee=!1,st={pause(){if(!h?.running)return;h.stop(),Ee=!0},adopt(l){let d=l!==null&&(l.width!==p?.width||l.height!==p?.height);if(d)p=l;if(!d&&!Ee)return;if(Ee=!1,h)ae();else Pe()}},un=(l)=>{if(!n.resizeDesktop||!c||"kind"in c||e.done)return;let d=c.display,g=()=>[...ee.get(d)??[]];nt++,n.resizeDesktop(c,l,()=>{for(let k of g())k.pause()}).then((k)=>{for(let D of g())D.adopt(k)})},M=(l)=>{let d=Rn(l);return e.send(d),Qe+=d.byteLength,d.byteLength},se=(l)=>{if(e.done)return;if(e.open)M({type:"error",code:l});e.end({reason:l})},re=()=>Math.max(Es,X[a].kbps*1000/8*Ds),oe=()=>o()/1000,ln=()=>{while(U.length>1&&U[0].atMs<oe()-Ps)U.shift();return U[0]?.rttMs??null},rt=(l)=>{let d=ln();if(d===null||I.length===0)return!1;let g=(d+Is)*l;return oe()-I[0].sentMs>g||te>g/1000*X[a].kbps*1000/8},dn=(l)=>{if(E===0)return;let d=Math.min(l,E-1);if(N!==null&&d<=N)return;N=d;let g=oe();while(I.length&&I[0].seq<=d){let k=I.shift();if(te-=k.bytes,k.seq!==d)continue;let D=Math.max(0,g-k.sentMs);while(U.length&&U.at(-1).rttMs>=D)U.pop();U.push({atMs:g,rttMs:D}),Ze[Math.min(Ke,Math.round(D))]++,he++,be=Math.min(be??D,D)}},pn=()=>{let l=0;for(let d=0;d<=Ke;d++)if(l+=Ze[d],l*2>=he)return d;return 0},fn=()=>e.bufferedAmount<=re()/2&&!rt(0.5),ot=()=>{ke=!0,V=[],Y=0,h?.leave(De),h=null},it=(l)=>{if(e.done)return;if(l.key)C.first_key_ms??=G();if(!b){if(!h||V.length===0&&!l.key)return;if(V.push(l),Y+=l.data.byteLength,Y>re())ot();return}if(u){q++;return}if(e.bufferedAmount>re()||rt(1)){u=!0,q++,_=setInterval(()=>{if(e.done||!fn())return;if(_)clearInterval(_);_=null,u=!1,ae()},n.drainPollMs??25);return}if(!f){if(!l.key){q++;return}if(M({type:"hello",width:p.width,height:p.height,fps:X[a].fps,preset:a,codec:Ss}),f=!0,C.first_frame_ms??=G(),!x&&c?.sound)M({type:"audioHello",...Q}),x=!0}let d=M({type:"frame",key:l.key,seq:E,captureMicros:l.micros,data:l.data});if(I.push({seq:E,sentMs:oe(),bytes:d}),te+=d,I.length>Cs)te-=I.shift().bytes;E++,ye++,ne??=l.micros,xe=l.micros,j.frames++,j.bytes+=d},De={started(l){a=l,f=!1,V=[],Y=0},unit:it,failed:()=>se("encoder_failed")},Ie=()=>{let l=(n.ffmpeg??zt)();if(!c||!p){se("encoder_failed");return}let[d,g]=[c,p],k="kind"in d&&d.kind==="simulator"?d.stream:null;if(!l&&!k){se("encoder_failed");return}if(h??="kind"in d&&d.kind==="mac_screen"?Gs(n.spawn??jt):new Je,C.encoder_ms===void 0)C.encoder_ms=G(),C.encoder_shared=h.running;h.start(De,a,()=>{let D=X[a].fps;if(k)return k(D,X[a].kbps,nn);if("kind"in d&&d.kind==="simulator"){let P=Math.min(0.99,sn(d.size)),H={width:d.size.width*P,height:d.size.height*P};return js(l,me(a,zs(Math.min(D,30)),H,(n.macEncoder??Vt)()),d)}if("kind"in d&&d.kind==="windows_screen")return(n.spawn??ge)(l,me(a,Fs(D,g),qt(g)),{SystemRoot:process.env.SystemRoot??"C:\\Windows"});return"kind"in d?(n.spawn??jt)(l,me(a,Hs(D),qt(g),(n.macEncoder??Vt)()),{}):(n.spawn??ge)(l,me(a,Bs(D,g,d.display),g),{DISPLAY:d.display,XAUTHORITY:d.xauthority})},o)},ie=()=>{if(!m)return;tn(m.child),m=null},mn=()=>{let l=(n.ffmpeg??zt)();if(m||e.done||!x||!c?.sound||!l)return;let d;try{d=(n.spawn??ge)(l,Nt(),{PULSE_SERVER:Kt(c.sound)})}catch{return}en(d);let g={child:d,reader:new We};m=g,d.stdout?.on("data",(D)=>{if(m!==g||e.done)return;let P;try{P=g.reader.push(D)}catch{ie();return}let H=o();for(let Re of P){if(e.bufferedAmount>re()){S++;continue}M({type:"audio",captureMicros:H,data:Re}),R++}});let k=()=>{if(m===g)ie()};d.once("exit",k),d.once("error",k)},ae=()=>{if(!h||e.done)return;we++,Ie()},Pe=()=>{if(e.done||!p)return;if(!b){if(h||ke)return;Ie(),_e=setTimeout(()=>{if(!b)ot()},Ts);return}if(clearTimeout(_e),C.encoder_early===void 0){if(C.encoder_early=h!==null,ke)C.hold_lapsed=!0}if(!h)Ie();let l=V;V=[],Y=0;for(let d of l)it(d);v??=setInterval(()=>{let d=o(),g=Math.max(0.001,(d-j.since)/1e6);M({type:"stats",stats:{fps:Math.round(j.frames/g*10)/10,kbps:Math.round(j.bytes*8/1000/g),dropped:q,restarts:we,queued_bytes:e.bufferedAmount}}),j={frames:0,bytes:0,since:d}},Os)};t.desktop.then((l)=>{if(e.done)return;c=l;let d={ready(g){p=g,C.desktop_ms??=G(),Pe()},clipboard(g){if(e.open&&Buffer.byteLength(g)<=O)M({type:"serverClipboard",text:g})},end(g){if("reason"in g&&e.open)M({type:"error",code:g.reason});e.end(g)}};if("kind"in l&&l.kind==="simulator")w=l.input,d.ready(l.points);else if("kind"in l&&l.kind==="windows_screen")w=(n.windowsInput??xt)(d);else if("kind"in l)w=(n.macInput??((g)=>os(g,Ye())))(d);else{let g=ee.get(l.display);if(!g)ee.set(l.display,g=new Set);g.add(st);let k=(n.linuxClipboard??Bt)(l,d),D=Vs(l.rfbSocket,{...d,clipboard:(P)=>{if(!k)d.clipboard(P)}});w=k?{pointer:(P,H,Re)=>k.apply(()=>D.pointer(P,H,Re)),key:(P,H)=>k.apply(()=>D.key(P,H)),clipboard:(P)=>k.write(P),close(){k.close(),D.close()}}:D}at()},(l)=>e.end({error:l}));function at(){if(Se||!t.viewerSameNetwork||!b||e.done||!c||!("kind"in c)||c.kind!=="mac_screen")return;Se=(n.macWindows??is)((l)=>{if(e.open)M({type:"windows",bounds:l})})}let ct={viewer:t.viewer??null,notify(l){if(e.open)M({type:"control",control:l})}},Ce=(l)=>{if(!w)return;if(!c||!("kind"in c)||c.kind!=="simulator")tt.claim(ct);l(w)};return{opened(){C.relay_ms??=G()},received(l){et+=l.byteLength;let d;try{d=i.push(l)}catch{se("viewer_protocol");return}for(let g of d){if(e.done)return;switch(g.type){case"ping":M({type:"pong",token:g.token});break;case"pointer":Ce((k)=>k.pointer(g.x,g.y,g.buttons));break;case"key":Ce((k)=>k.key(g.down,g.keysym));break;case"clientClipboard":Ce((k)=>k.clipboard(g.text));break;case"config":if(g.preset!==a)a=g.preset,ae();break;case"keyframeRequest":if(f&&!u)ae();break;case"ack":dn(g.seq);break;case"audioEnable":if(g.on)mn();else ie();break;case"resize":un({width:g.width,height:g.height});break;default:break}}if(!b&&!e.done){if(b=!0,C.viewer_ms=G(),t.viewer)ve=tt.join(ct);Pe(),at()}},close(){if(c&&!("kind"in c)){let l=ee.get(c.display);if(l?.delete(st),l?.size===0)ee.delete(c.display)}if(ve?.(),ve=null,Se?.close(),_)clearInterval(_);if(v)clearInterval(v);clearTimeout(_e),h?.leave(De),ie(),w?.close()},summary:()=>({output_bytes:Qe,input_bytes:et,video:{preset:a,frames:ye,dropped:q,restarts:we,avg_fps:ne!==null&&xe>ne?Math.round((ye-1)/((xe-ne)/1e6)*10)/10:0,min_rtt_ms:Math.round(be??0),p50_rtt_ms:he?pn():0,audio_packets:R,audio_dropped:S,resizes:nt,connect:C}})}}var Zt=null,on=null,Ws=null,Ks=null;function Xs(){let e=T();return e?.features.display?e.ffmpeg:null}function an(e){return Zt??=new Promise((t)=>{_s(e,["-hide_banner","-encoders"],{env:{},timeout:5000,killSignal:"SIGKILL",maxBuffer:1048576,encoding:"utf8"},(n,o)=>{let i=(a)=>!n&&new RegExp(`^\\s*V\\S*\\s+${a}\\s`,"m").test(o);t(on={x264:i("libx264"),videotoolbox:i("h264_videotoolbox")})})}),Zt}var Qt=null;function Go(){return Qt??=(async()=>{let e=[T()?.ffmpeg,"/opt/homebrew/bin/ffmpeg","/usr/local/bin/ffmpeg"].find((n)=>Boolean(n&&ks(n)));if(!e)return null;let t=await an(e);return t.videotoolbox||t.x264?e:null})(),Qt}function Jt(e=process.platform,t={}){if(e!=="linux"&&e!=="darwin"&&e!=="win32")return Promise.resolve(!1);let n=(t.ffmpeg??Xs)();if(!n)return Promise.resolve(!1);let o=(t.encoders??an)(n);if(e==="linux")return o.then((a)=>a.x264);if(e==="win32"){let a=t.windowsScreen?t.windowsScreen():Ks??=bt();return Promise.all([o,a]).then(([c,p])=>c.x264&&(p?.session??0)>0)}let i=t.macScreen?t.macScreen():Ws??=Xt(Ye());return Promise.all([o,i]).then(([a,c])=>(a.x264||a.videotoolbox)&&c?.screen===!0&&c.accessibility)}
|
|
127
|
-
export{Gt,lc,le,zo,Kt,uc,qo,Wo,Vo,Go,Jt,yn,wn,T,dc,pc,hc};
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{ts,rs,Tc,Rn}from"./vm-hands-entry-lite-j10cw3d9.js";import{zo,Kt,uc,qo,Wo,Vo,Jt,T}from"./vm-hands-entry-lite-hn9pq7zj.js";import{Br}from"./vm-hands-entry-lite-z0ht62s4.js";import{_i}from"./vm-hands-entry-lite-hxfxs7r9.js";import{Se}from"./vm-hands-entry-lite-pxtycfdv.js";import{s}from"./vm-hands-entry-lite-zawytz09.js";import{r}from"./vm-hands-entry-lite-qy9xg6em.js";import{execFile as de,spawn as se}from"child_process";import{randomBytes as qe}from"crypto";import{chmodSync as Ce,existsSync as ce,lstatSync as Ge,mkdirSync as Oe,readFileSync as ne,rmSync as ae,writeFileSync as N}from"fs";import{connect as he}from"net";import{join as I}from"path";var B=32,P=76;var M="./desktop-wallpaper-fd8f2wb2.jpg";var m="./dock-browser-y53t41cx.png";var v="./dock-files-cp52htdw.png";var Z="./dock-terminal-1es514yq.png";var V="./grok-wallpaper-71zwn2pj.jpg";var z="./grok-dock-browser-pzw59wnd.png";var W="./grok-dock-files-eckq444x.png";var j="./grok-dock-terminal-hcpz3e43.png";var U=`# Sets the X root window background and _XROOTPMAP_ID, as feh --bg-fill does.
|
|
3
|
-
# The native Blaxel image ships no feh, hsetroot or compositor, but it does ship
|
|
4
|
-
# python3-gi and libX11. tint2 reads _XROOTPMAP_ID to draw its transparent panel.
|
|
5
|
-
# Usage: DISPLAY=:99 python3 set-root-wallpaper.py IMAGE
|
|
6
|
-
import ctypes, sys
|
|
7
|
-
import gi
|
|
8
|
-
gi.require_version("GdkPixbuf", "2.0")
|
|
9
|
-
from gi.repository import GdkPixbuf
|
|
10
|
-
x = ctypes.cdll.LoadLibrary("libX11.so.6")
|
|
11
|
-
x.XOpenDisplay.restype = ctypes.c_void_p
|
|
12
|
-
x.XOpenDisplay.argtypes = [ctypes.c_char_p]
|
|
13
|
-
d = x.XOpenDisplay(None)
|
|
14
|
-
if not d: sys.exit("no display")
|
|
15
|
-
for name, res, args in [
|
|
16
|
-
("XDefaultScreen", ctypes.c_int, [ctypes.c_void_p]),
|
|
17
|
-
("XRootWindow", ctypes.c_ulong, [ctypes.c_void_p, ctypes.c_int]),
|
|
18
|
-
("XDisplayWidth", ctypes.c_int, [ctypes.c_void_p, ctypes.c_int]),
|
|
19
|
-
("XDisplayHeight", ctypes.c_int, [ctypes.c_void_p, ctypes.c_int]),
|
|
20
|
-
("XDefaultDepth", ctypes.c_int, [ctypes.c_void_p, ctypes.c_int]),
|
|
21
|
-
("XDefaultVisual", ctypes.c_void_p, [ctypes.c_void_p, ctypes.c_int]),
|
|
22
|
-
("XDefaultGC", ctypes.c_void_p, [ctypes.c_void_p, ctypes.c_int]),
|
|
23
|
-
("XCreatePixmap", ctypes.c_ulong, [ctypes.c_void_p, ctypes.c_ulong, ctypes.c_uint, ctypes.c_uint, ctypes.c_uint]),
|
|
24
|
-
("XCreateImage", ctypes.c_void_p, [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint, ctypes.c_int, ctypes.c_int, ctypes.c_char_p, ctypes.c_uint, ctypes.c_uint, ctypes.c_int, ctypes.c_int]),
|
|
25
|
-
("XPutImage", ctypes.c_int, [ctypes.c_void_p, ctypes.c_ulong, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_uint, ctypes.c_uint]),
|
|
26
|
-
("XInternAtom", ctypes.c_ulong, [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int]),
|
|
27
|
-
("XChangeProperty", ctypes.c_int, [ctypes.c_void_p, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_int, ctypes.c_int, ctypes.c_void_p, ctypes.c_int]),
|
|
28
|
-
("XSetWindowBackgroundPixmap", ctypes.c_int, [ctypes.c_void_p, ctypes.c_ulong, ctypes.c_ulong]),
|
|
29
|
-
("XClearWindow", ctypes.c_int, [ctypes.c_void_p, ctypes.c_ulong]),
|
|
30
|
-
("XSetCloseDownMode", ctypes.c_int, [ctypes.c_void_p, ctypes.c_int]),
|
|
31
|
-
("XCloseDisplay", ctypes.c_int, [ctypes.c_void_p]),
|
|
32
|
-
]:
|
|
33
|
-
f = getattr(x, name); f.restype = res; f.argtypes = args
|
|
34
|
-
s = x.XDefaultScreen(d); root = x.XRootWindow(d, s)
|
|
35
|
-
w, h = x.XDisplayWidth(d, s), x.XDisplayHeight(d, s)
|
|
36
|
-
if x.XDefaultDepth(d, s) != 24: sys.exit("unsupported depth")
|
|
37
|
-
# Scale to cover the screen, then crop the centre.
|
|
38
|
-
src = GdkPixbuf.Pixbuf.new_from_file(sys.argv[1])
|
|
39
|
-
k = max(w / src.get_width(), h / src.get_height())
|
|
40
|
-
sw, sh = max(w, round(src.get_width() * k)), max(h, round(src.get_height() * k))
|
|
41
|
-
pb = src.scale_simple(sw, sh, GdkPixbuf.InterpType.BILINEAR).new_subpixbuf((sw - w) // 2, (sh - h) // 2, w, h).copy()
|
|
42
|
-
if pb.get_has_alpha(): pb = pb.composite_color_simple(w, h, GdkPixbuf.InterpType.NEAREST, 255, 1, 0, 0)
|
|
43
|
-
rgb, stride = pb.get_pixels(), pb.get_rowstride()
|
|
44
|
-
bgrx = bytearray(w * h * 4)
|
|
45
|
-
for y in range(h):
|
|
46
|
-
row = rgb[y * stride:y * stride + w * 3]; o = y * w * 4
|
|
47
|
-
bgrx[o:o + w * 4:4] = row[2::3]; bgrx[o + 1:o + w * 4:4] = row[1::3]; bgrx[o + 2:o + w * 4:4] = row[0::3]
|
|
48
|
-
buf = ctypes.create_string_buffer(bytes(bgrx), len(bgrx))
|
|
49
|
-
pix = x.XCreatePixmap(d, root, w, h, 24)
|
|
50
|
-
img = x.XCreateImage(d, x.XDefaultVisual(d, s), 24, 2, 0, buf, w, h, 32, 0) # ZPixmap
|
|
51
|
-
x.XPutImage(d, pix, x.XDefaultGC(d, s), img, 0, 0, 0, 0, w, h)
|
|
52
|
-
ref = ctypes.c_ulong(pix)
|
|
53
|
-
for atom in (b"_XROOTPMAP_ID", b"ESETROOT_PMAP_ID"):
|
|
54
|
-
x.XChangeProperty(d, root, x.XInternAtom(d, atom, 0), 20, 32, 0, ctypes.byref(ref), 1) # XA_PIXMAP, PropModeReplace
|
|
55
|
-
x.XSetWindowBackgroundPixmap(d, root, pix)
|
|
56
|
-
x.XClearWindow(d, root)
|
|
57
|
-
x.XSetCloseDownMode(d, 1) # RetainPermanent: the pixmap outlives this process
|
|
58
|
-
x.XCloseDisplay(d)
|
|
59
|
-
`;function Ae(e){return`<?xml version="1.0" encoding="UTF-8"?>
|
|
60
|
-
<openbox_config xmlns="http://openbox.org/3.4/rc">
|
|
61
|
-
<theme><keepBorder>no</keepBorder></theme>
|
|
62
|
-
<applications>
|
|
63
|
-
<!-- Debian Chromium is "Chromium"; Chrome for Testing is "Chromium-browser". -->
|
|
64
|
-
<application class="Chromium*">
|
|
65
|
-
<decor>no</decor>
|
|
66
|
-
<position force="yes"><x>${B}</x><y>${B}</y></position>
|
|
67
|
-
<size><width>${e.width-B*2}</width><height>${e.height-B-P}</height></size>
|
|
68
|
-
</application>
|
|
69
|
-
</applications>
|
|
70
|
-
</openbox_config>`}var Pe=`# Remote sandbox dock \u2014 launcher icons only, centred, no panel fill
|
|
71
|
-
panel_items = L
|
|
72
|
-
panel_size = 100% 46
|
|
73
|
-
panel_margin = 0 10
|
|
74
|
-
panel_padding = 0 0 10
|
|
75
|
-
panel_position = bottom center horizontal
|
|
76
|
-
panel_shrink = 1
|
|
77
|
-
panel_background_id = 0
|
|
78
|
-
panel_layer = top
|
|
79
|
-
mouse_effects = 1
|
|
80
|
-
mouse_hover_icon_asb = 100 0 12
|
|
81
|
-
mouse_pressed_icon_asb = 100 0 -12
|
|
82
|
-
|
|
83
|
-
launcher_icon_size = 46
|
|
84
|
-
launcher_padding = 0 0 10
|
|
85
|
-
launcher_background_id = 0
|
|
86
|
-
launcher_tooltip = 1
|
|
87
|
-
|
|
88
|
-
launcher_item_app = /tmp/ara-chromium.desktop
|
|
89
|
-
launcher_item_app = /tmp/ara-files.desktop
|
|
90
|
-
launcher_item_app = /tmp/ara-terminal.desktop
|
|
91
|
-
`,ee=32,Ye=`# Remote sandbox dock (grok look) \u2014 small launcher icons only, centred, no panel fill
|
|
92
|
-
panel_items = L
|
|
93
|
-
panel_size = 100% ${ee+16}
|
|
94
|
-
panel_margin = 0 0
|
|
95
|
-
panel_padding = 0 0 8
|
|
96
|
-
panel_position = bottom center horizontal
|
|
97
|
-
panel_shrink = 1
|
|
98
|
-
panel_background_id = 0
|
|
99
|
-
panel_layer = top
|
|
100
|
-
mouse_effects = 1
|
|
101
|
-
mouse_hover_icon_asb = 100 0 10
|
|
102
|
-
mouse_pressed_icon_asb = 100 0 -10
|
|
103
|
-
|
|
104
|
-
launcher_icon_size = ${ee}
|
|
105
|
-
launcher_padding = 0 0 8
|
|
106
|
-
launcher_background_id = 0
|
|
107
|
-
launcher_tooltip = 1
|
|
108
|
-
|
|
109
|
-
launcher_item_app = /tmp/ara-chromium.desktop
|
|
110
|
-
launcher_item_app = /tmp/ara-files.desktop
|
|
111
|
-
launcher_item_app = /tmp/ara-terminal.desktop
|
|
112
|
-
`,Ne=`corner-radius = 12;
|
|
113
|
-
rounded-corners-exclude = [
|
|
114
|
-
"class_g = 'tint2'",
|
|
115
|
-
"window_type = 'dock'",
|
|
116
|
-
"window_type = 'desktop'"
|
|
117
|
-
];
|
|
118
|
-
backend = "xrender";
|
|
119
|
-
shadow = false;
|
|
120
|
-
fading = false;
|
|
121
|
-
vsync = false;
|
|
122
|
-
inactive-opacity = 1.0;
|
|
123
|
-
active-opacity = 1.0;
|
|
124
|
-
`,ue="/tmp/ara-dock-browser.png",Re=`[Desktop Entry]
|
|
125
|
-
Name=Chrome
|
|
126
|
-
Exec=chromium --no-sandbox %U
|
|
127
|
-
Icon=${ue}
|
|
128
|
-
Type=Application
|
|
129
|
-
Categories=Network;WebBrowser;
|
|
130
|
-
`,ge=`[Desktop Entry]
|
|
131
|
-
Name=Terminal
|
|
132
|
-
Exec=bash -c "DISPLAY=:99 xterm -fa DejaVuSansMono -fs 11 -bg black -fg white"
|
|
133
|
-
Icon=/tmp/ara-dock-terminal.png
|
|
134
|
-
Type=Application
|
|
135
|
-
Categories=System;TerminalEmulator;
|
|
136
|
-
`,re=`[Desktop Entry]
|
|
137
|
-
Name=Files
|
|
138
|
-
Exec=bash -c "DISPLAY=:99 pcmanfm --no-desktop"
|
|
139
|
-
Icon=/tmp/ara-dock-files.png
|
|
140
|
-
Type=Application
|
|
141
|
-
Categories=System;FileManager;
|
|
142
|
-
`;var De={"wallpaper.jpg":M,"dock-browser.png":m,"dock-terminal.png":Z,"dock-files.png":v,"grok-wallpaper.jpg":V,"grok-dock-browser.png":z,"grok-dock-terminal.png":j,"grok-dock-files.png":W},Ke=U,Fe='set_wallpaper() { if command -v feh >/dev/null 2>&1; then feh --bg-fill "$1"; else python3 "$2" "$1"; fi; }';function $e(e){let D=(p)=>p.replaceAll("DISPLAY=:99",`DISPLAY=${e.display}`).replaceAll("/tmp/ara-",`${e.root}/ara-`),c=e.look==="grok",d=new Set(e.absent??[]),t=d.has("files")&&e.filesViewerExec?e.filesViewerExec:null;if(t)d.delete("files");let n=(c?Ye:Pe).split(`
|
|
143
|
-
`).filter((p)=>!(d.has("terminal")&&p.endsWith("/ara-terminal.desktop"))&&!(d.has("files")&&p.endsWith("/ara-files.desktop"))).join(`
|
|
144
|
-
`),a=(p)=>c?p.replace("/tmp/ara-dock-","/tmp/ara-grok-dock-"):p,o=t?re.replace(/^Exec=.*$/m,`Exec=${t}`).replace("Categories=System;FileManager;","Categories=Utility;Viewer;"):re,f=c?"ara-grok-wallpaper.jpg":"ara-wallpaper.jpg",i={"openbox/rc.xml":Ae(e.screen),"tint2/tint2rc":D(n),"picom/picom.conf":Ne,...d.has("terminal")?{}:{"ara-terminal.desktop":D(a(ge))},...d.has("files")?{}:{"ara-files.desktop":D(a(o))},"ara-chromium.desktop":D(a(Re)).replace("chromium --no-sandbox %U",e.browserExec),"ara-set-root-wallpaper.py":Ke},X=[...Y.slice(0,3),Fe,`[ ! -f "$ROOT/${f}" ] || set_wallpaper "$ROOT/${f}" "$ROOT/ara-set-root-wallpaper.py" || true`,'if alive tint2 && ! cmp -s "$ROOT/tint2/tint2rc" "$ROOT/tint2/applied"; then read -r pid _ <"$ROOT/tint2.pid"; kill -USR1 "$pid" 2>/dev/null || true; fi','cp "$ROOT/tint2/tint2rc" "$ROOT/tint2/applied" 2>/dev/null || true',...Y.slice(3)];return{files:i,start:X}}var Y=['ticks() { line=$(cat "/proc/$1/stat" 2>/dev/null) || return 1; rest=${line##*) }; case $rest in Z*|X*) return 1;; esac; printf "%s" "$rest" | cut -d " " -f20; }','alive() { [ -f "$ROOT/$1.pid" ] || return 1; read -r pid start <"$ROOT/$1.pid"; current=$(ticks "$pid") || return 1; [ "$current" = "$start" ] && kill -0 "$pid" 2>/dev/null; }','launch() { name=$1; shift; "$@" 9>&- >"$ROOT/$name.log" 2>&1 & pid=$!; start=$(ticks "$pid"); printf "%s %s\\n" "$pid" "$start" >"$ROOT/$name.pid"; }','if [ -f "$ROOT/tint2/tint2rc" ] && ! alive tint2 && command -v tint2 >/dev/null 2>&1; then launch tint2 tint2 -c "$ROOT/tint2/tint2rc"; fi','if [ -f "$ROOT/picom/picom.conf" ] && ! alive picom && command -v picom >/dev/null 2>&1; then launch picom picom --config "$ROOT/picom/picom.conf"; fi'];var Je=43200000,L=":99",Qe=60000,A=15000,u={width:1280,height:800},ke=/^[A-Za-z0-9._:-]{1,160}$/;function _e(e){return Boolean(e)&&typeof e==="object"&&!Array.isArray(e)}var we=["video","viewer","viewer_same_network","viewer_network","look"];function Me(e,D=Date.now()){let c=["relay_url","session_id","expires_at"];if(!_e(e)||c.some((f)=>!(f in e))||Object.keys(e).some((f)=>!c.includes(f)&&!we.includes(f)))throw new r("invalid_display_request","Reason desktop request is malformed.");let d="video"in e?Tc(e.video):void 0,t="viewer"in e?ts(e.viewer):null,n="look"in e?rs(e.look):null;if(d===null)throw new r("invalid_display_request","Reason desktop video request is invalid.");let a=null;try{a=typeof e.relay_url==="string"?new URL(e.relay_url):null}catch{}if(!a||a.protocol!=="wss:"&&a.protocol!=="ws:"||a.username||a.password)throw new r("invalid_display_request","Reason desktop relay URL is invalid.");if(typeof e.session_id!=="string"||!ke.test(e.session_id))throw new r("invalid_display_request","Reason desktop session identity is invalid.");let o=typeof e.expires_at==="string"?Date.parse(e.expires_at):Number.NaN;if(!Number.isFinite(o)||o<=D)throw new r("invalid_display_request","Reason desktop session has already expired.");return{relay_url:e.relay_url,session_id:e.session_id,expires_at:new Date(Math.min(o,D+Je)).toISOString(),...d?{video:d}:{},...t?{viewer:t}:{},...d&&e.viewer_same_network===!0?{viewer_same_network:!0}:{},...n?{look:n}:{}}}function on(e=process.platform){return(e==="linux"||e==="darwin"||e==="win32")&&T()?.features.display===!0}async function No(){if(process.platform==="win32")return on()&&await Jt();if(process.platform!=="darwin")return on();return await Jt()}function Te(e){Oe(e,{recursive:!0,mode:448});let D=Ge(e);if(!D.isDirectory()||D.isSymbolicLink()||process.getuid&&D.uid!==process.getuid())throw new r("display_unavailable","Reason desktop state directory is not private.");Ce(e,448)}function me(e,D){let c=(t)=>{let n=Buffer.alloc(2);return n.writeUInt16BE(t.length),Buffer.concat([n,t])},d=Buffer.from([255,255]);return Buffer.concat([d,c(Buffer.alloc(0)),c(Buffer.from(e)),c(Buffer.from("MIT-MAGIC-COOKIE-1")),c(D)])}function x(e,D,c=2000){return new Promise((d)=>{let t=he(e),n="",a=(o)=>{t.destroy(),d(o)};t.setTimeout(c,()=>a(!1)),t.once("error",()=>a(!1)),t.once("close",()=>a(!1)),t.once("connect",()=>{if(!D)a(!0)}),t.on("data",(o)=>{if(n+=o.toString("latin1"),n.length>=4)a(n.startsWith("RFB "))})})}async function h(e,D){let c=Date.now()+D;while(Date.now()<c){if(await e())return!0;await new Promise((d)=>setTimeout(d,100))}return!1}function R(e,D,c){return new Promise((d)=>{let t=se(e,D,{detached:!0,stdio:"ignore",env:c});t.once("error",()=>d(-1)),t.once("exit",(n)=>d(n)),t.unref(),setTimeout(()=>d(null),A).unref()})}var O=null;function Ft(e=s()){return O??=ve(e).finally(()=>{O=null}),O}async function ve(e){let D=T({home:e});if(!D?.xvfb||!D.x11vnc||!D.openbox)throw new r("display_unavailable","Run `reason desktop install` on this machine to enable its desktop.");Br({root:D.root,automation:D.automation,extensionDir:D.extensionDir});let c=I(D.root,"display");Te(c);let d=await Ve(e,c,D.x11vnc);if(d)return d;let t={display:L,xauthority:I(c,"Xauthority"),rfbSocket:I(c,"rfb.sock")},n=I(c,"pulse"),a=(async()=>{try{Te(n)}catch{return null}return await uc(n,D.pulseaudio)})();Te(I(c,"home"));let o=J(c,t,D.pulseaudio),f=async()=>({...t,sound:await a});if(await x({path:t.rfbSocket},!0))return Ie(I(c,"theme"),Y,o),await f();if(!ce(t.xauthority))N(t.xauthority,me(L.slice(1),qe(16)),{mode:384,flag:"wx"});let i=Q(I(c,"theme"),t.display,u,e),X={path:`/tmp/.X11-unix/X${L.slice(1)}`};if(!await x(X,!1)){let p=`${u.width}x${u.height}`;if(D.xvnc)ae(t.rfbSocket,{force:!0}),R(D.xvnc,[t.display,"-geometry",p,"-depth","24","-nolisten","tcp","-auth",t.xauthority,"-rfbport","-1","-rfbunixpath",t.rfbSocket,"-SecurityTypes","None","-UseBlacklist=0","-AlwaysShared","-desktop","Reason"],o);else R(D.xvfb,[t.display,"-screen","0",`${p}x24`,"-nolisten","tcp","-auth",t.xauthority],o);if(!await h(()=>x(X,!1),A)||D.xvnc&&!await h(()=>x({path:t.rfbSocket},!0),A))throw new r("display_unavailable","Reason could not start the virtual display.");R(D.openbox,["--config-file",i.openboxConfig],o)}if(await S(i,o),!await oe(D.x11vnc,t,c,"x11vnc.log",o))throw new r("display_unavailable","Reason could not start the desktop server.");return await f()}function J(e,D,c){let d={HOME:I(e,"home"),PATH:"/usr/local/bin:/usr/bin:/bin",DISPLAY:D.display,XAUTHORITY:D.xauthority};if(c)d.PULSE_SERVER=Kt(zo(I(e,"pulse")));return d}async function oe(e,D,c,d,t){if(await x({path:D.rfbSocket},!0))return!0;ae(D.rfbSocket,{force:!0});let n=await R(e,["-display",D.display,"-auth",D.xauthority,"-rfbport","0","-rfbportv6","-1","-unixsock",D.rfbSocket,"-nopw","-forever","-shared","-noxdamage","-sb","0","-rfbversion","3.7","-quiet","-bg","-o",I(c,d)],t);if(n!==null&&n!==0)return!1;return await h(()=>x({path:D.rfbSocket},!0),A)}async function Ze(){let e=["DISPLAY","XAUTHORITY","WAYLAND_DISPLAY","XDG_SESSION_TYPE"],D=(c)=>Object.fromEntries(e.flatMap((d)=>c[d]?[[d,c[d]]]:[]));if(process.env.DISPLAY)return D(process.env);try{let c=await new Promise((d,t)=>de("systemctl",["--user","show-environment"],{encoding:"utf8",timeout:2000},(n,a)=>n?t(n):d(a)));return D(Object.fromEntries(c.split(`
|
|
145
|
-
`).flatMap((d)=>{let t=d.indexOf("=");return t>0?[[d.slice(0,t),d.slice(t+1)]]:[]})))}catch{return{}}}var te=new Set;async function Ve(e,D,c){let d=await Ze(),t=/^:(\d+)(?:\.\d+)?$/.exec(d.DISPLAY??"")?.[1];if(!t||`:${t}`===L||d.WAYLAND_DISPLAY||d.XDG_SESSION_TYPE==="wayland")return null;let n={display:`:${t}`,xauthority:d.XAUTHORITY??I(e,".Xauthority"),rfbSocket:I(D,`rfb-${t}.sock`)},a=`${n.display} ${n.xauthority}`;if(te.has(a)||!await x({path:`/tmp/.X11-unix/X${t}`},!1))return null;let o={HOME:e,PATH:"/usr/local/bin:/usr/bin:/bin",DISPLAY:n.display,XAUTHORITY:n.xauthority};if(await oe(c,n,D,`x11vnc-${t}.log`,o))return{...n,sound:null};return te.add(a),process.stderr.write(`Reason worker: your screen ${n.display} could not be served; using the virtual desktop
|
|
146
|
-
`),null}var ie="look";function fe(e){try{return rs(ne(I(e,ie),"utf8").trim())??"reason"}catch{return"reason"}}function Q(e,D,c,d,t=fe(e)){let n=`chromium --no-first-run --no-default-browser-check${process.geteuid?.()===0?" --no-sandbox":""} %U`,a=[["terminal","xterm"],["files","pcmanfm"]].filter(([,i])=>!ce(`/usr/bin/${i}`)).map(([i])=>i),o=`${n.replace(/ %U$/,"")} --app=file://${I(d,".reason","workspace")}/`,f=$e({root:e,display:D,screen:c,browserExec:n,absent:a,look:t,filesViewerExec:o});for(let i of["","openbox","tint2","picom"])Te(I(e,i));N(I(e,ie),`${t}
|
|
147
|
-
`,{mode:384});for(let[i,X]of Object.entries(f.files))N(I(e,i),X,{mode:384});for(let[i,X]of Object.entries(De))N(I(e,`ara-${i}`),ne(X),{mode:384});return{root:e,openboxConfig:I(e,"openbox","rc.xml"),start:f.start}}function S(e,D){return Ie(e.root,[...e.start,"openbox --reconfigure >/dev/null 2>&1 || true"],D)}function Ie(e,D,c){let d=[`ROOT=${JSON.stringify(e)}`,...D].join(`
|
|
148
|
-
`);return new Promise((t)=>{let n=se("/bin/sh",["-c",d],{stdio:"ignore",env:{...c,PATH:"/usr/bin:/bin"}}),a=setTimeout(()=>{n.kill(),t()},A);n.once("error",()=>{clearTimeout(a),t()}),n.once("exit",()=>{clearTimeout(a),t()})})}var ze=2073600,We=320;function je(e,D){let c=Math.min(1,Math.sqrt(ze/(e.width*e.height))),d=(t,n)=>Math.min(Math.floor(n/8)*8,Math.max(We,Math.round(t*c/8)*8));return{width:d(e.width,D.width),height:d(e.height,D.height)}}function k(e,D,c){return new Promise((d)=>de(e,D,{env:c,encoding:"utf8",timeout:5000},(t,n)=>d(t?null:n)))}function pe(e){let D=/current (\d+) x (\d+), maximum (\d+) x (\d+)/.exec(e),c=e.split(`
|
|
149
|
-
`),d=c.findIndex((n)=>/^\S+ connected/.test(n));if(!D||d<0)return null;let t=[];for(let n of c.slice(d+1)){let a=/^\s+(\d+x\d+)\s/.exec(n);if(!a)break;t.push(a[1])}return{current:{width:Number(D[1]),height:Number(D[2])},maximum:{width:Number(D[3]),height:Number(D[4])},output:c[d].split(" ")[0],modes:t}}async function Ue(e,D,c){if(e.display!==L)return null;let d={PATH:"/usr/bin:/bin",DISPLAY:e.display,XAUTHORITY:e.xauthority},t=(f)=>k("xrandr",f,d),n=pe(await t(["--query"])??"");if(!n||n.maximum.width<=n.current.width&&n.maximum.height<=n.current.height)return null;let a=je(D,n.maximum);if(a.width===n.current.width&&a.height===n.current.height)return{size:a,changed:!1};let o=`${a.width}x${a.height}`;if(!n.modes.includes(o)){if(await t(["--newmode",o,"60",...[a.width,a.width,a.width,a.width,a.height,a.height,a.height,a.height].map(String)]),await t(["--addmode",n.output,o])===null)return null}return c(),await t(["--output",n.output,"--mode",o])===null?null:{size:a,changed:!0}}async function er(e,D){let c=s(),d=T({home:c});if(!d)return;let t=I(d.root,"display"),n=J(t,e,d.pulseaudio);await S(Q(I(t,"theme"),e.display,D,c),n);let a=D.width-B*2,o=D.height-B-P;await k("xdotool",["search","--onlyvisible","--class","Chromium","windowsize","%@",String(a),String(o),"windowmove","%@",String(B),String(B)],{...n,PATH:"/usr/bin:/bin"})}var g=Promise.resolve();function rr(e,D,c=()=>{}){let d=g.then(()=>Ue(e,D,c));return g=d.then((t)=>t?.changed?er(e,t.size):void 0).catch(()=>{}),d.then((t)=>t?.size??null,()=>null)}function Dr(e,D){if(e.display!==L)return Promise.resolve();let c=g.then(async()=>{let d=s(),t=T({home:d});if(!t)return;let n=I(t.root,"display"),a=I(n,"theme");if(fe(a)===D)return;let o=J(n,e,t.pulseaudio),f=pe(await k("xrandr",["--query"],{PATH:"/usr/bin:/bin",DISPLAY:e.display,XAUTHORITY:e.xauthority})??"");await S(Q(a,e.display,f?.current??u,d,D),o)});return g=c.catch(()=>{}),c.catch(()=>{})}async function sn(e,D={}){let c=D.now??Date.now,d=Me(e.payload,c());if(e.signal.throwIfAborted(),!d.video)throw new r("display_video_required","Reason desktops stream as video now; this request came without it.");let t=D.platform??process.platform;if(t!=="linux"&&t!=="darwin"&&t!=="win32")throw new r("display_video_unsupported","This machine does not serve desktop video.");let{video:n,look:a}=d,o=(D.video?.desktop??(t==="darwin"?async()=>qo:t==="win32"?async()=>Wo:async()=>{let f=await Ft();if(a)await Dr(f,a);return f}))();return await $r(e.signal,d,D,c,(f)=>Vo(f,{request:n,desktop:o,...d.viewer?{viewer:d.viewer}:{},viewerSameNetwork:d.viewer_same_network===!0},{resizeDesktop:rr,...D.video}),(f)=>Rn({type:"error",code:f}))}function $r(e,D,c,d,t,n){let a=d();return new Promise((o,f)=>{let i=null,X=!1,p=!1,_,K,y,F=!1,l=null,E=(b)=>{if(p)return;if(l)b=l.outcome;p=!0,clearTimeout(_),clearTimeout(K),e.removeEventListener("abort",C),y?.close();try{i?.close(1000,"display_session_over")}catch{}if("error"in b){f(b.error);return}o({reason:b.reason,...y?.summary(),duration_ms:Math.max(0,d()-a)})},q=()=>E({error:new r("display_relay_unavailable","Reason could not reach the desktop relay.")}),C=()=>{let b=e.reason;E({error:b instanceof r?b:new r("cancelled","Reason closed the desktop session.")})},w=()=>{if(!l||!i)return;let{outcome:b}=l,H=!("error"in b)?b.reason:b.error instanceof r?b.error.code:"display_unavailable";if(!l.told)try{i.send(n(H))}catch{}E(b)};if(y=t({get done(){return p||l!==null},get open(){return X&&!p&&l===null},get bufferedAmount(){return i?.bufferedAmount??0},send(b){if(p||l||!X||!i)return;try{i.send(b)}catch{E({reason:"relay_closed"})}},end:(b)=>{if(p||l)return;if(!("error"in b)&&F&&X){E(b);return}if(l={outcome:b,told:!("error"in b)&&X},F&&X)w()}}),p){y.close();return}if(e.aborted){C();return}e.addEventListener("abort",C,{once:!0}),_=setTimeout(()=>E({reason:"session_expired"}),Math.max(1,Date.parse(D.expires_at)-d())),K=setTimeout(()=>E({reason:"viewer_absent"}),c.viewerWaitMs??Qe);try{i=(c.connect??_i)(D.relay_url,(c.loadProxy??Se)()?.url)}catch{q();return}i.binaryType="arraybuffer",i.onopen=()=>{if(p||!i)return;X=!0,y?.opened()},i.onmessage=(b)=>{if(p)return;let H=b.data,G=H instanceof ArrayBuffer?new Uint8Array(H):ArrayBuffer.isView(H)?new Uint8Array(H.buffer,H.byteOffset,H.byteLength):null;if(!G||G.byteLength===0)return;if(clearTimeout(K),F=!0,l){w();return}y?.received(G)},i.onclose=()=>{if(p)return;if(!X){q();return}E({reason:"relay_closed"})},i.onerror=()=>{if(p||X)return;q()}})}
|
|
150
|
-
export{on,No,Te,Ft,sn};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import"./vm-hands-entry-lite-71ebge0c.js";import"./vm-hands-entry-lite-9g52kxyj.js";import"./vm-hands-entry-lite-jpvmkce5.js";import"./vm-hands-entry-lite-krpqqx12.js";import{Ze,Yr,li,Qe}from"./vm-hands-entry-lite-vkhacd00.js";import"./vm-hands-entry-lite-q9djb28r.js";import"./vm-hands-entry-lite-v4hr9x9h.js";import"./vm-hands-entry-lite-57ajjwmh.js";import"./vm-hands-entry-lite-z0ht62s4.js";import"./vm-hands-entry-lite-2rgf8866.js";import"./vm-hands-entry-lite-weqam12f.js";import"./vm-hands-entry-lite-q9s1e2y1.js";import"./vm-hands-entry-lite-pxtycfdv.js";import"./vm-hands-entry-lite-zh6ncdjn.js";import{jn,Hn,Fr,jr}from"./vm-hands-entry-lite-9yfmkd1f.js";import"./vm-hands-entry-lite-0wb1n769.js";import"./vm-hands-entry-lite-yvws5zpx.js";import"./vm-hands-entry-lite-hs6sdn60.js";import"./vm-hands-entry-lite-zawytz09.js";import"./vm-hands-entry-lite-8xv6c0rm.js";import{spawn as Me}from"child_process";import{chmodSync as Le,chownSync as Te,existsSync as E,lstatSync as ee,mkdirSync as J,mkdtempSync as We,readdirSync as X,readFileSync as k,realpathSync as He,rmdirSync as pe,rmSync as ze,writeFileSync as B}from"fs";import{basename as Ue,dirname as Be,join as d}from"path";import{readFileSync as ae,readlinkSync as ce}from"fs";import{relative as Ne}from"path";var ue=16;function le(e){return e.replace(/\\([0-7]{3})/g,(r,t)=>String.fromCharCode(Number.parseInt(t,8)))}function De(e){let r=[];for(let t of e.split(`
|
|
3
|
-
`)){let n=t.split(" ");if(n.length<10||!/^\d+:\d+$/.test(n[2]))continue;r.push({device:n[2],root:le(n[3]),mountPoint:le(n[4])})}return r}function Ae(e,r,t){let n=e.replace(/\/+$/,"")||"/",c=(m)=>n==="/"||m===n||m.startsWith(`${n}/`),o=(m)=>new Map(De(m).filter((_)=>c(_.mountPoint)).map((_)=>[`${_.mountPoint}\x00${_.device}\x00${_.root}`,_.mountPoint])),l=o(r),p=o(t),b=(m)=>Ne(n,m)||".",P=[...l].filter(([m])=>!p.has(m)).map(([,m])=>b(m)),x=[...p].filter(([m])=>!l.has(m)).map(([,m])=>b(m));return{missing:P,extra:x,referenceCount:l.size,ownCount:p.size}}function de(e,r,t,n="/proc"){let c,o,l=null;try{c=ae(`${n}/1/mountinfo`,"utf8"),o=ae(`${n}/self/mountinfo`,"utf8")}catch(_){let O=_&&typeof _==="object"&&"code"in _&&typeof _.code==="string"?_.code:"unreadable";r("vm_hands.mount_check_unavailable",{code:O});return}try{l=ce(`${n}/1/ns/mnt`)===ce(`${n}/self/ns/mnt`)}catch{}let{missing:p,extra:b,referenceCount:P,ownCount:x}=Ae(e,c,o),m={reference_count:P,own_count:x,missing_count:p.length,extra_count:b.length,same_namespace:l};if(b.length)r("vm_hands.mount_extra",{...m,extra:b.slice(0,ue)});if(p.length)throw r("vm_hands.mount_mismatch",{...m,missing:p.slice(0,ue)}),t(`${p.length} mount(s) under the Session root are missing from vm-hands' namespace`)}var ve="/sys/fs/cgroup/reason-payload",M="vm-hands",Fe="/run/ara-srt/fallbacks.jsonl",oe="/reason-person",Ke="/reason-workload",je="surface",ne=5000,Ge=1e4,fe="__VM_HANDS_PROOF_DIR__",Ee="__VM_HANDS_PROBE_NONCE__";class w extends Error{code;constructor(e,r){super(r);this.code=e}}function Ve(e,r){if(!/^[0-9a-f-]{36}$/i.test(r))throw new w("vm_hands_bind_invalid","bad bind id");return d(e,M,`b-${r.toLowerCase()}`)}var Je=5000,be=(e)=>`'${e.replaceAll("'","'\\''")}'`;function Xe(e,r){if(!r||!/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i.test(r))return e;let t=d(Be(e),r.toLowerCase());return Ue(e).toLowerCase()===r.toLowerCase()?e:t}function yn(e){let r=e.cgroup??ve,t=e.init.layout.payload_uid,n=e.init.workload_ended!==!0,c=(s)=>z(s,oe)||n&&z(s,Ke),o=e.log??(()=>{}),l=(s)=>Xe(e.init.layout.session_root,s),p=new Map,b=new Map,P=0,x=()=>{try{let s=k("/run/ara-srt/starts.jsonl","utf8"),i=s.slice(P>s.length?0:P).split(`
|
|
4
|
-
`).filter(Boolean);P=s.length;let u=i.map((f)=>{try{return Number(JSON.parse(f).elapsed_ms)||0}catch{return 0}});if(u.length)o("vm_hands.srt_server_starts",{count:u.length,elapsed_ms:u.slice(0,8)})}catch{}},m=null,_=!1,O=e.srtCgroup??"/sys/fs/cgroup/reason-srt",I=()=>{m??=me()},R=0,F=()=>{try{let s=k(Fe,"utf8"),i=s.slice(R>s.length?0:R);R=s.length;let u=i.split(`
|
|
5
|
-
`).filter(Boolean).slice(0,1000);if(!u.length)return null;let f={},g=0;for(let S of u)try{let h=JSON.parse(S),y=typeof h.code==="string"&&/^[a-z_]{1,40}$/.test(h.code)?h.code:"other";if(f[y]=(f[y]??0)+1,typeof h.elapsed_ms==="number")g=Math.max(g,h.elapsed_ms)}catch{f.unparsed=(f.unparsed??0)+1}return o("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}},U=(s,i,u)=>Ce(s,i,u),K=(s)=>(i,u,f)=>Me("/bin/sh",["-c",`echo $$ > ${be(d(s,"cgroup.procs"))} || exit 125; exec "$@"`,"vm-hands-join",i,...u],f),Ce=K(d(r,M)),j=d(r,M,"probe"),T=(s)=>Ve(r,s),Oe=(s)=>{let i=T(s);try{J(i,{mode:493})}catch(u){if(!(u&&typeof u==="object"&&("code"in u)&&u.code==="EEXIST"))throw new w("vm_hands_bind_failed","bind cgroup")}return i},xe=(s)=>{try{pe(T(s))}catch{}},W=e.prespawn?Yr({spawnProcess:U,...e.relayDependencies?.sourceEntrypoint?{sourceEntrypoint:e.relayDependencies.sourceEntrypoint}:{},log:(s,i)=>o(s,i??{})}):null;W?.arm();let Y=W?setInterval(()=>{W.arm()},Je):null;Y?.unref?.();let q=new Set;async function G(s){let i=p.get(s);if(p.delete(s),!i)return;i.abort.abort(),await i.done}return{bindCgroup:T,async startExecutor(s){if(I(),b.set(s.bindId,me()),_=!0,!s.claim)throw new w("vm_hands_bind_invalid","an executor needs the claim it serves");await G(s.bindId);let{claim:i,bindId:u}=s,f=Oe(u),g=i.owner;if(!g||typeof g.device_id!=="string"||typeof i.root_id!=="string")throw new w("vm_hands_bind_invalid","claim without its owner Device or root");let S=new AbortController,h,y,N=new Promise((a,v)=>{h=a,y=v}),D,C=new Promise((a)=>{D=a}),H=Qe({headless:!0,hostExecution:!0,runtimeDirectory:e.runtimeDirectory,managedPty:{version:1,startupVerified:!0},deviceIdentity:{deviceId:g.device_id,rootId:i.root_id,apiOrigin:e.apiOrigin},claimOwner:i.owner,root:e.root,runId:i.run_id,operationId:i.operation_id,attemptId:i.attempt_id,payload:Object.fromEntries(Object.entries(i.payload).filter(([a])=>!a.startsWith("vm_hands_"))),signal:S.signal,...s.workspaceGrant?{workspaceGrant:s.workspaceGrant}:{},emitEvent:async(a,v)=>{if(a==="hands.ready"){h(v);return}if(a==="hands.started"||a==="hands.stopped"||a==="hands.failed")return;await e.forward(u,a,v)}},{...e.relayDependencies,spawnWorker:(a)=>K(f)(a.command,a.args,a.options),...W?{takePrespawnedWorker:(a)=>{let v=W.take(a);if(!v?.pid)return v;try{return B(d(f,"cgroup.procs"),String(v.pid)),v}catch{try{v.kill("SIGKILL")}catch{}return null}},adoptSpawnedWorker:W.adopt}:{}}).then(()=>{D("executor_stopped")},(a)=>{let v=a&&typeof a==="object"&&"code"in a?String(a.code):"executor_failed";y(new w(v,a instanceof Error?a.message:String(a))),D(v)}).finally(()=>y(new w("vm_hands_executor_exited","executor ended before it was ready")));if(p.set(u,{abort:S,done:H,exited:C,operationId:i.operation_id,runId:i.run_id,expiresAtMs:Date.parse(String(i.payload.expires_at??""))||0}),q.delete(u))G(u).catch(()=>{return});let A=await N,V=A.executor_launch_id;if(typeof V!=="string")throw new w("vm_hands_bind_failed","executor ready without a launch id");return{launchId:V,readyData:A,applied:{hands_confinement:typeof i.payload.hands_confinement==="string"?i.payload.hands_confinement:null,browser_egress:i.payload.browser_egress??null}}},takeSrtFallbacks:F,executorExited(s){return p.get(s)?.exited??new Promise(()=>{})},abortExecutor(s){if(!p.has(s)){q.add(s);return}G(s).catch(()=>{return})},freezeBind(s){let i=T(s);if(E(d(i,"cgroup.freeze")))B(d(i,"cgroup.freeze"),"1")},async killAndVerifyPayload(s){if(s?.bindId)q.delete(s.bindId);let i=new Set(s?.keep??[]);if(await Ie(s?.bindId??null,i,s?.own===!0),i.size)return;if((_||e.srtWarmLate?.()===!0)&&E(d(O,"cgroup.events")))x(),await re(O,Date.now()+ne,"srt"),e.onSrtReset?.();_=!1},async killProbe(){let s=Date.now()+ne;if(E(d(j,"cgroup.events"))){await re(j,s,"probe");try{pe(j)}catch{}}let i=ie(process.pid);if(i===null)throw new w("vm_hands_kill_unverified","agent start time unreadable");await Ye(r,i,s);let u=(g)=>{let S=ie(g);return S!==null&&S<=i},f=_e(t).filter((g)=>u(g)&&!c(g));if(f.length)throw o("vm_hands.kill_survivors",{pids:f.slice(0,16),at:"attest",...ge(f)}),new w("vm_hands_kill_unverified",`${f.length} payload-uid process(es) from before this agent`);if(m!==null){let g=[r,d(r,M)].map((y)=>y.replace(/^\/sys\/fs\/cgroup/,"")),S=O.replace(/^\/sys\/fs\/cgroup/,""),h=he(m).filter((y)=>y!==process.pid&&!c(y)&&!z(y,"/reason-vm-hands")&&!z(y,S)&&!g.some((N)=>te(y,N)));if(h.length&&_)throw o("vm_hands.kill_strays",{strays:se(h),at:"attest"}),new w("vm_hands_kill_unverified",`${h.length} process(es) the run started survived it`);if(h.length)o("vm_hands.attest_concurrent",{processes:se(h),count:h.length});m=null}},async runProbe({nonce:s,script:i}){if(I(),!i.includes(fe))throw new w("vm_hands_probe_failed","probe names no proof directory");let u=e.proofParent??"/tmp/reason-vm-hands-proof";J(u,{mode:457,recursive:!0});let f=ee(u);if(f.isSymbolicLink()||!f.isDirectory()||f.uid!==(process.getuid?.()??-1)||(f.mode&4095)!==457)throw new w("vm_hands_probe_failed","proof parent is not root's 0711 directory");let g=We(d(u,"p-")),S=!1;try{if(!/^[A-Za-z0-9/._-]+$/.test(g)||!/^[A-Za-z0-9_-]{1,128}$/.test(s))throw new w("vm_hands_probe_failed","proof directory path or nonce");Te(g,t,t),Le(g,448);let h=ee(g).ino;try{J(j,{mode:493})}catch(C){if(!(C&&typeof C==="object"&&("code"in C)&&C.code==="EEXIST"))throw new w("vm_hands_probe_failed","probe cgroup")}let y=K(j)("/bin/bash",["-c",i.replaceAll(fe,g).replaceAll(Ee,s)],{cwd:"/",env:{PATH:"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"},stdio:["ignore","pipe","ignore"]}),N="";y.stdout?.on("data",(C)=>{if(N.length<16384)N+=C.toString("utf8").slice(0,16384-N.length)});let D=await new Promise((C)=>{let H=setTimeout(()=>{S=!0,y.kill("SIGKILL"),C(124)},Ge);y.once("error",()=>{clearTimeout(H),C(127)}),y.once("close",(A)=>{clearTimeout(H),C(A??1)})});return o("vm_hands.probe",{nonce_len:s.length,exit_code:D}),{exitCode:D,markers:N,proofDirInode:h}}finally{if(!S)ze(g,{recursive:!0,force:!0})}},restatLayout(s){let i=l(s),u=i===e.init.layout.session_root?e.init.layout.alias:d(i,"repo"),f="invalid";try{li(i),f="0:0:755"}catch{}let g=!1,S=-1;try{let h=ee(u);S=h.uid,g=f==="0:0:755"&&u===d(i,"repo")&&!h.isSymbolicLink()&&h.isDirectory()&&He(u)===u&&h.uid===t}catch{}return{root_mode:f,alias_ok:g,owner_uid:S}},verifyMounts(s){let i=l(s);try{de(i,o,(u)=>new w("vm_hands_mount_mismatch",u))}catch(u){if(i!==e.init.layout.session_root&&u instanceof w&&u.code==="vm_hands_mount_mismatch"){o("vm_hands.member_mount_mismatch_served",{});return}throw u}},installEnvironment(s,i){let u=p.get(s);if(!u)throw new w("environment_unavailable","no executor owns an environment");return Ze({root:e.root,operationId:u.operationId,payload:i}).installed_revision},async stop(){if(Y)clearInterval(Y);W?.close(),await Promise.all([...p.keys()].map((s)=>G(s)))}};function $e(){try{return X(d(r,M),{withFileTypes:!0}).filter((s)=>s.isDirectory()&&/^b-[0-9a-f-]{36}$/.test(s.name)).map((s)=>s.name)}catch{return[]}}async function Ie(s,i,u=!1){let f=new Set([...i].map((S)=>S.toLowerCase())),g=tn();try{await sn();let S=Date.now()+ne,h=new Set($e().filter((a)=>!f.has(a.slice(2))).map((a)=>a.slice(2)));if(s)h.add(s.toLowerCase());let y=null;for(let a of h){let v=G(a).catch(()=>{return}),Q=b.get(a);if(Q!==void 0)y=y===null?Q:Math.min(y,Q);if(E(d(T(a),"cgroup.events")))await re(T(a),S,"bind");await v}let N=[...f].map((a)=>T(a).replace(/^\/sys\/fs\/cgroup/,"")),D=["/",...[r,d(r,M)].map((a)=>a.replace(/^\/sys\/fs\/cgroup/,""))],C=O.replace(/^\/sys\/fs\/cgroup/,""),H=(a)=>c(a)||N.some((v)=>z(a,v))||D.some((v)=>te(a,v)),A=u?[]:_e(t).filter((a)=>!H(a));if(A.length)throw o("vm_hands.kill_survivors",{pids:A.slice(0,16),beside:f.size,...ge(A)}),new w("vm_hands_kill_unverified",`${A.length} payload-uid process(es) outside a live bind`);let V=(a)=>!H(a)&&!z(a,"/reason-vm-hands")&&!z(a,C)&&!D.some((v)=>te(a,v));if(y!==null){let a=he(y).filter((v)=>v!==process.pid&&V(v));if(a.length)throw o("vm_hands.kill_strays",{strays:se(a),beside:f.size}),new w("vm_hands_kill_unverified",`${a.length} process(es) the run started survived it`)}for(let a of h)b.delete(a),xe(a)}finally{g()}}}function ie(e,r="/proc"){try{let t=k(d(r,String(e),"stat"),"utf8"),n=Number(t.slice(t.lastIndexOf(")")+2).split(" ")[19]);return Number.isFinite(n)?n:null}catch{return null}}function Se(e,r="/proc"){try{let t=k(d(r,String(e),"stat"),"utf8"),n=Number(t.slice(t.lastIndexOf(")")+2).split(" ")[1]);return Number.isFinite(n)?n:null}catch{return null}}async function Ye(e,r,t){try{B(d(e,"cgroup.freeze"),"1")}catch(n){throw new w("vm_hands_kill_unverified",`payload cgroup.freeze: ${n instanceof Error?n.message:String(n)}`)}try{for(;;){let n=Pe(e).filter((o)=>ke(o,e)),c=new Set(n.filter((o)=>{let l=ie(o);return l!==null&&l<=r}));for(let o=!0;o;){o=!1;for(let l of n){if(c.has(l))continue;let p=Se(l);if(p!==null&&c.has(p))c.add(l),o=!0}}if(c.size===0)return;if(Date.now()>t)throw new w("vm_hands_kill_unverified",`${c.size} previous-boot process(es) survived`);for(let o of c)try{process.kill(o,"SIGKILL")}catch{}await new Promise((o)=>setTimeout(o,10))}}finally{try{B(d(e,"cgroup.freeze"),"0")}catch{}}}function te(e,r,t="/proc"){try{return k(d(t,String(e),"cgroup"),"utf8").split(`
|
|
6
|
-
`).find((c)=>c.startsWith("0::"))?.slice(3)===r}catch{return!1}}function z(e,r,t="/proc"){try{let c=k(d(t,String(e),"cgroup"),"utf8").split(`
|
|
7
|
-
`).find((o)=>o.startsWith("0::"))?.slice(3)??"";return c===r||c.startsWith(`${r}/`)}catch{return!1}}var qe=100;function me(){try{return Math.floor(Number(k("/proc/uptime","utf8").split(" ")[0])*qe)}catch{return 0}}async function re(e,r,t){try{B(d(e,"cgroup.freeze"),"1")}catch(n){throw new w("vm_hands_kill_unverified",`${t} cgroup.freeze: ${n instanceof Error?n.message:String(n)}`)}while(!/^populated 0$/m.test(k(d(e,"cgroup.events"),"utf8"))){if(Date.now()>r)throw new w("vm_hands_kill_unverified",`${t} cgroup still populated (left frozen)`);for(let n of Pe(e)){if(!ke(n,e))continue;try{process.kill(n,"SIGKILL")}catch{}}await new Promise((n)=>setTimeout(n,10))}try{B(d(e,"cgroup.freeze"),"0")}catch(n){throw new w("vm_hands_kill_unverified",`${t} cgroup thaw: ${n instanceof Error?n.message:String(n)}`)}}function ke(e,r){let t=r.replace(/^\/sys\/fs\/cgroup/,"")||"/",n="";try{n=k(`/proc/${e}/cgroup`,"utf8").split(`
|
|
8
|
-
`).find((o)=>o.startsWith("0::"))??""}catch{return!1}let c=n.slice(3);return c===t||c.startsWith(`${t}/`)}function Pe(e){let r=[],t=(n)=>{try{for(let o of k(d(n,"cgroup.procs"),"utf8").split(`
|
|
9
|
-
`))if(/^\d+$/.test(o))r.push(Number(o))}catch{}let c=[];try{c=X(n,{withFileTypes:!0}).filter((o)=>o.isDirectory()).map((o)=>o.name)}catch{}for(let o of c)t(d(n,o))};return t(e),r}function ge(e,r="/proc"){let t=new Map;for(let c of e.slice(0,64)){let o=`${en(c,r)}:${nn(c,r)}`;t.set(o,(t.get(o)??0)+1)}let n=[...t.entries()].sort((c,o)=>o[1]-c[1])[0]?.[0]??"none";return{count:e.length,cause:n}}function en(e,r){let t;try{t=(k(d(r,String(e),"cgroup"),"utf8").split(`
|
|
10
|
-
`).find((n)=>n.startsWith("0::"))??"").slice(3)}catch{return"gone"}if(t==="/")return"root";if(t==="/reason-payload")return"payload";if(t.startsWith("/reason-payload/vm-hands/b-"))return"payload_bind";if(t==="/reason-payload/vm-hands"||t.startsWith("/reason-payload/vm-hands/"))return"payload_vm_hands";if(t.startsWith("/reason-payload/"))return"payload_sub";if(t==="/reason-person"||t.startsWith("/reason-person/"))return"person";if(t==="/reason-srt"||t.startsWith("/reason-srt/"))return"srt";if(t==="/reason-vm-hands"||t.startsWith("/reason-vm-hands/"))return"vm_hands";if(t==="/reason-workload"||t.startsWith("/reason-workload/"))return"workload";return"other"}function nn(e,r){let t;try{t=k(d(r,String(e),"stat"),"utf8")}catch{return"gone"}let n=t.slice(t.lastIndexOf(")")+2,t.lastIndexOf(")")+3);return{R:"running",S:"sleeping",D:"disk",Z:"zombie",T:"stopped",t:"stopped",I:"idle"}[n]??"other"}function se(e,r="/proc"){return e.slice(0,16).map((t)=>{let n="?",c="?";try{n=k(d(r,String(t),"comm"),"utf8").trim().slice(0,32)}catch{}try{c=(k(d(r,String(t),"cgroup"),"utf8").split(`
|
|
11
|
-
`).find((o)=>o.startsWith("0::"))??"").slice(3,120)}catch{}return{pid:t,comm:n,ppid:Se(t,r),cgroup:c}})}function he(e,r="/proc"){let t=[];for(let n of X(r)){if(!/^\d+$/.test(n))continue;let c;try{c=k(d(r,n,"stat"),"utf8")}catch{continue}let o=c.slice(c.lastIndexOf(")")+2).split(" "),l=Number(o[1]),p=Number(o[6]),b=Number(o[19]),P=(p&2097152)!==0||l===2||n==="2",x=(o[0]==="Z"||o[0]==="X")&&o[17]==="1";if(!P&&!x&&b>=e)t.push(Number(n))}return t}function _e(e,r="/proc"){let t=[];for(let n of X(r)){if(!/^\d+$/.test(n))continue;let c;try{c=k(d(r,n,"status"),"utf8")}catch{continue}if(/^State:\s+[ZX]/m.test(c)&&/^Threads:\s+1$/m.test(c))continue;let o=/^Uid:\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/m.exec(c);if(o&&o.slice(1).some((l)=>Number(l)===e))t.push(Number(n))}return t}function ye(e="/proc/sys/kernel/yama/ptrace_scope"){try{return Number(k(e,"utf8").trim())>=1}catch{return!1}}var L=0,Re=[],Z=new Set;function tn(){L++;let e=!1;return()=>{if(e)return;if(e=!0,--L===0)for(let r of Re.splice(0))r()}}function rn(){return L===0?Promise.resolve():new Promise((e)=>{Re.push(e)})}async function we(){while(L>0)await rn()}async function sn(){let e=Date.now()+1000;while(Z.size&&Date.now()<e)await new Promise((r)=>setTimeout(r,2))}function on(e,r){let t=r.replace(/^\/sys\/fs\/cgroup/,"");Z.add(e);let n=()=>{let c="";try{c=k(`/proc/${e}/cgroup`,"utf8").split(`
|
|
12
|
-
`).find((o)=>o.startsWith("0::"))??""}catch{Z.delete(e);return}if(c.slice(3)===t){Z.delete(e);return}setTimeout(n,1)};n()}function wn(e){let r={person:e.personCgroup??d("/sys/fs/cgroup",oe,M),model:e.payloadCgroup??d(ve,M),surface:e.surfaceCgroup??d("/sys/fs/cgroup",oe,M,je)},t=e.entry??process.argv[1]??"",n={},c=(l)=>l.startsWith("model:")&&e.bindCgroup?e.bindCgroup(l.slice(6)):r[l.startsWith("model")?"model":l==="surface"?"surface":"person"],o=(l)=>{let p=l.startsWith("model")?"model":l==="surface"?"surface":"person",b=new Map,P=String(e.payloadUid),x=String(e.payloadGid);if(p==="surface")try{J(c(l),{mode:493})}catch{}let m=p==="surface"?'exec "$@"':`exec /usr/bin/setpriv --no-new-privs --reuid=${P} --regid=${x} --clear-groups -- "$@"`,_=Bun.spawn(["/bin/sh","-c",`echo $$ > ${be(d(c(l),"cgroup.procs"))} || exit 125; ${m}`,"vm-hands-op-join",process.execPath,"--no-install",t,"--vm-hands-op-runner",...p==="person"?[jn]:[],...p==="surface"?[Hn,`${Fr}${P}`,`${jr}${e.surfaceDirectory??""}`]:[]],{cwd:"/",env:{PATH:process.env.PATH??"/usr/bin:/bin",BUN_BE_BUN:"1",HOME:p==="surface"?process.env.HOME||"/root":"/home/runner",...E("/bin/bash")?{SHELL:"/bin/bash"}:{}},stdio:["ignore","ignore","ignore"],ipc(I){let R=I;if(p==="surface"&&R.t==="readiness"){let U=I;e.log?.("vm_hands.surface_ready",{lanes:Object.keys(U.lanes??{}).filter((K)=>U.lanes[K]===!0),display_video:U.display_video===!0}),e.onSurfaceReadiness?.(U);return}let F=b.get(R.id);if(!F)return;if(R.t==="event"&&R.event)F.onEvent(R.event);if(R.t==="done")b.delete(R.id),F.done(R.completion??{status:"failed",error_code:"vm_hands_op_failed"})}});_.exited.then((I)=>{if(n[l]?.child===_)delete n[l];for(let[,R]of b)R.done({status:"failed",error_code:"vm_hands_op_runner_exited"});if(b.clear(),e.log?.("vm_hands.op_runner_exited",{kind:p,code:I}),p==="surface")e.onSurfaceReadiness?.(null)}),on(_.pid,c(l));let O={child:_,pending:b};return n[l]=O,O};return{run(l,p,b,P,x){if(!ye())return Promise.resolve({status:"failed",error_code:"vm_hands_ptrace_unprotected"});let m=l==="model"&&x&&e.bindCgroup?`model:${x.toLowerCase()}`:l,_=async()=>{while(!n[m]&&L>0)await we()};return _().then(async()=>{if(!n[m]&&L>0)await _()}).then(()=>new Promise((O)=>{if(!n[m]&&L>0){O({status:"failed",error_code:"vm_hands_op_runner_unavailable"});return}let I=n[m]??o(m);I.pending.set(p.id,{onEvent:b,done:O}),P.addEventListener("abort",()=>{try{I.child.send({t:"cancel",id:p.id})}catch{}},{once:!0});try{I.child.send({t:"op",...p})}catch{I.pending.delete(p.id),O({status:"failed",error_code:"vm_hands_op_runner_unavailable"})}}))},warm(l){if(!n[l]&&ye())we().then(()=>{if(!n[l]&&L===0)o(l)})},notify(l,p){let b=n[l];if(!b)return!1;try{return b.child.send(p),!0}catch{return!1}},stop(){for(let l of Object.keys(n))n[l]?.child.kill()}}}export{ve as VM_HANDS_PAYLOAD_CGROUP,M as VM_HANDS_PAYLOAD_JOIN,oe as VM_HANDS_PERSON_CGROUP,Ee as VM_HANDS_PROBE_NONCE_TOKEN,fe as VM_HANDS_PROOF_DIR_TOKEN,je as VM_HANDS_SURFACE_JOIN,Ke as VM_HANDS_WORKLOAD_CGROUP,w as VmHandsExecutorError,yn as createVmHandsExecutor,wn as createVmHandsOpRunners,se as describeProcesses,z as inCgroup,_e as payloadUidProcesses,he as processesStartedSince,ye as ptraceProtected,Pe as subtreePids,ge as survivorSummary,Ve as vmHandsBindCgroup,Xe as vmHandsSessionRoot};
|