total-recall-brain 3.1.2 → 3.2.2

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 (63) hide show
  1. package/extension/background.js +99 -0
  2. package/extension/content-script.css +16 -0
  3. package/extension/content-script.js +134 -0
  4. package/extension/icons/README.md +27 -0
  5. package/extension/icons/icon-128.png +0 -0
  6. package/extension/icons/icon-16.png +0 -0
  7. package/extension/icons/icon-48.png +0 -0
  8. package/extension/lib/brain-client.js +47 -0
  9. package/extension/manifest.json +39 -0
  10. package/extension/options/options.css +218 -0
  11. package/extension/options/options.html +72 -0
  12. package/extension/options/options.js +99 -0
  13. package/extension/popup/popup.css +221 -0
  14. package/extension/popup/popup.html +44 -0
  15. package/extension/popup/popup.js +107 -0
  16. package/extension/sidepanel/sidepanel.css +340 -0
  17. package/extension/sidepanel/sidepanel.html +38 -0
  18. package/extension/sidepanel/sidepanel.js +229 -0
  19. package/frontend/README.md +73 -0
  20. package/frontend/index.html +17 -0
  21. package/frontend/package.json +31 -0
  22. package/frontend/src/App.css +2 -0
  23. package/frontend/src/App.tsx +390 -0
  24. package/frontend/src/api.ts +688 -0
  25. package/frontend/src/assets/hero.png +0 -0
  26. package/frontend/src/assets/react.svg +1 -0
  27. package/frontend/src/assets/vite.svg +1 -0
  28. package/frontend/src/components/BrainSelector.tsx +272 -0
  29. package/frontend/src/components/DaemonLogsTab.tsx +54 -0
  30. package/frontend/src/components/Graph3D.tsx +850 -0
  31. package/frontend/src/components/MarkdownUtils.tsx +99 -0
  32. package/frontend/src/components/ResearchAgendaTab.tsx +707 -0
  33. package/frontend/src/components/TaskQueueTab.tsx +185 -0
  34. package/frontend/src/index.css +1589 -0
  35. package/frontend/src/main.tsx +10 -0
  36. package/frontend/src/pages/ApiKeysPage.tsx +288 -0
  37. package/frontend/src/pages/AutomationsPage.tsx +354 -0
  38. package/frontend/src/pages/ChatPage.tsx +831 -0
  39. package/frontend/src/pages/DeploymentsPage.tsx +275 -0
  40. package/frontend/src/pages/FilesPage.tsx +384 -0
  41. package/frontend/src/pages/HealthPage.tsx +91 -0
  42. package/frontend/src/pages/IntegrationsPage.tsx +382 -0
  43. package/frontend/src/pages/LoginPage.tsx +237 -0
  44. package/frontend/src/pages/MemoryPage.tsx +1192 -0
  45. package/frontend/src/pages/SandboxPage.tsx +113 -0
  46. package/frontend/src/pages/SettingsPage.tsx +662 -0
  47. package/frontend/src/pages/SkillsPage.tsx +618 -0
  48. package/frontend/src/pages/TasksPage.tsx +392 -0
  49. package/frontend/src/pages/UsagePage.tsx +260 -0
  50. package/frontend/src/types.ts +163 -0
  51. package/frontend/tsconfig.app.json +25 -0
  52. package/frontend/tsconfig.json +7 -0
  53. package/frontend/tsconfig.node.json +24 -0
  54. package/frontend/vite.config.ts +24 -0
  55. package/package.json +8 -1
  56. package/scaffold/.agent/skills/total-recall/memory-vault/concepts/cli-help-reference.md +35 -8
  57. package/scaffold/.agent/skills/total-recall/memory-vault/invariants/operating-instructions.md +13 -8
  58. package/scaffold/.agent/skills/total-recall/memory-vault/preferences/always-websearch-gap.md +28 -1
  59. package/scaffold/.agent/skills/total-recall/memory-vault/preferences/topic-research-sop.md +28 -1
  60. package/scaffold/.agent/skills/total-recall/skills/ssss/references/ssss-spec.md +830 -81
  61. package/src/cli/backup.mjs +172 -1
  62. package/src/cli/setup.mjs +24 -0
  63. package/src/server/rest.mjs +56 -7
