clay-server 2.31.0 → 2.32.0-beta.1

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 (74) hide show
  1. package/lib/browser-mcp-server.js +32 -44
  2. package/lib/debate-mcp-server.js +14 -31
  3. package/lib/mcp-local.js +31 -1
  4. package/lib/project-connection.js +4 -2
  5. package/lib/project-filesystem.js +47 -1
  6. package/lib/project-http.js +75 -8
  7. package/lib/project-mcp.js +4 -0
  8. package/lib/project-sessions.js +88 -51
  9. package/lib/project-user-message.js +12 -7
  10. package/lib/project.js +204 -90
  11. package/lib/public/app.js +123 -448
  12. package/lib/public/codex-avatar.png +0 -0
  13. package/lib/public/css/debate.css +3 -2
  14. package/lib/public/css/filebrowser.css +91 -1
  15. package/lib/public/css/icon-strip.css +21 -5
  16. package/lib/public/css/input.css +181 -100
  17. package/lib/public/css/mates.css +43 -0
  18. package/lib/public/css/mention.css +48 -4
  19. package/lib/public/css/menus.css +1 -1
  20. package/lib/public/css/messages.css +2 -0
  21. package/lib/public/css/notifications-center.css +19 -0
  22. package/lib/public/index.html +46 -24
  23. package/lib/public/modules/app-connection.js +138 -37
  24. package/lib/public/modules/app-cursors.js +18 -17
  25. package/lib/public/modules/app-debate-ui.js +9 -9
  26. package/lib/public/modules/app-dm.js +170 -131
  27. package/lib/public/modules/app-favicon.js +28 -26
  28. package/lib/public/modules/app-header.js +79 -68
  29. package/lib/public/modules/app-home-hub.js +55 -47
  30. package/lib/public/modules/app-loop-ui.js +34 -18
  31. package/lib/public/modules/app-loop-wizard.js +6 -6
  32. package/lib/public/modules/app-messages.js +195 -152
  33. package/lib/public/modules/app-misc.js +23 -12
  34. package/lib/public/modules/app-notifications.js +91 -3
  35. package/lib/public/modules/app-panels.js +203 -49
  36. package/lib/public/modules/app-projects.js +159 -150
  37. package/lib/public/modules/app-rate-limit.js +5 -4
  38. package/lib/public/modules/app-rendering.js +149 -101
  39. package/lib/public/modules/app-skills-install.js +4 -4
  40. package/lib/public/modules/context-sources.js +12 -41
  41. package/lib/public/modules/dom-refs.js +21 -0
  42. package/lib/public/modules/filebrowser.js +173 -2
  43. package/lib/public/modules/input.js +86 -0
  44. package/lib/public/modules/mate-sidebar.js +38 -0
  45. package/lib/public/modules/mention.js +24 -6
  46. package/lib/public/modules/scheduler.js +1 -1
  47. package/lib/public/modules/sidebar-mates.js +66 -34
  48. package/lib/public/modules/sidebar-mobile.js +34 -30
  49. package/lib/public/modules/sidebar-projects.js +60 -57
  50. package/lib/public/modules/sidebar-sessions.js +75 -69
  51. package/lib/public/modules/sidebar.js +12 -20
  52. package/lib/public/modules/skills.js +8 -9
  53. package/lib/public/modules/sticky-notes.js +1 -2
  54. package/lib/public/modules/store.js +9 -2
  55. package/lib/public/modules/stt.js +4 -1
  56. package/lib/public/modules/tools.js +14 -9
  57. package/lib/sdk-bridge.js +511 -1113
  58. package/lib/sdk-message-processor.js +123 -134
  59. package/lib/sdk-worker.js +4 -0
  60. package/lib/server-dm.js +1 -0
  61. package/lib/server.js +86 -1
  62. package/lib/sessions.js +47 -36
  63. package/lib/ws-schema.js +2 -0
  64. package/lib/yoke/adapters/claude-worker.js +559 -0
  65. package/lib/yoke/adapters/claude.js +1418 -0
  66. package/lib/yoke/adapters/codex.js +968 -0
  67. package/lib/yoke/adapters/gemini.js +668 -0
  68. package/lib/yoke/codex-app-server.js +307 -0
  69. package/lib/yoke/index.js +199 -0
  70. package/lib/yoke/instructions.js +62 -0
  71. package/lib/yoke/interface.js +92 -0
  72. package/lib/yoke/mcp-bridge-server.js +294 -0
  73. package/lib/yoke/package.json +7 -0
  74. package/package.json +3 -1
