claude-relay 2.3.1 → 2.4.0

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 (52) hide show
  1. package/README.md +20 -5
  2. package/bin/cli.js +206 -8
  3. package/lib/cli-sessions.js +270 -0
  4. package/lib/daemon.js +40 -0
  5. package/lib/project.js +121 -1
  6. package/lib/public/app.js +385 -76
  7. package/lib/public/css/base.css +41 -7
  8. package/lib/public/css/diff.css +6 -6
  9. package/lib/public/css/filebrowser.css +34 -54
  10. package/lib/public/css/highlight.css +144 -0
  11. package/lib/public/css/input.css +9 -9
  12. package/lib/public/css/menus.css +82 -23
  13. package/lib/public/css/messages.css +178 -34
  14. package/lib/public/css/overlays.css +166 -50
  15. package/lib/public/css/rewind.css +17 -17
  16. package/lib/public/css/sidebar.css +210 -137
  17. package/lib/public/index.html +73 -40
  18. package/lib/public/modules/filebrowser.js +2 -1
  19. package/lib/public/modules/markdown.js +10 -10
  20. package/lib/public/modules/notifications.js +38 -1
  21. package/lib/public/modules/sidebar.js +109 -31
  22. package/lib/public/modules/terminal.js +11 -23
  23. package/lib/public/modules/theme.js +622 -0
  24. package/lib/public/modules/tools.js +245 -4
  25. package/lib/public/modules/utils.js +21 -5
  26. package/lib/public/style.css +1 -0
  27. package/lib/sdk-bridge.js +95 -0
  28. package/lib/server.js +41 -0
  29. package/lib/sessions.js +16 -3
  30. package/lib/themes/ayu-light.json +9 -0
  31. package/lib/themes/catppuccin-latte.json +9 -0
  32. package/lib/themes/catppuccin-mocha.json +9 -0
  33. package/lib/themes/claude-light.json +9 -0
  34. package/lib/themes/claude.json +9 -0
  35. package/lib/themes/dracula.json +9 -0
  36. package/lib/themes/everforest-light.json +9 -0
  37. package/lib/themes/everforest.json +9 -0
  38. package/lib/themes/github-light.json +9 -0
  39. package/lib/themes/gruvbox-dark.json +9 -0
  40. package/lib/themes/gruvbox-light.json +9 -0
  41. package/lib/themes/monokai.json +9 -0
  42. package/lib/themes/nord-light.json +9 -0
  43. package/lib/themes/nord.json +9 -0
  44. package/lib/themes/one-dark.json +9 -0
  45. package/lib/themes/one-light.json +9 -0
  46. package/lib/themes/rose-pine-dawn.json +9 -0
  47. package/lib/themes/rose-pine.json +9 -0
  48. package/lib/themes/solarized-dark.json +9 -0
  49. package/lib/themes/solarized-light.json +9 -0
  50. package/lib/themes/tokyo-night-light.json +9 -0
  51. package/lib/themes/tokyo-night.json +9 -0
  52. package/package.json +2 -1
@@ -18,7 +18,7 @@
18
18
  min-width: 0;
19
19
  }
20
20
 
21
- .project-name {
21
+ .header-title {
22
22
  font-weight: 600;
23
23
  font-size: 15px;
24
24
  color: var(--text);
@@ -27,6 +27,41 @@
27
27
  white-space: nowrap;
28
28
  }
29
29
 
30
+ #header-rename-btn {
31
+ display: none;
32
+ align-items: center;
33
+ justify-content: center;
34
+ width: 24px;
35
+ height: 24px;
36
+ border: none;
37
+ background: transparent;
38
+ color: var(--text-dimmer);
39
+ cursor: pointer;
40
+ border-radius: 6px;
41
+ flex-shrink: 0;
42
+ padding: 0;
43
+ margin-left: 4px;
44
+ transition: color 0.15s, background 0.15s;
45
+ }
46
+
47
+ #header-left:hover #header-rename-btn { display: flex; }
48
+ #header-rename-btn:hover { color: var(--text); background: rgba(var(--overlay-rgb), 0.06); }
49
+ #header-rename-btn .lucide { width: 13px; height: 13px; }
50
+
51
+ .header-rename-input {
52
+ font-weight: 600;
53
+ font-size: 15px;
54
+ color: var(--text);
55
+ background: var(--input-bg);
56
+ border: 1px solid var(--accent);
57
+ border-radius: 6px;
58
+ padding: 2px 8px;
59
+ font-family: inherit;
60
+ outline: none;
61
+ min-width: 0;
62
+ flex: 1;
63
+ }
64
+
30
65
  .status {
31
66
  display: flex;
32
67
  align-items: center;
@@ -58,8 +93,8 @@
58
93
  }
