clay-server 3.7.0 → 3.8.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 (40) hide show
  1. package/lib/builtin-mates.js +14 -14
  2. package/lib/mates.js +2 -6
  3. package/lib/os-users.js +17 -1
  4. package/lib/project-http.js +34 -1
  5. package/lib/project-image.js +87 -1
  6. package/lib/project-mate-interaction.js +7 -7
  7. package/lib/project-sessions.js +1 -1
  8. package/lib/project-user-mention.js +4 -4
  9. package/lib/project.js +6 -4
  10. package/lib/public/css/avatar-imprints.css +46 -0
  11. package/lib/public/css/generated-images.css +242 -0
  12. package/lib/public/css/icon-strip.css +3 -3
  13. package/lib/public/css/profile.css +123 -95
  14. package/lib/public/css/session-actions.css +40 -9
  15. package/lib/public/css/user-settings.css +1 -1
  16. package/lib/public/index.html +3 -3
  17. package/lib/public/modules/app-cursors.js +2 -2
  18. package/lib/public/modules/app-dm.js +1 -8
  19. package/lib/public/modules/app-messages.js +2 -2
  20. package/lib/public/modules/app-projects.js +7 -6
  21. package/lib/public/modules/app-rate-limit.js +0 -1
  22. package/lib/public/modules/app-rendering.js +0 -3
  23. package/lib/public/modules/avatar-imprint.js +134 -0
  24. package/lib/public/modules/avatar.js +25 -19
  25. package/lib/public/modules/debate.js +10 -5
  26. package/lib/public/modules/generated-images.js +211 -2
  27. package/lib/public/modules/mate-sidebar.js +2 -2
  28. package/lib/public/modules/mention.js +26 -16
  29. package/lib/public/modules/profile.js +73 -190
  30. package/lib/public/modules/session-actions.js +5 -3
  31. package/lib/public/modules/sidebar-mates.js +5 -4
  32. package/lib/public/modules/sidebar-sessions.js +1 -1
  33. package/lib/public/style.css +2 -1
  34. package/lib/server-auth.js +2 -2
  35. package/lib/server-dm.js +8 -8
  36. package/lib/server-mates.js +3 -3
  37. package/lib/server-settings.js +2 -2
  38. package/lib/server.js +5 -4
  39. package/lib/users.js +4 -4
  40. package/package.json +1 -1
@@ -168,12 +168,27 @@
168
168
  }
169
169
 
170
170
  .generated-image-prompt {
171
+ display: block;
172
+ width: 100%;
173
+ padding: 0;
174
+ border: 0;
171
175
  overflow: hidden;
176
+ background: transparent;
172
177
  color: var(--text-muted);
178
+ font: inherit;
173
179
  font-size: 11px;
174
180
  line-height: 1.35;
181
+ text-align: left;
175
182
  text-overflow: ellipsis;
176
183
  white-space: nowrap;
184
+ cursor: pointer;
185
+ }
186
+
187
+ .generated-image-prompt:hover {
188
+ color: var(--text-secondary);
189
+ text-decoration: underline;
190
+ text-decoration-color: var(--border);
191
+ text-underline-offset: 3px;
177
192
  }
178
193
 
179
194
  .generated-image-actions {
@@ -209,6 +224,213 @@
209
224
  height: 14px;
210
225
  }
211
226
 