Binary file
@@ -2,10 +2,11 @@
2
2
  .debate-floor-mode #schedule-btn,
3
3
  .debate-floor-mode #ask-mate-btn,
4
4
  .debate-floor-mode #config-chip-wrap,
5
- .debate-floor-mode #context-sources-bar,
5
+ .debate-floor-mode #context-sources-btn-wrap,
6
6
  .debate-floor-mode #mention-menu,
7
7
  .debate-floor-mode #slash-menu,
8
- .debate-floor-mode #suggestion-chips {
8
+ .debate-floor-mode #suggestion-chips,
9
+ .debate-floor-mode #ghost-suggestion {
9
10
  display: none !important;
10
11
  }
11
12
 
@@ -92,7 +92,97 @@
92
92
  background: var(--filebrowser-bg);
93
93
  border: 1px solid var(--filebrowser-border);
94
94
  border-radius: 8px;
95
- margin: 0 6px 12px;
95
+ margin: 6px 6px 12px;
96
+ display: flex;
97
+ flex-direction: column;
98
+ }
99
+ #sidebar-panel-files.hidden { display: none; }
100
+
101
+ /* --- File browser titlebar --- */
102
+ .fb-titlebar {
103
+ display: flex;
104
+ align-items: center;
105
+ justify-content: space-between;
106
+ padding: 6px 6px;
107
+ border-bottom: 1px solid var(--filebrowser-border);
108
+ flex-shrink: 0;
109
+ user-select: none;
110
+ }
111
+ .fb-titlebar-title {
112
+ font-size: 12px;
113
+ font-weight: 600;
114
+ color: var(--text-secondary);
115
+ flex: 1;
116
+ text-align: center;
117
+ pointer-events: none;
118
+ }
119
+ .fb-titlebar button {
120
+ display: flex;
121
+ align-items: center;
122
+ justify-content: center;
123
+ width: 24px;
124
+ height: 24px;
125
+ border-radius: 6px;
126
+ border: none;
127
+ background: transparent;
128
+ color: var(--text-dimmer);
129
+ cursor: pointer;
130
+ padding: 0;
131
+ transition: color 0.15s, background 0.15s;
132
+ }
133
+ .fb-titlebar button .lucide { width: 13px; height: 13px; }
134
+ .fb-titlebar button:hover { color: var(--text); background: var(--sidebar-hover); }
135
+
136
+ /* --- File search bar (always visible) --- */
137
+ .fb-search-bar {
138
+ display: flex;
139
+ align-items: center;
140
+ padding: 4px 6px 6px;
141
+ position: relative;
142
+ flex-shrink: 0;
143
+ }
144
+ .fb-search-icon {
145
+ position: absolute;
146
+ left: 14px;
147
+ width: 13px;
148
+ height: 13px;
149
+ color: var(--text-dimmer);
150
+ pointer-events: none;
151
+ }
152
+ #fb-search-input {
153
+ width: 100%;
154
+ height: 28px;
155
+ padding: 0 8px 0 28px;
156
+ border: 1px solid var(--border);
157
+ border-radius: 6px;
158
+ background: var(--bg);
159
+ color: var(--text);
160
+ font-family: inherit;
161
+ font-size: 12px;
162
+ outline: none;
163
+ transition: border-color 0.15s;
164
+ }
165
+ #fb-search-input:focus { border-color: var(--accent); }
166
+ #fb-search-input::placeholder { color: var(--text-dimmer); }
167
+
168
+ /* Search match highlight */
169
+ .file-tree-name mark {
170
+ background: color-mix(in srgb, var(--accent) 30%, transparent);
171
+ color: inherit;
172
+ border-radius: 2px;
173
+ padding: 0 1px;
174
+ }
175
+ .fb-search-empty {
176
+ padding: 16px 12px;
177
+ font-size: 12px;
178
+ color: var(--text-dimmer);
179
+ text-align: center;
180
+ }
181
+
182
+ #file-tree {
183
+ flex: 1;
184
+ overflow-y: auto;
185
+ min-height: 0;
96
186
  }
97
187
 
98
188
  #sidebar-panel-files.fb-enter { animation: fb-in 0.2s ease-out both; }