59
94
 
60
95
  #debug-btn .lucide { width: 15px; height: 15px; }
61
- #debug-btn:hover { opacity: 1; background: rgba(229, 83, 75, 0.08); border-color: rgba(229, 83, 75, 0.2); }
62
- #debug-btn.active { opacity: 1; background: rgba(229, 83, 75, 0.1); border-color: rgba(229, 83, 75, 0.25); }
96
+ #debug-btn:hover { opacity: 1; background: var(--error-8); border-color: var(--error-25); }
97
+ #debug-btn.active { opacity: 1; background: var(--error-12); border-color: var(--error-25); }
63
98
 
64
99
  #debug-menu {
65
100
  position: absolute;
@@ -70,7 +105,7 @@
70
105
  border-radius: 10px;
71
106
  padding: 8px 0;
72
107
  min-width: 200px;
73
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
108
+ box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.4);
74
109
  z-index: 200;
75
110
  }
76
111
 
@@ -99,7 +134,7 @@
99
134
  transition: color 0.15s, background 0.15s, border-color 0.15s;
100
135
  }
101
136
  #terminal-toggle-btn .lucide { width: 15px; height: 15px; }
102
- #terminal-toggle-btn:hover { color: var(--text-secondary); background: rgba(255,255,255,0.04); border-color: var(--border); }
137
+ #terminal-toggle-btn:hover { color: var(--text-secondary); background: rgba(var(--overlay-rgb),0.04); border-color: var(--border); }
103
138
  #terminal-toggle-btn { position: relative; }
104
139
  #terminal-count {
105
140
  position: absolute;
@@ -134,13 +169,13 @@
134
169
  transition: color 0.15s, background 0.15s, border-color 0.15s;
135
170
  }
136
171
  #qr-btn .lucide { width: 15px; height: 15px; }
137
- #qr-btn:hover { color: var(--text-secondary); background: rgba(255,255,255,0.04); border-color: var(--border); }
138
- #qr-btn.active { color: var(--text); background: rgba(255,255,255,0.06); border-color: var(--border); }
172
+ #qr-btn:hover { color: var(--text-secondary); background: rgba(var(--overlay-rgb),0.04); border-color: var(--border); }
173
+ #qr-btn.active { color: var(--text); background: rgba(var(--overlay-rgb),0.06); border-color: var(--border); }
139
174
 
140
175
  #qr-overlay {
141
176
  position: fixed;
142
177
  inset: 0;
143
- background: rgba(0, 0, 0, 0.6);
178
+ background: rgba(var(--shadow-rgb), 0.6);
144
179
  display: flex;
145
180
  align-items: center;
146
181
  justify-content: center;
@@ -156,7 +191,7 @@
156
191
  flex-direction: column;
157
192
  align-items: center;
158
193
  gap: 14px;
159
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
194
+ box-shadow: 0 8px 32px rgba(var(--shadow-rgb), 0.5);
160
195
  }
161
196
 
162
197
  #qr-canvas table { border-collapse: collapse; }
@@ -204,8 +239,8 @@
204
239
  }
205
240
 
206
241
  #notif-btn .lucide { width: 15px; height: 15px; }
