claude-relay 2.3.0 → 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 (54) hide show
  1. package/README.md +21 -5
  2. package/bin/cli.js +214 -9
  3. package/lib/cli-sessions.js +270 -0
  4. package/lib/config.js +3 -2
  5. package/lib/daemon.js +45 -1
  6. package/lib/pages.js +8 -1
  7. package/lib/project.js +121 -12
  8. package/lib/public/app.js +411 -87
  9. package/lib/public/css/base.css +41 -7
  10. package/lib/public/css/diff.css +6 -6
  11. package/lib/public/css/filebrowser.css +62 -52
  12. package/lib/public/css/highlight.css +144 -0
  13. package/lib/public/css/input.css +11 -9
  14. package/lib/public/css/menus.css +82 -23
  15. package/lib/public/css/messages.css +183 -35
  16. package/lib/public/css/overlays.css +166 -50
  17. package/lib/public/css/rewind.css +17 -17
  18. package/lib/public/css/sidebar.css +210 -137
  19. package/lib/public/index.html +75 -42
  20. package/lib/public/modules/filebrowser.js +2 -1
  21. package/lib/public/modules/markdown.js +10 -10
  22. package/lib/public/modules/notifications.js +38 -1
  23. package/lib/public/modules/sidebar.js +109 -31
  24. package/lib/public/modules/terminal.js +84 -23
  25. package/lib/public/modules/theme.js +622 -0
  26. package/lib/public/modules/tools.js +247 -4
  27. package/lib/public/modules/utils.js +21 -5
  28. package/lib/public/style.css +1 -0
  29. package/lib/sdk-bridge.js +95 -0
  30. package/lib/server.js +45 -3
  31. package/lib/sessions.js +16 -3
  32. package/lib/themes/ayu-light.json +9 -0
  33. package/lib/themes/catppuccin-latte.json +9 -0
  34. package/lib/themes/catppuccin-mocha.json +9 -0
  35. package/lib/themes/claude-light.json +9 -0
  36. package/lib/themes/claude.json +9 -0
  37. package/lib/themes/dracula.json +9 -0
  38. package/lib/themes/everforest-light.json +9 -0
  39. package/lib/themes/everforest.json +9 -0
  40. package/lib/themes/github-light.json +9 -0
  41. package/lib/themes/gruvbox-dark.json +9 -0
  42. package/lib/themes/gruvbox-light.json +9 -0
  43. package/lib/themes/monokai.json +9 -0
  44. package/lib/themes/nord-light.json +9 -0
  45. package/lib/themes/nord.json +9 -0
  46. package/lib/themes/one-dark.json +9 -0
  47. package/lib/themes/one-light.json +9 -0
  48. package/lib/themes/rose-pine-dawn.json +9 -0
  49. package/lib/themes/rose-pine.json +9 -0
  50. package/lib/themes/solarized-dark.json +9 -0
  51. package/lib/themes/solarized-light.json +9 -0
  52. package/lib/themes/tokyo-night-light.json +9 -0
  53. package/lib/themes/tokyo-night.json +9 -0
  54. 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);
@@ -130,6 +130,8 @@
130
130
  word-break: break-word;
131
131
  white-space: pre-wrap;
132
132
  color: var(--text);
133
+ unicode-bidi: plaintext;
134
+ text-align: start;
133
135
  }
134
136
 
135
137
  /* --- Assistant message --- */
@@ -142,16 +144,16 @@
142
144
  }
143
145
 
144
146
  .msg-assistant:hover {
145
- background: rgba(255, 255, 255, 0.02);
147
+ background: rgba(var(--overlay-rgb), 0.02);
146
148
  }
147
149
 
148
150
  .msg-assistant.copy-primed {
149
- background: rgba(255, 255, 255, 0.04);
151
+ background: rgba(var(--overlay-rgb), 0.04);
150
152
  cursor: pointer;
151
153
  }
152
154
 
153
155
  .msg-assistant.copy-done {
154
- background: rgba(87, 171, 90, 0.06);
156
+ background: var(--success-8);
155
157
  }
156
158
 
157
159
  .msg-copy-hint {
@@ -176,6 +178,8 @@
176
178
  line-height: 1.7;
177
179
  word-break: break-word;
178
180
  color: var(--text);
181
+ unicode-bidi: plaintext;
182
+ text-align: start;
179
183
  }
180
184
 
181
185
  .md-content p { margin-bottom: 14px; }
@@ -193,7 +197,7 @@
193
197
  .md-content h3 { font-size: 1.1em; }
194
198
 
