clay-server 1.0.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 (118) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +283 -0
  3. package/bin/claude-relay.js +6 -0
  4. package/bin/cli.js +2602 -0
  5. package/lib/cli-sessions.js +265 -0
  6. package/lib/config.js +338 -0
  7. package/lib/daemon.js +802 -0
  8. package/lib/ipc.js +124 -0
  9. package/lib/notes.js +121 -0
  10. package/lib/pages.js +1308 -0
  11. package/lib/project.js +3172 -0
  12. package/lib/public/app.js +4795 -0
  13. package/lib/public/apple-touch-icon-dark.png +0 -0
  14. package/lib/public/apple-touch-icon.png +0 -0
  15. package/lib/public/clay-logo.png +0 -0
  16. package/lib/public/css/admin.css +576 -0
  17. package/lib/public/css/base.css +284 -0
  18. package/lib/public/css/diff.css +139 -0
  19. package/lib/public/css/filebrowser.css +1482 -0
  20. package/lib/public/css/highlight.css +144 -0
  21. package/lib/public/css/home-hub.css +455 -0
  22. package/lib/public/css/icon-strip.css +614 -0
  23. package/lib/public/css/input.css +654 -0
  24. package/lib/public/css/loop.css +898 -0
  25. package/lib/public/css/menus.css +823 -0
  26. package/lib/public/css/messages.css +1448 -0
  27. package/lib/public/css/mobile-nav.css +384 -0
  28. package/lib/public/css/overlays.css +893 -0
  29. package/lib/public/css/playbook.css +264 -0
  30. package/lib/public/css/profile.css +268 -0
  31. package/lib/public/css/rewind.css +528 -0
  32. package/lib/public/css/scheduler-modal.css +1429 -0
  33. package/lib/public/css/scheduler.css +1306 -0
  34. package/lib/public/css/server-settings.css +811 -0
  35. package/lib/public/css/sidebar.css +1189 -0
  36. package/lib/public/css/skills.css +789 -0
  37. package/lib/public/css/sticky-notes.css +848 -0
  38. package/lib/public/css/stt.css +155 -0
  39. package/lib/public/css/title-bar.css +517 -0
  40. package/lib/public/favicon-banded-32.png +0 -0
  41. package/lib/public/favicon-banded.png +0 -0
  42. package/lib/public/favicon-dark.svg +1 -0
  43. package/lib/public/favicon.svg +1 -0
  44. package/lib/public/icon-192-dark.png +0 -0
  45. package/lib/public/icon-192.png +0 -0
  46. package/lib/public/icon-512-dark.png +0 -0
  47. package/lib/public/icon-512.png +0 -0
  48. package/lib/public/icon-banded-76.png +0 -0
  49. package/lib/public/icon-banded-96.png +0 -0
  50. package/lib/public/icon-mono.svg +1 -0
  51. package/lib/public/index.html +1437 -0
  52. package/lib/public/manifest.json +27 -0
  53. package/lib/public/modules/admin.js +631 -0
  54. package/lib/public/modules/ascii-logo.js +442 -0
  55. package/lib/public/modules/diff.js +398 -0
  56. package/lib/public/modules/events.js +21 -0
  57. package/lib/public/modules/filebrowser.js +1535 -0
  58. package/lib/public/modules/fileicons.js +172 -0
  59. package/lib/public/modules/icons.js +54 -0
  60. package/lib/public/modules/input.js +661 -0
  61. package/lib/public/modules/markdown.js +378 -0
  62. package/lib/public/modules/notifications.js +548 -0
  63. package/lib/public/modules/playbook.js +578 -0
  64. package/lib/public/modules/profile.js +378 -0
  65. package/lib/public/modules/project-settings.js +901 -0
  66. package/lib/public/modules/qrcode.js +67 -0
  67. package/lib/public/modules/rewind.js +345 -0
  68. package/lib/public/modules/scheduler.js +2833 -0
  69. package/lib/public/modules/server-settings.js +928 -0
  70. package/lib/public/modules/sidebar.js +2264 -0
  71. package/lib/public/modules/skills.js +794 -0
  72. package/lib/public/modules/state.js +3 -0
  73. package/lib/public/modules/sticky-notes.js +1253 -0
  74. package/lib/public/modules/stt.js +272 -0
  75. package/lib/public/modules/terminal.js +736 -0
  76. package/lib/public/modules/theme.js +720 -0
  77. package/lib/public/modules/tools.js +1622 -0
  78. package/lib/public/modules/utils.js +56 -0
  79. package/lib/public/style.css +24 -0
  80. package/lib/public/sw.js +154 -0
  81. package/lib/public/wordmark-banded-20.png +0 -0
  82. package/lib/public/wordmark-banded-32.png +0 -0
  83. package/lib/public/wordmark-banded-64.png +0 -0
  84. package/lib/public/wordmark-banded-80.png +0 -0
  85. package/lib/push.js +130 -0
  86. package/lib/scheduler.js +402 -0
  87. package/lib/sdk-bridge.js +1035 -0
  88. package/lib/server.js +2055 -0
  89. package/lib/sessions.js +552 -0
  90. package/lib/smtp.js +221 -0
  91. package/lib/terminal-manager.js +187 -0
  92. package/lib/terminal.js +24 -0
  93. package/lib/themes/ayu-light.json +9 -0
  94. package/lib/themes/catppuccin-latte.json +9 -0
  95. package/lib/themes/catppuccin-mocha.json +9 -0
  96. package/lib/themes/clay-light.json +10 -0
  97. package/lib/themes/clay.json +10 -0
  98. package/lib/themes/dracula.json +9 -0
  99. package/lib/themes/everforest-light.json +9 -0
  100. package/lib/themes/everforest.json +9 -0
  101. package/lib/themes/github-light.json +9 -0
  102. package/lib/themes/gruvbox-dark.json +9 -0
  103. package/lib/themes/gruvbox-light.json +9 -0
  104. package/lib/themes/monokai.json +9 -0
  105. package/lib/themes/nord-light.json +9 -0
  106. package/lib/themes/nord.json +9 -0
  107. package/lib/themes/one-dark.json +9 -0
  108. package/lib/themes/one-light.json +9 -0
  109. package/lib/themes/rose-pine-dawn.json +9 -0
  110. package/lib/themes/rose-pine.json +9 -0
  111. package/lib/themes/solarized-dark.json +9 -0
  112. package/lib/themes/solarized-light.json +9 -0
  113. package/lib/themes/tokyo-night-light.json +9 -0
  114. package/lib/themes/tokyo-night.json +9 -0
  115. package/lib/updater.js +97 -0
  116. package/lib/users.js +459 -0
  117. package/lib/utils.js +64 -0
  118. package/package.json +56 -0
