agent-knowledge 1.0.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 (130) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/LICENSE +21 -0
  3. package/README.md +191 -0
  4. package/dist/dashboard.d.ts +4 -0
  5. package/dist/dashboard.d.ts.map +1 -0
  6. package/dist/dashboard.js +434 -0
  7. package/dist/dashboard.js.map +1 -0
  8. package/dist/embeddings/claude.d.ts +21 -0
  9. package/dist/embeddings/claude.d.ts.map +1 -0
  10. package/dist/embeddings/claude.js +84 -0
  11. package/dist/embeddings/claude.js.map +1 -0
  12. package/dist/embeddings/factory.d.ts +9 -0
  13. package/dist/embeddings/factory.d.ts.map +1 -0
  14. package/dist/embeddings/factory.js +60 -0
  15. package/dist/embeddings/factory.js.map +1 -0
  16. package/dist/embeddings/gemini.d.ts +21 -0
  17. package/dist/embeddings/gemini.d.ts.map +1 -0
  18. package/dist/embeddings/gemini.js +86 -0
  19. package/dist/embeddings/gemini.js.map +1 -0
  20. package/dist/embeddings/index.d.ts +4 -0
  21. package/dist/embeddings/index.d.ts.map +1 -0
  22. package/dist/embeddings/index.js +3 -0
  23. package/dist/embeddings/index.js.map +1 -0
  24. package/dist/embeddings/local.d.ts +20 -0
  25. package/dist/embeddings/local.d.ts.map +1 -0
  26. package/dist/embeddings/local.js +73 -0
  27. package/dist/embeddings/local.js.map +1 -0
  28. package/dist/embeddings/openai.d.ts +20 -0
  29. package/dist/embeddings/openai.d.ts.map +1 -0
  30. package/dist/embeddings/openai.js +84 -0
  31. package/dist/embeddings/openai.js.map +1 -0
  32. package/dist/embeddings/types.d.ts +39 -0
  33. package/dist/embeddings/types.d.ts.map +1 -0
  34. package/dist/embeddings/types.js +12 -0
  35. package/dist/embeddings/types.js.map +1 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +18 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/knowledge/distill.d.ts +27 -0
  41. package/dist/knowledge/distill.d.ts.map +1 -0
  42. package/dist/knowledge/distill.js +407 -0
  43. package/dist/knowledge/distill.js.map +1 -0
  44. package/dist/knowledge/git.d.ts +30 -0
  45. package/dist/knowledge/git.d.ts.map +1 -0
  46. package/dist/knowledge/git.js +228 -0
  47. package/dist/knowledge/git.js.map +1 -0
  48. package/dist/knowledge/search.d.ts +20 -0
  49. package/dist/knowledge/search.d.ts.map +1 -0
  50. package/dist/knowledge/search.js +72 -0
  51. package/dist/knowledge/search.js.map +1 -0
  52. package/dist/knowledge/store.d.ts +47 -0
  53. package/dist/knowledge/store.d.ts.map +1 -0
  54. package/dist/knowledge/store.js +173 -0
  55. package/dist/knowledge/store.js.map +1 -0
  56. package/dist/search/excerpt.d.ts +12 -0
  57. package/dist/search/excerpt.d.ts.map +1 -0
  58. package/dist/search/excerpt.js +28 -0
  59. package/dist/search/excerpt.js.map +1 -0
  60. package/dist/search/fuzzy.d.ts +15 -0
  61. package/dist/search/fuzzy.d.ts.map +1 -0
  62. package/dist/search/fuzzy.js +81 -0
  63. package/dist/search/fuzzy.js.map +1 -0
  64. package/dist/search/tfidf.d.ts +19 -0
  65. package/dist/search/tfidf.d.ts.map +1 -0
  66. package/dist/search/tfidf.js +200 -0
  67. package/dist/search/tfidf.js.map +1 -0
  68. package/dist/search/types.d.ts +19 -0
  69. package/dist/search/types.d.ts.map +1 -0
  70. package/dist/search/types.js +2 -0
  71. package/dist/search/types.js.map +1 -0
  72. package/dist/server.d.ts +3 -0
  73. package/dist/server.d.ts.map +1 -0
  74. package/dist/server.js +518 -0
  75. package/dist/server.js.map +1 -0
  76. package/dist/sessions/indexer.d.ts +15 -0
  77. package/dist/sessions/indexer.d.ts.map +1 -0
  78. package/dist/sessions/indexer.js +182 -0
  79. package/dist/sessions/indexer.js.map +1 -0
  80. package/dist/sessions/parser.d.ts +58 -0
  81. package/dist/sessions/parser.d.ts.map +1 -0
  82. package/dist/sessions/parser.js +142 -0
  83. package/dist/sessions/parser.js.map +1 -0
  84. package/dist/sessions/scopes.d.ts +16 -0
  85. package/dist/sessions/scopes.d.ts.map +1 -0
  86. package/dist/sessions/scopes.js +153 -0
  87. package/dist/sessions/scopes.js.map +1 -0
  88. package/dist/sessions/search.d.ts +26 -0
  89. package/dist/sessions/search.d.ts.map +1 -0
  90. package/dist/sessions/search.js +256 -0
  91. package/dist/sessions/search.js.map +1 -0
  92. package/dist/sessions/summary.d.ts +28 -0
  93. package/dist/sessions/summary.d.ts.map +1 -0
  94. package/dist/sessions/summary.js +135 -0
  95. package/dist/sessions/summary.js.map +1 -0
  96. package/dist/types.d.ts +26 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +109 -0
  99. package/dist/types.js.map +1 -0
  100. package/dist/ui/app.js +1029 -0
  101. package/dist/ui/index.html +373 -0
  102. package/dist/ui/styles.css +1508 -0
  103. package/dist/ui/ui/app.js +811 -0
  104. package/dist/ui/ui/index.html +300 -0
  105. package/dist/ui/ui/styles.css +1154 -0
  106. package/dist/validate.d.ts +21 -0
  107. package/dist/validate.d.ts.map +1 -0
  108. package/dist/validate.js +86 -0
  109. package/dist/validate.js.map +1 -0
  110. package/dist/vectorstore/chunker.d.ts +48 -0
  111. package/dist/vectorstore/chunker.d.ts.map +1 -0
  112. package/dist/vectorstore/chunker.js +165 -0
  113. package/dist/vectorstore/chunker.js.map +1 -0
  114. package/dist/vectorstore/index.d.ts +5 -0
  115. package/dist/vectorstore/index.d.ts.map +1 -0
  116. package/dist/vectorstore/index.js +3 -0
  117. package/dist/vectorstore/index.js.map +1 -0
  118. package/dist/vectorstore/store.d.ts +139 -0
  119. package/dist/vectorstore/store.d.ts.map +1 -0
  120. package/dist/vectorstore/store.js +500 -0
  121. package/dist/vectorstore/store.js.map +1 -0
  122. package/dist/version.d.ts +2 -0
  123. package/dist/version.d.ts.map +1 -0
  124. package/dist/version.js +2 -0
  125. package/dist/version.js.map +1 -0
  126. package/docs/ARCHITECTURE.md +244 -0
  127. package/docs/DASHBOARD.md +133 -0
  128. package/docs/SETUP.md +178 -0
  129. package/package.json +92 -0
  130. package/scripts/copy-ui.js +6 -0