@@ -222,16 +222,32 @@
222
222
  animation: permShake 2s ease-in-out infinite;
223
223
  }
224
224
 
225
- /* Mate status dot (bottom-right, matching user online dot) */
225
+ /* Mate status dot (top-left) */
226
226
  .icon-strip-mate .icon-strip-status {
227
- top: auto;
228
- left: auto;
229
- bottom: 5px;
230
- right: 5px;
227
+ top: 3px;
228
+ left: 3px;
229
+ bottom: auto;
230
+ right: auto;
231
231
  border-color: var(--sidebar-bg);
232
232
  z-index: 3;
233
233
  }
234
234
 
235
+ /* Mate vendor badge (bottom-right) */
236
+ .icon-strip-mate .icon-strip-vendor-badge {
237
+ position: absolute;
238
+ bottom: 3px;
239
+ right: 3px;
240
+ width: 14px;
241
+ height: 14px;
242
+ border-radius: 50%;
243
+ border: 1.5px solid var(--sidebar-bg);
244
+ background: #fff;
245
+ object-fit: cover;
246
+ object-position: center;
247
+ z-index: 3;
248
+ pointer-events: none;
249
+ }
250
+
235
251
  .icon-strip-mate.active .icon-strip-status {
236
252
  opacity: 1;
237
253
  background: var(--success);
@@ -275,44 +275,53 @@
275
275
  Context Sources — chips above input
276
276
  ========================================================================== */
277
277
 
278
- #context-sources-bar {
278
+ /* --- Context Sources (button in toolbar, chips in input-row) --- */
279
+
280
+ #context-sources-btn-wrap {
281
+ position: relative;
279
282
  display: flex;
280
283
  align-items: center;
281
- flex-wrap: wrap;
282
- gap: 4px;
283
- padding: 0 8px 4px;
284
- position: relative;
285
284
  }
286
285
 
287
286
  #context-sources-add {
288
287
  display: inline-flex;
289
288
  align-items: center;
290
- gap: 6px;
291
- padding: 6px 12px;
292
- border-radius: 6px;
293
- border: 1px dashed var(--border);
289
+ gap: 3px;
290
+ height: 36px;
291
+ padding: 0 10px;
292
+ border-radius: 18px;
293
+ border: none;
294
294
  background: transparent;
295
- color: var(--text-dimmer);
295
+ color: var(--text-muted);
296
296
  font-family: inherit;
297
297
  font-size: 12px;
298
298
  font-weight: 500;
299
299
  cursor: pointer;
300
- transition: color 0.15s, border-color 0.15s, background 0.15s;
300
+ transition: background 0.15s, color 0.15s;
301
+ white-space: nowrap;
301
302
  }
302
303
 
303
- #context-sources-add .lucide { width: 12px; height: 12px; }
304
+ #context-sources-add .lucide { width: 20px; height: 20px; flex-shrink: 0; }
304
305
 
305
306
  #context-sources-add:hover {
306
- color: var(--text-secondary);
307
- border-color: var(--text-dimmer);
308
- background: var(--sidebar-hover);
307
+ background: rgba(var(--overlay-rgb), 0.06);
308
+ color: var(--text);
309
309
  }
310
310
 
311
- #context-sources-chips {
312
- display: flex;
311
+ /* Badge count when sources are active */
312
+ #context-sources-add .ctx-badge {
313
+ display: inline-flex;
313
314
  align-items: center;
314
- flex-wrap: wrap;
315
- gap: 4px;
315
+ justify-content: center;
316
+ min-width: 16px;
317
+ height: 16px;
318
+ padding: 0 4px;
319
+ border-radius: 8px;
320
+ background: #3b82f6;
321
+ color: #fff;
322
+ font-size: 10px;
323
+ font-weight: 700;
324
+ line-height: 1;
316
325
  }
317
326
 
318
327
  .context-chip {
@@ -371,9 +380,9 @@
371
380
 
372
381
  #context-sources-picker {
373
382
  position: absolute;
374
- bottom: calc(100% + 4px);
383
+ bottom: calc(100% + 8px);
375
384
  left: 0;
376
- min-width: 200px;
385
+ min-width: 220px;
377
386
  max-height: 320px;
378
387
  overflow-y: auto;
379
388
  background: var(--sidebar-bg);
@@ -705,6 +714,10 @@
705
714
  box-shadow: 0 0 0 1px var(--border);
706
715
  }
