agentcorp-broker 0.1.0-alpha.1

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 (71) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/CONTRIBUTING.md +20 -0
  3. package/LICENSE +201 -0
  4. package/README.md +250 -0
  5. package/SECURITY.md +23 -0
  6. package/dist/audit.d.ts +25 -0
  7. package/dist/audit.js +203 -0
  8. package/dist/audit.js.map +1 -0
  9. package/dist/broker.d.ts +103 -0
  10. package/dist/broker.js +805 -0
  11. package/dist/broker.js.map +1 -0
  12. package/dist/cli.d.ts +2 -0
  13. package/dist/cli.js +712 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config.d.ts +3 -0
  16. package/dist/config.js +41 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/console/console.css +794 -0
  19. package/dist/console/console.js +802 -0
  20. package/dist/console/index.html +309 -0
  21. package/dist/credentials.d.ts +16 -0
  22. package/dist/credentials.js +72 -0
  23. package/dist/credentials.js.map +1 -0
  24. package/dist/database.d.ts +119 -0
  25. package/dist/database.js +1356 -0
  26. package/dist/database.js.map +1 -0
  27. package/dist/diagnostics.d.ts +44 -0
  28. package/dist/diagnostics.js +357 -0
  29. package/dist/diagnostics.js.map +1 -0
  30. package/dist/errors.d.ts +5 -0
  31. package/dist/errors.js +14 -0
  32. package/dist/errors.js.map +1 -0
  33. package/dist/index.d.ts +23 -0
  34. package/dist/index.js +15 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/mcp.d.ts +3 -0
  37. package/dist/mcp.js +215 -0
  38. package/dist/mcp.js.map +1 -0
  39. package/dist/migrations.d.ts +13 -0
  40. package/dist/migrations.js +266 -0
  41. package/dist/migrations.js.map +1 -0
  42. package/dist/policy.d.ts +22 -0
  43. package/dist/policy.js +33 -0
  44. package/dist/policy.js.map +1 -0
  45. package/dist/server.d.ts +49 -0
  46. package/dist/server.js +529 -0
  47. package/dist/server.js.map +1 -0
  48. package/dist/stdio-adapter.d.ts +230 -0
  49. package/dist/stdio-adapter.js +406 -0
  50. package/dist/stdio-adapter.js.map +1 -0
  51. package/dist/tui.d.ts +26 -0
  52. package/dist/tui.js +291 -0
  53. package/dist/tui.js.map +1 -0
  54. package/dist/types.d.ts +355 -0
  55. package/dist/types.js +85 -0
  56. package/dist/types.js.map +1 -0
  57. package/docs/ARCHITECTURE.md +119 -0
  58. package/docs/README.md +37 -0
  59. package/docs/RELEASING.md +228 -0
  60. package/docs/ROADMAP.md +112 -0
  61. package/docs/cli-reference.md +133 -0
  62. package/docs/dogfooding-report.md +83 -0
  63. package/docs/getting-started.md +228 -0
  64. package/docs/guides/antigravity-setup.md +84 -0
  65. package/docs/guides/claude-cursor-setup.md +76 -0
  66. package/docs/guides/codex-setup.md +75 -0
  67. package/docs/guides/human-console.md +177 -0
  68. package/docs/mcp-tools-reference.md +235 -0
  69. package/docs/policy-guide.md +105 -0
  70. package/examples/org.toml +65 -0
  71. package/package.json +68 -0
