@nordbyte/nordrelay 0.4.1 → 0.5.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 (57) hide show
  1. package/.env.example +155 -64
  2. package/README.md +81 -65
  3. package/dist/access-control.js +126 -115
  4. package/dist/agent-updates.js +62 -9
  5. package/dist/bot-rendering.js +838 -0
  6. package/dist/bot-ui.js +1 -0
  7. package/dist/bot.js +342 -2498
  8. package/dist/channel-actions.js +8 -8
  9. package/dist/channel-runtime.js +89 -0
  10. package/dist/config-metadata.js +238 -0
  11. package/dist/config.js +0 -58
  12. package/dist/index.js +8 -0
  13. package/dist/operations.js +63 -9
  14. package/dist/relay-artifact-service.js +126 -0
  15. package/dist/relay-external-activity-monitor.js +216 -0
  16. package/dist/relay-queue-service.js +66 -0
  17. package/dist/relay-runtime-types.js +1 -0
  18. package/dist/relay-runtime.js +96 -354
  19. package/dist/settings-service.js +2 -117
  20. package/dist/support-bundle.js +205 -0
  21. package/dist/telegram-access-commands.js +123 -0
  22. package/dist/telegram-access-middleware.js +129 -0
  23. package/dist/telegram-agent-commands.js +212 -0
  24. package/dist/telegram-artifact-commands.js +139 -0
  25. package/dist/telegram-channel-runtime.js +132 -0
  26. package/dist/telegram-command-menu.js +55 -0
  27. package/dist/telegram-command-types.js +1 -0
  28. package/dist/telegram-diagnostics-command.js +102 -0
  29. package/dist/telegram-general-commands.js +52 -0
  30. package/dist/telegram-operational-commands.js +153 -0
  31. package/dist/telegram-output.js +216 -0
  32. package/dist/telegram-preference-commands.js +198 -0
  33. package/dist/telegram-queue-commands.js +278 -0
  34. package/dist/telegram-support-command.js +53 -0
  35. package/dist/telegram-update-commands.js +93 -0
  36. package/dist/user-management.js +708 -0
  37. package/dist/web-api-contract.js +104 -0
  38. package/dist/web-api-types.js +1 -0
  39. package/dist/web-dashboard-access-routes.js +163 -0
  40. package/dist/web-dashboard-artifact-routes.js +65 -0
  41. package/dist/web-dashboard-assets.js +35 -2
  42. package/dist/web-dashboard-http.js +143 -0
  43. package/dist/web-dashboard-pages.js +257 -0
  44. package/dist/web-dashboard-runtime-routes.js +92 -0
  45. package/dist/web-dashboard-session-routes.js +209 -0
  46. package/dist/web-dashboard-ui.js +14 -14
  47. package/dist/web-dashboard.js +330 -707
  48. package/dist/webui-assets/dashboard.css +989 -0
  49. package/dist/webui-assets/dashboard.js +1750 -0
  50. package/dist/zip-writer.js +83 -0
  51. package/package.json +13 -4
  52. package/plugins/nordrelay/.codex-plugin/plugin.json +1 -1
  53. package/plugins/nordrelay/commands/remote.md +1 -1
  54. package/plugins/nordrelay/scripts/nordrelay.mjs +227 -78
  55. package/plugins/nordrelay/skills/telegram-remote/SKILL.md +1 -1
  56. package/dist/web-dashboard-client.js +0 -275
  57. package/dist/web-dashboard-style.js +0 -9