707
716
 
717
+ #input-textarea-wrap {
718
+ position: relative;
719
+ }
720
+
708
721
  #input {
709
722
  width: 100%;
710
723
  background: transparent;
@@ -741,6 +754,68 @@
741
754
  gap: 4px;
742
755
  }
743
756
 
757
+ /* --- Vendor toggle (split toggle) --- */
758
+ #vendor-toggle-wrap {
759
+ display: flex;
760
+ align-items: center;
761
+ border: 1px solid var(--border);
762
+ border-radius: 8px;
763
+ overflow: hidden;
764
+ height: 30px;
765
+ flex-shrink: 0;
766
+ }
767
+ #vendor-toggle-wrap.hidden { display: none; }
768
+ #vendor-toggle-wrap.locked {
769
+ border: none;
770
+ height: auto;
771
+ pointer-events: none;
772
+ }
773
+ #vendor-toggle-wrap.locked .vendor-toggle-btn:not(.active) { display: none; }
774
+ #vendor-toggle-wrap.locked .vendor-toggle-btn.active {
775
+ background: transparent;
776
+ padding: 0;
777
+ gap: 0;
778
+ opacity: 0.7;
779
+ }
780
+ #vendor-toggle-wrap.locked .vendor-toggle-btn.active .vendor-toggle-label { display: none; }
781
+ #vendor-toggle-wrap.locked .vendor-toggle-btn:first-child { border-right: none; }
782
+ .vendor-toggle-btn {
783
+ display: flex;
784
+ align-items: center;
785
+ gap: 4px;
786
+ padding: 0 10px;
787
+ height: 100%;
788
+ border: none;
789
+ background: transparent;
790
+ cursor: pointer;
791
+ font-size: 12px;
792
+ color: var(--text-secondary);
793
+ transition: background 0.15s, color 0.15s;
794
+ white-space: nowrap;
795
+ }
796
+ .vendor-toggle-btn:first-child { border-right: 1px solid var(--border); }
797
+ .vendor-toggle-btn.active {
798
+ background: var(--accent-12);
799
+ color: var(--accent);
800
+ font-weight: 600;
801
+ }
802
+ .vendor-toggle-btn.disabled {
803
+ opacity: 0.35;
804
+ cursor: default;
805
+ }
806
+ .vendor-toggle-icon {
807
+ width: 16px;
808
+ height: 16px;
809
+ border-radius: 4px;
810
+ object-fit: cover;
811
+ }
812
+ .vendor-toggle-label {
813
+ pointer-events: none;
814
+ }
815
+ @media (max-width: 600px) {
816
+ .vendor-toggle-label { display: none; }
817
+ }
818
+
744
819
  /* --- Attach buttons & menu --- */
745
820
  #attach-wrap {
746
821
  position: relative;
@@ -776,62 +851,54 @@
776
851
  #schedule-btn:hover { background: rgba(var(--overlay-rgb), 0.06); color: var(--text); }
777
852
 
778
853
  #ask-mate-btn {
779
- height: 28px;
780
- padding: 0 10px;
781
- border-radius: 10px;
782
- border: 1px solid transparent;
783
- background:
784
- linear-gradient(var(--ask-mate-bg, var(--bg)), var(--ask-mate-bg, var(--bg))) padding-box,
785
- linear-gradient(135deg, #4ecdc4 0%, #4ecdc4 25%, #556bf7, #a855f7, #f857a6, #ff6b6b) border-box;
786
- color: transparent;
854
+ width: 36px;
855
+ height: 36px;
856
+ padding: 0;
857
+ border-radius: 50%;
858
+ border: none;
859
+ background: transparent;
860
+ color: var(--text-muted);
787
861
  cursor: pointer;
788
862
  display: flex;
789
863
  align-items: center;
790
- gap: 5px;
791
- font-family: 'Nunito', sans-serif;
792
- font-size: 13px;
793
- font-weight: 800;
794
- letter-spacing: 0.2px;
795
- transition: transform 0.1s, box-shadow 0.3s, border-color 0.3s;
864
+ justify-content: center;
865
+ transition: background 0.15s, color 0.15s;
796
866
  touch-action: manipulation;
797
867
  position: relative;
798
- overflow: hidden;
799
- z-index: 0;
800
868
  }
