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.
Files changed (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +418 -0
  3. package/SECURITY.md +104 -0
  4. package/dist/src/auth/index.js +1 -0
  5. package/dist/src/auth/tokens.js +12 -0
  6. package/dist/src/browser/room.css +666 -0
  7. package/dist/src/browser/room.html +80 -0
  8. package/dist/src/browser/room.js +435 -0
  9. package/dist/src/cli/args.js +29 -0
  10. package/dist/src/cli/commands/attend/index.js +26 -0
  11. package/dist/src/cli/commands/broker/index.js +61 -0
  12. package/dist/src/cli/commands/doctor/index.js +93 -0
  13. package/dist/src/cli/commands/export/index.js +42 -0
  14. package/dist/src/cli/commands/handoff/index.js +41 -0
  15. package/dist/src/cli/commands/instructions/index.js +7 -0
  16. package/dist/src/cli/commands/message/index.js +50 -0
  17. package/dist/src/cli/commands/message/transport.js +108 -0
  18. package/dist/src/cli/commands/room/index.js +350 -0
  19. package/dist/src/cli/commands/tunnel/index.js +131 -0
  20. package/dist/src/cli/commands/watch/index.js +16 -0
  21. package/dist/src/cli/context.js +9 -0
  22. package/dist/src/cli/help.js +53 -0
  23. package/dist/src/cli/index.js +63 -0
  24. package/dist/src/cli/state.js +40 -0
  25. package/dist/src/protocol/attendance.js +20 -0
  26. package/dist/src/protocol/index.js +7 -0
  27. package/dist/src/protocol/instructions.js +29 -0
  28. package/dist/src/protocol/mentions.js +48 -0
  29. package/dist/src/protocol/messages.js +71 -0
  30. package/dist/src/protocol/types.js +1 -0
  31. package/dist/src/protocol/urls.js +9 -0
  32. package/dist/src/protocol/validation.js +21 -0
  33. package/dist/src/server/errors.js +12 -0
  34. package/dist/src/server/http.js +583 -0
  35. package/dist/src/server/index.js +2 -0
  36. package/dist/src/server/wait.js +44 -0
  37. package/dist/src/storage/index.js +4 -0
  38. package/dist/src/storage/lock.js +93 -0
  39. package/dist/src/storage/paths.js +18 -0
  40. package/dist/src/storage/room-store.js +302 -0
  41. package/dist/src/storage/secure-fs.js +28 -0
  42. package/dist/src/tunnel/broker.js +440 -0
  43. package/dist/src/tunnel/client.js +144 -0
  44. package/dist/src/tunnel/forwarding.js +176 -0
  45. package/dist/src/tunnel/host-session.js +133 -0
  46. package/dist/src/tunnel/index.js +8 -0
  47. package/dist/src/tunnel/limits.js +81 -0
  48. package/dist/src/tunnel/logging.js +70 -0
  49. package/dist/src/tunnel/protocol.js +46 -0
  50. package/dist/src/tunnel/relay.js +106 -0
  51. package/docs/FOUNDING-TICKETS.md +759 -0
  52. package/docs/PROPOSAL.md +2120 -0
  53. package/docs/agentgather-dev-deployment-guide.md +305 -0
  54. package/docs/agentgather-dev-tunnel-architecture.md +349 -0
  55. package/docs/deploy-rooms-agentgather-dev.md +152 -0
  56. package/docs/dogfood/release-dogfood.md +61 -0
  57. package/docs/dogfood/sanitized-room-log.jsonl +6 -0
  58. package/docs/host-guide.md +282 -0
  59. package/docs/operator-runbook.md +248 -0
  60. package/docs/remote-exposure.md +269 -0
  61. package/docs/room-brief-and-attend-card.md +110 -0
  62. 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
+ }