@@ -0,0 +1,989 @@
1
+ :root {
2
+ color-scheme: light;
3
+ --bg:#f4f6f2;
4
+ --surface:#ffffff;
5
+ --surface-soft:#fbfcf8;
6
+ --text:#18201b;
7
+ --muted:#5d675f;
8
+ --border:#dce3d9;
9
+ --border-soft:#e7ede4;
10
+ --sidebar:#17251d;
11
+ --sidebar-text:#f4f8f2;
12
+ --sidebar-muted:#aebcaf;
13
+ --accent:#235c42;
14
+ --accent-strong:#17452f;
15
+ --accent-soft:#dff5e8;
16
+ --warn:#fff7da;
17
+ --danger:#9b1c1c;
18
+ --pre:#111812;
19
+ --pre-text:#f3f7ef;
20
+ --shadow:0 8px 24px rgba(24,32,27,.04);
21
+ --link:#1d6a4c;
22
+ }
23
+ :root[data-theme=dark] {
24
+ color-scheme: dark;
25
+ --bg:#101411;
26
+ --surface:#171d19;
27
+ --surface-soft:#1d251f;
28
+ --text:#edf4ee;
29
+ --muted:#a7b3aa;
30
+ --border:#2d3830;
31
+ --border-soft:#263128;
32
+ --sidebar:#0c120f;
33
+ --sidebar-text:#edf7ef;
34
+ --sidebar-muted:#8da091;
35
+ --accent:#4fa876;
36
+ --accent-strong:#64bd89;
37
+ --accent-soft:#173d2a;
38
+ --warn:#3b3216;
39
+ --danger:#cc4b4b;
40
+ --pre:#070a08;
41
+ --pre-text:#e8f1ea;
42
+ --shadow:0 10px 28px rgba(0,0,0,.22);
43
+ --link:#75c99a;
44
+ }
45
+ .agent-settings-nav {
46
+ display: flex;
47
+ align-items: center;
48
+ gap: 8px;
49
+ flex-wrap: wrap;
50
+ margin: 0 0 12px;
51
+ padding: 10px;
52
+ border: 1px solid var(--border-soft);
53
+ border-radius: 8px;
54
+ background: var(--surface);
55
+ }
56
+ .agent-settings-nav strong {
57
+ font-size: 13px;
58
+ color: var(--muted);
59
+ margin-right: 4px;
60
+ }
61
+ .agent-settings-nav button {
62
+ background: var(--surface);
63
+ color: var(--text);
64
+ border-color: var(--border);
65
+ min-height: 32px;
66
+ height: 32px;
67
+ line-height: 1;
68
+ }
69
+ .agent-settings-nav button.active {
70
+ background: var(--accent);
71
+ color: white;
72
+ border-color: var(--accent);
73
+ }
74
+ @media (max-width: 560px) {
75
+ .agent-settings-nav {
76
+ align-items: stretch;
77
+ }
78
+ .agent-settings-nav button {
79
+ width: 100%;
80
+ }
81
+ }
82
+ .drop-active {
83
+ outline: 2px dashed var(--accent);
84
+ outline-offset: -8px;
85
+ }
86
+ .chip {
87
+ display: inline-flex;
88
+ align-items: center;
89
+ justify-content: center;
90
+ min-height: 20px;
91
+ border-radius: 999px;
92
+ border: 1px solid var(--border);
93
+ padding: 0 8px;
94
+ font-size: 12px;
95
+ line-height: 1;
96
+ color: var(--muted);
97
+ margin-right: 6px;
98
+ }
99
+ .chip.error {
100
+ color: var(--danger);
101
+ border-color: var(--danger);
102
+ }
103
+ .chip.warn {
104
+ color: #8a6a12;
105
+ border-color: #d9c27a;
106
+ background: var(--warn);
107
+ }
108
+ .gallery {
109
+ display: grid;
110
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
111
+ gap: 10px;
112
+ margin-top: 12px;
113
+ }
114
+ .artifact-card {
115
+ border: 1px solid var(--border-soft);
116
+ border-radius: 8px;
117
+ padding: 8px;
118
+ background: var(--surface-soft);
119
+ min-width: 0;
120
+ }
121
+ .artifact-card img {
122
+ width: 100%;
123
+ aspect-ratio: 1.4;
124
+ object-fit: cover;
125
+ border: 1px solid var(--border);
126
+ border-radius: 6px;
127
+ background: var(--surface);
128
+ }
129
+ .artifact-card small {
130
+ display: block;
131
+ overflow: hidden;
132
+ text-overflow: ellipsis;
133
+ white-space: nowrap;
134
+ }
135
+ .overview-adapter-grid {
136
+ display: grid;
137
+ grid-template-columns: repeat(2, minmax(0, 1fr));
138
+ gap: 16px;
139
+ }
140
+ .session-detail-section {
141
+ margin-top: 20px;
142
+ }
143
+ .session-detail-section summary {
144
+ cursor: pointer;
145
+ font-weight: 700;
146
+ margin-bottom: 0;
147
+ line-height: 1.25;
148
+ }
149
+ .session-detail-section[open] summary {
150
+ margin-bottom: 10px;
151
+ }
152
+ .setting.dirty {
153
+ border-color: var(--accent);
154
+ }
155
+ .setting-actions {
156
+ display: flex;
157
+ gap: 8px;
158
+ align-items: center;
159
+ margin-top: 8px;
160
+ }
161
+ .setting-help {
162
+ font-size: 12px;
163
+ color: var(--muted);
164
+ }
165
+ .restart-banner {
166
+ border: 1px solid #d9c27a;
167
+ background: var(--warn);
168
+ border-radius: 8px;
169
+ padding: 10px;
170
+ margin: 0 0 12px;
171
+ }
172
+ .task-grid {
173
+ display: grid;
174
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
175
+ gap: 10px;
176
+ }
177
+ .task-section-title {
178
+ margin: 18px 0 6px;
179
+ }
180
+ .loading-state {
181
+ display: flex;
182
+ align-items: center;
183
+ gap: 10px;
184
+ min-height: 90px;
185
+ color: var(--muted);
186
+ }
187
+ .spinner {
188
+ width: 18px;
189
+ height: 18px;
190
+ border: 2px solid var(--border);
191
+ border-top-color: var(--accent);
192
+ border-radius: 50%;
193
+ animation: spin .8s linear infinite;
194
+ }
195
+ @keyframes spin {
196
+ to {
197
+ transform: rotate(360deg);
198
+ }
199
+ }
200
+ .log-view {
201
+ max-height: min(64vh, 720px);
202
+ min-height: 320px;
203
+ }
204
+ .log-line {
205
+ display: block;
206
+ }
207
+ .log-line.ERROR {
208
+ color: var(--danger);
209
+ font-weight: 700;
210
+ }
211
+ .log-line.WARN {
212
+ color: #8a6a12;
213
+ font-weight: 700;
214
+ }
215
+ .tool-tooltip {
216
+ position: fixed;
217
+ z-index: 60;
218
+ display: none;
219
+ max-width: 220px;
220
+ padding: 6px 8px;
221
+ border: 1px solid var(--border);
222
+ border-radius: 6px;
223
+ background: var(--pre);
224
+ color: var(--pre-text);
225
+ font-size: 12px;
226
+ box-shadow: var(--shadow);
227
+ pointer-events: none;
228
+ }
229
+ .connection-ok {
230
+ color: #1e754e;
231
+ border-color: #8ed0aa;
232
+ }
233
+ .connection-warn {
234
+ color: #8a6a12;
235
+ border-color: #d9c27a;
236
+ }
237
+ .connection-error {
238
+ color: var(--danger);
239
+ border-color: var(--danger);
240
+ }
241
+ .version-actions {
242
+ margin-bottom: 12px;
243
+ }
244
+ .version-update-title {
245
+ margin-top: 22px;
246
+ }
247
+ .mini-button {
248
+ min-height: 26px;
249
+ height: 26px;
250
+ padding: 0 8px;
251
+ font-size: 12px;
252
+ line-height: 1;
253
+ }
254
+ .update-log {
255
+ max-height: 280px;
256
+ min-height: 90px;
257
+ margin-top: 10px;
258
+ }
259
+ .update-job-header {
260
+ display: flex;
261
+ justify-content: space-between;
262
+ gap: 10px;
263
+ align-items: flex-start;
264
+ flex-wrap: wrap;
265
+ }
266
+ .update-input {
267
+ display: grid;
268
+ grid-template-columns: 1fr auto auto;
269
+ gap: 8px;
270
+ margin-top: 8px;
271
+ }
272
+ * {
273
+ box-sizing: border-box;
274
+ }
275
+ html {
276
+ font-size: 16px;
277
+ -webkit-text-size-adjust: 100%;
278
+ text-size-adjust: 100%;
279
+ }
280
+ body {
281
+ margin: 0;
282
+ background: var(--bg);
283
+ color: var(--text);
284
+ font-family:
285
+ Inter,
286
+ "Segoe UI",
287
+ system-ui,
288
+ -apple-system,
289
+ BlinkMacSystemFont,
290
+ Roboto,
291
+ Arial,
292
+ sans-serif;
293
+ line-height: 1.4;
294
+ font-synthesis: none;
295
+ }
296
+ .app {
297
+ min-height: 100vh;
298
+ display: grid;
299
+ grid-template-columns: 260px 1fr;
300
+ }
301
+ .sidebar {
302
+ background: var(--sidebar);
303
+ color: var(--sidebar-text);
304
+ padding: 18px;
305
+ display: flex;
306
+ flex-direction: column;
307
+ gap: 22px;
308
+ }
309
+ .brand {
310
+ display: flex;
311
+ align-items: center;
312
+ gap: 12px;
313
+ }
314
+ .mark {
315
+ display: grid;
316
+ place-items: center;
317
+ width: 38px;
318
+ height: 38px;
319
+ border-radius: 8px;
320
+ background: #d7ffe5;
321
+ color: #173d29;
322
+ font-weight: 800;
323
+ }
324
+ .brand small {
325
+ display: block;
326
+ color: var(--sidebar-muted);
327
+ }
328
+ nav {
329
+ display: flex;
330
+ flex-direction: column;
331
+ gap: 6px;
332
+ }
333
+ nav button,
334
+ .menu {
335
+ border: 0;
336
+ border-radius: 6px;
337
+ padding: 10px 12px;
338
+ background: transparent;
339
+ color: inherit;
340
+ text-align: left;
341
+ font: inherit;
342
+ cursor: pointer;
343
+ }
344
+ nav button.active,
345
+ nav button:hover {
346
+ background: color-mix(in srgb, var(--accent) 35%, transparent);
347
+ }
348
+ main {
349
+ min-width: 0;
350
+ display: flex;
351
+ flex-direction: column;
352
+ }
353
+ header {
354
+ position: sticky;
355
+ top: 0;
356
+ z-index: 5;
357
+ display: flex;
358
+ justify-content: space-between;
359
+ gap: 16px;
360
+ align-items: center;
361
+ padding: 16px 22px;
362
+ background: color-mix(in srgb, var(--surface) 92%, transparent);
363
+ backdrop-filter: blur(12px);
364
+ border-bottom: 1px solid var(--border);
365
+ }
366
+ h1 {
367
+ font-size: 24px;
368
+ margin: 0;
369
+ }
370
+ h2 {
371
+ font-size: 16px;
372
+ margin: 0 0 12px;
373
+ }
374
+ p {
375
+ margin: 4px 0 0;
376
+ color: var(--muted);
377
+ }
378
+ a {
379
+ color: var(--link);
380
+ }
381
+ .header-actions,
382
+ .row,
383
+ .chat-toolbar,
384
+ .attachment-row {
385
+ display: flex;
386
+ gap: 8px;
387
+ align-items: center;
388
+ flex-wrap: wrap;
389
+ }
390
+ .menu {
391
+ display: none;
392
+ background: var(--surface-soft);
393
+ color: var(--text);
394
+ }
395
+ .page {
396
+ display: none;
397
+ padding: 22px;
398
+ }
399
+ .page.active {
400
+ display: block;
401
+ }
402
+ .stack {
403
+ display: flex;
404
+ flex-direction: column;
405
+ gap: 16px;
406
+ }
407
+ .metrics {
408
+ display: grid;
409
+ grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
410
+ gap: 12px;
411
+ margin-bottom: 16px;
412
+ }
413
+ .metric,
414
+ .panel {
415
+ background: var(--surface);
416
+ border: 1px solid var(--border);
417
+ border-radius: 8px;
418
+ padding: 16px;
419
+ box-shadow: var(--shadow);
420
+ }
421
+ .metric .label {
422
+ font-size: 12px;
423
+ text-transform: uppercase;
424
+ color: var(--muted);
425
+ }
426
+ .metric .value {
427
+ font-size: 22px;
428
+ font-weight: 750;
429
+ margin-top: 4px;
430
+ overflow: hidden;
431
+ text-overflow: ellipsis;
432
+ }
433
+ button,
434
+ select,
435
+ input,
436
+ textarea {
437
+ border: 1px solid var(--border);
438
+ border-radius: 6px;
439
+ background: var(--surface);
440
+ color: var(--text);
441
+ font: inherit;
442
+ line-height: 1.2;
443
+ vertical-align: middle;
444
+ }
445
+ button {
446
+ appearance: none;
447
+ -webkit-appearance: none;
448
+ display: inline-flex;
449
+ align-items: center;
450
+ justify-content: center;
451
+ gap: 6px;
452
+ min-height: 36px;
453
+ height: 36px;
454
+ padding: 0 12px;
455
+ background: var(--accent);
456
+ color: white;
457
+ border-color: var(--accent);
458
+ cursor: pointer;
459
+ line-height: 1;
460
+ text-align: center;
461
+ white-space: nowrap;
462
+ }
463
+ button::-moz-focus-inner {
464
+ border: 0;
465
+ padding: 0;
466
+ }
467
+ button:hover {
468
+ background: var(--accent-strong);
469
+ }
470
+ button.secondary {
471
+ background: var(--surface);
472
+ color: var(--text);
473
+ }
474
+ button:disabled {
475
+ cursor: not-allowed;
476
+ }
477
+ input,
478
+ select {
479
+ min-height: 36px;
480
+ height: 36px;
481
+ padding: 0 10px;
482
+ }
483
+ textarea {
484
+ width: 100%;
485
+ padding: 10px;
486
+ resize: vertical;
487
+ line-height: 1.4;
488
+ }
489
+ nav button {
490
+ display: flex;
491
+ align-items: center;
492
+ justify-content: flex-start;
493
+ width: 100%;
494
+ min-height: 40px;
495
+ height: 40px;
496
+ padding: 0 12px;
497
+ line-height: 1.1;
498
+ text-align: left;
499
+ }
500
+ .menu {
501
+ align-items: center;
502
+ justify-content: center;
503
+ line-height: 1;
504
+ }
505
+ .chat-layout {
506
+ display: grid;
507
+ grid-template-columns: minmax(0, 1fr) 330px;
508
+ gap: 16px;
509
+ align-items: start;
510
+ }
511
+ .chat-panel {
512
+ height: calc(100vh - 170px);
513
+ min-height: 520px;
514
+ display: flex;
515
+ flex-direction: column;
516
+ }
517
+ .control-grid {
518
+ display: grid;
519
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
520
+ gap: 8px;
521
+ margin: 12px 0;
522
+ }
523
+ .control-grid label,
524
+ .form-grid label {
525
+ display: grid;
526
+ gap: 5px;
527
+ font-size: 12px;
528
+ color: var(--muted);
529
+ }
530
+ .messages {
531
+ flex: 1;
532
+ min-height: 0;
533
+ overflow: auto;
534
+ border: 1px solid var(--border-soft);
535
+ border-radius: 8px;
536
+ padding: 12px;
537
+ background: var(--surface-soft);
538
+ }
539
+ .message {
540
+ margin: 0 0 12px;
541
+ padding: 10px 12px;
542
+ border-radius: 8px;
543
+ max-width: 92%;
544
+ white-space: pre-wrap;
545
+ word-break: break-word;
546
+ }
547
+ .message.user {
548
+ margin-left: auto;
549
+ background: var(--accent-soft);
550
+ }
551
+ .message.agent {
552
+ background: color-mix(in srgb, var(--surface-soft) 80%, var(--border));
553
+ }
554
+ .message.system {
555
+ background: var(--warn);
556
+ }
557
+ .composer {
558
+ display: grid;
559
+ grid-template-columns: 1fr auto;
560
+ gap: 10px;
561
+ margin-top: 12px;
562
+ }
563
+ .composer-fields {
564
+ min-width: 0;
565
+ }
566
+ .composer button {
567
+ height: auto;
568
+ min-width: 90px;
569
+ }
570
+ .attachment-row {
571
+ margin-top: 8px;
572
+ color: var(--muted);
573
+ font-size: 13px;
574
+ }
575
+ .file-button {
576
+ display: inline-flex;
577
+ align-items: center;
578
+ justify-content: center;
579
+ min-height: 34px;
580
+ height: 34px;
581
+ padding: 0 10px;
582
+ border: 1px solid var(--border);
583
+ border-radius: 6px;
584
+ background: var(--surface);
585
+ color: var(--text);
586
+ cursor: pointer;
587
+ line-height: 1;
588
+ }
589
+ input[type=file] {
590
+ display: none;
591
+ }
592
+ .sessions-toolbar {
593
+ display: flex;
594
+ justify-content: space-between;
595
+ align-items: center;
596
+ gap: 12px;
597
+ flex-wrap: wrap;
598
+ }
599
+ .sessions-toolbar .search-row {
600
+ flex: 1 1 320px;
601
+ }
602
+ .sessions-toolbar .attach-row {
603
+ flex: 1 1 360px;
604
+ justify-content: flex-end;
605
+ margin-left: auto;
606
+ }
607
+ .sessions-toolbar input {
608
+ min-width: 220px;
609
+ }
610
+ .copy-id {
611
+ height: auto;
612
+ min-height: 0;
613
+ padding: 0;
614
+ border: 0;
615
+ background: transparent;
616
+ color: var(--link);
617
+ font-family:
618
+ ui-monospace,
619
+ SFMono-Regular,
620
+ Menlo,
621
+ Consolas,
622
+ monospace;
623
+ font-size: 12px;
624
+ line-height: 1.25;
625
+ white-space: normal;
626
+ }
627
+ .copy-id:hover {
628
+ background: transparent;
629
+ text-decoration: underline;
630
+ }
631
+ .side-panel {
632
+ max-height: calc(100vh - 126px);
633
+ display: flex;
634
+ flex-direction: column;
635
+ }
636
+ .tool-stream {
637
+ display: flex;
638
+ flex-direction: column;
639
+ gap: 8px;
640
+ overflow: auto;
641
+ max-height: calc(100vh - 190px);
642
+ padding-right: 4px;
643
+ }
644
+ .tool {
645
+ border: 1px solid var(--border-soft);
646
+ border-radius: 6px;
647
+ padding: 8px;
648
+ background: var(--surface-soft);
649
+ white-space: pre-wrap;
650
+ word-break: break-word;
651
+ }
652
+ .list {
653
+ display: flex;
654
+ flex-direction: column;
655
+ gap: 8px;
656
+ margin-top: 12px;
657
+ }
658
+ .item {
659
+ border: 1px solid var(--border-soft);
660
+ border-radius: 8px;
661
+ padding: 12px;
662
+ background: var(--surface-soft);
663
+ }
664
+ .item strong {
665
+ display: block;
666
+ overflow-wrap: anywhere;
667
+ line-height: 1.25;
668
+ }
669
+ .item small {
670
+ display: block;
671
+ color: var(--muted);
672
+ overflow-wrap: anywhere;
673
+ line-height: 1.35;
674
+ }
675
+ .queue-item {
676
+ cursor: grab;
677
+ }
678
+ .queue-item.dragging {
679
+ opacity: .55;
680
+ }
681
+ .badge,
682
+ .adapter-status {
683
+ display: inline-flex;
684
+ align-items: center;
685
+ justify-content: center;
686
+ min-height: 20px;
687
+ border: 1px solid var(--border);
688
+ border-radius: 999px;
689
+ padding: 0 8px;
690
+ color: var(--muted);
691
+ font-size: 12px;
692
+ line-height: 1;
693
+ }
694
+ .adapter-status {
695
+ margin-left: 6px;
696
+ text-transform: capitalize;
697
+ }
698
+ .adapter-status.enabled,
699
+ .adapter-status.available {
700
+ color: #1e754e;
701
+ border-color: #8ed0aa;
702
+ background: color-mix(in srgb, var(--accent-soft) 55%, transparent);
703
+ }
704
+ .adapter-status.disabled {
705
+ color: var(--muted);
706
+ }
707
+ .adapter-status.planned {
708
+ color: #8a6a12;
709
+ border-color: #d9c27a;
710
+ background: var(--warn);
711
+ }
712
+ .feature-matrix {
713
+ display: grid;
714
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
715
+ gap: 6px;
716
+ margin-top: 10px;
717
+ }
718
+ .feature-chip {
719
+ display: flex;
720
+ align-items: center;
721
+ justify-content: space-between;
722
+ gap: 8px;
723
+ border: 1px solid var(--border-soft);
724
+ border-radius: 6px;
725
+ padding: 5px 7px;
726
+ font-size: 12px;
727
+ line-height: 1.2;
728
+ color: var(--muted);
729
+ background: var(--surface);
730
+ }
731
+ .feature-chip.supported {
732
+ color: #1e754e;
733
+ }
734
+ .feature-chip.unsupported {
735
+ opacity: .62;
736
+ }
737
+ .preview {
738
+ margin-top: 12px;
739
+ }
740
+ .preview img {
741
+ max-width: 100%;
742
+ border: 1px solid var(--border);
743
+ border-radius: 8px;
744
+ background: var(--surface);
745
+ }
746
+ .settings-grid {
747
+ display: block;
748
+ }
749
+ .setting {
750
+ border: 1px solid var(--border-soft);
751
+ border-radius: 8px;
752
+ padding: 12px;
753
+ margin-bottom: 10px;
754
+ background: var(--surface-soft);
755
+ }
756
+ .setting label {
757
+ display: block;
758
+ font-size: 13px;
759
+ font-weight: 700;
760
+ margin-bottom: 6px;
761
+ }
762
+ .setting small {
763
+ display: block;
764
+ color: var(--muted);
765
+ margin-top: 6px;
766
+ }
767
+ .setting input,
768
+ .setting textarea,
769
+ .setting select {
770
+ width: 100%;
771
+ }
772
+ .setting-error {
773
+ color: var(--danger);
774
+ font-size: 12px;
775
+ margin-top: 6px;
776
+ }
777
+ .checkbox {
778
+ display: inline-flex !important;
779
+ grid-template-columns: auto 1fr !important;
780
+ align-items: center;
781
+ gap: 8px;
782
+ }
783
+ .checkbox input {
784
+ height: auto;
785
+ width: auto;
786
+ }
787
+ .tabs {
788
+ display: flex;
789
+ gap: 8px;
790
+ flex-wrap: wrap;
791
+ margin: 14px 0;
792
+ }
793
+ .tabs button {
794
+ background: var(--surface);
795
+ color: var(--text);
796
+ border-color: var(--border);
797
+ min-height: 34px;
798
+ height: 34px;
799
+ line-height: 1;
800
+ }
801
+ .tabs button.active {
802
+ background: var(--accent);
803
+ color: white;
804
+ border-color: var(--accent);
805
+ }
806
+ .pager {
807
+ display: flex;
808
+ justify-content: space-between;
809
+ align-items: center;
810
+ gap: 10px;
811
+ flex-wrap: wrap;
812
+ margin-top: 12px;
813
+ color: var(--muted);
814
+ }
815
+ .pager-actions {
816
+ display: flex;
817
+ gap: 8px;
818
+ }
819
+ .pager button:disabled {
820
+ opacity: .45;
821
+ cursor: not-allowed;
822
+ }
823
+ pre {
824
+ white-space: pre-wrap;
825
+ word-break: break-word;
826
+ background: var(--pre);
827
+ color: var(--pre-text);
828
+ border-radius: 8px;
829
+ padding: 14px;
830
+ overflow: auto;
831
+ }
832
+ footer {
833
+ margin-top: auto;
834
+ display: flex;
835
+ gap: 18px;
836
+ flex-wrap: wrap;
837
+ padding: 14px 22px;
838
+ border-top: 1px solid var(--border);
839
+ color: var(--muted);
840
+ background: var(--surface);
841
+ }
842
+ dialog {
843
+ border: 1px solid var(--border);
844
+ border-radius: 8px;
845
+ background: var(--surface);
846
+ color: var(--text);
847
+ width: min(720px, calc(100vw - 28px));
848
+ padding: 18px;
849
+ box-shadow: 0 18px 70px rgba(0, 0, 0, .22);
850
+ }
851
+ dialog::backdrop {
852
+ background: rgba(0, 0, 0, .35);
853
+ }
854
+ .form-grid {
855
+ display: grid;
856
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
857
+ gap: 12px;
858
+ }
859
+ .dialog-actions {
860
+ justify-content: flex-end;
861
+ margin-top: 16px;
862
+ }
863
+ #toast {
864
+ position: fixed;
865
+ right: 18px;
866
+ bottom: 18px;
867
+ display: none;
868
+ background: var(--accent);
869
+ color: white;
870
+ border-radius: 8px;
871
+ padding: 12px 14px;
872
+ max-width: 360px;
873
+ }
874
+ .danger {
875
+ background: var(--danger);
876
+ border-color: var(--danger);
877
+ color: white;
878
+ }
879
+ .form-grid .full-span {
880
+ grid-column: 1/-1;
881
+ }
882
+ .permission-grid {
883
+ display: grid;
884
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
885
+ gap: 6px;
886
+ max-height: 220px;
887
+ overflow: auto;
888
+ border: 1px solid var(--border-soft);
889
+ border-radius: 8px;
890
+ padding: 8px;
891
+ background: var(--surface-soft);
892
+ }
893
+ @media (max-width: 860px) {
894
+ .app {
895
+ display: block;
896
+ }
897
+ .sidebar {
898
+ position: fixed;
899
+ inset: 0 auto 0 0;
900
+ width: 270px;
901
+ transform: translateX(-100%);
902
+ transition: .18s transform;
903
+ z-index: 20;
904
+ }
905
+ .sidebar.open {
906
+ transform: translateX(0);
907
+ }
908
+ .menu {
909
+ display: inline-flex;
910
+ }
911
+ .header-actions {
912
+ justify-content: flex-end;
913
+ }
914
+ .page {
915
+ padding: 14px;
916
+ }
917
+ .overview-adapter-grid {
918
+ grid-template-columns: 1fr;
919
+ }
920
+ .chat-layout {
921
+ grid-template-columns: 1fr;
922
+ }
923
+ .chat-panel {
924
+ height: auto;
925
+ min-height: 0;
926
+ }
927
+ .messages {
928
+ max-height: 55vh;
929
+ min-height: 300px;
930
+ }
931
+ .composer {
932
+ grid-template-columns: 1fr;
933
+ }
934
+ .composer button {
935
+ height: 40px;
936
+ }
937
+ .side-panel {
938
+ order: -1;
939
+ max-height: 360px;
940
+ }
941
+ .tool-stream {
942
+ max-height: 300px;
943
+ }
944
+ header {
945
+ align-items: flex-start;
946
+ }
947
+ .metrics {
948
+ grid-template-columns: 1fr 1fr;
949
+ }
950
+ }
951
+ @media (max-width: 560px) {
952
+ .metrics {
953
+ grid-template-columns: 1fr;
954
+ }
955
+ .row {
956
+ align-items: stretch;
957
+ }
958
+ .row > * {
959
+ width: 100%;
960
+ }
961
+ header {
962
+ display: grid;
963
+ grid-template-columns: auto 1fr;
964
+ }
965
+ .header-actions {
966
+ grid-column: 1/3;
967
+ }
968
+ .message {
969
+ max-width: 100%;
970
+ }
971
+ .pager {
972
+ align-items: stretch;
973
+ }
974
+ .pager-actions,
975
+ .pager button {
976
+ width: 100%;
977
+ }
978
+ .attachment-row > *,
979
+ .sessions-toolbar,
980
+ .sessions-toolbar .row,
981
+ .sessions-toolbar input,
982
+ .sessions-toolbar button {
983
+ width: 100%;
984
+ }
985
+ .sessions-toolbar .attach-row {
986
+ margin-left: 0;
987
+ justify-content: stretch;
988
+ }
989
+ }