claude-memory-layer 1.0.10 → 1.0.12

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 (142) hide show
  1. package/AGENTS.md +60 -0
  2. package/README.md +166 -2
  3. package/bootstrap-kb/decisions/decisions.md +244 -0
  4. package/bootstrap-kb/glossary/glossary.md +46 -0
  5. package/bootstrap-kb/modules/.claude-plugin.md +22 -0
  6. package/bootstrap-kb/modules/agents.md.md +15 -0
  7. package/bootstrap-kb/modules/claude.md.md +15 -0
  8. package/bootstrap-kb/modules/context.md.md +15 -0
  9. package/bootstrap-kb/modules/docs.md +18 -0
  10. package/bootstrap-kb/modules/handoff.md.md +15 -0
  11. package/bootstrap-kb/modules/package-lock.json.md +15 -0
  12. package/bootstrap-kb/modules/package.json.md +15 -0
  13. package/bootstrap-kb/modules/plan.md.md +15 -0
  14. package/bootstrap-kb/modules/readme.md.md +15 -0
  15. package/bootstrap-kb/modules/scripts.md +26 -0
  16. package/bootstrap-kb/modules/spec.md.md +15 -0
  17. package/bootstrap-kb/modules/specs.md +20 -0
  18. package/bootstrap-kb/modules/src.md +51 -0
  19. package/bootstrap-kb/modules/tests.md +42 -0
  20. package/bootstrap-kb/modules/tsconfig.json.md +15 -0
  21. package/bootstrap-kb/modules/vitest.config.ts.md +15 -0
  22. package/bootstrap-kb/overview/overview.md +40 -0
  23. package/bootstrap-kb/sources/manifest.json +950 -0
  24. package/bootstrap-kb/sources/manifest.md +227 -0
  25. package/bootstrap-kb/timeline/timeline.md +57 -0
  26. package/d.sh +3 -0
  27. package/deploy.sh +3 -0
  28. package/dist/cli/index.js +3577 -389
  29. package/dist/cli/index.js.map +4 -4
  30. package/dist/core/index.js +1383 -138
  31. package/dist/core/index.js.map +4 -4
  32. package/dist/hooks/post-tool-use.js +1917 -214
  33. package/dist/hooks/post-tool-use.js.map +4 -4
  34. package/dist/hooks/session-end.js +1813 -231
  35. package/dist/hooks/session-end.js.map +4 -4
  36. package/dist/hooks/session-start.js +1802 -205
  37. package/dist/hooks/session-start.js.map +4 -4
  38. package/dist/hooks/stop.js +1909 -248
  39. package/dist/hooks/stop.js.map +4 -4
  40. package/dist/hooks/user-prompt-submit.js +1861 -206
  41. package/dist/hooks/user-prompt-submit.js.map +4 -4
  42. package/dist/server/api/index.js +2341 -217
  43. package/dist/server/api/index.js.map +4 -4
  44. package/dist/server/index.js +2350 -226
  45. package/dist/server/index.js.map +4 -4
  46. package/dist/services/memory-service.js +1805 -206
  47. package/dist/services/memory-service.js.map +4 -4
  48. package/dist/ui/app.js +1447 -55
  49. package/dist/ui/index.html +318 -147
  50. package/dist/ui/style.css +892 -0
  51. package/docs/MCP_MEMORY_SERVICE_COMPARATIVE_REVIEW.md +271 -0
  52. package/docs/MEMU_ADOPTION.md +40 -0
  53. package/docs/OPERATIONS.md +18 -0
  54. package/memory/.claude-plugin/commands/2026-02-25.md +263 -0
  55. package/memory/_index.md +405 -0
  56. package/memory/default/uncategorized/2026-02-25.md +4839 -0
  57. package/memory/specs/20260207-dashboard-upgrade/2026-02-25.md +142 -0
  58. package/memory/specs/citations-system/2026-02-25.md +1121 -0
  59. package/memory/specs/endless-mode/2026-02-25.md +1392 -0
  60. package/memory/specs/entity-edge-model/2026-02-25.md +1263 -0
  61. package/memory/specs/evidence-aligner-v2/2026-02-25.md +1028 -0
  62. package/memory/specs/mcp-desktop-integration/2026-02-25.md +1334 -0
  63. package/memory/specs/post-tool-use-hook/2026-02-25.md +1164 -0
  64. package/memory/specs/private-tags/2026-02-25.md +1057 -0
  65. package/memory/specs/progressive-disclosure/2026-02-25.md +1436 -0
  66. package/memory/specs/task-entity-system/2026-02-25.md +924 -0
  67. package/memory/specs/vector-outbox-v2/2026-02-25.md +1510 -0
  68. package/memory/specs/web-viewer-ui/2026-02-25.md +1709 -0
  69. package/package.json +9 -2
  70. package/scripts/build.ts +6 -0
  71. package/scripts/fix-sync-gap.js +32 -0
  72. package/scripts/heartbeat-memory-orchestrator.sh +28 -0
  73. package/scripts/report-sync-gap.js +26 -0
  74. package/scripts/review-queue-auto-resolve.js +21 -0
  75. package/scripts/sync-gap-auto-heal.sh +17 -0
  76. package/specs/20260207-dashboard-upgrade/context.md +38 -0
  77. package/specs/20260207-dashboard-upgrade/spec.md +96 -0
  78. package/src/cli/index.ts +391 -60
  79. package/src/core/consolidated-store.ts +63 -1
  80. package/src/core/consolidation-worker.ts +115 -6
  81. package/src/core/event-store.ts +14 -0
  82. package/src/core/index.ts +1 -0
  83. package/src/core/ingest-interceptor.ts +80 -0
  84. package/src/core/markdown-mirror.ts +70 -0
  85. package/src/core/md-mirror.ts +92 -0
  86. package/src/core/mongo-sync-config.ts +165 -0
  87. package/src/core/mongo-sync-worker.ts +381 -0
  88. package/src/core/retriever.ts +540 -150
  89. package/src/core/sqlite-event-store.ts +794 -7
  90. package/src/core/sqlite-wrapper.ts +8 -0
  91. package/src/core/tag-taxonomy.ts +51 -0
  92. package/src/core/turn-state.ts +159 -0
  93. package/src/core/types.ts +51 -8
  94. package/src/core/vector-store.ts +21 -3
  95. package/src/hooks/post-tool-use.ts +68 -23
  96. package/src/hooks/session-end.ts +8 -3
  97. package/src/hooks/stop.ts +96 -25
  98. package/src/hooks/user-prompt-submit.ts +44 -5
  99. package/src/server/api/chat.ts +244 -0
  100. package/src/server/api/citations.ts +3 -3
  101. package/src/server/api/events.ts +30 -5
  102. package/src/server/api/health.ts +53 -0
  103. package/src/server/api/index.ts +9 -1
  104. package/src/server/api/projects.ts +74 -0
  105. package/src/server/api/search.ts +3 -3
  106. package/src/server/api/sessions.ts +3 -3
  107. package/src/server/api/stats.ts +89 -8
  108. package/src/server/api/turns.ts +143 -0
  109. package/src/server/api/utils.ts +46 -0
  110. package/src/services/bootstrap-organizer.ts +443 -0
  111. package/src/services/codex-session-history-importer.ts +474 -0
  112. package/src/services/memory-service.ts +508 -71
  113. package/src/services/session-history-importer.ts +215 -51
  114. package/src/ui/app.js +1447 -55
  115. package/src/ui/index.html +318 -147
  116. package/src/ui/style.css +892 -0
  117. package/tests/bootstrap-organizer.test.ts +111 -0
  118. package/tests/consolidation-worker.test.ts +75 -0
  119. package/tests/ingest-interceptor.test.ts +38 -0
  120. package/tests/markdown-mirror.test.ts +85 -0
  121. package/tests/md-mirror.test.ts +50 -0
  122. package/tests/retriever-fallback-chain.test.ts +223 -0
  123. package/tests/retriever-strategy-scope.test.ts +97 -0
  124. package/tests/retriever.memu-adoption.test.ts +122 -0
  125. package/tests/sqlite-event-store-replication.test.ts +92 -0
  126. package/.claude/settings.local.json +0 -27
  127. package/.claude-memory/test.sqlite +0 -0
  128. package/.history/package_20260201112328.json +0 -45
  129. package/.history/package_20260201113602.json +0 -45
  130. package/.history/package_20260201113713.json +0 -45
  131. package/.history/package_20260201114110.json +0 -45
  132. package/.history/package_20260201114632.json +0 -46
  133. package/.history/package_20260201133143.json +0 -45
  134. package/.history/package_20260201134319.json +0 -45
  135. package/.history/package_20260201134326.json +0 -45
  136. package/.history/package_20260201134334.json +0 -45
  137. package/.history/package_20260201134912.json +0 -45
  138. package/.history/package_20260201142928.json +0 -46
  139. package/.history/package_20260201192048.json +0 -47
  140. package/.history/package_20260202114053.json +0 -49
  141. package/.history/package_20260202121115.json +0 -49
  142. package/test_access.js +0 -49
