@polderlabs/bizar 4.5.0 → 4.5.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 (77) hide show
  1. package/bizar-dash/dist/assets/__vite-browser-external-BIHI7g3E.js +1 -0
  2. package/bizar-dash/dist/assets/__vite-browser-external-BIHI7g3E.js.map +1 -0
  3. package/bizar-dash/dist/assets/main-B4OfGAwz.js +361 -0
  4. package/bizar-dash/dist/assets/main-B4OfGAwz.js.map +1 -0
  5. package/bizar-dash/dist/assets/main-DAlLdW8I.css +1 -0
  6. package/bizar-dash/dist/assets/{mobile--0FBIKX3.js → mobile-BRhoDOUz.js} +1 -2
  7. package/bizar-dash/dist/assets/{mobile--0FBIKX3.js.map → mobile-BRhoDOUz.js.map} +1 -1
  8. package/bizar-dash/dist/assets/{mobile-OgRp8VIb.js → mobile-lbH6szyX.js} +2 -3
  9. package/bizar-dash/dist/assets/mobile-lbH6szyX.js.map +1 -0
  10. package/bizar-dash/dist/index.html +3 -3
  11. package/bizar-dash/dist/mobile.html +2 -2
  12. package/bizar-dash/skills/bizar/SKILL.md +20 -0
  13. package/bizar-dash/skills/headroom/SKILL.md +94 -0
  14. package/bizar-dash/skills/lightrag/SKILL.md +11 -0
  15. package/bizar-dash/skills/obsidian/SKILL.md +13 -0
  16. package/bizar-dash/src/server/api.mjs +6 -0
  17. package/bizar-dash/src/server/headroom.mjs +647 -0
  18. package/bizar-dash/src/server/memory-lightrag.mjs +281 -6
  19. package/bizar-dash/src/server/memory-obsidian.mjs +230 -0
  20. package/bizar-dash/src/server/memory-store.mjs +151 -0
  21. package/bizar-dash/src/server/mods-loader.mjs +13 -5
  22. package/bizar-dash/src/server/providers-store.mjs +73 -1
  23. package/bizar-dash/src/server/routes/_shared.mjs +17 -0
  24. package/bizar-dash/src/server/routes/chat.mjs +38 -0
  25. package/bizar-dash/src/server/routes/headroom.mjs +126 -0
  26. package/bizar-dash/src/server/routes/lightrag.mjs +6 -2
  27. package/bizar-dash/src/server/routes/memory.mjs +439 -4
  28. package/bizar-dash/src/server/schedules-runner.mjs +4 -4
  29. package/bizar-dash/src/server/server.mjs +55 -37
  30. package/bizar-dash/src/server/watcher.mjs +2 -2
  31. package/bizar-dash/src/web/App.tsx +42 -6
  32. package/bizar-dash/src/web/components/HeadroomSettings.tsx +418 -0
  33. package/bizar-dash/src/web/components/HeadroomStatus.tsx +158 -0
  34. package/bizar-dash/src/web/components/Toast.tsx +1 -1
  35. package/bizar-dash/src/web/components/Topbar.tsx +3 -1
  36. package/bizar-dash/src/web/lib/api.ts +12 -11
  37. package/bizar-dash/src/web/lib/types.ts +16 -0
  38. package/bizar-dash/src/web/main.tsx +1 -0
  39. package/bizar-dash/src/web/styles/chat.css +2 -0
  40. package/bizar-dash/src/web/styles/main.css +52 -23
  41. package/bizar-dash/src/web/styles/memory.css +955 -0
  42. package/bizar-dash/src/web/styles/tasks.css +2 -0
  43. package/bizar-dash/src/web/views/Memory.tsx +141 -0
  44. package/bizar-dash/src/web/views/MiniMaxUsage.tsx +3 -2
  45. package/bizar-dash/src/web/views/Overview.tsx +7 -2
  46. package/bizar-dash/src/web/views/Settings.tsx +32 -1
  47. package/bizar-dash/src/web/views/Skills.tsx +3 -2
  48. package/bizar-dash/src/web/views/Tasks.tsx +4 -3
  49. package/bizar-dash/src/web/views/memory/ConfigPanel.tsx +289 -0
  50. package/bizar-dash/src/web/views/memory/GitSyncPanel.tsx +220 -0
  51. package/bizar-dash/src/web/views/memory/LightragPanel.tsx +307 -0
  52. package/bizar-dash/src/web/views/memory/MemoryOverview.tsx +356 -0
  53. package/bizar-dash/src/web/views/memory/MemoryStatusCard.tsx +160 -0
  54. package/bizar-dash/src/web/views/memory/ObsidianPanel.tsx +642 -0
  55. package/bizar-dash/src/web/views/memory/SemanticSearchPanel.tsx +194 -0
  56. package/bizar-dash/tests/cli-bugfixes.test.mjs +151 -0
  57. package/bizar-dash/tests/frontend-bugfixes.test.mjs +151 -0
  58. package/bizar-dash/tests/headroom-install.test.mjs +173 -0
  59. package/bizar-dash/tests/headroom-settings.test.mjs +126 -0
  60. package/bizar-dash/tests/headroom-status.test.mjs +117 -0
  61. package/bizar-dash/tests/memory-lightrag-extended.test.mjs +162 -0
  62. package/bizar-dash/tests/memory-obsidian.test.mjs +269 -0
  63. package/bizar-dash/tests/memory-tab.test.mjs +322 -0
  64. package/bizar-dash/tests/mod-upgrade.node.test.mjs +1 -1
  65. package/bizar-dash/tests/server-bugfixes.test.mjs +318 -0
  66. package/bizar-dash/tests/submit-feedback.test.mjs +6 -6
  67. package/cli/artifact.mjs +11 -4
  68. package/cli/bin.mjs +211 -12
  69. package/cli/doctor.mjs +5 -3
  70. package/cli/memory.mjs +65 -21
  71. package/cli/provision.mjs +8 -2
  72. package/install.sh +1 -2
  73. package/package.json +3 -3
  74. package/bizar-dash/dist/assets/main-CDFKHzBg.css +0 -1
  75. package/bizar-dash/dist/assets/main-NYFpS2wY.js +0 -312
  76. package/bizar-dash/dist/assets/main-NYFpS2wY.js.map +0 -1
  77. package/bizar-dash/dist/assets/mobile-OgRp8VIb.js.map +0 -1
