clay-server 5.0.2-beta.1 → 5.1.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/LICENSES/README.md +4 -0
  2. package/LICENSES/dicebear-avatars.md +16 -0
  3. package/lib/daemon-project-access.js +7 -1
  4. package/lib/daemon.js +2 -0
  5. package/lib/dicebear-avatar.js +62 -0
  6. package/lib/knowledge-db-service.js +175 -0
  7. package/lib/knowledge-db-validation.js +0 -0
  8. package/lib/knowledge-document-index.js +49 -0
  9. package/lib/knowledge-draft-store.js +56 -0
  10. package/lib/knowledge-file-store.js +199 -0
  11. package/lib/knowledge-markdown.js +128 -0
  12. package/lib/mate-knowledge-mcp-server.js +29 -6
  13. package/lib/mate-knowledge-service.js +23 -2
  14. package/lib/mate-knowledge-sync.js +36 -21
  15. package/lib/mate-workspace-color.js +4 -0
  16. package/lib/mates.js +18 -0
  17. package/lib/project-connection.js +36 -2
  18. package/lib/project-debate-proposal.js +6 -0
  19. package/lib/project-debate-workspace.js +43 -0
  20. package/lib/project-debate.js +1 -0
  21. package/lib/project-file-path.js +2 -3
  22. package/lib/project-knowledge.js +315 -136
  23. package/lib/project-mate-creation-proposal.js +1 -0
  24. package/lib/project-request-access.js +13 -1
  25. package/lib/project-sessions.js +39 -2
  26. package/lib/project-user-knowledge.js +60 -0
  27. package/lib/project.js +59 -18
  28. package/lib/public/app.js +73 -34
  29. package/lib/public/clay-studio-wordmark-bold.svg +20 -0
  30. package/lib/public/css/clay-workspace.css +105 -0
  31. package/lib/public/css/debates-workbench.css +47 -0
  32. package/lib/public/css/filebrowser.css +10 -0
  33. package/lib/public/css/home-debate-live.css +26 -0
  34. package/lib/public/css/home-hub.css +3 -1
  35. package/lib/public/css/home-mate-model-picker.css +15 -131
  36. package/lib/public/css/home-mate-settings.css +168 -16
  37. package/lib/public/css/icon-strip.css +249 -32
  38. package/lib/public/css/mate-conversation.css +176 -0
  39. package/lib/public/css/mate-knowledge-workbench.css +118 -0
  40. package/lib/public/css/mate-workspace-color.css +16 -0
  41. package/lib/public/css/mates.css +28 -28
  42. package/lib/public/css/messages.css +1 -114
  43. package/lib/public/css/mobile-nav.css +16 -16
  44. package/lib/public/css/overlays.css +8 -0
  45. package/lib/public/css/project-logs.css +7 -0
  46. package/lib/public/css/project-mate-creation.css +105 -0
  47. package/lib/public/css/right-workbench.css +3 -3
  48. package/lib/public/css/session-folders.css +80 -21
  49. package/lib/public/css/sidebar.css +183 -107
  50. package/lib/public/css/title-bar.css +151 -0
  51. package/lib/public/css/worker-delegation.css +47 -0
  52. package/lib/public/css/worker-proposal.css +72 -150
  53. package/lib/public/css/you.css +74 -0
  54. package/lib/public/index.html +33 -101
  55. package/lib/public/modules/account-island.js +230 -0
  56. package/lib/public/modules/app-cursors.js +19 -43
  57. package/lib/public/modules/app-debate-ui.js +4 -3
  58. package/lib/public/modules/app-header.js +106 -0
  59. package/lib/public/modules/app-message-router.js +12 -3
  60. package/lib/public/modules/app-messages.js +34 -9
  61. package/lib/public/modules/app-notifications.js +4 -7
  62. package/lib/public/modules/app-projects.js +5 -38
  63. package/lib/public/modules/app-rendering.js +12 -13
  64. package/lib/public/modules/avatar.js +25 -9
  65. package/lib/public/modules/chat-render-runtime.js +16 -4
  66. package/lib/public/modules/command-palette.js +2 -15
  67. package/lib/public/modules/cursor-sharing-preference.js +3 -3
  68. package/lib/public/modules/debate-controls.js +299 -0
  69. package/lib/public/modules/debate.js +2 -0
  70. package/lib/public/modules/debates-workbench.js +339 -0
  71. package/lib/public/modules/default-ai.js +81 -65
  72. package/lib/public/modules/filebrowser.js +28 -8
  73. package/lib/public/modules/home-debate-controls.js +18 -289
  74. package/lib/public/modules/home-mate-avatar-editor.js +228 -0
  75. package/lib/public/modules/home-mate-color-picker.js +66 -0
  76. package/lib/public/modules/home-mate-creation.js +1 -1
  77. package/lib/public/modules/home-mate-instructions.js +90 -0
  78. package/lib/public/modules/home-mate-model-picker.js +80 -271
  79. package/lib/public/modules/home-mate-profile-editor.js +72 -0
  80. package/lib/public/modules/home-mate-settings.js +118 -125
  81. package/lib/public/modules/home-shell.js +3 -0
  82. package/lib/public/modules/home-surface-boot.js +1 -9
  83. package/lib/public/modules/html-preview.js +19 -0
  84. package/lib/public/modules/icon-strip-tooltip.js +95 -0
  85. package/lib/public/modules/knowledge-db-edit-state.js +35 -0
  86. package/lib/public/modules/knowledge-db-workbench.js +234 -0
  87. package/lib/public/modules/knowledge-history-state.js +55 -0
  88. package/lib/public/modules/knowledge-markdown-editor.js +57 -0
  89. package/lib/public/modules/knowledge-preview-links.js +70 -0
  90. package/lib/public/modules/knowledge-workbench-shell.js +21 -0
  91. package/lib/public/modules/mate-knowledge-workbench-state.js +174 -0
  92. package/lib/public/modules/mate-knowledge-workbench.js +500 -0
  93. package/lib/public/modules/mate-knowledge.js +11 -3
  94. package/lib/public/modules/mate-management.js +54 -10
  95. package/lib/public/modules/mate-sidebar.js +11 -1
  96. package/lib/public/modules/mate-workspace-color.js +33 -0
  97. package/lib/public/modules/mention.js +5 -13
  98. package/lib/public/modules/profile.js +51 -18
  99. package/lib/public/modules/project-chat-identity.js +79 -0
  100. package/lib/public/modules/project-debate-planning-workspace.js +250 -0
  101. package/lib/public/modules/project-debate-workspace.js +185 -0
  102. package/lib/public/modules/project-header-identity.js +127 -0
  103. package/lib/public/modules/project-logs-render.js +9 -4
  104. package/lib/public/modules/project-mate-creation-workspace.js +414 -0
  105. package/lib/public/modules/project-mate-navigation.js +238 -0
  106. package/lib/public/modules/project-session-navigation.js +29 -0
  107. package/lib/public/modules/project-switcher.js +6 -8
  108. package/lib/public/modules/projects-hub-view.js +5 -6
  109. package/lib/public/modules/projects-hub.js +2 -6
  110. package/lib/public/modules/qrcode.js +27 -8
  111. package/lib/public/modules/search-clay-chat.js +8 -11
  112. package/lib/public/modules/session-activity-tooltip.js +12 -0
  113. package/lib/public/modules/session-create-form.js +86 -14
  114. package/lib/public/modules/session-create.js +50 -7
  115. package/lib/public/modules/session-list-visibility.js +41 -0
  116. package/lib/public/modules/session-presence-ui.js +4 -1
  117. package/lib/public/modules/session-title-marquee.js +51 -0
  118. package/lib/public/modules/sidebar-mates.js +3 -50
  119. package/lib/public/modules/sidebar-mobile.js +63 -60
  120. package/lib/public/modules/sidebar-projects.js +84 -97
  121. package/lib/public/modules/sidebar-session-folders-ui.js +2 -2
  122. package/lib/public/modules/sidebar-session-hierarchy.js +149 -70
  123. package/lib/public/modules/sidebar-sessions.js +49 -50
  124. package/lib/public/modules/sidebar.js +11 -13
  125. package/lib/public/modules/thinking-lifecycle.js +7 -6
  126. package/lib/public/modules/tool-palette-order.js +4 -3
  127. package/lib/public/modules/tool-palette.js +13 -3
  128. package/lib/public/modules/tools.js +22 -22
  129. package/lib/public/modules/worker-proposal.js +42 -8
  130. package/lib/public/modules/worker-runtime-picker.js +115 -0
  131. package/lib/public/modules/you-activity.js +121 -0
  132. package/lib/public/modules/you.js +251 -0
  133. package/lib/public/style.css +16 -8
  134. package/lib/public/vendor/codemirror/LICENSE +21 -0
  135. package/lib/public/vendor/codemirror/codemirror.css +344 -0
  136. package/lib/public/vendor/codemirror/codemirror.js +9884 -0
  137. package/lib/public/vendor/codemirror/continuelist.js +101 -0
  138. package/lib/public/vendor/codemirror/markdown.js +886 -0
  139. package/lib/public/vendor/codemirror/show-hint.css +37 -0
  140. package/lib/public/vendor/codemirror/show-hint.js +523 -0
  141. package/lib/sdk-bridge.js +15 -3
  142. package/lib/server-admin.js +11 -0
  143. package/lib/server-home-chat-events.js +1 -1
  144. package/lib/server-home-chat.js +25 -3
  145. package/lib/server-home-debate-planning.js +4 -1
  146. package/lib/server-home-debates.js +2 -0
  147. package/lib/server-home-mate-creation.js +4 -1
  148. package/lib/server-mate-instructions.js +44 -0
  149. package/lib/server-mates.js +12 -3
  150. package/lib/server-palette.js +1 -1
  151. package/lib/server-settings.js +65 -1
  152. package/lib/server-user-knowledge.js +119 -0
  153. package/lib/server.js +21 -1
  154. package/lib/session-visibility.js +7 -2
  155. package/lib/sessions.js +32 -6
  156. package/lib/user-knowledge-service.js +167 -0
  157. package/lib/users-permissions.js +7 -0
  158. package/lib/users-project-mate-filter-preferences.js +39 -0
  159. package/lib/users.js +6 -0
  160. package/lib/workspace-query-access.js +4 -1
  161. package/lib/ws-schema.js +50 -0
  162. package/package.json +10 -1
