@reason-machines/cli-linux-arm64-musl 0.2.380 → 0.2.382
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/bin/ara +2 -2
- package/bin/vm-hands/api-credentials-xppmbg0m.js +2 -0
- package/bin/vm-hands/api-xmpbsm6b.js +2 -0
- package/bin/vm-hands/{ask-relay-9pm7kj1s.js → ask-relay-zjqyxvxe.js} +3 -3
- package/bin/vm-hands/connect-cli-ehxeg8m5.js +2 -0
- package/bin/vm-hands/{custom-endpoint-device-zhpake9f.js → custom-endpoint-device-bm94e9r0.js} +1 -1
- package/bin/vm-hands/desktop-account-3tnm4z5w.js +2 -0
- package/bin/vm-hands/{device-workspace-vbcry9d6.js → device-workspace-0xsj5ykf.js} +1 -1
- package/bin/vm-hands/hands-worker-source-azdrrhsz.js +2 -0
- package/bin/vm-hands/{index-bbk6a9sk.js → index-7f2kwwen.js} +1 -1
- package/bin/vm-hands/{install-receipt-7x81ek76.js → install-receipt-3xyx3rdd.js} +1 -1
- package/bin/vm-hands/local-automation-ynx1qr9v.js +2 -0
- package/bin/vm-hands/local-capabilities-855ch0dq.js +2 -0
- package/bin/vm-hands/local-desktop-users-ajb81vjm.js +2 -0
- package/bin/vm-hands/local-display-mac-9h6btvvq.js +2 -0
- package/bin/vm-hands/local-display-session-f9ywkbba.js +2 -0
- package/bin/vm-hands/local-pty-session-cjas515w.js +2 -0
- package/bin/vm-hands/managed-runtime-dars4628.js +2 -0
- package/bin/vm-hands/{network-contract-zqvt1v0t.js → network-contract-dsw79qkc.js} +1 -1
- package/bin/vm-hands/package-smk3nqjs.js +2 -0
- package/bin/vm-hands/permissions-pdmhp2s3.js +2 -0
- package/bin/vm-hands/{reason-hands-protocol-8fxjynte.js → reason-hands-protocol-7d7xj1h3.js} +1 -1
- package/bin/vm-hands/serve-service-n6xd6323.js +2 -0
- package/bin/vm-hands/status-2m75kz1h.js +96 -0
- package/bin/vm-hands/version-74zqccyz.js +2 -0
- package/bin/vm-hands/vm-hands-entry-lite-06qnb2w1.js +458 -0
- package/bin/vm-hands/{vm-hands-entry-lite-7shpbsw8.js → vm-hands-entry-lite-1gxktkpe.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-wf1ek4f0.js → vm-hands-entry-lite-23bb8ce4.js} +2 -2
- package/bin/vm-hands/vm-hands-entry-lite-245929bs.js +346 -0
- package/bin/vm-hands/vm-hands-entry-lite-2e18tm6w.js +245 -0
- package/bin/vm-hands/{vm-hands-entry-lite-g036gtem.js → vm-hands-entry-lite-2t0vcvd8.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-8yy5ttfw.js → vm-hands-entry-lite-2tcjqgfp.js} +3 -3
- package/bin/vm-hands/vm-hands-entry-lite-3n3xh0xv.js +540 -0
- package/bin/vm-hands/vm-hands-entry-lite-50n6vbfx.js +251 -0
- package/bin/vm-hands/{vm-hands-entry-lite-j2q1k9vb.js → vm-hands-entry-lite-51hmj6am.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-zfwg7ehq.js → vm-hands-entry-lite-5n4vsm6b.js} +2 -2
- package/bin/vm-hands/vm-hands-entry-lite-8fj07njx.js +3 -0
- package/bin/vm-hands/{vm-hands-entry-lite-r8twmzjc.js → vm-hands-entry-lite-8zawqa9q.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-3hbe4em3.js → vm-hands-entry-lite-9cmfthkq.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-45j8qwsf.js → vm-hands-entry-lite-9w5vs9zv.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-qyzgxd9g.js → vm-hands-entry-lite-aj1ccphg.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-za55dtte.js → vm-hands-entry-lite-ammr3xbc.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-de2rkr5h.js → vm-hands-entry-lite-ch7y4b1b.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-439yqbn5.js → vm-hands-entry-lite-cwe16c51.js} +174 -16
- package/bin/vm-hands/vm-hands-entry-lite-dh5gwmyf.js +3 -0
- package/bin/vm-hands/vm-hands-entry-lite-dsdwzasy.js +105 -0
- package/bin/vm-hands/{vm-hands-entry-lite-5pm6bhb8.js → vm-hands-entry-lite-e0gdt6r5.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-5kgvss4p.js → vm-hands-entry-lite-e2mjbqmr.js} +2 -2
- package/bin/vm-hands/vm-hands-entry-lite-ejm5er3h.js +7 -0
- package/bin/vm-hands/{vm-hands-entry-lite-mh0xecf3.js → vm-hands-entry-lite-f02906k8.js} +4 -4
- package/bin/vm-hands/vm-hands-entry-lite-f5230h6t.js +67 -0
- package/bin/vm-hands/{vm-hands-entry-lite-zh8p7ndn.js → vm-hands-entry-lite-fb5dzy9x.js} +2 -2
- package/bin/vm-hands/vm-hands-entry-lite-fyvgav60.js +3 -0
- package/bin/vm-hands/vm-hands-entry-lite-g7h6wjqy.js +3 -0
- package/bin/vm-hands/vm-hands-entry-lite-h8dbw0c7.js +4 -0
- package/bin/vm-hands/{vm-hands-entry-lite-nhtb458c.js → vm-hands-entry-lite-hnsm5t36.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-r6pap1kh.js → vm-hands-entry-lite-ma001vzh.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-anmv8hp7.js → vm-hands-entry-lite-mn64e4pt.js} +286 -104
- package/bin/vm-hands/{vm-hands-entry-lite-9cgm6g8t.js → vm-hands-entry-lite-pk3q774c.js} +1 -1
- package/bin/vm-hands/vm-hands-entry-lite-qef2ndkd.js +6 -0
- package/bin/vm-hands/vm-hands-entry-lite-qnnfvm5r.js +5 -0
- package/bin/vm-hands/vm-hands-entry-lite-qwf78yqr.js +11 -0
- package/bin/vm-hands/vm-hands-entry-lite-r8qg3wp1.js +3 -0
- package/bin/vm-hands/vm-hands-entry-lite-rd0ak4ye.js +4 -0
- package/bin/vm-hands/{vm-hands-entry-lite-00qsbphw.js → vm-hands-entry-lite-rpn0frzb.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-g9rvf5qk.js → vm-hands-entry-lite-rtt2w6c6.js} +1 -1
- package/bin/vm-hands/vm-hands-entry-lite-sex82vb1.js +3 -0
- package/bin/vm-hands/{vm-hands-entry-lite-dgxxsdwb.js → vm-hands-entry-lite-xrthfx3q.js} +2 -2
- package/bin/vm-hands/{vm-hands-entry-lite-kxdw4myj.js → vm-hands-entry-lite-y2s2w174.js} +1 -1
- package/bin/vm-hands/{vm-hands-entry-lite-hc3p6r9p.js → vm-hands-entry-lite-zjfr0zh8.js} +2 -2
- package/bin/vm-hands/vm-hands-entry-lite.js +1 -1
- package/bin/vm-hands/{vm-hands-executor-a05whg1y.js → vm-hands-executor-yx6mxa2p.js} +1 -1
- package/bin/vm-hands/vm-hands-op-runner-yt3v3v6w.js +2 -0
- package/bin/vm-hands/{vm-hands-runtime-ky9jhq5h.js → vm-hands-runtime-ygddqgbs.js} +3 -3
- package/bin/vm-hands/worker-sandbox-tgqbmy6b.js +2 -0
- package/package.json +1 -1
- package/bin/vm-hands/api-af9g18n7.js +0 -2
- package/bin/vm-hands/api-credentials-65mrr3tn.js +0 -2
- package/bin/vm-hands/connect-cli-w0z9jzv5.js +0 -2
- package/bin/vm-hands/desktop-account-5zvgspyw.js +0 -2
- package/bin/vm-hands/hands-worker-source-h0b1j53p.js +0 -2
- package/bin/vm-hands/local-automation-nm3xtj0a.js +0 -2
- package/bin/vm-hands/local-capabilities-bbrr6j7v.js +0 -2
- package/bin/vm-hands/local-desktop-users-0hadyvx1.js +0 -2
- package/bin/vm-hands/local-display-mac-v1pc7177.js +0 -2
- package/bin/vm-hands/local-display-session-n0kagkex.js +0 -2
- package/bin/vm-hands/local-pty-session-hs7rq03x.js +0 -2
- package/bin/vm-hands/managed-runtime-n7ftmmx7.js +0 -2
- package/bin/vm-hands/package-3cd7cfyv.js +0 -2
- package/bin/vm-hands/permissions-bfwdxyr5.js +0 -2
- package/bin/vm-hands/serve-service-g12x52xn.js +0 -2
- package/bin/vm-hands/status-t3jrf9fn.js +0 -96
- package/bin/vm-hands/version-m89hab1m.js +0 -2
- package/bin/vm-hands/vm-hands-entry-lite-1085xsma.js +0 -5
- package/bin/vm-hands/vm-hands-entry-lite-4m40gwkf.js +0 -3
- package/bin/vm-hands/vm-hands-entry-lite-5q1q991e.js +0 -181
- package/bin/vm-hands/vm-hands-entry-lite-bdp2578c.js +0 -540
- package/bin/vm-hands/vm-hands-entry-lite-bvbfcp1k.js +0 -4
- package/bin/vm-hands/vm-hands-entry-lite-c01eyep6.js +0 -3
- package/bin/vm-hands/vm-hands-entry-lite-dcynw6t2.js +0 -3
- package/bin/vm-hands/vm-hands-entry-lite-g6912hkd.js +0 -62
- package/bin/vm-hands/vm-hands-entry-lite-hh24bq0d.js +0 -3
- package/bin/vm-hands/vm-hands-entry-lite-jb2sr2r7.js +0 -3
- package/bin/vm-hands/vm-hands-entry-lite-sb9a1jcn.js +0 -4
- package/bin/vm-hands/vm-hands-entry-lite-sky5eg5d.js +0 -11
- package/bin/vm-hands/vm-hands-entry-lite-ynzy9k5z.js +0 -340
- package/bin/vm-hands/vm-hands-entry-lite-ze9msfq1.js +0 -3
- package/bin/vm-hands/vm-hands-entry-lite-zq42mcjc.js +0 -459
- package/bin/vm-hands/vm-hands-op-runner-69sca90a.js +0 -2
- package/bin/vm-hands/worker-sandbox-wpzkvwer.js +0 -2
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{hg as j0}from"./vm-hands-entry-lite-ze9msfq1.js";import{yg as U0}from"./vm-hands-entry-lite-dgxxsdwb.js";import{Eg as Zq}from"./vm-hands-entry-lite-zh8p7ndn.js";import{Ri as Aq}from"./vm-hands-entry-lite-r8twmzjc.js";import{Yi as d}from"./vm-hands-entry-lite-c01eyep6.js";import{Fj as H,Ij as L0,Lj as y0,Mj as T8,Nj as sq,Pj as $8,Sj as iq,Uj as nq}from"./vm-hands-entry-lite-7shpbsw8.js";import{Wj as W0}from"./vm-hands-entry-lite-bvbfcp1k.js";import{bk as M}from"./vm-hands-entry-lite-j2q1k9vb.js";import{execFile as tx,spawn as T0}from"child_process";import{randomBytes as ex}from"crypto";import{chmodSync as q1,existsSync as B0,lstatSync as x1,mkdirSync as X1,readFileSync as Q1,rmSync as P1,writeFileSync as o8}from"fs";import{connect as b1}from"net";import{join as _}from"path";var Uq="./desktop-wallpaper-0pjhgyfk.jpg";var Lq="./dock-browser-afp005mt.png";var yq="./dock-files-rywdm96b.png";var jq="./dock-terminal-s41cj1jp.png";var Tq=`# 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
|
-
`;var e=32,Bq=76;function _0(q){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>${e}</x><y>${e}</y></position>
|
|
67
|
-
<size><width>${q.width-e*2}</width><height>${q.height-e-Bq}</height></size>
|
|
68
|
-
</application>
|
|
69
|
-
</applications>
|
|
70
|
-
</openbox_config>`}var E0=`# Remote sandbox dock \u2014 launcher icons only, centred, no panel fill
|
|
71
|
-
panel_items = L
|
|
72
|
-
panel_size = 100% 46
|
|
73
|
-
panel_margin = 0 10
|
|
74
|
-
panel_padding = 0 0 10
|
|
75
|
-
panel_position = bottom center horizontal
|
|
76
|
-
panel_shrink = 1
|
|
77
|
-
panel_background_id = 0
|
|
78
|
-
panel_layer = top
|
|
79
|
-
mouse_effects = 1
|
|
80
|
-
mouse_hover_icon_asb = 100 0 12
|
|
81
|
-
mouse_pressed_icon_asb = 100 0 -12
|
|
82
|
-
|
|
83
|
-
launcher_icon_size = 46
|
|
84
|
-
launcher_padding = 0 0 10
|
|
85
|
-
launcher_background_id = 0
|
|
86
|
-
launcher_tooltip = 1
|
|
87
|
-
|
|
88
|
-
launcher_item_app = /tmp/ara-chromium.desktop
|
|
89
|
-
launcher_item_app = /tmp/ara-terminal.desktop
|
|
90
|
-
launcher_item_app = /tmp/ara-files.desktop
|
|
91
|
-
`,O0=`corner-radius = 12;
|
|
92
|
-
rounded-corners-exclude = [
|
|
93
|
-
"class_g = 'tint2'",
|
|
94
|
-
"window_type = 'dock'",
|
|
95
|
-
"window_type = 'desktop'"
|
|
96
|
-
];
|
|
97
|
-
backend = "xrender";
|
|
98
|
-
shadow = false;
|
|
99
|
-
fading = false;
|
|
100
|
-
vsync = false;
|
|
101
|
-
inactive-opacity = 1.0;
|
|
102
|
-
active-opacity = 1.0;
|
|
103
|
-
`,$0="/tmp/ara-dock-browser.png",H0=`[Desktop Entry]
|
|
104
|
-
Name=Chrome
|
|
105
|
-
Exec=chromium --no-sandbox %U
|
|
106
|
-
Icon=${$0}
|
|
107
|
-
Type=Application
|
|
108
|
-
Categories=Network;WebBrowser;
|
|
109
|
-
`,f0=`[Desktop Entry]
|
|
110
|
-
Name=Terminal
|
|
111
|
-
Exec=bash -c "DISPLAY=:99 xterm -fa DejaVuSansMono -fs 11 -bg black -fg white"
|
|
112
|
-
Icon=/tmp/ara-dock-terminal.png
|
|
113
|
-
Type=Application
|
|
114
|
-
Categories=System;TerminalEmulator;
|
|
115
|
-
`,h0=`[Desktop Entry]
|
|
116
|
-
Name=Files
|
|
117
|
-
Exec=bash -c "DISPLAY=:99 pcmanfm --no-desktop"
|
|
118
|
-
Icon=/tmp/ara-dock-files.png
|
|
119
|
-
Type=Application
|
|
120
|
-
Categories=System;FileManager;
|
|
121
|
-
`;var Dq={"wallpaper.jpg":Uq,"dock-browser.png":Lq,"dock-terminal.png":jq,"dock-files.png":yq},g0=Tq,p0='set_wallpaper() { if command -v feh >/dev/null 2>&1; then feh --bg-fill "$1"; else python3 "$2" "$1"; fi; }';function Rq(q){let x=(J)=>J.replaceAll("DISPLAY=:99",`DISPLAY=${q.display}`).replaceAll("/tmp/ara-",`${q.root}/ara-`),X=new Set(q.absent??[]),Q=E0.split(`
|
|
122
|
-
`).filter((J)=>!(X.has("terminal")&&J.endsWith("/ara-terminal.desktop"))&&!(X.has("files")&&J.endsWith("/ara-files.desktop"))).join(`
|
|
123
|
-
`);return{files:{"openbox/rc.xml":_0(q.screen),"tint2/tint2rc":x(Q),"picom/picom.conf":O0,...X.has("terminal")?{}:{"ara-terminal.desktop":x(f0)},...X.has("files")?{}:{"ara-files.desktop":x(h0)},"ara-chromium.desktop":x(H0).replace("chromium --no-sandbox %U",q.browserExec),"ara-set-root-wallpaper.py":g0},start:['ticks() { line=$(cat "/proc/$1/stat" 2>/dev/null) || return 1; rest=${line##*) }; case $rest in Z*|X*) return 1;; esac; printf "%s" "$rest" | cut -d " " -f20; }','alive() { [ -f "$ROOT/$1.pid" ] || return 1; read -r pid start <"$ROOT/$1.pid"; current=$(ticks "$pid") || return 1; [ "$current" = "$start" ] && kill -0 "$pid" 2>/dev/null; }','launch() { name=$1; shift; "$@" 9>&- >"$ROOT/$name.log" 2>&1 & pid=$!; start=$(ticks "$pid"); printf "%s %s\\n" "$pid" "$start" >"$ROOT/$name.pid"; }',p0,'[ ! -f "$ROOT/ara-wallpaper.jpg" ] || set_wallpaper "$ROOT/ara-wallpaper.jpg" "$ROOT/ara-set-root-wallpaper.py" || true','if ! alive tint2 && command -v tint2 >/dev/null 2>&1; then launch tint2 tint2 -c "$ROOT/tint2/tint2rc"; fi','if ! alive picom && command -v picom >/dev/null 2>&1; then launch picom picom --config "$ROOT/picom/picom.conf"; fi']}}import{createHash as Gq}from"crypto";import{once as k0}from"events";import{createWriteStream as I0,existsSync as v0,mkdirSync as u0,mkdtempSync as n1,readFileSync as U8,readdirSync as o1,renameSync as c0,realpathSync as l0,rmSync as r0,statSync as H8,writeFileSync as m0}from"fs";import{dirname as f8,join as S}from"path";import{finished as d0}from"stream/promises";var _8="omljlfpmafedpplnpkkahegadhkimdje",f1="https://chromewebstore.google.com/detail/reason/omljlfpmafedpplnpkkahegadhkimdje";function p1(q){if(!q||typeof q!=="object"||Array.isArray(q)||!("version"in q)||q.version!==1||!("status"in q))return null;if(q.status==="unavailable")return Object.keys(q).length===2?{version:1,status:"unavailable"}:null;if(q.status!=="connected"||Object.keys(q).length!==5||!("deviceId"in q)||typeof q.deviceId!=="string"||!/^[A-Za-z0-9._:-]{1,160}$/.test(q.deviceId)||!("apiOrigin"in q)||typeof q.apiOrigin!=="string"||q.apiOrigin.length>2048||!("managedRootIds"in q)||!Array.isArray(q.managedRootIds)||q.managedRootIds.length>32)return null;let x=[];for(let X of q.managedRootIds){if(typeof X!=="string"||!/^[A-Za-z0-9._:-]{1,160}$/.test(X))return null;x.push(X)}try{let X=new URL(q.apiOrigin);if(X.origin!==q.apiOrigin||X.username||X.password||!(X.protocol==="https:"||X.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(X.hostname)))return null}catch{return null}return{version:1,status:"connected",deviceId:q.deviceId,apiOrigin:q.apiOrigin,managedRootIds:x}}var g={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"}},N8={version:"155.0.8059.84",macArm64Sha256:"13b9e98ce56f5ce18e100a009f455c9285f399e7c9dc8a76fdf2f3a9755bb5f2",linux64Sha256:"cf0f049892dea22e6a6db26d47ed0d7776b7158edcbec4634086633df8bafcbc"};var q8={ocu:{url:`https://registry.npmjs.org/open-computer-use/-/open-computer-use-${g.ocu.version}.tgz`,sha256:"7c16a87c8cd357787b02c0ebd040dd5f93880c1fb51c1901caa2e0c05d063130",size_bytes:5844280},obu:{url:`https://registry.npmjs.org/open-browser-use/-/open-browser-use-${g.obu.version}.tgz`,sha256:"9386d8ce0a147b3f55e1807b68edf736836378807541c457c9b5f6ca2cabaa4e",size_bytes:21372018},extension:{url:`https://github.com/iFurySt/open-browser-use/releases/download/v${g.obu.version}/open-browser-use-chrome-extension-${g.obu.version}.zip`,sha256:"c9c07bec1175e12ea6985b0e7784a5ef01fd03f014b958224a1e17dcd838a241",size_bytes:31070}},r="pnbmoicbkopffjjgfgfglopechaiemkp";var a0=["none","standard","all"],E8="22.23.3",s0={"linux-x64":"1084aa36196bba4c3a5e69a1ee388a6e4ff729dad09445fbcd434b28fe3c24af","linux-arm64":"5ced2d48d1d7198739b7f86804de0171aefb6823b684b12341d3321afc3cb0b2","darwin-arm64":"23b25245dcfb9af7262f8ff142e9e2e0af025368117329e7a7458a51e5922f53"},O8={"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"}},Fq="chrome-mac-arm64/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",h8={version:"9.0.2",url:"https://ffmpeg.martin-riedl.de/download/macos/arm64/1789931890_9.0.2/ffmpeg.zip",sha256:"c8ed4c4e6978a03c485edbfe4e0a5dc2380f8a30bba5150531b31b094492d924"},i0={version:h8.version,url:"https://ffmpeg.martin-riedl.de/download/macos/arm64/1789931890_9.0.2/ffprobe.zip",sha256:"fcbe839537485eaee7a7a8bc5cbc0f90d53617e80943e8a5b2e31cb851197ea6"},m="com.ifuryst.open_browser_use.extension",wq="com.reasonmachines.browser_use.extension",Cq="/tmp/reason-browser-use",g8=["tint2","picom","xterm","pcmanfm"],Vq=["fonts-droid-fallback"],Kq=["pulseaudio"],n0=["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",...Vq,"galculator","chromium","ffmpeg","tmux",...Kq,...g8],o0=new Set([...g8,...Vq,...Kq]),Sq=n0.filter((q)=>q!=="chromium"&&!o0.has(q)),t0=["Xvfb","openbox","x11vnc","xdotool","dbus-launch","python3","ffmpeg","tmux"],W8="/usr/bin/chromium",e0=["/usr/local/bin","/usr/bin","/bin","/opt/homebrew/bin"];function Mq(q=process.platform,x=process.arch){let X=`${q}-${x}`;return X==="linux-x64"||X==="linux-arm64"||X==="darwin-arm64"?X:null}function L8(q){return{node:{version:E8,url:`https://nodejs.org/dist/v${E8}/node-v${E8}-${q}.tar.gz`,sha256:s0[q]},open_computer_use:{version:g.ocu.version,url:q8.ocu.url,sha256:q8.ocu.sha256},open_browser_use:{version:g.obu.version,url:q8.obu.url,sha256:q8.obu.sha256},...q==="darwin-arm64"?{chrome_for_testing:{version:N8.version,url:`https://storage.googleapis.com/chrome-for-testing-public/${N8.version}/mac-arm64/chrome-mac-arm64.zip`,sha256:N8.macArm64Sha256}}:{}}}function qx(q){let x={extension:r};for(let[X,Q]of Object.entries(L8(q)))x[X]=`${Q.version}@${Q.sha256}`;return x}function Yq(q){return S(q,".local","share","reason","desktop")}function zq(q,x=Zq()){let X=Yq(x),Q=(W)=>S(X,W,L8(q)[W]?.version??""),P=Q("open_computer_use"),b=Q("open_browser_use"),J=q==="darwin-arm64",y=S(x,"Library","Application Support"),C=J?S(y,"Google","Chrome","NativeMessagingHosts",`${m}.json`):S(x,".config","google-chrome","NativeMessagingHosts",`${m}.json`);return{root:X,automation:S(f8(X),"automation"),receipt:S(X,"receipt.json"),minimal:k8(x),node:S(Q("node"),"bin","node"),ocuDir:P,ocu:S(P,O8[q].ocu),ocuApp:J?S(P,"dist","Open Computer Use.app"):null,obuDir:b,obu:S(b,"cli","open-browser-use.js"),nativeHost:S(b,O8[q].obu),extensionDir:J?S(y,"OpenBrowserUse","chrome-extension","release"):S(x,".local","share","open-browser-use","chrome-extension","release"),setupNativeHostManifest:C,nativeHostManifests:J?[C,S(y,"Google","ChromeForTesting","NativeMessagingHosts",`${m}.json`)]:[S(x,".config","chromium","NativeMessagingHosts",`${m}.json`),S(x,".config","google-chrome-for-testing","NativeMessagingHosts",`${m}.json`)],browser:J?S(Q("chrome_for_testing"),Fq):W8,userChromeHost:J?S(X,"user-chrome","reason-browser-use"):null,userChromeRegistration:J?S(y,"Google","Chrome","NativeMessagingHosts",`${wq}.json`):null,ffmpegDir:S(X,"ffmpeg"),ffmpeg:J?S(X,"ffmpeg",h8.version,"ffmpeg"):null,ffprobe:J?S(X,"ffprobe",i0.version,"ffprobe"):null}}function _q(q){try{let x=JSON.parse(U8(q,"utf8"));if(typeof x!=="object"||x===null)return null;let X=x,Q=X.pins;if(X.schema_version!==1||typeof X.platform!=="string"||typeof Q!=="object"||Q===null||!Object.values(Q).every((P)=>typeof P==="string")||!a0.includes(X.permissions)||!Array.isArray(X.missing_system_packages)||!X.missing_system_packages.every((P)=>typeof P==="string")||typeof X.updated_at!=="string")return null;return{schema_version:1,platform:X.platform,pins:Q,permissions:X.permissions,missing_system_packages:X.missing_system_packages,updated_at:X.updated_at}}catch{return null}}function xx(q,x,X=384){u0(f8(q),{recursive:!0,mode:448});let Q=`${q}.pending.${process.pid}`;m0(Q,x,{mode:X}),c0(Q,q)}function p(q){try{return H8(q).isFile()}catch{return!1}}function Eq(q){try{let x=H8(q);return x.isFile()&&(x.mode&73)!==0}catch{return!1}}function Xx(q){try{return U8(q,"utf8")}catch{return null}}function v(q){for(let x of e0){let X=S(x,q);try{let Q=H8(X);if(Q.isFile()&&(Q.mode&73)!==0)return X}catch{}}return null}function Qx(q){try{let x=JSON.parse(U8(S(q,"package.json"),"utf8"));return typeof x==="object"&&x!==null&&typeof x.version==="string"?x.version:null}catch{return null}}function Px(q,x,X){let Q=L8(X)[q];if(!Q)return!1;if(q==="node")return p(S(x,"bin","node"));if(q==="chrome_for_testing")return p(S(x,Fq));let P=O8[X][q==="open_computer_use"?"ocu":"obu"];return Qx(x)===Q.version&&p(S(x,P))&&(q==="open_computer_use"||p(S(x,"cli","open-browser-use.js")))}function bx(q){return Gq("sha256").update(Buffer.from(q,"base64")).digest("hex").slice(0,32).replace(/./g,(x)=>String.fromCharCode(97+Number.parseInt(x,16)))}function p8(q){try{let x=JSON.parse(U8(q,"utf8"));return typeof x==="object"&&x!==null&&!Array.isArray(x)?x:null}catch{return null}}function Jx(q){let x=p8(S(q.extensionDir,"manifest.json"));return x!==null&&x.version===g.obu.version&&typeof x.key==="string"&&bx(x.key)===r}function Nx(q,x){let X=q?.allowed_origins;return q!==null&&q.name===m&&Array.isArray(X)&&X.length===1&&X[0]===`chrome-extension://${r}/`&&(x===void 0||q.path===x)}function Wx(q){return Jx(q)&&p(q.nativeHost)&&q.nativeHostManifests.every((x)=>Nx(p8(x),q.nativeHost))}function Ux(q){return`#!/bin/sh
|
|
124
|
-
# Reason's Chrome extension host (reason desktop install): Open Browser Use on Reason's socket directory.
|
|
125
|
-
obu=${`'${q.replaceAll("'","'\\''")}'`}
|
|
126
|
-
case "$1" in
|
|
127
|
-
chrome-extension://*) exec "$obu" host --socket-dir ${Cq} ;;
|
|
128
|
-
mcp) shift; exec "$obu" mcp --socket-dir ${Cq} "$@" ;;
|
|
129
|
-
esac
|
|
130
|
-
exec "$obu" "$@"
|
|
131
|
-
`}function Lx(q){let x=p8(q),X=x?.allowed_origins;return x!==null&&x.name===wq&&x.type==="stdio"&&Array.isArray(X)&&X.includes(`chrome-extension://${_8}/`)&&typeof x.path==="string"&&Eq(x.path)}function yx(q,x){if(!q.userChromeHost||!q.userChromeRegistration)return null;if(!x||Xx(q.userChromeHost)!==Ux(q.nativeHost)||!Eq(q.userChromeHost))return{code:"user_chrome_browser_use_missing"};return Lx(q.userChromeRegistration)?{host:q.userChromeHost}:{code:"user_chrome_native_host_unregistered"}}var jx={display:["display"],computer:["display","system_packages","node","open_computer_use"],browser:["display","system_packages","node","open_computer_use","open_browser_use","browser_extension","browser","chrome_for_testing"]};function k(q={}){let x=q.platform===void 0?Mq():q.platform;if(!x)return null;let X=zq(x,q.home),Q=_q(X.receipt),P=qx(x),b=Q!==null&&Q.platform===x&&JSON.stringify(Object.entries(Q.pins).sort())===JSON.stringify(Object.entries(P).sort()),J=[],y=L8(x);for(let N of["node","open_computer_use","open_browser_use","chrome_for_testing"]){let D=y[N];if(!D)continue;let G=Px(N,S(X.root,N,D.version),x),F=Q?.pins[N],O=G&&F===P[N]?"ready":F!==void 0&&F!==P[N]?"outdated":"missing";J.push({name:N,state:O,detail:D.version})}let C=Q?.pins.extension===r&&Wx(X);J.push({name:"browser_extension",state:C?"ready":"missing",detail:r});let W=v("Xvfb"),j=v("x11vnc"),R=v("openbox");if(x!=="darwin-arm64"){J.push(p(W8)?{name:"browser",state:"ready",detail:W8}:{name:"browser",state:"missing",detail:`non-snap Chromium at ${W8}`});let N=W!==null&&j!==null&&R!==null;J.push({name:"display",state:N?"ready":"missing",detail:"Xvfb + openbox + x11vnc"});let D=t0.filter((z)=>v(z)===null),G=(Q?.missing_system_packages??Sq).filter((z)=>Sq.includes(z)),F=D.length===0&&G.length===0;J.push(F?{name:"system_packages",state:"ready"}:{name:"system_packages",state:"missing",detail:[...new Set([...G,...D])].join(" ")});let O=g8.filter((z)=>v(z)===null);J.push(O.length===0?{name:"desktop_look",state:"ready"}:{name:"desktop_look",state:"missing",detail:O.join(" ")})}let Z=X.ffmpeg&&p(X.ffmpeg)?X.ffmpeg:v("ffmpeg"),B=!Z?null:Z===X.ffmpeg?X.ffprobe:S(f8(l0(Z)),"ffprobe"),Y=b&&J.every((N)=>N.state==="ready"),w=(N)=>b&&J.every((D)=>!jx[N].includes(D.name)||D.state==="ready");return{platform:x,root:X.root,automation:X.automation,ready:Y,features:{display:w("display"),computer:w("computer"),browser:w("browser")},node:X.node,ocu:X.ocu,obu:X.obu,nativeHost:X.nativeHost,extensionDir:X.extensionDir,browser:X.browser,ffmpeg:Z,ffprobe:B&&p(B)?B:null,userChrome:yx(X,b&&["node","open_browser_use"].every((N)=>J.find((D)=>D.name===N)?.state==="ready")),pulseaudio:v("pulseaudio"),xvfb:W,x11vnc:j,openbox:R,components:J}}function Oq(q){return Tx(q)?Aq():[]}function Tx(q){return q?.platform==="darwin-arm64"&&q.ffmpeg===S(q.root,"ffmpeg",h8.version,"ffmpeg")}async function UX(q,x,X,Q=fetch){try{let P=await Q(q,{redirect:"follow"});if(!P.ok||!P.body)throw Error(`download failed (HTTP ${P.status}): ${q}`);let b=Gq("sha256"),J=I0(X,{mode:384});try{let C=P.body.getReader();for(let W=await C.read();!W.done;W=await C.read())if(b.update(W.value),!J.write(W.value))await k0(J,"drain")}finally{J.end(),await d0(J)}let y=b.digest("hex");if(y!==x)throw Error(`digest mismatch for ${q}: expected ${x}, got ${y}`)}catch(P){throw r0(X,{force:!0}),P}}function k8(q){return S(Yq(q),"minimal.json")}function Bx(q=d()){return v0(k8(q))}function LX(q={}){xx(k8(q.home??d()),`${JSON.stringify({version:1,minimal_at:(q.now?.()??new Date).toISOString()})}
|
|
132
|
-
`)}function yX(q={}){let x=q.platform===void 0?Mq():q.platform;if(x===null)return null;let X=q.home??d();if(_q(zq(x,X).receipt)!==null)return"refresh";return Bx(X)?null:"install"}import{execFile as Yx,spawn as d8}from"child_process";import{existsSync as zx}from"fs";import{connect as _x}from"net";function Dx(){let q=new Set,x=null,X=(P)=>({holder:x?.viewer??null,you:x===P,same_user:Boolean(x?.viewer&&P.viewer&&x.viewer.user_id===P.viewer.user_id)}),Q=()=>{for(let P of q)P.notify(X(P))};return{join(P){return q.add(P),P.notify(X(P)),()=>{if(!q.delete(P))return;if(x!==P)return;x=null,Q()}},claim(P){if(x===P||!q.has(P))return;x=P,Q()}}}var $q=Dx();import{spawn as Rx}from"child_process";import{existsSync as Cx}from"fs";import{connect as Sx}from"net";import{join as y8}from"path";var fq="reason_desktop",x8={sampleRate:48000,channels:2,codec:"opus"},Zx=5000,Ax=107,Gx=262144,u8=(q)=>y8(q,"native"),j8=(q)=>`unix:${q}`;function I8(q,x=1000){if(!Cx(q))return Promise.resolve(!1);return new Promise((X)=>{let Q=Sx({path:q}),P=(b)=>{Q.destroy(),X(b)};Q.setTimeout(x,()=>P(!1)),Q.once("error",()=>P(!1)),Q.once("close",()=>P(!1)),Q.once("connect",()=>P(!0))})}async function hq(q,x){if(!x)return null;let X=u8(q);if(Buffer.byteLength(X)>Ax||/["'\\\s]/.test(X))return null;try{if(await I8(X))return X;let Q=Rx(x,["--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:${y8(q,"pulseaudio.log")}`,"-n",`--load=module-native-protocol-unix socket="${X}" auth-anonymous=1 auth-cookie-enabled=0`,`--load=module-null-sink sink_name=${fq} rate=${x8.sampleRate} channels=${x8.channels} sink_properties=device.description=Reason_desktop`],{detached:!0,stdio:"ignore",env:{HOME:q,PATH:"/usr/bin:/bin",XDG_RUNTIME_DIR:q,PULSE_RUNTIME_PATH:y8(q,"runtime"),PULSE_STATE_PATH:y8(q,"state")}}),P=!1;Q.once("error",()=>{P=!0}),Q.once("exit",()=>{P=!0}),Q.unref();let b=Date.now()+Zx;while(Date.now()<b){if(await I8(X))return X;if(P)return await I8(X)?X:null;await new Promise((J)=>setTimeout(J,50))}if(!P)Q.kill("SIGKILL");return null}catch{return null}}function gq(){let{sampleRate:q,channels:x}=x8;return["-hide_banner","-loglevel","error","-nostdin","-fflags","nobuffer","-f","pulse","-sample_rate",String(q),"-channels",String(x),"-fragment_size",String(q*x*2/50),"-i",`${fq}.monitor`,"-vn","-ac",String(x),"-ar",String(q),"-c:a","libopus","-b:a","64k","-application","lowdelay","-frame_duration","20","-flush_packets","1","-page_duration","20000","-f","ogg","pipe:1"]}var Fx=[79,103,103,83],wx=Buffer.from("OpusHead"),Vx=Buffer.from("OpusTags"),Hq=(q,x)=>q.byteLength>=x.byteLength&&x.every((X,Q)=>q[Q]===X);class v8 extends Error{constructor(q){super(q);this.name="OggProtocolError"}}class c8{buffer=new Uint8Array(0);partial=[];partialBytes=0;push(q){let x=new Uint8Array(this.buffer.byteLength+q.byteLength);x.set(this.buffer),x.set(q,this.buffer.byteLength);let X=[],Q=0;while(x.byteLength-Q>=27){if(Fx.some((Z,B)=>x[Q+B]!==Z)||x[Q+4]!==0)throw new v8("invalid_page");let P=(x[Q+5]&1)!==0,b=x[Q+26];if(x.byteLength-Q<27+b)break;let J=x.subarray(Q+27,Q+27+b),y=J.reduce((Z,B)=>Z+B,0),C=27+b+y;if(x.byteLength-Q<C)break;if(!P&&this.partialBytes>0)this.resetPartial();let W=P&&this.partialBytes===0,j=Q+27+b,R=j;for(let Z of J){if(j+=Z,Z===255)continue;if(this.appendPartial(x.subarray(R,j),W),R=j,!W){let B=this.takePartial();if(B.byteLength>0&&!Hq(B,wx)&&!Hq(B,Vx))X.push(B)}W=!1,this.resetPartial()}if(R<j)this.appendPartial(x.subarray(R,j),W);Q+=C}return this.buffer=x.slice(Q),X}appendPartial(q,x){if(x||q.byteLength===0)return;if(this.partialBytes+=q.byteLength,this.partialBytes>Gx)throw new v8("packet_too_large");this.partial.push(q.slice())}takePartial(){if(this.partial.length===1)return this.partial[0];let q=new Uint8Array(this.partialBytes),x=0;for(let X of this.partial)q.set(X,x),x+=X.byteLength;return q}resetPartial(){this.partial=[],this.partialBytes=0}}import{spawn as Kx}from"child_process";var pq=1048576,Mx=String.raw`
|
|
133
|
-
import gi, json, os, sys
|
|
134
|
-
gi.require_version("Gtk", "3.0")
|
|
135
|
-
from gi.repository import Gtk, Gdk, GLib
|
|
136
|
-
if not Gtk.init_check()[0]:
|
|
137
|
-
sys.exit(1)
|
|
138
|
-
clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
|
|
139
|
-
pending = b""
|
|
140
|
-
generation = 0
|
|
141
|
-
def send(value):
|
|
142
|
-
print(json.dumps(value, ensure_ascii=True), flush=True)
|
|
143
|
-
def changed(clipboard, event):
|
|
144
|
-
global generation
|
|
145
|
-
generation += 1
|
|
146
|
-
current = generation
|
|
147
|
-
def received(clipboard, text, unused):
|
|
148
|
-
if current == generation and text is not None and len(text.encode("utf-8")) <= ${H}:
|
|
149
|
-
send({"text": text})
|
|
150
|
-
clipboard.request_text(received, None)
|
|
151
|
-
# No request_text on startup: never share the pre-existing clipboard.
|
|
152
|
-
clipboard.connect("owner-change", changed)
|
|
153
|
-
def input_ready(fd, condition):
|
|
154
|
-
global pending
|
|
155
|
-
chunk = os.read(fd, 65536)
|
|
156
|
-
if not chunk:
|
|
157
|
-
Gtk.main_quit()
|
|
158
|
-
return False
|
|
159
|
-
pending += chunk
|
|
160
|
-
while b"\n" in pending:
|
|
161
|
-
line, pending = pending.split(b"\n", 1)
|
|
162
|
-
text = json.loads(line)
|
|
163
|
-
if not isinstance(text, str) or len(text.encode("utf-8")) > ${H} or "\x00" in text:
|
|
164
|
-
sys.exit(1)
|
|
165
|
-
clipboard.set_text(text, -1)
|
|
166
|
-
send("ack")
|
|
167
|
-
if len(pending) > ${H*6+2}:
|
|
168
|
-
sys.exit(1)
|
|
169
|
-
return True
|
|
170
|
-
GLib.io_add_watch(0, GLib.IO_IN | GLib.IO_HUP, input_ready)
|
|
171
|
-
send("ready")
|
|
172
|
-
Gtk.main()
|
|
173
|
-
`;function kq(q,x){let X=Kx("/usr/bin/python3",["-I","-u","-c",Mx],{env:{DISPLAY:q.display,XAUTHORITY:q.xauthority},stdio:["pipe","pipe","ignore"]}),Q=!1,P=!0,b="",J=0,y=[],C=setTimeout(()=>j(),5000),W=()=>{Q=!0,clearTimeout(C),y.length=0,X.kill("SIGKILL")},j=()=>{if(Q)return;W(),x.end({error:new M("display_unavailable","Reason could not start this Linux desktop's UTF-8 clipboard.")})},R=(Z,B=32)=>{if(Q)return;if(!P){Z();return}if(J+=B,J>pq)W(),x.end({reason:"input_backpressure"});else y.push({apply:Z,bytes:B})};return X.stdout.on("data",(Z)=>{if(Q)return;b+=Z.toString("ascii");for(let B=b.indexOf(`
|
|
174
|
-
`);B>=0;B=b.indexOf(`
|
|
175
|
-
`)){let Y=b.slice(0,B);b=b.slice(B+1);let w;try{w=JSON.parse(Y)}catch{j();return}if(w==="ready"||w==="ack"){clearTimeout(C),P=!1;while(!P&&!Q&&y.length){let N=y.shift();J-=N.bytes,N.apply()}}else if(w&&typeof w==="object"&&"text"in w&&typeof w.text==="string"&&Buffer.byteLength(w.text)<=H)x.clipboard(w.text);else{j();return}if(Q)return}if(b.length>H*6+32)j()}),X.stdin.on("error",j),X.once("error",j),X.once("exit",j),{apply:R,write(Z){if(Buffer.byteLength(Z)>H||Z.includes("\x00")){j();return}let B=`${JSON.stringify(Z)}
|
|
176
|
-
`;R(()=>{if(P=!0,C=setTimeout(()=>j(),5000),X.stdin.write(B),X.stdin.writableLength>pq)W(),x.end({reason:"input_backpressure"})},Buffer.byteLength(B))},close:W}}var a={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}},Ex="avc1.4D002A",Iq={width:1920,height:1080},Ox=262144,$x=0.2,Hx=250,fx=1e4,hx=1024,l8=1e4,gx=500,px=60,kx=1e4,Ix=1000,vq=1048576,oq={kind:"mac_screen",sound:null},vx,uq=()=>vx??=k()?.ffmpeg??null,a8=(q,x,X)=>d8(q,x,{env:X,stdio:["ignore","pipe","ignore"]}),ux,s8=()=>ux??=Oq(k()),cq=(q,x,X)=>{let[Q,...P]=[...s8(),q];return a8(Q,[...P,...x],X)},lq=()=>P0?.videotoolbox?"h264_videotoolbox":"libx264",cx=()=>Math.round(performance.now()*1000),r8=new Set,rq=!1;function tq(q){if(r8.add(q),q.once("exit",()=>r8.delete(q)),rq)return;rq=!0,process.once("exit",()=>{for(let x of r8)try{x.kill("SIGKILL")}catch{}})}function eq(q){try{q.stdout?.destroy()}catch{}if(q.exitCode!==null||q.signalCode!==null)return;try{q.kill("SIGTERM")}catch{return}let x=setTimeout(()=>{if(q.exitCode===null&&q.signalCode===null)try{q.kill("SIGKILL")}catch{}},gx);q.once("exit",()=>clearTimeout(x))}function lx(q,x,X){return{args:["-f","x11grab","-draw_mouse","1","-framerate",String(q),"-video_size",`${x.width}x${x.height}`,"-i",X],size:x}}function rx(q){return{args:["-f","avfoundation","-capture_cursor","1","-pixel_format","nv12","-framerate",String(q),"-i","Capture screen 0:none"],size:null}}function mx(q){return{args:["-probesize","32","-analyzeduration","0","-f","image2pipe","-c:v","mjpeg","-framerate",String(q),"-i","pipe:0"],size:null}}var q0=1700000;function x0(q){return Math.min(1,Math.round(Math.sqrt(q0/(q.width*q.height))*100)/100)}function dx(q,x,X){let Q=d8(X.axe,["stream-video","--udid",X.udid,"--format","ffmpeg","--fps","30","--quality","85","--scale",String(Math.min(0.99,x0(X.size)))],{stdio:["ignore","pipe","ignore"]}),P=d8(q,x,{env:{},stdio:["pipe","pipe","ignore"]});Q.stdout.pipe(P.stdin),P.stdin.on("error",()=>{});let b=()=>{if(Q.exitCode===null&&Q.signalCode===null)Q.kill("SIGTERM")};return P.once("exit",b),P.once("error",b),Q.once("exit",()=>{if(P.exitCode===null&&P.signalCode===null)P.kill("SIGTERM")}),Q.once("error",()=>{if(P.exitCode===null&&P.signalCode===null)P.kill("SIGTERM")}),P}function ax(q){let x=Math.min(1,Iq.width/q.width,Iq.height/q.height);return{width:Math.round(q.width*x),height:Math.round(q.height*x)}}function m8(q,x,X,Q="libx264"){let P=a[q],b=(R)=>Math.max(2,Math.floor(R/2)*2),J={width:b(X.width*P.scale),height:b(X.height*P.scale)},y=J.width!==x.size?.width||J.height!==x.size.height,C=Math.max(1,Math.round(P.kbps*2/P.fps)),W=["-g",String(P.fps*px)],j=Q==="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",...W,"-b:v",`${P.kbps}k`,"-maxrate",`${P.kbps}k`,"-bufsize",`${C}k`,"-bsf:v","h264_metadata=aud=insert"]:["-c:v","libx264","-preset",P.x264Preset,"-tune","zerolatency","-profile:v","main","-level","4.2","-bf","0","-pix_fmt","yuv420p",...P.threads?["-threads",String(P.threads)]:[],"-x264-params","aud=1:repeat-headers=1",...W,"-crf",String(P.crf),"-maxrate",`${P.kbps}k`,"-bufsize",`${C}k`];return["-hide_banner","-loglevel","error","-nostdin","-fflags","nobuffer",...x.args,"-an",...y?["-vf",`scale=${J.width}:${J.height}:flags=fast_bilinear`]:[],...j,"-flush_packets","1","-f","h264","pipe:1"]}class X0{buffer=new Uint8Array(0);scanned=0;key=!1;micros=0;push(q,x){if(this.buffer.byteLength===0)this.micros=x;let X=new Uint8Array(this.buffer.byteLength+q.byteLength);X.set(this.buffer),X.set(q,this.buffer.byteLength),this.buffer=X;let Q=[],P=this.scanned;while(P+3<this.buffer.byteLength){if(this.buffer[P]!==0||this.buffer[P+1]!==0||this.buffer[P+2]!==1){P++;continue}let b=this.buffer[P+3]&31,J=P>0&&this.buffer[P-1]===0?P-1:P;if(b===9&&J>0)Q.push({data:this.buffer.slice(0,J),key:this.key,micros:this.micros}),this.buffer=this.buffer.subarray(J),this.key=!1,this.micros=x,P-=J;if(b===5)this.key=!0;P+=3}return this.scanned=P,Q}}function sx(q,x){let X=_x({path:q}),Q=Buffer.alloc(0),P="version",b=0,J=!1,y=[],C=0,W=!1,j=(N)=>{if(W)return;W=!0,X.destroy(),x.end(N)},R=()=>j({reason:"display_protocol"}),Z=(N)=>{if(W)return;if(!J){if(C+=N.byteLength,C>vq)j({reason:"input_backpressure"});else y.push(N);return}if(X.write(N),X.writableLength>vq)j({reason:"input_backpressure"})},B=(N)=>{Q=Q.subarray(N)},Y=()=>{switch(P){case"version":{if(Q.byteLength<12)return!1;let N=/^RFB (\d{3})\.(\d{3})\n$/.exec(Q.subarray(0,12).toString("latin1"));if(!N||Number(N[1])*1000+Number(N[2])<3007)return R(),!1;return B(12),X.write(`RFB 003.007
|
|
177
|
-
`),P="security",!0}case"security":{if(Q.byteLength<1)return!1;let N=Q[0];if(N===0)return R(),!1;if(Q.byteLength<1+N)return!1;if(!Q.subarray(1,1+N).includes(1))return R(),!1;return B(1+N),X.write(Buffer.from([1,1])),P="init",!0}case"init":{if(Q.byteLength<24)return!1;let N=Q.readUInt32BE(20);if(N>65536)return R(),!1;if(Q.byteLength<24+N)return!1;let D={width:Q.readUInt16BE(0),height:Q.readUInt16BE(2)};if(B(24+N),D.width===0||D.height===0)return R(),!1;P="messages",J=!0;for(let G of y)X.write(G);return y=[],C=0,x.ready(D),!W}case"skip":{let N=Math.min(b,Q.byteLength);if(B(N),b-=N,b>0)return!1;return P="messages",!0}case"messages":{if(Q.byteLength<1)return!1;switch(Q[0]){case 1:{if(Q.byteLength<6)return!1;let N=6+Q.readUInt16BE(4)*6;if(Q.byteLength<N)return!1;return B(N),!0}case 2:return B(1),!0;case 3:{if(Q.byteLength<8)return!1;let N=Q.readUInt32BE(4);if(N>H/2)return B(8),P="skip",b=N,!0;if(Q.byteLength<8+N)return!1;let D=Q.subarray(8,8+N).toString("latin1");return B(8+N),x.clipboard(D),!W}default:return R(),!1}}}},w=!1;return X.once("connect",()=>{w=!0}),X.on("data",(N)=>{if(W)return;Q=Q.byteLength?Buffer.concat([Q,N]):N;while(!W&&Y());}),X.once("error",()=>{if(!w)j({error:new M("display_unavailable","Reason could not reach this machine's desktop server.")})}),X.once("close",()=>j({reason:"display_closed"})),{pointer(N,D,G){let F=Buffer.alloc(6);F.writeUInt8(5,0),F.writeUInt8(G&255,1),F.writeUInt16BE(N,2),F.writeUInt16BE(D,4),Z(F)},key(N,D){let G=Buffer.alloc(8);G.writeUInt8(4,0),G.writeUInt8(N?1:0,1),G.writeUInt32BE(D>>>0,4),Z(G)},clipboard(N){if(Array.from(N).some((F)=>F.codePointAt(0)>255)){j({reason:"clipboard_unicode_unsupported"});return}let D=Buffer.from(N,"latin1"),G=Buffer.alloc(8);G.writeUInt8(6,0),G.writeUInt32BE(D.byteLength,4),Z(Buffer.concat([G,D]))},close(){W=!0,X.destroy()}}}class i8{run=null;viewers=new Set;get running(){return this.run!==null}start(q,x,X,Q){this.viewers.add(q),this.stop();let P;try{P=X()}catch{this.fail();return}tq(P);let b={child:P,splitter:new X0};this.run=b;for(let y of[...this.viewers])y.started(x);P.stdout?.on("data",(y)=>{if(this.run!==b)return;for(let C of b.splitter.push(y,Q()))for(let W of[...this.viewers])W.unit(C)});let J=()=>{if(this.run!==b)return;this.run=null,this.fail()};P.once("exit",J),P.once("error",J)}leave(q){if(!this.viewers.delete(q))return;if(this.viewers.size===0)this.stop()}stop(){if(!this.run)return;eq(this.run.child),this.run=null}fail(){for(let q of[...this.viewers])q.failed()}}var mq=new WeakMap;function ix(q){let x=mq.get(q);if(!x)mq.set(q,x=new i8);return x}function Q0(q,x,X={}){let Q=X.micros??cx,P=new sq,b=x.request.preset,J=null,y=null,C=null,W=!1,j=null,R=!1,Z=!1,B=null,Y=0,w=0,N=!1,D=null,G=null,F=0,O=null,z=[],i=0,A=[],f=new Uint32Array(l8+1),I=0,C8=null,S8=0,n=0,Z8=0,qq=0,xq=0,X8=null,A8=0,u={frames:0,bytes:0,since:Q()},c=[],o=0,G8,F8=!1,C0=Q(),E={},l=()=>Math.round((Q()-C0)/1000),Xq=X.control??$q,w8=null,V8=null,$=(L)=>{let U=T8(L);return q.send(U),qq+=U.byteLength,U.byteLength},Q8=(L)=>{if(q.done)return;if(q.open)$({type:"error",code:L});q.end({reason:L})},P8=()=>Math.max(Ox,a[b].kbps*1000/8*$x),b8=()=>Q()/1000,S0=()=>{while(A.length>1&&A[0].atMs<b8()-fx)A.shift();return A[0]?.rttMs??null},Qq=(L)=>{let U=S0();if(U===null||z.length===0)return!1;let T=(U+Hx)*L;return b8()-z[0].sentMs>T||i>T/1000*a[b].kbps*1000/8},Z0=(L)=>{if(F===0)return;let U=Math.min(L,F-1);if(O!==null&&U<=O)return;O=U;let T=b8();while(z.length&&z[0].seq<=U){let V=z.shift();if(i-=V.bytes,V.seq!==U)continue;let K=Math.max(0,T-V.sentMs);while(A.length&&A.at(-1).rttMs>=K)A.pop();A.push({atMs:T,rttMs:K}),f[Math.min(l8,Math.round(K))]++,I++,C8=Math.min(C8??K,K)}},A0=()=>{let L=0;for(let U=0;U<=l8;U++)if(L+=f[U],L*2>=I)return U;return 0},G0=()=>q.bufferedAmount<=P8()/2&&!Qq(0.5),Pq=()=>{F8=!0,c=[],o=0,j?.leave(K8),j=null},bq=(L)=>{if(q.done)return;if(L.key)E.first_key_ms??=l();if(!W){if(!j||c.length===0&&!L.key)return;if(c.push(L),o+=L.data.byteLength,o>P8())Pq();return}if(N){n++;return}if(q.bufferedAmount>P8()||Qq(1)){N=!0,n++,D=setInterval(()=>{if(q.done||!G0())return;if(D)clearInterval(D);D=null,N=!1,Y8()},X.drainPollMs??25);return}if(!R){if(!L.key){n++;return}if($({type:"hello",width:y.width,height:y.height,fps:a[b].fps,preset:b,codec:Ex}),R=!0,E.first_frame_ms??=l(),!Z&&J?.sound)$({type:"audioHello",...x8}),Z=!0}let U=$({type:"frame",key:L.key,seq:F,captureMicros:L.micros,data:L.data});if(z.push({seq:F,sentMs:b8(),bytes:U}),i+=U,z.length>hx)i-=z.shift().bytes;F++,S8++,X8??=L.micros,A8=L.micros,u.frames++,u.bytes+=U},K8={started(L){b=L,R=!1,c=[],o=0},unit:bq,failed:()=>Q8("encoder_failed")},M8=()=>{let L=(X.ffmpeg??uq)();if(!J||!y){Q8("encoder_failed");return}let[U,T]=[J,y],V="kind"in U&&U.kind==="simulator"?U.stream:null;if(!L&&!V){Q8("encoder_failed");return}if(j??="kind"in U&&U.kind==="mac_screen"?ix(X.spawn??cq):new i8,E.encoder_ms===void 0)E.encoder_ms=l(),E.encoder_shared=j.running;j.start(K8,b,()=>{let K=a[b].fps;if(V)return V(K,a[b].kbps,q0);if("kind"in U&&U.kind==="simulator"){let h=Math.min(0.99,x0(U.size)),t={width:U.size.width*h,height:U.size.height*h};return dx(L,m8(b,mx(Math.min(K,30)),t,(X.macEncoder??lq)()),U)}return"kind"in U?(X.spawn??cq)(L,m8(b,rx(K),ax(T),(X.macEncoder??lq)()),{}):(X.spawn??a8)(L,m8(b,lx(K,T,U.display),T),{DISPLAY:U.display,XAUTHORITY:U.xauthority})},Q)},J8=()=>{if(!B)return;eq(B.child),B=null},F0=()=>{let L=(X.ffmpeg??uq)();if(B||q.done||!Z||!J?.sound||!L)return;let U;try{U=(X.spawn??a8)(L,gq(),{PULSE_SERVER:j8(J.sound)})}catch{return}tq(U);let T={child:U,reader:new c8};B=T,U.stdout?.on("data",(K)=>{if(B!==T||q.done)return;let h;try{h=T.reader.push(K)}catch{J8();return}let t=Q();for(let w0 of h){if(q.bufferedAmount>P8()){w++;continue}$({type:"audio",captureMicros:t,data:w0}),Y++}});let V=()=>{if(B===T)J8()};U.once("exit",V),U.once("error",V)},Y8=()=>{if(!j||q.done)return;Z8++,M8()},Jq=()=>{if(q.done||!y)return;if(!W){if(j||F8)return;M8(),G8=setTimeout(()=>{if(!W)Pq()},kx);return}if(clearTimeout(G8),E.encoder_early===void 0){if(E.encoder_early=j!==null,F8)E.hold_lapsed=!0}if(!j)M8();let L=c;c=[],o=0;for(let U of L)bq(U);G??=setInterval(()=>{let U=Q(),T=Math.max(0.001,(U-u.since)/1e6);$({type:"stats",stats:{fps:Math.round(u.frames/T*10)/10,kbps:Math.round(u.bytes*8/1000/T),dropped:n,restarts:Z8,queued_bytes:q.bufferedAmount}}),u={frames:0,bytes:0,since:U}},Ix)};x.desktop.then((L)=>{if(q.done)return;J=L;let U={ready(T){y=T,E.desktop_ms??=l(),Jq()},clipboard(T){if(q.open&&Buffer.byteLength(T)<=H)$({type:"serverClipboard",text:T})},end(T){if("reason"in T&&q.open)$({type:"error",code:T.reason});q.end(T)}};if("kind"in L&&L.kind==="simulator")C=L.input,U.ready(L.points);else if("kind"in L)C=(X.macInput??((T)=>nq(T,s8())))(U);else{let T=(X.linuxClipboard??kq)(L,U),V=sx(L.rfbSocket,{...U,clipboard:(K)=>{if(!T)U.clipboard(K)}});C=T?{pointer:(K,h,t)=>T.apply(()=>V.pointer(K,h,t)),key:(K,h)=>T.apply(()=>V.key(K,h)),clipboard:(K)=>T.write(K),close(){T.close(),V.close()}}:V}Nq()},(L)=>q.end({error:L}));function Nq(){if(V8||!x.viewerSameNetwork||!W||q.done||!J||!("kind"in J)||J.kind!=="mac_screen")return;V8=(X.macWindows??iq)((L)=>{if(q.open)$({type:"windows",bounds:L})})}let Wq={viewer:x.viewer??null,notify(L){if(q.open)$({type:"control",control:L})}},z8=(L)=>{if(!C)return;if(!J||!("kind"in J)||J.kind!=="simulator")Xq.claim(Wq);L(C)};return{opened(){E.relay_ms??=l()},received(L){xq+=L.byteLength;let U;try{U=P.push(L)}catch{Q8("viewer_protocol");return}for(let T of U){if(q.done)return;switch(T.type){case"ping":$({type:"pong",token:T.token});break;case"pointer":z8((V)=>V.pointer(T.x,T.y,T.buttons));break;case"key":z8((V)=>V.key(T.down,T.keysym));break;case"clientClipboard":z8((V)=>V.clipboard(T.text));break;case"config":if(T.preset!==b)b=T.preset,Y8();break;case"keyframeRequest":if(R&&!N)Y8();break;case"ack":Z0(T.seq);break;case"audioEnable":if(T.on)F0();else J8();break;default:break}}if(!W&&!q.done){if(W=!0,E.viewer_ms=l(),x.viewer)w8=Xq.join(Wq);Jq(),Nq()}},close(){if(w8?.(),w8=null,V8?.close(),D)clearInterval(D);if(G)clearInterval(G);clearTimeout(G8),j?.leave(K8),J8(),C?.close()},summary:()=>({output_bytes:qq,input_bytes:xq,video:{preset:b,frames:S8,dropped:n,restarts:Z8,avg_fps:X8!==null&&A8>X8?Math.round((S8-1)/((A8-X8)/1e6)*10)/10:0,min_rtt_ms:Math.round(C8??0),p50_rtt_ms:I?A0():0,audio_packets:Y,audio_dropped:w,connect:E}})}}var dq=null,P0=null,nx=null;function ox(){let q=k();return q?.features.display?q.ffmpeg:null}function b0(q){return dq??=new Promise((x)=>{Yx(q,["-hide_banner","-encoders"],{env:{},timeout:5000,killSignal:"SIGKILL",maxBuffer:1048576,encoding:"utf8"},(X,Q)=>{let P=(b)=>!X&&new RegExp(`^\\s*V\\S*\\s+${b}\\s`,"m").test(Q);x(P0={x264:P("libx264"),videotoolbox:P("h264_videotoolbox")})})}),dq}var aq=null;function HX(){return aq??=(async()=>{let q=[k()?.ffmpeg,"/opt/homebrew/bin/ffmpeg","/usr/local/bin/ffmpeg"].find((X)=>Boolean(X&&zx(X)));if(!q)return null;let x=await b0(q);return x.videotoolbox||x.x264?q:null})(),aq}function J0(q=process.platform,x={}){if(q!=="linux"&&q!=="darwin")return Promise.resolve(!1);let X=(x.ffmpeg??ox)();if(!X)return Promise.resolve(!1);let Q=(x.encoders??b0)(X);if(q==="linux")return Q.then((b)=>b.x264);let P=x.macScreen?x.macScreen():nx??=$8(s8());return Promise.all([Q,P]).then(([b,J])=>(b.x264||b.videotoolbox)&&J?.screen===!0&&J.accessibility)}var J1=43200000,B8=":99",N1=60000,R8=15000,t8={width:1280,height:800},W1=/^[A-Za-z0-9._:-]{1,160}$/;function U1(q){return Boolean(q)&&typeof q==="object"&&!Array.isArray(q)}var L1=["video","viewer","viewer_same_network","viewer_network"];function y1(q,x=Date.now()){let X=["relay_url","session_id","expires_at"];if(!U1(q)||X.some((y)=>!(y in q))||Object.keys(q).some((y)=>!X.includes(y)&&!L1.includes(y)))throw new M("invalid_display_request","Reason desktop request is malformed.");let Q="video"in q?y0(q.video):void 0,P="viewer"in q?L0(q.viewer):null;if(Q===null)throw new M("invalid_display_request","Reason desktop video request is invalid.");let b=null;try{b=typeof q.relay_url==="string"?new URL(q.relay_url):null}catch{}if(!b||b.protocol!=="wss:"&&b.protocol!=="ws:"||b.username||b.password)throw new M("invalid_display_request","Reason desktop relay URL is invalid.");if(typeof q.session_id!=="string"||!W1.test(q.session_id))throw new M("invalid_display_request","Reason desktop session identity is invalid.");let J=typeof q.expires_at==="string"?Date.parse(q.expires_at):Number.NaN;if(!Number.isFinite(J)||J<=x)throw new M("invalid_display_request","Reason desktop session has already expired.");return{relay_url:q.relay_url,session_id:q.session_id,expires_at:new Date(Math.min(J,x+J1)).toISOString(),...Q?{video:Q}:{},...P?{viewer:P}:{},...Q&&q.viewer_same_network===!0?{viewer_same_network:!0}:{}}}function j1(q=process.platform){return(q==="linux"||q==="darwin")&&k()?.features.display===!0}async function nX(){if(process.platform!=="darwin")return j1();return await J0()}function D8(q){X1(q,{recursive:!0,mode:448});let x=x1(q);if(!x.isDirectory()||x.isSymbolicLink()||process.getuid&&x.uid!==process.getuid())throw new M("display_unavailable","Reason desktop state directory is not private.");q1(q,448)}function T1(q,x){let X=(P)=>{let b=Buffer.alloc(2);return b.writeUInt16BE(P.length),Buffer.concat([b,P])},Q=Buffer.from([255,255]);return Buffer.concat([Q,X(Buffer.alloc(0)),X(Buffer.from(q)),X(Buffer.from("MIT-MAGIC-COOKIE-1")),X(x)])}function s(q,x,X=2000){return new Promise((Q)=>{let P=b1(q),b="",J=(y)=>{P.destroy(),Q(y)};P.setTimeout(X,()=>J(!1)),P.once("error",()=>J(!1)),P.once("close",()=>J(!1)),P.once("connect",()=>{if(!x)J(!0)}),P.on("data",(y)=>{if(b+=y.toString("latin1"),b.length>=4)J(b.startsWith("RFB "))})})}async function D0(q,x){let X=Date.now()+x;while(Date.now()<X){if(await q())return!0;await new Promise((Q)=>setTimeout(Q,100))}return!1}function e8(q,x,X){return new Promise((Q)=>{let P=T0(q,x,{detached:!0,stdio:"ignore",env:X});P.once("error",()=>Q(-1)),P.once("exit",(b)=>Q(b)),P.unref(),setTimeout(()=>Q(null),R8).unref()})}var n8=null;function B1(q=d()){return n8??=D1(q).finally(()=>{n8=null}),n8}async function D1(q){let x=k({home:q});if(!x?.xvfb||!x.x11vnc||!x.openbox)throw new M("display_unavailable","Run `reason desktop install` on this machine to enable its desktop.");W0({root:x.root,automation:x.automation,extensionDir:x.extensionDir});let X=_(x.root,"display");D8(X);let Q=await C1(q,X,x.x11vnc);if(Q)return Q;let P={display:B8,xauthority:_(X,"Xauthority"),rfbSocket:_(X,"rfb.sock")},b=_(X,"pulse"),J=(async()=>{try{D8(b)}catch{return null}return await hq(b,x.pulseaudio)})(),y=_(X,"home");D8(y);let C={HOME:y,PATH:"/usr/local/bin:/usr/bin:/bin",DISPLAY:P.display,XAUTHORITY:P.xauthority};if(x.pulseaudio)C.PULSE_SERVER=j8(u8(b));let W=async()=>({...P,sound:await J});if(await s({path:P.rfbSocket},!0))return await W();if(!B0(P.xauthority))o8(P.xauthority,T1(B8.slice(1),ex(16)),{mode:384,flag:"wx"});let j=S1(_(X,"theme"),P.display),R={path:`/tmp/.X11-unix/X${B8.slice(1)}`};if(!await s(R,!1)){if(e8(x.xvfb,[P.display,"-screen","0",`${t8.width}x${t8.height}x24`,"-nolisten","tcp","-auth",P.xauthority],C),!await D0(()=>s(R,!1),R8))throw new M("display_unavailable","Reason could not start the virtual display.");e8(x.openbox,["--config-file",j.openboxConfig],C)}if(await Z1(j,C),!await R0(x.x11vnc,P,X,"x11vnc.log",C))throw new M("display_unavailable","Reason could not start the desktop server.");return await W()}async function R0(q,x,X,Q,P){if(await s({path:x.rfbSocket},!0))return!0;P1(x.rfbSocket,{force:!0});let b=await e8(q,["-display",x.display,"-auth",x.xauthority,"-rfbport","0","-rfbportv6","-1","-unixsock",x.rfbSocket,"-nopw","-forever","-shared","-noxdamage","-sb","0","-rfbversion","3.7","-quiet","-bg","-o",_(X,Q)],P);if(b!==null&&b!==0)return!1;return await D0(()=>s({path:x.rfbSocket},!0),R8)}async function R1(){let q=["DISPLAY","XAUTHORITY","WAYLAND_DISPLAY","XDG_SESSION_TYPE"],x=(X)=>Object.fromEntries(q.flatMap((Q)=>X[Q]?[[Q,X[Q]]]:[]));if(process.env.DISPLAY)return x(process.env);try{let X=await new Promise((Q,P)=>tx("systemctl",["--user","show-environment"],{encoding:"utf8",timeout:2000},(b,J)=>b?P(b):Q(J)));return x(Object.fromEntries(X.split(`
|
|
178
|
-
`).flatMap((Q)=>{let P=Q.indexOf("=");return P>0?[[Q.slice(0,P),Q.slice(P+1)]]:[]})))}catch{return{}}}var N0=new Set;async function C1(q,x,X){let Q=await R1(),P=/^:(\d+)(?:\.\d+)?$/.exec(Q.DISPLAY??"")?.[1];if(!P||`:${P}`===B8||Q.WAYLAND_DISPLAY||Q.XDG_SESSION_TYPE==="wayland")return null;let b={display:`:${P}`,xauthority:Q.XAUTHORITY??_(q,".Xauthority"),rfbSocket:_(x,`rfb-${P}.sock`)},J=`${b.display} ${b.xauthority}`;if(N0.has(J)||!await s({path:`/tmp/.X11-unix/X${P}`},!1))return null;let y={HOME:q,PATH:"/usr/local/bin:/usr/bin:/bin",DISPLAY:b.display,XAUTHORITY:b.xauthority};if(await R0(X,b,x,`x11vnc-${P}.log`,y))return{...b,sound:null};return N0.add(J),process.stderr.write(`Reason worker: your screen ${b.display} could not be served; using the virtual desktop
|
|
179
|
-
`),null}function S1(q,x){let X=`chromium --no-first-run --no-default-browser-check${process.geteuid?.()===0?" --no-sandbox":""} %U`,Q=[["terminal","xterm"],["files","pcmanfm"]].filter(([,b])=>!B0(`/usr/bin/${b}`)).map(([b])=>b),P=Rq({root:q,display:x,screen:t8,browserExec:X,absent:Q});for(let b of["","openbox","tint2","picom"])D8(_(q,b));for(let[b,J]of Object.entries(P.files))o8(_(q,b),J,{mode:384});for(let[b,J]of Object.entries(Dq))o8(_(q,`ara-${b}`),Q1(J),{mode:384});return{root:q,openboxConfig:_(q,"openbox","rc.xml"),start:P.start}}async function Z1(q,x){let X=[`ROOT=${JSON.stringify(q.root)}`,...q.start,"openbox --reconfigure >/dev/null 2>&1 || true"].join(`
|
|
180
|
-
`);await new Promise((Q)=>{let P=T0("/bin/sh",["-c",X],{stdio:"ignore",env:{...x,PATH:"/usr/bin:/bin"}}),b=setTimeout(()=>{P.kill(),Q()},R8);P.once("error",()=>{clearTimeout(b),Q()}),P.once("exit",()=>{clearTimeout(b),Q()})})}async function oX(q,x={}){let X=x.now??Date.now,Q=y1(q.payload,X());if(q.signal.throwIfAborted(),!Q.video)throw new M("display_video_required","Reason desktops stream as video now; this request came without it.");let P=x.platform??process.platform;if(P!=="linux"&&P!=="darwin")throw new M("display_video_unsupported","This machine does not serve desktop video.");let b=Q.video,J=(x.video?.desktop??(P==="darwin"?async()=>oq:B1))();return await A1(q.signal,Q,x,X,(y)=>Q0(y,{request:b,desktop:J,...Q.viewer?{viewer:Q.viewer}:{},viewerSameNetwork:Q.viewer_same_network===!0},x.video),(y)=>T8({type:"error",code:y}))}function A1(q,x,X,Q,P,b){let J=Q();return new Promise((y,C)=>{let W=null,j=!1,R=!1,Z,B,Y,w=!1,N=null,D=(A)=>{if(R)return;if(N)A=N;R=!0,clearTimeout(Z),clearTimeout(B),q.removeEventListener("abort",F),Y?.close();try{W?.close(1000,"display_session_over")}catch{}if("error"in A){C(A.error);return}y({reason:A.reason,...Y?.summary(),duration_ms:Math.max(0,Q()-J)})},G=()=>D({error:new M("display_relay_unavailable","Reason could not reach the desktop relay.")}),F=()=>{let A=q.reason;D({error:A instanceof M?A:new M("cancelled","Reason closed the desktop session.")})},O=()=>{if(!N||!W)return;let A=N.error;try{W.send(b(A instanceof M?A.code:"display_unavailable"))}catch{}D(N)};if(Y=P({get done(){return R||N!==null},get open(){return j&&!R&&N===null},get bufferedAmount(){return W?.bufferedAmount??0},send(A){if(R||N||!j||!W)return;try{W.send(A)}catch{D({reason:"relay_closed"})}},end:(A)=>{if(R||N)return;if(!("error"in A)){D(A);return}if(N=A,w&&j)O()}}),R){Y.close();return}if(q.aborted){F();return}q.addEventListener("abort",F,{once:!0}),Z=setTimeout(()=>D({reason:"session_expired"}),Math.max(1,Date.parse(x.expires_at)-Q())),B=setTimeout(()=>D({reason:"viewer_absent"}),X.viewerWaitMs??N1);try{W=(X.connect??j0)(x.relay_url,(X.loadProxy??U0)()?.url)}catch{G();return}W.binaryType="arraybuffer",W.onopen=()=>{if(R||!W)return;j=!0,Y?.opened()},W.onmessage=(A)=>{if(R)return;let f=A.data,I=f instanceof ArrayBuffer?new Uint8Array(f):ArrayBuffer.isView(f)?new Uint8Array(f.buffer,f.byteOffset,f.byteLength):null;if(!I||I.byteLength===0)return;if(clearTimeout(B),w=!0,N){O();return}Y?.received(I)},W.onclose=()=>{if(R)return;if(!j){G();return}D({reason:"relay_closed"})},W.onerror=()=>{if(R||j)return;G()}})}
|
|
181
|
-
export{_8 as Gf,f1 as Hf,p1 as If,r as Jf,j8 as Kf,HX as Lf,J0 as Mf,Cq as Nf,zq as Of,k as Pf,UX as Qf,LX as Rf,yX as Sf,J1 as Tf,B8 as Uf,y1 as Vf,j1 as Wf,nX as Xf,D8 as Yf,B1 as Zf,oX as _f};
|