207
- #notif-btn:hover { color: var(--text-secondary); background: rgba(255,255,255,0.04); border-color: var(--border); }
208
- #notif-btn.active { color: var(--text); background: rgba(255,255,255,0.06); border-color: var(--border); }
242
+ #notif-btn:hover { color: var(--text-secondary); background: rgba(var(--overlay-rgb),0.04); border-color: var(--border); }
243
+ #notif-btn.active { color: var(--text); background: rgba(var(--overlay-rgb),0.06); border-color: var(--border); }
209
244
 
210
245
  #notif-menu {
211
246
  position: absolute;
@@ -216,7 +251,7 @@
216
251
  border-radius: 10px;
217
252
  padding: 8px 0;
218
253
  min-width: 200px;
219
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
254
+ box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.4);
220
255
  z-index: 200;
221
256
  }
222
257
 
@@ -245,14 +280,14 @@
245
280
  flex-shrink: 0;
246
281
  }
247
282
 
248
- .notif-option:hover { background: rgba(255, 255, 255, 0.03); }
283
+ .notif-option:hover { background: rgba(var(--overlay-rgb), 0.03); }
249
284
  .notif-option input { display: none; }
250
285
 
251
286
  #notif-blocked-hint {
252
287
  padding: 6px 14px;
253
288
  font-size: 11px;
254
289
  line-height: 1.5;
255
- color: var(--warning, #E5A84B);
290
+ color: var(--warning);
256
291
  }
257
292
 
258
293
  #notif-blocked-hint.hidden { display: none; }
@@ -302,6 +337,30 @@
302
337
  display: none;
303
338
  }
304
339
 
340
+ /* iOS Safari notification info */
341
+ .notif-ios-info { cursor: default; }
342
+ .notif-ios-info-btn {
343
+ background: none;
344
+ border: none;
345
+ color: var(--text-dimmer);
346
+ cursor: pointer;
347
+ padding: 2px;
348
+ display: flex;
349
+ align-items: center;
350
+ transition: color 0.15s;
351
+ }
352
+ .notif-ios-info-btn:hover { color: var(--text-secondary); }
353
+
354
+ #notif-ios-hint {
355
+ padding: 6px 14px;
356
+ font-size: 11px;
357
+ line-height: 1.5;
358
+ color: var(--text-muted);
359
+ }
360
+ #notif-ios-hint .lucide { flex-shrink: 0; }
361
+ #notif-ios-hint strong { color: var(--text-secondary); }
362
+ #notif-ios-hint.hidden { display: none; }
363
+
305
364
  .notif-action {
306
365
  display: flex;
307
366
  align-items: center;
@@ -317,7 +376,7 @@
317
376
  transition: background 0.15s;
318
377
  }
319
378
 
320
- .notif-action:hover { background: rgba(255, 255, 255, 0.03); }
379
+ .notif-action:hover { background: rgba(var(--overlay-rgb), 0.03); }
321
380
  .notif-action .lucide { flex-shrink: 0; }
322
381
 
323
382
  .notif-action.copied { color: var(--success); }
@@ -382,8 +441,8 @@
382
441
  }
383
442
 
384
443
  #model-btn .lucide { width: 10px; height: 10px; }
385
- #model-btn:hover { color: var(--text-secondary); background: rgba(255,255,255,0.06); }
386
- #model-btn.active { color: var(--text-secondary); background: rgba(255,255,255,0.06); }
444
+ #model-btn:hover { color: var(--text-secondary); background: rgba(var(--overlay-rgb),0.06); }
445
+ #model-btn.active { color: var(--text-secondary); background: rgba(var(--overlay-rgb),0.06); }
387
446
 
388
447
  #model-menu {
389
448
  position: absolute;
@@ -394,7 +453,7 @@
394
453
  border-radius: 12px;
395
454
  padding: 4px 0;
396
455
  min-width: 200px;
397
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
456
+ box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.4);
398
457
  z-index: 200;
399
458
  }
400
459
 
@@ -416,7 +475,7 @@
416
475
  white-space: nowrap;
417
476
  }
418
477
 