801
- #ask-mate-btn::before {
802
- content: "";
869
+
870
+ #ask-mate-btn .lucide { width: 20px; height: 20px; flex-shrink: 0; }
871
+
872
+ #ask-mate-btn:hover { background: rgba(var(--overlay-rgb), 0.06); color: var(--text); }
873
+ #ask-mate-btn:active { transform: scale(0.95); }
874
+
875
+ /* Mate avatar overlay on @ button */
876
+ .ask-mate-avatar {
803
877
  position: absolute;
804
- inset: 0;
805
- background: linear-gradient(135deg, #4ecdc4 0%, #4ecdc4 32%, #556bf7 34%, #556bf7 50%, #a855f7 52%, #a855f7 68%, #f857a6 70%, #f857a6 84%, #ff6b6b 86%, #ff6b6b 100%);
806
- border-radius: inherit;
807
- opacity: 0;
808
- transform: scale(0.3);
809
- transition: opacity 0.3s ease, transform 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
810
- z-index: -1;
811
- }
812
- .ask-mate-label {
813
- white-space: nowrap;
814
- background: linear-gradient(135deg, #4ecdc4 0%, #4ecdc4 25%, #556bf7, #a855f7, #f857a6, #ff6b6b);
815
- -webkit-background-clip: text;
816
- background-clip: text;
817
- -webkit-text-fill-color: transparent;
818
- transition: opacity 0.2s;
878
+ bottom: 0;
879
+ right: -2px;
880
+ width: 20px;
881
+ height: 20px;
882
+ border-radius: 50%;
883
+ border: 1.5px solid var(--input-bg);
884
+ pointer-events: none;
885
+ opacity: 0.55;
886
+ transition: opacity 0.3s, transform 0.3s;
819
887
  }
820
- #ask-mate-btn:hover::before {
821
- opacity: 1;
822
- transform: scale(1);
888
+
889
+ #ask-mate-btn:hover .ask-mate-avatar {
890
+ opacity: 0.85;
823
891
  }
824
- #ask-mate-btn:hover {
825
- border-color: transparent;
826
- background: transparent;
827
- transform: translateY(-1px);
828
- box-shadow: 0 2px 12px rgba(148, 130, 247, 0.4);
892
+
893
+ .ask-mate-avatar.fade-out {
894
+ opacity: 0;
895
+ transform: scale(0.6);
829
896
  }
830
- #ask-mate-btn:hover .ask-mate-label {
831
- background: none;
832
- -webkit-text-fill-color: #fff;
897
+
898
+ .ask-mate-avatar.fade-in {
899
+ opacity: 0.55;
900
+ transform: scale(1);
833
901
  }
834
- #ask-mate-btn:active { transform: translateY(-1px) scale(0.95); }
835
902
 
836
903
  #send-btn {
837
904
  flex-shrink: 0;
@@ -918,52 +985,66 @@
918
985
  }
919
986
 
920
987
  /* ==========================================================================
921
- Prompt Suggestion Chips
988
+ Prompt Suggestion Chips (legacy, hidden)
922
989
  ========================================================================== */
923
990
 
924
- #suggestion-chips {
925
- display: flex;
926
- flex-wrap: wrap;
927
- gap: 4px;
928
- padding: 4px 6px;
991
+ #suggestion-chips { display: none; }
992
+
993
+ /* ==========================================================================
994
+ Ghost Suggestion (inline prompt recommendation)
995
+ ========================================================================== */
996
+
997
+ #ghost-suggestion {
998
+ position: absolute;
999
+ top: 0;
1000
+ left: 0;
1001
+ right: 0;
1002
+ padding: 8px 10px 4px;
1003
+ font-size: 16px;
1004
+ font-family: inherit;
1005
+ line-height: 1.4;
1006
+ color: var(--text-muted);
1007
+ pointer-events: none;
1008
+ white-space: pre-wrap;
1009
+ overflow: hidden;
1010
+ max-height: 120px;
1011
+ box-sizing: border-box;
929
1012
  }
930
1013
 
931
- #suggestion-chips.hidden { display: none; }
1014
+ #ghost-suggestion.hidden { display: none; }
932
1015
 