@@ -0,0 +1,1154 @@
1
+ /* ═══════════════════════════════════════════════════════════════════════════
2
+ agent-cortex — Dashboard Styles (MD3 Design Language)
3
+ Matches agent-comm and agent-tasks design tokens exactly.
4
+ ═══════════════════════════════════════════════════════════════════════════ */
5
+
6
+ /* ── Reset ─────────────────────────────────────────────────────────────── */
7
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
8
+
9
+ /* ── Design Tokens (Light) ─────────────────────────────────────────────── */
10
+ :root {
11
+ --bg: #ffffff;
12
+ --bg-surface: #f5f7f9;
13
+ --bg-elevated: #edf0f4;
14
+ --bg-hover: #e4e8ed;
15
+ --bg-inset: #dde3e9;
16
+ --border: #c8d1da;
17
+ --border-light: #dde3e9;
18
+ --text: #1c2a33;
19
+ --text-secondary: #3d5263;
20
+ --text-muted: #5a6b78;
21
+ --text-dim: #8895a0;
22
+ --accent: #5d8da8;
23
+ --accent-hover: #4e7a93;
24
+ --accent-dim: rgba(93, 141, 168, 0.15);
25
+ --accent-solid: #243742;
26
+ --accent-glow: rgba(93, 141, 168, 0.35);
27
+ --green: #1a7f37;
28
+ --green-dim: rgba(26, 127, 55, 0.12);
29
+ --yellow: #9a6700;
30
+ --yellow-dim: rgba(154, 103, 0, 0.12);
31
+ --orange: #bc4c00;
32
+ --orange-dim: rgba(188, 76, 0, 0.12);
33
+ --red: #cf222e;
34
+ --red-dim: rgba(207, 34, 46, 0.12);
35
+ --purple: #6e78a8;
36
+ --purple-dim: rgba(110, 120, 168, 0.12);
37
+ --blue: #0969da;
38
+ --blue-dim: rgba(9, 105, 218, 0.12);
39
+ --radius: 12px;
40
+ --radius-sm: 8px;
41
+ --radius-lg: 16px;
42
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
43
+ --font-mono: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace;
44
+ --shadow-1: 0px 1px 2px 0px rgba(0,0,0,0.3), 0px 1px 3px 1px rgba(0,0,0,0.15);
45
+ --shadow-2: 0px 1px 2px 0px rgba(0,0,0,0.3), 0px 2px 6px 2px rgba(0,0,0,0.15);
46
+ --shadow-3: 0px 1px 3px 0px rgba(0,0,0,0.3), 0px 4px 8px 3px rgba(0,0,0,0.15);
47
+ --shadow-hover: 0px 2px 4px 0px rgba(0,0,0,0.25), 0px 4px 12px 4px rgba(0,0,0,0.15);
48
+ --shadow-panel: -2px 0px 8px 0px rgba(0,0,0,0.3), -4px 0px 16px 2px rgba(0,0,0,0.15);
49
+ --focus-ring: rgba(93, 141, 168, 0.35);
50
+ --transition-fast: 0.15s ease;
51
+ --transition-normal: 0.2s ease;
52
+ --transition-slow: 0.3s ease;
53
+ --panel-width: 560px;
54
+ }
55
+
56
+ /* ── Dark Theme ────────────────────────────────────────────────────────── */
57
+ [data-theme='dark'] {
58
+ --bg: #0d1117;
59
+ --bg-surface: #161b22;
60
+ --bg-elevated: #1c2128;
61
+ --bg-hover: #262c36;
62
+ --bg-inset: #2d333b;
63
+ --border: #373e47;
64
+ --border-light: #2d333b;
65
+ --text: #e6edf3;
66
+ --text-secondary: #b1bac4;
67
+ --text-muted: #8b949e;
68
+ --text-dim: #6e7681;
69
+ --accent: #5d8da8;
70
+ --accent-hover: #79a8c0;
71
+ --accent-dim: rgba(93, 141, 168, 0.2);
72
+ --accent-solid: #a8c8d8;
73
+ --accent-glow: rgba(93, 141, 168, 0.4);
74
+ --green: #3fb950;
75
+ --green-dim: rgba(63, 185, 80, 0.15);
76
+ --yellow: #d29922;
77
+ --yellow-dim: rgba(210, 153, 34, 0.15);
78
+ --orange: #db6d28;
79
+ --orange-dim: rgba(219, 109, 40, 0.15);
80
+ --red: #f85149;
81
+ --red-dim: rgba(248, 81, 73, 0.15);
82
+ --purple: #8e9ad0;
83
+ --purple-dim: rgba(142, 154, 208, 0.15);
84
+ --blue: #58a6ff;
85
+ --blue-dim: rgba(88, 166, 255, 0.15);
86
+ --shadow-1: 0px 1px 2px 0px rgba(0,0,0,0.6), 0px 1px 3px 1px rgba(0,0,0,0.3);
87
+ --shadow-2: 0px 1px 2px 0px rgba(0,0,0,0.6), 0px 2px 6px 2px rgba(0,0,0,0.3);
88
+ --shadow-3: 0px 1px 3px 0px rgba(0,0,0,0.6), 0px 4px 8px 3px rgba(0,0,0,0.3);
89
+ --shadow-hover: 0px 2px 4px 0px rgba(0,0,0,0.5), 0px 4px 12px 4px rgba(0,0,0,0.3);
90
+ --shadow-panel: -2px 0px 8px 0px rgba(0,0,0,0.6), -4px 0px 16px 2px rgba(0,0,0,0.3);
91
+ }
92
+
93
+ /* ── Base ──────────────────────────────────────────────────────────────── */
94
+ html { height: 100%; }
95
+
96
+ body {
97
+ font-family: var(--font-sans);
98
+ font-size: 14px;
99
+ line-height: 1.5;
100
+ color: var(--text);
101
+ background: var(--bg);
102
+ height: 100%;
103
+ overflow: hidden;
104
+ -webkit-font-smoothing: antialiased;
105
+ }
106
+
107
+ .material-symbols-outlined {
108
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
109
+ }
110
+
111
+ /* ── Scrollbar ─────────────────────────────────────────────────────────── */
112
+ ::-webkit-scrollbar { width: 6px; height: 6px; }
113
+ ::-webkit-scrollbar-track { background: transparent; }
114
+ ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
115
+ ::-webkit-scrollbar-thumb:hover { background: var(--accent); }
116
+
117
+ /* ── Header ────────────────────────────────────────────────────────────── */
118
+ header {
119
+ display: flex;
120
+ align-items: center;
121
+ justify-content: space-between;
122
+ padding: 8px 16px;
123
+ background: var(--bg-surface);
124
+ border-bottom: 1px solid var(--border);
125
+ flex-shrink: 0;
126
+ z-index: 10;
127
+ }
128
+
129
+ .header-left {
130
+ display: flex;
131
+ align-items: center;
132
+ gap: 8px;
133
+ }
134
+
135
+ .header-right {
136
+ display: flex;
137
+ align-items: center;
138
+ gap: 12px;
139
+ }
140
+
141
+ .brand-icon {
142
+ font-size: 24px;
143
+ color: var(--accent);
144
+ }
145
+
146
+ h1 {
147
+ font-family: var(--font-mono);
148
+ font-size: 17px;
149
+ font-weight: 700;
150
+ color: var(--accent-solid);
151
+ letter-spacing: -0.3px;
152
+ }
153
+
154
+ .version {
155
+ font-family: var(--font-mono);
156
+ font-size: 10px;
157
+ font-weight: 500;
158
+ color: var(--text-dim);
159
+ background: var(--bg-elevated);
160
+ padding: 2px 6px;
161
+ border-radius: 10px;
162
+ letter-spacing: 0.3px;
163
+ }
164
+
165
+ /* ── Connection Status ─────────────────────────────────────────────────── */
166
+ .status-badge {
167
+ display: inline-flex;
168
+ align-items: center;
169
+ gap: 4px;
170
+ font-size: 11px;
171
+ font-weight: 500;
172
+ padding: 2px 8px;
173
+ border-radius: 10px;
174
+ }
175
+
176
+ .status-badge::before {
177
+ content: '';
178
+ width: 6px;
179
+ height: 6px;
180
+ border-radius: 50%;
181
+ flex-shrink: 0;
182
+ }
183
+
184
+ .status-badge.connected { color: var(--green); }
185
+ .status-badge.connected::before { background: var(--green); }
186
+ .status-badge.disconnected { color: var(--red); }
187
+ .status-badge.disconnected::before { background: var(--red); }
188
+
189
+ /* ── Stats ─────────────────────────────────────────────────────────────── */
190
+ .stats {
191
+ display: flex;
192
+ gap: 8px;
193
+ }
194
+
195
+ .stat-badge {
196
+ display: inline-flex;
197
+ align-items: center;
198
+ gap: 4px;
199
+ font-size: 12px;
200
+ font-weight: 500;
201
+ color: var(--text-muted);
202
+ background: var(--bg-elevated);
203
+ padding: 4px 10px;
204
+ border-radius: var(--radius-sm);
205
+ }
206
+
207
+ .stat-badge .stat-icon {
208
+ font-size: 16px;
209
+ color: var(--accent);
210
+ }
211
+
212
+ .stat-badge .stat-value {
213
+ font-family: var(--font-mono);
214
+ font-weight: 600;
215
+ color: var(--text);
216
+ }
217
+
218
+ /* ── Icon Button ───────────────────────────────────────────────────────── */
219
+ .icon-btn {
220
+ display: inline-flex;
221
+ align-items: center;
222
+ justify-content: center;
223
+ width: 32px;
224
+ height: 32px;
225
+ border: none;
226
+ background: transparent;
227
+ color: var(--text-muted);
228
+ border-radius: var(--radius-sm);
229
+ cursor: pointer;
230
+ transition: background var(--transition-fast), color var(--transition-fast);
231
+ }
232
+
233
+ .icon-btn:hover {
234
+ background: var(--bg-hover);
235
+ color: var(--text);
236
+ }
237
+
238
+ .icon-btn:focus-visible {
239
+ outline: 2px solid var(--accent);
240
+ outline-offset: 1px;
241
+ }
242
+
243
+ /* ── Tab Bar ───────────────────────────────────────────────────────────── */
244
+ .tab-bar {
245
+ display: flex;
246
+ background: var(--bg-surface);
247
+ border-bottom: 1px solid var(--border);
248
+ padding: 0 16px;
249
+ gap: 0;
250
+ flex-shrink: 0;
251
+ }
252
+
253
+ .tab {
254
+ display: inline-flex;
255
+ align-items: center;
256
+ gap: 6px;
257
+ padding: 10px 16px;
258
+ font-size: 13px;
259
+ font-weight: 500;
260
+ color: var(--text-muted);
261
+ background: none;
262
+ border: none;
263
+ border-bottom: 2px solid transparent;
264
+ cursor: pointer;
265
+ transition: color var(--transition-fast), border-color var(--transition-fast);
266
+ white-space: nowrap;
267
+ }
268
+
269
+ .tab:hover {
270
+ color: var(--text);
271
+ background: var(--bg-hover);
272
+ }
273
+
274
+ .tab.active {
275
+ color: var(--accent);
276
+ border-bottom-color: var(--accent);
277
+ font-weight: 600;
278
+ }
279
+
280
+ .tab-icon {
281
+ font-size: 20px;
282
+ }
283
+
284
+ /* ── Content Layout ────────────────────────────────────────────────────── */
285
+ .content-wrapper {
286
+ display: flex;
287
+ flex: 1;
288
+ overflow: hidden;
289
+ min-height: 0;
290
+ }
291
+
292
+ #content {
293
+ flex: 1;
294
+ overflow-y: auto;
295
+ padding: 20px 24px;
296
+ min-width: 0;
297
+ }
298
+
299
+ .view { display: none; }
300
+ .view.active { display: block; }
301
+
302
+ .view-header {
303
+ display: flex;
304
+ align-items: center;
305
+ justify-content: space-between;
306
+ margin-bottom: 16px;
307
+ }
308
+
309
+ .view-header h2 {
310
+ display: flex;
311
+ align-items: center;
312
+ gap: 8px;
313
+ font-size: 17px;
314
+ font-weight: 700;
315
+ color: var(--accent-solid);
316
+ }
317
+
318
+ .view-icon {
319
+ font-size: 22px;
320
+ color: var(--accent);
321
+ }
322
+
323
+ .view-actions {
324
+ display: flex;
325
+ gap: 8px;
326
+ }
327
+
328
+ /* ── Filter Chips ──────────────────────────────────────────────────────── */
329
+ .filter-chips {
330
+ display: flex;
331
+ flex-wrap: wrap;
332
+ gap: 6px;
333
+ margin-bottom: 16px;
334
+ }
335
+
336
+ .chip {
337
+ display: inline-flex;
338
+ align-items: center;
339
+ gap: 4px;
340
+ padding: 5px 12px;
341
+ font-size: 12px;
342
+ font-weight: 500;
343
+ color: var(--text-muted);
344
+ background: var(--bg-elevated);
345
+ border: 1px solid transparent;
346
+ border-radius: var(--radius-sm);
347
+ cursor: pointer;
348
+ transition: all var(--transition-fast);
349
+ white-space: nowrap;
350
+ }
351
+
352
+ .chip:hover {
353
+ background: var(--bg-hover);
354
+ color: var(--text);
355
+ }
356
+
357
+ .chip.active {
358
+ background: var(--accent-dim);
359
+ color: var(--accent);
360
+ border-color: var(--accent);
361
+ font-weight: 600;
362
+ }
363
+
364
+ .chip-icon {
365
+ font-size: 16px;
366
+ }
367
+
368
+ /* ── Search Input ──────────────────────────────────────────────────────── */
369
+ .search-bar {
370
+ position: relative;
371
+ margin-bottom: 16px;
372
+ }
373
+
374
+ .search-input-icon {
375
+ position: absolute;
376
+ left: 12px;
377
+ top: 50%;
378
+ transform: translateY(-50%);
379
+ font-size: 20px;
380
+ color: var(--text-dim);
381
+ pointer-events: none;
382
+ }
383
+
384
+ .search-input {
385
+ width: 100%;
386
+ height: 40px;
387
+ padding: 0 12px 0 40px;
388
+ font-size: 14px;
389
+ font-family: var(--font-sans);
390
+ color: var(--text);
391
+ background: var(--bg-elevated);
392
+ border: 1px solid var(--border-light);
393
+ border-radius: var(--radius-sm);
394
+ outline: none;
395
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
396
+ }
397
+
398
+ .search-input::placeholder { color: var(--text-dim); }
399
+
400
+ .search-input:focus {
401
+ border-color: var(--accent);
402
+ box-shadow: 0 0 0 3px var(--focus-ring);
403
+ }
404
+
405
+ /* ── Search Controls ───────────────────────────────────────────────────── */
406
+ .search-controls {
407
+ display: flex;
408
+ align-items: center;
409
+ justify-content: space-between;
410
+ margin-bottom: 16px;
411
+ flex-wrap: wrap;
412
+ gap: 8px;
413
+ }
414
+
415
+ .mode-toggle {
416
+ display: flex;
417
+ gap: 0;
418
+ border: 1px solid var(--border);
419
+ border-radius: var(--radius-sm);
420
+ overflow: hidden;
421
+ }
422
+
423
+ .mode-btn {
424
+ display: inline-flex;
425
+ align-items: center;
426
+ gap: 4px;
427
+ padding: 5px 12px;
428
+ font-size: 12px;
429
+ font-weight: 500;
430
+ color: var(--text-muted);
431
+ background: var(--bg-elevated);
432
+ border: none;
433
+ cursor: pointer;
434
+ transition: all var(--transition-fast);
435
+ }
436
+
437
+ .mode-btn:hover { background: var(--bg-hover); color: var(--text); }
438
+
439
+ .mode-btn.active {
440
+ background: var(--accent-dim);
441
+ color: var(--accent);
442
+ font-weight: 600;
443
+ }
444
+
445
+ .mode-btn .material-symbols-outlined { font-size: 16px; }
446
+
447
+ /* ── Card Grid ─────────────────────────────────────────────────────────── */
448
+ .card-grid {
449
+ display: grid;
450
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
451
+ gap: 12px;
452
+ }
453
+
454
+ /* ── Knowledge Card ────────────────────────────────────────────────────── */
455
+ .knowledge-card {
456
+ background: var(--bg-elevated);
457
+ border: 1px solid transparent;
458
+ border-radius: var(--radius);
459
+ padding: 14px 16px;
460
+ cursor: pointer;
461
+ box-shadow: var(--shadow-1);
462
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast), border-color var(--transition-fast);
463
+ }
464
+
465
+ .knowledge-card:hover {
466
+ transform: translateY(-1px);
467
+ box-shadow: var(--shadow-hover);
468
+ border-color: var(--accent);
469
+ }
470
+
471
+ .knowledge-card .card-title {
472
+ font-size: 14px;
473
+ font-weight: 600;
474
+ color: var(--text);
475
+ margin-bottom: 6px;
476
+ line-height: 1.3;
477
+ }
478
+
479
+ .knowledge-card .card-category {
480
+ display: inline-flex;
481
+ align-items: center;
482
+ gap: 3px;
483
+ font-size: 11px;
484
+ font-weight: 500;
485
+ padding: 2px 8px;
486
+ border-radius: 10px;
487
+ margin-bottom: 8px;
488
+ }
489
+
490
+ .card-category[data-cat="projects"] { background: var(--blue-dim); color: var(--blue); }
491
+ .card-category[data-cat="people"] { background: var(--purple-dim); color: var(--purple); }
492
+ .card-category[data-cat="decisions"] { background: var(--orange-dim); color: var(--orange); }
493
+ .card-category[data-cat="workflows"] { background: var(--green-dim); color: var(--green); }
494
+ .card-category[data-cat="notes"] { background: var(--yellow-dim); color: var(--yellow); }
495
+
496
+ .knowledge-card .card-tags {
497
+ display: flex;
498
+ flex-wrap: wrap;
499
+ gap: 4px;
500
+ margin-bottom: 6px;
501
+ }
502
+
503
+ .card-tag {
504
+ font-size: 10px;
505
+ font-weight: 500;
506
+ padding: 1px 6px;
507
+ border-radius: 6px;
508
+ background: var(--bg-hover);
509
+ color: var(--text-muted);
510
+ }
511
+
512
+ .knowledge-card .card-date {
513
+ font-size: 11px;
514
+ color: var(--text-dim);
515
+ font-family: var(--font-mono);
516
+ }
517
+
518
+ /* ── Results List ──────────────────────────────────────────────────────── */
519
+ .results-list {
520
+ display: flex;
521
+ flex-direction: column;
522
+ gap: 0;
523
+ }
524
+
525
+ .result-item {
526
+ padding: 12px 16px;
527
+ border-bottom: 1px solid var(--border-light);
528
+ cursor: pointer;
529
+ transition: background var(--transition-fast);
530
+ }
531
+
532
+ .result-item:hover {
533
+ background: var(--bg-hover);
534
+ }
535
+
536
+ .result-item:last-child {
537
+ border-bottom: none;
538
+ }
539
+
540
+ .result-meta {
541
+ display: flex;
542
+ align-items: center;
543
+ gap: 8px;
544
+ margin-bottom: 6px;
545
+ flex-wrap: wrap;
546
+ }
547
+
548
+ .result-project {
549
+ font-size: 11px;
550
+ font-weight: 600;
551
+ font-family: var(--font-mono);
552
+ color: var(--accent);
553
+ background: var(--accent-dim);
554
+ padding: 1px 6px;
555
+ border-radius: 6px;
556
+ }
557
+
558
+ .result-date {
559
+ font-size: 11px;
560
+ color: var(--text-dim);
561
+ font-family: var(--font-mono);
562
+ }
563
+
564
+ /* ── Role Badge ────────────────────────────────────────────────────────── */
565
+ .role-badge {
566
+ display: inline-flex;
567
+ align-items: center;
568
+ gap: 2px;
569
+ font-size: 10px;
570
+ font-weight: 600;
571
+ padding: 1px 6px;
572
+ border-radius: 6px;
573
+ text-transform: uppercase;
574
+ letter-spacing: 0.3px;
575
+ }
576
+
577
+ .role-badge[data-role="user"] { background: var(--accent-dim); color: var(--accent); }
578
+ .role-badge[data-role="assistant"] { background: var(--purple-dim); color: var(--purple); }
579
+ .role-badge[data-role="tool_use"] { background: var(--orange-dim); color: var(--orange); }
580
+ .role-badge[data-role="tool_result"] { background: var(--orange-dim); color: var(--orange); }
581
+
582
+ /* ── Score Bar ─────────────────────────────────────────────────────────── */
583
+ .score-container {
584
+ display: flex;
585
+ align-items: center;
586
+ gap: 6px;
587
+ }
588
+
589
+ .score-bar {
590
+ width: 60px;
591
+ height: 4px;
592
+ background: var(--bg-inset);
593
+ border-radius: 2px;
594
+ overflow: hidden;
595
+ }
596
+
597
+ .score-bar-fill {
598
+ height: 100%;
599
+ background: var(--green);
600
+ border-radius: 2px;
601
+ transition: width var(--transition-normal);
602
+ }
603
+
604
+ .score-value {
605
+ font-size: 10px;
606
+ font-weight: 600;
607
+ font-family: var(--font-mono);
608
+ color: var(--text-dim);
609
+ }
610
+
611
+ /* ── Scope Badge ───────────────────────────────────────────────────────── */
612
+ .scope-badge {
613
+ font-size: 10px;
614
+ font-weight: 600;
615
+ padding: 1px 6px;
616
+ border-radius: 6px;
617
+ text-transform: uppercase;
618
+ letter-spacing: 0.3px;
619
+ }
620
+
621
+ .scope-badge[data-scope="errors"] { background: var(--red-dim); color: var(--red); }
622
+ .scope-badge[data-scope="plans"] { background: var(--blue-dim); color: var(--blue); }
623
+ .scope-badge[data-scope="configs"] { background: var(--orange-dim); color: var(--orange); }
624
+ .scope-badge[data-scope="tools"] { background: var(--purple-dim); color: var(--purple); }
625
+ .scope-badge[data-scope="files"] { background: var(--green-dim); color: var(--green); }
626
+ .scope-badge[data-scope="decisions"] { background: var(--yellow-dim); color: var(--yellow); }
627
+
628
+ /* ── Excerpt ───────────────────────────────────────────────────────────── */
629
+ .result-excerpt {
630
+ font-size: 13px;
631
+ font-family: var(--font-mono);
632
+ color: var(--text-secondary);
633
+ line-height: 1.5;
634
+ white-space: pre-wrap;
635
+ word-break: break-word;
636
+ background: var(--bg-surface);
637
+ padding: 8px 12px;
638
+ border-radius: var(--radius-sm);
639
+ margin-top: 6px;
640
+ border-left: 3px solid var(--accent);
641
+ }
642
+
643
+ .result-excerpt mark {
644
+ background: var(--yellow-dim);
645
+ color: var(--yellow);
646
+ padding: 0 2px;
647
+ border-radius: 2px;
648
+ }
649
+
650
+ /* ── Session Cards ─────────────────────────────────────────────────────── */
651
+ .sessions-list {
652
+ display: flex;
653
+ flex-direction: column;
654
+ gap: 8px;
655
+ }
656
+
657
+ .session-card {
658
+ background: var(--bg-elevated);
659
+ border: 1px solid transparent;
660
+ border-radius: var(--radius);
661
+ padding: 12px 16px;
662
+ cursor: pointer;
663
+ box-shadow: var(--shadow-1);
664
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast), border-color var(--transition-fast);
665
+ }
666
+
667
+ .session-card:hover {
668
+ transform: translateY(-1px);
669
+ box-shadow: var(--shadow-hover);
670
+ border-color: var(--accent);
671
+ }
672
+
673
+ .session-card .session-header {
674
+ display: flex;
675
+ align-items: center;
676
+ justify-content: space-between;
677
+ margin-bottom: 6px;
678
+ }
679
+
680
+ .session-card .session-project {
681
+ font-size: 12px;
682
+ font-weight: 600;
683
+ font-family: var(--font-mono);
684
+ color: var(--accent);
685
+ }
686
+
687
+ .session-card .session-date {
688
+ font-size: 11px;
689
+ color: var(--text-dim);
690
+ font-family: var(--font-mono);
691
+ }
692
+
693
+ .session-card .session-meta {
694
+ display: flex;
695
+ gap: 12px;
696
+ margin-bottom: 6px;
697
+ }
698
+
699
+ .session-card .session-meta-item {
700
+ display: flex;
701
+ align-items: center;
702
+ gap: 4px;
703
+ font-size: 11px;
704
+ color: var(--text-muted);
705
+ }
706
+
707
+ .session-card .session-meta-item .material-symbols-outlined {
708
+ font-size: 14px;
709
+ }
710
+
711
+ .session-card .session-preview {
712
+ font-size: 12px;
713
+ color: var(--text-secondary);
714
+ line-height: 1.4;
715
+ overflow: hidden;
716
+ text-overflow: ellipsis;
717
+ white-space: nowrap;
718
+ }
719
+
720
+ /* ── Filter Select ─────────────────────────────────────────────────────── */
721
+ .filter-select {
722
+ height: 32px;
723
+ padding: 0 28px 0 10px;
724
+ font-size: 12px;
725
+ font-family: var(--font-sans);
726
+ color: var(--text);
727
+ background: var(--bg-elevated);
728
+ border: 1px solid var(--border-light);
729
+ border-radius: var(--radius-sm);
730
+ outline: none;
731
+ cursor: pointer;
732
+ appearance: none;
733
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M3 5l3 3 3-3' fill='none' stroke='%235a6b78' stroke-width='1.5'/%3E%3C/svg%3E");
734
+ background-repeat: no-repeat;
735
+ background-position: right 8px center;
736
+ }
737
+
738
+ .filter-select:focus {
739
+ border-color: var(--accent);
740
+ box-shadow: 0 0 0 3px var(--focus-ring);
741
+ }
742
+
743
+ /* ── Side Panel ────────────────────────────────────────────────────────── */
744
+ .side-panel {
745
+ width: 0;
746
+ min-width: 0;
747
+ overflow: hidden;
748
+ background: var(--bg-surface);
749
+ border-left: 1px solid var(--border);
750
+ box-shadow: var(--shadow-panel);
751
+ transition: width var(--transition-slow), min-width var(--transition-slow);
752
+ flex-shrink: 0;
753
+ display: flex;
754
+ flex-direction: column;
755
+ }
756
+
757
+ .side-panel.open {
758
+ width: var(--panel-width);
759
+ min-width: var(--panel-width);
760
+ }
761
+
762
+ .panel-header {
763
+ display: flex;
764
+ align-items: center;
765
+ justify-content: space-between;
766
+ padding: 12px 16px;
767
+ border-bottom: 1px solid var(--border);
768
+ flex-shrink: 0;
769
+ }
770
+
771
+ .panel-title {
772
+ font-size: 14px;
773
+ font-weight: 600;
774
+ color: var(--text);
775
+ overflow: hidden;
776
+ text-overflow: ellipsis;
777
+ white-space: nowrap;
778
+ flex: 1;
779
+ margin-right: 8px;
780
+ }
781
+
782
+ .panel-body {
783
+ flex: 1;
784
+ overflow-y: auto;
785
+ padding: 16px;
786
+ }
787
+
788
+ /* ── Chat Bubbles ──────────────────────────────────────────────────────── */
789
+ .chat-messages {
790
+ display: flex;
791
+ flex-direction: column;
792
+ gap: 12px;
793
+ }
794
+
795
+ .chat-msg {
796
+ max-width: 85%;
797
+ padding: 10px 14px;
798
+ border-radius: var(--radius);
799
+ font-size: 13px;
800
+ line-height: 1.5;
801
+ word-break: break-word;
802
+ }
803
+
804
+ .chat-msg.user {
805
+ align-self: flex-end;
806
+ background: var(--accent);
807
+ color: #ffffff;
808
+ border-bottom-right-radius: 4px;
809
+ }
810
+
811
+ .chat-msg.assistant {
812
+ align-self: flex-start;
813
+ background: var(--bg-elevated);
814
+ color: var(--text);
815
+ border-bottom-left-radius: 4px;
816
+ }
817
+
818
+ .chat-msg.tool {
819
+ align-self: flex-start;
820
+ background: var(--bg-inset);
821
+ color: var(--text-muted);
822
+ font-family: var(--font-mono);
823
+ font-size: 11px;
824
+ border-bottom-left-radius: 4px;
825
+ max-height: 100px;
826
+ overflow: hidden;
827
+ position: relative;
828
+ cursor: pointer;
829
+ }
830
+
831
+ .chat-msg.tool.expanded {
832
+ max-height: none;
833
+ }
834
+
835
+ .chat-msg.tool::after {
836
+ content: 'Click to expand';
837
+ position: absolute;
838
+ bottom: 0;
839
+ left: 0;
840
+ right: 0;
841
+ padding: 4px;
842
+ text-align: center;
843
+ font-size: 10px;
844
+ background: linear-gradient(transparent, var(--bg-inset));
845
+ }
846
+
847
+ .chat-msg.tool.expanded::after {
848
+ display: none;
849
+ }
850
+
851
+ .chat-msg-role {
852
+ font-size: 10px;
853
+ font-weight: 600;
854
+ text-transform: uppercase;
855
+ letter-spacing: 0.3px;
856
+ margin-bottom: 4px;
857
+ opacity: 0.7;
858
+ }
859
+
860
+ .chat-msg-time {
861
+ font-size: 10px;
862
+ opacity: 0.5;
863
+ margin-top: 4px;
864
+ font-family: var(--font-mono);
865
+ }
866
+
867
+ /* ── Markdown / Prose ──────────────────────────────────────────────────── */
868
+ .prose h1, .prose h2, .prose h3 {
869
+ color: var(--text);
870
+ margin: 16px 0 8px;
871
+ line-height: 1.3;
872
+ }
873
+
874
+ .prose h1 { font-size: 20px; font-weight: 700; }
875
+ .prose h2 { font-size: 16px; font-weight: 600; }
876
+ .prose h3 { font-size: 14px; font-weight: 600; }
877
+
878
+ .prose p { margin: 8px 0; }
879
+
880
+ .prose code {
881
+ font-family: var(--font-mono);
882
+ font-size: 12px;
883
+ background: var(--bg-inset);
884
+ padding: 1px 4px;
885
+ border-radius: 4px;
886
+ }
887
+
888
+ .prose pre {
889
+ background: var(--bg-inset);
890
+ padding: 12px;
891
+ border-radius: var(--radius-sm);
892
+ overflow-x: auto;
893
+ margin: 12px 0;
894
+ font-size: 12px;
895
+ line-height: 1.5;
896
+ }
897
+
898
+ .prose pre code {
899
+ background: none;
900
+ padding: 0;
901
+ }
902
+
903
+ .prose a {
904
+ color: var(--accent);
905
+ text-decoration: underline;
906
+ }
907
+
908
+ .prose ul, .prose ol {
909
+ padding-left: 20px;
910
+ margin: 8px 0;
911
+ }
912
+
913
+ .prose li { margin: 2px 0; }
914
+
915
+ .prose blockquote {
916
+ border-left: 3px solid var(--accent);
917
+ margin: 12px 0;
918
+ padding: 4px 12px;
919
+ background: var(--bg-elevated);
920
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
921
+ color: var(--text-secondary);
922
+ }
923
+
924
+ .prose table {
925
+ width: 100%;
926
+ border-collapse: collapse;
927
+ margin: 12px 0;
928
+ font-size: 13px;
929
+ }
930
+
931
+ .prose th, .prose td {
932
+ padding: 6px 10px;
933
+ border: 1px solid var(--border-light);
934
+ text-align: left;
935
+ }
936
+
937
+ .prose th {
938
+ background: var(--bg-elevated);
939
+ font-weight: 600;
940
+ font-size: 11px;
941
+ text-transform: uppercase;
942
+ letter-spacing: 0.3px;
943
+ }
944
+
945
+ .prose hr {
946
+ border: none;
947
+ border-top: 1px solid var(--border-light);
948
+ margin: 16px 0;
949
+ }
950
+
951
+ /* ── Empty State ───────────────────────────────────────────────────────── */
952
+ .empty-state {
953
+ display: flex;
954
+ flex-direction: column;
955
+ align-items: center;
956
+ justify-content: center;
957
+ padding: 48px 24px;
958
+ text-align: center;
959
+ }
960
+
961
+ .empty-state.hidden { display: none; }
962
+
963
+ .empty-icon {
964
+ font-size: 48px;
965
+ color: var(--text-dim);
966
+ margin-bottom: 12px;
967
+ }
968
+
969
+ .empty-text {
970
+ font-size: 15px;
971
+ font-weight: 600;
972
+ color: var(--text-muted);
973
+ margin-bottom: 4px;
974
+ }
975
+
976
+ .empty-hint {
977
+ font-size: 12px;
978
+ color: var(--text-dim);
979
+ }
980
+
981
+ /* ── Loading Overlay ───────────────────────────────────────────────────── */
982
+ .loading-overlay {
983
+ position: fixed;
984
+ inset: 0;
985
+ display: flex;
986
+ flex-direction: column;
987
+ align-items: center;
988
+ justify-content: center;
989
+ background: var(--bg);
990
+ z-index: 100;
991
+ gap: 16px;
992
+ transition: opacity var(--transition-slow);
993
+ }
994
+
995
+ .loading-overlay.hidden {
996
+ opacity: 0;
997
+ pointer-events: none;
998
+ }
999
+
1000
+ .loading-spinner {
1001
+ width: 32px;
1002
+ height: 32px;
1003
+ border: 3px solid var(--border);
1004
+ border-top-color: var(--accent);
1005
+ border-radius: 50%;
1006
+ animation: spin 0.8s linear infinite;
1007
+ }
1008
+
1009
+ .loading-text {
1010
+ font-size: 13px;
1011
+ color: var(--text-muted);
1012
+ }
1013
+
1014
+ /* ── Toast ─────────────────────────────────────────────────────────────── */
1015
+ .toast-container {
1016
+ position: fixed;
1017
+ top: 16px;
1018
+ right: 16px;
1019
+ z-index: 200;
1020
+ display: flex;
1021
+ flex-direction: column;
1022
+ gap: 8px;
1023
+ max-width: 340px;
1024
+ }
1025
+
1026
+ .toast {
1027
+ display: flex;
1028
+ align-items: flex-start;
1029
+ gap: 8px;
1030
+ padding: 10px 14px;
1031
+ background: var(--bg-surface);
1032
+ border: 1px solid var(--border);
1033
+ border-radius: var(--radius-sm);
1034
+ box-shadow: var(--shadow-2);
1035
+ animation: toastIn 0.3s ease;
1036
+ font-size: 13px;
1037
+ color: var(--text);
1038
+ }
1039
+
1040
+ .toast.fade-out {
1041
+ animation: toastOut 0.3s ease forwards;
1042
+ }
1043
+
1044
+ .toast-icon {
1045
+ font-size: 18px;
1046
+ flex-shrink: 0;
1047
+ }
1048
+
1049
+ .toast.success .toast-icon { color: var(--green); }
1050
+ .toast.error .toast-icon { color: var(--red); }
1051
+
1052
+ /* ── Skeleton Loading ──────────────────────────────────────────────────── */
1053
+ .skeleton-line {
1054
+ height: 12px;
1055
+ background: var(--bg-hover);
1056
+ border-radius: 6px;
1057
+ animation: pulse 1.5s ease-in-out infinite;
1058
+ }
1059
+
1060
+ .skeleton-line + .skeleton-line {
1061
+ margin-top: 8px;
1062
+ }
1063
+
1064
+ .skeleton-line.w-75 { width: 75%; }
1065
+ .skeleton-line.w-50 { width: 50%; }
1066
+ .skeleton-line.w-25 { width: 25%; }
1067
+
1068
+ /* ── Animations ────────────────────────────────────────────────────────── */
1069
+ @keyframes spin {
1070
+ to { transform: rotate(360deg); }
1071
+ }
1072
+
1073
+ @keyframes toastIn {
1074
+ from { opacity: 0; transform: translateX(30px); }
1075
+ to { opacity: 1; transform: translateX(0); }
1076
+ }
1077
+
1078
+ @keyframes toastOut {
1079
+ from { opacity: 1; transform: translateX(0); }
1080
+ to { opacity: 0; transform: translateX(30px); }
1081
+ }
1082
+
1083
+ @keyframes pulse {
1084
+ 0%, 100% { opacity: 0.4; }
1085
+ 50% { opacity: 0.8; }
1086
+ }
1087
+
1088
+ @keyframes fadeInUp {
1089
+ from { opacity: 0; transform: translateY(8px); }
1090
+ to { opacity: 1; transform: translateY(0); }
1091
+ }
1092
+
1093
+ /* ── Loading Inline ────────────────────────────────────────────────────── */
1094
+ .loading-inline {
1095
+ display: flex;
1096
+ align-items: center;
1097
+ justify-content: center;
1098
+ gap: 8px;
1099
+ padding: 24px;
1100
+ color: var(--text-muted);
1101
+ font-size: 13px;
1102
+ }
1103
+
1104
+ .loading-spinner.small {
1105
+ width: 18px;
1106
+ height: 18px;
1107
+ border-width: 2px;
1108
+ }
1109
+
1110
+ /* ── Responsive ────────────────────────────────────────────────────────── */
1111
+ @media (max-width: 1024px) {
1112
+ .side-panel.open {
1113
+ position: fixed;
1114
+ right: 0;
1115
+ top: 0;
1116
+ bottom: 0;
1117
+ z-index: 50;
1118
+ }
1119
+ }
1120
+
1121
+ @media (max-width: 768px) {
1122
+ #content { padding: 12px 16px; }
1123
+ .card-grid { grid-template-columns: 1fr; }
1124
+ .tab { padding: 8px 12px; font-size: 12px; }
1125
+ .tab-icon { font-size: 18px; }
1126
+ .side-panel.open { width: 100vw; min-width: 100vw; }
1127
+ .search-controls { flex-direction: column; align-items: stretch; }
1128
+ header { padding: 6px 12px; }
1129
+ .stats { display: none; }
1130
+ }
1131
+
1132
+ @media (max-width: 480px) {
1133
+ .tab { padding: 8px 10px; gap: 4px; }
1134
+ }
1135
+
1136
+ /* ── Reduced Motion ────────────────────────────────────────────────────── */
1137
+ @media (prefers-reduced-motion: reduce) {
1138
+ *, *::before, *::after {
1139
+ animation-duration: 0.01ms !important;
1140
+ transition-duration: 0.01ms !important;
1141
+ }
1142
+ }
1143
+
1144
+ /* ── Focus Visible ─────────────────────────────────────────────────────── */
1145
+ :focus-visible {
1146
+ outline: 2px solid var(--accent);
1147
+ outline-offset: 1px;
1148
+ }
1149
+
1150
+ /* ── Selection ─────────────────────────────────────────────────────────── */
1151
+ ::selection {
1152
+ background: var(--accent-dim);
1153
+ color: var(--text);
1154
+ }