agent-embassy 3.0.0 → 4.0.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/CHANGELOG.md +42 -0
- package/CONTRIBUTING.md +92 -200
- package/README.md +159 -138
- package/SECURITY.md +191 -335
- package/dist/src/gateway/broker-check.d.ts +26 -0
- package/dist/src/gateway/broker-check.js +89 -0
- package/dist/src/gateway/broker-check.js.map +1 -0
- package/dist/src/gateway/broker-control.d.ts +72 -0
- package/dist/src/gateway/broker-control.js +164 -0
- package/dist/src/gateway/broker-control.js.map +1 -0
- package/dist/src/gateway/broker.d.ts +117 -0
- package/dist/src/gateway/broker.js +186 -0
- package/dist/src/gateway/broker.js.map +1 -0
- package/dist/src/gateway/claude-peer.d.ts +1 -124
- package/dist/src/gateway/claude-peer.js +62 -1053
- package/dist/src/gateway/claude-peer.js.map +1 -1
- package/dist/src/gateway/codex-stateless-transport.d.ts +0 -12
- package/dist/src/gateway/codex-stateless-transport.js +8 -142
- package/dist/src/gateway/codex-stateless-transport.js.map +1 -1
- package/dist/src/gateway/config.d.ts +2 -6
- package/dist/src/gateway/config.js +17 -27
- package/dist/src/gateway/config.js.map +1 -1
- package/dist/src/gateway/coordinator.d.ts +57 -0
- package/dist/src/gateway/coordinator.js +217 -0
- package/dist/src/gateway/coordinator.js.map +1 -0
- package/dist/src/gateway/core-cli.d.ts +15 -0
- package/dist/src/gateway/core-cli.js +282 -0
- package/dist/src/gateway/core-cli.js.map +1 -0
- package/dist/src/gateway/core-service-command.d.ts +16 -0
- package/dist/src/gateway/core-service-command.js +71 -0
- package/dist/src/gateway/core-service-command.js.map +1 -0
- package/dist/src/gateway/endpoint-directory.d.ts +33 -0
- package/dist/src/gateway/endpoint-directory.js +223 -0
- package/dist/src/gateway/endpoint-directory.js.map +1 -0
- package/dist/src/gateway/federation.d.ts +89 -0
- package/dist/src/gateway/federation.js +632 -0
- package/dist/src/gateway/federation.js.map +1 -0
- package/dist/src/gateway/ledger-codec.d.ts +3 -0
- package/dist/src/gateway/ledger-codec.js +159 -0
- package/dist/src/gateway/ledger-codec.js.map +1 -0
- package/dist/src/gateway/ledger.d.ts +138 -0
- package/dist/src/gateway/ledger.js +319 -0
- package/dist/src/gateway/ledger.js.map +1 -0
- package/dist/src/gateway/local-control.d.ts +23 -0
- package/dist/src/gateway/local-control.js +489 -0
- package/dist/src/gateway/local-control.js.map +1 -0
- package/dist/src/gateway/native-destinations.d.ts +34 -0
- package/dist/src/gateway/native-destinations.js +272 -0
- package/dist/src/gateway/native-destinations.js.map +1 -0
- package/dist/src/gateway/owned-state.d.ts +57 -0
- package/dist/src/gateway/owned-state.js +398 -0
- package/dist/src/gateway/owned-state.js.map +1 -0
- package/dist/src/gateway/provenance-envelope.d.ts +3 -3
- package/dist/src/gateway/provenance-envelope.js +3 -23
- package/dist/src/gateway/provenance-envelope.js.map +1 -1
- package/dist/src/gateway/runtime.d.ts +41 -0
- package/dist/src/gateway/runtime.js +175 -0
- package/dist/src/gateway/runtime.js.map +1 -0
- package/docs/CONFIGURATION.md +178 -266
- package/docs/DELIVERY.md +133 -82
- package/docs/GATEWAY-ARCHITECTURE.md +276 -943
- package/package.json +5 -5
- package/skills/embassy-peer/SKILL.md +38 -194
- package/skills/embassy-peer/agents/openai.yaml +2 -2
- package/dist/src/gateway/claude-helper-client.d.ts +0 -2
- package/dist/src/gateway/claude-helper-client.js +0 -2
- package/dist/src/gateway/claude-helper-client.js.map +0 -1
- package/dist/src/gateway/claude-helper-protocol.d.ts +0 -117
- package/dist/src/gateway/claude-helper-protocol.js +0 -122
- package/dist/src/gateway/claude-helper-protocol.js.map +0 -1
- package/dist/src/gateway/claude-helper-supervisor.d.ts +0 -87
- package/dist/src/gateway/claude-helper-supervisor.js +0 -347
- package/dist/src/gateway/claude-helper-supervisor.js.map +0 -1
- package/dist/src/gateway/claude-helper.d.ts +0 -1
- package/dist/src/gateway/claude-helper.js +0 -252
- package/dist/src/gateway/claude-helper.js.map +0 -1
- package/dist/src/gateway/cli.d.ts +0 -57
- package/dist/src/gateway/cli.js +0 -1503
- package/dist/src/gateway/cli.js.map +0 -1
- package/dist/src/gateway/codex-socket-holder.d.ts +0 -26
- package/dist/src/gateway/codex-socket-holder.js +0 -76
- package/dist/src/gateway/codex-socket-holder.js.map +0 -1
- package/dist/src/gateway/control.d.ts +0 -261
- package/dist/src/gateway/control.js +0 -903
- package/dist/src/gateway/control.js.map +0 -1
- package/dist/src/gateway/peer-client.d.ts +0 -58
- package/dist/src/gateway/peer-client.js +0 -217
- package/dist/src/gateway/peer-client.js.map +0 -1
- package/dist/src/gateway/peer-mailbox.d.ts +0 -78
- package/dist/src/gateway/peer-mailbox.js +0 -168
- package/dist/src/gateway/peer-mailbox.js.map +0 -1
- package/dist/src/gateway/peer-protocol.d.ts +0 -105
- package/dist/src/gateway/peer-protocol.js +0 -70
- package/dist/src/gateway/peer-protocol.js.map +0 -1
- package/dist/src/gateway/peer-stdio.d.ts +0 -23
- package/dist/src/gateway/peer-stdio.js +0 -100
- package/dist/src/gateway/peer-stdio.js.map +0 -1
- package/dist/src/gateway/providers.d.ts +0 -163
- package/dist/src/gateway/providers.js +0 -972
- package/dist/src/gateway/providers.js.map +0 -1
- package/dist/src/gateway/server.d.ts +0 -47
- package/dist/src/gateway/server.js +0 -219
- package/dist/src/gateway/server.js.map +0 -1
- package/dist/src/gateway/service.d.ts +0 -373
- package/dist/src/gateway/service.js +0 -2274
- package/dist/src/gateway/service.js.map +0 -1
- package/dist/src/gateway/status-view.d.ts +0 -167
- package/dist/src/gateway/status-view.js +0 -488
- package/dist/src/gateway/status-view.js.map +0 -1
- package/dist/src/gateway/store.d.ts +0 -185
- package/dist/src/gateway/store.js +0 -2359
- package/dist/src/gateway/store.js.map +0 -1
- package/dist/src/gateway/types.d.ts +0 -528
- package/dist/src/gateway/types.js +0 -341
- package/dist/src/gateway/types.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,191 +1,212 @@
|
|
|
1
|
-
<p align="center">
|
|
2
|
-
<img src="https://raw.githubusercontent.com/YuanpingSong/embassy/main/assets/social-preview.png" alt="Embassy — a local gateway for messaging between Claude Code sessions and Codex CLI tasks" width="720">
|
|
3
|
-
</p>
|
|
4
|
-
|
|
5
1
|
# Embassy
|
|
6
2
|
|
|
7
|
-
|
|
3
|
+
Embassy lets live Claude Code sessions and Codex CLI tasks message one another
|
|
4
|
+
by name, on one Mac or across user-owned Macs reached through SSH. The broker
|
|
5
|
+
wakes the receiving agent through its native interface; agents do not poll.
|
|
6
|
+
Claude→Claude, Claude→Codex, Codex→Claude, and Codex→Codex all use the same
|
|
7
|
+
command and receipt model.
|
|
8
|
+
|
|
9
|
+
The core is deliberately small: one private ledger, one delivery coordinator,
|
|
10
|
+
and three write adapters (Claude socket, Codex App Server operation, and SSH
|
|
11
|
+
handoff). Aliases are lookup names. Opaque endpoint IDs are the routing
|
|
12
|
+
identity, so a rename or replacement never silently retargets queued work.
|
|
8
13
|
|
|
9
|
-
|
|
10
|
-
[](LICENSE)
|
|
11
|
-
[](package.json)
|
|
14
|
+
## Requirements
|
|
12
15
|
|
|
13
|
-
|
|
16
|
+
- macOS and Node.js 20 or newer.
|
|
17
|
+
- Claude Code and/or Codex CLI installed for the agents you use.
|
|
18
|
+
- A private `nodes.json` when choosing an explicit host name or federating;
|
|
19
|
+
first single-machine boot creates one from the short hostname.
|
|
20
|
+
- Key-based, non-interactive SSH between configured machines when federating.
|
|
14
21
|
|
|
15
|
-
|
|
22
|
+
Install one copy with one package manager and verify what the shell resolves:
|
|
16
23
|
|
|
17
|
-
```
|
|
24
|
+
```sh
|
|
18
25
|
npm install -g agent-embassy
|
|
19
|
-
|
|
26
|
+
which -a embassy
|
|
27
|
+
embassy --version
|
|
20
28
|
```
|
|
21
29
|
|
|
22
|
-
|
|
30
|
+
The launchd service records the absolute installation path used by
|
|
31
|
+
`embassy service install`. After replacing or removing that installation, run
|
|
32
|
+
the install command again.
|
|
23
33
|
|
|
24
|
-
|
|
34
|
+
The agent starts at login and uses launchd's crash-only keepalive policy. A
|
|
35
|
+
verified `SIGABRT` crash relaunches it. A clean exit, boot refusal, `SIGTERM`,
|
|
36
|
+
or deliberate `kill -9` leaves it stopped; inspect `embassy service status`
|
|
37
|
+
and install/start it deliberately rather than assuming every signal restarts it.
|
|
25
38
|
|
|
26
|
-
##
|
|
39
|
+
## Quickstart
|
|
27
40
|
|
|
28
|
-
|
|
41
|
+
For an explicit host name or federation, create `nodes.json` before starting
|
|
42
|
+
the broker. `host` is this machine's name; `nodes` lists directly reachable
|
|
43
|
+
Embassy hosts.
|
|
29
44
|
|
|
30
|
-
```
|
|
31
|
-
|
|
45
|
+
```json
|
|
46
|
+
{"version":1,"host":"studio","nodes":[]}
|
|
32
47
|
```
|
|
33
48
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
49
|
+
The file lives at
|
|
50
|
+
`$XDG_STATE_HOME/agent-embassy/nodes.json`, or
|
|
51
|
+
`~/.local/state/agent-embassy/nodes.json` when `XDG_STATE_HOME` is unset. It
|
|
52
|
+
must be owned by the current user, mode 0600, inside the private mode-0700 state
|
|
53
|
+
directory. If it is absent on first single-machine boot, Embassy derives a
|
|
54
|
+
lower-case name from the short hostname and atomically writes the equivalent
|
|
55
|
+
empty-node file. It never rewrites a present inventory.
|
|
39
56
|
|
|
40
|
-
|
|
57
|
+
Install the supervised broker:
|
|
41
58
|
|
|
42
|
-
```
|
|
43
|
-
embassy
|
|
44
|
-
|
|
45
|
-
MSG
|
|
59
|
+
```sh
|
|
60
|
+
embassy service install
|
|
61
|
+
embassy health
|
|
46
62
|
```
|
|
47
63
|
|
|
48
|
-
|
|
64
|
+
A Codex task registers itself from that task's inherited identity. Embassy
|
|
65
|
+
never accepts or prints the task ID:
|
|
49
66
|
|
|
50
|
-
```
|
|
51
|
-
embassy
|
|
52
|
-
The main risk is the double-write window; gate it behind the flag.
|
|
53
|
-
MSG
|
|
67
|
+
```sh
|
|
68
|
+
embassy register-codex --alias codex-reviewer@studio
|
|
54
69
|
```
|
|
55
70
|
|
|
56
|
-
|
|
71
|
+
Claude sessions are discovered and recorded by exact native identity when a
|
|
72
|
+
Claude caller sends or when a named Claude target is resolved. No helper or
|
|
73
|
+
native advertisement process is installed.
|
|
57
74
|
|
|
58
|
-
|
|
75
|
+
From either a Claude session or a registered Codex task, send the body on
|
|
76
|
+
stdin. The sender is inferred from the calling session:
|
|
59
77
|
|
|
60
|
-
```
|
|
61
|
-
|
|
78
|
+
```sh
|
|
79
|
+
printf '%s\n' 'Please review the change.' |
|
|
80
|
+
embassy send --to claude-reviewer@studio
|
|
62
81
|
```
|
|
63
82
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
```text
|
|
67
|
-
embassy check 50066f60 → codex-reviewer@this-mac
|
|
68
|
-
|
|
69
|
-
ok register peer-check-b0c963c9@this-mac (ephemeral, 2 min) 6 ms
|
|
70
|
-
ok send accepted, conversation …89abcdef 15 ms
|
|
71
|
-
ok delivered the peer's transport accepted it 256 ms
|
|
72
|
-
ok reply codex-reviewer@this-mac echoed 50066f60 1407 ms
|
|
73
|
-
ok cleanup temporary check identity removed
|
|
83
|
+
The recipient gets a provenance envelope and a conversation-bound reply
|
|
84
|
+
command:
|
|
74
85
|
|
|
75
|
-
|
|
86
|
+
```sh
|
|
87
|
+
printf '%s\n' 'Review complete.' |
|
|
88
|
+
embassy send --conversation conv_example
|
|
76
89
|
```
|
|
77
90
|
|
|
78
|
-
|
|
91
|
+
Conversation references are identity-bound, are not aliases, and may survive a
|
|
92
|
+
broker restart while their retained ledger row and both exact endpoints remain
|
|
93
|
+
valid. They stop resolving after retirement, replacement, expiry, eviction, or
|
|
94
|
+
a state reset.
|
|
79
95
|
|
|
80
|
-
|
|
81
|
-
cp -R "$(npm root -g)/agent-embassy/skills/embassy-peer" ~/.codex/skills/
|
|
82
|
-
cp -R "$(npm root -g)/agent-embassy/skills/embassy-peer" ~/.claude/skills/
|
|
83
|
-
```
|
|
96
|
+
## Delivery
|
|
84
97
|
|
|
85
|
-
|
|
98
|
+
One native wake can carry a bounded FIFO batch, so a busy recipient catches up
|
|
99
|
+
without one wake per queued message. Every message keeps its own source,
|
|
100
|
+
destination, conversation, deadline, and receipt. Capacity and expiry remain
|
|
101
|
+
visible per message.
|
|
86
102
|
|
|
87
|
-
|
|
103
|
+
The durable write phases are `queued`, `reserved`, `armed`, `accepted`, and
|
|
104
|
+
`terminal`. Work known not to have been written may return to the queue. An
|
|
105
|
+
uncertain armed or accepted write is never replayed.
|
|
88
106
|
|
|
89
|
-
|
|
107
|
+
An exact leading `STEER:` from Claude to Codex targets the active accepted
|
|
108
|
+
Codex operation at its next safe tool-call boundary. It never interrupts a
|
|
109
|
+
generation. If that boundary is cleanly unavailable, the message remains in
|
|
110
|
+
the ordinary bounded queue. The global kill switch is
|
|
111
|
+
`EMBASSY_STEERING_ENABLED=0`.
|
|
90
112
|
|
|
91
|
-
|
|
113
|
+
See [Delivery semantics](docs/DELIVERY.md) for the phase and receipt contract.
|
|
92
114
|
|
|
93
|
-
##
|
|
115
|
+
## Multiple machines
|
|
94
116
|
|
|
95
|
-
|
|
117
|
+
List direct peers in each machine's `nodes.json`. The local broker launches:
|
|
96
118
|
|
|
97
119
|
```text
|
|
98
|
-
|
|
99
|
-
state dir /Users/you/.local/state/agent-embassy
|
|
100
|
-
sessions scanned 3s ago
|
|
101
|
-
|
|
102
|
-
connectors
|
|
103
|
-
claude ok
|
|
104
|
-
codex ok
|
|
105
|
-
|
|
106
|
-
sessions
|
|
107
|
-
session state route last seen
|
|
108
|
-
advisor@this-mac busy routed 3s ago
|
|
109
|
-
|
|
110
|
-
routes
|
|
111
|
-
alias provider state queue last seen
|
|
112
|
-
advisor@this-mac claude busy 2 discovered 3s
|
|
113
|
-
codex-reviewer@this-mac codex idle 0 12s ago
|
|
114
|
-
|
|
115
|
-
recent (3 of 3)
|
|
116
|
-
12s ago advisor@this-mac → codex-reviewer@this-mac queued
|
|
117
|
-
2m ago codex-reviewer@this-mac → advisor@this-mac delivered 210 ms
|
|
118
|
-
The risk is the double-write window; I would gate it behind…
|
|
119
|
-
5m ago advisor@this-mac → codex-reviewer@this-mac delivered 61 ms
|
|
120
|
-
Please review the migration risk before the freeze.
|
|
120
|
+
/usr/bin/ssh <node> embassy peer-stdio
|
|
121
121
|
```
|
|
122
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
|
-
The risk is the double-write window; I would gate it behind…
|
|
152
|
-
5m ago advisor@this-mac → codex-reviewer@this-mac delivered 61 ms
|
|
153
|
-
Please review the migration risk before the freeze.
|
|
154
|
-
|
|
155
|
-
alerts
|
|
156
|
-
PEER_TUNNEL_UNAVAILABLE studio 45s ago
|
|
157
|
-
The SSH tunnel to that node is down; check the node is reachable and its broker is running.
|
|
123
|
+
The plain same-user SSH login is the trust boundary. The peer's claimed host
|
|
124
|
+
must be listed in the destination's `nodes.json`; that claim is trusted, not
|
|
125
|
+
independently bound to a physical machine. No forced command or dedicated
|
|
126
|
+
per-node key is required. Configure each node's host label accurately.
|
|
127
|
+
Federation has no listener or multi-hop routing. The destination owns the
|
|
128
|
+
queue and trusts the peer's source identity, so first contact does not wait
|
|
129
|
+
for a destination catalog poll. Catalogs are bounded memory-only observations,
|
|
130
|
+
never routing authority.
|
|
131
|
+
|
|
132
|
+
`embassy refresh` observes local Claude sessions and every configured SSH
|
|
133
|
+
catalog in parallel. `status` performs no provider or network I/O: it shows the
|
|
134
|
+
last per-node catalog rows and observation time, retains the last rows when a
|
|
135
|
+
later refresh fails, and labels that node `PEER_TUNNEL_UNAVAILABLE`. At most 128
|
|
136
|
+
remote rows are displayed; truncation is explicit. Named and exact sends still
|
|
137
|
+
ask the owner directly.
|
|
138
|
+
|
|
139
|
+
## Operations
|
|
140
|
+
|
|
141
|
+
```sh
|
|
142
|
+
embassy status
|
|
143
|
+
embassy status --json
|
|
144
|
+
embassy refresh
|
|
145
|
+
embassy delivery-status --token dlv_example
|
|
146
|
+
embassy wait-delivery --token dlv_example
|
|
147
|
+
embassy retire --alias codex-reviewer@studio
|
|
148
|
+
embassy check
|
|
149
|
+
embassy service status
|
|
150
|
+
embassy serve # foreground alternative
|
|
158
151
|
```
|
|
159
152
|
|
|
160
|
-
`
|
|
153
|
+
`status` reports the broker ledger, queue depth, recent message outcomes,
|
|
154
|
+
retirements, each local route's last native operation, and the last bounded SSH
|
|
155
|
+
catalog observation. It does not claim that an idle provider is ready.
|
|
156
|
+
|
|
157
|
+
Machine output is one closed JSON line shaped as
|
|
158
|
+
`{"ok":true,"command":"status","result":{...}}`; route rows are therefore at
|
|
159
|
+
`.result.routes`. A terminal `embassy status` renders the same body for a
|
|
160
|
+
person, while `--json` keeps the envelope.
|
|
161
161
|
|
|
162
|
-
|
|
162
|
+
`check` is a broker-only loopback through the real ledger and coordinator. It
|
|
163
|
+
proves local control, persistence, routing, and receipt handling without
|
|
164
|
+
contacting a live Claude or Codex agent. It is not a provider-readiness test.
|
|
163
165
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
166
|
+
`retire` removes one local endpoint identity. Queued and reserved work is
|
|
167
|
+
cancelled, armed work becomes ambiguous, and accepted work becomes unconfirmed.
|
|
168
|
+
Remote endpoints must be retired on their owning host.
|
|
169
|
+
If departed sessions share a name, retire one exactly with
|
|
170
|
+
`embassy retire --endpoint <public-id>` using its opaque ID from status.
|
|
168
171
|
|
|
169
|
-
|
|
172
|
+
## Safety
|
|
170
173
|
|
|
171
|
-
|
|
174
|
+
- The broker uses one private Unix socket and mode-0600 state inside a
|
|
175
|
+
mode-0700 directory. It does not listen on TCP or HTTP.
|
|
176
|
+
- Native task/session IDs, socket paths, credentials, transcripts, and raw
|
|
177
|
+
provider frames never appear in public output.
|
|
178
|
+
- Every native write is authorized against the exact current endpoint after
|
|
179
|
+
preparation. Names are never silently resolved again during an attempt.
|
|
180
|
+
- SSH uses the fixed system binary, batch mode, no forwarding, and no shell.
|
|
181
|
+
- `health` and `check` describe broker infrastructure, not model readiness or
|
|
182
|
+
comprehension.
|
|
172
183
|
|
|
173
|
-
|
|
184
|
+
See [Security](SECURITY.md), [Configuration](docs/CONFIGURATION.md), and
|
|
185
|
+
[Architecture](docs/GATEWAY-ARCHITECTURE.md).
|
|
174
186
|
|
|
175
|
-
|
|
187
|
+
## Upgrading to 4.x
|
|
176
188
|
|
|
177
|
-
|
|
189
|
+
Version 4 accepts only fresh private state schema 6 and private control
|
|
190
|
+
protocol 5. It does not migrate or read v3 state. Before upgrading, use the old
|
|
191
|
+
binary to inspect and settle work, stop the broker, preserve a backup of the
|
|
192
|
+
old state, then reset `gateway-state.json`. Keep `nodes.json`.
|
|
193
|
+
|
|
194
|
+
The rollback boundary is the preserved old state plus its matching old binary.
|
|
195
|
+
Do not point an old binary at schema-6 state or a v4 binary at old state.
|
|
196
|
+
|
|
197
|
+
## Development
|
|
198
|
+
|
|
199
|
+
Routine tests use test-owned directories, fake Claude sockets, fake App Server
|
|
200
|
+
transports, and fake SSH processes:
|
|
201
|
+
|
|
202
|
+
```sh
|
|
203
|
+
npm ci
|
|
204
|
+
TMPDIR=/tmp npm run check
|
|
205
|
+
```
|
|
178
206
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
| [Architecture](docs/GATEWAY-ARCHITECTURE.md) | Topology, adapters, control plane, federation, protocol versions, and the OS-boundary permission model |
|
|
182
|
-
| [Delivery](docs/DELIVERY.md) | Delivery semantics, tokens, settlement states, and retry rules |
|
|
183
|
-
| [Configuration](docs/CONFIGURATION.md) | Environment variables, `nodes.json`, the launchd service, and addressing |
|
|
184
|
-
| [Security policy](SECURITY.md) | The boundary in depth, and how to report a vulnerability |
|
|
185
|
-
| [Contributing](CONTRIBUTING.md) | Where changes go, and how to run the deterministic suite |
|
|
186
|
-
| [Changelog](CHANGELOG.md) | What each release contains |
|
|
187
|
-
| [Agent skill](skills/embassy-peer/SKILL.md) | The workflow an agent follows to operate Embassy |
|
|
207
|
+
No routine test connects a live provider or SSH host. See
|
|
208
|
+
[CONTRIBUTING.md](CONTRIBUTING.md).
|
|
188
209
|
|
|
189
210
|
## License
|
|
190
211
|
|
|
191
|
-
|
|
212
|
+
MIT
|