rubyrlm 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 (52) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +32 -0
  3. data/LICENSE +21 -0
  4. data/README.md +300 -0
  5. data/bin/rubyrlm +168 -0
  6. data/lib/rubyrlm/backends/base.rb +9 -0
  7. data/lib/rubyrlm/backends/gemini_rest.rb +317 -0
  8. data/lib/rubyrlm/client.rb +643 -0
  9. data/lib/rubyrlm/completion.rb +71 -0
  10. data/lib/rubyrlm/errors.rb +9 -0
  11. data/lib/rubyrlm/logger/jsonl_logger.rb +27 -0
  12. data/lib/rubyrlm/pricing.rb +88 -0
  13. data/lib/rubyrlm/prompts/system_prompt.rb +108 -0
  14. data/lib/rubyrlm/protocol/action_parser.rb +84 -0
  15. data/lib/rubyrlm/repl/code_validator.rb +113 -0
  16. data/lib/rubyrlm/repl/docker_repl/container_manager.rb +158 -0
  17. data/lib/rubyrlm/repl/docker_repl/host_rpc_server.rb +164 -0
  18. data/lib/rubyrlm/repl/docker_repl/protocol.rb +26 -0
  19. data/lib/rubyrlm/repl/docker_repl.rb +190 -0
  20. data/lib/rubyrlm/repl/execution_result.rb +41 -0
  21. data/lib/rubyrlm/repl/local_repl.rb +476 -0
  22. data/lib/rubyrlm/sub_call_cache.rb +47 -0
  23. data/lib/rubyrlm/version.rb +3 -0
  24. data/lib/rubyrlm/web/app.rb +41 -0
  25. data/lib/rubyrlm/web/public/css/components.css +649 -0
  26. data/lib/rubyrlm/web/public/css/design-system.css +1396 -0
  27. data/lib/rubyrlm/web/public/js/app.js +1016 -0
  28. data/lib/rubyrlm/web/public/js/components/charts.js +68 -0
  29. data/lib/rubyrlm/web/public/js/components/context-inspector.js +94 -0
  30. data/lib/rubyrlm/web/public/js/components/exec-chain.js +105 -0
  31. data/lib/rubyrlm/web/public/js/components/kpi-dashboard.js +187 -0
  32. data/lib/rubyrlm/web/public/js/components/query-panel.js +335 -0
  33. data/lib/rubyrlm/web/public/js/components/recursion-tree.js +83 -0
  34. data/lib/rubyrlm/web/public/js/components/session-list.js +160 -0
  35. data/lib/rubyrlm/web/public/js/components/step-navigator.js +129 -0
  36. data/lib/rubyrlm/web/public/js/components/timeline.js +281 -0
  37. data/lib/rubyrlm/web/public/js/lib/animation.js +46 -0
  38. data/lib/rubyrlm/web/public/js/lib/chart-renderer.js +116 -0
  39. data/lib/rubyrlm/web/public/js/lib/diagram-renderer.js +233 -0
  40. data/lib/rubyrlm/web/public/js/lib/sse-client.js +94 -0
  41. data/lib/rubyrlm/web/public/js/lib/theme-manager.js +39 -0
  42. data/lib/rubyrlm/web/public/js/utils.js +57 -0
  43. data/lib/rubyrlm/web/routes/api.rb +129 -0
  44. data/lib/rubyrlm/web/routes/pages.rb +365 -0
  45. data/lib/rubyrlm/web/routes/sse.rb +95 -0
  46. data/lib/rubyrlm/web/services/event_broadcaster.rb +36 -0
  47. data/lib/rubyrlm/web/services/export_service.rb +903 -0
  48. data/lib/rubyrlm/web/services/query_service.rb +221 -0
  49. data/lib/rubyrlm/web/services/session_loader.rb +356 -0
  50. data/lib/rubyrlm/web/services/streaming_logger.rb +22 -0
  51. data/lib/rubyrlm.rb +18 -0
  52. metadata +208 -0
