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,666 @@
1
+ :root {
2
+ color-scheme: dark;
3
+ --bg: #0e1110;
4
+ --bg-elevated: #151918;
5
+ --panel: #1a1f1d;
6
+ --panel-strong: #202722;
7
+ --bubble: #202622;
8
+ --bubble-own: #0f4f48;
9
+ --bubble-system: #242017;
10
+ --text: #eef5f1;
11
+ --muted: #9aa7a1;
12
+ --muted-strong: #c3d0ca;
13
+ --line: #2d3632;
14
+ --line-strong: #40504a;
15
+ --accent: #35d0ba;
16
+ --accent-strong: #78f3df;
17
+ --accent-soft: #123d39;
18
+ --warn: #f2bd59;
19
+ --warn-soft: #3b2c13;
20
+ --danger: #ff7a7a;
21
+ --danger-soft: #3a1c1f;
22
+ --code-bg: #101413;
23
+ --focus: #7dd3fc;
24
+ --radius: 8px;
25
+ --font: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
26
+ --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
27
+ }
28
+
29
+ * {
30
+ box-sizing: border-box;
31
+ }
32
+
33
+ html,
34
+ body {
35
+ height: 100%;
36
+ }
37
+
38
+ body {
39
+ margin: 0;
40
+ min-width: 320px;
41
+ min-height: 100vh;
42
+ background:
43
+ radial-gradient(circle at 12% 0%, rgba(53, 208, 186, 0.08), transparent 26rem),
44
+ linear-gradient(180deg, #101412 0%, var(--bg) 42%, #0a0c0b 100%);
45
+ color: var(--text);
46
+ font-family: var(--font);
47
+ }
48
+
49
+ button,
50
+ input,
51
+ textarea {
52
+ font: inherit;
53
+ }
54
+
55
+ button:focus-visible,
56
+ input:focus-visible,
57
+ textarea:focus-visible,
58
+ a:focus-visible {
59
+ outline: 2px solid var(--focus);
60
+ outline-offset: 2px;
61
+ }
62
+
63
+ button {
64
+ cursor: pointer;
65
+ }
66
+
67
+ .room-shell {
68
+ min-height: 100vh;
69
+ max-height: 100vh;
70
+ display: grid;
71
+ grid-template-rows: auto auto minmax(0, 1fr) auto;
72
+ background: rgba(14, 17, 16, 0.82);
73
+ }
74
+
75
+ .topbar {
76
+ display: flex;
77
+ align-items: center;
78
+ justify-content: space-between;
79
+ gap: 16px;
80
+ padding: 12px 16px;
81
+ border-bottom: 1px solid var(--line);
82
+ background: rgba(21, 25, 24, 0.96);
83
+ backdrop-filter: blur(16px);
84
+ }
85
+
86
+ .room-heading {
87
+ min-width: 0;
88
+ }
89
+
90
+ .eyebrow {
91
+ color: var(--accent);
92
+ font-size: 11px;
93
+ font-weight: 700;
94
+ letter-spacing: 0;
95
+ line-height: 1.2;
96
+ text-transform: uppercase;
97
+ }
98
+
99
+ h1 {
100
+ margin: 4px 0 0;
101
+ color: var(--text);
102
+ font-size: 18px;
103
+ font-weight: 700;
104
+ line-height: 1.25;
105
+ overflow-wrap: anywhere;
106
+ }
107
+
108
+ .topbar-meta {
109
+ display: flex;
110
+ align-items: center;
111
+ justify-content: flex-end;
112
+ flex-wrap: wrap;
113
+ gap: 8px;
114
+ color: var(--muted);
115
+ font-size: 12px;
116
+ }
117
+
118
+ .topbar-meta span,
119
+ .icon-button {
120
+ min-height: 28px;
121
+ display: inline-flex;
122
+ align-items: center;
123
+ border: 1px solid var(--line);
124
+ border-radius: 999px;
125
+ background: rgba(32, 39, 34, 0.86);
126
+ color: var(--muted-strong);
127
+ }
128
+
129
+ .topbar-meta span {
130
+ padding: 0 12px;
131
+ }
132
+
133
+ .status-dot::before {
134
+ content: "";
135
+ display: inline-block;
136
+ width: 8px;
137
+ height: 8px;
138
+ margin-right: 8px;
139
+ border-radius: 50%;
140
+ background: var(--accent);
141
+ box-shadow: 0 0 12px rgba(53, 208, 186, 0.7);
142
+ }
143
+
144
+ .status-dot[data-status="closed"]::before {
145
+ background: var(--danger);
146
+ box-shadow: 0 0 12px rgba(255, 122, 122, 0.6);
147
+ }
148
+
149
+ .icon-button,
150
+ .rail-actions button,
151
+ .composer button,
152
+ .brief-refresh,
153
+ .join-form button {
154
+ border: 1px solid var(--line-strong);
155
+ border-radius: 8px;
156
+ background: var(--panel-strong);
157
+ color: var(--text);
158
+ }
159
+
160
+ .icon-button:hover,
161
+ .rail-actions button:hover,
162
+ .brief-refresh:hover {
163
+ border-color: var(--accent);
164
+ color: var(--accent-strong);
165
+ }
166
+
167
+ .join-form button:hover,
168
+ .composer button:hover {
169
+ background: var(--accent-strong);
170
+ }
171
+
172
+ .icon-button:active,
173
+ .rail-actions button:active,
174
+ .brief-refresh:active,
175
+ .join-form button:active,
176
+ .composer button:active {
177
+ transform: translateY(1px);
178
+ }
179
+
180
+ button:disabled {
181
+ cursor: not-allowed;
182
+ opacity: 0.55;
183
+ }
184
+
185
+ .icon-button {
186
+ display: none;
187
+ padding: 0 12px;
188
+ }
189
+
190
+ .brief-panel {
191
+ margin: 0;
192
+ padding: 12px 16px;
193
+ border-bottom: 1px solid var(--line);
194
+ background: rgba(18, 22, 21, 0.88);
195
+ }
196
+
197
+ .brief-heading {
198
+ display: flex;
199
+ align-items: center;
200
+ justify-content: space-between;
201
+ gap: 12px;
202
+ color: var(--muted-strong);
203
+ font-size: 12px;
204
+ font-weight: 700;
205
+ list-style: none;
206
+ text-transform: uppercase;
207
+ }
208
+
209
+ .brief-heading::-webkit-details-marker {
210
+ display: none;
211
+ }
212
+
213
+ .brief-heading::before {
214
+ content: "+";
215
+ width: 20px;
216
+ height: 20px;
217
+ display: inline-grid;
218
+ place-items: center;
219
+ border: 1px solid var(--line);
220
+ border-radius: 50%;
221
+ color: var(--accent);
222
+ }
223
+
224
+ .brief-panel[open] .brief-heading::before {
225
+ content: "-";
226
+ }
227
+
228
+ .brief-refresh {
229
+ margin-top: 8px;
230
+ min-height: 32px;
231
+ padding: 0 12px;
232
+ background: var(--accent-soft);
233
+ color: var(--accent-strong);
234
+ }
235
+
236
+ #brief-body {
237
+ margin: 8px 0 0;
238
+ max-width: 980px;
239
+ max-height: 64px;
240
+ overflow: auto;
241
+ color: var(--muted-strong);
242
+ font-size: 13px;
243
+ line-height: 1.45;
244
+ white-space: pre-wrap;
245
+ }
246
+
247
+ .auth-error {
248
+ align-self: start;
249
+ width: min(464px, calc(100% - 32px));
250
+ margin: 16px auto 0;
251
+ padding: 16px;
252
+ border: 1px solid var(--line-strong);
253
+ border-radius: var(--radius);
254
+ background: var(--panel);
255
+ box-shadow: 0 16px 60px rgba(0, 0, 0, 0.26);
256
+ }
257
+
258
+ .auth-error h2 {
259
+ margin: 0 0 8px;
260
+ font-size: 18px;
261
+ }
262
+
263
+ .auth-error p {
264
+ margin: 0;
265
+ color: var(--muted);
266
+ line-height: 1.5;
267
+ }
268
+
269
+ .room-shell[data-state="auth-error"] .brief-panel,
270
+ .room-shell[data-state="auth-error"] .workspace,
271
+ .room-shell[data-state="auth-error"] .composer,
272
+ .room-shell[data-state="joining"] .brief-panel,
273
+ .room-shell[data-state="joining"] .workspace,
274
+ .room-shell[data-state="joining"] .composer {
275
+ display: none;
276
+ }
277
+
278
+ .join-form {
279
+ display: grid;
280
+ gap: 12px;
281
+ margin-top: 16px;
282
+ }
283
+
284
+ .join-form label {
285
+ display: grid;
286
+ gap: 8px;
287
+ color: var(--muted);
288
+ font-size: 13px;
289
+ }
290
+
291
+ .join-form input,
292
+ .composer textarea {
293
+ color: var(--text);
294
+ border: 1px solid var(--line-strong);
295
+ background: #101413;
296
+ }
297
+
298
+ .join-form input {
299
+ min-height: 40px;
300
+ border-radius: 8px;
301
+ padding: 0 12px;
302
+ }
303
+
304
+ .join-form button {
305
+ min-height: 40px;
306
+ background: var(--accent);
307
+ border-color: var(--accent);
308
+ color: #071210;
309
+ font-weight: 700;
310
+ }
311
+
312
+ .workspace {
313
+ min-height: 0;
314
+ display: grid;
315
+ grid-template-columns: minmax(0, 1fr) 280px;
316
+ }
317
+
318
+ .timeline-wrap {
319
+ min-height: 0;
320
+ overflow: auto;
321
+ padding: 16px;
322
+ scroll-behavior: smooth;
323
+ }
324
+
325
+ .system-filter {
326
+ display: inline-flex;
327
+ align-items: center;
328
+ gap: 8px;
329
+ margin-bottom: 12px;
330
+ color: var(--muted);
331
+ font-size: 12px;
332
+ }
333
+
334
+ .system-filter input {
335
+ accent-color: var(--accent);
336
+ }
337
+
338
+ .empty-state {
339
+ width: min(420px, 100%);
340
+ margin: 40px auto;
341
+ color: var(--muted);
342
+ text-align: center;
343
+ }
344
+
345
+ .timeline {
346
+ width: min(920px, 100%);
347
+ list-style: none;
348
+ margin: 0 auto;
349
+ padding: 0;
350
+ display: grid;
351
+ gap: 12px;
352
+ }
353
+
354
+ .message {
355
+ display: flex;
356
+ justify-content: flex-start;
357
+ }
358
+
359
+ .message.own {
360
+ justify-content: flex-end;
361
+ }
362
+
363
+ .message-bubble {
364
+ max-width: min(720px, 82%);
365
+ min-width: 0;
366
+ padding: 8px 12px;
367
+ border: 1px solid rgba(255, 255, 255, 0.05);
368
+ border-radius: 8px;
369
+ background: var(--bubble);
370
+ box-shadow: 0 8px 22px rgba(0, 0, 0, 0.16);
371
+ }
372
+
373
+ .message.own .message-bubble {
374
+ background: linear-gradient(180deg, #115e55 0%, var(--bubble-own) 100%);
375
+ }
376
+
377
+ .message-meta {
378
+ display: flex;
379
+ align-items: baseline;
380
+ justify-content: space-between;
381
+ gap: 12px;
382
+ margin-bottom: 4px;
383
+ }
384
+
385
+ .message-time,
386
+ .message-from {
387
+ color: var(--muted);
388
+ font-size: 11px;
389
+ line-height: 1.35;
390
+ }
391
+
392
+ .message-from {
393
+ color: var(--accent-strong);
394
+ font-weight: 700;
395
+ overflow-wrap: anywhere;
396
+ }
397
+
398
+ .message.own .message-from,
399
+ .message.own .message-time {
400
+ color: #d5fff6;
401
+ }
402
+
403
+ .message-text {
404
+ min-width: 0;
405
+ color: var(--text);
406
+ font-size: 14px;
407
+ line-height: 1.48;
408
+ white-space: pre-wrap;
409
+ overflow-wrap: anywhere;
410
+ }
411
+
412
+ .message.system {
413
+ justify-content: center;
414
+ }
415
+
416
+ .system-pill {
417
+ max-width: min(640px, 92%);
418
+ display: flex;
419
+ align-items: center;
420
+ justify-content: center;
421
+ gap: 8px;
422
+ padding: 4px 8px;
423
+ border: 1px solid rgba(242, 189, 89, 0.18);
424
+ border-radius: 999px;
425
+ background: var(--bubble-system);
426
+ }
427
+
428
+ .system-pill .message-text {
429
+ color: var(--warn);
430
+ font-size: 12px;
431
+ }
432
+
433
+ .system-pill .message-time {
434
+ color: rgba(242, 189, 89, 0.78);
435
+ }
436
+
437
+ .mention {
438
+ color: var(--accent-strong);
439
+ font-weight: 800;
440
+ }
441
+
442
+ a {
443
+ color: var(--accent-strong);
444
+ }
445
+
446
+ code,
447
+ pre {
448
+ font-family: var(--mono);
449
+ background: var(--code-bg);
450
+ border: 1px solid var(--line);
451
+ border-radius: 8px;
452
+ }
453
+
454
+ code {
455
+ padding: 1px 4px;
456
+ }
457
+
458
+ pre {
459
+ margin: 8px 0;
460
+ padding: 8px;
461
+ overflow-x: auto;
462
+ }
463
+
464
+ .roster {
465
+ min-height: 0;
466
+ overflow: auto;
467
+ border-left: 1px solid var(--line);
468
+ background: rgba(18, 22, 21, 0.94);
469
+ padding: 16px;
470
+ }
471
+
472
+ .rail-title {
473
+ margin-bottom: 12px;
474
+ color: var(--muted);
475
+ font-size: 12px;
476
+ font-weight: 800;
477
+ text-transform: uppercase;
478
+ }
479
+
480
+ #participant-list {
481
+ list-style: none;
482
+ margin: 0;
483
+ padding: 0;
484
+ display: grid;
485
+ gap: 8px;
486
+ }
487
+
488
+ .participant {
489
+ display: grid;
490
+ gap: 4px;
491
+ padding: 12px;
492
+ border: 1px solid var(--line);
493
+ border-radius: 8px;
494
+ background: rgba(32, 39, 34, 0.62);
495
+ }
496
+
497
+ .participant strong {
498
+ color: var(--text);
499
+ overflow-wrap: anywhere;
500
+ }
501
+
502
+ .participant span {
503
+ color: var(--muted);
504
+ font-size: 12px;
505
+ }
506
+
507
+ .participant-status {
508
+ width: fit-content;
509
+ padding: 2px 8px;
510
+ border: 1px solid var(--line);
511
+ border-radius: 999px;
512
+ background: #161b19;
513
+ color: var(--muted);
514
+ font-size: 11px;
515
+ line-height: 1.2;
516
+ }
517
+
518
+ .participant[data-attendance-state="attending"] .participant-status,
519
+ .participant[data-attendance-state="managed"] .participant-status {
520
+ border-color: rgba(53, 208, 186, 0.4);
521
+ background: var(--accent-soft);
522
+ color: var(--accent-strong);
523
+ }
524
+
525
+ .participant[data-attendance-state="not_attending"] .participant-status,
526
+ .participant[data-attendance-state="stale"] .participant-status {
527
+ border-color: rgba(242, 189, 89, 0.5);
528
+ background: var(--warn-soft);
529
+ color: var(--warn);
530
+ }
531
+
532
+ .rail-actions {
533
+ display: grid;
534
+ gap: 8px;
535
+ margin-top: 16px;
536
+ }
537
+
538
+ .rail-actions button {
539
+ min-height: 36px;
540
+ color: var(--muted-strong);
541
+ }
542
+
543
+ .composer {
544
+ display: grid;
545
+ grid-template-columns: minmax(0, 1fr) auto;
546
+ gap: 12px;
547
+ padding: 12px 16px;
548
+ border-top: 1px solid var(--line);
549
+ background: rgba(21, 25, 24, 0.98);
550
+ backdrop-filter: blur(16px);
551
+ }
552
+
553
+ .reply-indicator {
554
+ grid-column: 1 / -1;
555
+ color: var(--accent-strong);
556
+ font-size: 12px;
557
+ }
558
+
559
+ .composer textarea {
560
+ width: 100%;
561
+ max-height: 144px;
562
+ min-height: 44px;
563
+ resize: none;
564
+ border-radius: 8px;
565
+ padding: 12px;
566
+ line-height: 1.45;
567
+ }
568
+
569
+ .composer textarea::placeholder {
570
+ color: #6f7d76;
571
+ }
572
+
573
+ .composer button {
574
+ align-self: end;
575
+ min-width: 88px;
576
+ min-height: 44px;
577
+ background: var(--accent);
578
+ border-color: var(--accent);
579
+ color: #06110f;
580
+ font-weight: 800;
581
+ }
582
+
583
+ .room-shell[data-state="closed"] .composer button,
584
+ .room-shell[data-state="closed"] .composer textarea {
585
+ opacity: 0.55;
586
+ }
587
+
588
+ .send-error {
589
+ grid-column: 1 / -1;
590
+ padding: 8px 12px;
591
+ border: 1px solid rgba(255, 122, 122, 0.35);
592
+ border-radius: 8px;
593
+ background: var(--danger-soft);
594
+ color: var(--danger);
595
+ font-size: 13px;
596
+ }
597
+
598
+ .timeline.hide-system .message.system {
599
+ display: none;
600
+ }
601
+
602
+ @media (max-width: 820px) {
603
+ .topbar {
604
+ align-items: flex-start;
605
+ padding: 12px;
606
+ }
607
+
608
+ .topbar-meta {
609
+ gap: 8px;
610
+ }
611
+
612
+ .topbar-meta span {
613
+ padding: 0 8px;
614
+ }
615
+
616
+ .icon-button {
617
+ display: inline-flex;
618
+ align-items: center;
619
+ }
620
+
621
+ .brief-panel {
622
+ padding: 8px 12px;
623
+ }
624
+
625
+ #brief-body {
626
+ max-height: 56px;
627
+ font-size: 12px;
628
+ }
629
+
630
+ .workspace {
631
+ grid-template-columns: minmax(0, 1fr);
632
+ }
633
+
634
+ .timeline-wrap {
635
+ padding: 12px;
636
+ }
637
+
638
+ .timeline {
639
+ gap: 8px;
640
+ }
641
+
642
+ .message-bubble {
643
+ max-width: 88%;
644
+ }
645
+
646
+ .roster {
647
+ display: none;
648
+ order: -1;
649
+ border-left: 0;
650
+ border-top: 1px solid var(--line);
651
+ max-height: 36vh;
652
+ }
653
+
654
+ .room-shell.roster-open .roster {
655
+ display: block;
656
+ }
657
+
658
+ .composer {
659
+ grid-template-columns: minmax(0, 1fr);
660
+ padding: 12px;
661
+ }
662
+
663
+ .composer button {
664
+ width: 100%;
665
+ }
666
+ }