@@ -48,7 +48,7 @@
48
48
  .home-mate-list-overflow-mark {
49
49
  display: block;
50
50
  font-family: sans-serif;
51
- font-size: 9px;
51
+ font-size: 12px;
52
52
  font-weight: 700;
53
53
  letter-spacing: 0.08em;
54
54
  line-height: 1;
@@ -108,15 +108,15 @@ body.home-mate-settings-open #confirm-modal { z-index: 9100; }
108
108
 
109
109
  .home-mate-settings-dialog {
110
110
  display: flex;
111
- width: min(720px, calc(100vw - 48px));
112
- height: min(590px, calc(100vh - 64px));
111
+ width: min(920px, calc(100vw - 48px));
112
+ height: min(720px, calc(100dvh - 48px));
113
113
  max-height: 720px;
114
114
  flex-direction: column;
115
115
  overflow: hidden;
116
116
  border: 1px solid var(--border);
117
117
  border-radius: 14px;
118
118
  background: var(--bg);
119
- box-shadow: 0 24px 72px rgba(0, 0, 0, 0.24);
119
+ box-shadow: 0 8px 28px rgba(var(--shadow-rgb), 0.18);
120
120
  animation: home-mate-settings-in 140ms ease-out;
121
121
  }
122
122
 
@@ -145,7 +145,7 @@ body.home-mate-settings-open #confirm-modal { z-index: 9100; }
145
145
  .home-mate-settings-header span {
146
146
  overflow: hidden;
147
147
  color: var(--text-dimmer);
148
- font-size: 10px;
148
+ font-size: 12px;
149
149
  font-weight: 620;
150
150
  letter-spacing: 0.02em;
151
151
  text-overflow: ellipsis;
@@ -155,7 +155,7 @@ body.home-mate-settings-open #confirm-modal { z-index: 9100; }
155
155
  .home-mate-settings-header h2 {
156
156
  margin: 0;
157
157
  color: var(--text);
158
- font-size: 17px;
158
+ font-size: 16px;
159
159
  font-weight: 650;
160
160
  letter-spacing: -0.015em;
161
161
  }
@@ -182,7 +182,7 @@ body.home-mate-settings-open #confirm-modal { z-index: 9100; }
182
182
  display: grid;
183
183
  min-height: 0;
184
184
  flex: 1 1 auto;
185
- grid-template-columns: 172px minmax(0, 1fr);
185
+ grid-template-columns: 184px minmax(0, 1fr);
186
186
  }
187
187
 
188
188
  .home-mate-settings-nav {
@@ -196,8 +196,8 @@ body.home-mate-settings-open #confirm-modal { z-index: 9100; }
196
196
 
197
197
  .home-mate-settings-nav button {
198
198
  width: 100%;
199
- min-height: 36px;
200
- padding: 8px 10px;
199
+ min-height: 32px;
200
+ padding: 6px 10px;
201
201
  border: 0;
202
202
  border-radius: 7px;
203
203
  background: transparent;
@@ -210,7 +210,7 @@ body.home-mate-settings-open #confirm-modal { z-index: 9100; }
210
210
  }
211
211
 
212
212
  .home-mate-settings-nav button:hover { background: rgba(var(--overlay-rgb), 0.045); color: var(--text); }
213
- .home-mate-settings-nav button.is-active { background: rgba(var(--overlay-rgb), 0.065); color: var(--text); font-weight: 640; }
213
+ .home-mate-settings-nav button.is-active { background: color-mix(in srgb, var(--brand-indigo) 9%, transparent); color: var(--text); font-weight: 640; }
214
214
  .home-mate-settings-nav button:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
215
215
 
216
216
  .home-mate-settings-content { min-width: 0; min-height: 0; overflow-y: auto; }
@@ -219,8 +219,8 @@ body.home-mate-settings-open #confirm-modal { z-index: 9100; }
219
219
  display: flex;
220
220
  flex-direction: column;
221
221
  gap: 12px;
222
- max-width: 520px;
223
- padding: 24px 26px 30px;
222
+ max-width: 720px;
223
+ padding: 0 24px 24px;
224
224
  }
225
225
 
226
226
  .home-mate-settings-identity,
@@ -232,7 +232,7 @@ body.home-mate-settings-open #confirm-modal { z-index: 9100; }
232
232
 
233
233
  .home-mate-settings-identity > span {
234
234
  color: var(--text-dimmer);
235
- font-size: 9px;
235
+ font-size: 12px;
236
236
  font-weight: 680;
237
237
  letter-spacing: 0.08em;
238
238
  text-transform: uppercase;
@@ -256,6 +256,87 @@ body.home-mate-settings-open #confirm-modal { z-index: 9100; }
256
256
  line-height: 1.55;
257
257
  }
258
258
 
259
+ .home-mate-avatar-editor {
260
+ padding: 2px 0 16px;
261
+ border-bottom: 1px solid var(--border-subtle);
262
+ }
263
+
264
+ .home-mate-avatar-heading {
265
+ display: flex;
266
+ align-items: center;
267
+ gap: 12px;
268
+ margin-bottom: 14px;
269
+ }
270
+
271
+ .home-mate-avatar-preview {
272
+ width: 52px;
273
+ height: 52px;
274
+ flex: 0 0 auto;
275
+ border: 1px solid var(--border);
276
+ border-radius: 12px;
277
+ background: var(--bg-alt);
278
+ object-fit: cover;
279
+ }
280
+
281
+ .home-mate-avatar-heading h3 { margin: 0 0 3px; color: var(--text); font-size: 13px; font-weight: 650; }
282
+ .home-mate-avatar-heading p { margin: 0; color: var(--text-secondary); font-size: 12px; line-height: 1.45; }
283
+
284
+ .home-mate-avatar-choices {
285
+ display: grid;
286
+ grid-template-columns: repeat(5, minmax(0, 1fr));
287
+ gap: 7px;
288
+ }
289
+
290
+ .home-mate-avatar-choice {
291
+ display: flex;
292
+ min-width: 0;
293
+ padding: 5px 3px 6px;
294
+ align-items: center;
295
+ flex-direction: column;
296
+ gap: 4px;
297
+ border: 1px solid transparent;
298
+ border-radius: 8px;
299
+ background: transparent;
300
+ color: var(--text-dimmer);
301
+ font: inherit;
302
+ font-size: 12px;
303
+ cursor: pointer;
304
+ }
305
+
306
+ .home-mate-avatar-choice img {
307
+ width: 36px;
308
+ height: 36px;
309
+ border-radius: 8px;
310
+ object-fit: cover;
311
+ }
312
+
313
+ .home-mate-avatar-choice:hover { background: var(--bg-hover); color: var(--text); }
314
+ .home-mate-avatar-choice[aria-pressed="true"] { border-color: var(--border); background: rgba(var(--overlay-rgb), 0.065); color: var(--text); font-weight: 650; }
315
+ .home-mate-avatar-choice:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
316
+
317
+ .home-mate-avatar-actions { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 12px; }
318
+ .home-mate-avatar-actions .home-mate-avatar-file-input,
319
+ .home-mate-avatar-actions .home-mate-avatar-file-input[hidden] { display: none !important; }
320
+ .home-mate-avatar-actions button {
321
+ min-height: 32px;
322
+ padding: 6px 9px;
323
+ border: 1px solid var(--border);
324
+ border-radius: 7px;
325
+ background: var(--bg);
326
+ color: var(--text-secondary);
327
+ font: inherit;
328
+ font-size: 12px;
329
+ font-weight: 620;
330
+ cursor: pointer;
331
+ }
332
+ .home-mate-avatar-actions button:hover:not(:disabled) { background: var(--bg-hover); color: var(--text); }
333
+ .home-mate-avatar-actions button:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
334
+ .home-mate-avatar-actions button:disabled { cursor: default; opacity: 0.48; }
335
+
336
+ .home-mate-avatar-status { min-height: 16px; padding-top: 7px; color: var(--text-dimmer); font-size: 12px; }
337
+ .home-mate-avatar-status.is-error { color: var(--danger); }
338
+ .home-mate-avatar-status.is-saved { color: var(--success); }
339
+
259
340
  .home-mate-settings-actions { display: flex; flex-wrap: wrap; gap: 8px; }
260
341
 
261
342
  .home-mate-settings-action {
@@ -269,14 +350,14 @@ body.home-mate-settings-open #confirm-modal { z-index: 9100; }
269
350
  background: var(--bg);
270
351
  color: var(--text-secondary);
271
352
  font: inherit;
272
- font-size: 11px;
353
+ font-size: 12px;
273
354
  font-weight: 620;
274
355
  cursor: pointer;
275
356
  }
276
357
 
277
358
  .home-mate-settings-action:hover { background: var(--bg-hover); color: var(--text); }
278
359
  .home-mate-settings-action:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
279
- .home-mate-settings-action.is-danger { color: var(--danger); }
360
+ .home-mate-settings-action.is-danger { color: var(--error); border-color: color-mix(in srgb, var(--error) 45%, var(--border)); }
280
361
  .home-mate-settings-action .lucide { width: 14px; height: 14px; }
281
362
 
282
363
  .home-mate-settings-empty {
@@ -335,10 +416,81 @@ body.home-mate-settings-open #confirm-modal { z-index: 9100; }
335
416
  border-bottom: 1px solid var(--border-subtle);
336
417
  }
337
418
  .home-mate-settings-nav button { width: auto; min-width: max-content; text-align: center; }
338
- .home-mate-settings-body { padding: 20px 18px 28px; }
419
+ .home-mate-settings-body { padding: 0 16px 24px; }
420
+ .home-mate-avatar-choices { grid-template-columns: repeat(3, minmax(0, 1fr)); }
339
421
  }
