-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcomponents.json
More file actions
162 lines (162 loc) · 7.71 KB
/
Copy pathcomponents.json
File metadata and controls
162 lines (162 loc) · 7.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
{
"$schema": "./components.schema.json",
"version": 1,
"components": [
{
"slug": "claude-code",
"kind": "runtime",
"title": "Claude Code",
"description": "The Claude Code agentic CLI — the default agent runtime (installed on every agent).",
"requires": []
},
{
"slug": "claude-code-router",
"kind": "runtime",
"title": "Claude Code Router",
"description": "Local CCR proxy on 127.0.0.1:3456 that routes Claude Code to the provider configured in the CCR app row. Requires Claude Code.",
"requires": ["claude-code"],
"chip": { "label": "Router", "live": false }
},
{
"slug": "chrome",
"kind": "runtime",
"title": "Google Chrome",
"description": "Chrome browser (required by the SideButton extension and Claude-native browsing).",
"requires": [],
"chip": { "label": "Chrome", "live": true, "processKey": "chrome" }
},
{
"slug": "sidebutton-server",
"kind": "runtime",
"title": "SideButton MCP server",
"description": "MCP server on :9876. Unlocks dispatch from the portal and agent capabilities (roles). Without it the agent is RDP/manual only and not dispatchable.",
"requires": [],
"unlocks": ["dispatch", "capabilities"],
"chip": { "label": "SB server", "live": true, "processKey": "sidebutton", "versionKey": "sidebutton" }
},
{
"slug": "sidebutton-extension",
"kind": "runtime",
"title": "SideButton Chrome extension",
"description": "Force-installs the SideButton extension via Chrome managed policy and waits for the browser_connected handshake.",
"requires": ["chrome", "sidebutton-server"],
"chip": { "label": "Extension", "live": true, "processKey": "extension" }
},
{
"slug": "knowledge-packs",
"kind": "packs",
"title": "Knowledge packs",
"description": "Universal 'agents' ops pack (dispatch ops workflows) + the per-account knowledge-pack registry and its update timer.",
"requires": ["sidebutton-server"],
"chip": { "label": "Knowledge packs", "live": false }
},
{
"slug": "dotnet9",
"kind": "toolchain",
"title": ".NET 9 SDK",
"description": ".NET 9 SDK + ASP.NET runtime (build/run/test .NET projects).",
"requires": [],
"chip": { "label": ".NET 9", "live": false }
},
{
"slug": "elixir",
"kind": "toolchain",
"title": "Elixir / Erlang OTP",
"description": "Erlang/OTP 28 + Elixir 1.20 via mise, pre-baked at provision time so no job pays a cold toolchain cost (mix, ExUnit, mix format, IEx; Hex + rebar3 bootstrapped). A repo's .tool-versions still overrides the pre-baked pair. Phoenix test suites need a REAL Postgres server — pair this with the Docker component; postgres-client alone is not enough. Prefer a Medium or larger machine with generous disk: deps/ + _build/ run 1–3 GB per app, plus Dialyzer PLT caches.",
"requires": [],
"chip": { "label": "Elixir", "live": false }
},
{
"slug": "android-sdk",
"kind": "toolchain",
"title": "Android SDK",
"description": "OpenJDK 17 + Android SDK cmdline-tools, platform 36 & build-tools with licenses pre-accepted (headless Gradle build/lint/unit-test). No emulator — add the Android Emulator component for on-device runs. Prefer a Medium or larger machine.",
"requires": [],
"chip": { "label": "Android SDK", "live": false }
},
{
"slug": "android-emulator",
"kind": "toolchain",
"title": "Android Emulator",
"description": "Android Emulator + a headless AVD (sb-default, API 36 x86_64) driven via adb/uiautomator for on-device UI discovery and testing. Boots on demand via sb-avd-start — nothing runs at boot. Needs KVM (/dev/kvm): AWS 8th-gen Intel types (m8i/c8i — the portal's XL tier) declare nested-virtualization support; NO Hetzner Cloud type has it (live-probed 2026-07-21, dedicated CCX included). sb-avd-start refuses without it; the wizard enforces a KVM-capable machine where the provider offers one.",
"requires": ["android-sdk"],
"chip": { "label": "Emulator", "live": false }
},
{
"slug": "docker",
"kind": "toolchain",
"title": "Docker",
"description": "Docker engine (enables container builds and Testcontainers-based test suites). Adds the agent user to the docker group.",
"requires": [],
"chip": { "label": "Docker", "live": true }
},
{
"slug": "postgres-client",
"kind": "toolchain",
"title": "PostgreSQL client",
"description": "psql command-line client for DB inspection and migration scripts.",
"requires": [],
"chip": { "label": "psql", "live": false }
},
{
"slug": "openvpn",
"kind": "toolchain",
"title": "OpenVPN client",
"description": "OpenVPN client + the sb-vpn-connect helper. Drop a .ovpn profile at /etc/sidebutton/config/openvpn/ (portal Files hub or manual SSH) and it auto-connects on boot via openvpn-client@; removing it tears the tunnel down. Break-glass: sudo sb-vpn-connect <profile.ovpn>.",
"requires": [],
"chip": { "label": "VPN", "live": false },
"config_files": [
{
"id": "ovpn-profile",
"label": "OpenVPN profile (.ovpn)",
"description": "Client profile incl. inline private key; applied via sb-vpn-connect (net_gateway-pinned so the heartbeat stays off-tunnel).",
"accept": [".ovpn"],
"secret": true,
"scope_default": "workspace",
"target_path": "/etc/sidebutton/config/openvpn/",
"multiple": true
}
]
},
{
"slug": "wireguard",
"kind": "toolchain",
"title": "WireGuard client",
"description": "WireGuard client (wireguard-tools) + the sb-wg-connect helper. Drop a .conf profile at /etc/sidebutton/config/wireguard/ (portal Files hub or manual SSH) and it auto-connects on boot via wg-quick@; removing it tears the tunnel down. Split-tunnel; no heartbeat carve-outs. Break-glass: sudo sb-wg-connect <profile.conf> [name].",
"requires": [],
"chip": { "label": "VPN", "live": false },
"config_files": [
{
"id": "wg-profile",
"label": "WireGuard profile (.conf)",
"description": "Client tunnel config incl. inline private key (+ optional preshared key); applied via sb-wg-connect. One keypair per device — prefer agent scope for concurrent agents.",
"accept": [".conf"],
"secret": true,
"scope_default": "workspace",
"target_path": "/etc/sidebutton/config/wireguard/",
"multiple": true
}
]
},
{
"slug": "rdp-client",
"kind": "toolchain",
"title": "RDP client (FreeRDP)",
"description": "FreeRDP (xfreerdp) + the sb-rdp-connect helper. Opens an outbound RDP session to a customer host (e.g. an on-prem Windows ERP with no API) and renders it as a fixed-geometry window on the agent desktop (:10) — driveable by computer-use, visible in LiveDesktop, auto-reconnecting on drop. Drop the target host + credentials at /etc/sidebutton/rdp.env (portal Files hub or manual SSH, out-of-band, never in cloud-init) and sb-rdp starts automatically.",
"requires": [],
"chip": { "label": "RDP", "live": false },
"config_files": [
{
"id": "rdp-env",
"label": "RDP connection (rdp.env)",
"description": "RDP_HOST/RDP_USER/RDP_PASS (+ optional RDP_DOMAIN/RDP_GEOMETRY/RDP_EXTRA). sb-rdp-connect idle-waits on this exact file; presence enables sb-rdp.",
"accept": [".env"],
"secret": true,
"scope_default": "workspace",
"target_path": "/etc/sidebutton/rdp.env",
"multiple": false
}
]
}
]
}