@@ -0,0 +1,1189 @@
1
+ /* ==========================================================================
2
+ Sidebar
3
+ ========================================================================== */
4
+
5
+ #sidebar-column {
6
+ width: 240px;
7
+ min-width: 192px;
8
+ max-width: 320px;
9
+ background: var(--sidebar-bg);
10
+ transition: width 0.2s ease;
11
+ padding-bottom: 58px;
12
+ }
13
+
14
+ #sidebar {
15
+ flex: 1;
16
+ display: flex;
17
+ flex-direction: column;
18
+ overflow: hidden;
19
+ }
20
+
21
+ #layout.sidebar-collapsed #sidebar-column {
22
+ width: 0;
23
+ min-width: 0;
24
+ overflow: hidden;
25
+ }
26
+
27
+ /* --- Sidebar Header (removed — now in icon-strip + title-bar) --- */
28
+ #sidebar-header {
29
+ display: none;
30
+ }
31
+
32
+ #sidebar-nav {
33
+ display: flex;
34
+ flex-direction: column;
35
+ padding: 8px 8px 4px;
36
+ flex-shrink: 0;
37
+ }
38
+
39
+ /* --- Project List --- */
40
+ #project-list-section {
41
+ padding: 0 4px;
42
+ margin-bottom: 4px;
43
+ border-bottom: 1px solid var(--border-subtle);
44
+ }
45
+
46
+ #project-list-header {
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: space-between;
50
+ padding: 8px 8px 6px;
51
+ }
52
+
53
+ .project-list-title {
54
+ font-size: 11px;
55
+ font-weight: 600;
56
+ color: var(--text-dimmer);
57
+ text-transform: uppercase;
58
+ letter-spacing: 0.5px;
59
+ }
60
+
61
+ #project-list-add {
62
+ display: flex;
63
+ align-items: center;
64
+ justify-content: center;
65
+ width: 22px;
66
+ height: 22px;
67
+ border: none;
68
+ background: transparent;
69
+ color: var(--text-dimmer);
70
+ cursor: pointer;
71
+ border-radius: 6px;
72
+ transition: background 0.15s, color 0.15s;
73
+ }
74
+
75
+ #project-list-add:hover {
76
+ background: var(--sidebar-hover);
77
+ color: var(--text);
78
+ }
79
+
80
+ #project-list-add .lucide {
81
+ width: 14px;
82
+ height: 14px;
83
+ }
84
+
85
+ #project-list {
86
+ padding: 0 0 6px;
87
+ overflow-y: auto;
88
+ max-height: 200px;
89
+ }
90
+
91
+ .project-list-item {
92
+ display: flex;
93
+ align-items: center;
94
+ gap: 10px;
95
+ padding: 7px 8px 7px 10px;
96
+ cursor: pointer;
97
+ font-size: 13px;
98
+ color: var(--text-muted);
99
+ text-decoration: none;
100
+ transition: background 0.15s, color 0.15s;
101
+ border-left: 3px solid transparent;
102
+ border-radius: 0 6px 6px 0;
103
+ }
104
+
105
+ .project-list-item:hover {
106
+ background: rgba(var(--overlay-rgb), 0.05);
107
+ color: var(--text-secondary);
108
+ }
109
+
110
+ .project-list-item.current {
111
+ background: var(--accent-8);
112
+ border-left-color: var(--accent);
113
+ color: var(--text);
114
+ }
115
+
116
+ .project-list-item.current .pd-name {
117
+ font-weight: 600;
118
+ }
119
+
120
+ .pd-name {
121
+ flex: 1;
122
+ font-size: 13px;
123
+ overflow: hidden;
124
+ text-overflow: ellipsis;
125
+ white-space: nowrap;
126
+ }
127
+
128
+ .pd-count {
129
+ font-size: 12px;
130
+ color: var(--text-dimmer);
131
+ flex-shrink: 0;
132
+ font-variant-numeric: tabular-nums;
133
+ }
134
+
135
+ .pd-indicator {
136
+ width: 6px;
137
+ height: 6px;
138
+ border-radius: 50%;
139
+ flex-shrink: 0;
140
+ }
141
+
142
+ .pd-indicator.active {
143
+ background: var(--accent);
144
+ }
145
+
146
+ .pd-indicator.inactive {
147
+ background: var(--text-dimmer);
148
+ opacity: 0.4;
149
+ }
150
+
151
+ .pd-remove {
152
+ display: none;
153
+ background: none;
154
+ border: none;
155
+ color: var(--text-muted);
156
+ cursor: pointer;
157
+ padding: 2px;
158
+ border-radius: 4px;
159
+ flex-shrink: 0;
160
+ line-height: 0;
161
+ transition: color 0.15s, background 0.15s;
162
+ }
163
+
164
+ .pd-remove .lucide { width: 14px; height: 14px; }
165
+ .project-list-item:hover .pd-remove { display: block; }
166
+ .pd-remove:hover { color: var(--error); background: rgba(var(--overlay-rgb), 0.06); }
167
+
168
+ /* --- Project Hint (single-project onboarding) --- */
169
+ #project-hint {
170
+ padding: 8px 10px;
171
+ margin: 0 4px 4px;
172
+ display: flex;
173
+ align-items: flex-start;
174
+ gap: 6px;
175
+ border-radius: 8px;
176
+ background: var(--accent-12);
177
+ border: 1px solid var(--accent-20);
178
+ }
179
+
180
+ #project-hint.hidden {
181
+ display: none;
182
+ }
183
+
184
+ .project-hint-text {
185
+ font-size: 11px;
186
+ color: var(--accent);
187
+ line-height: 1.5;
188
+ }
189
+
190
+ .project-hint-text code {
191
+ background: var(--accent-15);
192
+ padding: 1px 5px;
193
+ border-radius: 3px;
194
+ font-family: "Roboto Mono", monospace;
195
+ font-size: 10.5px;
196
+ color: var(--accent-hover);
197
+ }
198
+
199
+ #project-hint-dismiss {
200
+ background: none;
201
+ border: none;
202
+ color: var(--accent);
203
+ cursor: pointer;
204
+ padding: 1px;
205
+ flex-shrink: 0;
206
+ display: flex;
207
+ align-items: center;
208
+ opacity: 0.6;
209
+ transition: opacity 0.15s;
210
+ }
211
+
212
+ #project-hint-dismiss:hover {
213
+ opacity: 1;
214
+ }
215
+
216
+ #project-hint-dismiss .lucide {
217
+ width: 12px;
218
+ height: 12px;
219
+ }
220
+
221
+ /* sidebar-toggle-btn hidden — collapse handled by icon strip / title bar */
222
+ #sidebar-toggle-btn {
223
+ display: none;
224
+ }
225
+
226
+ /* --- Sidebar section headers --- */
227
+ .sidebar-section-header {
228
+ padding: 8px 12px 4px;
229
+ }
230
+
231
+ .sidebar-section-title {
232
+ font-size: 11px;
233
+ font-weight: 600;
234
+ color: var(--text-dimmer);
235
+ text-transform: uppercase;
236
+ letter-spacing: 0.5px;
237
+ }
238
+
239
+ /* --- Tools section --- */
240
+ #sidebar-tools {
241
+ flex-shrink: 0;
242
+ border-bottom: 1px solid var(--border-subtle);
243
+ padding-top: 8px;
244
+ padding-bottom: 4px;
245
+ }
246
+
247
+ /* --- Sessions header (pinned above scroll) --- */
248
+ #sidebar-sessions-header {
249
+ flex-shrink: 0;
250
+ }
251
+
252
+ .session-list-header {
253
+ display: flex;
254
+ align-items: center;
255
+ justify-content: space-between;
256
+ padding: 8px 8px 4px 12px;
257
+ font-size: 11px;
258
+ font-weight: 600;
259
+ color: var(--text-dimmer);
260
+ text-transform: uppercase;
261
+ letter-spacing: 0.5px;
262
+ }
263
+
264
+ .session-list-header-actions {
265
+ display: flex;
266
+ align-items: center;
267
+ gap: 2px;
268
+ }
269
+
270
+ .session-list-header-actions button:not(.new-ralph-pill) {
271
+ display: flex;
272
+ align-items: center;
273
+ justify-content: center;
274
+ width: 22px;
275
+ height: 22px;
276
+ border-radius: 6px;
277
+ border: none;
278
+ background: transparent;
279
+ color: var(--text-dimmer);
280
+ cursor: pointer;
281
+ padding: 0;
282
+ transition: color 0.15s, background 0.15s;
283
+ }
284
+
285
+ .session-list-header-actions button:not(.new-ralph-pill) .lucide { width: 14px; height: 14px; }
286
+ .session-list-header-actions button:not(.new-ralph-pill):hover { color: var(--text); background: var(--sidebar-hover); }
287
+
288
+ /* --- Session search --- */
289
+ #session-search {
290
+ padding: 0 12px 8px;
291
+ position: relative;
292
+ }
293
+
294
+ #session-search.hidden {
295
+ display: none;
296
+ }
297
+
298
+ #session-search-input {
299
+ width: 100%;
300
+ padding: 7px 28px 7px 10px;
301
+ border-radius: 8px;
302
+ border: 1px solid var(--border);
303
+ background: var(--input-bg);
304
+ color: var(--text);
305
+ font-size: 13px;
306
+ font-family: inherit;
307
+ outline: none;
308
+ transition: border-color 0.15s;
309
+ box-sizing: border-box;
310
+ }
311
+
312
+ #session-search-input:focus {
313
+ border-color: var(--accent);
314
+ }
315
+
316
+ #session-search-input::placeholder {
317
+ color: var(--text-dimmer);
318
+ }
319
+
320
+ #session-search-clear {
321
+ position: absolute;
322
+ right: 16px;
323
+ top: calc(50% - 4px);
324
+ transform: translateY(-50%);
325
+ display: flex;
326
+ align-items: center;
327
+ justify-content: center;
328
+ width: 20px;
329
+ height: 20px;
330
+ border: none;
331
+ background: transparent;
332
+ color: var(--text-dimmer);
333
+ cursor: pointer;
334
+ padding: 0;
335
+ border-radius: 4px;
336
+ transition: color 0.15s, background 0.15s;
337
+ }
338
+
339
+ #session-search-clear .lucide { width: 14px; height: 14px; }
340
+ #session-search-clear:hover { color: var(--text); background: var(--sidebar-hover); }
341
+
342
+ #search-session-btn.active {
343
+ color: var(--accent);
344
+ }
345
+
346
+ .session-item.search-match {
347
+ background: var(--accent-12);
348
+ color: var(--text);
349
+ }
350
+
351
+ .session-item.search-match .session-item-text {
352
+ color: var(--accent);
353
+ }
354
+
355
+ .session-item.search-dimmed {
356
+ opacity: 0.35;
357
+ }
358
+
359
+ .session-highlight {
360
+ background: var(--accent-30);
361
+ color: var(--text);
362
+ border-radius: 2px;
363
+ padding: 0 1px;
364
+ }
365
+
366
+ /* --- Search hit timeline (right-side markers) --- */
367
+ .search-timeline {
368
+ position: absolute;
369
+ right: 8px;
370
+ z-index: 10;
371
+ pointer-events: none;
372
+ }
373
+
374
+ .search-blink {
375
+ animation: searchBlink 0.4s ease-in-out 3;
376
+ }
377
+
378
+ @keyframes searchBlink {
379
+ 0%, 100% { box-shadow: none; }
380
+ 50% { box-shadow: 0 0 0 2px var(--accent); border-radius: 12px; }
381
+ }
382
+
383
+ #session-list {
384
+ padding: 2px 8px;
385
+ }
386
+
387
+ .session-group-header {
388
+ padding: 10px 12px 4px;
389
+ font-size: 11px;
390
+ font-weight: 600;
391
+ color: var(--text-dimmer);
392
+ letter-spacing: 0.3px;
393
+ }
394
+
395
+ /* --- Schedule countdown items --- */
396
+ .session-countdown-group {
397
+ padding: 4px 0 8px;
398
+ border-bottom: 1px solid var(--border-subtle, var(--border));
399
+ margin-bottom: 4px;
400
+ }
401
+
402
+ .session-countdown-item {
403
+ display: flex;
404
+ align-items: center;
405
+ gap: 8px;
406
+ padding: 6px 12px;
407
+ border-radius: 10px;
408
+ font-size: 13px;
409
+ color: var(--text-muted);
410
+ cursor: default;
411
+ pointer-events: none;
412
+ border-left: 3px solid var(--accent);
413
+ margin: 2px 8px;
414
+ background: color-mix(in srgb, var(--accent) 6%, transparent);
415
+ animation: countdown-pulse 2s ease-in-out infinite;
416
+ }
417
+
418
+ .session-countdown-name {
419
+ flex: 1;
420
+ overflow: hidden;
421
+ text-overflow: ellipsis;
422
+ white-space: nowrap;
423
+ min-width: 0;
424
+ font-weight: 500;
425
+ }
426
+
427
+ .session-countdown-badge {
428
+ font-size: 12px;
429
+ font-weight: 700;
430
+ font-variant-numeric: tabular-nums;
431
+ color: var(--accent);
432
+ flex-shrink: 0;
433
+ }
434
+
435
+ @keyframes countdown-pulse {
436
+ 0%, 100% { opacity: 1; }
437
+ 50% { opacity: 0.7; }
438
+ }
439
+
440
+ .session-item {
441
+ position: relative;
442
+ display: flex;
443
+ align-items: center;
444
+ gap: 4px;
445
+ padding: 0 36px 0 12px;
446
+ height: 34px;
447
+ border-radius: 10px;
448
+ cursor: pointer;
449
+ font-size: 13px;
450
+ font-weight: 600;
451
+ color: var(--text-muted);
452
+ margin-bottom: 0;
453
+ transition: background 0.35s ease, color 0.35s ease;
454
+ contain: size layout;
455
+ }
456
+
457
+ .session-item-text {
458
+ flex: 1;
459
+ overflow: hidden;
460
+ text-overflow: ellipsis;
461
+ white-space: nowrap;
462
+ min-width: 0;
463
+ }
464
+
465
+ .session-item:hover {
466
+ background: var(--sidebar-hover);
467
+ color: var(--text-secondary);
468
+ }
469
+
470
+ .session-item.active {
471
+ background: var(--sidebar-active);
472
+ color: var(--text);
473
+ font-weight: 600;
474
+ }
475
+
476
+ .session-item .session-processing {
477
+ display: inline-block;
478
+ width: 6px;
479
+ height: 6px;
480
+ border-radius: 50%;
481
+ background: var(--success);
482
+ margin-right: 8px;
483
+ vertical-align: middle;
484
+ }
485
+
486
+ /* IO blink on session processing dot */
487
+ .session-item .session-processing.io {
488
+ background: #fff !important;
489
+ box-shadow: 0 0 4px var(--success);
490
+ }
491
+
492
+ .session-more-btn {
493
+ position: absolute;
494
+ right: 8px;
495
+ top: 50%;
496
+ transform: translateY(-50%);
497
+ display: flex;
498
+ width: 24px;
499
+ height: 24px;
500
+ border-radius: 6px;
501
+ border: none;
502
+ background: transparent;
503
+ color: var(--text-muted);
504
+ cursor: pointer;
505
+ align-items: center;
506
+ justify-content: center;
507
+ padding: 0;
508
+ opacity: 0;
509
+ transition: opacity 0.35s ease, color 0.15s, background 0.15s;
510
+ }
511
+
512
+ .session-more-btn .lucide,
513
+ .session-more-btn svg { width: 14px; height: 14px; display: block; }
514
+ .session-item:hover .session-more-btn,
515
+ .session-loop-group:hover .session-more-btn { opacity: 1; }
516
+ .session-more-btn:hover { color: var(--text); background: rgba(var(--overlay-rgb), 0.06); }
517
+
518
+ /* --- Session presence avatars (multi-user) --- */
519
+ .session-presence {
520
+ display: flex;
521
+ align-items: center;
522
+ flex-shrink: 0;
523
+ margin-right: 2px;
524
+ }
525
+
526
+ .session-presence-avatar {
527
+ width: 18px;
528
+ height: 18px;
529
+ border-radius: 50%;
530
+ border: 1.5px solid var(--sidebar-bg);
531
+ background: var(--bg-alt);
532
+ object-fit: cover;
533
+ transition: filter 0.15s;
534
+ }
535
+
536
+ .session-presence-avatar:hover {
537
+ filter: brightness(1.3);
538
+ }
539
+
540
+ .session-presence-more {
541
+ font-size: 9px;
542
+ font-weight: 600;
543
+ color: var(--text-dimmer);
544
+ margin-left: 2px;
545
+ }
546
+
547
+ /* --- Session context menu --- */
548
+ .session-ctx-menu {
549
+ position: fixed;
550
+ background: var(--sidebar-bg);
551
+ border: 1px solid var(--border);
552
+ border-radius: 10px;
553
+ padding: 4px 0;
554
+ min-width: 140px;
555
+ box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.4);
556
+ z-index: 9999;
557
+ }
558
+
559
+ .session-ctx-item {
560
+ display: flex;
561
+ align-items: center;
562
+ gap: 8px;
563
+ width: 100%;
564
+ padding: 8px 12px;
565
+ font-size: 13px;
566
+ color: var(--text-secondary);
567
+ background: none;
568
+ border: none;
569
+ font-family: inherit;
570
+ cursor: pointer;
571
+ transition: background 0.15s;
572
+ }
573
+
574
+ .session-ctx-item .lucide { width: 14px; height: 14px; flex-shrink: 0; }
575
+ .session-ctx-item:hover { background: rgba(var(--overlay-rgb), 0.05); }
576
+
577
+ .session-ctx-item.session-ctx-delete { color: var(--error); }
578
+ .session-ctx-item.session-ctx-delete:hover { background: var(--error-8); }
579
+
580
+ /* --- Session inline rename --- */
581
+ .session-rename-input {
582
+ width: 100%;
583
+ background: var(--input-bg);
584
+ border: 1px solid var(--text-dimmer);
585
+ border-radius: 6px;
586
+ color: var(--text);
587
+ font-size: 13px;
588
+ font-family: inherit;
589
+ padding: 2px 6px;
590
+ outline: none;
591
+ }
592
+
593
+ /* --- Session loop groups --- */
594
+ .session-loop-wrapper {
595
+ margin-bottom: 0;
596
+ }
597
+
598
+ .session-loop-group {
599
+ position: relative;
600
+ display: flex;
601
+ align-items: center;
602
+ gap: 2px;
603
+ padding: 0 36px 0 4px;
604
+ height: 34px;
605
+ border-radius: 10px;
606
+ cursor: pointer;
607
+ font-size: 13px;
608
+ font-weight: 600;
609
+ color: var(--text-muted);
610
+ transition: background 0.35s ease, color 0.35s ease;
611
+ }
612
+
613
+ .session-loop-group:hover {
614
+ background: var(--sidebar-hover);
615
+ color: var(--text-secondary);
616
+ }
617
+
618
+ .session-loop-group.active {
619
+ background: var(--sidebar-active);
620
+ color: var(--text);
621
+ }
622
+ .session-loop-group.scheduled .session-processing {
623
+ background: var(--success, #27ae60);
624
+ }
625
+
626
+ .session-loop-group .session-item-text {
627
+ flex: 1;
628
+ overflow: hidden;
629
+ text-overflow: ellipsis;
630
+ white-space: nowrap;
631
+ min-width: 0;
632
+ display: flex;
633
+ align-items: center;
634
+ gap: 5px;
635
+ }
636
+
637
+ .session-loop-group .session-processing {
638
+ display: inline-block;
639
+ width: 6px;
640
+ height: 6px;
641
+ border-radius: 50%;
642
+ background: var(--success);
643
+ flex-shrink: 0;
644
+ }
645
+
646
+ .session-loop-icon {
647
+ display: inline-flex;
648
+ color: var(--accent);
649
+ flex-shrink: 0;
650
+ }
651
+ .session-loop-icon.scheduled { color: var(--success, #27ae60); }
652
+ .session-loop-icon .lucide { width: 13px; height: 13px; }
653
+
654
+ .session-loop-name {
655
+ overflow: hidden;
656
+ text-overflow: ellipsis;
657
+ white-space: nowrap;
658
+ min-width: 0;
659
+ }
660
+
661
+ .session-loop-count {
662
+ flex-shrink: 0;
663
+ font-size: 10px;
664
+ font-weight: 600;
665
+ color: var(--text-dimmer);
666
+ background: rgba(var(--overlay-rgb), 0.08);
667
+ padding: 1px 6px;
668
+ border-radius: 8px;
669
+ margin-left: auto;
670
+ }
671
+ .session-loop-count.scheduled {
672
+ color: var(--success, #27ae60);
673
+ background: color-mix(in srgb, var(--success, #27ae60) 12%, transparent);
674
+ }
675
+
676
+ /* Chevron */
677
+ .session-loop-chevron {
678
+ display: flex;
679
+ align-items: center;
680
+ justify-content: center;
681
+ width: 22px;
682
+ height: 22px;
683
+ border: none;
684
+ background: transparent;
685
+ color: var(--text-dimmer);
686
+ cursor: pointer;
687
+ padding: 0;
688
+ border-radius: 4px;
689
+ flex-shrink: 0;
690
+ transition: color 0.15s, transform 0.2s ease;
691
+ }
692
+ .session-loop-chevron .lucide { width: 14px; height: 14px; }
693
+ .session-loop-chevron:hover { color: var(--text); }
694
+ .session-loop-group.expanded .session-loop-chevron { transform: rotate(90deg); }
695
+
696
+ /* Children container */
697
+ .session-loop-children {
698
+ position: relative;
699
+ margin-left: 15px;
700
+ padding: 2px 0 2px 0;
701
+ border-left: 1.5px solid var(--border-subtle);
702
+ }
703
+
704
+ .session-loop-child {
705
+ position: relative;
706
+ display: flex;
707
+ align-items: center;
708
+ gap: 4px;
709
+ padding: 0 12px 0 14px;
710
+ height: 28px;
711
+ border-radius: 0 8px 8px 0;
712
+ cursor: pointer;
713
+ font-size: 12px;
714
+ font-weight: 500;
715
+ color: var(--text-muted);
716
+ transition: background 0.2s ease, color 0.2s ease;
717
+ }
718
+
719
+ /* Small horizontal tick connecting to vertical line */
720
+ .session-loop-child::before {
721
+ content: "";
722
+ position: absolute;
723
+ left: 0;
724
+ top: 50%;
725
+ width: 8px;
726
+ height: 0;
727
+ border-top: 1.5px solid var(--border-subtle);
728
+ }
729
+
730
+ .session-loop-child:hover {
731
+ background: var(--sidebar-hover);
732
+ color: var(--text-secondary);
733
+ }
734
+
735
+ .session-loop-child.active {
736
+ background: var(--sidebar-active);
737
+ color: var(--text);
738
+ }
739
+
740
+ .session-loop-child .session-item-text {
741
+ flex: 1;
742
+ overflow: hidden;
743
+ text-overflow: ellipsis;
744
+ white-space: nowrap;
745
+ min-width: 0;
746
+ display: flex;
747
+ align-items: center;
748
+ gap: 4px;
749
+ }
750
+
751
+ .session-loop-child .session-processing {
752
+ display: inline-block;
753
+ width: 5px;
754
+ height: 5px;
755
+ border-radius: 50%;
756
+ background: var(--success);
757
+ flex-shrink: 0;
758
+ }
759
+
760
+ .session-loop-role-badge {
761
+ display: inline-flex;
762
+ align-items: center;
763
+ font-size: 10px;
764
+ font-weight: 600;
765
+ color: var(--text-dimmer);
766
+ background: rgba(var(--overlay-rgb), 0.06);
767
+ padding: 1px 8px;
768
+ border-radius: 6px;
769
+ letter-spacing: 0.2px;
770
+ }
771
+ .session-loop-role-badge.crafting {
772
+ color: var(--accent);
773
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
774
+ }
775
+ .session-loop-role-badge.scheduled {
776
+ color: var(--success, #27ae60);
777
+ background: color-mix(in srgb, var(--success, #27ae60) 10%, transparent);
778
+ }
779
+
780
+ .session-loop-badge {
781
+ flex-shrink: 0;
782
+ font-size: 10px;
783
+ font-weight: 600;
784
+ padding: 1px 6px;
785
+ border-radius: 8px;
786
+ margin-left: auto;
787
+ }
788
+ .session-loop-badge.crafting {
789
+ color: var(--accent);
790
+ background: var(--accent-12, rgba(108, 92, 231, 0.12));
791
+ }
792
+
793
+ /* --- New Ralph Loop pill button --- */
794
+ .new-ralph-pill {
795
+ display: inline-flex;
796
+ align-items: center;
797
+ justify-content: center;
798
+ gap: 3px;
799
+ height: 22px;
800
+ padding: 0 8px;
801
+ border: 1px solid var(--accent);
802
+ border-radius: 6px;
803
+ background: var(--accent-12, rgba(108, 92, 231, 0.12));
804
+ color: var(--accent);
805
+ font-size: 10px;
806
+ font-weight: 700;
807
+ font-family: inherit;
808
+ letter-spacing: 0.2px;
809
+ cursor: pointer;
810
+ white-space: nowrap;
811
+ transition: background 0.15s, color 0.15s;
812
+ }
813
+
814
+ .new-ralph-pill .lucide {
815
+ width: 10px;
816
+ height: 10px;
817
+ }
818
+
819
+ .new-ralph-pill + button {
820
+ margin-left: 4px;
821
+ }
822
+
823
+ .new-ralph-pill:hover {
824
+ background: var(--accent);
825
+ color: #fff;
826
+ }
827
+
828
+ @media (hover: none) {
829
+ .session-more-btn { opacity: 1; }
830
+ .msg-copy-hint { opacity: 1; }
831
+ .msg-user[data-uuid] .bubble::after { display: none; }
832
+ .mermaid-diagram::after { display: none; }
833
+ }
834
+
835
+ /* --- User Island (bottom bar spanning icon strip + sidebar) --- */
836
+ #user-island {
837
+ position: absolute;
838
+ bottom: 8px;
839
+ left: 8px;
840
+ width: calc(72px + 240px - 16px);
841
+ height: 58px;
842
+ display: flex;
843
+ align-items: center;
844
+ background: var(--bg);
845
+ padding: 0 8px 0 0;
846
+ gap: 0;
847
+ z-index: 15;
848
+ border-radius: 10px;
849
+ }
850
+
851
+ #user-island::before {
852
+ content: "";
853
+ position: absolute;
854
+ top: 100%;
855
+ left: -8px;
856
+ right: -8px;
857
+ height: 8px;
858
+ background: var(--sidebar-bg);
859
+ }
860
+
861
+ .user-island-profile {
862
+ display: flex;
863
+ align-items: center;
864
+ flex: 1;
865
+ min-width: 0;
866
+ padding: 6px;
867
+ border-radius: 8px;
868
+ cursor: pointer;
869
+ transition: background 0.15s;
870
+ }
871
+
872
+ .user-island-profile:hover {
873
+ background: var(--sidebar-hover);
874
+ }
875
+
876
+ .user-island-avatar {
877
+ width: 36px;
878
+ height: 36px;
879
+ flex-shrink: 0;
880
+ display: flex;
881
+ align-items: center;
882
+ justify-content: center;
883
+ }
884
+
885
+ .user-island-avatar img {
886
+ width: 32px;
887
+ height: 32px;
888
+ border-radius: 50%;
889
+ }
890
+
891
+ .user-island-avatar-letter {
892
+ width: 32px;
893
+ height: 32px;
894
+ border-radius: 50%;
895
+ background: var(--success);
896
+ color: #fff;
897
+ font-family: "Pretendard", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
898
+ font-size: 15px;
899
+ font-weight: 800;
900
+ display: flex;
901
+ align-items: center;
902
+ justify-content: center;
903
+ flex-shrink: 0;
904
+ }
905
+
906
+ .user-island-info {
907
+ flex: 1;
908
+ min-width: 0;
909
+ overflow: hidden;
910
+ margin-left: 8px;
911
+ }
912
+
913
+ .user-island-name {
914
+ font-family: "Pretendard", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
915
+ font-size: 14px;
916
+ font-weight: 700;
917
+ color: var(--text);
918
+ white-space: nowrap;
919
+ overflow: hidden;
920
+ text-overflow: ellipsis;
921
+ display: block;
922
+ }
923
+
924
+ .user-island-cta {
925
+ font-size: 11px;
926
+ color: var(--accent, #7c3aed);
927
+ cursor: pointer;
928
+ white-space: nowrap;
929
+ overflow: hidden;
930
+ text-overflow: ellipsis;
931
+ display: block;
932
+ line-height: 1.2;
933
+ }
934
+
935
+ .user-island-cta.hidden {
936
+ display: none;
937
+ }
938
+
939
+ .user-island-cta:hover {
940
+ text-decoration: underline;
941
+ }
942
+
943
+ .user-island-actions {
944
+ display: flex;
945
+ align-items: center;
946
+ gap: 2px;
947
+ flex-shrink: 0;
948
+ }
949
+
950
+ .user-island-actions button {
951
+ width: 32px;
952
+ height: 32px;
953
+ border-radius: 6px;
954
+ border: none;
955
+ background: transparent;
956
+ color: var(--text-muted);
957
+ cursor: pointer;
958
+ display: flex;
959
+ align-items: center;
960
+ justify-content: center;
961
+ transition: background 0.15s, color 0.15s;
962
+ }
963
+
964
+ .user-island-actions button .lucide {
965
+ width: 16px;
966
+ height: 16px;
967
+ }
968
+
969
+ .user-island-actions button:hover {
970
+ background: var(--sidebar-hover);
971
+ color: var(--text-secondary);
972
+ }
973
+
974
+ #layout.sidebar-collapsed #user-island .user-island-info,
975
+ #layout.sidebar-collapsed #user-island .user-island-actions {
976
+ display: none;
977
+ }
978
+
979
+
980
+ .footer-version {
981
+ font-size: 11px;
982
+ color: var(--text-dimmer);
983
+ font-weight: 400;
984
+ }
985
+
986
+
987
+ .sidebar-menu-item.has-badge { position: relative; }
988
+ .sidebar-menu-item .menu-badge {
989
+ margin-left: auto;
990
+ font-size: 11px;
991
+ font-weight: 600;
992
+ color: var(--success);
993
+ }
994
+
995
+ /* --- Sidebar overlay (mobile) --- */
996
+ #sidebar-overlay {
997
+ display: none;
998
+ position: fixed;
999
+ inset: 0;
1000
+ background: rgba(var(--shadow-rgb), 0.6);
1001
+ z-index: 99;
1002
+ backdrop-filter: blur(2px);
1003
+ -webkit-backdrop-filter: blur(2px);
1004
+ }
1005
+
1006
+ #sidebar-overlay.visible { display: block; }
1007
+
1008
+ /* --- Sidebar expand (desktop collapsed) --- */
1009
+ #sidebar-expand-btn {
1010
+ display: none;
1011
+ background: none;
1012
+ border: none;
1013
+ color: var(--text-secondary);
1014
+ cursor: pointer;
1015
+ padding: 4px;
1016
+ margin-right: 10px;
1017
+ flex-shrink: 0;
1018
+ align-items: center;
1019
+ justify-content: center;
1020
+ transition: color 0.15s;
1021
+ }
1022
+
1023
+ #sidebar-expand-btn .lucide {
1024
+ width: 20px;
1025
+ height: 20px;
1026
+ }
1027
+
1028
+ #sidebar-expand-btn:hover {
1029
+ color: var(--text);
1030
+ }
1031
+
1032
+ #layout.sidebar-collapsed #sidebar-expand-btn {
1033
+ display: flex;
1034
+ }
1035
+
1036
+ /* --- Hamburger --- */
1037
+ #hamburger-btn {
1038
+ display: none;
1039
+ background: none;
1040
+ border: none;
1041
+ color: var(--text-secondary);
1042
+ cursor: pointer;
1043
+ padding: 4px;
1044
+ margin-right: 10px;
1045
+ flex-shrink: 0;
1046
+ }
1047
+
1048
+ #hamburger-btn .lucide {
1049
+ width: 20px;
1050
+ height: 20px;
1051
+ }
1052
+
1053
+ /* --- Theme picker --- */
1054
+ .theme-picker {
1055
+ position: fixed;
1056
+ background: var(--bg-alt);
1057
+ border: 1px solid var(--border);
1058
+ border-radius: 12px;
1059
+ padding: 0;
1060
+ min-width: 220px;
1061
+ max-height: 70vh;
1062
+ overflow-y: auto;
1063
+ box-shadow: 0 8px 32px rgba(var(--shadow-rgb), 0.5);
1064
+ z-index: 200;
1065
+ opacity: 0;
1066
+ transform: translateY(8px);
1067
+ pointer-events: none;
1068
+ transition: opacity 0.15s, transform 0.15s;
1069
+ }
1070
+
1071
+ .theme-picker.visible {
1072
+ opacity: 1;
1073
+ transform: translateY(0);
1074
+ pointer-events: auto;
1075
+ }
1076
+
1077
+ .theme-picker-header {
1078
+ padding: 8px 14px 4px;
1079
+ font-size: 11px;
1080
+ font-weight: 600;
1081
+ color: var(--text-dimmer);
1082
+ text-transform: uppercase;
1083
+ letter-spacing: 0.5px;
1084
+ position: sticky;
1085
+ top: 0;
1086
+ background: var(--bg-alt);
1087
+ z-index: 1;
1088
+ }
1089
+
1090
+ .theme-picker-section {
1091
+ padding-bottom: 4px;
1092
+ }
1093
+
1094
+ .theme-picker-item {
1095
+ display: flex;
1096
+ align-items: center;
1097
+ gap: 10px;
1098
+ width: 100%;
1099
+ padding: 7px 14px;
1100
+ border: none;
1101
+ background: none;
1102
+ color: var(--text-secondary);
1103
+ font-family: inherit;
1104
+ font-size: 13px;
1105
+ cursor: pointer;
1106
+ transition: background 0.15s;
1107
+ }
1108
+
1109
+ .theme-picker-item:hover {
1110
+ background: rgba(var(--overlay-rgb), 0.05);
1111
+ }
1112
+
1113
+ .theme-picker-item.active {
1114
+ color: var(--text);
1115
+ }
1116
+
1117
+ .theme-swatches {
1118
+ display: flex;
1119
+ gap: 3px;
1120
+ flex-shrink: 0;
1121
+ }
1122
+
1123
+ .theme-swatch {
1124
+ width: 12px;
1125
+ height: 12px;
1126
+ border-radius: 3px;
1127
+ border: 1px solid rgba(var(--overlay-rgb), 0.1);
1128
+ }
1129
+
1130
+ .theme-picker-label {
1131
+ flex: 1;
1132
+ text-align: left;
1133
+ }
1134
+
1135
+ .theme-picker-check {
1136
+ font-size: 14px;
1137
+ color: var(--accent);
1138
+ opacity: 0;
1139
+ flex-shrink: 0;
1140
+ }
1141
+
1142
+ .theme-picker-item.active .theme-picker-check {
1143
+ opacity: 1;
1144
+ }
1145
+
1146
+ /* --- Sidebar resize handle (overlay, no layout space) --- */
1147
+ #sidebar-resize-handle {
1148
+ position: absolute;
1149
+ top: 0;
1150
+ bottom: 0;
1151
+ width: 8px;
1152
+ margin-left: -4px;
1153
+ cursor: col-resize;
1154
+ z-index: 10;
1155
+ }
1156
+
1157
+ #sidebar-resize-handle::before {
1158
+ content: "";
1159
+ position: absolute;
1160
+ top: 0;
1161
+ bottom: 0;
1162
+ left: 50%;
1163
+ width: 2px;
1164
+ margin-left: -1px;
1165
+ background: var(--accent);
1166
+ opacity: 0;
1167
+ transition: opacity 0.2s;
1168
+ }
1169
+
1170
+ #sidebar-resize-handle:hover::before,
1171
+ #sidebar-resize-handle.dragging::before {
1172
+ opacity: 1;
1173
+ }
1174
+
1175
+ /* Hide resize handle when sidebar is collapsed */
1176
+ #layout.sidebar-collapsed #sidebar-resize-handle {
1177
+ display: none;
1178
+ }
1179
+
1180
+ @media (max-width: 768px) {
1181
+ #sidebar-resize-handle {
1182
+ display: none;
1183
+ }
1184
+
1185
+ #user-island {
1186
+ display: none;
1187
+ }
1188
+ }
1189
+