@@ -0,0 +1,1396 @@
1
+ :root {
2
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
3
+ --font-mono: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
4
+
5
+ --radius-sm: 2px;
6
+ --radius-md: 4px;
7
+ --radius-lg: 8px;
8
+ --radius-xl: 12px;
9
+
10
+ --space-1: 0.25rem;
11
+ --space-2: 0.5rem;
12
+ --space-3: 0.75rem;
13
+ --space-4: 1rem;
14
+ --space-5: 1.5rem;
15
+ --space-6: 2rem;
16
+
17
+ --transition-fast: 140ms ease;
18
+ --transition-base: 200ms ease;
19
+
20
+ /* Custom Syntax Highlighting (Night Owl / Synthwave inspired) */
21
+ --syntax-bg: #010409;
22
+ --syntax-text: #e2e8f0;
23
+ --syntax-punctuation: #64748b;
24
+ --syntax-keyword: #ff2c83;
25
+ --syntax-function: #38bdf8;
26
+ --syntax-string: #a6e22e;
27
+ --syntax-number: #f78c6c;
28
+ --syntax-operator: #82aaff;
29
+ --syntax-class-name: #e5c07b;
30
+ --syntax-comment: #7e8ce0;
31
+ --syntax-property: #c792ea;
32
+ }
33
+
34
+ [data-theme="dark"] {
35
+ --color-bg: #111921;
36
+ --color-surface-0: rgba(17, 25, 33, 0.92);
37
+ --color-surface-1: rgba(14, 20, 28, 0.9);
38
+ --color-surface-2: rgba(10, 15, 22, 0.9);
39
+ --color-surface-3: rgba(8, 12, 18, 0.92);
40
+ --color-border: rgba(88, 102, 120, 0.36);
41
+ --color-border-subtle: rgba(88, 102, 120, 0.2);
42
+
43
+ --color-text: #e2e8f0;
44
+ --color-text-muted: #a0aec0;
45
+ --color-text-dim: #64748b;
46
+
47
+ --color-accent: #197fe6;
48
+ --color-accent-glow: rgba(25, 127, 230, 0.24);
49
+ --color-accent-soft: rgba(25, 127, 230, 0.12);
50
+
51
+ --color-success: #22c55e;
52
+ --color-error: #ef4444;
53
+ --color-warning: #f59e0b;
54
+ --color-info: #38bdf8;
55
+
56
+ --color-success-bg: rgba(34, 197, 94, 0.14);
57
+ --color-error-bg: rgba(239, 68, 68, 0.16);
58
+ --color-warning-bg: rgba(245, 158, 11, 0.18);
59
+ --color-info-bg: rgba(56, 189, 248, 0.15);
60
+
61
+ --shadow-node: 0 14px 40px -28px rgba(0, 0, 0, 0.8);
62
+ --shadow-hero: 0 24px 54px -40px rgba(0, 0, 0, 0.85);
63
+
64
+ color-scheme: dark;
65
+ }
66
+
67
+ [data-theme="light"] {
68
+ --color-bg: #f6f7f8;
69
+ --color-surface-0: rgba(255, 255, 255, 0.95);
70
+ --color-surface-1: rgba(255, 255, 255, 0.94);
71
+ --color-surface-2: rgba(248, 250, 252, 0.96);
72
+ --color-surface-3: rgba(241, 245, 249, 0.96);
73
+ --color-border: rgba(100, 116, 139, 0.28);
74
+ --color-border-subtle: rgba(100, 116, 139, 0.16);
75
+
76
+ --color-text: #0f172a;
77
+ --color-text-muted: #334155;
78
+ --color-text-dim: #64748b;
79
+
80
+ --color-accent: #197fe6;
81
+ --color-accent-glow: rgba(25, 127, 230, 0.18);
82
+ --color-accent-soft: rgba(25, 127, 230, 0.1);
83
+
84
+ --color-success: #16a34a;
85
+ --color-error: #dc2626;
86
+ --color-warning: #d97706;
87
+ --color-info: #0284c7;
88
+
89
+ --color-success-bg: rgba(22, 163, 74, 0.1);
90
+ --color-error-bg: rgba(220, 38, 38, 0.11);
91
+ --color-warning-bg: rgba(217, 119, 6, 0.12);
92
+ --color-info-bg: rgba(2, 132, 199, 0.1);
93
+
94
+ --shadow-node: 0 12px 34px -28px rgba(15, 23, 42, 0.3);
95
+ --shadow-hero: 0 20px 44px -34px rgba(15, 23, 42, 0.28);
96
+
97
+ color-scheme: light;
98
+ }
99
+
100
+ *,
101
+ *::before,
102
+ *::after {
103
+ box-sizing: border-box;
104
+ }
105
+
106
+ html,
107
+ body {
108
+ margin: 0;
109
+ padding: 0;
110
+ height: 100%;
111
+ }
112
+
113
+ body {
114
+ position: relative;
115
+ overflow: hidden;
116
+ font-family: var(--font-sans);
117
+ font-size: 14px;
118
+ line-height: 1.45;
119
+ color: var(--color-text);
120
+ background: var(--color-bg);
121
+ }
122
+
123
+ .grid-overlay {
124
+ position: fixed;
125
+ inset: 0;
126
+ pointer-events: none;
127
+ opacity: 0.32;
128
+ background-image: radial-gradient(circle, rgba(148, 163, 184, 0.35) 1px, transparent 1px);
129
+ background-size: 24px 24px;
130
+ z-index: 0;
131
+ }
132
+
133
+ ::-webkit-scrollbar {
134
+ width: 6px;
135
+ height: 6px;
136
+ }
137
+
138
+ ::-webkit-scrollbar-thumb {
139
+ background: var(--color-border);
140
+ border-radius: 3px;
141
+ }
142
+
143
+ ::-webkit-scrollbar-track {
144
+ background: transparent;
145
+ }
146
+
147
+ .top-nav {
148
+ position: relative;
149
+ z-index: 10;
150
+ height: 60px;
151
+ display: flex;
152
+ align-items: center;
153
+ gap: var(--space-5);
154
+ padding: 0 var(--space-5);
155
+ border-bottom: 1px solid var(--color-border);
156
+ background: var(--color-surface-1);
157
+ backdrop-filter: blur(8px);
158
+ }
159
+
160
+ .top-nav__brand {
161
+ display: flex;
162
+ align-items: center;
163
+ gap: var(--space-3);
164
+ }
165
+
166
+ .top-nav__logo {
167
+ width: 30px;
168
+ height: 30px;
169
+ display: grid;
170
+ place-items: center;
171
+ border-radius: var(--radius-md);
172
+ color: #fff;
173
+ background: var(--color-accent);
174
+ box-shadow: 0 0 0 1px var(--color-accent-glow);
175
+ }
176
+
177
+ .top-nav__title-group {
178
+ display: flex;
179
+ flex-direction: column;
180
+ gap: 1px;
181
+ }
182
+
183
+ .top-nav__title {
184
+ margin: 0;
185
+ font-size: 0.95rem;
186
+ font-weight: 900;
187
+ letter-spacing: 0.08em;
188
+ text-transform: uppercase;
189
+ }
190
+
191
+ .top-nav__subtitle {
192
+ font-size: 0.58rem;
193
+ font-weight: 700;
194
+ letter-spacing: 0.17em;
195
+ text-transform: uppercase;
196
+ color: var(--color-text-dim);
197
+ }
198
+
199
+ .top-nav__modes {
200
+ display: flex;
201
+ gap: 0.35rem;
202
+ padding: 0.22rem;
203
+ border: 1px solid var(--color-border);
204
+ border-radius: var(--radius-md);
205
+ background: var(--color-surface-3);
206
+ }
207
+
208
+ .mode-btn {
209
+ border: 1px solid transparent;
210
+ background: transparent;
211
+ color: var(--color-text-muted);
212
+ font-family: var(--font-mono);
213
+ font-size: 0.71rem;
214
+ font-weight: 700;
215
+ letter-spacing: 0.07em;
216
+ text-transform: uppercase;
217
+ display: inline-flex;
218
+ align-items: center;
219
+ gap: 0.45rem;
220
+ padding: 0.45rem 0.65rem;
221
+ border-radius: var(--radius-sm);
222
+ cursor: pointer;
223
+ transition: all var(--transition-fast);
224
+ }
225
+
226
+ .mode-btn:hover {
227
+ color: var(--color-text);
228
+ background: var(--color-surface-2);
229
+ }
230
+
231
+ .mode-btn--active {
232
+ color: #fff;
233
+ border-color: var(--color-accent);
234
+ background: linear-gradient(180deg, rgba(25, 127, 230, 0.85) 0%, rgba(25, 127, 230, 0.62) 100%);
235
+ }
236
+
237
+ .top-nav__telemetry {
238
+ margin-left: auto;
239
+ display: flex;
240
+ align-items: center;
241
+ gap: var(--space-2);
242
+ }
243
+
244
+ .telemetry-pill {
245
+ border: 1px solid var(--color-border);
246
+ border-radius: 999px;
247
+ padding: 0.2rem 0.5rem;
248
+ font-family: var(--font-mono);
249
+ font-size: 0.62rem;
250
+ font-weight: 700;
251
+ letter-spacing: 0.08em;
252
+ text-transform: uppercase;
253
+ display: inline-flex;
254
+ align-items: center;
255
+ gap: 0.35rem;
256
+ background: var(--color-surface-2);
257
+ }
258
+
259
+ .telemetry-pill i {
260
+ font-size: 0.45rem;
261
+ color: var(--color-success);
262
+ }
263
+
264
+ .telemetry-pill--muted i {
265
+ color: inherit;
266
+ }
267
+
268
+ .telemetry-pill--muted {
269
+ color: var(--color-text-dim);
270
+ }
271
+
272
+ .top-nav__actions {
273
+ display: flex;
274
+ align-items: center;
275
+ gap: var(--space-2);
276
+ }
277
+
278
+ .theme-toggle {
279
+ width: 32px;
280
+ height: 32px;
281
+ border-radius: var(--radius-sm);
282
+ border: 1px solid var(--color-border);
283
+ background: var(--color-surface-2);
284
+ color: var(--color-text-muted);
285
+ display: grid;
286
+ place-items: center;
287
+ cursor: pointer;
288
+ transition: all var(--transition-fast);
289
+ }
290
+
291
+ .theme-toggle:hover {
292
+ color: var(--color-accent);
293
+ border-color: var(--color-accent);
294
+ }
295
+
296
+ .app-layout {
297
+ position: relative;
298
+ z-index: 1;
299
+ height: calc(100vh - 60px - 34px);
300
+ display: flex;
301
+ overflow: hidden;
302
+ }
303
+
304
+ .sidebar {
305
+ width: 270px;
306
+ flex-shrink: 0;
307
+ border-right: 1px solid var(--color-border);
308
+ background: var(--color-surface-1);
309
+ display: flex;
310
+ flex-direction: column;
311
+ }
312
+
313
+ .sidebar__section {
314
+ display: flex;
315
+ flex-direction: column;
316
+ min-height: 0;
317
+ flex: 1;
318
+ }
319
+
320
+ .sidebar__section--hidden {
321
+ display: none;
322
+ }
323
+
324
+ .sidebar__header {
325
+ padding: 0.8rem 0.95rem;
326
+ border-bottom: 1px solid var(--color-border);
327
+ font-family: var(--font-mono);
328
+ font-size: 0.67rem;
329
+ font-weight: 700;
330
+ letter-spacing: 0.12em;
331
+ text-transform: uppercase;
332
+ color: var(--color-text-muted);
333
+ }
334
+
335
+ .sidebar__header--with-actions {
336
+ display: flex;
337
+ align-items: center;
338
+ justify-content: space-between;
339
+ gap: 0.45rem;
340
+ }
341
+
342
+ .sidebar__header-actions {
343
+ display: inline-flex;
344
+ align-items: center;
345
+ gap: 0.3rem;
346
+ }
347
+
348
+ .sidebar__header-btn {
349
+ border: 1px solid var(--color-border);
350
+ border-radius: var(--radius-sm);
351
+ background: var(--color-surface-2);
352
+ color: var(--color-text-dim);
353
+ cursor: pointer;
354
+ font-family: var(--font-mono);
355
+ font-size: 0.56rem;
356
+ font-weight: 700;
357
+ letter-spacing: 0.08em;
358
+ text-transform: uppercase;
359
+ padding: 0.22rem 0.36rem;
360
+ transition: all var(--transition-fast);
361
+ }
362
+
363
+ .sidebar__header-btn:hover {
364
+ color: var(--color-text);
365
+ border-color: var(--color-accent);
366
+ }
367
+
368
+ .sidebar__header-btn--accent {
369
+ color: #fff;
370
+ background: var(--color-accent);
371
+ border-color: var(--color-accent);
372
+ }
373
+
374
+ .sidebar__header-btn--accent:hover {
375
+ color: #fff;
376
+ filter: brightness(1.06);
377
+ }
378
+
379
+ .sidebar__list {
380
+ flex: 1;
381
+ min-height: 0;
382
+ overflow-y: auto;
383
+ }
384
+
385
+ .sidebar__loading {
386
+ padding: 1rem;
387
+ font-size: 0.78rem;
388
+ color: var(--color-text-dim);
389
+ }
390
+
391
+ .session-item {
392
+ width: 100%;
393
+ border: 0;
394
+ border-bottom: 1px solid var(--color-border-subtle);
395
+ border-left: 3px solid transparent;
396
+ background: transparent;
397
+ color: inherit;
398
+ cursor: pointer;
399
+ text-align: left;
400
+ padding: 0.65rem 0.8rem 0.75rem;
401
+ transition: all var(--transition-fast);
402
+ }
403
+
404
+ .session-item:hover {
405
+ background: var(--color-surface-2);
406
+ }
407
+
408
+ .session-item--active {
409
+ border-left-color: var(--color-accent);
410
+ background: var(--color-accent-soft);
411
+ }
412
+
413
+ .session-item__name {
414
+ font-family: var(--font-mono);
415
+ font-size: 0.78rem;
416
+ font-weight: 700;
417
+ letter-spacing: 0.05em;
418
+ text-transform: uppercase;
419
+ margin-bottom: 0.2rem;
420
+ }
421
+
422
+ .session-item__meta {
423
+ display: flex;
424
+ align-items: center;
425
+ flex-wrap: wrap;
426
+ gap: 0.35rem;
427
+ font-size: 0.66rem;
428
+ color: var(--color-text-dim);
429
+ font-family: var(--font-mono);
430
+ }
431
+
432
+ .session-item__badge {
433
+ padding: 0.1rem 0.25rem;
434
+ border: 1px solid var(--color-border);
435
+ border-radius: var(--radius-sm);
436
+ }
437
+
438
+ .session-item__badge--err {
439
+ color: var(--color-error);
440
+ border-color: rgba(239, 68, 68, 0.35);
441
+ background: var(--color-error-bg);
442
+ }
443
+
444
+ .session-item__badge--ok {
445
+ color: var(--color-success);
446
+ border-color: rgba(34, 197, 94, 0.35);
447
+ background: var(--color-success-bg);
448
+ }
449
+
450
+ .sidebar__nav-list {
451
+ padding: 0.45rem;
452
+ display: flex;
453
+ flex-direction: column;
454
+ gap: 0.2rem;
455
+ }
456
+
457
+ .sidebar__nav-item {
458
+ display: flex;
459
+ align-items: center;
460
+ gap: 0.5rem;
461
+ padding: 0.45rem 0.55rem;
462
+ border: 1px solid transparent;
463
+ border-radius: var(--radius-sm);
464
+ text-decoration: none;
465
+ font-family: var(--font-mono);
466
+ font-size: 0.69rem;
467
+ font-weight: 700;
468
+ letter-spacing: 0.06em;
469
+ text-transform: uppercase;
470
+ color: var(--color-text-dim);
471
+ }
472
+
473
+ .sidebar__nav-item:hover {
474
+ color: var(--color-text);
475
+ border-color: var(--color-border);
476
+ background: var(--color-surface-2);
477
+ }
478
+
479
+ .sidebar__nav-item--active {
480
+ color: var(--color-accent);
481
+ border-color: var(--color-accent);
482
+ background: var(--color-accent-soft);
483
+ }
484
+
485
+ .sidebar__form {
486
+ padding: 0.7rem;
487
+ display: flex;
488
+ flex-direction: column;
489
+ gap: 0.35rem;
490
+ }
491
+
492
+ .form-label {
493
+ margin-top: 0.3rem;
494
+ font-family: var(--font-mono);
495
+ font-size: 0.62rem;
496
+ font-weight: 700;
497
+ letter-spacing: 0.11em;
498
+ text-transform: uppercase;
499
+ color: var(--color-text-dim);
500
+ }
501
+
502
+ .form-label--inline {
503
+ display: inline-flex;
504
+ align-items: center;
505
+ gap: 0.4rem;
506
+ letter-spacing: 0.06em;
507
+ text-transform: none;
508
+ }
509
+
510
+ .form-label--inline input[type='checkbox'] {
511
+ accent-color: var(--color-accent);
512
+ }
513
+
514
+ .form-help {
515
+ font-family: var(--font-mono);
516
+ font-size: 0.62rem;
517
+ color: var(--color-text-dim);
518
+ line-height: 1.35;
519
+ }
520
+
521
+ .form-input,
522
+ .form-select {
523
+ width: 100%;
524
+ border: 1px solid var(--color-border);
525
+ border-radius: var(--radius-sm);
526
+ background: var(--color-surface-2);
527
+ color: var(--color-text);
528
+ font-family: var(--font-mono);
529
+ font-size: 0.74rem;
530
+ padding: 0.42rem 0.5rem;
531
+ outline: none;
532
+ }
533
+
534
+ .form-input:focus,
535
+ .form-select:focus {
536
+ border-color: var(--color-accent);
537
+ box-shadow: 0 0 0 2px var(--color-accent-soft);
538
+ }
539
+
540
+ .main-content {
541
+ flex: 1;
542
+ min-width: 0;
543
+ overflow-y: auto;
544
+ padding: var(--space-4);
545
+ }
546
+
547
+ .main-view {
548
+ max-width: 1120px;
549
+ margin: 0 auto;
550
+ display: flex;
551
+ flex-direction: column;
552
+ gap: var(--space-4);
553
+ }
554
+
555
+ .main-view--hidden {
556
+ display: none;
557
+ }
558
+
559
+ .main-view__empty {
560
+ border: 1px dashed var(--color-border);
561
+ border-radius: var(--radius-lg);
562
+ background: var(--color-surface-1);
563
+ color: var(--color-text-dim);
564
+ padding: 3rem 1.5rem;
565
+ display: flex;
566
+ flex-direction: column;
567
+ align-items: center;
568
+ justify-content: center;
569
+ gap: 0.85rem;
570
+ text-align: center;
571
+ }
572
+
573
+ .main-view__empty i {
574
+ font-size: 2rem;
575
+ color: var(--color-accent);
576
+ }
577
+
578
+ .node {
579
+ border: 1px solid var(--color-border);
580
+ background: var(--color-surface-1);
581
+ border-radius: var(--radius-lg);
582
+ box-shadow: var(--shadow-node);
583
+ padding: 1rem;
584
+ }
585
+
586
+ .node--hero {
587
+ background: var(--color-surface-0);
588
+ box-shadow: var(--shadow-hero);
589
+ }
590
+
591
+ .node--elevated {
592
+ background: var(--color-surface-2);
593
+ }
594
+
595
+ .node--recessed {
596
+ background: var(--color-surface-3);
597
+ }
598
+
599
+ .session-header__title {
600
+ margin: 0 0 0.65rem;
601
+ font-family: var(--font-mono);
602
+ font-size: 1rem;
603
+ font-weight: 700;
604
+ letter-spacing: 0.08em;
605
+ text-transform: uppercase;
606
+ }
607
+
608
+ .session-header__meta {
609
+ display: flex;
610
+ flex-wrap: wrap;
611
+ align-items: center;
612
+ gap: 0.4rem;
613
+ border: 1px solid var(--color-border);
614
+ border-radius: var(--radius-md);
615
+ background: var(--color-surface-2);
616
+ padding: 0.42rem 0.6rem;
617
+ font-family: var(--font-mono);
618
+ font-size: 0.68rem;
619
+ color: var(--color-text-muted);
620
+ }
621
+
622
+ .meta-item {
623
+ display: inline-flex;
624
+ align-items: center;
625
+ gap: 0.3rem;
626
+ }
627
+
628
+ .meta-item--accent {
629
+ color: var(--color-text);
630
+ }
631
+
632
+ .meta-item--ok {
633
+ color: var(--color-success);
634
+ }
635
+
636
+ .meta-item--err {
637
+ color: var(--color-error);
638
+ }
639
+
640
+ .meta-sep {
641
+ width: 4px;
642
+ height: 4px;
643
+ border-radius: 999px;
644
+ background: var(--color-text-dim);
645
+ }
646
+
647
+ .meta-badge {
648
+ border: 1px solid var(--color-border);
649
+ border-radius: var(--radius-sm);
650
+ padding: 0.1rem 0.35rem;
651
+ background: var(--color-surface-3);
652
+ color: var(--color-text);
653
+ }
654
+
655
+ .session-header__actions {
656
+ margin-top: 0.75rem;
657
+ display: flex;
658
+ gap: 0.4rem;
659
+ flex-wrap: wrap;
660
+ }
661
+
662
+ .session-header__query {
663
+ margin-top: 0.8rem;
664
+ }
665
+
666
+ .query-text {
667
+ border: 1px solid var(--color-border);
668
+ border-radius: var(--radius-md);
669
+ background: var(--color-surface-3);
670
+ padding: 0.65rem 0.75rem;
671
+ color: var(--color-text-muted);
672
+ font-family: var(--font-mono);
673
+ font-size: 0.78rem;
674
+ white-space: pre-wrap;
675
+ word-break: break-word;
676
+ }
677
+
678
+ .section-label {
679
+ display: inline-flex;
680
+ align-items: center;
681
+ gap: 0.42rem;
682
+ margin-bottom: 0.65rem;
683
+ font-family: var(--font-mono);
684
+ font-size: 0.63rem;
685
+ font-weight: 700;
686
+ letter-spacing: 0.11em;
687
+ text-transform: uppercase;
688
+ color: var(--color-text-muted);
689
+ }
690
+
691
+ .btn {
692
+ border: 1px solid var(--color-border);
693
+ border-radius: var(--radius-sm);
694
+ background: var(--color-surface-2);
695
+ color: var(--color-text);
696
+ cursor: pointer;
697
+ font-family: var(--font-mono);
698
+ font-size: 0.7rem;
699
+ font-weight: 700;
700
+ letter-spacing: 0.06em;
701
+ text-transform: uppercase;
702
+ padding: 0.45rem 0.68rem;
703
+ display: inline-flex;
704
+ align-items: center;
705
+ gap: 0.4rem;
706
+ transition: all var(--transition-fast);
707
+ }
708
+
709
+ .btn:hover {
710
+ border-color: var(--color-accent);
711
+ color: var(--color-accent);
712
+ }
713
+
714
+ .btn:disabled {
715
+ opacity: 0.6;
716
+ cursor: not-allowed;
717
+ }
718
+
719
+ .btn--accent {
720
+ color: #fff;
721
+ background: var(--color-accent);
722
+ border-color: var(--color-accent);
723
+ }
724
+
725
+ .btn--accent:hover {
726
+ color: #fff;
727
+ filter: brightness(1.05);
728
+ }
729
+
730
+ .btn--danger {
731
+ color: #fff;
732
+ border-color: var(--color-error);
733
+ background: var(--color-error);
734
+ }
735
+
736
+ .summary-grid {
737
+ display: grid;
738
+ gap: 0.6rem;
739
+ grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
740
+ }
741
+
742
+ .summary-card {
743
+ border: 1px solid var(--color-border);
744
+ border-radius: var(--radius-md);
745
+ background: var(--color-surface-2);
746
+ padding: 0.55rem 0.65rem;
747
+ }
748
+
749
+ .summary-card__label {
750
+ font-family: var(--font-mono);
751
+ font-size: 0.62rem;
752
+ color: var(--color-text-dim);
753
+ letter-spacing: 0.09em;
754
+ text-transform: uppercase;
755
+ }
756
+
757
+ .summary-card__value {
758
+ margin-top: 0.25rem;
759
+ font-family: var(--font-mono);
760
+ font-size: 1rem;
761
+ font-weight: 700;
762
+ }
763
+
764
+ .kpi-grid {
765
+ display: grid;
766
+ grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
767
+ gap: 0.7rem;
768
+ }
769
+
770
+ .kpi-card {
771
+ border: 1px solid var(--color-border);
772
+ border-radius: var(--radius-lg);
773
+ background: var(--color-surface-1);
774
+ box-shadow: var(--shadow-node);
775
+ padding: 0.95rem;
776
+ }
777
+
778
+ .kpi-card__label {
779
+ font-family: var(--font-mono);
780
+ font-size: 0.64rem;
781
+ color: var(--color-text-dim);
782
+ letter-spacing: 0.11em;
783
+ text-transform: uppercase;
784
+ }
785
+
786
+ .kpi-card__value {
787
+ margin-top: 0.42rem;
788
+ font-family: var(--font-mono);
789
+ font-size: 1.7rem;
790
+ font-weight: 700;
791
+ }
792
+
793
+ .kpi-card__status {
794
+ margin-top: 0.5rem;
795
+ display: inline-block;
796
+ border-radius: var(--radius-sm);
797
+ border: 1px solid var(--color-border);
798
+ padding: 0.1rem 0.35rem;
799
+ font-family: var(--font-mono);
800
+ font-size: 0.62rem;
801
+ letter-spacing: 0.08em;
802
+ text-transform: uppercase;
803
+ }
804
+
805
+ .kpi-card__status--healthy {
806
+ color: var(--color-success);
807
+ border-color: rgba(34, 197, 94, 0.38);
808
+ background: var(--color-success-bg);
809
+ }
810
+
811
+ .kpi-card__status--warning {
812
+ color: var(--color-warning);
813
+ border-color: rgba(245, 158, 11, 0.36);
814
+ background: var(--color-warning-bg);
815
+ }
816
+
817
+ .kpi-card__status--critical {
818
+ color: var(--color-error);
819
+ border-color: rgba(239, 68, 68, 0.35);
820
+ background: var(--color-error-bg);
821
+ }
822
+
823
+ .analytics-charts {
824
+ display: grid;
825
+ gap: 0.9rem;
826
+ grid-template-columns: 1fr 1fr;
827
+ }
828
+
829
+ .chart-container {
830
+ position: relative;
831
+ height: 270px;
832
+ }
833
+
834
+ .chart-container--small {
835
+ height: 220px;
836
+ }
837
+
838
+ .query-header {
839
+ display: flex;
840
+ justify-content: space-between;
841
+ align-items: center;
842
+ flex-wrap: wrap;
843
+ gap: 0.35rem;
844
+ margin-bottom: 0.65rem;
845
+ }
846
+
847
+ .query-header .section-label {
848
+ margin-bottom: 0;
849
+ }
850
+
851
+ .query-warning {
852
+ color: var(--color-warning);
853
+ font-family: var(--font-mono);
854
+ font-size: 0.6rem;
855
+ letter-spacing: 0.08em;
856
+ text-transform: uppercase;
857
+ display: inline-flex;
858
+ align-items: center;
859
+ gap: 0.35rem;
860
+ opacity: 0.85;
861
+ }
862
+
863
+ .query-textarea {
864
+ width: 100%;
865
+ min-height: 115px;
866
+ border: 1px solid var(--color-border);
867
+ border-radius: var(--radius-md);
868
+ background: #090e14;
869
+ color: #dbeafe;
870
+ font-family: var(--font-mono);
871
+ font-size: 0.8rem;
872
+ line-height: 1.55;
873
+ padding: 0.75rem;
874
+ resize: vertical;
875
+ outline: none;
876
+ }
877
+
878
+ .query-textarea:focus {
879
+ border-color: var(--color-accent);
880
+ box-shadow: 0 0 0 2px var(--color-accent-soft);
881
+ }
882
+
883
+ .query-actions {
884
+ margin-top: 0.75rem;
885
+ display: flex;
886
+ gap: 0.5rem;
887
+ }
888
+
889
+ .query-answer {
890
+ border: 1px solid var(--color-border);
891
+ border-radius: var(--radius-md);
892
+ background: var(--color-surface-3);
893
+ color: var(--color-text);
894
+ font-family: var(--font-mono);
895
+ font-size: 0.82rem;
896
+ line-height: 1.6;
897
+ white-space: pre-wrap;
898
+ padding: 0.7rem;
899
+ }
900
+
901
+ .comparison-controls {
902
+ display: flex;
903
+ align-items: center;
904
+ gap: 0.55rem;
905
+ margin-bottom: 0.7rem;
906
+ }
907
+
908
+ .comparison-vs {
909
+ font-family: var(--font-mono);
910
+ font-size: 0.68rem;
911
+ color: var(--color-text-dim);
912
+ text-transform: uppercase;
913
+ letter-spacing: 0.1em;
914
+ }
915
+
916
+ .flow-view {
917
+ display: flex;
918
+ flex-direction: column;
919
+ gap: 0.85rem;
920
+ }
921
+
922
+ .mermaid-container {
923
+ min-height: 240px;
924
+ border: 1px solid var(--color-border);
925
+ border-radius: var(--radius-md);
926
+ background: var(--color-surface-3);
927
+ padding: 0.7rem;
928
+ overflow: hidden;
929
+ }
930
+
931
+ .diagram-shell {
932
+ height: 100%;
933
+ display: flex;
934
+ flex-direction: column;
935
+ gap: 0.45rem;
936
+ }
937
+
938
+ .diagram-controls {
939
+ display: flex;
940
+ justify-content: flex-end;
941
+ gap: 0.3rem;
942
+ }
943
+
944
+ .diagram-control-btn {
945
+ border: 1px solid var(--color-border);
946
+ border-radius: var(--radius-sm);
947
+ background: var(--color-surface-2);
948
+ color: var(--color-text-muted);
949
+ font-family: var(--font-mono);
950
+ font-size: 0.68rem;
951
+ padding: 0.17rem 0.42rem;
952
+ cursor: pointer;
953
+ }
954
+
955
+ .diagram-control-btn:hover {
956
+ border-color: var(--color-accent);
957
+ color: var(--color-accent);
958
+ }
959
+
960
+ .diagram-viewport {
961
+ flex: 1;
962
+ min-height: 205px;
963
+ position: relative;
964
+ border: 1px solid var(--color-border-subtle);
965
+ border-radius: var(--radius-sm);
966
+ background: var(--color-surface-2);
967
+ overflow: hidden;
968
+ cursor: grab;
969
+ touch-action: none;
970
+ }
971
+
972
+ .diagram-viewport--dragging {
973
+ cursor: grabbing;
974
+ }
975
+
976
+ .diagram-canvas {
977
+ position: absolute;
978
+ left: 0;
979
+ top: 0;
980
+ transform-origin: 0 0;
981
+ will-change: transform;
982
+ }
983
+
984
+ .diagram-canvas svg {
985
+ display: block;
986
+ max-width: none;
987
+ }
988
+
989
+ .steps-panel {
990
+ width: 300px;
991
+ flex-shrink: 0;
992
+ border-left: 1px solid var(--color-border);
993
+ background: var(--color-surface-1);
994
+ display: flex;
995
+ flex-direction: column;
996
+ min-height: 0;
997
+ }
998
+
999
+ .steps-panel--hidden {
1000
+ display: none;
1001
+ }
1002
+
1003
+ .steps-panel__stats {
1004
+ padding: 0.75rem;
1005
+ border-bottom: 1px solid var(--color-border);
1006
+ }
1007
+
1008
+ .steps-panel__thread-title {
1009
+ margin-bottom: 0.6rem;
1010
+ display: inline-flex;
1011
+ align-items: center;
1012
+ gap: 0.45rem;
1013
+ font-family: var(--font-mono);
1014
+ font-size: 0.66rem;
1015
+ font-weight: 700;
1016
+ letter-spacing: 0.11em;
1017
+ text-transform: uppercase;
1018
+ color: var(--color-text-muted);
1019
+ }
1020
+
1021
+ .stat-grid {
1022
+ display: grid;
1023
+ grid-template-columns: repeat(4, 1fr);
1024
+ gap: 0.35rem;
1025
+ }
1026
+
1027
+ .stat-card {
1028
+ border: 1px solid var(--color-border);
1029
+ border-radius: var(--radius-sm);
1030
+ background: var(--color-surface-2);
1031
+ text-align: center;
1032
+ padding: 0.42rem 0.25rem;
1033
+ }
1034
+
1035
+ .stat-card__value {
1036
+ display: block;
1037
+ font-family: var(--font-mono);
1038
+ font-size: 1.05rem;
1039
+ font-weight: 700;
1040
+ }
1041
+
1042
+ .stat-card__label {
1043
+ display: block;
1044
+ margin-top: 0.12rem;
1045
+ font-family: var(--font-mono);
1046
+ font-size: 0.58rem;
1047
+ color: var(--color-text-dim);
1048
+ letter-spacing: 0.08em;
1049
+ text-transform: uppercase;
1050
+ }
1051
+
1052
+ .stat-card--success .stat-card__value {
1053
+ color: var(--color-success);
1054
+ }
1055
+
1056
+ .stat-card--error .stat-card__value {
1057
+ color: var(--color-error);
1058
+ }
1059
+
1060
+ .stat-card--info .stat-card__value {
1061
+ color: var(--color-info);
1062
+ }
1063
+
1064
+ .progress-bar {
1065
+ margin-top: 0.5rem;
1066
+ height: 5px;
1067
+ border: 1px solid var(--color-border-subtle);
1068
+ border-radius: 999px;
1069
+ overflow: hidden;
1070
+ display: flex;
1071
+ }
1072
+
1073
+ .progress-bar__segment {
1074
+ flex: 1;
1075
+ }
1076
+
1077
+ .progress-bar__segment--ok {
1078
+ background: var(--color-success);
1079
+ }
1080
+
1081
+ .progress-bar__segment--err {
1082
+ background: var(--color-error);
1083
+ }
1084
+
1085
+ .progress-bar__segment--final {
1086
+ background: var(--color-info);
1087
+ }
1088
+
1089
+ .progress-bar__segment--user {
1090
+ background: #a855f7;
1091
+ }
1092
+
1093
+ .sparkline-container {
1094
+ margin-top: 0.45rem;
1095
+ }
1096
+
1097
+ .steps-panel__header {
1098
+ padding: 0.55rem 0.75rem;
1099
+ border-bottom: 1px solid var(--color-border);
1100
+ display: flex;
1101
+ align-items: center;
1102
+ justify-content: space-between;
1103
+ font-family: var(--font-mono);
1104
+ font-size: 0.65rem;
1105
+ letter-spacing: 0.1em;
1106
+ text-transform: uppercase;
1107
+ color: var(--color-text-muted);
1108
+ }
1109
+
1110
+ .view-toggle {
1111
+ display: flex;
1112
+ border: 1px solid var(--color-border);
1113
+ border-radius: var(--radius-sm);
1114
+ background: var(--color-surface-3);
1115
+ padding: 0.12rem;
1116
+ }
1117
+
1118
+ .view-toggle__btn {
1119
+ border: 0;
1120
+ border-radius: var(--radius-sm);
1121
+ background: transparent;
1122
+ color: var(--color-text-dim);
1123
+ width: 28px;
1124
+ height: 24px;
1125
+ cursor: pointer;
1126
+ }
1127
+
1128
+ .view-toggle__btn--active {
1129
+ color: var(--color-accent);
1130
+ background: var(--color-accent-soft);
1131
+ }
1132
+
1133
+ .steps-panel__list {
1134
+ flex: 1;
1135
+ min-height: 0;
1136
+ overflow-y: auto;
1137
+ }
1138
+
1139
+ .step-item {
1140
+ display: flex;
1141
+ align-items: center;
1142
+ gap: 0.5rem;
1143
+ text-decoration: none;
1144
+ color: inherit;
1145
+ border-bottom: 1px solid var(--color-border-subtle);
1146
+ border-left: 2px solid transparent;
1147
+ padding: 0.42rem 0.6rem;
1148
+ }
1149
+
1150
+ .step-item:hover {
1151
+ background: var(--color-surface-2);
1152
+ }
1153
+
1154
+ .step-item--active {
1155
+ border-left-color: var(--color-accent);
1156
+ background: var(--color-accent-soft);
1157
+ }
1158
+
1159
+ .step-item__num {
1160
+ width: 18px;
1161
+ height: 18px;
1162
+ display: grid;
1163
+ place-items: center;
1164
+ border: 1px solid var(--color-border);
1165
+ border-radius: 999px;
1166
+ font-family: var(--font-mono);
1167
+ font-size: 0.6rem;
1168
+ color: var(--color-text-muted);
1169
+ flex-shrink: 0;
1170
+ }
1171
+
1172
+ .step-item__text {
1173
+ flex: 1;
1174
+ min-width: 0;
1175
+ font-family: var(--font-mono);
1176
+ font-size: 0.68rem;
1177
+ color: var(--color-text-muted);
1178
+ white-space: nowrap;
1179
+ overflow: hidden;
1180
+ text-overflow: ellipsis;
1181
+ }
1182
+
1183
+ .step-item__badge {
1184
+ font-size: 0.68rem;
1185
+ }
1186
+
1187
+ .status-bar {
1188
+ position: relative;
1189
+ z-index: 2;
1190
+ height: 34px;
1191
+ border-top: 1px solid var(--color-border);
1192
+ background: var(--color-surface-1);
1193
+ display: flex;
1194
+ align-items: center;
1195
+ justify-content: space-between;
1196
+ padding: 0 0.85rem;
1197
+ font-family: var(--font-mono);
1198
+ font-size: 0.62rem;
1199
+ color: var(--color-text-dim);
1200
+ letter-spacing: 0.08em;
1201
+ text-transform: uppercase;
1202
+ }
1203
+
1204
+ .status-bar__left,
1205
+ .status-bar__right {
1206
+ display: flex;
1207
+ align-items: center;
1208
+ gap: 0.75rem;
1209
+ }
1210
+
1211
+ .status-bar i {
1212
+ font-size: 0.45rem;
1213
+ color: var(--color-success);
1214
+ }
1215
+
1216
+ .animate-in {
1217
+ animation: fadeInUp 260ms ease forwards;
1218
+ opacity: 0;
1219
+ animation-delay: calc(var(--i, 0) * 34ms);
1220
+ }
1221
+
1222
+ .animate-scale {
1223
+ animation: scaleIn 260ms ease forwards;
1224
+ opacity: 0;
1225
+ animation-delay: calc(var(--i, 0) * 36ms);
1226
+ }
1227
+
1228
+ @keyframes fadeInUp {
1229
+ from {
1230
+ opacity: 0;
1231
+ transform: translateY(8px);
1232
+ }
1233
+
1234
+ to {
1235
+ opacity: 1;
1236
+ transform: translateY(0);
1237
+ }
1238
+ }
1239
+
1240
+ @keyframes scaleIn {
1241
+ from {
1242
+ opacity: 0;
1243
+ transform: scale(0.97);
1244
+ }
1245
+
1246
+ to {
1247
+ opacity: 1;
1248
+ transform: scale(1);
1249
+ }
1250
+ }
1251
+
1252
+ pre[class*="language-"] {
1253
+ margin: 0;
1254
+ border-radius: var(--radius-md);
1255
+ }
1256
+
1257
+ @media (max-width: 1300px) {
1258
+ .steps-panel {
1259
+ width: 260px;
1260
+ }
1261
+ }
1262
+
1263
+ @media (max-width: 1100px) {
1264
+ .sidebar {
1265
+ width: 230px;
1266
+ }
1267
+
1268
+ .top-nav__telemetry {
1269
+ display: none;
1270
+ }
1271
+ }
1272
+
1273
+ @media (max-width: 960px) {
1274
+
1275
+ .sidebar,
1276
+ .steps-panel {
1277
+ display: none;
1278
+ }
1279
+
1280
+ .main-content {
1281
+ padding: 0.8rem;
1282
+ }
1283
+ }
1284
+
1285
+ /* -------------------------------------------------------------------------
1286
+ PrismJS Custom High-Vibrancy "Night Owl" Theme
1287
+ ------------------------------------------------------------------------- */
1288
+ code[class*="language-"],
1289
+ pre[class*="language-"] {
1290
+ color: var(--syntax-text);
1291
+ background: var(--syntax-bg) !important;
1292
+ text-shadow: none;
1293
+ font-family: var(--font-mono);
1294
+ font-size: 0.82rem;
1295
+ line-height: 1.6;
1296
+ direction: ltr;
1297
+ text-align: left;
1298
+ white-space: pre;
1299
+ word-spacing: normal;
1300
+ word-break: normal;
1301
+ tab-size: 4;
1302
+ hyphens: none;
1303
+ }
1304
+
1305
+ pre[class*="language-"] {
1306
+ padding: 1rem;
1307
+ margin: 0.5em 0;
1308
+ overflow: auto;
1309
+ border-radius: var(--radius-md);
1310
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
1311
+ }
1312
+
1313
+ .token.comment,
1314
+ .token.prolog,
1315
+ .token.doctype,
1316
+ .token.cdata {
1317
+ color: var(--syntax-comment);
1318
+ font-style: italic;
1319
+ }
1320
+
1321
+ .token.punctuation {
1322
+ color: var(--syntax-punctuation);
1323
+ }
1324
+
1325
+ .token.namespace {
1326
+ opacity: .7;
1327
+ }
1328
+
1329
+ .token.property,
1330
+ .token.tag,
1331
+ .token.constant,
1332
+ .token.symbol,
1333
+ .token.deleted {
1334
+ color: var(--syntax-property);
1335
+ }
1336
+
1337
+ .token.boolean,
1338
+ .token.number {
1339
+ color: var(--syntax-number);
1340
+ }
1341
+
1342
+ .token.selector,
1343
+ .token.attr-name,
1344
+ .token.string,
1345
+ .token.char,
1346
+ .token.builtin,
1347
+ .token.inserted {
1348
+ color: var(--syntax-string);
1349
+ }
1350
+
1351
+ .token.operator,
1352
+ .token.entity,
1353
+ .token.url,
1354
+ .language-css .token.string,
1355
+ .style .token.string,
1356
+ .token.variable {
1357
+ color: var(--syntax-operator);
1358
+ }
1359
+
1360
+ .token.atrule,
1361
+ .token.attr-value,
1362
+ .token.function,
1363
+ .token.class-name {
1364
+ color: var(--syntax-function);
1365
+ }
1366
+
1367
+ .token.keyword {
1368
+ color: var(--syntax-keyword);
1369
+ }
1370
+
1371
+ .token.regex,
1372
+ .token.important {
1373
+ color: var(--syntax-class-name);
1374
+ }
1375
+
1376
+ .token.important,
1377
+ .token.bold {
1378
+ font-weight: bold;
1379
+ }
1380
+
1381
+ .token.italic {
1382
+ font-style: italic;
1383
+ }
1384
+
1385
+ .token.entity {
1386
+ cursor: help;
1387
+ }
1388
+
1389
+ /* Line numbers plugin tweaks for pure black background */
1390
+ .line-numbers .line-numbers-rows {
1391
+ border-right: 1px solid rgba(255, 255, 255, 0.08) !important;
1392
+ }
1393
+
1394
+ .line-numbers-rows>span:before {
1395
+ color: rgba(255, 255, 255, 0.3) !important;
1396
+ }