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.
Files changed (88) hide show
  1. package/README.md +97 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.js +5233 -0
  4. package/dist-selfhost/_headers +21 -0
  5. package/dist-selfhost/app.html +14 -0
  6. package/dist-selfhost/assets/app-Bl36gHTK.css +1 -0
  7. package/dist-selfhost/assets/app-C7_LGm0t.js +4733 -0
  8. package/dist-selfhost/assets/dm-serif-display-latin-400-italic-BgxzcTJK.woff +0 -0
  9. package/dist-selfhost/assets/dm-serif-display-latin-400-italic-DpcbibHm.woff2 +0 -0
  10. package/dist-selfhost/assets/dm-serif-display-latin-ext-400-italic-D6UvgSoX.woff +0 -0
  11. package/dist-selfhost/assets/dm-serif-display-latin-ext-400-italic-DiLdooSn.woff2 +0 -0
  12. package/dist-selfhost/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff +0 -0
  13. package/dist-selfhost/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2 +0 -0
  14. package/dist-selfhost/assets/geist-mono-cyrillic-500-normal-CJBLNVQT.woff2 +0 -0
  15. package/dist-selfhost/assets/geist-mono-cyrillic-500-normal-mNhfPmgl.woff +0 -0
  16. package/dist-selfhost/assets/geist-mono-cyrillic-600-normal-CGND36d7.woff2 +0 -0
  17. package/dist-selfhost/assets/geist-mono-cyrillic-600-normal-DrylrLu6.woff +0 -0
  18. package/dist-selfhost/assets/geist-mono-latin-400-normal-CoULgQGM.woff +0 -0
  19. package/dist-selfhost/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 +0 -0
  20. package/dist-selfhost/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2 +0 -0
  21. package/dist-selfhost/assets/geist-mono-latin-500-normal-DOxI7kZ4.woff +0 -0
  22. package/dist-selfhost/assets/geist-mono-latin-600-normal-DQQBcVN0.woff2 +0 -0
  23. package/dist-selfhost/assets/geist-mono-latin-600-normal-DsVeri3b.woff +0 -0
  24. package/dist-selfhost/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2 +0 -0
  25. package/dist-selfhost/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff +0 -0
  26. package/dist-selfhost/assets/geist-mono-latin-ext-500-normal-CQcGuCNt.woff2 +0 -0
  27. package/dist-selfhost/assets/geist-mono-latin-ext-500-normal-diTenJ8L.woff +0 -0
  28. package/dist-selfhost/assets/geist-mono-latin-ext-600-normal-CJwYYto2.woff2 +0 -0
  29. package/dist-selfhost/assets/geist-mono-latin-ext-600-normal-EvIRCXgu.woff +0 -0
  30. package/dist-selfhost/assets/images/logo.svg +4 -0
  31. package/dist-selfhost/assets/inter-cyrillic-300-normal-BnqRxXuy.woff2 +0 -0
  32. package/dist-selfhost/assets/inter-cyrillic-300-normal-LR1W_oT8.woff +0 -0
  33. package/dist-selfhost/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  34. package/dist-selfhost/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  35. package/dist-selfhost/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
  36. package/dist-selfhost/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
  37. package/dist-selfhost/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
  38. package/dist-selfhost/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
  39. package/dist-selfhost/assets/inter-cyrillic-ext-300-normal-CgCALhwJ.woff2 +0 -0
  40. package/dist-selfhost/assets/inter-cyrillic-ext-300-normal-RId2JxDB.woff +0 -0
  41. package/dist-selfhost/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  42. package/dist-selfhost/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  43. package/dist-selfhost/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
  44. package/dist-selfhost/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
  45. package/dist-selfhost/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
  46. package/dist-selfhost/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
  47. package/dist-selfhost/assets/inter-greek-300-normal-BrhSP0vQ.woff +0 -0
  48. package/dist-selfhost/assets/inter-greek-300-normal-DmGD3g_f.woff2 +0 -0
  49. package/dist-selfhost/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  50. package/dist-selfhost/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  51. package/dist-selfhost/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
  52. package/dist-selfhost/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
  53. package/dist-selfhost/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
  54. package/dist-selfhost/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
  55. package/dist-selfhost/assets/inter-greek-ext-300-normal-DLbbeei1.woff +0 -0
  56. package/dist-selfhost/assets/inter-greek-ext-300-normal-l2DDyC6M.woff2 +0 -0
  57. package/dist-selfhost/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  58. package/dist-selfhost/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  59. package/dist-selfhost/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
  60. package/dist-selfhost/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
  61. package/dist-selfhost/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
  62. package/dist-selfhost/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
  63. package/dist-selfhost/assets/inter-latin-300-normal-BVlfKGgI.woff2 +0 -0
  64. package/dist-selfhost/assets/inter-latin-300-normal-i8F0SvXL.woff +0 -0
  65. package/dist-selfhost/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  66. package/dist-selfhost/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  67. package/dist-selfhost/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  68. package/dist-selfhost/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  69. package/dist-selfhost/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  70. package/dist-selfhost/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  71. package/dist-selfhost/assets/inter-latin-ext-300-normal-CPgO9Ksf.woff2 +0 -0
  72. package/dist-selfhost/assets/inter-latin-ext-300-normal-Dp1L8vcn.woff +0 -0
  73. package/dist-selfhost/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  74. package/dist-selfhost/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  75. package/dist-selfhost/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
  76. package/dist-selfhost/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
  77. package/dist-selfhost/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
  78. package/dist-selfhost/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
  79. package/dist-selfhost/assets/inter-vietnamese-300-normal-Bdr24Bqb.woff2 +0 -0
  80. package/dist-selfhost/assets/inter-vietnamese-300-normal-DDGmYYdT.woff +0 -0
  81. package/dist-selfhost/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  82. package/dist-selfhost/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  83. package/dist-selfhost/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  84. package/dist-selfhost/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
  85. package/dist-selfhost/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
  86. package/dist-selfhost/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  87. package/openclaw.plugin.json +10 -0
  88. 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
+ ```
@@ -0,0 +1,3 @@
1
+ declare function squadSelfhostWebPlugin(api: any): void;
2
+
3
+ export { squadSelfhostWebPlugin as default };