340
422
 
341
423
  @media (prefers-reduced-motion: reduce) {
342
424
  .home-mate-list-overflow { transition: none; }
343
425
  .home-mate-settings-dialog { animation: none; }
344
426
  }
427
+
428
+ .home-mate-settings-content-title { margin: 0; padding: 24px 24px 8px; color: var(--text); font-size: 20px; font-weight: 600; }
429
+ .home-mate-settings-nav button { font-size: 13px; }
430
+ .home-mate-settings-header span { font-size: 12px; color: var(--text-muted); font-weight: 400; letter-spacing: 0; }
431
+ .home-mate-settings-body { gap: 24px; }
432
+ .home-mate-settings-body > .mate-settings-help { margin-bottom: 0; }
433
+ .home-mate-settings-body .mate-instructions h4 { margin-top: 0; }
434
+ .home-mate-settings-body h4 { font-size: 14px; margin: 12px 0 6px; font-weight: 600; }
435
+ .mate-settings-help { margin: 0 0 12px; color: var(--text-muted); font-size: 13px; line-height: 1.5; }
436
+ .mate-instructions-input { display: block; box-sizing: border-box; width: 100%; min-height: 280px; resize: vertical; padding: 12px; border: 1px solid var(--border); border-radius: 8px; background: var(--bg-alt); color: var(--text); font: 13px/1.6 var(--font-mono, monospace); }
437
+ .mate-instructions-input:focus-visible, .mate-settings-button:focus-visible, .mate-settings-appearance > summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
438
+ .mate-settings-status { margin: 8px 0 0; color: var(--text-muted); font-size: 12px; line-height: 1.5; }
439
+ .mate-settings-status:empty { display: none; }
440
+ .mate-settings-status.is-error { color: var(--error); }
441
+ .mate-settings-savebar { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--border-subtle); }
442
+ .mate-settings-savebar[hidden] { display: none; }
443
+ .mate-settings-button { min-height: 32px; padding: 5px 10px; border: 1px solid var(--border); border-radius: 8px; background: var(--bg); color: var(--text); font: inherit; font-size: 13px; cursor: pointer; }
444
+ .mate-settings-button.primary { background: var(--brand-indigo); border-color: var(--brand-indigo); color: white; }
445
+ .mate-settings-button:disabled { opacity: .5; cursor: default; }
446
+ .mate-settings-appearance { padding: 0; }
447
+ .home-mate-settings-body > section > h4 { margin-top: 0; }
448
+ .mate-settings-appearance > summary { cursor: pointer; font-size: 14px; font-weight: 600; padding: 4px 0 12px; }
449
+ .home-mate-avatar-editor { border: 0; padding-bottom: 0; }
450
+ .home-mate-avatar-choice[aria-pressed="true"] { border-color: color-mix(in srgb, var(--brand-indigo) 35%, var(--border)); background: color-mix(in srgb, var(--brand-indigo) 7%, var(--bg)); }
451
+ .home-mate-avatar-status:empty { display: none; }
452
+ .home-mate-settings-actions { padding-top: 16px; border-top: 1px solid var(--border-subtle); }
453
+ @media (max-width: 768px) {
454
+ .home-mate-settings-content-title { padding: 16px 16px 8px; }
455
+ .home-mate-settings-nav button { flex: 1; min-width: 0; }
456
+ .home-mate-settings-nav { overflow: visible; }
457
+ .mate-instructions-input { min-height: 240px; }
458
+ }
459
+
460
+ .mate-settings-profile-heading { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 8px; }
461
+ .mate-settings-profile-heading h4 { margin: 0; }
462
+ .mate-settings-profile-name { margin: 0 0 4px; font-size: 14px; font-weight: 500; }
463
+ .mate-settings-profile > .mate-settings-help { white-space: pre-wrap; overflow-wrap: anywhere; margin-bottom: 0; }
464
+ .mate-settings-profile-field { display: flex; flex-direction: column; gap: 6px; margin-top: 12px; font-size: 13px; }
465
+ .mate-settings-profile-field input, .mate-settings-profile-field textarea { width: 100%; box-sizing: border-box; padding: 8px 10px; border: 1px solid var(--border); border-radius: 8px; background: var(--bg-alt); color: var(--text); font: inherit; }
466
+ .mate-settings-profile-field input { height: 36px; }
467
+ .mate-settings-profile-field textarea { min-height: 80px; resize: vertical; }
468
+ .mate-settings-profile-field :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
469
+ .mate-settings-profile + .mate-settings-appearance { padding-top: 20px; border-top: 1px solid var(--border-subtle); }
470
+
471
+ .home-mate-settings-actions { align-items: center; justify-content: space-between; gap: 12px; }
472
+ .mate-settings-danger-copy { flex: 1; min-width: 180px; }
473
+ .mate-settings-danger-copy h4 { color: var(--error); margin: 0 0 6px; }
474
+ .mate-settings-danger-copy p { margin: 0; font-size: 12px; line-height: 1.5; color: var(--text-muted); }
475
+
476
+ /* The resting General page is a profile summary, not an expanded avatar catalog. */
477
+ .mate-settings-profile { display: grid; grid-template-columns: 56px minmax(0, 1fr); column-gap: 16px; align-items: start; }
478
+ .mate-settings-profile-avatar { grid-column: 1; grid-row: 1 / span 3; width: 56px; height: 56px; padding: 0; border: 1px solid var(--border); border-radius: 12px; background: var(--bg-alt); cursor: pointer; overflow: hidden; }
479
+ .mate-settings-profile-avatar img { display: block; width: 100%; height: 100%; object-fit: cover; }
480
+ .mate-settings-profile-avatar:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
481
+ .mate-settings-profile-avatar:disabled { cursor: default; }
482
+ .mate-settings-profile-heading, .mate-settings-profile > .mate-settings-help { grid-column: 2; }
483
+ .mate-settings-profile-heading { min-height: 32px; margin-bottom: 4px; }
484
+ .mate-settings-profile-heading h4 { font-size: 15px; }
485
+ .mate-settings-profile-field, .mate-settings-profile > .mate-settings-status, .mate-settings-profile > .mate-settings-savebar { grid-column: 1 / -1; }
486
+ .mate-settings-appearance .home-mate-avatar-heading { display: none; }
487
+ .mate-settings-appearance > .mate-settings-button { margin-top: 12px; }
488
+ .home-mate-settings-overlay[data-section="general"] .home-mate-settings-body { gap: 20px; }
489
+ .home-mate-settings-overlay[data-section="general"] .home-mate-settings-actions { margin-top: auto; }
490
+ /* Prompt takes the remaining content height, with its own text scrolling. */
491
+ .home-mate-settings-overlay[data-section="prompt"] .home-mate-settings-content { display: flex; flex-direction: column; overflow: hidden; }
492
+ .home-mate-settings-overlay[data-section="prompt"] .home-mate-settings-content-title { flex: none; }
493
+ .home-mate-settings-overlay[data-section="prompt"] .home-mate-settings-body { flex: 1; min-height: 0; box-sizing: border-box; width: 100%; }
494
+ .home-mate-settings-overlay[data-section="prompt"] .mate-instructions { display: flex; flex-direction: column; flex: 1; min-height: 0; }
495
+ .home-mate-settings-overlay[data-section="prompt"] .mate-instructions-input { flex: 1; min-height: 80px; resize: none; }
496
+ .home-mate-settings-overlay[data-section="prompt"] .mate-instructions > :not(textarea) { flex: none; }
@@ -2,6 +2,16 @@
2
2
  Icon Strip — Discord-style vertical server/project bar