419
- .model-menu-item:hover { background: rgba(255,255,255,0.05); color: var(--text); }
478
+ .model-menu-item:hover { background: rgba(var(--overlay-rgb),0.05); color: var(--text); }
420
479
  .model-menu-item.active { color: var(--accent); font-weight: 600; }
421
480
 
422
481
  /* --- Info panels container --- */
@@ -441,7 +500,7 @@
441
500
  background: var(--bg-alt);
442
501
  border: 1px solid var(--border);
443
502
  border-radius: 12px;
444
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
503
+ box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.3);
445
504
  font-size: 12px;
446
505
  pointer-events: auto;
447
506
  }
@@ -476,7 +535,7 @@
476
535
  border-radius: 4px;
477
536
  }
478
537
 
479
- .usage-panel-header button:hover { color: var(--text); background: rgba(255,255,255,0.06); }
538
+ .usage-panel-header button:hover { color: var(--text); background: rgba(var(--overlay-rgb),0.06); }
480
539
  .usage-panel-header button .lucide { width: 14px; height: 14px; }
481
540
 
482
541
  .usage-panel-body {
@@ -560,7 +619,7 @@
560
619
  border-radius: 3px;
561
620
  transition: width 0.3s ease, background 0.3s ease;
562
621
  }
563
- .context-bar-fill.warn { background: #E5A84B; }
622
+ .context-bar-fill.warn { background: var(--warning); }
564
623
  .context-bar-fill.danger { background: var(--error); }
565
624
  .context-bar-pct {
566
625
  font-family: "SF Mono", Menlo, Monaco, monospace;
@@ -596,7 +655,7 @@
596
655
  background: var(--success);
597
656
  transition: width 0.3s ease, background 0.3s ease;
598
657
  }
599
- .context-mini-fill.warn { background: #E5A84B; }
658
+ .context-mini-fill.warn { background: var(--warning); }
600
659
  .context-mini-fill.danger { background: var(--error); }
601
660
  .context-mini-label {
602
661
  font-family: "SF Mono", Menlo, Monaco, monospace;
@@ -26,7 +26,7 @@
26
26
  background: var(--bg-alt);
27
27
  border: 1px solid var(--border);
28
28
  border-radius: 12px;
29
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
29
+ box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.3);
30
30
  overflow: hidden;
31
31
  }
32
32
 
@@ -38,7 +38,7 @@
38
38
  cursor: pointer;
39
39
  user-select: none;
40
40
  }
41
- #todo-sticky .todo-sticky-header:hover { background: rgba(255, 255, 255, 0.03); }
41
+ #todo-sticky .todo-sticky-header:hover { background: rgba(var(--overlay-rgb), 0.03); }
42
42
  #todo-sticky .todo-sticky-icon { display: inline-flex; color: var(--accent); }
43
43
  #todo-sticky .todo-sticky-icon .lucide { width: 14px; height: 14px; }
44
44
  #todo-sticky .todo-sticky-title { font-size: 12px; font-weight: 600; color: var(--text-secondary); flex: 1; }
@@ -101,7 +101,7 @@
101
101
  cursor: pointer;
102
102
  z-index: 10;
103
103
  transition: opacity 0.15s;
104
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
104
+ box-shadow: 0 2px 8px rgba(var(--shadow-rgb), 0.3);
105
105
  }
106
106
  #new-msg-btn:hover {
107
107
  background: var(--sidebar-hover);
@@ -144,16 +144,16 @@
144
144
  }
145
145
 
146
146
  .msg-assistant:hover {
147
- background: rgba(255, 255, 255, 0.02);
147
+ background: rgba(var(--overlay-rgb), 0.02);
148
148
  }
149
149
 
150
150
  .msg-assistant.copy-primed {
151
- background: rgba(255, 255, 255, 0.04);
151
+ background: rgba(var(--overlay-rgb), 0.04);
152
152
  cursor: pointer;
153
153
  }
154
154
 
155
155
  .msg-assistant.copy-done {
156
- background: rgba(87, 171, 90, 0.06);
156
+ background: var(--success-8);
157
157
  }
