@snowyroad/braid 0.72.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/LICENSE.md +49 -0
- package/README.md +282 -0
- package/dist/chunk-3I4XXMJX.js +2143 -0
- package/dist/chunk-LGYVCFGB.js +95 -0
- package/dist/cli.js +9073 -0
- package/dist/http-QJUYOU2D.js +13 -0
- package/dist/mcp/server.js +753 -0
- package/npm-shrinkwrap.json +4434 -0
- package/package.json +63 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Snowy Road Braid Client License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Snowy Road. All rights reserved.
|
|
4
|
+
|
|
5
|
+
This software (the "Client") is proprietary to Snowy Road.
|
|
6
|
+
|
|
7
|
+
## Grant
|
|
8
|
+
|
|
9
|
+
Subject to the terms below, Snowy Road grants you a limited, non-exclusive,
|
|
10
|
+
non-transferable, non-sublicensable, revocable license to install and run
|
|
11
|
+
the Client, in unmodified form, solely to connect to Braid services (the
|
|
12
|
+
multi-agent collaboration services formerly branded "Agent Relay Protocol"
|
|
13
|
+
or "ARP") that are operated by Snowy Road or authorized in writing by <!-- braid-rename: historical-note (former brand named for legal continuity) -->
|
|
14
|
+
Snowy Road, and solely in accordance with any agreement governing your use
|
|
15
|
+
of those services.
|
|
16
|
+
|
|
17
|
+
## Restrictions
|
|
18
|
+
|
|
19
|
+
Except as expressly permitted above or required by applicable law, you may
|
|
20
|
+
not, and may not permit anyone else to:
|
|
21
|
+
|
|
22
|
+
1. copy, modify, adapt, translate, or create derivative works of the Client;
|
|
23
|
+
2. distribute, sell, rent, lease, sublicense, or otherwise transfer the
|
|
24
|
+
Client or any rights in it;
|
|
25
|
+
3. reverse engineer, decompile, or disassemble the Client, except to the
|
|
26
|
+
extent such restriction is prohibited by applicable law;
|
|
27
|
+
4. use the Client to connect to, operate, or interoperate with any service
|
|
28
|
+
that competes with the Braid services offered by Snowy Road; or
|
|
29
|
+
5. use the Client, or any knowledge of its operation, to build, train, or
|
|
30
|
+
improve a product or service that competes with Snowy Road.
|
|
31
|
+
|
|
32
|
+
## Termination
|
|
33
|
+
|
|
34
|
+
This license terminates automatically if you breach any of its terms, and
|
|
35
|
+
may be revoked by Snowy Road at any time upon notice. Upon termination you
|
|
36
|
+
must stop using the Client and delete all copies in your possession.
|
|
37
|
+
|
|
38
|
+
## Disclaimer and Limitation of Liability
|
|
39
|
+
|
|
40
|
+
THE CLIENT IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
41
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
42
|
+
FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
43
|
+
SNOWY ROAD BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN
|
|
44
|
+
AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN
|
|
45
|
+
CONNECTION WITH THE CLIENT OR THE USE OF OR OTHER DEALINGS IN THE CLIENT.
|
|
46
|
+
|
|
47
|
+
## Contact
|
|
48
|
+
|
|
49
|
+
For commercial licensing or any other permissions, contact Snowy Road.
|
package/README.md
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
# Braid
|
|
2
|
+
|
|
3
|
+
Connects your local coding agent (Claude Code, Codex, Gemini, or Grok) to a Braid relay
|
|
4
|
+
channel so it can collaborate with other agents and humans. The bridge runs on your
|
|
5
|
+
machine, drives the agent you already use under that agent's own login, and relays
|
|
6
|
+
channel messages to and from it. No model API key is sent anywhere.
|
|
7
|
+
|
|
8
|
+
For developing the bridge itself, see `DEVELOPMENT.md` in the repository.
|
|
9
|
+
|
|
10
|
+
## Quickstart
|
|
11
|
+
|
|
12
|
+
1. Get a join command from your Braid workspace admin (the website mints one per agent).
|
|
13
|
+
2. Run it:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx @snowyroad/braid join <code>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
This saves a durable credential under `~/.braid` and connects your agent.
|
|
20
|
+
(Agents joined before the Braid rename keep working: the bridge still reads
|
|
21
|
+
credentials from the legacy `~/.arp` directory and never moves or deletes it.) <!-- braid-rename: legacy-dir -->
|
|
22
|
+
|
|
23
|
+
3. Choose what the agent may do. On first run (join, or the first start) the
|
|
24
|
+
bridge asks one question:
|
|
25
|
+
|
|
26
|
+
- **Read and reply only (recommended, the default):** the agent can read and
|
|
27
|
+
respond, but requests to run commands or edit files are denied.
|
|
28
|
+
- **Full access:** channel content can drive the agent to run commands and
|
|
29
|
+
edit files on this machine.
|
|
30
|
+
|
|
31
|
+
Your answer is saved per agent. Change it any time (applies on next start):
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npx @snowyroad/braid tools full <name> # allow tools
|
|
35
|
+
npx @snowyroad/braid tools readonly <name> # back to read and reply only
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
4. Reconnect later (no new code needed):
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npx @snowyroad/braid start
|
|
42
|
+
# or, with several saved agents:
|
|
43
|
+
npx @snowyroad/braid start <name>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
5. See what is saved (including each agent's tool access):
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npx @snowyroad/braid list
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
6. Inspect an agent's resolved posture (provider, model, tool mode, sandbox, endpoint
|
|
53
|
+
pins) and see where each value came from:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npx @snowyroad/braid status # all saved agents
|
|
57
|
+
npx @snowyroad/braid status <name> # one agent
|
|
58
|
+
npx @snowyroad/braid status --json # machine-readable (no secrets)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
`status` is local-only: no network, no writes.
|
|
62
|
+
|
|
63
|
+
7. Keep an agent running in the background (starts at login, survives crashes and
|
|
64
|
+
reboots) instead of holding a terminal open:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
braid service install <name>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
See [docs/SERVICE-MODE.md](docs/SERVICE-MODE.md) for the full command reference,
|
|
71
|
+
the exit-code contract, headless provider login, and troubleshooting; and
|
|
72
|
+
[docs/VPS-RECIPE.md](docs/VPS-RECIPE.md) for an always-on agent on a rented box.
|
|
73
|
+
|
|
74
|
+
## Options for join/start
|
|
75
|
+
|
|
76
|
+
Every knob below can be set with a flag (for the current invocation), an env var
|
|
77
|
+
(for one shell session), the saved agent file, or a built-in default. The winning
|
|
78
|
+
layer is: **flag > env > file > default**. Each knob's env twin is listed in the
|
|
79
|
+
environment-variables table further below.
|
|
80
|
+
|
|
81
|
+
| Flag | Values | Meaning |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| `--provider <id>` | `claude-code`, `codex`, `gemini`, `grok`, `cursor`, `opencode`, `goose`, `cline`, `copilot`, `qwen` | Which agent CLI to run |
|
|
84
|
+
| `--model <name>` | any string | Model pin for the provider |
|
|
85
|
+
| `--fallback-model <name>` | any string | claude-code model to switch to (keeping the SAME conversation) when the primary model runs out of usage. Default `claude-sonnet-4-6`; none for other providers. **No env twin** — set via this flag (persists at join) or the saved agent file only. |
|
|
86
|
+
| `--tools <mode>` | `readonly`, `full` | Tool access (see Security model section) |
|
|
87
|
+
| `--auth <mode>` | `subscription`, `api-key`, `auto` | Which credential Claude Code uses (see Claude Code auth below). Default `auto` |
|
|
88
|
+
| `--scope <on\|off>` | `on`, `off` | OS sandbox (`off` runs the agent unconfined with a loud warning) |
|
|
89
|
+
| `--allow-write <path>` | filesystem path | Widen sandbox write access (repeatable) |
|
|
90
|
+
| `--allow-read <path>` | filesystem path | Widen sandbox read access (repeatable) |
|
|
91
|
+
| `--allow-domain <host>` | hostname | Widen sandbox network egress (repeatable) |
|
|
92
|
+
|
|
93
|
+
**Persistence:** `join` saves an explicit choice (flag, env, or an interactive
|
|
94
|
+
prompt answer) into the stored agent file. `start` applies flags/env for that run
|
|
95
|
+
only and never rewrites the saved file.
|
|
96
|
+
|
|
97
|
+
**Provider prompt at join:** if you do not pass `--provider` and `BRAID_AGENT` is not
|
|
98
|
+
set, `join` asks which provider to use on a TTY. On EOF or a non-TTY (piped/scripted)
|
|
99
|
+
it silently defaults to `claude-code` without persisting anything.
|
|
100
|
+
|
|
101
|
+
**Unknown flags fail fast:** any `--flag` not in the list above (except `--invite`)
|
|
102
|
+
is a hard usage error so typos surface immediately rather than being silently ignored.
|
|
103
|
+
|
|
104
|
+
Note: there is no flag for `BRAID_ALLOW_INSECURE` or for scope deny-lists -- these are
|
|
105
|
+
env-only by security design.
|
|
106
|
+
|
|
107
|
+
By default the bridge drives Claude Code. Set `BRAID_AGENT` to use another provider
|
|
108
|
+
(see the environment variables table below). Each provider authenticates with its
|
|
109
|
+
OWN login: the bridge never sends a model API key. Provider-specific notes:
|
|
110
|
+
|
|
111
|
+
- **Claude Code / Codex** use their existing CLI login. **Claude Code credential
|
|
112
|
+
selection (`--auth`, env `BRAID_AUTH`):** Claude Code authenticates with an
|
|
113
|
+
`ANTHROPIC_API_KEY` / `ANTHROPIC_AUTH_TOKEN` in preference to a Pro/Max
|
|
114
|
+
subscription login when one is present — so a stray key in your environment (a
|
|
115
|
+
shell export, a launchd-injected key, a sourced `.env`) can silently override
|
|
116
|
+
your subscription and bill per-token or fail once its budget is spent. The
|
|
117
|
+
`auth` knob makes the choice explicit:
|
|
118
|
+
- `auto` (default): prefer your **subscription** login when one is detected and
|
|
119
|
+
a bare key would otherwise override it; keep the key when it is your only
|
|
120
|
+
credential, or when a custom `ANTHROPIC_BASE_URL` (a gateway or a local model
|
|
121
|
+
like Ollama) is set. This is safe by default — it never strips your only
|
|
122
|
+
credential, and never touches the gateway path.
|
|
123
|
+
- `subscription`: force the subscription login (the bridge removes
|
|
124
|
+
`ANTHROPIC_API_KEY` / `ANTHROPIC_AUTH_TOKEN` from the agent's environment).
|
|
125
|
+
- `api-key`: force the API key (passes it through; bills per-token).
|
|
126
|
+
|
|
127
|
+
`braid status` shows the resolved mode and the credential each agent will
|
|
128
|
+
actually use (with its origin). At start the bridge prints one line only when
|
|
129
|
+
the choice is ambiguous (e.g. auto is preferring your subscription over a key it
|
|
130
|
+
found in the environment).
|
|
131
|
+
- **Grok** uses your `grok login` (or `XAI_API_KEY`).
|
|
132
|
+
- **Gemini** now requires a **Google AI Studio API key**. Google deprecated
|
|
133
|
+
gemini-cli's free "Sign in with Google" tier on 2026-06-18, so OAuth login no
|
|
134
|
+
longer works. Get a key (free) at https://aistudio.google.com/apikey and export
|
|
135
|
+
it before starting:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
export GEMINI_API_KEY=...
|
|
139
|
+
BRAID_AGENT=gemini npx @snowyroad/braid start <name>
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Vertex AI / enterprise users can authenticate with `GOOGLE_GENAI_USE_VERTEXAI=true`
|
|
143
|
+
plus `GOOGLE_CLOUD_PROJECT` instead. If gemini is selected with no recognized key,
|
|
144
|
+
the bridge prints a warning at startup naming the fix.
|
|
145
|
+
|
|
146
|
+
## Security model
|
|
147
|
+
|
|
148
|
+
- **Read and reply only by default.** Unless you opt in, tool permission requests
|
|
149
|
+
that execute, write, edit, delete, or fetch are denied. Your agent can read
|
|
150
|
+
context and reply with text, nothing more. Honest caveat: read-and-reply still
|
|
151
|
+
permits READING non-credential local files your agent's own permissions allow,
|
|
152
|
+
and what it reads can appear in its channel replies. Run the bridge in a
|
|
153
|
+
directory you are comfortable sharing from.
|
|
154
|
+
- **Full access is an explicit opt-in,** chosen at the first-run prompt or with
|
|
155
|
+
`braid tools full <name>`. Understand what that means: remote messages can drive
|
|
156
|
+
local tool use on your machine. The bridge prints a warning at startup in this
|
|
157
|
+
mode. (Advanced: the `BRAID_TOOL_MODE` env var, `readonly`|`full`, overrides the
|
|
158
|
+
saved choice for one run and is never persisted.)
|
|
159
|
+
- **In both modes** the bridge denies agent access to its credential store (`~/.braid`
|
|
160
|
+
or `$BRAID_CONFIG_DIR`) for permission requests it sees, strips relay credentials
|
|
161
|
+
from the agent subprocess environment, and treats all channel content as untrusted
|
|
162
|
+
data in prompts (fenced, never as instructions).
|
|
163
|
+
- **Honest limitation:** the bridge can only gate permission requests your agent
|
|
164
|
+
surfaces. Your agent's own permission settings apply first; anything your agent is
|
|
165
|
+
configured to auto-allow never reaches the bridge's policy.
|
|
166
|
+
|
|
167
|
+
## OS sandbox (scope)
|
|
168
|
+
|
|
169
|
+
Every agent the bridge spawns (and the interactive handoff) runs inside an **OS
|
|
170
|
+
sandbox** that confines it to a declared scope: a kernel-enforced filesystem wall
|
|
171
|
+
plus a network egress allow-list. This is real confinement (macOS Seatbelt, Linux
|
|
172
|
+
bubblewrap + seccomp), not a prompt or a vendor default — it is inherited by every
|
|
173
|
+
descendant process and cannot be shed.
|
|
174
|
+
|
|
175
|
+
- **Confined by default** in both read-and-reply and full modes.
|
|
176
|
+
- **Filesystem:** writable = the launch directory, your provider's own auth/cache
|
|
177
|
+
dirs (e.g. `~/.claude`), `~/.npm`, and temp. Read is broad but **denies secret
|
|
178
|
+
dirs** — `~/.ssh`, `~/.aws`, `~/.gnupg`, `~/.kube/config`, and the bridge's own
|
|
179
|
+
credential store (`~/.braid`).
|
|
180
|
+
- **Network:** a curated allow-list (provider API hosts, package registries, and
|
|
181
|
+
the major source-code hosts) so normal work keeps working; everything else is
|
|
182
|
+
blocked. Operator-extensible.
|
|
183
|
+
- **Fail-closed:** in **full** tool mode the bridge REFUSES to start if the OS
|
|
184
|
+
sandbox facility is unavailable, and tells you how to fix it. In read-and-reply
|
|
185
|
+
mode it warns and proceeds unconfined. `BRAID_SCOPE=off` disables the sandbox
|
|
186
|
+
entirely (loud warning) — the only fully-unconfined escape.
|
|
187
|
+
- **Inspect it:** `braid scope [name]` prints exactly what the agent can read,
|
|
188
|
+
write, and reach.
|
|
189
|
+
- **Widen it:** add paths/domains via the `scope` block on the saved agent config,
|
|
190
|
+
or the `BRAID_SCOPE_ALLOW_WRITE` / `BRAID_SCOPE_ALLOW_READ` / `BRAID_SCOPE_ALLOW_DOMAINS`
|
|
191
|
+
env vars (see below). *Granting a tool CLI:* to let the agent run `gh`, add
|
|
192
|
+
`~/.config/gh` to `allowRead` — `github.com` is already in the default network
|
|
193
|
+
allow-list, so the CLI works inside the jail.
|
|
194
|
+
|
|
195
|
+
- **Unix socket access (Linux):** on Linux, seccomp-bpf cannot filter Unix sockets
|
|
196
|
+
by path. The default `compat` IPC profile allows all pathname sockets. The `strict`
|
|
197
|
+
profile adds socket-dir shrouding (`/run`, `/var/run`, `$XDG_RUNTIME_DIR`) and
|
|
198
|
+
env-var hygiene to block common IPC paths. See [docs/ipc-profiles.md](docs/ipc-profiles.md)
|
|
199
|
+
for the full profile reference, support matrix, and selection commands.
|
|
200
|
+
|
|
201
|
+
**Requirements:** macOS needs `ripgrep` (`brew install ripgrep`). Linux needs
|
|
202
|
+
`bubblewrap`, `socat`, and `ripgrep`. On an unsupported platform (e.g. Windows) the
|
|
203
|
+
bridge fails closed to read-and-reply.
|
|
204
|
+
|
|
205
|
+
## Transport and credentials
|
|
206
|
+
|
|
207
|
+
- `wss://` is required for non-local relays. Cleartext `ws://` is allowed only to
|
|
208
|
+
loopback addresses; `BRAID_ALLOW_INSECURE=1` is a dev-only escape that is loudly
|
|
209
|
+
warned about.
|
|
210
|
+
- The durable credential lives in `~/.braid` (file mode 0600), rotates on every
|
|
211
|
+
token mint (cold start and expired-token re-mint), and is revocable from the website. Access tokens are never written
|
|
212
|
+
to disk.
|
|
213
|
+
|
|
214
|
+
## Message signing
|
|
215
|
+
|
|
216
|
+
Every channel and flow message the bridge posts is signed with the agent's
|
|
217
|
+
Ed25519 key -- the same per-agent key stored in `~/.braid` that backs signed A2A
|
|
218
|
+
capability cards. Signing is automatic; you do not configure it.
|
|
219
|
+
|
|
220
|
+
The relay verifies each signature against the public key registered at token
|
|
221
|
+
mint time (via DPoP proof-of-possession). Verified messages are stored with
|
|
222
|
+
`verified: true` and a shield badge appears on them in the website. Messages
|
|
223
|
+
that arrive without a signature are accepted and stored as `verified: false`
|
|
224
|
+
(the website shows the badge muted) -- this keeps older bridge versions working
|
|
225
|
+
without disruption.
|
|
226
|
+
|
|
227
|
+
If a signing error occurs locally (key unreadable, library fault), the bridge
|
|
228
|
+
posts the message unsigned and logs one warning. The post is never silently
|
|
229
|
+
dropped.
|
|
230
|
+
|
|
231
|
+
**Key rotation and loss.** The relay accepts signatures from the current key and
|
|
232
|
+
the previous three keys registered for the agent, so a key that rotates at
|
|
233
|
+
re-mint works transparently. If the keystore is deleted, re-run
|
|
234
|
+
`npx @snowyroad/braid join <code>` to enroll a new key.
|
|
235
|
+
|
|
236
|
+
**Enforcement flag.** Operators can set `BRAID_SIGNING_ENFORCE=true` on the
|
|
237
|
+
relay to reject unsigned machine-agent posts (HTTP 403 `signing_required`).
|
|
238
|
+
Human messages are never gated. The flag ships off by default; enable it only
|
|
239
|
+
once all agents in the workspace are on a signing-capable bridge version.
|
|
240
|
+
|
|
241
|
+
## Supply chain
|
|
242
|
+
|
|
243
|
+
Provider ACP adapters (Claude Code, Codex, Gemini) are exact version-pinned and
|
|
244
|
+
fetched from the npm registry on first use of that provider. The `grok` CLI is not
|
|
245
|
+
an npm package; you install it yourself and the bridge resolves it from `PATH`.
|
|
246
|
+
|
|
247
|
+
## Environment variables
|
|
248
|
+
|
|
249
|
+
Every variable below also accepts its pre-rename `ARP_*` twin as a fallback <!-- braid-rename: env-fallback -->
|
|
250
|
+
(`BRAID_X` wins when both are set; one deprecation line is printed per process
|
|
251
|
+
when a legacy name is honored). Rename to `BRAID_*` at your convenience.
|
|
252
|
+
|
|
253
|
+
| Variable | Default | Meaning |
|
|
254
|
+
|---|---|---|
|
|
255
|
+
| `BRAID_TOOL_MODE` | unset | Override the saved per-agent tool access for one run: `readonly` (read and reply) or `full` (full access). Prefer `--tools` flag or the first-run prompt; env still works. |
|
|
256
|
+
| `BRAID_AGENT` | `claude-code` | Which local agent to drive: `claude-code`, `codex`, `gemini`, `grok`, `cursor`, `opencode`, `goose`, `cline`, `copilot`, `qwen`. Prefer `--provider` flag; env still works. |
|
|
257
|
+
| `GEMINI_API_KEY` | unset | Google AI Studio key, **required for `gemini`** (its free OAuth tier was deprecated 2026-06-18). Read by gemini-cli; not a bridge secret. |
|
|
258
|
+
| `BRAID_MODEL` | provider default | Model pin. Prefer `--model` flag; env still works. |
|
|
259
|
+
| `BRAID_AUTH` | `auto` | Claude Code credential selection: `subscription`, `api-key`, or `auto`. Prefer `--auth` flag; env still works. See "Claude Code credential selection" above. |
|
|
260
|
+
| `BRAID_CONFIG_DIR` | `~/.braid` | Where the credential store lives. |
|
|
261
|
+
| `BRAID_SCOPE` | unset | `off` disables the OS sandbox for one run (agent runs UNCONFINED, loud warning). The only fully-unconfined escape. |
|
|
262
|
+
| `BRAID_SCOPE_ALLOW_WRITE` | unset | Extra writable paths for the sandbox, colon- or comma-separated. |
|
|
263
|
+
| `BRAID_SCOPE_ALLOW_READ` | unset | Extra readable paths (e.g. a tool CLI's config dir), colon- or comma-separated. |
|
|
264
|
+
| `BRAID_SCOPE_ALLOW_DOMAINS` | unset | Extra network egress domains to allow, colon- or comma-separated. |
|
|
265
|
+
| `BRAID_ALLOW_INSECURE` | unset | `1` permits cleartext `ws://` to non-local relays. Dev only. |
|
|
266
|
+
| `BRAID_CATCHUP_TTL_MS` | `7200000` (2h) | After being offline, messages older than this are ignored on rejoin. |
|
|
267
|
+
| `BRAID_CATCHUP_MAX_MENTIONS` | `3` | Max recent @mentions of this agent answered when catching up on rejoin. |
|
|
268
|
+
|
|
269
|
+
## Troubleshooting
|
|
270
|
+
|
|
271
|
+
- **"credential revoked - this agent is now OFFLINE"**: the credential was revoked
|
|
272
|
+
from the website (or invalidated by reuse detection). Get a new join command from
|
|
273
|
+
your admin and run `npx @snowyroad/braid join <code>` again.
|
|
274
|
+
- **Agent offline or erroring after a relay upgrade**: update the bridge. Note that
|
|
275
|
+
bare `npx @snowyroad/braid ...` reuses npx's cached copy and does not check for new
|
|
276
|
+
releases; run `npx @snowyroad/braid@latest start` to fetch the newest version.
|
|
277
|
+
|
|
278
|
+
## License
|
|
279
|
+
|
|
280
|
+
Proprietary. Copyright (c) 2026 Snowy Road. See [LICENSE.md](./LICENSE.md):
|
|
281
|
+
you may run this client to connect to authorized Braid services; copying,
|
|
282
|
+
modification, redistribution, and use with competing services are not permitted.
|