squad-selfhost-web 0.1.0
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 +97 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +5233 -0
- package/dist-selfhost/_headers +21 -0
- package/dist-selfhost/app.html +14 -0
- package/dist-selfhost/assets/app-Bl36gHTK.css +1 -0
- package/dist-selfhost/assets/app-C7_LGm0t.js +4733 -0
- package/dist-selfhost/assets/dm-serif-display-latin-400-italic-BgxzcTJK.woff +0 -0
- package/dist-selfhost/assets/dm-serif-display-latin-400-italic-DpcbibHm.woff2 +0 -0
- package/dist-selfhost/assets/dm-serif-display-latin-ext-400-italic-D6UvgSoX.woff +0 -0
- package/dist-selfhost/assets/dm-serif-display-latin-ext-400-italic-DiLdooSn.woff2 +0 -0
- package/dist-selfhost/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff +0 -0
- package/dist-selfhost/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2 +0 -0
- package/dist-selfhost/assets/geist-mono-cyrillic-500-normal-CJBLNVQT.woff2 +0 -0
- package/dist-selfhost/assets/geist-mono-cyrillic-500-normal-mNhfPmgl.woff +0 -0
- package/dist-selfhost/assets/geist-mono-cyrillic-600-normal-CGND36d7.woff2 +0 -0
- package/dist-selfhost/assets/geist-mono-cyrillic-600-normal-DrylrLu6.woff +0 -0
- package/dist-selfhost/assets/geist-mono-latin-400-normal-CoULgQGM.woff +0 -0
- package/dist-selfhost/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 +0 -0
- package/dist-selfhost/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2 +0 -0
- package/dist-selfhost/assets/geist-mono-latin-500-normal-DOxI7kZ4.woff +0 -0
- package/dist-selfhost/assets/geist-mono-latin-600-normal-DQQBcVN0.woff2 +0 -0
- package/dist-selfhost/assets/geist-mono-latin-600-normal-DsVeri3b.woff +0 -0
- package/dist-selfhost/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2 +0 -0
- package/dist-selfhost/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff +0 -0
- package/dist-selfhost/assets/geist-mono-latin-ext-500-normal-CQcGuCNt.woff2 +0 -0
- package/dist-selfhost/assets/geist-mono-latin-ext-500-normal-diTenJ8L.woff +0 -0
- package/dist-selfhost/assets/geist-mono-latin-ext-600-normal-CJwYYto2.woff2 +0 -0
- package/dist-selfhost/assets/geist-mono-latin-ext-600-normal-EvIRCXgu.woff +0 -0
- package/dist-selfhost/assets/images/logo.svg +4 -0
- package/dist-selfhost/assets/inter-cyrillic-300-normal-BnqRxXuy.woff2 +0 -0
- package/dist-selfhost/assets/inter-cyrillic-300-normal-LR1W_oT8.woff +0 -0
- package/dist-selfhost/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
- package/dist-selfhost/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
- package/dist-selfhost/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
- package/dist-selfhost/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
- package/dist-selfhost/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
- package/dist-selfhost/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
- package/dist-selfhost/assets/inter-cyrillic-ext-300-normal-CgCALhwJ.woff2 +0 -0
- package/dist-selfhost/assets/inter-cyrillic-ext-300-normal-RId2JxDB.woff +0 -0
- package/dist-selfhost/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
- package/dist-selfhost/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
- package/dist-selfhost/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
- package/dist-selfhost/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
- package/dist-selfhost/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
- package/dist-selfhost/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
- package/dist-selfhost/assets/inter-greek-300-normal-BrhSP0vQ.woff +0 -0
- package/dist-selfhost/assets/inter-greek-300-normal-DmGD3g_f.woff2 +0 -0
- package/dist-selfhost/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
- package/dist-selfhost/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
- package/dist-selfhost/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
- package/dist-selfhost/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
- package/dist-selfhost/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
- package/dist-selfhost/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
- package/dist-selfhost/assets/inter-greek-ext-300-normal-DLbbeei1.woff +0 -0
- package/dist-selfhost/assets/inter-greek-ext-300-normal-l2DDyC6M.woff2 +0 -0
- package/dist-selfhost/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
- package/dist-selfhost/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
- package/dist-selfhost/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
- package/dist-selfhost/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
- package/dist-selfhost/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
- package/dist-selfhost/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
- package/dist-selfhost/assets/inter-latin-300-normal-BVlfKGgI.woff2 +0 -0
- package/dist-selfhost/assets/inter-latin-300-normal-i8F0SvXL.woff +0 -0
- package/dist-selfhost/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
- package/dist-selfhost/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
- package/dist-selfhost/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
- package/dist-selfhost/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
- package/dist-selfhost/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
- package/dist-selfhost/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
- package/dist-selfhost/assets/inter-latin-ext-300-normal-CPgO9Ksf.woff2 +0 -0
- package/dist-selfhost/assets/inter-latin-ext-300-normal-Dp1L8vcn.woff +0 -0
- package/dist-selfhost/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
- package/dist-selfhost/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
- package/dist-selfhost/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
- package/dist-selfhost/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
- package/dist-selfhost/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
- package/dist-selfhost/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
- package/dist-selfhost/assets/inter-vietnamese-300-normal-Bdr24Bqb.woff2 +0 -0
- package/dist-selfhost/assets/inter-vietnamese-300-normal-DDGmYYdT.woff +0 -0
- package/dist-selfhost/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
- package/dist-selfhost/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
- package/dist-selfhost/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
- package/dist-selfhost/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
- package/dist-selfhost/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
- package/dist-selfhost/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
- package/openclaw.plugin.json +10 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# squad-selfhost-web
|
|
2
|
+
|
|
3
|
+
Self-host adapter plugin that mounts Squad as a parallel OpenClaw control UI.
|
|
4
|
+
|
|
5
|
+
- UI mount path: `/squad`
|
|
6
|
+
- Internal API: `/squad-internal/*`
|
|
7
|
+
- Coexists with OpenClaw Control UI at its configured base path
|
|
8
|
+
|
|
9
|
+
## Security model
|
|
10
|
+
|
|
11
|
+
In self-host mode, Squad runs entirely on the user's server and browser origin.
|
|
12
|
+
|
|
13
|
+
- No bridge flow
|
|
14
|
+
- No relay flow
|
|
15
|
+
- No outbound connection to Squad cloud services
|
|
16
|
+
|
|
17
|
+
### Isolation guarantee
|
|
18
|
+
|
|
19
|
+
The web bundle is mounted and executed inside the OpenClaw server context. The browser talks
|
|
20
|
+
only to same-origin internal endpoints (`/squad-internal/*`). There is no connection to
|
|
21
|
+
external control planes for runtime operations.
|
|
22
|
+
|
|
23
|
+
## External request policy (explicit)
|
|
24
|
+
|
|
25
|
+
By design, the self-hosted bundle is isolated. It only performs external requests in two
|
|
26
|
+
explicitly user-triggered cases:
|
|
27
|
+
|
|
28
|
+
1. License validation/check via Lemon Squeezy
|
|
29
|
+
- Host: `api.lemonsqueezy.com`
|
|
30
|
+
2. Bundle/plugin version check via npm registry
|
|
31
|
+
- Host: `registry.npmjs.org`
|
|
32
|
+
|
|
33
|
+
Outside those two user-triggered actions, runtime operations stay internal to your server and
|
|
34
|
+
same-origin browser session.
|
|
35
|
+
|
|
36
|
+
## Self-verification (SSH / server level)
|
|
37
|
+
|
|
38
|
+
If you want to verify isolation yourself, run these checks on the host where OpenClaw is running.
|
|
39
|
+
|
|
40
|
+
### 1) Identify the OpenClaw gateway process
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
ps aux | grep -E "openclaw|gateway|node" | grep -v grep
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Pick the PID of the active gateway process.
|
|
47
|
+
|
|
48
|
+
### 2) Inspect established outbound sockets for that PID
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
PID=<gateway_pid>
|
|
52
|
+
sudo lsof -nP -a -p "$PID" -iTCP -sTCP:ESTABLISHED
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Live watch:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
watch -n 1 'sudo lsof -nP -a -p '"$PID"' -iTCP -sTCP:ESTABLISHED'
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Expected behavior:
|
|
62
|
+
- During normal in-app operations: no external hosts required
|
|
63
|
+
- When user explicitly triggers license/version checks: connections may appear to:
|
|
64
|
+
- `api.lemonsqueezy.com`
|
|
65
|
+
- `registry.npmjs.org`
|
|
66
|
+
|
|
67
|
+
### 3) Trace new connect syscalls from that PID (Linux, if `bpftrace` is available)
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
PID=<gateway_pid>
|
|
71
|
+
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_connect /pid == '$PID'/ { printf("connect pid=%d comm=%s\\n", pid, comm); }'
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
This confirms when the process initiates outbound connections in real time.
|
|
75
|
+
|
|
76
|
+
### 4) Optional packet-level check
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
sudo tcpdump -i any -nn host api.lemonsqueezy.com or host registry.npmjs.org
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Run this while triggering each explicit action to confirm only expected external egress.
|
|
83
|
+
|
|
84
|
+
## About "path-level" isolation checks
|
|
85
|
+
|
|
86
|
+
At OS network level, egress is process/socket based, not HTTP-route based. That means you cannot
|
|
87
|
+
reliably filter outbound traffic by `/squad` path in kernel tools alone. The practical approach is:
|
|
88
|
+
|
|
89
|
+
1. Correlate inbound `/squad` usage via gateway/web logs.
|
|
90
|
+
2. Correlate outbound sockets/connect events by gateway PID (commands above).
|
|
91
|
+
3. Validate that outbound destinations match only the two approved hosts when user-triggered.
|
|
92
|
+
|
|
93
|
+
## Install
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
openclaw plugins install squad-selfhost-web
|
|
97
|
+
```
|
package/dist/index.d.ts
ADDED