@@ -0,0 +1,955 @@
1
+ /* ============================================================================
2
+ * src/web/styles/memory.css
3
+ *
4
+ * v4.7.0 — Styles for the dedicated Memory tab (Memory.tsx + sub-panels).
5
+ *
6
+ * Reuses the dashboard's CSS variables (--bg, --bg-elev, --border, --text,
7
+ * --text-dim, --accent, --radius, --space-*, etc.) and matches the existing
8
+ * skills/settings tab patterns.
9
+ * ========================================================================== */
10
+
11
+ /* ── View layout ──────────────────────────────────────────────────────────── */
12
+
13
+ .view-memory {
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: var(--space-4, 16px);
17
+ padding: 16px 20px 32px;
18
+ max-width: 1400px;
19
+ margin: 0 auto;
20
+ width: 100%;
21
+ }
22
+
23
+ .memory-tab .view-header {
24
+ display: flex;
25
+ justify-content: space-between;
26
+ align-items: flex-end;
27
+ gap: 16px;
28
+ flex-wrap: wrap;
29
+ }
30
+
31
+ /* ── Body grid (rail + main) ─────────────────────────────────────────────── */
32
+
33
+ .memory-tab-body {
34
+ display: grid;
35
+ grid-template-columns: 200px 1fr;
36
+ gap: var(--space-4, 16px);
37
+ align-items: start;
38
+ }
39
+
40
+ @media (max-width: 900px) {
41
+ .memory-tab-body {
42
+ grid-template-columns: 1fr;
43
+ }
44
+ }
45
+
46
+ /* ── Source rail ─────────────────────────────────────────────────────────── */
47
+
48
+ .memory-source-rail {
49
+ display: flex;
50
+ flex-direction: column;
51
+ gap: 4px;
52
+ padding: 12px;
53
+ background: var(--bg-elev, #12161f);
54
+ border: 1px solid var(--border, #232a39);
55
+ border-radius: var(--radius, 8px);
56
+ position: sticky;
57
+ top: 16px;
58
+ }
59
+
60
+ .memory-source-button {
61
+ display: flex;
62
+ align-items: center;
63
+ gap: 10px;
64
+ padding: 10px 12px;
65
+ background: transparent;
66
+ border: 1px solid transparent;
67
+ border-radius: var(--radius-sm, 6px);
68
+ color: var(--text-dim, #b4bcd0);
69
+ font-size: 13px;
70
+ font-weight: 500;
71
+ cursor: pointer;
72
+ text-align: left;
73
+ transition: background var(--motion-fast, 120ms), color var(--motion-fast, 120ms), border-color var(--motion-fast, 120ms);
74
+ }
75
+
76
+ .memory-source-button:hover {
77
+ background: var(--bg-elev-2, #1a1f2b);
78
+ color: var(--text, #c9d1d9);
79
+ }
80
+
81
+ .memory-source-button-active {
82
+ background: var(--accent-bg, rgba(139, 92, 246, 0.12));
83
+ border-color: var(--accent-border, rgba(139, 92, 246, 0.4));
84
+ color: var(--accent, #8b5cf6);
85
+ }
86
+
87
+ /* ── Main panel column ──────────────────────────────────────────────────── */
88
+
89
+ .memory-main {
90
+ display: flex;
91
+ flex-direction: column;
92
+ gap: var(--space-4, 16px);
93
+ min-width: 0;
94
+ }
95
+
96
+ .memory-panel-content {
97
+ display: flex;
98
+ flex-direction: column;
99
+ gap: var(--space-4, 16px);
100
+ }
101
+
102
+ /* ── Source pills (overview) ───────────────────────────────────────────── */
103
+
104
+ .memory-source-pills {
105
+ display: flex;
106
+ gap: 8px;
107
+ flex-wrap: wrap;
108
+ }
109
+
110
+ .memory-source-pill {
111
+ display: flex;
112
+ align-items: center;
113
+ gap: 8px;
114
+ padding: 8px 14px;
115
+ background: var(--bg-elev, #12161f);
116
+ border: 1px solid var(--border, #232a39);
117
+ border-radius: var(--radius, 8px);
118
+ color: var(--text, #c9d1d9);
119
+ font-size: 12px;
120
+ font-weight: 500;
121
+ cursor: pointer;
122
+ transition: border-color var(--motion-fast, 120ms);
123
+ }
124
+
125
+ .memory-source-pill:hover {
126
+ border-color: var(--border-strong, #2d3648);
127
+ }
128
+
129
+ .memory-source-pill-status {
130
+ font-size: 11px;
131
+ padding: 2px 8px;
132
+ border-radius: 10px;
133
+ background: var(--bg-elev-2, #1a1f2b);
134
+ color: var(--text-dim, #b4bcd0);
135
+ text-transform: lowercase;
136
+ letter-spacing: 0.02em;
137
+ }
138
+
139
+ .memory-source-pill-status.on {
140
+ background: var(--success-soft, rgba(52, 211, 153, 0.15));
141
+ color: var(--success, #34d399);
142
+ }
143
+
144
+ .memory-source-pill-status.off {
145
+ background: var(--bg-elev-2, #1a1f2b);
146
+ color: var(--text-dim, #b4bcd0);
147
+ }
148
+
149
+ .memory-source-pill-status.warn {
150
+ background: var(--warning-soft, rgba(251, 191, 36, 0.15));
151
+ color: var(--warning, #fbbf24);
152
+ }
153
+
154
+ .memory-source-pill-status.na {
155
+ background: var(--bg-elev-2, #1a1f2b);
156
+ color: var(--text-muted, #8b949e);
157
+ }
158
+
159
+ /* ── Health hero card ───────────────────────────────────────────────────── */
160
+
161
+ .memory-health-hero {
162
+ display: flex;
163
+ align-items: center;
164
+ gap: var(--space-5, 20px);
165
+ }
166
+
167
+ .memory-health-score {
168
+ display: flex;
169
+ flex-direction: column;
170
+ align-items: center;
171
+ justify-content: center;
172
+ width: 88px;
173
+ height: 88px;
174
+ border-radius: 50%;
175
+ border: 4px solid var(--accent, #8b5cf6);
176
+ flex-shrink: 0;
177
+ }
178
+
179
+ .memory-health-score-value {
180
+ font-size: 28px;
181
+ font-weight: 700;
182
+ line-height: 1;
183
+ }
184
+
185
+ .memory-health-score-label {
186
+ font-size: 11px;
187
+ color: var(--text-dim, #b4bcd0);
188
+ margin-top: 2px;
189
+ }
190
+
191
+ .memory-health-meta {
192
+ flex: 1;
193
+ min-width: 0;
194
+ }
195
+
196
+ .memory-health-title {
197
+ margin: 0 0 6px;
198
+ font-size: 16px;
199
+ font-weight: 600;
200
+ display: flex;
201
+ align-items: center;
202
+ gap: 8px;
203
+ }
204
+
205
+ .memory-health-message {
206
+ margin: 0 0 8px;
207
+ color: var(--text-dim, #b4bcd0);
208
+ font-size: 13px;
209
+ }
210
+
211
+ /* ── Stat grid + cards ──────────────────────────────────────────────────── */
212
+
213
+ .memory-stat-grid {
214
+ display: grid;
215
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
216
+ gap: var(--space-3, 12px);
217
+ }
218
+
219
+ .memory-stat-card {
220
+ display: flex;
221
+ align-items: flex-start;
222
+ gap: 12px;
223
+ padding: 14px 16px;
224
+ background: var(--bg-elev, #12161f);
225
+ border: 1px solid var(--border, #232a39);
226
+ border-radius: var(--radius, 8px);
227
+ text-align: left;
228
+ color: inherit;
229
+ font: inherit;
230
+ cursor: default;
231
+ transition: border-color var(--motion-fast, 120ms), background var(--motion-fast, 120ms);
232
+ }
233
+
234
+ button.memory-stat-card {
235
+ background: var(--bg-elev, #12161f);
236
+ border: 1px solid var(--border, #232a39);
237
+ border-radius: var(--radius, 8px);
238
+ cursor: pointer;
239
+ }
240
+
241
+ .memory-stat-card-clickable:hover {
242
+ border-color: var(--accent-border, rgba(139, 92, 246, 0.4));
243
+ background: var(--accent-soft, rgba(139, 92, 246, 0.08));
244
+ }
245
+
246
+ .memory-stat-icon {
247
+ display: flex;
248
+ align-items: center;
249
+ justify-content: center;
250
+ width: 32px;
251
+ height: 32px;
252
+ border-radius: var(--radius-sm, 6px);
253
+ background: var(--accent-bg, rgba(139, 92, 246, 0.12));
254
+ color: var(--accent, #8b5cf6);
255
+ flex-shrink: 0;
256
+ }
257
+
258
+ .memory-stat-body {
259
+ flex: 1;
260
+ min-width: 0;
261
+ }
262
+
263
+ .memory-stat-label {
264
+ font-size: 11px;
265
+ text-transform: uppercase;
266
+ letter-spacing: 0.06em;
267
+ color: var(--text-dim, #b4bcd0);
268
+ margin-bottom: 2px;
269
+ }
270
+
271
+ .memory-stat-value {
272
+ font-size: 16px;
273
+ font-weight: 600;
274
+ line-height: 1.2;
275
+ color: var(--text-strong, #f0f6fc);
276
+ }
277
+
278
+ .memory-stat-sub {
279
+ font-size: 12px;
280
+ margin-top: 2px;
281
+ }
282
+
283
+ /* ── Health check rows ──────────────────────────────────────────────────── */
284
+
285
+ .memory-check-list {
286
+ list-style: none;
287
+ margin: 0;
288
+ padding: 0;
289
+ display: flex;
290
+ flex-direction: column;
291
+ gap: 6px;
292
+ }
293
+
294
+ .memory-check-row {
295
+ display: grid;
296
+ grid-template-columns: 24px 140px 1fr;
297
+ gap: 8px;
298
+ align-items: center;
299
+ padding: 8px 10px;
300
+ border: 1px solid var(--border, #232a39);
301
+ border-radius: var(--radius-sm, 6px);
302
+ background: var(--bg-elev, #12161f);
303
+ font-size: 13px;
304
+ }
305
+
306
+ .memory-check-icon {
307
+ display: flex;
308
+ align-items: center;
309
+ justify-content: center;
310
+ }
311
+
312
+ .memory-check-name {
313
+ font-family: var(--font-mono, monospace);
314
+ font-size: 12px;
315
+ color: var(--text-strong, #f0f6fc);
316
+ }
317
+
318
+ .memory-check-detail {
319
+ font-size: 12px;
320
+ white-space: nowrap;
321
+ overflow: hidden;
322
+ text-overflow: ellipsis;
323
+ }
324
+
325
+ /* ── Action row (Start/Stop/Restart etc.) ──────────────────────────────── */
326
+
327
+ .memory-action-row {
328
+ display: flex;
329
+ gap: 8px;
330
+ flex-wrap: wrap;
331
+ margin-top: 12px;
332
+ }
333
+
334
+ /* ── Search rows ────────────────────────────────────────────────────────── */
335
+
336
+ .memory-search-row {
337
+ display: flex;
338
+ gap: 8px;
339
+ margin-top: 8px;
340
+ }
341
+
342
+ .memory-search-row .input {
343
+ flex: 1;
344
+ min-width: 0;
345
+ }
346
+
347
+ .memory-query-result {
348
+ margin-top: 12px;
349
+ padding: 10px 12px;
350
+ border: 1px solid var(--border, #232a39);
351
+ border-radius: var(--radius, 8px);
352
+ background: var(--bg-elev, #12161f);
353
+ max-height: 280px;
354
+ overflow: auto;
355
+ }
356
+
357
+ .memory-query-result.ok {
358
+ border-color: var(--accent-border, rgba(139, 92, 246, 0.4));
359
+ }
360
+
361
+ .memory-query-result.err {
362
+ border-color: var(--error, #f87171);
363
+ }
364
+
365
+ .memory-query-result pre {
366
+ margin: 0;
367
+ white-space: pre-wrap;
368
+ word-break: break-word;
369
+ font-size: 12px;
370
+ color: var(--text, #c9d1d9);
371
+ }
372
+
373
+ /* ── Source toggle chips (semantic search) ──────────────────────────────── */
374
+
375
+ .memory-source-toggle-row {
376
+ display: flex;
377
+ gap: 8px;
378
+ align-items: center;
379
+ margin-top: 12px;
380
+ flex-wrap: wrap;
381
+ }
382
+
383
+ .memory-toggle-chip {
384
+ display: inline-flex;
385
+ align-items: center;
386
+ gap: 6px;
387
+ padding: 6px 10px;
388
+ background: transparent;
389
+ border: 1px solid var(--border, #232a39);
390
+ border-radius: 999px;
391
+ color: var(--text-dim, #b4bcd0);
392
+ font-size: 12px;
393
+ font-weight: 500;
394
+ cursor: pointer;
395
+ transition: border-color var(--motion-fast, 120ms), color var(--motion-fast, 120ms);
396
+ }
397
+
398
+ .memory-toggle-chip-active {
399
+ border-color: var(--accent, #8b5cf6);
400
+ color: var(--accent, #8b5cf6);
401
+ background: var(--accent-bg, rgba(139, 92, 246, 0.12));
402
+ }
403
+
404
+ /* ── Config rows ────────────────────────────────────────────────────────── */
405
+
406
+ .memory-config-form {
407
+ display: flex;
408
+ flex-direction: column;
409
+ gap: 12px;
410
+ margin-top: 12px;
411
+ }
412
+
413
+ .memory-config-row-stack {
414
+ display: flex;
415
+ flex-direction: column;
416
+ gap: 4px;
417
+ font-size: 12px;
418
+ color: var(--text-dim, #b4bcd0);
419
+ }
420
+
421
+ .memory-config-row-stack span {
422
+ font-size: 11px;
423
+ text-transform: uppercase;
424
+ letter-spacing: 0.06em;
425
+ }
426
+
427
+ .memory-config-row-inline {
428
+ display: flex;
429
+ align-items: center;
430
+ gap: 12px;
431
+ font-size: 12px;
432
+ color: var(--text-dim, #b4bcd0);
433
+ }
434
+
435
+ .memory-config-row-label {
436
+ min-width: 130px;
437
+ font-size: 11px;
438
+ text-transform: uppercase;
439
+ letter-spacing: 0.06em;
440
+ }
441
+
442
+ .memory-config-row-control {
443
+ flex: 1;
444
+ }
445
+
446
+ .memory-switch {
447
+ display: inline-flex;
448
+ align-items: center;
449
+ gap: 8px;
450
+ font-size: 13px;
451
+ color: var(--text, #c9d1d9);
452
+ }
453
+
454
+ .memory-switch input[type="checkbox"] {
455
+ accent-color: var(--accent, #8b5cf6);
456
+ }
457
+
458
+ /* Definition list (config + repos) */
459
+ dl.memory-config-row {
460
+ display: grid;
461
+ grid-template-columns: 130px 1fr;
462
+ gap: 8px 16px;
463
+ margin: 12px 0 0;
464
+ }
465
+
466
+ dl.memory-config-row dt {
467
+ font-size: 11px;
468
+ text-transform: uppercase;
469
+ letter-spacing: 0.06em;
470
+ color: var(--text-dim, #b4bcd0);
471
+ }
472
+
473
+ dl.memory-config-row dd {
474
+ margin: 0;
475
+ font-size: 13px;
476
+ color: var(--text-strong, #f0f6fc);
477
+ word-break: break-all;
478
+ }
479
+
480
+ /* ── Obsidian panel 3-col layout ─────────────────────────────────────────── */
481
+
482
+ .memory-obsidian-grid {
483
+ display: grid;
484
+ grid-template-columns: 240px 360px 1fr;
485
+ gap: var(--space-3, 12px);
486
+ align-items: start;
487
+ }
488
+
489
+ @media (max-width: 1200px) {
490
+ .memory-obsidian-grid {
491
+ grid-template-columns: 200px 1fr;
492
+ }
493
+ .memory-obsidian-detail-col {
494
+ grid-column: 1 / -1;
495
+ }
496
+ }
497
+
498
+ @media (max-width: 720px) {
499
+ .memory-obsidian-grid {
500
+ grid-template-columns: 1fr;
501
+ }
502
+ }
503
+
504
+ .memory-tree-card {
505
+ position: sticky;
506
+ top: 16px;
507
+ max-height: 70vh;
508
+ overflow: auto;
509
+ }
510
+
511
+ .memory-tree-body {
512
+ margin-top: 8px;
513
+ display: flex;
514
+ flex-direction: column;
515
+ gap: 1px;
516
+ }
517
+
518
+ .memory-tree-folder {
519
+ display: flex;
520
+ flex-direction: column;
521
+ }
522
+
523
+ .memory-tree-children {
524
+ display: flex;
525
+ flex-direction: column;
526
+ gap: 1px;
527
+ }
528
+
529
+ .memory-tree-node {
530
+ display: flex;
531
+ align-items: center;
532
+ gap: 6px;
533
+ padding: 4px 6px;
534
+ background: transparent;
535
+ border: 1px solid transparent;
536
+ border-radius: var(--radius-sm, 4px);
537
+ color: var(--text-dim, #b4bcd0);
538
+ font-size: 12px;
539
+ cursor: pointer;
540
+ text-align: left;
541
+ transition: background var(--motion-fast, 120ms), color var(--motion-fast, 120ms);
542
+ }
543
+
544
+ .memory-tree-node:hover {
545
+ background: var(--bg-elev-2, #1a1f2b);
546
+ color: var(--text, #c9d1d9);
547
+ }
548
+
549
+ .memory-tree-node-folder {
550
+ font-weight: 500;
551
+ color: var(--text, #c9d1d9);
552
+ }
553
+
554
+ .memory-tree-node-active {
555
+ background: var(--accent-bg, rgba(139, 92, 246, 0.12));
556
+ color: var(--accent, #8b5cf6);
557
+ }
558
+
559
+ /* ── Note list + cards ──────────────────────────────────────────────────── */
560
+
561
+ .memory-obsidian-list-col {
562
+ display: flex;
563
+ flex-direction: column;
564
+ gap: 8px;
565
+ min-width: 0;
566
+ }
567
+
568
+ .memory-list-toolbar {
569
+ display: flex;
570
+ gap: 8px;
571
+ align-items: center;
572
+ flex-wrap: wrap;
573
+ }
574
+
575
+ .memory-list-toolbar .search-input {
576
+ flex: 1;
577
+ min-width: 160px;
578
+ }
579
+
580
+ .memory-note-list {
581
+ list-style: none;
582
+ margin: 0;
583
+ padding: 0;
584
+ display: flex;
585
+ flex-direction: column;
586
+ gap: 4px;
587
+ }
588
+
589
+ .memory-note-card {
590
+ display: flex;
591
+ align-items: center;
592
+ gap: 4px;
593
+ padding: 8px 10px;
594
+ background: var(--bg-elev, #12161f);
595
+ border: 1px solid var(--border, #232a39);
596
+ border-radius: var(--radius, 8px);
597
+ transition: border-color var(--motion-fast, 120ms);
598
+ }
599
+
600
+ .memory-note-card:hover {
601
+ border-color: var(--border-strong, #2d3648);
602
+ }
603
+
604
+ .memory-note-card-active {
605
+ border-color: var(--accent, #8b5cf6);
606
+ background: var(--accent-bg, rgba(139, 92, 246, 0.12));
607
+ }
608
+
609
+ .memory-note-card-main {
610
+ flex: 1;
611
+ display: flex;
612
+ flex-direction: column;
613
+ gap: 2px;
614
+ background: transparent;
615
+ border: none;
616
+ text-align: left;
617
+ cursor: pointer;
618
+ color: inherit;
619
+ font: inherit;
620
+ padding: 0;
621
+ min-width: 0;
622
+ }
623
+
624
+ .memory-note-card-title {
625
+ display: flex;
626
+ align-items: center;
627
+ gap: 6px;
628
+ font-size: 13px;
629
+ font-weight: 500;
630
+ color: var(--text-strong, #f0f6fc);
631
+ overflow: hidden;
632
+ text-overflow: ellipsis;
633
+ white-space: nowrap;
634
+ }
635
+
636
+ .memory-note-card-meta {
637
+ display: flex;
638
+ align-items: center;
639
+ gap: 6px;
640
+ font-size: 11px;
641
+ color: var(--text-dim, #b4bcd0);
642
+ overflow: hidden;
643
+ }
644
+
645
+ .memory-note-card-meta code {
646
+ font-size: 11px;
647
+ overflow: hidden;
648
+ text-overflow: ellipsis;
649
+ white-space: nowrap;
650
+ }
651
+
652
+ .memory-note-card-actions {
653
+ display: flex;
654
+ gap: 2px;
655
+ flex-shrink: 0;
656
+ }
657
+
658
+ .memory-pill-warn {
659
+ display: inline-block;
660
+ font-size: 10px;
661
+ padding: 1px 6px;
662
+ border-radius: 8px;
663
+ background: var(--warning-soft, rgba(251, 191, 36, 0.15));
664
+ color: var(--warning, #fbbf24);
665
+ }
666
+
667
+ .memory-pill {
668
+ display: inline-block;
669
+ font-size: 10px;
670
+ padding: 1px 6px;
671
+ border-radius: 8px;
672
+ font-weight: 600;
673
+ }
674
+
675
+ .memory-pill-ok {
676
+ background: var(--success-soft, rgba(52, 211, 153, 0.15));
677
+ color: var(--success, #34d399);
678
+ }
679
+
680
+ .memory-pill-warn {
681
+ background: var(--warning-soft, rgba(251, 191, 36, 0.15));
682
+ color: var(--warning, #fbbf24);
683
+ }
684
+
685
+ /* ── Note detail pane ───────────────────────────────────────────────────── */
686
+
687
+ .memory-obsidian-detail-col {
688
+ min-width: 0;
689
+ background: var(--bg-elev, #12161f);
690
+ border: 1px solid var(--border, #232a39);
691
+ border-radius: var(--radius, 8px);
692
+ padding: 14px 16px;
693
+ }
694
+
695
+ .memory-note-detail-head {
696
+ display: flex;
697
+ align-items: center;
698
+ justify-content: space-between;
699
+ gap: 8px;
700
+ }
701
+
702
+ .memory-note-detail-head h3 {
703
+ margin: 0;
704
+ font-size: 15px;
705
+ font-weight: 600;
706
+ }
707
+
708
+ .memory-note-detail-meta {
709
+ display: flex;
710
+ align-items: center;
711
+ gap: 8px;
712
+ font-size: 12px;
713
+ color: var(--text-dim, #b4bcd0);
714
+ margin: 4px 0 12px;
715
+ }
716
+
717
+ .memory-note-body {
718
+ margin: 0;
719
+ padding: 12px;
720
+ background: var(--bg, #0b0e14);
721
+ border: 1px solid var(--border, #232a39);
722
+ border-radius: var(--radius-sm, 6px);
723
+ white-space: pre-wrap;
724
+ word-break: break-word;
725
+ max-height: 360px;
726
+ overflow: auto;
727
+ }
728
+
729
+ .memory-tag-row {
730
+ display: flex;
731
+ gap: 6px;
732
+ flex-wrap: wrap;
733
+ margin-bottom: 12px;
734
+ }
735
+
736
+ .memory-tag {
737
+ display: inline-block;
738
+ font-size: 11px;
739
+ padding: 2px 8px;
740
+ border-radius: 999px;
741
+ background: var(--accent-bg, rgba(139, 92, 246, 0.12));
742
+ color: var(--accent, #8b5cf6);
743
+ }
744
+
745
+ .memory-backlinks {
746
+ margin-top: 16px;
747
+ padding-top: 12px;
748
+ border-top: 1px solid var(--border, #232a39);
749
+ }
750
+
751
+ .memory-backlinks h4 {
752
+ margin: 0 0 8px;
753
+ font-size: 12px;
754
+ text-transform: uppercase;
755
+ letter-spacing: 0.06em;
756
+ color: var(--text-dim, #b4bcd0);
757
+ }
758
+
759
+ .memory-backlinks ul {
760
+ list-style: none;
761
+ margin: 0;
762
+ padding: 0;
763
+ display: flex;
764
+ flex-direction: column;
765
+ gap: 8px;
766
+ }
767
+
768
+ .memory-backlinks li {
769
+ padding: 6px 8px;
770
+ background: var(--bg, #0b0e14);
771
+ border: 1px solid var(--border, #232a39);
772
+ border-radius: var(--radius-sm, 6px);
773
+ }
774
+
775
+ .memory-backlinks li code {
776
+ font-size: 11px;
777
+ }
778
+
779
+ /* ── Note editor modal ──────────────────────────────────────────────────── */
780
+
781
+ .memory-editor-modal {
782
+ display: flex;
783
+ flex-direction: column;
784
+ }
785
+
786
+ .memory-editor-textarea {
787
+ width: 100%;
788
+ padding: 8px 10px;
789
+ background: var(--bg, #0b0e14);
790
+ border: 1px solid var(--border, #232a39);
791
+ border-radius: var(--radius-sm, 6px);
792
+ color: var(--text, #c9d1d9);
793
+ font-family: var(--font-mono, monospace);
794
+ font-size: 13px;
795
+ line-height: 1.5;
796
+ resize: vertical;
797
+ }
798
+
799
+ /* ── Git status row ─────────────────────────────────────────────────────── */
800
+
801
+ .memory-git-status-row {
802
+ display: flex;
803
+ gap: 8px;
804
+ flex-wrap: wrap;
805
+ margin-top: 8px;
806
+ }
807
+
808
+ .memory-git-status-pill {
809
+ display: inline-flex;
810
+ align-items: center;
811
+ gap: 4px;
812
+ padding: 4px 10px;
813
+ border-radius: 999px;
814
+ font-size: 11px;
815
+ font-weight: 500;
816
+ }
817
+
818
+ .memory-git-status-pill.ok {
819
+ background: var(--success-soft, rgba(52, 211, 153, 0.15));
820
+ color: var(--success, #34d399);
821
+ }
822
+
823
+ .memory-git-status-pill.warn {
824
+ background: var(--warning-soft, rgba(251, 191, 36, 0.15));
825
+ color: var(--warning, #fbbf24);
826
+ }
827
+
828
+ .memory-diff-files {
829
+ list-style: none;
830
+ margin: 8px 0;
831
+ padding: 0;
832
+ display: flex;
833
+ flex-wrap: wrap;
834
+ gap: 6px;
835
+ }
836
+
837
+ .memory-diff-files li code {
838
+ font-size: 11px;
839
+ padding: 2px 8px;
840
+ border-radius: var(--radius-sm, 4px);
841
+ background: var(--bg, #0b0e14);
842
+ border: 1px solid var(--border, #232a39);
843
+ }
844
+
845
+ /* ── Log tail + small badges ────────────────────────────────────────────── */
846
+
847
+ .memory-log-tail {
848
+ margin: 8px 0 0;
849
+ padding: 10px 12px;
850
+ background: var(--bg, #0b0e14);
851
+ border: 1px solid var(--border, #232a39);
852
+ border-radius: var(--radius-sm, 6px);
853
+ white-space: pre-wrap;
854
+ word-break: break-word;
855
+ max-height: 280px;
856
+ overflow: auto;
857
+ color: var(--text-dim, #b4bcd0);
858
+ }
859
+
860
+ .memory-mini-badge {
861
+ position: absolute;
862
+ top: -4px;
863
+ right: -6px;
864
+ background: var(--accent, #8b5cf6);
865
+ color: var(--text-strong, #f0f6fc);
866
+ font-size: 9px;
867
+ padding: 0 4px;
868
+ border-radius: 999px;
869
+ line-height: 14px;
870
+ font-weight: 600;
871
+ }
872
+
873
+ /* ── Search result rows ─────────────────────────────────────────────────── */
874
+
875
+ .memory-search-result-list {
876
+ list-style: none;
877
+ margin: 0;
878
+ padding: 0;
879
+ display: flex;
880
+ flex-direction: column;
881
+ gap: 8px;
882
+ }
883
+
884
+ .memory-search-result {
885
+ padding: 10px 12px;
886
+ background: var(--bg, #0b0e14);
887
+ border: 1px solid var(--border, #232a39);
888
+ border-radius: var(--radius-sm, 6px);
889
+ }
890
+
891
+ .memory-search-result-head {
892
+ display: flex;
893
+ align-items: center;
894
+ justify-content: space-between;
895
+ gap: 8px;
896
+ margin-bottom: 4px;
897
+ }
898
+
899
+ .memory-search-result-head code {
900
+ font-size: 11px;
901
+ }
902
+
903
+ .memory-search-result p {
904
+ margin: 0;
905
+ white-space: pre-wrap;
906
+ }
907
+
908
+ /* ── Misc helpers ───────────────────────────────────────────────────────── */
909
+
910
+ .memory-spin {
911
+ animation: memory-spin 1s linear infinite;
912
+ }
913
+
914
+ @keyframes memory-spin {
915
+ to { transform: rotate(360deg); }
916
+ }
917
+
918
+ /* ── Memory status card on Overview ─────────────────────────────────────── */
919
+
920
+ .memory-status-card-grid {
921
+ display: grid;
922
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
923
+ gap: var(--space-3, 12px);
924
+ margin-top: 8px;
925
+ }
926
+
927
+ .memory-status-card-cell {
928
+ display: flex;
929
+ flex-direction: column;
930
+ gap: 4px;
931
+ padding: 10px 12px;
932
+ background: var(--bg-elev-2, #1a1f2b);
933
+ border: 1px solid var(--border, #232a39);
934
+ border-radius: var(--radius-sm, 6px);
935
+ }
936
+
937
+ .memory-status-card-label {
938
+ display: flex;
939
+ align-items: center;
940
+ gap: 4px;
941
+ font-size: 11px;
942
+ text-transform: uppercase;
943
+ letter-spacing: 0.06em;
944
+ color: var(--text-dim, #b4bcd0);
945
+ }
946
+
947
+ .memory-status-card-value {
948
+ font-size: 16px;
949
+ font-weight: 600;
950
+ color: var(--text-strong, #f0f6fc);
951
+ }
952
+
953
+ .memory-status-card-sub {
954
+ font-size: 11px;
955
+ }