@@ -0,0 +1,794 @@
1
+ :root {
2
+ --bg-main: #080c14;
3
+ --bg-sidebar: #0d121f;
4
+ --bg-surface: rgba(18, 24, 38, 0.75);
5
+ --bg-surface-hover: rgba(26, 34, 54, 0.85);
6
+ --bg-input: #0f1524;
7
+ --border-subtle: rgba(255, 255, 255, 0.08);
8
+ --border-focus: #06b6d4;
9
+ --text-primary: #f1f5f9;
10
+ --text-secondary: #94a3b8;
11
+ --text-muted: #64748b;
12
+
13
+ --cyan: #06b6d4;
14
+ --cyan-glow: rgba(6, 182, 212, 0.25);
15
+ --emerald: #10b981;
16
+ --amber: #f59e0b;
17
+ --rose: #f43f5e;
18
+ --violet: #8b5cf6;
19
+
20
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
21
+ --font-mono: 'JetBrains Mono', 'Fira Code', Menlo, Consolas, monospace;
22
+ --radius-sm: 6px;
23
+ --radius-md: 10px;
24
+ --radius-lg: 14px;
25
+ }
26
+
27
+ * {
28
+ box-sizing: border-box;
29
+ margin: 0;
30
+ padding: 0;
31
+ }
32
+
33
+ body {
34
+ font-family: var(--font-sans);
35
+ background-color: var(--bg-main);
36
+ color: var(--text-primary);
37
+ min-height: 100vh;
38
+ overflow-x: hidden;
39
+ background-image:
40
+ radial-gradient(at 0% 0%, rgba(6, 182, 212, 0.08) 0px, transparent 50%),
41
+ radial-gradient(at 100% 100%, rgba(139, 92, 246, 0.08) 0px, transparent 50%);
42
+ }
43
+
44
+ /* App Layout */
45
+ .app-layout {
46
+ display: flex;
47
+ height: 100vh;
48
+ overflow: hidden;
49
+ }
50
+
51
+ /* Sidebar */
52
+ .sidebar {
53
+ width: 260px;
54
+ background: var(--bg-sidebar);
55
+ border-right: 1px solid var(--border-subtle);
56
+ display: flex;
57
+ flex-direction: column;
58
+ flex-shrink: 0;
59
+ }
60
+
61
+ .brand {
62
+ padding: 20px;
63
+ display: flex;
64
+ align-items: center;
65
+ gap: 12px;
66
+ border-bottom: 1px solid var(--border-subtle);
67
+ }
68
+
69
+ .brand-logo {
70
+ width: 38px;
71
+ height: 38px;
72
+ border-radius: var(--radius-md);
73
+ background: linear-gradient(135deg, var(--cyan), var(--violet));
74
+ display: flex;
75
+ align-items: center;
76
+ justify-content: center;
77
+ color: #fff;
78
+ box-shadow: 0 0 16px var(--cyan-glow);
79
+ }
80
+
81
+ .brand-text {
82
+ display: flex;
83
+ flex-direction: column;
84
+ }
85
+
86
+ .brand-title {
87
+ font-size: 1.1rem;
88
+ font-weight: 700;
89
+ letter-spacing: -0.02em;
90
+ color: #fff;
91
+ }
92
+
93
+ .brand-badge {
94
+ font-size: 0.65rem;
95
+ font-weight: 600;
96
+ color: var(--cyan);
97
+ text-transform: uppercase;
98
+ letter-spacing: 0.05em;
99
+ }
100
+
101
+ .nav-menu {
102
+ padding: 16px 12px;
103
+ display: flex;
104
+ flex-direction: column;
105
+ gap: 4px;
106
+ flex: 1;
107
+ overflow-y: auto;
108
+ }
109
+
110
+ .nav-item {
111
+ display: flex;
112
+ align-items: center;
113
+ gap: 12px;
114
+ padding: 10px 14px;
115
+ background: transparent;
116
+ border: none;
117
+ border-radius: var(--radius-md);
118
+ color: var(--text-secondary);
119
+ font-size: 0.9rem;
120
+ font-weight: 500;
121
+ cursor: pointer;
122
+ transition: all 0.15s ease;
123
+ width: 100%;
124
+ text-align: left;
125
+ }
126
+
127
+ .nav-item:hover {
128
+ background: var(--bg-surface-hover);
129
+ color: var(--text-primary);
130
+ }
131
+
132
+ .nav-item.active {
133
+ background: rgba(6, 182, 212, 0.12);
134
+ color: var(--cyan);
135
+ font-weight: 600;
136
+ }
137
+
138
+ .nav-item.active svg {
139
+ stroke: var(--cyan);
140
+ }
141
+
142
+ .nav-item .badge {
143
+ margin-left: auto;
144
+ }
145
+
146
+ .sidebar-footer {
147
+ padding: 16px;
148
+ border-top: 1px solid var(--border-subtle);
149
+ display: flex;
150
+ flex-direction: column;
151
+ gap: 12px;
152
+ }
153
+
154
+ .company-card {
155
+ background: rgba(255, 255, 255, 0.03);
156
+ padding: 10px 12px;
157
+ border-radius: var(--radius-sm);
158
+ display: flex;
159
+ flex-direction: column;
160
+ }
161
+
162
+ .company-label {
163
+ font-size: 0.7rem;
164
+ color: var(--text-muted);
165
+ text-transform: uppercase;
166
+ }
167
+
168
+ .company-name {
169
+ font-size: 0.85rem;
170
+ font-weight: 600;
171
+ color: var(--text-primary);
172
+ white-space: nowrap;
173
+ overflow: hidden;
174
+ text-overflow: ellipsis;
175
+ }
176
+
177
+ /* Main Content */
178
+ .main-content {
179
+ flex: 1;
180
+ display: flex;
181
+ flex-direction: column;
182
+ min-width: 0;
183
+ overflow: hidden;
184
+ }
185
+
186
+ .top-bar {
187
+ height: 64px;
188
+ border-bottom: 1px solid var(--border-subtle);
189
+ padding: 0 24px;
190
+ display: flex;
191
+ align-items: center;
192
+ justify-content: space-between;
193
+ gap: 20px;
194
+ background: rgba(8, 12, 20, 0.6);
195
+ backdrop-filter: blur(12px);
196
+ }
197
+
198
+ .search-box {
199
+ display: flex;
200
+ align-items: center;
201
+ gap: 10px;
202
+ background: var(--bg-input);
203
+ border: 1px solid var(--border-subtle);
204
+ border-radius: var(--radius-md);
205
+ padding: 8px 14px;
206
+ width: 380px;
207
+ color: var(--text-secondary);
208
+ transition: border-color 0.15s ease;
209
+ }
210
+
211
+ .search-box:focus-within {
212
+ border-color: var(--border-focus);
213
+ }
214
+
215
+ .search-box input {
216
+ background: transparent;
217
+ border: none;
218
+ color: var(--text-primary);
219
+ font-size: 0.85rem;
220
+ width: 100%;
221
+ outline: none;
222
+ }
223
+
224
+ .header-status {
225
+ display: flex;
226
+ align-items: center;
227
+ gap: 16px;
228
+ }
229
+
230
+ .connection-status {
231
+ display: flex;
232
+ align-items: center;
233
+ gap: 8px;
234
+ font-size: 0.8rem;
235
+ color: var(--text-secondary);
236
+ }
237
+
238
+ .status-dot {
239
+ width: 8px;
240
+ height: 8px;
241
+ border-radius: 50%;
242
+ display: inline-block;
243
+ }
244
+
245
+ .status-dot.connected {
246
+ background: var(--emerald);
247
+ box-shadow: 0 0 8px var(--emerald);
248
+ animation: pulse-dot 2s infinite ease-in-out;
249
+ }
250
+
251
+ .status-dot.disconnected {
252
+ background: var(--rose);
253
+ }
254
+
255
+ @keyframes pulse-dot {
256
+ 0%, 100% { opacity: 1; transform: scale(1); }
257
+ 50% { opacity: 0.5; transform: scale(0.85); }
258
+ }
259
+
260
+ /* Content Viewport */
261
+ .content-viewport {
262
+ flex: 1;
263
+ overflow-y: auto;
264
+ padding: 28px 32px;
265
+ }
266
+
267
+ .tab-pane {
268
+ display: none;
269
+ }
270
+
271
+ .tab-pane.active {
272
+ display: block;
273
+ }
274
+
275
+ .pane-header {
276
+ display: flex;
277
+ justify-content: space-between;
278
+ align-items: flex-start;
279
+ margin-bottom: 24px;
280
+ }
281
+
282
+ .pane-title {
283
+ font-size: 1.5rem;
284
+ font-weight: 700;
285
+ letter-spacing: -0.02em;
286
+ }
287
+
288
+ .pane-subtitle {
289
+ font-size: 0.85rem;
290
+ color: var(--text-secondary);
291
+ margin-top: 4px;
292
+ }
293
+
294
+ /* Badges */
295
+ .badge {
296
+ display: inline-flex;
297
+ align-items: center;
298
+ padding: 2px 8px;
299
+ border-radius: 9999px;
300
+ font-size: 0.75rem;
301
+ font-weight: 600;
302
+ background: rgba(255, 255, 255, 0.08);
303
+ color: var(--text-secondary);
304
+ }
305
+
306
+ .badge-cyan { background: rgba(6, 182, 212, 0.15); color: var(--cyan); }
307
+ .badge-emerald { background: rgba(16, 185, 129, 0.15); color: var(--emerald); }
308
+ .badge-amber { background: rgba(245, 158, 11, 0.15); color: var(--amber); }
309
+ .badge-rose { background: rgba(244, 63, 94, 0.15); color: var(--rose); }
310
+ .badge-violet { background: rgba(139, 92, 246, 0.15); color: var(--violet); }
311
+
312
+ /* Buttons */
313
+ .btn {
314
+ display: inline-flex;
315
+ align-items: center;
316
+ justify-content: center;
317
+ gap: 8px;
318
+ padding: 8px 16px;
319
+ border-radius: var(--radius-md);
320
+ font-size: 0.85rem;
321
+ font-weight: 600;
322
+ cursor: pointer;
323
+ border: none;
324
+ transition: all 0.15s ease;
325
+ }
326
+
327
+ .btn-primary {
328
+ background: var(--cyan);
329
+ color: #04121a;
330
+ }
331
+ .btn-primary:hover {
332
+ background: #22d3ee;
333
+ box-shadow: 0 0 12px var(--cyan-glow);
334
+ }
335
+
336
+ .btn-secondary {
337
+ background: rgba(255, 255, 255, 0.06);
338
+ color: var(--text-primary);
339
+ border: 1px solid var(--border-subtle);
340
+ }
341
+ .btn-secondary:hover {
342
+ background: rgba(255, 255, 255, 0.12);
343
+ }
344
+
345
+ .btn-danger {
346
+ background: rgba(244, 63, 94, 0.15);
347
+ color: var(--rose);
348
+ border: 1px solid rgba(244, 63, 94, 0.3);
349
+ }
350
+ .btn-danger:hover {
351
+ background: var(--rose);
352
+ color: #fff;
353
+ }
354
+
355
+ .btn-ghost {
356
+ background: transparent;
357
+ color: var(--text-secondary);
358
+ }
359
+ .btn-ghost:hover {
360
+ background: rgba(255, 255, 255, 0.05);
361
+ color: var(--text-primary);
362
+ }
363
+
364
+ .btn-sm {
365
+ padding: 6px 12px;
366
+ font-size: 0.78rem;
367
+ }
368
+
369
+ .w-full { width: 100%; }
370
+
371
+ /* Cards & Grid */
372
+ .cards-grid {
373
+ display: flex;
374
+ flex-direction: column;
375
+ gap: 16px;
376
+ }
377
+
378
+ .card {
379
+ background: var(--bg-surface);
380
+ border: 1px solid var(--border-subtle);
381
+ border-radius: var(--radius-lg);
382
+ padding: 20px;
383
+ backdrop-filter: blur(16px);
384
+ transition: border-color 0.2s ease, transform 0.2s ease;
385
+ }
386
+
387
+ .card:hover {
388
+ border-color: rgba(255, 255, 255, 0.16);
389
+ }
390
+
391
+ .card-header {
392
+ display: flex;
393
+ justify-content: space-between;
394
+ align-items: center;
395
+ margin-bottom: 12px;
396
+ }
397
+
398
+ .card-meta {
399
+ display: flex;
400
+ align-items: center;
401
+ gap: 10px;
402
+ }
403
+
404
+ .card-roles {
405
+ font-size: 0.95rem;
406
+ font-weight: 600;
407
+ display: flex;
408
+ align-items: center;
409
+ gap: 8px;
410
+ }
411
+
412
+ .role-badge {
413
+ background: rgba(6, 182, 212, 0.12);
414
+ color: var(--cyan);
415
+ padding: 3px 8px;
416
+ border-radius: var(--radius-sm);
417
+ font-family: var(--font-mono);
418
+ font-size: 0.8rem;
419
+ }
420
+
421
+ .card-payload {
422
+ background: rgba(0, 0, 0, 0.3);
423
+ border: 1px solid var(--border-subtle);
424
+ border-radius: var(--radius-md);
425
+ padding: 14px;
426
+ font-family: var(--font-mono);
427
+ font-size: 0.82rem;
428
+ color: #cbd5e1;
429
+ max-height: 180px;
430
+ overflow-y: auto;
431
+ margin: 14px 0;
432
+ white-space: pre-wrap;
433
+ word-break: break-all;
434
+ }
435
+
436
+ .card-actions {
437
+ display: flex;
438
+ align-items: center;
439
+ justify-content: flex-end;
440
+ gap: 10px;
441
+ }
442
+
443
+ /* Empty State */
444
+ .empty-state {
445
+ text-align: center;
446
+ padding: 60px 20px;
447
+ color: var(--text-muted);
448
+ background: var(--bg-surface);
449
+ border: 1px dashed var(--border-subtle);
450
+ border-radius: var(--radius-lg);
451
+ }
452
+
453
+ .empty-state svg {
454
+ color: var(--text-muted);
455
+ margin-bottom: 14px;
456
+ }
457
+
458
+ .empty-state h3 {
459
+ font-size: 1.1rem;
460
+ color: var(--text-secondary);
461
+ margin-bottom: 6px;
462
+ }
463
+
464
+ /* Tasks Layout */
465
+ .tasks-layout {
466
+ display: grid;
467
+ grid-template-columns: 320px 1fr;
468
+ gap: 20px;
469
+ height: calc(100vh - 180px);
470
+ }
471
+
472
+ .tasks-list {
473
+ display: flex;
474
+ flex-direction: column;
475
+ gap: 10px;
476
+ overflow-y: auto;
477
+ padding-right: 8px;
478
+ }
479
+
480
+ .task-card-item {
481
+ background: var(--bg-surface);
482
+ border: 1px solid var(--border-subtle);
483
+ border-radius: var(--radius-md);
484
+ padding: 14px;
485
+ cursor: pointer;
486
+ transition: all 0.15s ease;
487
+ }
488
+
489
+ .task-card-item:hover, .task-card-item.selected {
490
+ border-color: var(--cyan);
491
+ background: var(--bg-surface-hover);
492
+ }
493
+
494
+ .thread-viewer {
495
+ background: var(--bg-surface);
496
+ border: 1px solid var(--border-subtle);
497
+ border-radius: var(--radius-lg);
498
+ padding: 24px;
499
+ overflow-y: auto;
500
+ display: flex;
501
+ flex-direction: column;
502
+ gap: 16px;
503
+ }
504
+
505
+ .thread-empty {
506
+ margin: auto;
507
+ color: var(--text-muted);
508
+ font-size: 0.9rem;
509
+ }
510
+
511
+ .thread-bubble {
512
+ padding: 14px 18px;
513
+ border-radius: var(--radius-md);
514
+ background: rgba(255, 255, 255, 0.04);
515
+ border: 1px solid var(--border-subtle);
516
+ max-width: 85%;
517
+ }
518
+
519
+ .thread-bubble.from-me {
520
+ align-self: flex-end;
521
+ border-color: rgba(6, 182, 212, 0.3);
522
+ background: rgba(6, 182, 212, 0.06);
523
+ }
524
+
525
+ /* Data Table */
526
+ .data-table {
527
+ width: 100%;
528
+ border-collapse: collapse;
529
+ font-size: 0.85rem;
530
+ }
531
+
532
+ .data-table th {
533
+ text-align: left;
534
+ padding: 12px 16px;
535
+ color: var(--text-muted);
536
+ font-weight: 600;
537
+ border-bottom: 1px solid var(--border-subtle);
538
+ background: rgba(255, 255, 255, 0.02);
539
+ }
540
+
541
+ .data-table td {
542
+ padding: 14px 16px;
543
+ border-bottom: 1px solid var(--border-subtle);
544
+ color: var(--text-secondary);
545
+ }
546
+
547
+ .data-table tr:hover td {
548
+ background: rgba(255, 255, 255, 0.02);
549
+ color: var(--text-primary);
550
+ }
551
+
552
+ /* Modal */
553
+ .modal-backdrop {
554
+ position: fixed;
555
+ top: 0;
556
+ left: 0;
557
+ width: 100vw;
558
+ height: 100vh;
559
+ background: rgba(4, 7, 13, 0.8);
560
+ backdrop-filter: blur(8px);
561
+ display: flex;
562
+ align-items: center;
563
+ justify-content: center;
564
+ z-index: 1000;
565
+ }
566
+
567
+ .modal-dialog {
568
+ background: #0d121f;
569
+ border: 1px solid var(--border-subtle);
570
+ border-radius: var(--radius-lg);
571
+ width: 90%;
572
+ max-width: 580px;
573
+ box-shadow: 0 24px 48px rgba(0, 0, 0, 0.6);
574
+ display: flex;
575
+ flex-direction: column;
576
+ overflow: hidden;
577
+ }
578
+
579
+ .modal-dialog.modal-lg {
580
+ max-width: 840px;
581
+ }
582
+
583
+ .modal-header {
584
+ padding: 20px 24px;
585
+ border-bottom: 1px solid var(--border-subtle);
586
+ display: flex;
587
+ justify-content: space-between;
588
+ align-items: center;
589
+ }
590
+
591
+ .modal-title {
592
+ font-size: 1.2rem;
593
+ font-weight: 700;
594
+ }
595
+
596
+ .modal-close {
597
+ background: transparent;
598
+ border: none;
599
+ font-size: 1.5rem;
600
+ color: var(--text-muted);
601
+ cursor: pointer;
602
+ }
603
+
604
+ .modal-close:hover {
605
+ color: var(--text-primary);
606
+ }
607
+
608
+ .modal-body {
609
+ padding: 24px;
610
+ display: flex;
611
+ flex-direction: column;
612
+ gap: 14px;
613
+ }
614
+
615
+ .modal-footer {
616
+ padding: 16px 24px;
617
+ border-top: 1px solid var(--border-subtle);
618
+ display: flex;
619
+ justify-content: flex-end;
620
+ gap: 12px;
621
+ background: rgba(0, 0, 0, 0.2);
622
+ }
623
+
624
+ /* Diff Container */
625
+ .diff-container {
626
+ display: grid;
627
+ grid-template-columns: 1fr 1fr;
628
+ height: 380px;
629
+ border-bottom: 1px solid var(--border-subtle);
630
+ }
631
+
632
+ .diff-pane {
633
+ display: flex;
634
+ flex-direction: column;
635
+ overflow: hidden;
636
+ }
637
+
638
+ .diff-pane:first-child {
639
+ border-right: 1px solid var(--border-subtle);
640
+ }
641
+
642
+ .diff-pane-header {
643
+ padding: 10px 16px;
644
+ background: rgba(0, 0, 0, 0.3);
645
+ font-size: 0.75rem;
646
+ font-weight: 600;
647
+ color: var(--text-muted);
648
+ border-bottom: 1px solid var(--border-subtle);
649
+ display: flex;
650
+ justify-content: space-between;
651
+ align-items: center;
652
+ }
653
+
654
+ .diff-code {
655
+ padding: 14px;
656
+ font-family: var(--font-mono);
657
+ font-size: 0.8rem;
658
+ overflow-y: auto;
659
+ flex: 1;
660
+ color: #94a3b8;
661
+ white-space: pre-wrap;
662
+ }
663
+
664
+ .diff-editor {
665
+ padding: 14px;
666
+ font-family: var(--font-mono);
667
+ font-size: 0.8rem;
668
+ overflow-y: auto;
669
+ flex: 1;
670
+ background: rgba(0, 0, 0, 0.15);
671
+ color: #f1f5f9;
672
+ border: none;
673
+ outline: none;
674
+ resize: none;
675
+ line-height: 1.5;
676
+ }
677
+
678
+ .modal-body-note {
679
+ padding: 16px 24px;
680
+ display: flex;
681
+ flex-direction: column;
682
+ gap: 6px;
683
+ }
684
+
685
+ .form-input, .form-textarea {
686
+ background: var(--bg-input);
687
+ border: 1px solid var(--border-subtle);
688
+ border-radius: var(--radius-sm);
689
+ padding: 10px 12px;
690
+ color: var(--text-primary);
691
+ font-family: var(--font-sans);
692
+ font-size: 0.85rem;
693
+ outline: none;
694
+ width: 100%;
695
+ }
696
+
697
+ .form-input:focus, .form-textarea:focus {
698
+ border-color: var(--border-focus);
699
+ }
700
+
701
+ /* Toast */
702
+ .toast-container {
703
+ position: fixed;
704
+ bottom: 24px;
705
+ right: 24px;
706
+ display: flex;
707
+ flex-direction: column;
708
+ gap: 10px;
709
+ z-index: 2000;
710
+ }
711
+
712
+ .toast {
713
+ padding: 12px 18px;
714
+ background: #1e293b;
715
+ color: #fff;
716
+ border-radius: var(--radius-md);
717
+ font-size: 0.85rem;
718
+ box-shadow: 0 12px 24px rgba(0, 0, 0, 0.4);
719
+ border-left: 4px solid var(--cyan);
720
+ animation: slide-toast 0.2s ease-out;
721
+ }
722
+
723
+ .toast.toast-success { border-left-color: var(--emerald); }
724
+ .toast.toast-error { border-left-color: var(--rose); }
725
+
726
+ @keyframes slide-toast {
727
+ from { transform: translateY(12px); opacity: 0; }
728
+ to { transform: translateY(0); opacity: 1; }
729
+ }
730
+
731
+ /* Presence & Connection Indicators */
732
+ .connection-status {
733
+ display: flex;
734
+ align-items: center;
735
+ gap: 8px;
736
+ font-size: 0.8rem;
737
+ color: var(--text-secondary);
738
+ }
739
+
740
+ .status-dot {
741
+ width: 8px;
742
+ height: 8px;
743
+ border-radius: 50%;
744
+ display: inline-block;
745
+ }
746
+
747
+ .status-dot.connected, .status-dot.online {
748
+ background-color: var(--emerald);
749
+ box-shadow: 0 0 8px rgba(16, 185, 129, 0.4);
750
+ }
751
+
752
+ .status-dot.idle {
753
+ background-color: var(--amber);
754
+ box-shadow: 0 0 8px rgba(245, 158, 11, 0.4);
755
+ }
756
+
757
+ .status-dot.disconnected, .status-dot.offline {
758
+ background-color: var(--rose);
759
+ }
760
+
761
+ .presence-pill {
762
+ display: inline-flex;
763
+ align-items: center;
764
+ gap: 6px;
765
+ padding: 4px 10px;
766
+ background: var(--bg-card);
767
+ border: 1px solid var(--border-subtle);
768
+ border-radius: 9999px;
769
+ font-size: 0.75rem;
770
+ font-weight: 500;
771
+ color: var(--text-primary);
772
+ }
773
+
774
+ .presence-dot {
775
+ width: 6px;
776
+ height: 6px;
777
+ border-radius: 50%;
778
+ display: inline-block;
779
+ }
780
+
781
+ .presence-dot.online {
782
+ background: var(--emerald);
783
+ box-shadow: 0 0 6px rgba(16, 185, 129, 0.5);
784
+ }
785
+
786
+ .presence-dot.idle {
787
+ background: var(--amber);
788
+ box-shadow: 0 0 6px rgba(245, 158, 11, 0.5);
789
+ }
790
+
791
+ .presence-dot.offline {
792
+ background: #64748b;
793
+ }
794
+