@@ -0,0 +1,1589 @@
1
+ /* ═══════════════════════════════════════════════════════════════════════════════
2
+ Total Recall — Design System
3
+ ═══════════════════════════════════════════════════════════════════════════════ */
4
+
5
+ :root {
6
+ /* Colors */
7
+ --bg-primary: #0a0a0f;
8
+ --bg-secondary: #12121a;
9
+ --bg-tertiary: #1a1a26;
10
+ --bg-elevated: #22222f;
11
+ --bg-hover: #2a2a38;
12
+ --bg-active: #32324a;
13
+
14
+ --accent: #6c5ce7;
15
+ --accent-glow: rgba(108, 92, 231, 0.25);
16
+ --accent-hover: #7c6ef7;
17
+ --accent-muted: rgba(108, 92, 231, 0.12);
18
+
19
+ --success: #00cec9;
20
+ --success-muted: rgba(0, 206, 201, 0.12);
21
+ --warning: #fdcb6e;
22
+ --warning-muted: rgba(253, 203, 110, 0.12);
23
+ --error: #ff6b6b;
24
+ --error-muted: rgba(255, 107, 107, 0.12);
25
+
26
+ --text-primary: #e8e8f0;
27
+ --text-secondary: #9898b0;
28
+ --text-tertiary: #686880;
29
+ --text-inverse: #0a0a0f;
30
+
31
+ --border: rgba(255, 255, 255, 0.06);
32
+ --border-hover: rgba(255, 255, 255, 0.12);
33
+
34
+ /* Typography */
35
+ --font-sans: 'Inter', -apple-system, sans-serif;
36
+ --font-mono: 'JetBrains Mono', 'SF Mono', monospace;
37
+
38
+ /* Spacing */
39
+ --sidebar-width: 240px;
40
+ --radius-sm: 6px;
41
+ --radius-md: 10px;
42
+ --radius-lg: 16px;
43
+
44
+ /* Transitions */
45
+ --transition-fast: 120ms ease;
46
+ --transition-normal: 200ms ease;
47
+ }
48
+
49
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
50
+
51
+ html, body, #root {
52
+ height: 100%;
53
+ background: var(--bg-primary);
54
+ color: var(--text-primary);
55
+ font-family: var(--font-sans);
56
+ font-size: 14px;
57
+ line-height: 1.6;
58
+ -webkit-font-smoothing: antialiased;
59
+ }
60
+
61
+ a { color: var(--accent); text-decoration: none; }
62
+ a:hover { color: var(--accent-hover); }
63
+
64
+ button {
65
+ font-family: var(--font-sans);
66
+ cursor: pointer;
67
+ border: none;
68
+ outline: none;
69
+ }
70
+
71
+ code, pre { font-family: var(--font-mono); }
72
+
73
+ ::-webkit-scrollbar { width: 6px; height: 6px; }
74
+ ::-webkit-scrollbar-track { background: transparent; }
75
+ ::-webkit-scrollbar-thumb { background: var(--bg-hover); border-radius: 3px; }
76
+ ::-webkit-scrollbar-thumb:hover { background: var(--text-tertiary); }
77
+
78
+ /* ─── Layout ─────────────────────────────────────────────────────────────────── */
79
+
80
+ .app-layout {
81
+ display: flex;
82
+ height: 100vh;
83
+ overflow: hidden;
84
+ }
85
+
86
+ .sidebar {
87
+ width: var(--sidebar-width);
88
+ min-width: var(--sidebar-width);
89
+ background: var(--bg-secondary);
90
+ border-right: 1px solid var(--border);
91
+ display: flex;
92
+ flex-direction: column;
93
+ padding: 16px 0;
94
+ transition: transform var(--transition-normal);
95
+ z-index: 100;
96
+ }
97
+
98
+ .sidebar-brand {
99
+ padding: 0 20px 20px;
100
+ border-bottom: 1px solid var(--border);
101
+ margin-bottom: 8px;
102
+ }
103
+
104
+ .sidebar-brand h1 {
105
+ font-size: 16px;
106
+ font-weight: 700;
107
+ background: linear-gradient(135deg, var(--accent), var(--success));
108
+ -webkit-background-clip: text;
109
+ -webkit-text-fill-color: transparent;
110
+ background-clip: text;
111
+ letter-spacing: -0.02em;
112
+ }
113
+
114
+ .sidebar-brand span {
115
+ font-size: 11px;
116
+ color: var(--text-tertiary);
117
+ font-weight: 400;
118
+ }
119
+
120
+ .sidebar-nav {
121
+ flex: 1;
122
+ display: flex;
123
+ flex-direction: column;
124
+ gap: 2px;
125
+ padding: 0 8px;
126
+ overflow-y: auto;
127
+ }
128
+
129
+ .nav-link {
130
+ display: flex;
131
+ align-items: center;
132
+ gap: 10px;
133
+ padding: 10px 12px;
134
+ border-radius: var(--radius-sm);
135
+ color: var(--text-secondary);
136
+ font-size: 13px;
137
+ font-weight: 500;
138
+ transition: all var(--transition-fast);
139
+ text-decoration: none;
140
+ }
141
+
142
+ .nav-link:hover {
143
+ background: var(--bg-hover);
144
+ color: var(--text-primary);
145
+ }
146
+
147
+ .nav-link.active {
148
+ background: var(--accent-muted);
149
+ color: var(--accent);
150
+ }
151
+
152
+ .nav-link svg {
153
+ width: 18px;
154
+ height: 18px;
155
+ flex-shrink: 0;
156
+ opacity: 0.7;
157
+ }
158
+
159
+ .nav-link.active svg { opacity: 1; }
160
+
161
+ .sidebar-footer {
162
+ padding: 12px 20px;
163
+ border-top: 1px solid var(--border);
164
+ margin-top: 8px;
165
+ }
166
+
167
+ .main-content {
168
+ flex: 1;
169
+ display: flex;
170
+ flex-direction: column;
171
+ overflow: hidden;
172
+ min-width: 0;
173
+ }
174
+
175
+ .page {
176
+ flex: 1;
177
+ overflow-y: auto;
178
+ padding: 28px 32px;
179
+ }
180
+
181
+ .page-header {
182
+ margin-bottom: 24px;
183
+ }
184
+
185
+ .page-header h1 {
186
+ font-size: 22px;
187
+ font-weight: 700;
188
+ letter-spacing: -0.02em;
189
+ }
190
+
191
+ .page-header p {
192
+ color: var(--text-secondary);
193
+ font-size: 13px;
194
+ margin-top: 4px;
195
+ }
196
+
197
+ /* ─── Cards ──────────────────────────────────────────────────────────────────── */
198
+
199
+ .card {
200
+ background: var(--bg-secondary);
201
+ border: 1px solid var(--border);
202
+ border-radius: var(--radius-md);
203
+ padding: 20px;
204
+ transition: border-color var(--transition-normal);
205
+ }
206
+
207
+ .card:hover { border-color: var(--border-hover); }
208
+
209
+ .card-grid {
210
+ display: grid;
211
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
212
+ gap: 16px;
213
+ }
214
+
215
+ /* ─── Buttons ────────────────────────────────────────────────────────────────── */
216
+
217
+ .btn {
218
+ display: inline-flex;
219
+ align-items: center;
220
+ gap: 6px;
221
+ padding: 8px 16px;
222
+ border-radius: var(--radius-sm);
223
+ font-size: 13px;
224
+ font-weight: 500;
225
+ transition: all var(--transition-fast);
226
+ }
227
+
228
+ .btn-primary {
229
+ background: var(--accent);
230
+ color: #fff;
231
+ }
232
+
233
+ .btn-primary:hover {
234
+ background: var(--accent-hover);
235
+ box-shadow: 0 0 20px var(--accent-glow);
236
+ }
237
+
238
+ .btn-ghost {
239
+ background: transparent;
240
+ color: var(--text-secondary);
241
+ border: 1px solid var(--border);
242
+ }
243
+
244
+ .btn-ghost:hover {
245
+ background: var(--bg-hover);
246
+ color: var(--text-primary);
247
+ border-color: var(--border-hover);
248
+ }
249
+
250
+ .btn-sm { padding: 5px 10px; font-size: 12px; }
251
+
252
+ /* ─── Status Badges ──────────────────────────────────────────────────────────── */
253
+
254
+ .badge {
255
+ display: inline-flex;
256
+ align-items: center;
257
+ gap: 4px;
258
+ padding: 3px 8px;
259
+ border-radius: 99px;
260
+ font-size: 11px;
261
+ font-weight: 600;
262
+ text-transform: uppercase;
263
+ letter-spacing: 0.04em;
264
+ }
265
+
266
+ .badge-success { background: var(--success-muted); color: var(--success); }
267
+ .badge-warning { background: var(--warning-muted); color: var(--warning); }
268
+ .badge-error { background: var(--error-muted); color: var(--error); }
269
+ .badge-accent { background: var(--accent-muted); color: var(--accent); }
270
+
271
+ /* ─── Chat ───────────────────────────────────────────────────────────────────── */
272
+
273
+ .chat-container {
274
+ display: flex;
275
+ flex-direction: column;
276
+ height: calc(100vh - 1px);
277
+ overflow: hidden;
278
+ }
279
+
280
+ .chat-messages {
281
+ flex: 1;
282
+ overflow-y: auto;
283
+ padding: 24px 32px;
284
+ display: flex;
285
+ flex-direction: column;
286
+ gap: 16px;
287
+ }
288
+
289
+ .chat-empty {
290
+ flex: 1;
291
+ display: flex;
292
+ flex-direction: column;
293
+ align-items: center;
294
+ justify-content: center;
295
+ gap: 12px;
296
+ color: var(--text-tertiary);
297
+ }
298
+
299
+ .chat-empty svg { width: 48px; height: 48px; opacity: 0.3; }
300
+ .chat-empty h2 { font-size: 18px; font-weight: 600; color: var(--text-secondary); }
301
+ .chat-empty p { font-size: 13px; }
302
+
303
+ .message {
304
+ max-width: 720px;
305
+ padding: 14px 18px;
306
+ border-radius: var(--radius-md);
307
+ font-size: 14px;
308
+ line-height: 1.7;
309
+ animation: msgIn 0.2s ease;
310
+ white-space: pre-wrap;
311
+ word-break: break-word;
312
+ }
313
+
314
+ @keyframes msgIn {
315
+ from { opacity: 0; transform: translateY(8px); }
316
+ to { opacity: 1; transform: translateY(0); }
317
+ }
318
+
319
+ .message-user {
320
+ align-self: flex-end;
321
+ background: var(--accent);
322
+ color: #fff;
323
+ border-bottom-right-radius: 4px;
324
+ }
325
+
326
+ .message-assistant {
327
+ align-self: flex-start;
328
+ background: var(--bg-tertiary);
329
+ border: 1px solid var(--border);
330
+ border-bottom-left-radius: 4px;
331
+ }
332
+
333
+ .message-assistant code {
334
+ background: var(--bg-primary);
335
+ padding: 1px 5px;
336
+ border-radius: 4px;
337
+ font-size: 12.5px;
338
+ }
339
+
340
+ .chat-input-bar {
341
+ padding: 16px 32px 20px;
342
+ border-top: 1px solid var(--border);
343
+ background: var(--bg-secondary);
344
+ }
345
+
346
+ .chat-input-wrapper {
347
+ display: flex;
348
+ gap: 8px;
349
+ align-items: flex-end;
350
+ max-width: 800px;
351
+ margin: 0 auto;
352
+ }
353
+
354
+ .chat-input-wrapper textarea {
355
+ flex: 1;
356
+ resize: none;
357
+ background: var(--bg-tertiary);
358
+ border: 1px solid var(--border);
359
+ border-radius: var(--radius-md);
360
+ padding: 12px 16px;
361
+ color: var(--text-primary);
362
+ font-family: var(--font-sans);
363
+ font-size: 14px;
364
+ line-height: 1.5;
365
+ min-height: 44px;
366
+ max-height: 160px;
367
+ transition: border-color var(--transition-fast);
368
+ }
369
+
370
+ .chat-input-wrapper textarea:focus {
371
+ border-color: var(--accent);
372
+ outline: none;
373
+ box-shadow: 0 0 0 2px var(--accent-glow);
374
+ }
375
+
376
+ .chat-input-wrapper textarea::placeholder { color: var(--text-tertiary); }
377
+
378
+ .chat-send-btn {
379
+ width: 44px;
380
+ height: 44px;
381
+ border-radius: var(--radius-md);
382
+ background: var(--accent);
383
+ color: #fff;
384
+ display: flex;
385
+ align-items: center;
386
+ justify-content: center;
387
+ flex-shrink: 0;
388
+ transition: all var(--transition-fast);
389
+ }
390
+
391
+ .chat-send-btn:hover {
392
+ background: var(--accent-hover);
393
+ box-shadow: 0 0 20px var(--accent-glow);
394
+ }
395
+
396
+ .chat-send-btn:disabled {
397
+ opacity: 0.4;
398
+ cursor: not-allowed;
399
+ box-shadow: none;
400
+ }
401
+
402
+ .chat-send-btn svg { width: 18px; height: 18px; }
403
+
404
+ /* ─── Memory Explorer ────────────────────────────────────────────────────────── */
405
+
406
+ .memory-layout {
407
+ display: grid;
408
+ grid-template-columns: 220px 1fr;
409
+ gap: 20px;
410
+ height: calc(100vh - 120px);
411
+ }
412
+
413
+ .memory-sidebar {
414
+ background: var(--bg-secondary);
415
+ border: 1px solid var(--border);
416
+ border-radius: var(--radius-md);
417
+ padding: 12px;
418
+ overflow-y: auto;
419
+ }
420
+
421
+ .memory-sidebar h3 {
422
+ font-size: 11px;
423
+ text-transform: uppercase;
424
+ letter-spacing: 0.06em;
425
+ color: var(--text-tertiary);
426
+ padding: 8px 8px 6px;
427
+ }
428
+
429
+ .category-btn {
430
+ display: flex;
431
+ align-items: center;
432
+ justify-content: space-between;
433
+ width: 100%;
434
+ padding: 8px 10px;
435
+ border-radius: var(--radius-sm);
436
+ background: transparent;
437
+ color: var(--text-secondary);
438
+ font-size: 13px;
439
+ text-align: left;
440
+ transition: all var(--transition-fast);
441
+ }
442
+
443
+ .category-btn:hover { background: var(--bg-hover); color: var(--text-primary); }
444
+ .category-btn.active { background: var(--accent-muted); color: var(--accent); }
445
+
446
+ .category-count {
447
+ font-size: 11px;
448
+ background: var(--bg-tertiary);
449
+ padding: 1px 6px;
450
+ border-radius: 99px;
451
+ color: var(--text-tertiary);
452
+ }
453
+
454
+ .memory-main {
455
+ display: flex;
456
+ flex-direction: column;
457
+ gap: 12px;
458
+ overflow: hidden;
459
+ }
460
+
461
+ .memory-search {
462
+ display: flex;
463
+ gap: 8px;
464
+ }
465
+
466
+ .memory-search input {
467
+ flex: 1;
468
+ background: var(--bg-secondary);
469
+ border: 1px solid var(--border);
470
+ border-radius: var(--radius-md);
471
+ padding: 10px 14px;
472
+ color: var(--text-primary);
473
+ font-size: 13px;
474
+ font-family: var(--font-sans);
475
+ transition: border-color var(--transition-fast);
476
+ }
477
+
478
+ .memory-search input:focus {
479
+ border-color: var(--accent);
480
+ outline: none;
481
+ box-shadow: 0 0 0 2px var(--accent-glow);
482
+ }
483
+
484
+ .memory-search input::placeholder { color: var(--text-tertiary); }
485
+
486
+ .memory-list {
487
+ flex: 1;
488
+ overflow-y: auto;
489
+ display: flex;
490
+ flex-direction: column;
491
+ gap: 8px;
492
+ }
493
+
494
+ .memory-node-card {
495
+ background: var(--bg-secondary);
496
+ border: 1px solid var(--border);
497
+ border-radius: var(--radius-md);
498
+ padding: 14px 16px;
499
+ cursor: pointer;
500
+ transition: all var(--transition-fast);
501
+ }
502
+
503
+ .memory-node-card:hover {
504
+ border-color: var(--accent);
505
+ background: var(--bg-tertiary);
506
+ }
507
+
508
+ .memory-node-card.selected {
509
+ border-color: var(--accent);
510
+ box-shadow: 0 0 0 1px var(--accent-glow);
511
+ }
512
+
513
+ .memory-node-card h4 {
514
+ font-size: 14px;
515
+ font-weight: 600;
516
+ margin-bottom: 4px;
517
+ }
518
+
519
+ .memory-node-card .meta {
520
+ font-size: 12px;
521
+ color: var(--text-tertiary);
522
+ display: flex;
523
+ gap: 12px;
524
+ }
525
+
526
+ .memory-detail {
527
+ background: var(--bg-secondary);
528
+ border: 1px solid var(--border);
529
+ border-radius: var(--radius-md);
530
+ padding: 24px;
531
+ overflow-y: auto;
532
+ }
533
+
534
+ .memory-detail h2 {
535
+ font-size: 18px;
536
+ margin-bottom: 12px;
537
+ }
538
+
539
+ .memory-detail pre {
540
+ background: var(--bg-primary);
541
+ border: 1px solid var(--border);
542
+ border-radius: var(--radius-sm);
543
+ padding: 16px;
544
+ font-size: 12px;
545
+ overflow-x: auto;
546
+ white-space: pre-wrap;
547
+ color: var(--text-secondary);
548
+ line-height: 1.7;
549
+ }
550
+
551
+ .memory-detail .frontmatter {
552
+ display: grid;
553
+ grid-template-columns: auto 1fr;
554
+ gap: 4px 16px;
555
+ font-size: 13px;
556
+ margin-bottom: 16px;
557
+ padding: 12px 16px;
558
+ background: var(--bg-tertiary);
559
+ border-radius: var(--radius-sm);
560
+ }
561
+
562
+ .frontmatter dt { color: var(--text-tertiary); font-weight: 500; }
563
+ .frontmatter dd { color: var(--text-primary); }
564
+
565
+ /* ─── Health Dashboard ───────────────────────────────────────────────────────── */
566
+
567
+ .health-grid {
568
+ display: grid;
569
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
570
+ gap: 16px;
571
+ margin-bottom: 24px;
572
+ }
573
+
574
+ .stat-card {
575
+ background: var(--bg-secondary);
576
+ border: 1px solid var(--border);
577
+ border-radius: var(--radius-md);
578
+ padding: 20px;
579
+ text-align: center;
580
+ transition: border-color var(--transition-normal);
581
+ }
582
+
583
+ .stat-card:hover { border-color: var(--border-hover); }
584
+ .stat-card .value { font-size: 28px; font-weight: 700; letter-spacing: -0.02em; }
585
+ .stat-card .label { font-size: 12px; color: var(--text-tertiary); margin-top: 4px; text-transform: uppercase; letter-spacing: 0.04em; }
586
+ .stat-card.healthy .value { color: var(--success); }
587
+ .stat-card.warning .value { color: var(--warning); }
588
+ .stat-card.error .value { color: var(--error); }
589
+
590
+ .health-log {
591
+ background: var(--bg-secondary);
592
+ border: 1px solid var(--border);
593
+ border-radius: var(--radius-md);
594
+ padding: 20px;
595
+ }
596
+
597
+ .health-log h3 { font-size: 14px; font-weight: 600; margin-bottom: 12px; }
598
+
599
+ .health-log table { width: 100%; border-collapse: collapse; font-size: 13px; }
600
+ .health-log th { text-align: left; color: var(--text-tertiary); font-weight: 500; padding: 8px 12px; border-bottom: 1px solid var(--border); }
601
+ .health-log td { padding: 8px 12px; border-bottom: 1px solid var(--border); color: var(--text-secondary); }
602
+
603
+ /* ─── Code Sandbox ───────────────────────────────────────────────────────────── */
604
+
605
+ .sandbox-layout {
606
+ display: grid;
607
+ grid-template-rows: 1fr auto 1fr;
608
+ gap: 0;
609
+ height: calc(100vh - 120px);
610
+ }
611
+
612
+ .sandbox-editor {
613
+ display: flex;
614
+ flex-direction: column;
615
+ overflow: hidden;
616
+ }
617
+
618
+ .sandbox-editor-header {
619
+ display: flex;
620
+ align-items: center;
621
+ justify-content: space-between;
622
+ padding: 8px 12px;
623
+ background: var(--bg-tertiary);
624
+ border: 1px solid var(--border);
625
+ border-radius: var(--radius-md) var(--radius-md) 0 0;
626
+ font-size: 12px;
627
+ color: var(--text-tertiary);
628
+ }
629
+
630
+ .sandbox-editor textarea {
631
+ flex: 1;
632
+ width: 100%;
633
+ resize: none;
634
+ background: var(--bg-secondary);
635
+ border: 1px solid var(--border);
636
+ border-top: none;
637
+ border-radius: 0 0 var(--radius-md) var(--radius-md);
638
+ padding: 16px;
639
+ color: var(--text-primary);
640
+ font-family: var(--font-mono);
641
+ font-size: 13px;
642
+ line-height: 1.6;
643
+ tab-size: 2;
644
+ }
645
+
646
+ .sandbox-editor textarea:focus { outline: none; border-color: var(--accent); }
647
+
648
+ .sandbox-toolbar {
649
+ display: flex;
650
+ align-items: center;
651
+ justify-content: center;
652
+ padding: 8px;
653
+ }
654
+
655
+ .sandbox-output {
656
+ background: var(--bg-primary);
657
+ border: 1px solid var(--border);
658
+ border-radius: var(--radius-md);
659
+ padding: 16px;
660
+ font-family: var(--font-mono);
661
+ font-size: 13px;
662
+ color: var(--success);
663
+ overflow-y: auto;
664
+ white-space: pre-wrap;
665
+ line-height: 1.6;
666
+ }
667
+
668
+ .sandbox-output.error { color: var(--error); }
669
+
670
+ /* ─── Pulse animation ────────────────────────────────────────────────────────── */
671
+
672
+ .pulse {
673
+ display: inline-block;
674
+ width: 8px;
675
+ height: 8px;
676
+ border-radius: 50%;
677
+ background: var(--success);
678
+ animation: pulseAnim 2s infinite;
679
+ }
680
+
681
+ @keyframes pulseAnim {
682
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(0, 206, 201, 0.4); }
683
+ 50% { box-shadow: 0 0 0 6px rgba(0, 206, 201, 0); }
684
+ }
685
+
686
+ /* ─── Loading skeleton ───────────────────────────────────────────────────────── */
687
+
688
+ .skeleton {
689
+ background: linear-gradient(90deg, var(--bg-tertiary) 25%, var(--bg-hover) 50%, var(--bg-tertiary) 75%);
690
+ background-size: 200% 100%;
691
+ animation: shimmer 1.5s infinite;
692
+ border-radius: var(--radius-sm);
693
+ }
694
+
695
+ @keyframes shimmer {
696
+ 0% { background-position: 200% 0; }
697
+ 100% { background-position: -200% 0; }
698
+ }
699
+
700
+ /* ─── Responsive ─────────────────────────────────────────────────────────────── */
701
+
702
+ @media (max-width: 768px) {
703
+ .sidebar {
704
+ position: fixed;
705
+ left: 0;
706
+ top: 0;
707
+ bottom: 0;
708
+ transform: translateX(-100%);
709
+ box-shadow: 0 0 40px rgba(0,0,0,0.5);
710
+ }
711
+
712
+ .sidebar.open { transform: translateX(0); }
713
+
714
+ .memory-layout {
715
+ grid-template-columns: 1fr;
716
+ height: auto;
717
+ }
718
+
719
+ .page { padding: 16px; }
720
+
721
+ /* Touch-friendly target sizing */
722
+ .btn, .nav-link, .category-btn {
723
+ min-height: 44px;
724
+ touch-action: manipulation;
725
+ }
726
+
727
+ /* Prevent iOS Safari auto-zoom on input focus */
728
+ .chat-input-wrapper textarea, .memory-search input, .sandbox-editor textarea {
729
+ font-size: 16px;
730
+ }
731
+
732
+ .chat-input-bar {
733
+ padding: 12px 16px 16px;
734
+ }
735
+ }
736
+
737
+ /* Chat Layout & Threads Sidebar */
738
+ .chat-layout {
739
+ display: flex;
740
+ height: 100%;
741
+ width: 100%;
742
+ overflow: hidden;
743
+ }
744
+
745
+ .chat-threads-sidebar {
746
+ width: 260px;
747
+ background: var(--bg-secondary);
748
+ border-right: 1px solid var(--border);
749
+ display: flex;
750
+ flex-direction: column;
751
+ height: 100%;
752
+ overflow: hidden;
753
+ flex-shrink: 0;
754
+ }
755
+
756
+ .sidebar-header {
757
+ padding: 16px;
758
+ border-bottom: 1px solid var(--border);
759
+ }
760
+
761
+ .new-chat-btn {
762
+ width: 100%;
763
+ display: flex;
764
+ align-items: center;
765
+ justify-content: center;
766
+ gap: 8px;
767
+ padding: 10px 16px;
768
+ background: var(--accent);
769
+ color: #fff;
770
+ border-radius: var(--radius-sm);
771
+ font-weight: 500;
772
+ font-size: 13px;
773
+ transition: all var(--transition-fast);
774
+ border: none;
775
+ cursor: pointer;
776
+ }
777
+
778
+ .new-chat-btn:hover {
779
+ background: var(--accent-hover);
780
+ box-shadow: 0 0 16px var(--accent-glow);
781
+ }
782
+
783
+ .thread-list {
784
+ flex: 1;
785
+ overflow-y: auto;
786
+ padding: 16px 12px;
787
+ display: flex;
788
+ flex-direction: column;
789
+ gap: 6px;
790
+ }
791
+
792
+ .thread-item {
793
+ display: flex;
794
+ align-items: center;
795
+ justify-content: space-between;
796
+ padding: 10px 12px;
797
+ border-radius: var(--radius-sm);
798
+ cursor: pointer;
799
+ transition: all var(--transition-fast);
800
+ border: 1px solid transparent;
801
+ position: relative;
802
+ }
803
+
804
+ .thread-item:hover {
805
+ background: var(--bg-hover);
806
+ }
807
+
808
+ .thread-item.active {
809
+ background: rgba(255, 255, 255, 0.05);
810
+ border-color: var(--border);
811
+ }
812
+
813
+ .thread-info {
814
+ display: flex;
815
+ flex-direction: column;
816
+ gap: 4px;
817
+ flex: 1;
818
+ min-width: 0;
819
+ }
820
+
821
+ .thread-title {
822
+ font-size: 13px;
823
+ font-weight: 500;
824
+ color: var(--text-primary);
825
+ white-space: nowrap;
826
+ overflow: hidden;
827
+ text-overflow: ellipsis;
828
+ }
829
+
830
+ .thread-meta {
831
+ display: flex;
832
+ align-items: center;
833
+ gap: 8px;
834
+ font-size: 11px;
835
+ color: var(--text-tertiary);
836
+ }
837
+
838
+ .thread-delete-btn {
839
+ background: none;
840
+ border: none;
841
+ color: var(--text-tertiary);
842
+ padding: 4px;
843
+ border-radius: 4px;
844
+ cursor: pointer;
845
+ opacity: 0;
846
+ transition: all var(--transition-fast);
847
+ display: flex;
848
+ align-items: center;
849
+ justify-content: center;
850
+ }
851
+
852
+ .thread-item:hover .thread-delete-btn {
853
+ opacity: 1;
854
+ }
855
+
856
+ .thread-delete-btn:hover {
857
+ color: var(--error);
858
+ background: var(--error-muted);
859
+ }
860
+
861
+ /* ─── Suggested Discussions Deck ────────────────────────────────────────────── */
862
+
863
+ .chat-suggestions-container {
864
+ margin-top: 32px;
865
+ width: 100%;
866
+ max-width: 900px;
867
+ animation: fadeIn 0.4s ease-out;
868
+ }
869
+
870
+ .chat-suggestions-container h3 {
871
+ font-size: 12px;
872
+ text-transform: uppercase;
873
+ letter-spacing: 0.08em;
874
+ color: var(--text-tertiary);
875
+ margin-bottom: 16px;
876
+ text-align: center;
877
+ }
878
+
879
+ .chat-suggestions-deck {
880
+ display: grid;
881
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
882
+ gap: 16px;
883
+ width: 100%;
884
+ }
885
+
886
+ .suggestion-card {
887
+ display: flex;
888
+ gap: 14px;
889
+ padding: 16px;
890
+ background: rgba(18, 18, 26, 0.45);
891
+ backdrop-filter: blur(12px);
892
+ -webkit-backdrop-filter: blur(12px);
893
+ border: 1px solid rgba(255, 255, 255, 0.05);
894
+ border-radius: var(--radius-md);
895
+ cursor: pointer;
896
+ text-align: left;
897
+ transition: all var(--transition-normal);
898
+ position: relative;
899
+ overflow: hidden;
900
+ }
901
+
902
+ /* Card subtle glowing accents */
903
+ .suggestion-card::before {
904
+ content: '';
905
+ position: absolute;
906
+ top: 0;
907
+ left: 0;
908
+ width: 4px;
909
+ height: 100%;
910
+ opacity: 0.8;
911
+ transition: width var(--transition-fast) ease;
912
+ }
913
+
914
+ .suggestion-card.card-fact::before { background: var(--success); }
915
+ .suggestion-card.card-concept::before { background: var(--accent); }
916
+ .suggestion-card.card-question::before { background: var(--warning); }
917
+
918
+ .suggestion-card:hover {
919
+ background: rgba(26, 26, 38, 0.6);
920
+ border-color: rgba(255, 255, 255, 0.12);
921
+ transform: translateY(-2px);
922
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
923
+ }
924
+
925
+ .suggestion-card:hover::before {
926
+ width: 6px;
927
+ }
928
+
929
+ .suggestion-card.card-fact:hover { border-color: rgba(0, 206, 201, 0.25); box-shadow: 0 8px 24px rgba(0, 206, 201, 0.06); }
930
+ .suggestion-card.card-concept:hover { border-color: rgba(108, 92, 231, 0.25); box-shadow: 0 8px 24px rgba(108, 92, 231, 0.06); }
931
+ .suggestion-card.card-question:hover { border-color: rgba(253, 203, 110, 0.25); box-shadow: 0 8px 24px rgba(253, 203, 110, 0.06); }
932
+
933
+ .suggestion-card-icon {
934
+ font-size: 22px;
935
+ display: flex;
936
+ align-items: flex-start;
937
+ padding-top: 2px;
938
+ user-select: none;
939
+ }
940
+
941
+ .suggestion-card-content {
942
+ display: flex;
943
+ flex-direction: column;
944
+ gap: 6px;
945
+ flex: 1;
946
+ min-width: 0;
947
+ }
948
+
949
+ .suggestion-card-content h4 {
950
+ font-size: 13.5px;
951
+ font-weight: 600;
952
+ color: var(--text-primary);
953
+ line-height: 1.4;
954
+ }
955
+
956
+ .suggestion-card-content p {
957
+ font-size: 12.5px;
958
+ color: var(--text-secondary);
959
+ line-height: 1.5;
960
+ }
961
+
962
+ .suggestion-card-nodes {
963
+ display: flex;
964
+ flex-wrap: wrap;
965
+ gap: 6px;
966
+ margin-top: 8px;
967
+ }
968
+
969
+ .suggestion-node-pill {
970
+ font-size: 10px;
971
+ font-weight: 500;
972
+ background: var(--bg-tertiary);
973
+ border: 1px solid var(--border);
974
+ color: var(--text-secondary);
975
+ padding: 2px 6px;
976
+ border-radius: 4px;
977
+ white-space: nowrap;
978
+ max-width: 140px;
979
+ overflow: hidden;
980
+ text-overflow: ellipsis;
981
+ }
982
+
983
+ /* ─── Grounding pills & Context Bar ─────────────────────────────────────────── */
984
+
985
+ .grounding-pills {
986
+ display: flex;
987
+ flex-wrap: wrap;
988
+ gap: 8px;
989
+ padding: 8px 12px;
990
+ background: rgba(18, 18, 26, 0.4);
991
+ border: 1px solid var(--border);
992
+ border-bottom: none;
993
+ border-radius: var(--radius-md) var(--radius-md) 0 0;
994
+ align-items: center;
995
+ }
996
+
997
+ .grounding-pill {
998
+ display: inline-flex;
999
+ align-items: center;
1000
+ gap: 6px;
1001
+ background: var(--accent-muted);
1002
+ border: 1px solid rgba(108, 92, 231, 0.3);
1003
+ color: var(--text-primary);
1004
+ padding: 4px 10px;
1005
+ border-radius: 99px;
1006
+ font-size: 12px;
1007
+ font-weight: 500;
1008
+ transition: all var(--transition-fast);
1009
+ }
1010
+
1011
+ .grounding-pill:hover {
1012
+ background: rgba(108, 92, 231, 0.2);
1013
+ border-color: rgba(108, 92, 231, 0.5);
1014
+ }
1015
+
1016
+ .grounding-pill svg {
1017
+ color: var(--accent);
1018
+ flex-shrink: 0;
1019
+ }
1020
+
1021
+ .grounding-pill-title {
1022
+ max-width: 150px;
1023
+ overflow: hidden;
1024
+ text-overflow: ellipsis;
1025
+ white-space: nowrap;
1026
+ }
1027
+
1028
+ .grounding-pill-remove {
1029
+ background: none;
1030
+ border: none;
1031
+ color: var(--text-tertiary);
1032
+ font-size: 14px;
1033
+ line-height: 1;
1034
+ padding: 0 2px;
1035
+ cursor: pointer;
1036
+ display: inline-flex;
1037
+ align-items: center;
1038
+ justify-content: center;
1039
+ transition: color var(--transition-fast);
1040
+ }
1041
+
1042
+ .grounding-pill-remove:hover {
1043
+ color: var(--error);
1044
+ }
1045
+
1046
+ /* Tiny Badge indicator */
1047
+ .grounding-count-badge {
1048
+ position: absolute;
1049
+ top: -4px;
1050
+ right: -4px;
1051
+ background: var(--accent);
1052
+ color: #fff;
1053
+ font-size: 9px;
1054
+ font-weight: 700;
1055
+ min-width: 16px;
1056
+ height: 16px;
1057
+ border-radius: 50%;
1058
+ display: flex;
1059
+ align-items: center;
1060
+ justify-content: center;
1061
+ border: 1.5px solid var(--bg-secondary);
1062
+ box-shadow: 0 0 8px var(--accent-glow);
1063
+ animation: popIn 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
1064
+ }
1065
+
1066
+ /* ─── Grounding Node Popover Selector ────────────────────────────────────────── */
1067
+
1068
+ .node-selector-popover {
1069
+ position: absolute;
1070
+ bottom: calc(100% + 12px);
1071
+ left: 0;
1072
+ width: 320px;
1073
+ max-height: 380px;
1074
+ background: rgba(18, 18, 26, 0.85);
1075
+ backdrop-filter: blur(20px);
1076
+ -webkit-backdrop-filter: blur(20px);
1077
+ border: 1px solid rgba(255, 255, 255, 0.08);
1078
+ border-radius: var(--radius-lg);
1079
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.4);
1080
+ display: flex;
1081
+ flex-direction: column;
1082
+ z-index: 50;
1083
+ overflow: hidden;
1084
+ animation: slideUp 0.25s cubic-bezier(0.16, 1, 0.3, 1);
1085
+ }
1086
+
1087
+ .node-selector-header {
1088
+ padding: 14px 16px 10px;
1089
+ border-bottom: 1px solid var(--border);
1090
+ display: flex;
1091
+ flex-direction: column;
1092
+ gap: 8px;
1093
+ }
1094
+
1095
+ .node-selector-header h4 {
1096
+ font-size: 13px;
1097
+ font-weight: 600;
1098
+ color: var(--text-primary);
1099
+ letter-spacing: 0.02em;
1100
+ }
1101
+
1102
+ .node-search-input {
1103
+ width: 100%;
1104
+ background: var(--bg-tertiary);
1105
+ border: 1px solid var(--border);
1106
+ border-radius: var(--radius-sm);
1107
+ padding: 6px 10px;
1108
+ color: var(--text-primary);
1109
+ font-size: 12px;
1110
+ font-family: var(--font-sans);
1111
+ transition: all var(--transition-fast);
1112
+ }
1113
+
1114
+ .node-search-input:focus {
1115
+ outline: none;
1116
+ border-color: var(--accent);
1117
+ box-shadow: 0 0 0 2px var(--accent-glow);
1118
+ }
1119
+
1120
+ .node-selector-list {
1121
+ flex: 1;
1122
+ overflow-y: auto;
1123
+ padding: 8px;
1124
+ display: flex;
1125
+ flex-direction: column;
1126
+ gap: 2px;
1127
+ }
1128
+
1129
+ .node-selector-empty {
1130
+ padding: 24px;
1131
+ text-align: center;
1132
+ color: var(--text-tertiary);
1133
+ font-size: 12px;
1134
+ }
1135
+
1136
+ .node-selector-item {
1137
+ display: flex;
1138
+ align-items: center;
1139
+ gap: 10px;
1140
+ padding: 8px 12px;
1141
+ border-radius: var(--radius-sm);
1142
+ cursor: pointer;
1143
+ transition: all var(--transition-fast);
1144
+ }
1145
+
1146
+ .node-selector-item:hover {
1147
+ background: var(--bg-hover);
1148
+ }
1149
+
1150
+ .node-selector-item.selected {
1151
+ background: var(--accent-muted);
1152
+ }
1153
+
1154
+ .node-selector-item-checkbox {
1155
+ width: 16px;
1156
+ height: 16px;
1157
+ border: 1px solid var(--text-tertiary);
1158
+ border-radius: 3px;
1159
+ display: flex;
1160
+ align-items: center;
1161
+ justify-content: center;
1162
+ font-size: 11px;
1163
+ color: var(--accent);
1164
+ font-weight: 700;
1165
+ transition: all var(--transition-fast);
1166
+ background: var(--bg-tertiary);
1167
+ flex-shrink: 0;
1168
+ }
1169
+
1170
+ .node-selector-item.selected .node-selector-item-checkbox {
1171
+ background: var(--accent);
1172
+ border-color: var(--accent);
1173
+ color: #fff;
1174
+ }
1175
+
1176
+ .node-selector-item-info {
1177
+ display: flex;
1178
+ flex-direction: column;
1179
+ min-width: 0;
1180
+ flex: 1;
1181
+ }
1182
+
1183
+ .node-selector-item-title {
1184
+ font-size: 13px;
1185
+ font-weight: 500;
1186
+ color: var(--text-primary);
1187
+ white-space: nowrap;
1188
+ overflow: hidden;
1189
+ text-overflow: ellipsis;
1190
+ }
1191
+
1192
+ .node-selector-item-meta {
1193
+ font-size: 11px;
1194
+ color: var(--text-tertiary);
1195
+ text-transform: capitalize;
1196
+ }
1197
+
1198
+ /* ─── Micro-animations ──────────────────────────────────────────────────────── */
1199
+
1200
+ .animate-fade-in {
1201
+ animation: fadeIn 0.2s ease-out;
1202
+ }
1203
+
1204
+ @keyframes fadeIn {
1205
+ from { opacity: 0; }
1206
+ to { opacity: 1; }
1207
+ }
1208
+
1209
+ @keyframes slideUp {
1210
+ from { transform: translateY(12px); opacity: 0; }
1211
+ to { transform: translateY(0); opacity: 1; }
1212
+ }
1213
+
1214
+ @keyframes popIn {
1215
+ 0% { transform: scale(0.6); opacity: 0; }
1216
+ 100% { transform: scale(1); opacity: 1; }
1217
+ }
1218
+
1219
+ /* ─── 3D Constellation Graph Styles ─────────────────────────────────────────── */
1220
+
1221
+ .graph-3d-wrapper {
1222
+ position: relative;
1223
+ width: 100%;
1224
+ height: 100%;
1225
+ background: radial-gradient(circle at center, #0a0d16 0%, #020408 100%);
1226
+ overflow: hidden;
1227
+ user-select: none;
1228
+ }
1229
+
1230
+ /* Glassmorphic Node Detail Drawer (Slide-in from right) */
1231
+ .node-detail-drawer {
1232
+ position: absolute;
1233
+ top: 20px;
1234
+ right: 20px;
1235
+ bottom: 20px;
1236
+ width: 350px;
1237
+ background: rgba(10, 15, 30, 0.75);
1238
+ backdrop-filter: blur(25px);
1239
+ -webkit-backdrop-filter: blur(25px);
1240
+ border: 1px solid rgba(255, 255, 255, 0.08);
1241
+ border-radius: var(--radius-lg);
1242
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.5), inset 0 0 0 1px rgba(255, 255, 255, 0.05);
1243
+ display: flex;
1244
+ flex-direction: column;
1245
+ z-index: 100;
1246
+ overflow: hidden;
1247
+ color: var(--text-primary);
1248
+ }
1249
+
1250
+ .animate-slide-in {
1251
+ animation: slideInRight 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards;
1252
+ }
1253
+
1254
+ @keyframes slideInRight {
1255
+ from {
1256
+ transform: translateX(100%);
1257
+ opacity: 0;
1258
+ }
1259
+ to {
1260
+ transform: translateX(0);
1261
+ opacity: 1;
1262
+ }
1263
+ }
1264
+
1265
+ .drawer-header {
1266
+ padding: 16px 20px;
1267
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
1268
+ display: flex;
1269
+ align-items: center;
1270
+ justify-content: space-between;
1271
+ }
1272
+
1273
+ .drawer-badge {
1274
+ font-size: 10px;
1275
+ font-weight: 700;
1276
+ text-transform: uppercase;
1277
+ letter-spacing: 0.05em;
1278
+ padding: 4px 8px;
1279
+ border-radius: 4px;
1280
+ }
1281
+
1282
+ .drawer-badge.badge-memory {
1283
+ background: rgba(139, 92, 246, 0.15);
1284
+ color: #c084fc;
1285
+ border: 1px solid rgba(139, 92, 246, 0.3);
1286
+ }
1287
+
1288
+ .drawer-badge.badge-thread {
1289
+ background: rgba(6, 182, 212, 0.15);
1290
+ color: #22d3ee;
1291
+ border: 1px solid rgba(6, 182, 212, 0.3);
1292
+ }
1293
+
1294
+ .drawer-badge.badge-research {
1295
+ background: rgba(245, 158, 11, 0.15);
1296
+ color: #fbbf24;
1297
+ border: 1px solid rgba(245, 158, 11, 0.3);
1298
+ }
1299
+
1300
+ .drawer-close-btn {
1301
+ background: none;
1302
+ border: none;
1303
+ color: var(--text-tertiary);
1304
+ font-size: 20px;
1305
+ cursor: pointer;
1306
+ padding: 4px;
1307
+ display: flex;
1308
+ align-items: center;
1309
+ justify-content: center;
1310
+ transition: color 0.15s;
1311
+ }
1312
+
1313
+ .drawer-close-btn:hover {
1314
+ color: #ffffff;
1315
+ }
1316
+
1317
+ .drawer-body {
1318
+ padding: 20px;
1319
+ flex: 1;
1320
+ overflow-y: auto;
1321
+ display: flex;
1322
+ flex-direction: column;
1323
+ gap: 12px;
1324
+ }
1325
+
1326
+ .drawer-title {
1327
+ font-size: 18px;
1328
+ font-weight: 700;
1329
+ color: #ffffff;
1330
+ line-height: 1.35;
1331
+ margin: 0;
1332
+ }
1333
+
1334
+ .drawer-subtitle {
1335
+ font-size: 11px;
1336
+ color: var(--text-tertiary);
1337
+ margin-top: -4px;
1338
+ }
1339
+
1340
+ .drawer-status {
1341
+ display: flex;
1342
+ align-items: center;
1343
+ gap: 8px;
1344
+ font-size: 12px;
1345
+ background: rgba(255, 255, 255, 0.03);
1346
+ padding: 6px 12px;
1347
+ border-radius: 6px;
1348
+ border: 1px solid rgba(255, 255, 255, 0.04);
1349
+ width: fit-content;
1350
+ }
1351
+
1352
+ .drawer-status .label {
1353
+ color: var(--text-tertiary);
1354
+ }
1355
+
1356
+ .drawer-status .value {
1357
+ font-weight: 600;
1358
+ text-transform: capitalize;
1359
+ }
1360
+
1361
+ .drawer-status .value.status-completed,
1362
+ .drawer-status .value.status-done,
1363
+ .drawer-status .value.status-active {
1364
+ color: #10b981;
1365
+ }
1366
+
1367
+ .drawer-status .value.status-in-progress {
1368
+ color: #f59e0b;
1369
+ }
1370
+
1371
+ .drawer-status .value.status-pending {
1372
+ color: #3b82f6;
1373
+ }
1374
+
1375
+ .drawer-excerpt {
1376
+ font-size: 13.5px;
1377
+ line-height: 1.6;
1378
+ color: var(--text-secondary);
1379
+ white-space: pre-wrap;
1380
+ margin-top: 8px;
1381
+ }
1382
+
1383
+ .drawer-footer {
1384
+ padding: 16px 20px;
1385
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
1386
+ background: rgba(0, 0, 0, 0.15);
1387
+ }
1388
+
1389
+ .drawer-action-btn {
1390
+ width: 100%;
1391
+ padding: 10px 16px;
1392
+ border-radius: var(--radius-sm);
1393
+ font-weight: 600;
1394
+ font-size: 13px;
1395
+ border: none;
1396
+ cursor: pointer;
1397
+ transition: all var(--transition-fast);
1398
+ display: flex;
1399
+ align-items: center;
1400
+ justify-content: center;
1401
+ }
1402
+
1403
+ .drawer-action-btn.btn-cyan {
1404
+ background: #06b6d4;
1405
+ color: #ffffff;
1406
+ }
1407
+
1408
+ .drawer-action-btn.btn-cyan:hover {
1409
+ background: #0891b2;
1410
+ box-shadow: 0 0 16px rgba(6, 182, 212, 0.4);
1411
+ }
1412
+
1413
+ .drawer-action-btn.btn-purple {
1414
+ background: #8b5cf6;
1415
+ color: #ffffff;
1416
+ }
1417
+
1418
+ .drawer-action-btn.btn-purple:hover {
1419
+ background: #7c3aed;
1420
+ box-shadow: 0 0 16px rgba(139, 92, 246, 0.4);
1421
+ }
1422
+
1423
+ @media (max-width: 768px) {
1424
+ .node-detail-drawer {
1425
+ left: 20px;
1426
+ width: auto;
1427
+ bottom: 20px;
1428
+ height: 300px;
1429
+ }
1430
+ }
1431
+
1432
+ .chat-messages:has(.graph-3d-wrapper) {
1433
+ padding: 0;
1434
+ overflow: hidden;
1435
+ }
1436
+
1437
+ /* Chat Page Header & Model Selector */
1438
+ .chat-header {
1439
+ display: flex;
1440
+ align-items: center;
1441
+ justify-content: space-between;
1442
+ padding: 12px 24px;
1443
+ background: rgba(18, 18, 26, 0.45);
1444
+ backdrop-filter: blur(16px);
1445
+ -webkit-backdrop-filter: blur(16px);
1446
+ border-bottom: 1px solid var(--border);
1447
+ z-index: 10;
1448
+ flex-shrink: 0;
1449
+ }
1450
+
1451
+ .chat-header-title {
1452
+ display: flex;
1453
+ align-items: center;
1454
+ gap: 10px;
1455
+ }
1456
+
1457
+ .chat-header-title h2 {
1458
+ font-size: 15px;
1459
+ font-weight: 600;
1460
+ color: var(--text-primary);
1461
+ letter-spacing: -0.01em;
1462
+ }
1463
+
1464
+ .chat-header-model-selector {
1465
+ display: flex;
1466
+ align-items: center;
1467
+ gap: 8px;
1468
+ }
1469
+
1470
+ .chat-header-model-selector span.selector-label {
1471
+ font-size: 12px;
1472
+ color: var(--text-tertiary);
1473
+ font-weight: 500;
1474
+ }
1475
+
1476
+ .model-selector-dropdown-wrapper {
1477
+ position: relative;
1478
+ }
1479
+
1480
+ .model-selector-dropdown-btn {
1481
+ display: flex;
1482
+ align-items: center;
1483
+ gap: 8px;
1484
+ padding: 6px 12px;
1485
+ background: rgba(255, 255, 255, 0.04);
1486
+ border: 1px solid var(--border);
1487
+ border-radius: var(--radius-sm);
1488
+ color: var(--text-secondary);
1489
+ font-size: 13px;
1490
+ font-weight: 500;
1491
+ transition: all var(--transition-fast);
1492
+ cursor: pointer;
1493
+ }
1494
+
1495
+ .model-selector-dropdown-btn:hover {
1496
+ background: rgba(255, 255, 255, 0.08);
1497
+ border-color: var(--border-hover);
1498
+ color: var(--text-primary);
1499
+ }
1500
+
1501
+ .model-selector-dropdown-btn.active {
1502
+ border-color: var(--accent);
1503
+ color: var(--text-primary);
1504
+ background: var(--accent-muted);
1505
+ }
1506
+
1507
+ .model-selector-menu {
1508
+ position: absolute;
1509
+ top: 100%;
1510
+ right: 0;
1511
+ margin-top: 6px;
1512
+ width: 220px;
1513
+ background: rgba(18, 18, 26, 0.95);
1514
+ backdrop-filter: blur(20px);
1515
+ -webkit-backdrop-filter: blur(20px);
1516
+ border: 1px solid var(--border);
1517
+ border-radius: var(--radius-md);
1518
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.4);
1519
+ padding: 6px;
1520
+ display: flex;
1521
+ flex-direction: column;
1522
+ gap: 2px;
1523
+ z-index: 100;
1524
+ animation: popoverIn 0.15s ease-out;
1525
+ }
1526
+
1527
+ @keyframes popoverIn {
1528
+ from { opacity: 0; transform: translateY(-4px); }
1529
+ to { opacity: 1; transform: translateY(0); }
1530
+ }
1531
+
1532
+ .model-selector-item {
1533
+ display: flex;
1534
+ align-items: center;
1535
+ justify-content: space-between;
1536
+ padding: 8px 12px;
1537
+ border-radius: var(--radius-sm);
1538
+ cursor: pointer;
1539
+ transition: all var(--transition-fast);
1540
+ text-align: left;
1541
+ }
1542
+
1543
+ .model-selector-item:hover {
1544
+ background: var(--bg-hover);
1545
+ }
1546
+
1547
+ .model-selector-item.selected {
1548
+ background: var(--accent-muted);
1549
+ }
1550
+
1551
+ .model-selector-item-info {
1552
+ display: flex;
1553
+ flex-direction: column;
1554
+ gap: 2px;
1555
+ }
1556
+
1557
+ .model-selector-item-name {
1558
+ font-size: 13px;
1559
+ font-weight: 500;
1560
+ color: var(--text-primary);
1561
+ }
1562
+
1563
+ .model-selector-item.selected .model-selector-item-name {
1564
+ color: var(--accent);
1565
+ }
1566
+
1567
+ .model-selector-item-desc {
1568
+ font-size: 11px;
1569
+ color: var(--text-tertiary);
1570
+ }
1571
+
1572
+ .model-selector-item-badge {
1573
+ font-size: 9px;
1574
+ font-weight: 600;
1575
+ padding: 2px 6px;
1576
+ border-radius: 99px;
1577
+ background: var(--bg-tertiary);
1578
+ color: var(--text-tertiary);
1579
+ text-transform: uppercase;
1580
+ }
1581
+
1582
+ .model-selector-item.selected .model-selector-item-badge {
1583
+ background: var(--accent-muted);
1584
+ color: var(--accent);
1585
+ }
1586
+
1587
+
1588
+
1589
+