158
158
 
159
159
  .msg-copy-hint {
@@ -197,7 +197,7 @@
197
197
  .md-content h3 { font-size: 1.1em; }
198
198
 
199
199
  .md-content code {
200
- background: rgba(255, 255, 255, 0.07);
200
+ background: rgba(var(--overlay-rgb), 0.07);
201
201
  padding: 2px 7px;
202
202
  border-radius: 6px;
203
203
  font-family: "SF Mono", "Fira Code", Menlo, Monaco, "Cascadia Code", monospace;
@@ -289,7 +289,7 @@ pre:hover .code-copy-btn { opacity: 1; }
289
289
  text-align: start;
290
290
  }
291
291
  .md-content th {
292
- background: rgba(255, 255, 255, 0.04);
292
+ background: rgba(var(--overlay-rgb), 0.04);
293
293
  font-weight: 600;
294
294
  }
295
295
 
@@ -340,13 +340,13 @@ pre:hover .code-copy-btn { opacity: 1; }
340
340
  }
341
341
 
342
342
  pre.mermaid-error {
343
- border-color: rgba(229, 83, 75, 0.25);
343
+ border-color: var(--error-25);
344
344
  }
345
345
 
346
346
  /* --- Mermaid Viewer Modal --- */
347
347
  #mermaid-modal { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; }
348
348
  #mermaid-modal.hidden { display: none; }
349
- #mermaid-modal .confirm-backdrop { backdrop-filter: none; -webkit-backdrop-filter: none; background: rgba(0, 0, 0, 0.7); }
349
+ #mermaid-modal .confirm-backdrop { backdrop-filter: none; -webkit-backdrop-filter: none; background: rgba(var(--shadow-rgb), 0.7); }
350
350
 