933
- .suggestion-chip {
934
- display: inline-flex;
935
- align-items: center;
936
- gap: 5px;
937
- padding: 4px 10px 4px 8px;
938
- border-radius: 6px;
1016
+ /* Hide native placeholder when ghost suggestion is visible */
1017
+ #input-textarea-wrap:has(#ghost-suggestion:not(.hidden)) #input::placeholder {
1018
+ color: transparent;
1019
+ }
1020
+
1021
+ /* Ghost hint — inline "Enter to send" after suggestion text */
1022
+
1023
+ .ghost-hint {
1024
+ font-size: 11px;
1025
+ margin-left: 8px;
1026
+ opacity: 0.55;
1027
+ white-space: nowrap;
1028
+ }
1029
+
1030
+ .ghost-hint kbd {
1031
+ display: inline-block;
1032
+ padding: 1px 5px;
1033
+ border-radius: 3px;
939
1034
  border: 1px solid var(--border);
940
1035
  background: rgba(var(--overlay-rgb), 0.08);
941
- color: var(--text-secondary);
942
- font-size: 12px;
943
1036
  font-family: inherit;
944
- cursor: pointer;
945
- transition: border-color 0.15s, background 0.15s, color 0.15s;
946
- text-align: left;
947
- max-width: 100%;
948
- line-height: 1.2;
949
- }
950
-
951
- .suggestion-chip:hover {
952
- border-color: var(--accent);
953
- background: var(--accent-bg);
954
- color: var(--accent);
1037
+ font-size: 10px;
1038
+ line-height: 1.4;
955
1039
  }
956
1040
 