195
199
  .md-content code {
196
- background: rgba(255, 255, 255, 0.07);
200
+ background: rgba(var(--overlay-rgb), 0.07);
197
201
  padding: 2px 7px;
198
202
  border-radius: 6px;
199
203
  font-family: "SF Mono", "Fira Code", Menlo, Monaco, "Cascadia Code", monospace;
@@ -282,10 +286,10 @@ pre:hover .code-copy-btn { opacity: 1; }
282
286
  .md-content th, .md-content td {
283
287
  border: 1px solid var(--border);
284
288
  padding: 8px 12px;
285
- text-align: left;
289
+ text-align: start;
286
290
  }
287
291
  .md-content th {
288
- background: rgba(255, 255, 255, 0.04);
292
+ background: rgba(var(--overlay-rgb), 0.04);
289
293
  font-weight: 600;
290
294
  }
291
295
 
@@ -336,13 +340,13 @@ pre:hover .code-copy-btn { opacity: 1; }
336
340
  }
337
341
 
338
342
  pre.mermaid-error {
339
- border-color: rgba(229, 83, 75, 0.25);
343
+ border-color: var(--error-25);
340
344
  }
341
345
 
342
346
  /* --- Mermaid Viewer Modal --- */
343
347
  #mermaid-modal { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; }
344
348
  #mermaid-modal.hidden { display: none; }
345
- #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); }
346
350
 
347
351
  .mermaid-modal-dialog {
348
352
  position: relative;
@@ -355,7 +359,7 @@ pre.mermaid-error {
355
359
  background: var(--bg-alt);
356
360
  border: 1px solid var(--border);
357
361
  border-radius: 16px;
358
- box-shadow: 0 24px 80px rgba(0, 0, 0, 0.5);
362
+ box-shadow: 0 24px 80px rgba(var(--shadow-rgb), 0.5);
359
363
  }
360
364
 
361
365
  .mermaid-modal-header {
@@ -391,7 +395,7 @@ pre.mermaid-error {
391
395
  transition: color 0.15s, background 0.15s;
392
396
  }
393
397
 
394
- .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); }
395
399
 