227
+ .generated-image-details-backdrop {
228
+ position: fixed;
229
+ inset: 0;
230
+ z-index: 10050;
231
+ display: grid;
232
+ place-items: center;
233
+ padding: 24px;
234
+ background: rgba(0, 0, 0, 0.58);
235
+ backdrop-filter: blur(5px);
236
+ }
237
+
238
+ .generated-image-details {
239
+ display: flex;
240
+ width: min(720px, 100%);
241
+ max-height: min(820px, calc(100dvh - 48px));
242
+ overflow: hidden;
243
+ flex-direction: column;
244
+ border: 1px solid var(--border);
245
+ border-radius: 16px;
246
+ background: var(--bg);
247
+ box-shadow: 0 24px 80px rgba(var(--shadow-rgb), 0.42);
248
+ }
249
+
250
+ .generated-image-details-header {
251
+ display: flex;
252
+ align-items: center;
253
+ justify-content: space-between;
254
+ padding: 17px 18px 15px 20px;
255
+ border-bottom: 1px solid var(--border-subtle);
256
+ }
257
+
258
+ .generated-image-details-header h2 {
259
+ margin: 2px 0 0;
260
+ color: var(--text);
261
+ font-size: 17px;
262
+ line-height: 1.2;
263
+ }
264
+
265
+ .generated-image-details-eyebrow {
266
+ display: block;
267
+ color: var(--accent);
268
+ font-size: 9px;
269
+ font-weight: 700;
270
+ letter-spacing: 0.12em;
271
+ }
272
+
273
+ .generated-image-details-close {
274
+ width: 32px;
275
+ padding: 0;
276
+ justify-content: center;
277
+ }
278
+
279
+ .generated-image-details-close span { display: none; }
280
+
281
+ .generated-image-details-body {
282
+ display: grid;
283
+ grid-template-columns: 190px minmax(0, 1fr);
284
+ gap: 18px;
285
+ padding: 20px;
286
+ overflow-y: auto;
287
+ }
288
+
289
+ .generated-image-details-preview {
290
+ grid-row: span 2;
291
+ overflow: hidden;
292
+ align-self: start;
293
+ border: 1px solid var(--border-subtle);
294
+ border-radius: 11px;
295
+ background: var(--bg-alt);
296
+ }
297
+
298
+ .generated-image-details-preview img {
299
+ display: block;
300
+ width: 100%;
301
+ max-height: 280px;
302
+ object-fit: contain;
303
+ cursor: zoom-in;
304
+ }
305
+
306
+ .generated-image-details-section {
307
+ min-width: 0;
308
+ }
309
+
310
+ .generated-image-details-section-header {
311
+ display: flex;
312
+ min-height: 28px;
313
+ align-items: center;
314
+ justify-content: space-between;
315
+ gap: 10px;
316
+ margin-bottom: 7px;
317
+ }
318
+
319
+ .generated-image-details-section h3,
320
+ .generated-image-save-section label {
321
+ margin: 0;
322
+ color: var(--text-secondary);
323
+ font-size: 11px;
324
+ font-weight: 650;
325
+ letter-spacing: 0.02em;
326
+ }
327
+
328
+ .generated-image-details-section-header .generated-image-action {
329
+ height: 27px;
330
+ padding: 0 7px;
331
+ }
332
+
333
+ .generated-image-details-prompt {
334
+ max-height: 220px;
335
+ padding: 11px 12px;
336
+ overflow-y: auto;
337
+ border: 1px solid var(--border-subtle);
338
+ border-radius: 9px;
339
+ background: var(--bg-alt);
340
+ color: var(--text-secondary);
341
+ font-size: 12px;
342
+ line-height: 1.55;
343
+ white-space: pre-wrap;
344
+ overflow-wrap: anywhere;
345
+ }
346
+
347
+ .generated-image-save-section {
348
+ display: flex;
349
+ flex-direction: column;
350
+ gap: 7px;
351
+ }
352
+
353
+ .generated-image-save-section input {
354
+ width: 100%;
355
+ height: 38px;
356
+ padding: 0 11px;
357
+ border: 1px solid var(--border);
358
+ border-radius: 9px;
359
+ outline: none;
360
+ background: var(--input-bg);
361
+ color: var(--text);
362
+ font-family: var(--font-mono);
363
+ font-size: 12px;
364
+ }
365
+
366
+ .generated-image-save-section input:focus {
367
+ border-color: var(--accent);
368
+ box-shadow: 0 0 0 3px var(--accent-12);
369
+ }
370
+
371
+ .generated-image-save-hint,
372
+ .generated-image-save-error {
373
+ margin: 0;
374
+ font-size: 10px;
375
+ line-height: 1.4;
376
+ }
377
+
378
+ .generated-image-save-hint { color: var(--text-dimmer); }
379
+ .generated-image-save-error { color: var(--error); }
380
+ .generated-image-save-error.hidden { display: none; }
381
+
382
+ .generated-image-details-footer {
383
+ display: flex;
384
+ justify-content: flex-end;
385
+ gap: 8px;
386
+ padding: 13px 18px;
387
+ border-top: 1px solid var(--border-subtle);
388
+ background: var(--bg-alt);
389
+ }
390
+
391
+ .generated-image-secondary-button,
392
+ .generated-image-primary-button {
393
+ display: inline-flex;
394
+ height: 36px;
395
+ align-items: center;
396
+ justify-content: center;
397
+ gap: 7px;
398
+ padding: 0 14px;
399
+ border: 1px solid var(--border);
400
+ border-radius: 9px;
401
+ font: inherit;
402
+ font-size: 12px;
403
+ font-weight: 600;
404
+ cursor: pointer;
405
+ }
406
+
407
+ .generated-image-secondary-button {
408
+ background: transparent;
409
+ color: var(--text-secondary);
410
+ }
411
+
412
+ .generated-image-primary-button {
413
+ border-color: var(--accent);
414
+ background: var(--accent);
415
+ color: #fff;
416
+ }
417
+
418
+ .generated-image-primary-button--replace {
419
+ border-color: var(--warning);
420
+ background: var(--warning);
421
+ color: var(--bg);
422
+ }
423
+
424
+ .generated-image-primary-button:disabled {
425
+ cursor: wait;
426
+ opacity: 0.6;
427
+ }
428
+
429
+ .generated-image-primary-button .lucide {
430
+ width: 14px;
431
+ height: 14px;
432
+ }
433
+
212
434
  @media (max-width: 560px) {
213
435
  .generated-image-row { padding: 0 12px; }
214
436
  .generated-image-card { border-radius: 12px; }
@@ -222,4 +444,24 @@
222
444
  justify-content: center;
223
445
  padding: 0;
224
446
  }