957
- .suggestion-chip .lucide {
958
- width: 12px;
959
- height: 12px;
960
- flex-shrink: 0;
961
- color: var(--accent);
1041
+ @keyframes ghost-fade-in {
1042
+ from { opacity: 0; }
1043
+ to { opacity: 1; }
962
1044
  }
963
1045
 
964
- .suggestion-chip-text {
965
- flex: 1;
966
- min-width: 0;
1046
+ #ghost-suggestion:not(.hidden) {
1047
+ animation: ghost-fade-in 0.3s ease;
967
1048
  }
968
1049
 
969
1050
  /* ==========================================================================
@@ -616,6 +616,49 @@
616
616
  font-weight: 600;
617
617
  }
618
618
 
619
+ /* Vendor toggle in mate header (split pill) */
620
+ .mate-vendor-toggle {
621
+ display: flex;
622
+ align-items: center;
623
+ border: 1px solid rgba(255,255,255,0.4);
624
+ border-radius: 6px;
625
+ overflow: hidden;
626
+ height: 24px;
627
+ }
628
+ .mate-vendor-btn {
629
+ display: flex;
630
+ align-items: center;
631
+ gap: 3px;
632
+ padding: 0 6px;
633
+ height: 100%;
634
+ border: none;
635
+ background: transparent;
636
+ cursor: pointer;
637
+ font-size: 11px;
638
+ color: rgba(255,255,255,0.5);
639
+ transition: background 0.15s, color 0.15s;
640
+ white-space: nowrap;
641
+ }
642
+ .mate-vendor-btn:first-child { border-right: 1px solid rgba(255,255,255,0.4); }
643
+ .mate-vendor-btn.active {
644
+ background: rgba(255,255,255,0.25);
645
+ color: #fff;
646
+ font-weight: 600;
647
+ }
648
+ .mate-vendor-btn.disabled {
649
+ opacity: 0.3;
650
+ cursor: default;
651
+ }
652
+ .mate-vendor-icon {
653
+ width: 14px;
654
+ height: 14px;
655
+ border-radius: 3px;
656
+ background: #fff;
657
+ }
658
+ .mate-vendor-label {
659
+ pointer-events: none;
660
+ }
661
+
619
662
  /* Collapse button inside mate header: white to match header style */
620
663
  .mate-sidebar-header .sidebar-collapse-btn {
621
664
  color: rgba(255,255,255,0.7);
@@ -8,18 +8,44 @@
8
8
  bottom: 100%;
9
9
  left: 0;
10
10
  right: 0;
11
- max-height: 240px;
11
+ max-height: 280px;
12
12
  overflow-y: auto;
13
- background: var(--bg-alt);
13
+ background: var(--sidebar-bg);
14
14
  border: 1px solid var(--border);
15
- border-radius: 14px;
15
+ border-radius: 10px;
16
16
  margin-bottom: 8px;
17
- box-shadow: 0 -4px 24px rgba(var(--shadow-rgb), 0.4);
17
+ box-shadow: 0 4px 12px rgba(var(--shadow-rgb), 0.15);
18
18
  z-index: 10;
19
19
  }
20
20
 
21
21
  #mention-menu.visible { display: block; }
22
22
 
23
+ .mention-hint {
24
+ position: sticky;
25
+ top: 0;
26
+ padding: 8px 16px;
27
+ font-size: 12px;
28
+ color: var(--text-muted);
29
+ background: var(--sidebar-bg);
30
+ border-bottom: 1px solid var(--border-subtle);
31
+ z-index: 1;
32
+ display: flex;
33
+ align-items: center;
34
+ justify-content: space-between;
35
+ }
36
+ .mention-close-btn {
37
+ border: none;
38
+ background: none;
39
+ color: var(--text-dimmer);
40
+ font-size: 16px;
41
+ cursor: pointer;
42
+ padding: 0 2px;
43
+ line-height: 1;
44
+ }
45
+ .mention-close-btn:hover {
46
+ color: var(--text-secondary);
47
+ }
48
+
23
49
  .mention-item {
24
50
  display: flex;
25
51
  align-items: center;
@@ -36,12 +62,30 @@
36
62
  background: rgba(var(--overlay-rgb), 0.05);
37
63
  }
38
64
 
65
+ .mention-item-avatar-wrap {
66
+ position: relative;
67
+ width: 24px;
68
+ height: 24px;
69
+ flex-shrink: 0;
70
+ }
39
71
  .mention-item-avatar {
40
72
  width: 24px;
41
73
  height: 24px;
42
74
  border-radius: 50%;
43
75
  flex-shrink: 0;
44
76
  }
77
+ .mention-item-vendor-badge {
78
+ position: absolute;
79
+ bottom: -2px;
80
+ right: -2px;
81
+ width: 12px;
82
+ height: 12px;
83
+ border-radius: 50%;
84
+ border: 1.5px solid var(--sidebar-bg);
85
+ background: #fff;
86
+ object-fit: cover;
87
+ object-position: center;
88
+ }
45
89
 
46
90
  .mention-item-info {
47
91
  flex: 1;
@@ -493,7 +493,7 @@
493
493
  border-radius: 12px;
494
494
  padding: 4px 0;
495
495
  min-width: 220px;
496
- max-height: 420px;
496
+ max-height: min(600px, calc(100vh - 120px));
497
497
  overflow-y: auto;
498
498
  box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.4);
499
499
  z-index: 200;
@@ -1688,6 +1688,7 @@ pre.mermaid-error {
1688
1688
  /* DM mode: hide project-specific UI elements */
1689
1689
  #main-column.dm-mode .msg-group,
1690
1690
  #main-column.dm-mode #suggestion-chips,
1691
+ #main-column.dm-mode #ghost-suggestion,
1691
1692
  #main-column.dm-mode .tool-group {
1692
1693
  display: none;
1693
1694
  }
@@ -1696,6 +1697,7 @@ pre.mermaid-error {
1696
1697
  #main-column.dm-mode #stt-btn,
1697
1698
  #main-column.dm-mode #config-chip-wrap,
1698
1699
  #main-column.dm-mode #context-mini,
1700
+ #main-column.dm-mode #context-sources-btn-wrap,
1699
1701
  #main-column.dm-mode #slash-menu {
1700
1702
  display: none !important;
1701
1703
  }
@@ -180,6 +180,25 @@
180
180
  }
181
181
  .notif-banner-close .lucide { width: 12px; height: 12px; }
182
182
 
183
+ /* Update available banner */
184
+ .notif-banner-update .notif-banner-icon {
185
+ background: none;
186
+ }
187
+ .notif-banner-update-now {
188
+ padding: 4px 10px;
189
+ border-radius: 6px;
190
+ font-size: 11px;
191
+ font-weight: 600;
192
+ font-family: inherit;
193
+ cursor: pointer;
194
+ border: none;
195
+ background: var(--accent, #6c5ce7);
196
+ color: #fff;
197
+ transition: opacity 0.15s;
198
+ }
199
+ .notif-banner-update-now:hover { opacity: 0.85; }
200
+ .notif-banner-update-now:disabled { opacity: 0.6; cursor: default; }
201
+
183
202
  /* ========================================================
184
203
  Mobile
185
204
  ======================================================== */