3
3
  ========================================================================== */
4
4
 
5
+ #layout-body {
6
+ --account-rail-bottom: 12px;
7
+ --account-rail-avatar-target: 44px;
8
+ --account-rail-control-gap: 4px;
9
+ --account-rail-cursor-target: 28px;
10
+ --account-rail-clearance: 8px;
11
+ --account-rail-strip-fixed-top: calc(48px + 58px + 48px);
12
+ --account-rail-footer-height: calc(var(--account-rail-bottom) + var(--account-rail-avatar-target) + var(--account-rail-control-gap) + var(--account-rail-cursor-target) + var(--account-rail-clearance));
13
+ }
14
+
5
15
  #icon-strip {
6
16
  position: relative;
7
17
  width: 72px;
@@ -10,7 +20,7 @@
10
20
  display: flex;
11
21
  flex-direction: column;
12
22
  align-items: center;
13
- padding: 0 0 80px;
23
+ padding: 0 0 var(--account-rail-footer-height, 100px);
14
24
  overflow: hidden;
15
25
  z-index: 2;
16
26
  }
@@ -59,6 +69,16 @@
59
69
  opacity: 1;
60
70
  }
61
71
 
72
+ .icon-strip-brand {
73
+ cursor: default;
74
+ }
75
+
76
+ .icon-strip-brand:hover::before,
77
+ .icon-strip-brand.active::before {
78
+ background: var(--bg-alt);
79
+ box-shadow: 0 1px 2px rgba(var(--shadow-rgb), 0.08);
80
+ }
81
+
62
82
  .icon-strip-home.active::before {
63
83
  background: var(--bg);
64
84
  box-shadow: 0 1px 3px rgba(var(--shadow-rgb), 0.14);
@@ -149,6 +169,7 @@
149
169
  /* --- Scrollable project list area --- */
150
170
  .icon-strip-projects {
151
171
  width: 100%;
172
+ flex: 1 1 0;
152
173
  min-height: 0;
153
174
  overflow-y: auto;
154
175
  overflow-x: hidden;
@@ -164,6 +185,133 @@
164
185
  display: none;
165
186
  }
166
187
 
188
+ /* --- Project / Mate rotary filter --- */
189
+ .icon-strip-filter {
190
+ width: 100%;
191
+ height: 58px;
192
+ flex: 0 0 58px;
193
+ display: flex;
194
+ align-items: center;
195
+ justify-content: center;
196
+ }
197
+
198
+ .icon-strip-filter-knob {
199
+ width: 48px;
200
+ height: 56px;
201
+ padding: 3px 0 2px;
202
+ border: 0;
203
+ background: transparent;
204
+ color: var(--text-dimmer);
205
+ font: inherit;
206
+ cursor: pointer;
207
+ display: flex;
208
+ flex-direction: column;
209
+ align-items: center;
210
+ justify-content: center;
211
+ gap: 2px;
212
+ }
213
+
214
+ .icon-strip-filter-face {
215
+ position: relative;
216
+ width: 34px;
217
+ height: 34px;
218
+ border-radius: 50%;
219
+ background: var(--bg);
220
+ box-shadow:
221
+ inset 0 1px 0 color-mix(in srgb, white 42%, transparent),
222
+ 0 1px 2px rgba(var(--shadow-rgb), 0.1);
223
+ transition: background 0.2s ease, box-shadow 0.2s ease;
224
+ }
225
+
226
+ .icon-strip-filter-pointer {
227
+ position: absolute;
228
+ inset: 2px;
229
+ border-radius: 50%;
230
+ transition: transform 180ms cubic-bezier(0.2, 0.75, 0.3, 1);
231
+ }
232
+
233
+ .icon-strip-filter-pointer::before {
234
+ content: "";
235
+ position: absolute;
236
+ left: 50%;
237
+ top: 2px;
238
+ width: 5px;
239
+ height: 2px;
240
+ border-radius: 2px;
241
+ background: color-mix(in srgb, var(--accent) 72%, var(--text-dimmer));
242
+ box-shadow: inset 0 1px 1px rgba(var(--shadow-rgb), 0.28);
243
+ transform: translateX(-50%);
244
+ }
245
+
246
+ .icon-strip-filter-category {
247
+ position: absolute;
248
+ inset: 0;
249
+ z-index: 1;
250
+ display: none;
251
+ align-items: center;
252
+ justify-content: center;
253
+ color: var(--text-secondary);
254
+ pointer-events: none;
255
+ }
256
+
257
+ .icon-strip-filter-category .lucide {
258
+ width: 14px;
259
+ height: 14px;
260
+ stroke-width: 1.8;
261
+ }
262
+
263
+ .icon-strip-filter-knob[data-mode="all"] [data-filter-icon="all"],
264
+ .icon-strip-filter-knob[data-mode="projects"] [data-filter-icon="projects"],
265
+ .icon-strip-filter-knob[data-mode="mates"] [data-filter-icon="mates"] {
266
+ display: flex;
267
+ }
268
+
269
+ .icon-strip-filter-label {
270
+ max-width: 48px;
271
+ overflow: hidden;
272
+ color: var(--text-muted);
273
+ font-size: 9px;
274
+ font-weight: 700;
275
+ line-height: 11px;
276
+ letter-spacing: 0.01em;
277
+ text-overflow: ellipsis;
278
+ white-space: nowrap;
279
+ }
280
+
281
+ .icon-strip-filter-knob:hover .icon-strip-filter-face {
282
+ background: var(--bg-alt);
283
+ box-shadow:
284
+ inset 0 1px 0 color-mix(in srgb, white 48%, transparent),
285
+ 0 2px 6px rgba(var(--shadow-rgb), 0.14);
286
+ }
287
+
288
+ .icon-strip-filter-knob:focus-visible {
289
+ outline: 2px solid var(--accent);
290
+ outline-offset: -2px;
291
+ border-radius: 13px;
292
+ }
293
+
294
+ .icon-strip-projects[data-filter-mode="projects"] > [data-mate-id],
295
+ .icon-strip-projects[data-filter-mode="mates"] > .icon-strip-item[data-slug],
296
+ .icon-strip-projects[data-filter-mode="mates"] > .icon-strip-group,
297
+ .icon-strip-projects:not([data-filter-mode="all"]) > .icon-strip-peer-separator {
298
+ display: none;
299
+ }
300
+
301
+ .icon-strip-peer-separator {
302
+ width: 24px;
303
+ height: 1px;
304
+ margin: 4px 0;
305
+ flex: 0 0 1px;
306
+ background: color-mix(in srgb, var(--border) 72%, transparent);
307
+ }
308
+
309
+ @media (prefers-reduced-motion: reduce) {
310
+ .icon-strip-filter-pointer {
311
+ transition-duration: 0.01ms;
312
+ }
313
+ }
314
+
167
315
  /* --- Project icon item (48px hit-box, 38px visible bg) --- */
168
316
  .icon-strip-item {
169
317
  position: relative;
@@ -217,6 +365,29 @@
217
365
  }
218
366
 
219
367
  /* --- Socket status indicator on icon (top-left dot) --- */
368
+ .icon-strip-project-mate {
369
+ border: 0;
370
+ padding: 0;
371
+ font: inherit;
372
+ }
373
+
374
+ .icon-strip-mate-avatar {
375
+ width: 34px;
376
+ height: 34px;
377
+ border-radius: 10px;
378
+ object-fit: cover;
379
+ }
380
+
381
+ .icon-strip-project-mate:focus-visible {
382
+ outline: 2px solid var(--accent);
383
+ outline-offset: -3px;
384
+ border-radius: 12px;
385
+ }
386
+
387
+ .icon-strip-project-mate.active .icon-strip-mate-avatar {
388
+ box-shadow: 0 0 0 2px var(--accent);
389
+ }
390
+
220
391
  .icon-strip-status {
221
392
  position: absolute;
222
393
  top: 3px;
@@ -363,6 +534,37 @@
363
534
  box-shadow: 0 4px 12px rgba(var(--shadow-rgb), 0.5);
364
535
  }
365
536
 
537
+ .icon-strip-tooltip-mate {
538
+ padding: 6px 10px 6px 7px;
539
+ border: 1px solid var(--border);
540
+ border-left: 3px solid var(--accent);
541
+ border-radius: 9px;
542
+ background: var(--sidebar-bg);
543
+ }
544
+
545
+ .icon-strip-tooltip-mate-identity {
546
+ display: flex;
547
+ align-items: center;
548
+ gap: 7px;
549
+ }
550
+
551
+ .icon-strip-tooltip-mate-avatar {
552
+ width: 18px;
553
+ height: 18px;
554
+ flex: none;
555
+ border-radius: 50%;
556
+ object-fit: cover;
557
+ box-shadow: 0 0 0 1px var(--border);
558
+ }
559
+
560
+ .icon-strip-tooltip-label {
561
+ min-width: 0;
562
+ max-width: 220px;
563
+ overflow: hidden;
564
+ text-overflow: ellipsis;
565
+ white-space: nowrap;
566
+ }
567
+
366
568
  .icon-strip-tooltip.visible {
367
569
  opacity: 1;
368
570
  transform: translateX(0);
@@ -379,6 +581,10 @@
379
581
  border-left: none;
380
582
  }
381
583
 
584
+ .icon-strip-tooltip-mate::before {
585
+ border-right-color: var(--sidebar-bg);
586
+ }
587
+
382
588
  /* --- Drag-and-drop reordering --- */
383
589
  .icon-strip-item.dragging {
384
590
  opacity: 0.3;
@@ -546,6 +752,12 @@
546
752
 
547
753
  .project-ctx-item .lucide { width: 15px; height: 15px; flex-shrink: 0; }
548
754
  .project-ctx-item:hover { background: rgba(var(--overlay-rgb), 0.06); color: var(--text); }
755
+ .project-ctx-item:focus-visible {
756
+ color: var(--text);
757
+ background: rgba(var(--overlay-rgb), 0.06);
758
+ outline: 2px solid var(--accent);
759
+ outline-offset: -2px;
760
+ }
549
761
  .project-ctx-item:first-child { border-radius: 6px 6px 0 0; }
550
762
  .project-ctx-item:last-child { border-radius: 0 0 6px 6px; }
551
763
 
@@ -845,20 +1057,20 @@
845
1057
  height: 22px;
846
1058
  }
847
1059
 
848
- /* Mate section wrapper — pinned just above the user-island at the
849
- bottom of the strip. Groups the \u2318M hint pill with the users
850
- list so the hint sits directly above the mate avatars rather than
851
- floating up in the project section's flex flow. */
1060
+ /* Mate section wrapper — an in-flow footer above the user-island.
1061
+ Its rendered height is reserved after Add project, while the project
1062
+ and Mate icon region takes and scrolls within the remaining space. */
852
1063
  .icon-strip-mate-section {
853
- position: absolute;
854
- bottom: 74px; /* above user-island (58px + 8px bottom + 8px gap) */
855
- left: 50%;
856
- transform: translateX(-50%);
1064
+ flex: 0 0 auto;
1065
+ max-height: max(0px, calc(100vh - var(--account-rail-footer-height, 116px) - var(--account-rail-strip-fixed-top, 154px)));
1066
+ overflow-y: auto;
1067
+ scrollbar-width: none;
857
1068
  display: flex;
858
1069
  flex-direction: column;
859
1070
  align-items: center;
860
1071
  gap: 4px;
861
1072
  }
1073
+ .icon-strip-mate-section::-webkit-scrollbar { display: none; }
862
1074
 
863
1075
  /* --- User avatars (circle, inside the mate section) --- */
864
1076
  .icon-strip-users {
@@ -1024,29 +1236,6 @@
1024
1236
 
1025
1237
  /* DM mode: keep same position (user-island gone but layout stays) */
1026
1238
 
1027
- /* --- My avatar at bottom of icon strip (always present, behind user-island) --- */
1028
- /* Positioned to align with icon-strip center (72px / 2 = 36px) */
1029
- /* Matches user-island avatar center: left:8px + padding:10px + 18px = 36px */
1030
- .icon-strip-me {
1031
- position: absolute;
1032
- bottom: 19px; /* vertically center with user-island (bottom:8px + height:58px/2 - 16px) */
1033
- left: 36px;
1034
- transform: translateX(-50%);
1035
- display: flex;
1036
- align-items: center;
1037
- justify-content: center;
1038
- width: 32px;
1039
- height: 32px;
1040
- z-index: 1; /* below user-island z-index: 15 */
1041
- }
1042
-
1043
- .icon-strip-me-avatar {
1044
- width: 32px;
1045
- height: 32px;
1046
- border-radius: 50%;
1047
- object-fit: cover;
1048
- }
1049
-
1050
1239
  /* --- DM user picker popup --- */
1051
1240
  .dm-user-picker {
1052
1241
  position: fixed;
@@ -1547,3 +1736,31 @@ select.wt-modal-input {
1547
1736
  display: none;
1548
1737
  }
1549
1738
  }
1739
+
1740
+ /* Mate workspaces omit repository, filesystem, and terminal controls. */
1741
+ body.mate-workspace-active #session-actions {
1742
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1743
+ }
1744
+ /* Use the full column for captions at the 192px sidebar minimum, keeping
1745
+ words such as Knowledge intact without enlarging the icon face. */
1746
+ body.mate-workspace-active #session-actions .palette-tile {
1747
+ padding-inline: 0;
1748
+ }
1749
+ body.mate-workspace-active #git-placard,
1750
+ body.mate-workspace-active #sidebar-panel-git,
1751
+ body.mate-workspace-active #file-browser-btn,
1752
+ body.mate-workspace-active #terminal-sidebar-btn,
1753
+ body.mate-workspace-active #project-logs-btn,
1754
+ body.mate-workspace-active #issues-btn,
1755
+ body.mate-workspace-active #terminal-toggle-btn,
1756
+ body.mate-workspace-active #shell-command-btn,
1757
+ body.mate-workspace-active #input-more-shell,
1758
+ body.mate-workspace-active #loop-interview-btn,
1759
+ body.mate-workspace-active #composer-handoff-btn {
1760
+ display: none !important;
1761
+ }
1762
+
1763
+ #knowledge-workbench-btn { display: none !important; }
1764
+ body.mate-workspace-active #knowledge-workbench-btn { display: flex !important; }
1765
+ #mate-project-debates-btn { display: none !important; }
1766
+ body.mate-workspace-active #mate-project-debates-btn { display: flex !important; }