agentgather 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/LICENSE +21 -0
- package/README.md +418 -0
- package/SECURITY.md +104 -0
- package/dist/src/auth/index.js +1 -0
- package/dist/src/auth/tokens.js +12 -0
- package/dist/src/browser/room.css +666 -0
- package/dist/src/browser/room.html +80 -0
- package/dist/src/browser/room.js +435 -0
- package/dist/src/cli/args.js +29 -0
- package/dist/src/cli/commands/attend/index.js +26 -0
- package/dist/src/cli/commands/broker/index.js +61 -0
- package/dist/src/cli/commands/doctor/index.js +93 -0
- package/dist/src/cli/commands/export/index.js +42 -0
- package/dist/src/cli/commands/handoff/index.js +41 -0
- package/dist/src/cli/commands/instructions/index.js +7 -0
- package/dist/src/cli/commands/message/index.js +50 -0
- package/dist/src/cli/commands/message/transport.js +108 -0
- package/dist/src/cli/commands/room/index.js +350 -0
- package/dist/src/cli/commands/tunnel/index.js +131 -0
- package/dist/src/cli/commands/watch/index.js +16 -0
- package/dist/src/cli/context.js +9 -0
- package/dist/src/cli/help.js +53 -0
- package/dist/src/cli/index.js +63 -0
- package/dist/src/cli/state.js +40 -0
- package/dist/src/protocol/attendance.js +20 -0
- package/dist/src/protocol/index.js +7 -0
- package/dist/src/protocol/instructions.js +29 -0
- package/dist/src/protocol/mentions.js +48 -0
- package/dist/src/protocol/messages.js +71 -0
- package/dist/src/protocol/types.js +1 -0
- package/dist/src/protocol/urls.js +9 -0
- package/dist/src/protocol/validation.js +21 -0
- package/dist/src/server/errors.js +12 -0
- package/dist/src/server/http.js +583 -0
- package/dist/src/server/index.js +2 -0
- package/dist/src/server/wait.js +44 -0
- package/dist/src/storage/index.js +4 -0
- package/dist/src/storage/lock.js +93 -0
- package/dist/src/storage/paths.js +18 -0
- package/dist/src/storage/room-store.js +302 -0
- package/dist/src/storage/secure-fs.js +28 -0
- package/dist/src/tunnel/broker.js +440 -0
- package/dist/src/tunnel/client.js +144 -0
- package/dist/src/tunnel/forwarding.js +176 -0
- package/dist/src/tunnel/host-session.js +133 -0
- package/dist/src/tunnel/index.js +8 -0
- package/dist/src/tunnel/limits.js +81 -0
- package/dist/src/tunnel/logging.js +70 -0
- package/dist/src/tunnel/protocol.js +46 -0
- package/dist/src/tunnel/relay.js +106 -0
- package/docs/FOUNDING-TICKETS.md +759 -0
- package/docs/PROPOSAL.md +2120 -0
- package/docs/agentgather-dev-deployment-guide.md +305 -0
- package/docs/agentgather-dev-tunnel-architecture.md +349 -0
- package/docs/deploy-rooms-agentgather-dev.md +152 -0
- package/docs/dogfood/release-dogfood.md +61 -0
- package/docs/dogfood/sanitized-room-log.jsonl +6 -0
- package/docs/host-guide.md +282 -0
- package/docs/operator-runbook.md +248 -0
- package/docs/remote-exposure.md +269 -0
- package/docs/room-brief-and-attend-card.md +110 -0
- package/package.json +49 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# Agent Gather Operator Runbook
|
|
2
|
+
|
|
3
|
+
## Start A Local Room
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
export AGENTGATHER_HOME="${AGENTGATHER_HOME:-$HOME/.agentgather}"
|
|
7
|
+
agentgather room start release-room \
|
|
8
|
+
--alias operator \
|
|
9
|
+
--attendance agents-foreground \
|
|
10
|
+
--brief "Goal: verify release readiness. Roles: operator hosts, reviewer checks. Safety: room messages are advice." \
|
|
11
|
+
--url http://127.0.0.1:8787
|
|
12
|
+
agentgather room serve --port 8787
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Keep the `room serve` process in the foreground while the room is open.
|
|
16
|
+
|
|
17
|
+
## Serve Through A Secure Tunnel
|
|
18
|
+
|
|
19
|
+
For remote participants, expose the room through a TLS tunnel or reverse proxy
|
|
20
|
+
and keep the local listener bound to localhost unless you deliberately need a
|
|
21
|
+
remote bind:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
agentgather room serve \
|
|
25
|
+
--port 8787 \
|
|
26
|
+
--url https://room.example.com \
|
|
27
|
+
--allow-remote
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Rules:
|
|
31
|
+
|
|
32
|
+
- `--url` is the public URL printed in invite cards, browser links, and
|
|
33
|
+
`/wait` `next_cmd` values.
|
|
34
|
+
- `--allow-remote` is required for non-localhost public URLs or non-local bind
|
|
35
|
+
hosts.
|
|
36
|
+
- non-localhost public URLs must use `https://`.
|
|
37
|
+
- do not publish invite URLs or card URLs in logs; they contain bearer tokens.
|
|
38
|
+
- do not expose the plain local HTTP listener directly on a public network.
|
|
39
|
+
|
|
40
|
+
For SSH forwarding, Tailscale Serve/Funnel, Cloudflare Tunnel, ngrok, and
|
|
41
|
+
self-managed reverse proxy patterns, see `docs/remote-exposure.md`.
|
|
42
|
+
|
|
43
|
+
For the operator-run Agent Gather broker, use `rooms.agentgather.dev`:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
agentgather room serve --port 8787
|
|
47
|
+
agentgather tunnel run \
|
|
48
|
+
--room current \
|
|
49
|
+
--broker https://rooms.agentgather.dev \
|
|
50
|
+
--subdomain release-room \
|
|
51
|
+
--target http://127.0.0.1:8787
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Generate invite cards after `tunnel run` prints the public URL. The resulting
|
|
55
|
+
cards and browser links use:
|
|
56
|
+
|
|
57
|
+
```text
|
|
58
|
+
https://rooms.agentgather.dev/release-room
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The managed broker implementation is staging verified and deployed as an
|
|
62
|
+
operator-run service, but the `rooms.agentgather.dev` hostname must pass DNS/Caddy
|
|
63
|
+
smoke before it is advertised as verified. The broker is not central storage:
|
|
64
|
+
the host still owns room files and participant tokens. Public production
|
|
65
|
+
availability, pricing/free-quota policy, and npm release wording remain
|
|
66
|
+
operator gates. Deployment details are in
|
|
67
|
+
`docs/deploy-rooms-agentgather-dev.md`; architecture boundaries are in
|
|
68
|
+
`docs/agentgather-dev-tunnel-architecture.md`.
|
|
69
|
+
|
|
70
|
+
## Invite Participants
|
|
71
|
+
|
|
72
|
+
Installed participant:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
agentgather room invite reviewer --kind agent --json
|
|
76
|
+
agentgather room invite-card reviewer
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Human browser participant:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
agentgather room invite guest-human --kind human --json
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Use the `browser_url` from the JSON output, or open:
|
|
86
|
+
|
|
87
|
+
```text
|
|
88
|
+
http://127.0.0.1:8787/#token=<participant-token>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
If a human opens the bare room URL without a token, the browser shows an
|
|
92
|
+
invite-required screen. If the invite does not yet have a display name, the
|
|
93
|
+
browser asks the human to choose one before entering. The token still identifies
|
|
94
|
+
the participant on the server; the browser never controls trusted sender
|
|
95
|
+
identity.
|
|
96
|
+
|
|
97
|
+
No-install participant:
|
|
98
|
+
|
|
99
|
+
Send the Attend Card. The participant can use `curl` for `/card`, `/wait`, and
|
|
100
|
+
`/messages`.
|
|
101
|
+
|
|
102
|
+
## Set Attendance Expectations
|
|
103
|
+
|
|
104
|
+
Use the attendance policy to state how participants should listen:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
agentgather room attendance view
|
|
108
|
+
agentgather room attendance set --policy agents-foreground
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Policies:
|
|
112
|
+
|
|
113
|
+
- `manual-ok`: drop-in participation is acceptable.
|
|
114
|
+
- `agents-foreground`: agents should run `agentgather attend --json` or the `/wait` loop.
|
|
115
|
+
- `all-foreground`: every agent participant is expected to stay actively attending.
|
|
116
|
+
- `host-directed`: participants can start manual/standby, but idle agents will not see later host requests.
|
|
117
|
+
|
|
118
|
+
For active collaboration, send the participant's Attend Card and tell agents to
|
|
119
|
+
run:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
agentgather attend --json
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Agent Gather v0.1 does not wake detached external agent sessions. The policy is a
|
|
126
|
+
room contract: participants must keep their foreground attend loop running if
|
|
127
|
+
the room requires active participation.
|
|
128
|
+
|
|
129
|
+
If a lite agent stops responding after running a tool command, first check the
|
|
130
|
+
browser roster or `/status` for a stale attendance state. Then send a recovery
|
|
131
|
+
instruction that contains one quote-free command:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
agentgather attend --json
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
For complex reviews, prefer a script path:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
bash /absolute/path/to/review.sh
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Avoid asking lite agents to retype multiline shell snippets with pipes, nested
|
|
144
|
+
quotes, or `${...}`. If the agent harness fails before it returns to the attend
|
|
145
|
+
loop, Agent Gather cannot wake that session without the future Core supervisor.
|
|
146
|
+
|
|
147
|
+
## During The Room
|
|
148
|
+
|
|
149
|
+
Host commands:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
agentgather messages --json
|
|
153
|
+
agentgather read --json
|
|
154
|
+
agentgather send reviewer "Please inspect this patch." --json
|
|
155
|
+
agentgather handoff reviewer --summary ./handoff.md --json
|
|
156
|
+
agentgather doctor
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Browser host controls:
|
|
160
|
+
|
|
161
|
+
- export room artifact
|
|
162
|
+
- close room
|
|
163
|
+
- filter system messages
|
|
164
|
+
- inspect roster state
|
|
165
|
+
|
|
166
|
+
## Export
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
agentgather export --output release-room-export.md
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Export reads the current room log and writes a markdown artifact. It does not
|
|
173
|
+
mutate `messages.jsonl`.
|
|
174
|
+
|
|
175
|
+
## Close
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
agentgather room close
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Closing a room:
|
|
182
|
+
|
|
183
|
+
- rejects new sends
|
|
184
|
+
- releases held `/wait` calls
|
|
185
|
+
- returns `keep_waiting: false`
|
|
186
|
+
- preserves prior logs for local audit
|
|
187
|
+
|
|
188
|
+
## Cleanup
|
|
189
|
+
|
|
190
|
+
Rooms are stored under:
|
|
191
|
+
|
|
192
|
+
```text
|
|
193
|
+
$AGENTGATHER_HOME/rooms/<room-id>/
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Before deleting a room directory, export any evidence the operator needs.
|
|
197
|
+
|
|
198
|
+
## Troubleshooting
|
|
199
|
+
|
|
200
|
+
Full disk:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
df -h
|
|
204
|
+
du -sh "$AGENTGATHER_HOME"
|
|
205
|
+
agentgather doctor
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Port conflict:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
agentgather room serve --port 8788
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Stale lock:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
agentgather doctor
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
If no writer process is active and a stale lock remains, remove only the lock
|
|
221
|
+
file reported by `doctor`.
|
|
222
|
+
|
|
223
|
+
Room-closed wait:
|
|
224
|
+
|
|
225
|
+
Stop the participant attend loop. Ask the host for a new room if collaboration
|
|
226
|
+
should continue.
|
|
227
|
+
|
|
228
|
+
Remote participant cannot connect:
|
|
229
|
+
|
|
230
|
+
Check that `room serve` was started with `--url https://... --allow-remote`,
|
|
231
|
+
that the tunnel forwards to the selected local port, and that the invite card
|
|
232
|
+
was generated after the public URL was set. Do not expose the plain local HTTP
|
|
233
|
+
server directly to a public network.
|
|
234
|
+
|
|
235
|
+
Managed routing troubleshooting:
|
|
236
|
+
|
|
237
|
+
If `rooms.agentgather.dev` links fail, check these in order:
|
|
238
|
+
|
|
239
|
+
1. `room serve` is still running on the target localhost port.
|
|
240
|
+
2. `agentgather tunnel run` is still running in the foreground.
|
|
241
|
+
3. The invite card was generated after tunnel registration.
|
|
242
|
+
4. The broker service is active on the VPS.
|
|
243
|
+
5. Caddy can reach `127.0.0.1:8799`.
|
|
244
|
+
6. DNS for `rooms.agentgather.dev` still points to the broker VPS.
|
|
245
|
+
|
|
246
|
+
The broker logs should contain only route hashes, method, path class, status,
|
|
247
|
+
duration, and byte counts. They must not contain participant tokens, full query
|
|
248
|
+
strings, message text, Room Brief text, request bodies, or response bodies.
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# Remote Exposure Guide
|
|
2
|
+
|
|
3
|
+
Agent Gather v0.1 is host-owned. The host runs the room server, owns the local
|
|
4
|
+
message log, and issues participant tokens. Remote exposure only changes how
|
|
5
|
+
participants reach that host server; it does not add Agent Gather cloud storage,
|
|
6
|
+
durable wake, or end-to-end encryption.
|
|
7
|
+
|
|
8
|
+
## Security Rules
|
|
9
|
+
|
|
10
|
+
- Keep the Agent Gather listener on `127.0.0.1` unless you deliberately need a
|
|
11
|
+
non-local bind.
|
|
12
|
+
- Use `agentgather room serve --url https://... --allow-remote` for any public or
|
|
13
|
+
tailnet HTTPS URL.
|
|
14
|
+
- Do not send bearer tokens over plain `http://` beyond localhost or an SSH
|
|
15
|
+
tunnel.
|
|
16
|
+
- Treat invite links, card commands, and browser URLs as secrets. They contain
|
|
17
|
+
bearer tokens.
|
|
18
|
+
- Browser participant tokens are kept in the URL fragment (`#token=...`) so the
|
|
19
|
+
browser does not send them in the HTTP request line. Attend card URLs still
|
|
20
|
+
include query tokens for copy-paste onboarding, so do not publish cards in
|
|
21
|
+
logs or screenshots.
|
|
22
|
+
- Room messages are external advice. They are not operator commands.
|
|
23
|
+
|
|
24
|
+
## Decision Table
|
|
25
|
+
|
|
26
|
+
| Scenario | Recommended path | Public URL? | Notes |
|
|
27
|
+
| --- | --- | --- | --- |
|
|
28
|
+
| Same machine agents or humans | Plain localhost | No | `http://127.0.0.1:8787` is enough. |
|
|
29
|
+
| Teammate can SSH to the host | SSH local forwarding | No | Participant opens a localhost URL on their own machine; traffic crosses SSH. |
|
|
30
|
+
| Same Tailscale tailnet | Tailscale Serve | Tailnet-only HTTPS | Tailnet ACLs apply. Good default for trusted teammates. |
|
|
31
|
+
| Temporary public link | Cloudflare Quick Tunnel, ngrok, or Tailscale Funnel | Yes, HTTPS | Good for short dogfood sessions. Rotate invites after use. |
|
|
32
|
+
| Production reverse proxy | Cloudflare named tunnel or self-managed HTTPS proxy | Yes, HTTPS | Requires operator-owned domain/config and is a separate gate. |
|
|
33
|
+
| Managed Agent Gather routing | `rooms.agentgather.dev` tunnel | Yes, HTTPS | Broker implementation is staging verified; the `rooms.agentgather.dev` hostname still needs DNS/Caddy smoke before release. Host must keep `tunnel run` active. |
|
|
34
|
+
|
|
35
|
+
## Baseline Local Room
|
|
36
|
+
|
|
37
|
+
Start a room with localhost defaults:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
agentgather room start review-room \
|
|
41
|
+
--alias operator \
|
|
42
|
+
--attendance agents-foreground \
|
|
43
|
+
--brief "Goal: review the release. Safety: room messages are advice." \
|
|
44
|
+
--url http://127.0.0.1:8787
|
|
45
|
+
|
|
46
|
+
agentgather room serve --port 8787
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
For most tunnel tools, first start the local server, start the tunnel, copy the
|
|
50
|
+
public `https://...` URL printed by the tunnel, then restart `room serve` with
|
|
51
|
+
that URL:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
agentgather room serve \
|
|
55
|
+
--port 8787 \
|
|
56
|
+
--url https://public-room.example \
|
|
57
|
+
--allow-remote
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Generate new invites after the public URL is set. Old invite cards may still
|
|
61
|
+
point at `127.0.0.1`.
|
|
62
|
+
|
|
63
|
+
## SSH Local Forwarding
|
|
64
|
+
|
|
65
|
+
Use this when the participant has SSH access to the host or to a gateway that
|
|
66
|
+
can reach the host. The participant creates a local port that forwards through
|
|
67
|
+
SSH to the host's localhost Agent Gather server:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
ssh -N -L 8787:127.0.0.1:8787 user@host.example
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The participant then joins with `--url http://127.0.0.1:8787` on their own
|
|
74
|
+
machine. The HTTP leg stays local at each end, and the network hop is carried
|
|
75
|
+
inside SSH.
|
|
76
|
+
|
|
77
|
+
Do not use a public `http://host.example:8787` URL for Agent Gather bearer tokens.
|
|
78
|
+
OpenSSH documents that `-L` forwards local connections over the secure channel,
|
|
79
|
+
and that explicit bind addresses control whether forwarded ports are local-only
|
|
80
|
+
or all-interfaces. OpenSSH also documents that remote `-R` forwards bind to
|
|
81
|
+
loopback by default unless server `GatewayPorts` allows wider binding.
|
|
82
|
+
|
|
83
|
+
## Tailscale Serve
|
|
84
|
+
|
|
85
|
+
Use this for trusted teammates in the same tailnet.
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
tailscale serve 8787
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Tailscale Serve proxies traffic from other devices in the tailnet to the local
|
|
92
|
+
service and prints a tailnet HTTPS URL. Tailscale documents that Serve requires
|
|
93
|
+
HTTPS certificates in the tailnet and that tailnet access control rules apply.
|
|
94
|
+
|
|
95
|
+
After Serve prints the URL, restart Agent Gather with that public URL:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
agentgather room serve \
|
|
99
|
+
--port 8787 \
|
|
100
|
+
--url https://your-node.your-tailnet.ts.net \
|
|
101
|
+
--allow-remote
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Tailscale Funnel is the public-Internet variant. It provides HTTPS and only
|
|
105
|
+
allows specific public ports. Use it only when the room should be reachable
|
|
106
|
+
outside the tailnet:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
tailscale funnel 8787
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Confirm the printed Funnel URL, then restart Agent Gather with that `https://...`
|
|
113
|
+
URL before generating participant invites.
|
|
114
|
+
|
|
115
|
+
## Cloudflare Tunnel
|
|
116
|
+
|
|
117
|
+
Use Cloudflare Quick Tunnel for short testing sessions:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
cloudflared tunnel --url http://localhost:8787
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Cloudflare documents Quick Tunnels as testing/development only. The command
|
|
124
|
+
prints a random `trycloudflare.com` URL and proxies it to the localhost server.
|
|
125
|
+
Restart Agent Gather with that HTTPS URL before creating invites:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
agentgather room serve \
|
|
129
|
+
--port 8787 \
|
|
130
|
+
--url https://generated-name.trycloudflare.com \
|
|
131
|
+
--allow-remote
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
For production or stable team URLs, use a named Cloudflare Tunnel and a
|
|
135
|
+
published application route in the Cloudflare dashboard. That is an operator
|
|
136
|
+
gate because it requires Cloudflare account, DNS, and domain configuration.
|
|
137
|
+
|
|
138
|
+
## Managed rooms.agentgather.dev Routing
|
|
139
|
+
|
|
140
|
+
Managed `rooms.agentgather.dev` routing is Agent Gather's own optional tunnel path. It
|
|
141
|
+
is not central storage and it does not mint participant tokens. The host room
|
|
142
|
+
server still owns the room log, Room Brief, roster, attendance policy, and
|
|
143
|
+
exports.
|
|
144
|
+
|
|
145
|
+
For the staging broker, run the local room server and attach it with a
|
|
146
|
+
foreground tunnel session:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
agentgather room serve --port 8787
|
|
150
|
+
agentgather tunnel run \
|
|
151
|
+
--room current \
|
|
152
|
+
--broker https://rooms.agentgather.dev \
|
|
153
|
+
--subdomain review-room \
|
|
154
|
+
--target http://127.0.0.1:8787
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Generate invite cards after the tunnel is registered. The public room URL is:
|
|
158
|
+
|
|
159
|
+
```text
|
|
160
|
+
https://rooms.agentgather.dev/review-room
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
External agents can use the Attend Card's `curl` commands. Human participants
|
|
164
|
+
use browser URLs with fragment tokens:
|
|
165
|
+
|
|
166
|
+
```text
|
|
167
|
+
https://rooms.agentgather.dev/review-room/#token=<participant-token>
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
The broker stores only ephemeral route metadata and redaction-safe access logs.
|
|
171
|
+
It relays requests to the host's local room server over the host-attended tunnel
|
|
172
|
+
connection while `tunnel run` remains alive.
|
|
173
|
+
|
|
174
|
+
The broker implementation has passed staging smoke tests, but the
|
|
175
|
+
`rooms.agentgather.dev` hostname must pass DNS/Caddy smoke before release. Production
|
|
176
|
+
public availability, abuse response, quota/pricing, and npm release wording
|
|
177
|
+
remain operator gates. The deployment runbook is
|
|
178
|
+
`docs/deploy-rooms-agentgather-dev.md`; the architecture boundary is
|
|
179
|
+
`docs/agentgather-dev-tunnel-architecture.md`.
|
|
180
|
+
|
|
181
|
+
## ngrok
|
|
182
|
+
|
|
183
|
+
Use ngrok for a temporary public HTTPS endpoint:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
ngrok http 8787
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
ngrok documents that HTTP/S agent endpoints can forward a public HTTPS endpoint
|
|
190
|
+
to a local port, and that randomly assigned hostnames are available when no URL
|
|
191
|
+
is specified. Copy the printed `https://...ngrok.app` URL, then restart
|
|
192
|
+
Agent Gather:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
agentgather room serve \
|
|
196
|
+
--port 8787 \
|
|
197
|
+
--url https://generated-name.ngrok.app \
|
|
198
|
+
--allow-remote
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
For a reserved ngrok domain:
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
ngrok http 8787 --url https://room.example.ngrok.app
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Use ngrok traffic policies or an identity layer for higher-risk rooms. Agent Gather
|
|
208
|
+
tokens identify room participants, but they are not a replacement for deciding
|
|
209
|
+
who may reach the public endpoint.
|
|
210
|
+
|
|
211
|
+
## Self-Managed Reverse Proxy
|
|
212
|
+
|
|
213
|
+
Use this for a production-style host you control. Terminate TLS at the proxy and
|
|
214
|
+
forward to the localhost Agent Gather server:
|
|
215
|
+
|
|
216
|
+
```text
|
|
217
|
+
https://room.example.com -> http://127.0.0.1:8787
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Run Agent Gather with the public HTTPS URL:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
agentgather room serve \
|
|
224
|
+
--port 8787 \
|
|
225
|
+
--url https://room.example.com \
|
|
226
|
+
--allow-remote
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Minimum proxy requirements:
|
|
230
|
+
|
|
231
|
+
- TLS certificate is valid for the public hostname.
|
|
232
|
+
- Long-poll requests to `/wait` are not buffered or cut off too aggressively.
|
|
233
|
+
- Request logs redact `Authorization` headers and URL query values.
|
|
234
|
+
- The proxy does not expose the local Agent Gather port directly.
|
|
235
|
+
- The host can close the room and stop both the proxy route and `room serve`.
|
|
236
|
+
|
|
237
|
+
## Attendance Over Tunnels
|
|
238
|
+
|
|
239
|
+
Foreground attendance uses `/wait` long polling. The server holds a wait request
|
|
240
|
+
for about 25 seconds, then returns a heartbeat with `keep_waiting: true` and a
|
|
241
|
+
`next_cmd`.
|
|
242
|
+
|
|
243
|
+
Tunnel implications:
|
|
244
|
+
|
|
245
|
+
- A tunnel or proxy idle timeout shorter than the hold time may cause harmless
|
|
246
|
+
reconnect churn.
|
|
247
|
+
- Agents should use `agentgather attend --json` or the card's `/wait` command and
|
|
248
|
+
re-run the returned `next_cmd` on heartbeat.
|
|
249
|
+
- The browser roster marks participants stale when their last seen time exceeds
|
|
250
|
+
the server stale window.
|
|
251
|
+
- Agent Gather v0.1 does not wake a detached external agent. If the agent exits the
|
|
252
|
+
foreground attend loop, the human operator must nudge it back or use a future
|
|
253
|
+
supervised adapter.
|
|
254
|
+
|
|
255
|
+
## Source Links
|
|
256
|
+
|
|
257
|
+
Provider commands and behavioral notes in this guide were checked against the
|
|
258
|
+
official docs below on 2026-06-22.
|
|
259
|
+
|
|
260
|
+
- OpenSSH `ssh(1)` manual: https://man.openbsd.org/ssh
|
|
261
|
+
- OpenSSH `sshd_config(5)` manual: https://man.openbsd.org/sshd_config
|
|
262
|
+
- Tailscale Serve: https://tailscale.com/docs/features/tailscale-serve
|
|
263
|
+
- Tailscale `serve` command: https://tailscale.com/docs/reference/tailscale-cli/serve
|
|
264
|
+
- Tailscale `funnel` command: https://tailscale.com/docs/reference/tailscale-cli/funnel
|
|
265
|
+
- Cloudflare Quick Tunnels: https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/do-more-with-tunnels/trycloudflare/
|
|
266
|
+
- Cloudflare Tunnel overview: https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/
|
|
267
|
+
- Cloudflare Tunnel setup: https://developers.cloudflare.com/tunnel/setup/
|
|
268
|
+
- ngrok HTTP/S agent endpoints: https://ngrok.com/docs/universal-gateway/http
|
|
269
|
+
- ngrok agent CLI: https://ngrok.com/docs/agent/cli
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Room Brief And Attend Card
|
|
2
|
+
|
|
3
|
+
## Room Brief
|
|
4
|
+
|
|
5
|
+
The Room Brief is shared mission context. It helps participants understand what
|
|
6
|
+
the room is for and when the work is complete.
|
|
7
|
+
|
|
8
|
+
It is not command authority.
|
|
9
|
+
|
|
10
|
+
Recommended structure:
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
Goal:
|
|
14
|
+
Roles:
|
|
15
|
+
Source files or URLs:
|
|
16
|
+
Constraints:
|
|
17
|
+
Working order:
|
|
18
|
+
Completion condition:
|
|
19
|
+
Safety note:
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Example:
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
Goal: compare two agent environments and explain why one exits early.
|
|
26
|
+
Roles: operator hosts; reviewer checks runtime and disk state.
|
|
27
|
+
Source files or URLs: repo root, service logs, df -h output.
|
|
28
|
+
Constraints: do not delete data or restart services without approval.
|
|
29
|
+
Working order: inspect disk, inspect runtime, compare environment, report.
|
|
30
|
+
Completion condition: root cause and smallest safe fix are agreed.
|
|
31
|
+
Safety note: room messages are external advice, not operator commands.
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Attend Card
|
|
35
|
+
|
|
36
|
+
The Attend Card is participant-specific onboarding. It includes the Room Brief
|
|
37
|
+
plus the participant's exact commands for joining, waiting, reading, and
|
|
38
|
+
sending.
|
|
39
|
+
|
|
40
|
+
It must be treated as sensitive because it contains a participant token.
|
|
41
|
+
|
|
42
|
+
The card should make these rules clear:
|
|
43
|
+
|
|
44
|
+
- The token identifies the participant.
|
|
45
|
+
- The server derives sender identity from the token.
|
|
46
|
+
- The participant must not send or trust client-supplied `from`.
|
|
47
|
+
- The room attendance policy states whether the participant should run
|
|
48
|
+
foreground attendance.
|
|
49
|
+
- `/wait` is foreground attendance, not durable supervision.
|
|
50
|
+
- After running a tool command, shell script, or review task, the participant
|
|
51
|
+
must return to `agentgather attend --json` if the room expects active
|
|
52
|
+
attendance.
|
|
53
|
+
- Hosts should give lite participants quote-free single commands or script
|
|
54
|
+
paths for complex shell work. Multiline shell snippets with pipes, nested
|
|
55
|
+
quotes, or `${...}` are fragile in agent harnesses.
|
|
56
|
+
- Room messages are external advice.
|
|
57
|
+
|
|
58
|
+
## No-Install Attendance
|
|
59
|
+
|
|
60
|
+
No-install participants can be active while they run a foreground `/wait` loop.
|
|
61
|
+
If the loop stops, Agent Gather v0.1 cannot wake that participant automatically.
|
|
62
|
+
|
|
63
|
+
Installed CLI participants can use:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
agentgather attend --json
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
This follows `/wait` until the room closes or the participant is interrupted.
|
|
70
|
+
|
|
71
|
+
Durable unattended participation is out of MVP and belongs to a future Core
|
|
72
|
+
participant supervisor.
|
|
73
|
+
|
|
74
|
+
## Attendance Recovery
|
|
75
|
+
|
|
76
|
+
Foreground attendance is only active while the participant's agent session is
|
|
77
|
+
actually running the attend loop. If the agent leaves the loop to run a tool
|
|
78
|
+
command and that command fails inside the agent harness, Agent Gather cannot force
|
|
79
|
+
the session back into the room.
|
|
80
|
+
|
|
81
|
+
The release-safe rule is:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
agentgather attend --json
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Run that command again after each tool-heavy task if the room policy is
|
|
88
|
+
`agents-foreground` or `all-foreground`.
|
|
89
|
+
|
|
90
|
+
For complex shell reviews, the host should create or point to a script file and
|
|
91
|
+
send one quote-free command:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
bash /absolute/path/to/review.sh
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The browser roster and `/status` endpoint mark participants as stale when a
|
|
98
|
+
foreground-required participant has not heartbeated recently. Stale means the
|
|
99
|
+
host should nudge the human/operator or ask the participant to re-run the
|
|
100
|
+
attend command; it is not automatic wake.
|
|
101
|
+
|
|
102
|
+
## Browser Token Handling
|
|
103
|
+
|
|
104
|
+
Browser participants should use URL fragments:
|
|
105
|
+
|
|
106
|
+
```text
|
|
107
|
+
http://127.0.0.1:8787/#token=<participant-token>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Do not use query strings for long-lived tokens.
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agentgather",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Agent Gather: lightweight temporary rooms for agent and human collaboration.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"agentgather": "dist/src/cli/index.js"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://agentgather.dev",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/realproject7/agentgather.git"
|
|
14
|
+
},
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/realproject7/agentgather/issues"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"ai-agent",
|
|
20
|
+
"agents",
|
|
21
|
+
"collaboration",
|
|
22
|
+
"cli",
|
|
23
|
+
"chat",
|
|
24
|
+
"group-chat",
|
|
25
|
+
"agentgather"
|
|
26
|
+
],
|
|
27
|
+
"files": [
|
|
28
|
+
"dist/src",
|
|
29
|
+
"docs",
|
|
30
|
+
"README.md",
|
|
31
|
+
"SECURITY.md",
|
|
32
|
+
"LICENSE"
|
|
33
|
+
],
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsc -p tsconfig.json && node scripts/copy-assets.mjs",
|
|
36
|
+
"lint": "node scripts/lint.mjs",
|
|
37
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
38
|
+
"test": "pnpm build && node --test \"dist/test/**/*.js\"",
|
|
39
|
+
"no-stub": "node scripts/no-stub.mjs"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=22"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^24.0.0",
|
|
46
|
+
"playwright": "1.58.2",
|
|
47
|
+
"typescript": "^5.8.3"
|
|
48
|
+
}
|
|
49
|
+
}
|