447
+
448
+ .generated-image-details-backdrop { padding: 10px; }
449
+
450
+ .generated-image-details {
451
+ max-height: calc(100dvh - 20px);
452
+ border-radius: 13px;
453
+ }
454
+
455
+ .generated-image-details-body {
456
+ grid-template-columns: 1fr;
457
+ gap: 16px;
458
+ padding: 16px;
459
+ }
460
+
461
+ .generated-image-details-preview {
462
+ grid-row: auto;
463
+ width: min(220px, 100%);
464
+ }
465
+
466
+ .generated-image-details-preview img { max-height: 220px; }
225
467
  }
@@ -206,10 +206,10 @@
206
206
  }
207
207
 
208
208
  .icon-strip-item.active::before {
209
- background: var(--bg);
209
+ background: color-mix(in srgb, var(--brand-indigo) 6%, var(--bg));
210
210
  box-shadow:
211
- 0 0 0 1px color-mix(in srgb, var(--link) 62%, var(--border)),
212
- 0 1px 3px rgba(var(--shadow-rgb), 0.16);
211
+ 0 5px 14px color-mix(in srgb, var(--brand-indigo) 28%, transparent),
212
+ 0 1px 3px rgba(var(--shadow-rgb), 0.14);
213
213
  }
214
214
 
215
215
  .icon-strip-item.active {
@@ -18,13 +18,16 @@
18
18
  to { opacity: 1; transform: translateY(0); }
19
19
  }
20
20
 