396
400
  .mermaid-modal-body {
397
401
  padding: 24px;
@@ -410,7 +414,7 @@ pre.mermaid-error {
410
414
  /* --- Image lightbox modal --- */
411
415
  #image-modal { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; }
412
416
  #image-modal.hidden { display: none; }
413
- #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); }
414
418
 
415
419
  .image-modal-dialog {
416
420
  position: relative;
@@ -425,7 +429,7 @@ pre.mermaid-error {
425
429
  max-height: 90vh;
426
430
  border-radius: 12px;
427
431
  object-fit: contain;
428
- box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
432
+ box-shadow: 0 24px 80px rgba(var(--shadow-rgb), 0.6);
429
433
  }
430
434
 
431
435
  .image-modal-close {
@@ -436,7 +440,7 @@ pre.mermaid-error {
436
440
  display: flex;
437
441
  align-items: center;
438
442
  justify-content: center;
439
- background: rgba(0, 0, 0, 0.5);
443
+ background: rgba(var(--shadow-rgb), 0.5);
440
444
  border: none;
441
445
  color: #fff;
442
446
  cursor: pointer;
@@ -444,7 +448,7 @@ pre.mermaid-error {
444
448
  border-radius: 50%;
445
449
  transition: background 0.15s;
446
450
  }
447
- .image-modal-close:hover { background: rgba(255, 255, 255, 0.2); }
451
+ .image-modal-close:hover { background: rgba(var(--overlay-rgb), 0.2); }
448
452
 
449
453
  /* ==========================================================================
450
454
  Thinking
@@ -463,13 +467,13 @@ pre.mermaid-error {
463
467
  cursor: pointer;
464
468
  padding: 6px 12px;
465
469
  user-select: none;
466
- background: rgba(255, 255, 255, 0.03);
470
+ background: rgba(var(--overlay-rgb), 0.03);
467
471
  border-radius: 8px;
468
472
  transition: background 0.15s;
469
473
  }
470
474
 
471
475
  .thinking-header:hover {
472
- background: rgba(255, 255, 255, 0.06);
476
+ background: rgba(var(--overlay-rgb), 0.06);
473
477
  }
474
478
 
475
479
  .thinking-chevron {
@@ -521,7 +525,7 @@ pre.mermaid-error {
521
525
  word-break: break-word;
522
526
  max-height: 300px;
523
527
  overflow-y: auto;
524
- background: rgba(255, 255, 255, 0.02);
528
+ background: rgba(var(--overlay-rgb), 0.02);
525
529
  border-radius: 8px;
526
530
  }
527
531
 
@@ -544,7 +548,7 @@ pre.mermaid-error {
544
548
  padding: 8px 12px;
545
549
  cursor: pointer;
546
550
  user-select: none;
547
- background: rgba(255, 255, 255, 0.025);
551
+ background: rgba(var(--overlay-rgb), 0.025);
548
552
  border-radius: 10px;
549
553
  transition: background 0.15s;
550
554
  }
@@ -566,7 +570,7 @@ pre.mermaid-error {
566
570
  }
567
571
 
568
572
  .tool-header:hover {
569
- background: rgba(255, 255, 255, 0.05);
573
+ background: rgba(var(--overlay-rgb), 0.05);
570
574
  }
571
575
 
572
576
  .tool-bullet {
@@ -710,21 +714,21 @@ pre.mermaid-error {
710
714
  }
711
715
 
712
716
  .diff-content .diff-add {
713
- color: #3FB950;
714
- background: rgba(63, 185, 80, 0.08);
717
+ color: var(--success);
718
+ background: var(--success-8);
715
719
  display: inline-block;
716
720
  width: 100%;
717
721
  }
718
722
 
719
723
  .diff-content .diff-del {
720
- color: #F85149;
721
- background: rgba(248, 81, 73, 0.08);
724
+ color: var(--error);
725
+ background: var(--error-8);
722
726
  display: inline-block;
723
727
  width: 100%;
724
728
  }
725
729
 
726
- .diff-content .diff-hunk { color: #8B949E; font-style: italic; }
727
- .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; }
728
732
  .diff-content .diff-ctx { color: var(--text-muted); }
729
733
 
730
734
  /* --- Edit diff viewer --- */
@@ -735,7 +739,7 @@ pre.mermaid-error {
735
739
  font-size: 12px;
736
740
  font-family: "SF Mono", Menlo, Monaco, monospace;
737
741
  color: var(--text-muted);
738
- background: rgba(255, 255, 255, 0.03);
742
+ background: rgba(var(--overlay-rgb), 0.03);
739
743
  border-bottom: 1px solid var(--border-subtle);
740
744
  }
741
745
 
@@ -837,6 +841,150 @@ pre.mermaid-error {
837
841
  padding: 0;
838
842
  }
839
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
+
840
988
  /* ==========================================================================
841
989
  Plan Mode
842
990
  ========================================================================== */
@@ -876,7 +1024,7 @@ pre.mermaid-error {
876
1024
  gap: 8px;
877
1025
  padding: 12px 16px;
878
1026
  background: var(--accent-bg);
879
- border: 1px solid rgba(218, 119, 86, 0.2);
1027
+ border: 1px solid var(--accent-20);
880
1028
  border-radius: 12px 12px 0 0;
881
1029
  cursor: pointer;
882
1030
  user-select: none;
@@ -896,7 +1044,7 @@ pre.mermaid-error {
896
1044
 
897
1045
  .plan-card-body {
898
1046
  padding: 16px 18px;
899
- background: rgba(255, 255, 255, 0.02);
1047
+ background: rgba(var(--overlay-rgb), 0.02);
900
1048
  border: 1px solid var(--border);
901
1049
  border-top: none;
902
1050
  border-radius: 0 0 12px 12px;
@@ -914,7 +1062,7 @@ pre.mermaid-error {
914
1062
  .plan-card-body h1 { font-size: 1.3em; }
915
1063
  .plan-card-body h2 { font-size: 1.15em; }
916
1064
  .plan-card-body h3 { font-size: 1.05em; }
917
- .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; }
918
1066
  .plan-card-body pre { background: var(--code-bg); border: 1px solid var(--border); border-radius: 8px; margin: 8px 0; }
919
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; }
920
1068
  .plan-card-body ul, .plan-card-body ol { padding-left: 22px; margin: 6px 0; }
@@ -924,8 +1072,8 @@ pre.mermaid-error {
924
1072
 
925
1073
  /* --- Plan permission (ExitPlanMode) --- */
926
1074
  .plan-permission-header {
927
- background: rgba(87, 171, 90, 0.08) !important;
928
- border-color: rgba(87, 171, 90, 0.2) !important;
1075
+ background: var(--success-8) !important;
1076
+ border-color: var(--success-25) !important;
929
1077
  }
930
1078
  .plan-permission-header .permission-icon { color: var(--success) !important; }
931
1079
  .plan-permission-header .permission-title { color: var(--success) !important; }
@@ -945,7 +1093,7 @@ pre.mermaid-error {
945
1093
  align-items: center;
946
1094
  gap: 8px;
947
1095
  padding: 10px 16px;
948
- background: rgba(255, 255, 255, 0.03);
1096
+ background: rgba(var(--overlay-rgb), 0.03);
949
1097
  border: 1px solid var(--border);
950
1098
  border-radius: 12px 12px 0 0;
951
1099
  }