package/dist/ui/style.css CHANGED
@@ -110,6 +110,57 @@ body {
110
110
  -webkit-text-fill-color: transparent;
111
111
  }
112
112
 
113
+ .project-selector {
114
+ margin-bottom: 24px;
115
+ padding: 0 8px;
116
+ }
117
+
118
+ .project-label {
119
+ display: flex;
120
+ align-items: center;
121
+ gap: 6px;
122
+ font-size: 11px;
123
+ font-weight: 500;
124
+ color: var(--text-muted);
125
+ text-transform: uppercase;
126
+ letter-spacing: 0.5px;
127
+ margin-bottom: 8px;
128
+ }
129
+
130
+ .project-dropdown {
131
+ width: 100%;
132
+ padding: 10px 12px;
133
+ background: var(--bg-card);
134
+ color: var(--text-primary);
135
+ border: 1px solid var(--border-subtle);
136
+ border-radius: 8px;
137
+ font-family: 'Outfit', sans-serif;
138
+ font-size: 13px;
139
+ cursor: pointer;
140
+ appearance: none;
141
+ -webkit-appearance: none;
142
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%238B9BB4' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
143
+ background-repeat: no-repeat;
144
+ background-position: right 12px center;
145
+ transition: border-color 0.2s, box-shadow 0.2s;
146
+ }
147
+
148
+ .project-dropdown:hover {
149
+ border-color: var(--accent-primary);
150
+ }
151
+
152
+ .project-dropdown:focus {
153
+ outline: none;
154
+ border-color: var(--accent-primary);
155
+ box-shadow: 0 0 0 3px var(--accent-glow);
156
+ }
157
+
158
+ .project-dropdown option {
159
+ background: var(--bg-panel);
160
+ color: var(--text-primary);
161
+ padding: 8px;
162
+ }
163
+
113
164
  .nav-menu {
114
165
  list-style: none;
115
166
  display: flex;
@@ -493,6 +544,97 @@ body {
493
544
  color: var(--accent-secondary);
494
545
  }
495
546
 
547
+ /* Sort Controls */
548
+ .sort-controls {
549
+ display: flex;
550
+ align-items: center;
551
+ gap: 6px;
552
+ padding: 8px 16px;
553
+ border-bottom: 1px solid rgba(255,255,255,0.05);
554
+ }
555
+ .sort-label {
556
+ font-size: 11px;
557
+ color: var(--text-muted);
558
+ text-transform: uppercase;
559
+ letter-spacing: 0.5px;
560
+ margin-right: 4px;
561
+ }
562
+ .sort-btn {
563
+ font-size: 12px;
564
+ padding: 4px 10px;
565
+ border-radius: 6px;
566
+ border: 1px solid rgba(255,255,255,0.08);
567
+ background: transparent;
568
+ color: var(--text-secondary);
569
+ cursor: pointer;
570
+ transition: all 0.2s;
571
+ font-family: inherit;
572
+ }
573
+ .sort-btn:hover {
574
+ border-color: var(--accent-primary);
575
+ color: var(--text-primary);
576
+ }
577
+ .sort-btn.active {
578
+ background: rgba(123, 97, 255, 0.15);
579
+ border-color: var(--accent-primary);
580
+ color: var(--accent-primary);
581
+ font-weight: 600;
582
+ }
583
+
584
+ /* Access Badge */
585
+ .access-badge {
586
+ font-size: 11px;
587
+ padding: 3px 8px;
588
+ border-radius: 6px;
589
+ background: rgba(0, 240, 255, 0.1);
590
+ color: var(--accent-secondary);
591
+ display: flex;
592
+ align-items: center;
593
+ gap: 4px;
594
+ font-weight: 600;
595
+ }
596
+
597
+ /* Section Label */
598
+ .section-label {
599
+ font-size: 12px;
600
+ color: var(--text-secondary);
601
+ margin-bottom: 12px;
602
+ text-transform: uppercase;
603
+ letter-spacing: 1px;
604
+ font-weight: 600;
605
+ }
606
+
607
+ /* Graduation Bar */
608
+ .grad-bar-row {
609
+ display: flex;
610
+ align-items: center;
611
+ gap: 10px;
612
+ margin-bottom: 8px;
613
+ }
614
+ .grad-bar-label {
615
+ width: 24px;
616
+ font-size: 12px;
617
+ font-weight: 600;
618
+ }
619
+ .grad-bar-track {
620
+ flex: 1;
621
+ height: 6px;
622
+ background: rgba(255,255,255,0.05);
623
+ border-radius: 3px;
624
+ overflow: hidden;
625
+ }
626
+ .grad-bar-fill {
627
+ height: 100%;
628
+ border-radius: 3px;
629
+ transition: width 0.5s;
630
+ }
631
+ .grad-bar-value {
632
+ font-size: 12px;
633
+ color: var(--text-secondary);
634
+ min-width: 70px;
635
+ text-align: right;
636
+ }
637
+
496
638
  /* Endless Mode */
497
639
  .endless-card {
498
640
  background: linear-gradient(135deg, rgba(16, 16, 24, 0.6) 0%, rgba(20, 20, 30, 0.6) 100%);
@@ -593,3 +735,753 @@ body {
593
735
  justify-content: space-between;
594
736
  }
595
737
  }
738
+
739
+ /* ==========================================
740
+ Page Views
741
+ ========================================== */
742
+ .page-view {
743
+ display: none;
744
+ }
745
+ .page-view.active {
746
+ display: block;
747
+ animation: viewFadeIn 0.25s ease;
748
+ }
749
+ @keyframes viewFadeIn {
750
+ from { opacity: 0; transform: translateY(8px); }
751
+ to { opacity: 1; transform: translateY(0); }
752
+ }
753
+
754
+ /* Stat Card Clickable */
755
+ .stat-card[data-stat] {
756
+ cursor: pointer;
757
+ }
758
+ .stat-card[data-stat]:active {
759
+ transform: translateY(0) scale(0.98);
760
+ }
761
+
762
+ /* ==========================================
763
+ Modal System
764
+ ========================================== */
765
+ .modal-overlay {
766
+ position: fixed;
767
+ inset: 0;
768
+ z-index: 1000;
769
+ background: rgba(0, 0, 0, 0.7);
770
+ backdrop-filter: blur(4px);
771
+ display: flex;
772
+ align-items: center;
773
+ justify-content: center;
774
+ animation: modalOverlayIn 0.2s ease;
775
+ }
776
+ @keyframes modalOverlayIn {
777
+ from { opacity: 0; }
778
+ to { opacity: 1; }
779
+ }
780
+
781
+ .modal-container {
782
+ background: var(--bg-panel);
783
+ border: var(--glass-border);
784
+ border-radius: 16px;
785
+ width: 90%;
786
+ max-width: 640px;
787
+ max-height: 85vh;
788
+ display: flex;
789
+ flex-direction: column;
790
+ box-shadow: 0 24px 64px rgba(0, 0, 0, 0.5);
791
+ animation: modalSlideIn 0.25s ease;
792
+ }
793
+ .modal-container.modal-lg {
794
+ max-width: 900px;
795
+ }
796
+ @keyframes modalSlideIn {
797
+ from { opacity: 0; transform: translateY(16px) scale(0.97); }
798
+ to { opacity: 1; transform: translateY(0) scale(1); }
799
+ }
800
+
801
+ .modal-header {
802
+ display: flex;
803
+ align-items: center;
804
+ justify-content: space-between;
805
+ padding: 20px 24px;
806
+ border-bottom: 1px solid var(--border-subtle);
807
+ flex-shrink: 0;
808
+ }
809
+ .modal-title {
810
+ font-size: 18px;
811
+ font-weight: 600;
812
+ display: flex;
813
+ align-items: center;
814
+ gap: 10px;
815
+ }
816
+ .modal-close-btn {
817
+ width: 36px;
818
+ height: 36px;
819
+ border: none;
820
+ background: rgba(255, 255, 255, 0.05);
821
+ color: var(--text-secondary);
822
+ border-radius: 8px;
823
+ cursor: pointer;
824
+ display: flex;
825
+ align-items: center;
826
+ justify-content: center;
827
+ font-size: 18px;
828
+ transition: all 0.2s;
829
+ }
830
+ .modal-close-btn:hover {
831
+ background: rgba(255, 255, 255, 0.1);
832
+ color: var(--text-primary);
833
+ }
834
+ .modal-body {
835
+ padding: 24px;
836
+ overflow-y: auto;
837
+ flex: 1;
838
+ min-height: 0;
839
+ }
840
+
841
+ /* Modal Content Styles */
842
+ .modal-meta {
843
+ display: flex;
844
+ gap: 12px;
845
+ flex-wrap: wrap;
846
+ margin-bottom: 20px;
847
+ }
848
+ .modal-meta-item {
849
+ display: flex;
850
+ align-items: center;
851
+ gap: 6px;
852
+ font-size: 13px;
853
+ color: var(--text-secondary);
854
+ padding: 6px 12px;
855
+ background: rgba(255, 255, 255, 0.03);
856
+ border-radius: 8px;
857
+ border: 1px solid var(--border-subtle);
858
+ }
859
+ .modal-meta-item i {
860
+ color: var(--accent-primary);
861
+ font-size: 14px;
862
+ }
863
+ .modal-content-block {
864
+ background: var(--bg-dark);
865
+ border: 1px solid var(--border-subtle);
866
+ border-radius: 10px;
867
+ padding: 20px;
868
+ font-size: 14px;
869
+ line-height: 1.7;
870
+ color: var(--text-secondary);
871
+ white-space: pre-wrap;
872
+ word-break: break-word;
873
+ max-height: 400px;
874
+ overflow-y: auto;
875
+ }
876
+ .modal-section-title {
877
+ font-size: 13px;
878
+ font-weight: 600;
879
+ color: var(--text-secondary);
880
+ text-transform: uppercase;
881
+ letter-spacing: 0.5px;
882
+ margin: 24px 0 12px;
883
+ }
884
+ .modal-context-list {
885
+ display: flex;
886
+ flex-direction: column;
887
+ gap: 8px;
888
+ }
889
+ .modal-context-item {
890
+ display: flex;
891
+ align-items: flex-start;
892
+ gap: 10px;
893
+ padding: 12px;
894
+ background: rgba(255, 255, 255, 0.02);
895
+ border-radius: 8px;
896
+ border: 1px solid transparent;
897
+ cursor: pointer;
898
+ transition: all 0.2s;
899
+ }
900
+ .modal-context-item:hover {
901
+ background: rgba(255, 255, 255, 0.04);
902
+ border-color: var(--border-subtle);
903
+ }
904
+
905
+ /* List Modal Items */
906
+ .modal-list-item {
907
+ display: flex;
908
+ align-items: center;
909
+ justify-content: space-between;
910
+ padding: 16px;
911
+ background: rgba(255, 255, 255, 0.02);
912
+ border-radius: 10px;
913
+ border: 1px solid transparent;
914
+ margin-bottom: 8px;
915
+ cursor: pointer;
916
+ transition: all 0.2s;
917
+ }
918
+ .modal-list-item:hover {
919
+ background: rgba(255, 255, 255, 0.04);
920
+ border-color: var(--border-subtle);
921
+ }
922
+ .modal-list-info {
923
+ flex: 1;
924
+ min-width: 0;
925
+ }
926
+ .modal-list-info .title {
927
+ font-size: 14px;
928
+ font-weight: 500;
929
+ color: var(--text-primary);
930
+ margin-bottom: 4px;
931
+ }
932
+ .modal-list-info .subtitle {
933
+ font-size: 12px;
934
+ color: var(--text-muted);
935
+ }
936
+ .modal-list-badge {
937
+ font-size: 13px;
938
+ font-weight: 600;
939
+ padding: 6px 12px;
940
+ border-radius: 8px;
941
+ background: rgba(123, 97, 255, 0.1);
942
+ color: var(--accent-primary);
943
+ white-space: nowrap;
944
+ margin-left: 12px;
945
+ }
946
+ .modal-list-empty {
947
+ text-align: center;
948
+ padding: 40px;
949
+ color: var(--text-muted);
950
+ font-size: 14px;
951
+ }
952
+
953
+ /* ==========================================
954
+ Knowledge Graph View
955
+ ========================================== */
956
+ .kg-grid {
957
+ display: grid;
958
+ grid-template-columns: 1fr 1fr;
959
+ gap: 24px;
960
+ }
961
+ .kg-memory-card {
962
+ background: var(--bg-card);
963
+ border: var(--glass-border);
964
+ border-radius: 12px;
965
+ padding: 20px;
966
+ cursor: pointer;
967
+ transition: all 0.2s;
968
+ }
969
+ .kg-memory-card:hover {
970
+ transform: translateY(-2px);
971
+ border-color: var(--accent-primary);
972
+ box-shadow: 0 8px 24px rgba(123, 97, 255, 0.1);
973
+ }
974
+ .kg-memory-rank {
975
+ font-size: 12px;
976
+ font-weight: 700;
977
+ color: var(--accent-primary);
978
+ margin-bottom: 8px;
979
+ }
980
+ .kg-memory-summary {
981
+ font-size: 14px;
982
+ color: var(--text-secondary);
983
+ line-height: 1.5;
984
+ margin-bottom: 12px;
985
+ display: -webkit-box;
986
+ -webkit-line-clamp: 3;
987
+ -webkit-box-orient: vertical;
988
+ overflow: hidden;
989
+ }
990
+ .kg-memory-meta {
991
+ display: flex;
992
+ gap: 12px;
993
+ font-size: 12px;
994
+ color: var(--text-muted);
995
+ }
996
+ .kg-memory-meta span {
997
+ display: flex;
998
+ align-items: center;
999
+ gap: 4px;
1000
+ }
1001
+ .kg-topic-list {
1002
+ display: flex;
1003
+ flex-wrap: wrap;
1004
+ gap: 8px;
1005
+ margin-bottom: 12px;
1006
+ }
1007
+ .kg-topic-tag {
1008
+ font-size: 11px;
1009
+ padding: 4px 10px;
1010
+ border-radius: 6px;
1011
+ background: rgba(0, 240, 255, 0.1);
1012
+ color: var(--accent-secondary);
1013
+ font-weight: 500;
1014
+ }
1015
+
1016
+ /* ==========================================
1017
+ Memory Banks View
1018
+ ========================================== */
1019
+ .mb-level-tabs {
1020
+ display: flex;
1021
+ gap: 8px;
1022
+ margin-bottom: 24px;
1023
+ }
1024
+ .mb-level-tab {
1025
+ padding: 10px 20px;
1026
+ border-radius: 10px;
1027
+ border: 1px solid var(--border-subtle);
1028
+ background: transparent;
1029
+ color: var(--text-secondary);
1030
+ font-family: inherit;
1031
+ font-size: 14px;
1032
+ font-weight: 500;
1033
+ cursor: pointer;
1034
+ transition: all 0.2s;
1035
+ }
1036
+ .mb-level-tab:hover {
1037
+ border-color: var(--accent-primary);
1038
+ color: var(--text-primary);
1039
+ }
1040
+ .mb-level-tab.active {
1041
+ background: rgba(123, 97, 255, 0.1);
1042
+ border-color: var(--accent-primary);
1043
+ color: var(--accent-primary);
1044
+ font-weight: 600;
1045
+ }
1046
+ .mb-level-tab .tab-count {
1047
+ font-size: 11px;
1048
+ opacity: 0.7;
1049
+ margin-left: 6px;
1050
+ }
1051
+ .mb-event-list {
1052
+ display: flex;
1053
+ flex-direction: column;
1054
+ gap: 10px;
1055
+ }
1056
+ .mb-event-card {
1057
+ background: var(--bg-card);
1058
+ border: var(--glass-border);
1059
+ border-radius: 12px;
1060
+ padding: 16px 20px;
1061
+ cursor: pointer;
1062
+ transition: all 0.2s;
1063
+ }
1064
+ .mb-event-card:hover {
1065
+ border-color: var(--accent-primary);
1066
+ background: rgba(255, 255, 255, 0.03);
1067
+ }
1068
+ .mb-event-header {
1069
+ display: flex;
1070
+ justify-content: space-between;
1071
+ align-items: center;
1072
+ margin-bottom: 8px;
1073
+ }
1074
+ .mb-event-content {
1075
+ font-size: 14px;
1076
+ color: var(--text-secondary);
1077
+ line-height: 1.5;
1078
+ display: -webkit-box;
1079
+ -webkit-line-clamp: 2;
1080
+ -webkit-box-orient: vertical;
1081
+ overflow: hidden;
1082
+ }
1083
+
1084
+ /* ==========================================
1085
+ Configuration View
1086
+ ========================================== */
1087
+ .cfg-grid {
1088
+ display: grid;
1089
+ grid-template-columns: 1fr 1fr;
1090
+ gap: 24px;
1091
+ }
1092
+ .cfg-section {
1093
+ background: var(--bg-card);
1094
+ border: var(--glass-border);
1095
+ border-radius: 16px;
1096
+ padding: 24px;
1097
+ }
1098
+ .cfg-section-title {
1099
+ font-size: 16px;
1100
+ font-weight: 600;
1101
+ margin-bottom: 20px;
1102
+ display: flex;
1103
+ align-items: center;
1104
+ gap: 10px;
1105
+ }
1106
+ .cfg-section-title i {
1107
+ color: var(--accent-primary);
1108
+ }
1109
+ .cfg-row {
1110
+ display: flex;
1111
+ justify-content: space-between;
1112
+ align-items: center;
1113
+ padding: 12px 0;
1114
+ border-bottom: 1px solid var(--border-subtle);
1115
+ }
1116
+ .cfg-row:last-child {
1117
+ border-bottom: none;
1118
+ }
1119
+ .cfg-row-label {
1120
+ font-size: 14px;
1121
+ color: var(--text-secondary);
1122
+ }
1123
+ .cfg-row-value {
1124
+ font-size: 14px;
1125
+ font-weight: 600;
1126
+ color: var(--text-primary);
1127
+ font-family: monospace;
1128
+ }
1129
+
1130
+ /* Modal responsive */
1131
+ @media (max-width: 768px) {
1132
+ .modal-container {
1133
+ width: 95%;
1134
+ max-height: 90vh;
1135
+ }
1136
+ .modal-container.modal-lg {
1137
+ max-width: 95%;
1138
+ }
1139
+ .kg-grid {
1140
+ grid-template-columns: 1fr;
1141
+ }
1142
+ .cfg-grid {
1143
+ grid-template-columns: 1fr;
1144
+ }
1145
+ }
1146
+
1147
+ /* ==========================================
1148
+ Chat Panel
1149
+ ========================================== */
1150
+ .chat-panel {
1151
+ position: fixed;
1152
+ top: 0;
1153
+ right: 0;
1154
+ width: min(800px, 50vw);
1155
+ height: 100vh;
1156
+ background: var(--bg-panel);
1157
+ border-left: var(--glass-border);
1158
+ box-shadow: -8px 0 32px rgba(0, 0, 0, 0.3);
1159
+ z-index: 500;
1160
+ display: flex;
1161
+ flex-direction: column;
1162
+ transform: translateX(100%);
1163
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1164
+ }
1165
+ .chat-panel.open {
1166
+ transform: translateX(0);
1167
+ }
1168
+
1169
+ .chat-header {
1170
+ display: flex;
1171
+ align-items: center;
1172
+ justify-content: space-between;
1173
+ padding: 16px 20px;
1174
+ border-bottom: 1px solid var(--border-subtle);
1175
+ flex-shrink: 0;
1176
+ }
1177
+ .chat-title {
1178
+ font-size: 16px;
1179
+ font-weight: 600;
1180
+ display: flex;
1181
+ align-items: center;
1182
+ gap: 8px;
1183
+ }
1184
+ .chat-title i {
1185
+ color: var(--accent-primary);
1186
+ font-size: 20px;
1187
+ }
1188
+
1189
+ .chat-messages {
1190
+ flex: 1;
1191
+ overflow-y: auto;
1192
+ padding: 20px;
1193
+ display: flex;
1194
+ flex-direction: column;
1195
+ gap: 16px;
1196
+ }
1197
+
1198
+ /* Welcome */
1199
+ .chat-welcome {
1200
+ text-align: center;
1201
+ padding: 40px 20px;
1202
+ color: var(--text-muted);
1203
+ }
1204
+ .chat-welcome-icon { font-size: 48px; margin-bottom: 16px; }
1205
+ .chat-welcome-title { font-size: 16px; font-weight: 600; color: var(--text-secondary); margin-bottom: 8px; }
1206
+ .chat-welcome-text { font-size: 13px; line-height: 1.6; }
1207
+
1208
+ /* Message bubbles */
1209
+ .chat-msg {
1210
+ max-width: 85%;
1211
+ padding: 12px 16px;
1212
+ border-radius: 12px;
1213
+ font-size: 14px;
1214
+ line-height: 1.6;
1215
+ word-break: break-word;
1216
+ }
1217
+ .chat-msg.user {
1218
+ align-self: flex-end;
1219
+ background: rgba(123, 97, 255, 0.15);
1220
+ border: 1px solid rgba(123, 97, 255, 0.2);
1221
+ color: var(--text-primary);
1222
+ }
1223
+ .chat-msg.assistant {
1224
+ align-self: flex-start;
1225
+ background: rgba(255, 255, 255, 0.03);
1226
+ border: 1px solid var(--border-subtle);
1227
+ color: var(--text-secondary);
1228
+ }
1229
+
1230
+ /* Markdown in assistant messages */
1231
+ .chat-msg.assistant code {
1232
+ background: rgba(0, 0, 0, 0.3);
1233
+ padding: 2px 6px;
1234
+ border-radius: 4px;
1235
+ font-size: 13px;
1236
+ font-family: monospace;
1237
+ }
1238
+ .chat-msg.assistant pre {
1239
+ background: var(--bg-dark);
1240
+ border: 1px solid var(--border-subtle);
1241
+ border-radius: 8px;
1242
+ padding: 12px;
1243
+ overflow-x: auto;
1244
+ margin: 8px 0;
1245
+ }
1246
+ .chat-msg.assistant pre code {
1247
+ background: none;
1248
+ padding: 0;
1249
+ }
1250
+ .chat-msg.assistant strong { color: var(--text-primary); }
1251
+ .chat-msg.assistant em { color: var(--accent-secondary); }
1252
+
1253
+ /* Streaming cursor */
1254
+ .chat-msg.streaming::after {
1255
+ content: '\25CA';
1256
+ animation: blink 1s step-end infinite;
1257
+ color: var(--accent-primary);
1258
+ margin-left: 2px;
1259
+ }
1260
+ @keyframes blink { 50% { opacity: 0; } }
1261
+
1262
+ /* Loading dots */
1263
+ .chat-loading {
1264
+ align-self: flex-start;
1265
+ display: flex;
1266
+ gap: 6px;
1267
+ padding: 16px;
1268
+ }
1269
+ .chat-loading-dot {
1270
+ width: 8px;
1271
+ height: 8px;
1272
+ border-radius: 50%;
1273
+ background: var(--text-muted);
1274
+ animation: chatBounce 1.4s ease-in-out infinite;
1275
+ }
1276
+ .chat-loading-dot:nth-child(2) { animation-delay: 0.2s; }
1277
+ .chat-loading-dot:nth-child(3) { animation-delay: 0.4s; }
1278
+ @keyframes chatBounce {
1279
+ 0%, 80%, 100% { transform: scale(0.6); opacity: 0.4; }
1280
+ 40% { transform: scale(1); opacity: 1; }
1281
+ }
1282
+
1283
+ /* Input area */
1284
+ .chat-input-area {
1285
+ padding: 16px 20px;
1286
+ border-top: 1px solid var(--border-subtle);
1287
+ flex-shrink: 0;
1288
+ }
1289
+ .chat-input-wrapper {
1290
+ display: flex;
1291
+ gap: 8px;
1292
+ align-items: flex-end;
1293
+ }
1294
+ .chat-input {
1295
+ flex: 1;
1296
+ resize: none;
1297
+ padding: 12px 16px;
1298
+ background: var(--bg-card);
1299
+ border: 1px solid var(--border-subtle);
1300
+ border-radius: 12px;
1301
+ color: var(--text-primary);
1302
+ font-family: 'Outfit', sans-serif;
1303
+ font-size: 14px;
1304
+ line-height: 1.4;
1305
+ max-height: 120px;
1306
+ overflow-y: auto;
1307
+ transition: border-color 0.2s;
1308
+ }
1309
+ .chat-input:focus {
1310
+ outline: none;
1311
+ border-color: var(--accent-primary);
1312
+ box-shadow: 0 0 0 2px rgba(123, 97, 255, 0.1);
1313
+ }
1314
+ .chat-input::placeholder { color: var(--text-muted); }
1315
+
1316
+ .chat-send-btn {
1317
+ width: 44px;
1318
+ height: 44px;
1319
+ border-radius: 12px;
1320
+ border: none;
1321
+ background: var(--accent-primary);
1322
+ color: white;
1323
+ font-size: 18px;
1324
+ cursor: pointer;
1325
+ display: flex;
1326
+ align-items: center;
1327
+ justify-content: center;
1328
+ transition: all 0.2s;
1329
+ flex-shrink: 0;
1330
+ }
1331
+ .chat-send-btn:hover:not(:disabled) {
1332
+ background: #6343E0;
1333
+ transform: scale(1.05);
1334
+ }
1335
+ .chat-send-btn:disabled {
1336
+ opacity: 0.4;
1337
+ cursor: not-allowed;
1338
+ }
1339
+
1340
+ .chat-input-hint {
1341
+ font-size: 11px;
1342
+ color: var(--text-muted);
1343
+ margin-top: 8px;
1344
+ padding: 0 4px;
1345
+ }
1346
+
1347
+ /* Sidebar chat toggle */
1348
+ .sidebar-bottom {
1349
+ margin-top: auto;
1350
+ padding-top: 24px;
1351
+ }
1352
+ .chat-toggle-btn {
1353
+ display: flex;
1354
+ align-items: center;
1355
+ gap: 12px;
1356
+ width: 100%;
1357
+ padding: 14px 16px;
1358
+ border-radius: 12px;
1359
+ border: 1px solid rgba(123, 97, 255, 0.2);
1360
+ background: rgba(123, 97, 255, 0.05);
1361
+ color: var(--accent-primary);
1362
+ font-family: 'Outfit', sans-serif;
1363
+ font-size: 14px;
1364
+ font-weight: 600;
1365
+ cursor: pointer;
1366
+ transition: all 0.2s;
1367
+ }
1368
+ .chat-toggle-btn:hover {
1369
+ background: rgba(123, 97, 255, 0.15);
1370
+ border-color: var(--accent-primary);
1371
+ }
1372
+ .chat-toggle-btn i { font-size: 1.2rem; }
1373
+
1374
+ /* Chat history list */
1375
+ .chat-history-view {
1376
+ flex: 1;
1377
+ overflow-y: auto;
1378
+ padding: 16px 20px;
1379
+ display: none;
1380
+ flex-direction: column;
1381
+ gap: 8px;
1382
+ }
1383
+ .chat-history-view.active {
1384
+ display: flex;
1385
+ }
1386
+ .chat-messages.hidden {
1387
+ display: none;
1388
+ }
1389
+ .chat-history-item {
1390
+ padding: 12px 16px;
1391
+ background: var(--bg-card);
1392
+ border: 1px solid var(--border-subtle);
1393
+ border-radius: 10px;
1394
+ cursor: pointer;
1395
+ transition: all 0.2s;
1396
+ }
1397
+ .chat-history-item:hover {
1398
+ border-color: var(--accent-primary);
1399
+ background: rgba(123, 97, 255, 0.05);
1400
+ }
1401
+ .chat-history-item-title {
1402
+ font-size: 14px;
1403
+ font-weight: 500;
1404
+ color: var(--text-primary);
1405
+ white-space: nowrap;
1406
+ overflow: hidden;
1407
+ text-overflow: ellipsis;
1408
+ }
1409
+ .chat-history-item-meta {
1410
+ display: flex;
1411
+ justify-content: space-between;
1412
+ align-items: center;
1413
+ margin-top: 6px;
1414
+ font-size: 12px;
1415
+ color: var(--text-muted);
1416
+ }
1417
+ .chat-history-item-delete {
1418
+ background: none;
1419
+ border: none;
1420
+ color: var(--text-muted);
1421
+ cursor: pointer;
1422
+ padding: 2px 6px;
1423
+ border-radius: 4px;
1424
+ font-size: 14px;
1425
+ transition: all 0.2s;
1426
+ }
1427
+ .chat-history-item-delete:hover {
1428
+ color: var(--error);
1429
+ background: rgba(255, 69, 96, 0.1);
1430
+ }
1431
+ .chat-history-empty {
1432
+ text-align: center;
1433
+ padding: 40px 20px;
1434
+ color: var(--text-muted);
1435
+ font-size: 13px;
1436
+ }
1437
+
1438
+ /* Chat header tabs */
1439
+ .chat-header-tabs {
1440
+ display: flex;
1441
+ gap: 4px;
1442
+ }
1443
+ .chat-header-tab {
1444
+ padding: 6px 14px;
1445
+ border-radius: 8px;
1446
+ border: 1px solid var(--border-subtle);
1447
+ background: transparent;
1448
+ color: var(--text-muted);
1449
+ font-family: 'Outfit', sans-serif;
1450
+ font-size: 13px;
1451
+ font-weight: 500;
1452
+ cursor: pointer;
1453
+ transition: all 0.2s;
1454
+ }
1455
+ .chat-header-tab.active {
1456
+ background: rgba(123, 97, 255, 0.1);
1457
+ border-color: var(--accent-primary);
1458
+ color: var(--accent-primary);
1459
+ }
1460
+ .chat-header-tab:hover:not(.active) {
1461
+ border-color: var(--text-muted);
1462
+ color: var(--text-secondary);
1463
+ }
1464
+
1465
+ /* New chat button */
1466
+ .chat-new-btn {
1467
+ background: none;
1468
+ border: 1px solid var(--border-subtle);
1469
+ color: var(--text-muted);
1470
+ cursor: pointer;
1471
+ padding: 6px 10px;
1472
+ border-radius: 8px;
1473
+ font-size: 16px;
1474
+ transition: all 0.2s;
1475
+ display: flex;
1476
+ align-items: center;
1477
+ justify-content: center;
1478
+ }
1479
+ .chat-new-btn:hover {
1480
+ color: var(--accent-secondary);
1481
+ border-color: var(--accent-secondary);
1482
+ }
1483
+
1484
+ /* Chat responsive */
1485
+ @media (max-width: 768px) {
1486
+ .chat-panel { width: 100%; }
1487
+ }