21
- /* Banner */
21
+ /* Identity header */
22
22
  .profile-banner {
23
23
  height: 52px;
24
24
  position: relative;
25
25
  transition: background 0.2s ease;
26
26
  border-radius: 14px 14px 0 0;
27
27
  z-index: 1;
28
+ background: var(--bg);
29
+ border-top: 3px solid var(--profile-accent, #5857fc);
30
+ border-bottom: 1px solid var(--border);
28
31
  }
29
32
 
30
33
  .profile-close-btn {
@@ -34,8 +37,8 @@
34
37
  width: 24px;
35
38
  height: 24px;
36
39
  border: none;
37
- background: rgba(0, 0, 0, 0.3);
38
- color: #fff;
40
+ background: var(--bg-alt);
41
+ color: var(--text-muted);
39
42
  border-radius: 50%;
40
43
  font-size: 16px;
41
44
  line-height: 1;
@@ -47,7 +50,8 @@
47
50
  }
48
51
 
49
52
  .profile-close-btn:hover {
50
- background: rgba(0, 0, 0, 0.5);
53
+ background: var(--bg-hover, var(--bg-alt));
54
+ color: var(--text);
51
55
  }
52
56
 
53
57
  /* Avatar row (overlaps banner) */
@@ -65,7 +69,7 @@
65
69
  .profile-popover-avatar {
66
70
  width: 60px;
67
71
  height: 60px;
68
- border-radius: 50%;
72
+ border-radius: 17px;
69
73
  display: flex;
70
74
  align-items: center;
71
75
  justify-content: center;
@@ -79,30 +83,7 @@
79
83
  width: 100%;
80
84
  height: 100%;
81
85
  object-fit: cover;
82
- border-radius: 50%;
83
- }
84
-
85
- /* Shuffle button next to Avatar label */
86
- .profile-shuffle-btn {
87
- background: none;
88
- border: none;
89
- padding: 0;
90
- margin-left: 4px;
91
- cursor: pointer;
92
- color: var(--text-muted);
93
- vertical-align: middle;
94
- transition: color 0.15s;
95
- display: inline-flex;
96
- align-items: center;
97
- }
98
-
99
- .profile-shuffle-btn .lucide {
100
- width: 12px;
101
- height: 12px;
102
- }
103
-
104
- .profile-shuffle-btn:hover {
105
- color: var(--text);
86
+ border-radius: 14px;
106
87
  }
107
88
 
108
89
  .profile-name-display {
@@ -202,66 +183,140 @@
202
183
  border-color: var(--accent);
203
184
  }
204
185
 
205
- /* Avatar style grid */
206
- .profile-avatar-grid {
207
- display: grid;
208
- grid-template-columns: repeat(4, 1fr);
209
- gap: 6px;
186
+ /* Clay Imprint identity control */
187
+ .profile-imprint-panel {
188
+ border: 1px solid var(--border);
189
+ border-radius: 12px;
190
+ background: var(--bg);
191
+ padding: 9px;
210
192
  }
211
193
 
212
- .profile-avatar-option {
213
- width: 100%;
214
- aspect-ratio: 1;
215
- border-radius: 10px;
216
- border: 2px solid var(--border);
217
- background: var(--bg);
218
- cursor: pointer;
219
- padding: 3px;
220
- overflow: hidden;
194
+ .profile-imprint-preview {
221
195
  display: flex;
222
196
  align-items: center;
223
- justify-content: center;
224
- transition: border-color 0.15s, transform 0.1s;
197
+ gap: 10px;
198
+ min-height: 54px;
225
199
  }
226
200
 
227
- .profile-avatar-option img {
228
- width: 100%;
229
- height: 100%;
230
- object-fit: contain;
231
- border-radius: 6px;
201
+ .profile-imprint-preview img {
202
+ width: 50px;
203
+ height: 50px;
204
+ border-radius: 13px;
205
+ flex: 0 0 auto;
232
206
  }
233
207
 
234
- .profile-avatar-option:hover {
235
- border-color: var(--text-muted);
236
- transform: scale(1.05);
208
+ .profile-imprint-preview span {
209
+ display: flex;
210
+ flex-direction: column;
211
+ gap: 2px;
212
+ min-width: 0;
237
213
  }
238
214
 
239
- .profile-avatar-option.profile-avatar-option-active {
240
- border-color: var(--accent);
241
- box-shadow: 0 0 0 1px var(--accent);
215
+ .profile-imprint-preview strong {
216
+ color: var(--text);
217
+ font-size: 12px;
218
+ font-weight: 650;
219
+ }
220
+
221
+ .profile-imprint-preview small {
222
+ color: var(--text-dimmer);
223
+ font-size: 10px;
224
+ }
225
+
226
+ .profile-imprint-actions {
227
+ display: grid;
228
+ grid-template-columns: 1fr 1fr;
229
+ gap: 5px;
230
+ margin-top: 8px;
242
231
  }
243
232
 
244
- /* Avatar upload button */
245
- .profile-avatar-upload .profile-avatar-upload-icon {
233
+ .profile-imprint-actions button {
234
+ min-width: 0;
235
+ height: 28px;
236
+ padding: 0 8px;
237
+ border: 1px solid var(--border);
238
+ border-radius: 7px;
239
+ background: var(--bg-alt);
240
+ color: var(--text-muted);
241
+ cursor: pointer;
242
+ font-size: 10px;
243
+ font-weight: 600;
244
+ white-space: nowrap;
246
245
  display: flex;
247
246
  align-items: center;
248
247
  justify-content: center;
249
- width: 100%;
250
- height: 100%;
251
- color: var(--text-muted);
248
+ gap: 4px;
249
+ transition: border-color 0.15s, color 0.15s, background 0.15s;
252
250
  }
253
- .profile-avatar-upload .profile-avatar-upload-icon svg {
254
- width: 24px;
255
- height: 24px;
251
+
252
+ .profile-imprint-actions button:hover {
253
+ color: var(--text);
254
+ border-color: var(--text-muted);
256
255
  }
257
- .profile-avatar-upload:hover .profile-avatar-upload-icon {
256
+
257
+ .profile-imprint-actions button.is-active {
258
258
  color: var(--text);
259
+ border-color: var(--accent);
260
+ box-shadow: inset 0 0 0 1px var(--accent);
261
+ }
262
+
263
+ .profile-imprint-actions button .lucide {
264
+ width: 11px;
265
+ height: 11px;
266
+ }
267
+
268
+ .profile-avatar-upload {
269
+ grid-column: 1 / -1;
270
+ }
271
+
272
+ .profile-mate-mark-actions .profile-avatar-upload {
273
+ grid-column: auto;
274
+ }
275
+
276
+ .profile-avatar-upload.is-active::before {
277
+ content: "";
278
+ width: 5px;
279
+ height: 5px;
280
+ border-radius: 50%;
281
+ background: var(--accent);
259
282
  }
283
+
260
284
  .profile-avatar-custom-preview {
261
285
  width: 100%;
262
286
  height: 100%;
263
287
  object-fit: cover;
264
- border-radius: 6px;
288
+ border-radius: 12px;
289
+ }
290
+
291
+ .profile-use-imprint.is-active::before {
292
+ content: "";
293
+ width: 5px;
294
+ height: 5px;
295
+ border-radius: 50%;
296
+ background: var(--accent);
297
+ }
298
+
299
+ .profile-imprint-actions button:focus-visible {
300
+ outline: 2px solid var(--accent);
301
+ outline-offset: 2px;
302
+ }
303
+
304
+ .profile-imprint-actions button:active {
305
+ transform: translateY(1px);
306
+ }
307
+
308
+ .profile-imprint-actions button:disabled {
309
+ opacity: 0.45;
310
+ cursor: default;
311
+ }
312
+
313
+ .profile-imprint-actions button:disabled:hover {
314
+ border-color: var(--border);
315
+ color: var(--text-muted);
316
+ }
317
+
318
+ .profile-imprint-actions button.is-active:hover {
319
+ color: var(--text);
265
320
  }
266
321
 
267
322
  /* Avatar positioner overlay */
@@ -297,7 +352,7 @@
297
352
  color: var(--text-muted);
298
353
  font-size: 20px;
299
354
  cursor: pointer;
300
- border-radius: 50%;
355
+ border-radius: 28px;
301
356
  display: flex;
302
357
  align-items: center;
303
358
  justify-content: center;
@@ -313,7 +368,7 @@
313
368
  color: var(--text);
314
369
  }
315
370
  .avatar-positioner-viewport {
316
- border-radius: 50%;
371
+ border-radius: 26%;
317
372
  overflow: hidden;
318
373
  position: relative;
319
374
  cursor: grab;
@@ -368,30 +423,3 @@
368
423
  .avatar-positioner-btn-done:hover {
369
424
  filter: brightness(1.1);
370
425
  }
371
-
372
- /* Color swatch grid */
373
- .profile-color-grid {
374
- display: flex;
375
- flex-wrap: wrap;
376
- gap: 6px;
377
- }
378
-
379
- .profile-color-swatch {
380
- width: 22px;
381
- height: 22px;
382
- border-radius: 50%;
383
- border: 2px solid transparent;
384
- cursor: pointer;
385
- transition: transform 0.15s, border-color 0.15s;
386
- padding: 0;
387
- }
388
-
389
- .profile-color-swatch:hover {
390
- transform: scale(1.15);
391
- }
392
-
393
- .profile-color-swatch.profile-color-active {
394
- border-color: #fff;
395
- box-shadow: 0 0 0 2px var(--accent);
396
- }
397
-
@@ -2,23 +2,29 @@
2
2
  display: inline-flex;
3
3
  align-items: center;
4
4
  justify-content: center;
5
- width: 28px;
5
+ gap: 6px;
6
+ width: auto;
6
7
  height: 28px;
7
- padding: 0;
8
- border: 1px solid transparent;
8
+ margin: 0;
9
+ padding: 0 9px;
10
+ border: 1px solid var(--border-subtle);
9
11
  border-radius: 8px;
10
- background: transparent;
11
- color: var(--text-dimmer);
12
+ background: color-mix(in srgb, var(--brand-indigo) 5%, var(--bg));
13
+ color: var(--text-secondary);
12
14
  cursor: pointer;
13
15
  flex-shrink: 0;
16
+ font: inherit;
17
+ font-size: 11px;
18
+ font-weight: 650;
19
+ white-space: nowrap;
14
20
  transition: color 0.15s, background 0.15s, border-color 0.15s;
15
21
  }
16
22
 
17
23
  #header-session-actions-btn:hover,
18
24
  #header-session-actions-btn[aria-expanded="true"] {
19
25
  color: var(--text);
20
- background: rgba(var(--overlay-rgb), 0.05);
21
- border-color: var(--border);
26
+ background: color-mix(in srgb, var(--brand-indigo) 9%, var(--bg));
27
+ border-color: color-mix(in srgb, var(--brand-indigo) 32%, var(--border));
22
28
  }
23
29
 
24
30
  #header-session-actions-btn:focus { outline: none; }
@@ -28,12 +34,26 @@
28
34
  }
29
35
 
30
36
  #header-session-actions-btn.hidden { display: none; }
31
- #header-session-actions-btn .lucide { width: 16px; height: 16px; }
37
+ #header-session-actions-btn .lucide:first-child {
38
+ width: 14px;
39
+ height: 14px;
40
+ color: color-mix(in srgb, var(--brand-indigo) 78%, var(--text));
41
+ }
42
+
43
+ #header-session-actions-btn .session-actions-trigger-chevron {
44
+ width: 13px;
45
+ height: 13px;
46
+ transition: transform 0.16s ease;
47
+ }
48
+
49
+ #header-session-actions-btn[aria-expanded="true"] .session-actions-trigger-chevron {
50
+ transform: rotate(180deg);
51
+ }
32
52
 
33
53
  .session-actions-menu {
34
54
  position: fixed;
35
55
  z-index: 10020;
36
- width: 286px;
56
+ width: min(300px, calc(100vw - 16px));
37
57
  padding: 6px;
38
58
  border: 1px solid var(--border);
39
59
  border-radius: 12px;
@@ -63,6 +83,17 @@
63
83
  }
64
84
 
65
85
  .session-actions-row:hover { background: var(--bg-alt); }
86
+ .session-actions-row.is-primary {
87
+ background: color-mix(in srgb, var(--brand-indigo) 6%, transparent);
88
+ }
89
+ .session-actions-row.is-primary:hover {
90
+ background: color-mix(in srgb, var(--brand-indigo) 10%, transparent);
91
+ }
92
+ .session-actions-row.is-primary .session-actions-row-icon {
93
+ border-color: transparent;
94
+ background: var(--brand-indigo);
95
+ color: var(--brand-paper);
96
+ }
66
97
  .session-actions-row:disabled { cursor: default; opacity: 0.42; }
67
98
  .session-actions-row:disabled:hover { background: transparent; }
68
99
 
@@ -342,7 +342,7 @@
342
342
  flex-shrink: 0;
343
343
  width: 56px;
344
344
  height: 56px;
345
- border-radius: 50%;
345
+ border-radius: 26%;
346
346
  overflow: hidden;
347
347
  border: 1px solid rgba(var(--overlay-rgb), 0.1);
348
348
  background: var(--bg);
@@ -388,8 +388,8 @@
388
388
  <div id="ralph-sticky" class="hidden"></div>
389
389
  <div id="debate-sticky" class="hidden"></div>
390
390
  <div class="status">
391
- <button id="header-session-actions-btn" type="button" aria-label="Session actions" title="Session actions" aria-haspopup="menu" aria-expanded="false">
392
- <i data-lucide="ellipsis"></i>
391
+ <button id="header-session-actions-btn" type="button" aria-label="Session actions" aria-haspopup="menu" aria-expanded="false">
392
+ <i data-lucide="bot"></i><span>Add AI worker</span><i class="session-actions-trigger-chevron" data-lucide="chevron-down"></i>
393
393
  </button>
394
394
  <button type="button" id="header-tui-font-btn" class="header-tui-font-btn hidden" title="Terminal font" aria-label="Terminal font">
395
395
  <i data-lucide="type"></i>
@@ -2282,7 +2282,7 @@
2282
2282
  <script src="https://cdn.jsdelivr.net/npm/@xterm/addon-fit@0/lib/addon-fit.min.js"></script>
2283
2283
  <script src="https://cdn.jsdelivr.net/npm/@xterm/addon-web-links@0/lib/addon-web-links.min.js"></script>
2284
2284
  <script src="https://cdn.jsdelivr.net/npm/@xterm/addon-webgl@0/lib/addon-webgl.min.js"></script>
2285
- <script type="module" src="app.js?v=20260829-terminal-dark1"></script>
2285
+ <script type="module" src="app.js?v=20260829-image-save-details1"></script>
2286
2286
  <div id="pwa-install-modal" class="pwa-modal hidden">
2287
2287
  <div class="pwa-modal-backdrop"></div>
2288
2288
  <div class="pwa-modal-card">
@@ -72,8 +72,8 @@ function createCursorElement(userId, displayName, color, avatarStyle, avatarSeed
72
72
  // Avatar
73
73
  var avatarImg = document.createElement("img");
74
74
  avatarImg.className = "remote-cursor-avatar";
75
- avatarImg.src = avatarCustom ? avatarCustom : avatarUrl(avatarStyle || "thumbs", avatarSeed || userId, 16);
76
- avatarImg.style.cssText = "width:14px;height:14px;border-radius:50%;background:#fff;flex-shrink:0;";
75
+ avatarImg.src = avatarCustom ? avatarCustom : avatarUrl(avatarStyle || "imprint", avatarSeed || userId, 16);
76
+ avatarImg.style.cssText = "width:14px;height:14px;border-radius:4px;background:#fff;flex-shrink:0;";
77
77
  tag.appendChild(avatarImg);
78
78
 
79
79
  // Name label