351
351
  .mermaid-modal-dialog {
352
352
  position: relative;
@@ -359,7 +359,7 @@ pre.mermaid-error {
359
359
  background: var(--bg-alt);
360
360
  border: 1px solid var(--border);
361
361
  border-radius: 16px;
362
- box-shadow: 0 24px 80px rgba(0, 0, 0, 0.5);
362
+ box-shadow: 0 24px 80px rgba(var(--shadow-rgb), 0.5);
363
363
  }
364
364
 
365
365
  .mermaid-modal-header {
@@ -395,7 +395,7 @@ pre.mermaid-error {
395
395
  transition: color 0.15s, background 0.15s;
396
396
  }
397
397
 
398
- .mermaid-modal-btn:hover { color: var(--text); background: rgba(255, 255, 255, 0.06); }
398
+ .mermaid-modal-btn:hover { color: var(--text); background: rgba(var(--overlay-rgb), 0.06); }
399
399
 
400
400
  .mermaid-modal-body {
401
401
  padding: 24px;
@@ -414,7 +414,7 @@ pre.mermaid-error {
414
414
  /* --- Image lightbox modal --- */
415
415
  #image-modal { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; }
416
416
  #image-modal.hidden { display: none; }
417
- #image-modal .confirm-backdrop { backdrop-filter: none; -webkit-backdrop-filter: none; background: rgba(0, 0, 0, 0.8); }
417
+ #image-modal .confirm-backdrop { backdrop-filter: none; -webkit-backdrop-filter: none; background: rgba(var(--shadow-rgb), 0.8); }
418
418
 
419
419
  .image-modal-dialog {
420
420
  position: relative;
@@ -429,7 +429,7 @@ pre.mermaid-error {
429
429
  max-height: 90vh;
430
430
  border-radius: 12px;
431
431
  object-fit: contain;
432
- box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
432
+ box-shadow: 0 24px 80px rgba(var(--shadow-rgb), 0.6);
433
433
  }
434
434
 
435
435
  .image-modal-close {
@@ -440,7 +440,7 @@ pre.mermaid-error {
440
440
  display: flex;
441
441
  align-items: center;
442
442
  justify-content: center;
443
- background: rgba(0, 0, 0, 0.5);
443
+ background: rgba(var(--shadow-rgb), 0.5);
444
444
  border: none;
445
445
  color: #fff;
446
446
  cursor: pointer;
@@ -448,7 +448,7 @@ pre.mermaid-error {
448
448
  border-radius: 50%;
449
449
  transition: background 0.15s;
450
450
  }
451
- .image-modal-close:hover { background: rgba(255, 255, 255, 0.2); }
451
+ .image-modal-close:hover { background: rgba(var(--overlay-rgb), 0.2); }
452
452
 
453
453
  /* ==========================================================================
454
454
  Thinking
@@ -467,13 +467,13 @@ pre.mermaid-error {
467
467
  cursor: pointer;
468
468
  padding: 6px 12px;
469
469
  user-select: none;
470
- background: rgba(255, 255, 255, 0.03);
470
+ background: rgba(var(--overlay-rgb), 0.03);
471
471
  border-radius: 8px;
472
472
  transition: background 0.15s;
473
473
  }
474
474
 
475
475
  .thinking-header:hover {
476
- background: rgba(255, 255, 255, 0.06);
476
+ background: rgba(var(--overlay-rgb), 0.06);
477
477
  }
478
478
 
479
479
  .thinking-chevron {
@@ -525,7 +525,7 @@ pre.mermaid-error {
525
525
  word-break: break-word;
526
526
  max-height: 300px;
527
527
  overflow-y: auto;
528
- background: rgba(255, 255, 255, 0.02);
528
+ background: rgba(var(--overlay-rgb), 0.02);
529
529
  border-radius: 8px;
530
530
  }
531
531
 
@@ -548,7 +548,7 @@ pre.mermaid-error {
548
548
  padding: 8px 12px;
549
549
  cursor: pointer;
550
550
  user-select: none;
551
- background: rgba(255, 255, 255, 0.025);
551
+ background: rgba(var(--overlay-rgb), 0.025);
552
552
  border-radius: 10px;
553
553
  transition: background 0.15s;
554
554
  }
@@ -570,7 +570,7 @@ pre.mermaid-error {
570
570
  }
571
571
 
572
572
  .tool-header:hover {
573
- background: rgba(255, 255, 255, 0.05);
573
+ background: rgba(var(--overlay-rgb), 0.05);
574
574
  }
575
575
 
576
576
  .tool-bullet {
@@ -714,21 +714,21 @@ pre.mermaid-error {
714
714
  }
715
715
 
716
716
  .diff-content .diff-add {
717
- color: #3FB950;
718
- background: rgba(63, 185, 80, 0.08);
717
+ color: var(--success);
718
+ background: var(--success-8);
719
719
  display: inline-block;
720
720
  width: 100%;
721
721
  }
722
722
 
723
723
  .diff-content .diff-del {
724
- color: #F85149;
725
- background: rgba(248, 81, 73, 0.08);
724
+ color: var(--error);
725
+ background: var(--error-8);
726
726
  display: inline-block;
727
727
  width: 100%;
728
728
  }
729
729
 
730
- .diff-content .diff-hunk { color: #8B949E; font-style: italic; }
731
- .diff-content .diff-file-header { color: #8B949E; font-weight: 600; }
730
+ .diff-content .diff-hunk { color: var(--text-muted); font-style: italic; }
731
+ .diff-content .diff-file-header { color: var(--text-muted); font-weight: 600; }
732
732
  .diff-content .diff-ctx { color: var(--text-muted); }
733
733
 
734
734
  /* --- Edit diff viewer --- */
@@ -739,7 +739,7 @@ pre.mermaid-error {
739
739
  font-size: 12px;
740
740
  font-family: "SF Mono", Menlo, Monaco, monospace;
741
741
  color: var(--text-muted);
742
- background: rgba(255, 255, 255, 0.03);
742
+ background: rgba(var(--overlay-rgb), 0.03);
743
743
  border-bottom: 1px solid var(--border-subtle);
744
744
  }
745
745
 
@@ -841,6 +841,150 @@ pre.mermaid-error {
841
841
  padding: 0;
842
842
  }
843
843
 
844
+ /* ==========================================================================
845
+ Sub-agent Log (Task tool)
846
+ ========================================================================== */
847
+
848
+ .subagent-log {
849
+ margin: 4px 0 4px 24px;
850
+ padding: 4px 0;
851
+ border-left: 2px solid var(--border-subtle);
852
+ padding-left: 12px;
853
+ max-height: 68px;
854
+ overflow-y: auto;
855
+ }
856
+
857
+ .subagent-log-entry {
858
+ display: flex;
859
+ align-items: center;
860
+ gap: 8px;
861
+ padding: 2px 0;
862
+ font-size: 12px;
863
+ color: var(--text-muted);
864
+ line-height: 1.4;
865
+ }
866
+
867
+ .subagent-log-bullet {
868
+ width: 5px;
869
+ height: 5px;
870
+ border-radius: 50%;
871
+ background: var(--text-dimmer);
872
+ flex-shrink: 0;
873
+ }
874
+
875
+ .subagent-log-tool {
876
+ font-weight: 600;
877
+ color: var(--text-secondary);
878
+ flex-shrink: 0;
879
+ font-size: 11px;
880
+ }
881
+
882
+ .subagent-log-text {
883
+ flex: 1;
884
+ overflow: hidden;
885
+ text-overflow: ellipsis;
886
+ white-space: nowrap;
887
+ font-family: "SF Mono", Menlo, Monaco, monospace;
888
+ font-size: 11px;
889
+ }
890
+
891
+ /* ==========================================================================
892
+ Tool Groups
893
+ ========================================================================== */
894
+
895
+ .tool-group {
896
+ max-width: var(--content-width);
897
+ margin: 4px auto;
898
+ padding: 0 20px;
899
+ }
900
+
901
+ .tool-group-header {
902
+ display: inline-flex;
903
+ align-items: center;
904
+ gap: 8px;
905
+ cursor: pointer;
906
+ padding: 6px 12px;
907
+ user-select: none;
908
+ background: rgba(var(--overlay-rgb), 0.03);
909
+ border-radius: 8px;
910
+ transition: background 0.15s;
911
+ }
912
+
913
+ .tool-group-header:hover {
914
+ background: rgba(var(--overlay-rgb), 0.06);
915
+ }
916
+
917
+ .tool-group-chevron {
918
+ color: var(--text-dimmer);
919
+ transition: transform 0.2s;
920
+ display: inline-flex;
921
+ flex-shrink: 0;
922
+ }
923
+
924
+ .tool-group-chevron .lucide {
925
+ width: 14px;
926
+ height: 14px;
927
+ }
928
+
929
+ .tool-group:not(.collapsed) .tool-group-chevron {
930
+ transform: rotate(90deg);
931
+ }
932
+
933
+ .tool-group-bullet {
934
+ width: 7px;
935
+ height: 7px;
936
+ border-radius: 50%;
937
+ background: var(--text-muted);
938
+ flex-shrink: 0;
939
+ animation: pulse 1.5s ease-in-out infinite;
940
+ }
941
+
942
+ .tool-group.done .tool-group-bullet {
943
+ background: var(--text-dimmer);
944
+ animation: none;
945
+ }
946
+
947
+ .tool-group.done .tool-group-bullet.error {
948
+ background: var(--error);
949
+ }
950
+
951
+ .tool-group-label {
952
+ font-size: 13px;
953
+ color: var(--text-muted);
954
+ font-weight: 500;
955
+ }
956
+
957
+ .tool-group.done .tool-group-label {
958
+ color: var(--text-dimmer);
959
+ }
960
+
961
+ .tool-group-status-icon {
962
+ flex-shrink: 0;
963
+ width: 16px;
964
+ display: inline-flex;
965
+ align-items: center;
966
+ justify-content: center;
967
+ }
968
+
969
+ .tool-group-status-icon .lucide { width: 14px; height: 14px; }
970
+ .tool-group-status-icon .icon-spin .lucide { width: 14px; height: 14px; color: var(--text-muted); }
971
+ .tool-group-status-icon .check { color: var(--text-dimmer); }
972
+ .tool-group-status-icon .err-icon { color: var(--error); }
973
+
974
+ .tool-group.done .tool-group-status-icon .icon-spin { display: none; }
975
+
976
+ /* Collapsed state: hide individual tool items */
977
+ .tool-group.collapsed .tool-group-items {
978
+ display: none;
979
+ }
980
+
981
+ /* Inside a group, tool-items defer layout to the group container */
982
+ .tool-group .tool-item {
983
+ max-width: none;
984
+ margin: 2px 0;
985
+ padding: 0;
986
+ }
987
+
844
988
  /* ==========================================================================
845
989
  Plan Mode
846
990
  ========================================================================== */
@@ -880,7 +1024,7 @@ pre.mermaid-error {
880
1024
  gap: 8px;
881
1025
  padding: 12px 16px;
882
1026
  background: var(--accent-bg);
883
- border: 1px solid rgba(218, 119, 86, 0.2);
1027
+ border: 1px solid var(--accent-20);
884
1028
  border-radius: 12px 12px 0 0;
885
1029
  cursor: pointer;
886
1030
  user-select: none;
@@ -900,7 +1044,7 @@ pre.mermaid-error {
900
1044
 
901
1045
  .plan-card-body {
902
1046
  padding: 16px 18px;
903
- background: rgba(255, 255, 255, 0.02);
1047
+ background: rgba(var(--overlay-rgb), 0.02);
904
1048
  border: 1px solid var(--border);
905
1049
  border-top: none;
906
1050
  border-radius: 0 0 12px 12px;
@@ -918,7 +1062,7 @@ pre.mermaid-error {
918
1062
  .plan-card-body h1 { font-size: 1.3em; }
919
1063
  .plan-card-body h2 { font-size: 1.15em; }
920
1064
  .plan-card-body h3 { font-size: 1.05em; }
921
- .plan-card-body code { background: rgba(255,255,255,0.06); padding: 2px 6px; border-radius: 4px; font-family: "SF Mono", Menlo, Monaco, monospace; font-size: 0.88em; }
1065
+ .plan-card-body code { background: rgba(var(--overlay-rgb),0.06); padding: 2px 6px; border-radius: 4px; font-family: "SF Mono", Menlo, Monaco, monospace; font-size: 0.88em; }
922
1066
  .plan-card-body pre { background: var(--code-bg); border: 1px solid var(--border); border-radius: 8px; margin: 8px 0; }
923
1067
  .plan-card-body pre code { display: block; padding: 10px 12px; overflow-x: auto; font-size: 12px; line-height: 1.5; background: none; border-radius: 0; }
924
1068
  .plan-card-body ul, .plan-card-body ol { padding-left: 22px; margin: 6px 0; }
@@ -928,8 +1072,8 @@ pre.mermaid-error {
928
1072
 
929
1073
  /* --- Plan permission (ExitPlanMode) --- */
930
1074
  .plan-permission-header {
931
- background: rgba(87, 171, 90, 0.08) !important;
932
- border-color: rgba(87, 171, 90, 0.2) !important;
1075
+ background: var(--success-8) !important;
1076
+ border-color: var(--success-25) !important;
933
1077
  }
934
1078
  .plan-permission-header .permission-icon { color: var(--success) !important; }
935
1079
  .plan-permission-header .permission-title { color: var(--success) !important; }
@@ -949,7 +1093,7 @@ pre.mermaid-error {
949
1093
  align-items: center;
950
1094
  gap: 8px;
951
1095
  padding: 10px 16px;
952
- background: rgba(255, 255, 255, 0.03);
1096
+ background: rgba(var(--overlay-rgb), 0.03);
953
1097
  border: 1px solid var(--border);
954
1098
  border-radius: 12px 12px 0 0;
955
1099
  }