claude-relay 2.4.2 → 2.5.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 (75) hide show
  1. package/bin/cli.js +1 -2350
  2. package/package.json +7 -42
  3. package/LICENSE +0 -21
  4. package/README.md +0 -281
  5. package/lib/cli-sessions.js +0 -270
  6. package/lib/config.js +0 -222
  7. package/lib/daemon.js +0 -423
  8. package/lib/ipc.js +0 -112
  9. package/lib/pages.js +0 -714
  10. package/lib/project.js +0 -1224
  11. package/lib/public/app.js +0 -2157
  12. package/lib/public/apple-touch-icon.png +0 -0
  13. package/lib/public/css/base.css +0 -145
  14. package/lib/public/css/diff.css +0 -128
  15. package/lib/public/css/filebrowser.css +0 -1076
  16. package/lib/public/css/highlight.css +0 -144
  17. package/lib/public/css/input.css +0 -512
  18. package/lib/public/css/menus.css +0 -683
  19. package/lib/public/css/messages.css +0 -1159
  20. package/lib/public/css/overlays.css +0 -731
  21. package/lib/public/css/rewind.css +0 -529
  22. package/lib/public/css/sidebar.css +0 -794
  23. package/lib/public/favicon.svg +0 -26
  24. package/lib/public/icon-192.png +0 -0
  25. package/lib/public/icon-512.png +0 -0
  26. package/lib/public/icon-mono.svg +0 -19
  27. package/lib/public/index.html +0 -460
  28. package/lib/public/manifest.json +0 -27
  29. package/lib/public/modules/diff.js +0 -398
  30. package/lib/public/modules/events.js +0 -21
  31. package/lib/public/modules/filebrowser.js +0 -1375
  32. package/lib/public/modules/fileicons.js +0 -172
  33. package/lib/public/modules/icons.js +0 -54
  34. package/lib/public/modules/input.js +0 -578
  35. package/lib/public/modules/markdown.js +0 -149
  36. package/lib/public/modules/notifications.js +0 -643
  37. package/lib/public/modules/qrcode.js +0 -70
  38. package/lib/public/modules/rewind.js +0 -334
  39. package/lib/public/modules/sidebar.js +0 -628
  40. package/lib/public/modules/state.js +0 -3
  41. package/lib/public/modules/terminal.js +0 -658
  42. package/lib/public/modules/theme.js +0 -622
  43. package/lib/public/modules/tools.js +0 -1410
  44. package/lib/public/modules/utils.js +0 -56
  45. package/lib/public/style.css +0 -10
  46. package/lib/public/sw.js +0 -75
  47. package/lib/push.js +0 -125
  48. package/lib/sdk-bridge.js +0 -771
  49. package/lib/server.js +0 -577
  50. package/lib/sessions.js +0 -402
  51. package/lib/terminal-manager.js +0 -187
  52. package/lib/terminal.js +0 -24
  53. package/lib/themes/ayu-light.json +0 -9
  54. package/lib/themes/catppuccin-latte.json +0 -9
  55. package/lib/themes/catppuccin-mocha.json +0 -9
  56. package/lib/themes/claude-light.json +0 -9
  57. package/lib/themes/claude.json +0 -9
  58. package/lib/themes/dracula.json +0 -9
  59. package/lib/themes/everforest-light.json +0 -9
  60. package/lib/themes/everforest.json +0 -9
  61. package/lib/themes/github-light.json +0 -9
  62. package/lib/themes/gruvbox-dark.json +0 -9
  63. package/lib/themes/gruvbox-light.json +0 -9
  64. package/lib/themes/monokai.json +0 -9
  65. package/lib/themes/nord-light.json +0 -9
  66. package/lib/themes/nord.json +0 -9
  67. package/lib/themes/one-dark.json +0 -9
  68. package/lib/themes/one-light.json +0 -9
  69. package/lib/themes/rose-pine-dawn.json +0 -9
  70. package/lib/themes/rose-pine.json +0 -9
  71. package/lib/themes/solarized-dark.json +0 -9
  72. package/lib/themes/solarized-light.json +0 -9
  73. package/lib/themes/tokyo-night-light.json +0 -9
  74. package/lib/themes/tokyo-night.json +0 -9
  75. package/lib/updater.js +0 -96
@@ -1,1159 +0,0 @@
1
- /* ==========================================================================
2
- Messages
3
- ========================================================================== */
4
-
5
- #messages {
6
- flex: 1;
7
- overflow-y: auto;
8
- -webkit-overflow-scrolling: touch;
9
- padding: 20px 0 12px;
10
- }
11
-
12
- /* --- Sticky todo overlay --- */
13
- #todo-sticky {
14
- position: absolute;
15
- top: 0;
16
- left: 50%;
17
- transform: translateX(-50%);
18
- width: 100%;
19
- max-width: var(--content-width);
20
- padding: 8px 20px;
21
- z-index: 10;
22
- }
23
- #todo-sticky.hidden { display: none; }
24
-
25
- #todo-sticky .todo-sticky-inner {
26
- background: var(--bg-alt);
27
- border: 1px solid var(--border);
28
- border-radius: 12px;
29
- box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.3);
30
- overflow: hidden;
31
- }
32
-
33
- #todo-sticky .todo-sticky-header {
34
- display: flex;
35
- align-items: center;
36
- gap: 8px;
37
- padding: 8px 14px;
38
- cursor: pointer;
39
- user-select: none;
40
- }
41
- #todo-sticky .todo-sticky-header:hover { background: rgba(var(--overlay-rgb), 0.03); }
42
- #todo-sticky .todo-sticky-icon { display: inline-flex; color: var(--accent); }
43
- #todo-sticky .todo-sticky-icon .lucide { width: 14px; height: 14px; }
44
- #todo-sticky .todo-sticky-title { font-size: 12px; font-weight: 600; color: var(--text-secondary); flex: 1; }
45
- #todo-sticky .todo-sticky-count { font-size: 11px; color: var(--text-muted); font-family: "SF Mono", Menlo, Monaco, monospace; }
46
- #todo-sticky .todo-sticky-chevron { display: inline-flex; color: var(--text-muted); transition: transform 0.2s; }
47
- #todo-sticky .todo-sticky-chevron .lucide { width: 12px; height: 12px; }
48
- #todo-sticky.collapsed .todo-sticky-chevron { transform: rotate(-90deg); }
49
- #todo-sticky .todo-sticky-active { display: none; }
50
- #todo-sticky.collapsed .todo-sticky-active {
51
- display: inline-flex;
52
- align-items: center;
53
- gap: 4px;
54
- flex: 1;
55
- min-width: 0;
56
- font-size: 11px;
57
- color: var(--text-secondary);
58
- overflow: hidden;
59
- text-overflow: ellipsis;
60
- white-space: nowrap;
61
- }
62
- #todo-sticky.collapsed .todo-sticky-active .lucide { width: 12px; height: 12px; color: var(--accent); flex-shrink: 0; }
63
- #todo-sticky.collapsed .todo-sticky-title { flex: none; }
64
-
65
- #todo-sticky .todo-sticky-progress { height: 2px; background: var(--border); }
66
- #todo-sticky .todo-sticky-progress-bar { height: 100%; background: var(--success); transition: width 0.3s ease; }
67
-
68
- #todo-sticky .todo-sticky-items { padding: 0 4px 6px; }
69
- #todo-sticky.collapsed .todo-sticky-items { display: none; }
70
- #todo-sticky.collapsed .todo-sticky-progress { height: 3px; border-radius: 0 0 12px 12px; overflow: hidden; }
71
-
72
- #todo-sticky .todo-sticky-item {
73
- display: flex;
74
- align-items: center;
75
- gap: 8px;
76
- padding: 4px 10px;
77
- font-size: 12px;
78
- line-height: 1.4;
79
- }
80
- #todo-sticky .todo-sticky-item-icon { display: inline-flex; flex-shrink: 0; }
81
- #todo-sticky .todo-sticky-item.pending .todo-sticky-item-icon { color: var(--text-dimmer); }
82
- #todo-sticky .todo-sticky-item.in-progress .todo-sticky-item-icon { color: var(--accent); }
83
- #todo-sticky .todo-sticky-item.completed .todo-sticky-item-icon { color: var(--success); }
84
- #todo-sticky .todo-sticky-item-text { flex: 1; }
85
- #todo-sticky .todo-sticky-item.pending .todo-sticky-item-text { color: var(--text-muted); }
86
- #todo-sticky .todo-sticky-item.in-progress .todo-sticky-item-text { color: var(--text); }
87
- #todo-sticky .todo-sticky-item.completed .todo-sticky-item-text { color: var(--text-dimmer); text-decoration: line-through; }
88
-
89
- /* --- Scroll-to-bottom floating button --- */
90
- #new-msg-btn {
91
- position: absolute;
92
- bottom: 80px;
93
- left: 50%;
94
- transform: translateX(-50%);
95
- background: var(--bg-alt);
96
- color: var(--text-secondary);
97
- border: 1px solid var(--border);
98
- border-radius: 20px;
99
- padding: 6px 16px;
100
- font-size: 13px;
101
- cursor: pointer;
102
- z-index: 10;
103
- transition: opacity 0.15s;
104
- box-shadow: 0 2px 8px rgba(var(--shadow-rgb), 0.3);
105
- }
106
- #new-msg-btn:hover {
107
- background: var(--sidebar-hover);
108
- color: var(--text);
109
- }
110
- #new-msg-btn.hidden {
111
- display: none;
112
- }
113
-
114
- /* --- User message --- */
115
- .msg-user {
116
- display: flex;
117
- justify-content: flex-end;
118
- max-width: var(--content-width);
119
- margin: 0 auto 16px;
120
- padding: 0 20px;
121
- }
122
-
123
- .msg-user .bubble {
124
- background: var(--user-bubble);
125
- border-radius: 20px 20px 4px 20px;
126
- padding: 12px 18px;
127
- max-width: 85%;
128
- font-size: 15px;
129
- line-height: 1.55;
130
- word-break: break-word;
131
- white-space: pre-wrap;
132
- color: var(--text);
133
- unicode-bidi: plaintext;
134
- text-align: start;
135
- }
136
-
137
- /* --- Assistant message --- */
138
- .msg-assistant {
139
- max-width: var(--content-width);
140
- margin: 0 auto 12px;
141
- padding: 4px 20px;
142
- border-radius: 12px;
143
- transition: background 0.15s;
144
- }
145
-
146
- .msg-assistant:hover {
147
- background: rgba(var(--overlay-rgb), 0.02);
148
- }
149
-
150
- .msg-assistant.copy-primed {
151
- background: rgba(var(--overlay-rgb), 0.04);
152
- cursor: pointer;
153
- }
154
-
155
- .msg-assistant.copy-done {
156
- background: var(--success-8);
157
- }
158
-
159
- .msg-copy-hint {
160
- font-size: 12px;
161
- color: var(--text-dimmer);
162
- min-height: 1.3em;
163
- font-weight: 500;
164
- opacity: 0;
165
- transition: color 0.15s, opacity 0.15s;
166
- }
167
-
168
- .msg-assistant:hover .msg-copy-hint { opacity: 1; }
169
- .msg-assistant.copy-primed .msg-copy-hint { opacity: 1; color: var(--accent); }
170
- .msg-assistant.copy-done .msg-copy-hint { opacity: 1; color: var(--success); }
171
-
172
- /* ==========================================================================
173
- Markdown Content
174
- ========================================================================== */
175
-
176
- .md-content {
177
- font-size: 15px;
178
- line-height: 1.7;
179
- word-break: break-word;
180
- color: var(--text);
181
- unicode-bidi: plaintext;
182
- text-align: start;
183
- }
184
-
185
- .md-content p { margin-bottom: 14px; }
186
- .md-content p:last-child { margin-bottom: 0; }
187
-
188
- .md-content h1, .md-content h2, .md-content h3,
189
- .md-content h4, .md-content h5, .md-content h6 {
190
- margin: 24px 0 12px;
191
- font-weight: 600;
192
- line-height: 1.3;
193
- color: var(--text);
194
- }
195
- .md-content h1 { font-size: 1.35em; }
196
- .md-content h2 { font-size: 1.2em; }
197
- .md-content h3 { font-size: 1.1em; }
198
-
199
- .md-content code {
200
- background: rgba(var(--overlay-rgb), 0.07);
201
- padding: 2px 7px;
202
- border-radius: 6px;
203
- font-family: "SF Mono", "Fira Code", Menlo, Monaco, "Cascadia Code", monospace;
204
- font-size: 0.87em;
205
- }
206
-
207
- .md-content pre {
208
- background: var(--code-bg);
209
- border: 1px solid var(--border-subtle);
210
- border-radius: 12px;
211
- margin: 14px 0;
212
- overflow: hidden;
213
- }
214
-
215
- .code-copy-btn {
216
- position: absolute;
217
- top: 8px;
218
- right: 8px;
219
- background: var(--bg-secondary);
220
- border: 1px solid var(--border-subtle);
221
- border-radius: 6px;
222
- color: var(--text-muted);
223
- cursor: pointer;
224
- padding: 5px 6px;
225
- line-height: 1;
226
- opacity: 0;
227
- transition: opacity 0.15s, color 0.15s, background 0.15s;
228
- z-index: 1;
229
- }
230
-
231
- pre:hover .code-copy-btn { opacity: 1; }
232
-
233
- .code-copy-btn:hover {
234
- color: var(--text);
235
- background: var(--sidebar-hover);
236
- }
237
-
238
- @media (pointer: coarse) {
239
- .code-copy-btn { opacity: 1; }
240
- }
241
-
242
- .md-content pre code {
243
- display: block;
244
- padding: 16px 18px;
245
- overflow-x: auto;
246
- font-size: 13px;
247
- line-height: 1.55;
248
- background: none;
249
- border-radius: 0;
250
- }
251
-
252
- .md-content strong { font-weight: 600; }
253
- .md-content em { font-style: italic; }
254
-
255
- .md-content a {
256
- color: var(--accent);
257
- text-decoration: none;
258
- }
259
- .md-content a:hover { text-decoration: underline; }
260
-
261
- .md-content ul, .md-content ol {
262
- padding-left: 24px;
263
- margin: 10px 0;
264
- }
265
- .md-content li { margin-bottom: 5px; }
266
-
267
- .md-content blockquote {
268
- border-left: 3px solid var(--accent);
269
- padding-left: 16px;
270
- color: var(--text-secondary);
271
- margin: 12px 0;
272
- }
273
-
274
- .md-content hr {
275
- border: none;
276
- border-top: 1px solid var(--border);
277
- margin: 20px 0;
278
- }
279
-
280
- .md-content table {
281
- border-collapse: collapse;
282
- margin: 14px 0;
283
- width: 100%;
284
- font-size: 14px;
285
- }
286
- .md-content th, .md-content td {
287
- border: 1px solid var(--border);
288
- padding: 8px 12px;
289
- text-align: start;
290
- }
291
- .md-content th {
292
- background: rgba(var(--overlay-rgb), 0.04);
293
- font-weight: 600;
294
- }
295
-
296
- /* --- Mermaid Diagrams --- */
297
- .mermaid-diagram {
298
- margin: 14px 0;
299
- padding: 16px;
300
- background: var(--code-bg);
301
- border: 1px solid var(--border-subtle);
302
- border-radius: 12px;
303
- overflow-x: auto;
304
- text-align: center;
305
- cursor: pointer;
306
- transition: border-color 0.15s;
307
- position: relative;
308
- }
309
-
310
- .mermaid-diagram:hover {
311
- border-color: var(--text-dimmer);
312
- }
313
-
314
- .mermaid-diagram::after {
315
- content: "Click to expand";
316
- position: absolute;
317
- bottom: 6px;
318
- right: 12px;
319
- font-size: 11px;
320
- color: var(--text-dimmer);
321
- opacity: 0;
322
- transition: opacity 0.15s;
323
- pointer-events: none;
324
- }
325
-
326
- .mermaid-diagram:hover::after {
327
- opacity: 1;
328
- }
329
-
330
- .mermaid-diagram svg {
331
- max-width: 100%;
332
- height: auto;
333
- }
334
-
335
- .mermaid-error-hint {
336
- font-size: 12px;
337
- color: var(--error);
338
- padding: 4px 18px 8px;
339
- font-style: italic;
340
- }
341
-
342
- pre.mermaid-error {
343
- border-color: var(--error-25);
344
- }
345
-
346
- /* --- Mermaid Viewer Modal --- */
347
- #mermaid-modal { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; }
348
- #mermaid-modal.hidden { display: none; }
349
- #mermaid-modal .confirm-backdrop { backdrop-filter: none; -webkit-backdrop-filter: none; background: rgba(var(--shadow-rgb), 0.7); }
350
-
351
- .mermaid-modal-dialog {
352
- position: relative;
353
- z-index: 1;
354
- width: 94vw;
355
- max-width: 1200px;
356
- max-height: 90vh;
357
- display: flex;
358
- flex-direction: column;
359
- background: var(--bg-alt);
360
- border: 1px solid var(--border);
361
- border-radius: 16px;
362
- box-shadow: 0 24px 80px rgba(var(--shadow-rgb), 0.5);
363
- }
364
-
365
- .mermaid-modal-header {
366
- display: flex;
367
- align-items: center;
368
- justify-content: space-between;
369
- padding: 14px 20px;
370
- border-bottom: 1px solid var(--border-subtle);
371
- flex-shrink: 0;
372
- }
373
-
374
- .mermaid-modal-title {
375
- font-size: 15px;
376
- font-weight: 600;
377
- color: var(--text);
378
- }
379
-
380
- .mermaid-modal-actions {
381
- display: flex;
382
- gap: 4px;
383
- }
384
-
385
- .mermaid-modal-btn {
386
- display: flex;
387
- align-items: center;
388
- justify-content: center;
389
- background: none;
390
- border: none;
391
- color: var(--text-muted);
392
- cursor: pointer;
393
- padding: 6px;
394
- border-radius: 6px;
395
- transition: color 0.15s, background 0.15s;
396
- }
397
-
398
- .mermaid-modal-btn:hover { color: var(--text); background: rgba(var(--overlay-rgb), 0.06); }
399
-
400
- .mermaid-modal-body {
401
- padding: 24px;
402
- overflow: auto;
403
- min-height: 0;
404
- text-align: center;
405
- flex: 1;
406
- }
407
-
408
- .mermaid-modal-body svg {
409
- max-width: 100%;
410
- height: auto;
411
- max-height: 75vh;
412
- }
413
-
414
- /* --- Image lightbox modal --- */
415
- #image-modal { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; }
416
- #image-modal.hidden { display: none; }
417
- #image-modal .confirm-backdrop { backdrop-filter: none; -webkit-backdrop-filter: none; background: rgba(var(--shadow-rgb), 0.8); }
418
-
419
- .image-modal-dialog {
420
- position: relative;
421
- z-index: 1;
422
- display: flex;
423
- align-items: center;
424
- justify-content: center;
425
- }
426
-
427
- #image-modal-img {
428
- max-width: 92vw;
429
- max-height: 90vh;
430
- border-radius: 12px;
431
- object-fit: contain;
432
- box-shadow: 0 24px 80px rgba(var(--shadow-rgb), 0.6);
433
- }
434
-
435
- .image-modal-close {
436
- position: fixed;
437
- top: 16px;
438
- right: 16px;
439
- z-index: 2;
440
- display: flex;
441
- align-items: center;
442
- justify-content: center;
443
- background: rgba(var(--shadow-rgb), 0.5);
444
- border: none;
445
- color: #fff;
446
- cursor: pointer;
447
- padding: 8px;
448
- border-radius: 50%;
449
- transition: background 0.15s;
450
- }
451
- .image-modal-close:hover { background: rgba(var(--overlay-rgb), 0.2); }
452
-
453
- /* ==========================================================================
454
- Thinking
455
- ========================================================================== */
456
-
457
- .thinking-item {
458
- max-width: var(--content-width);
459
- margin: 6px auto;
460
- padding: 0 20px;
461
- }
462
-
463
- .thinking-header {
464
- display: inline-flex;
465
- align-items: center;
466
- gap: 6px;
467
- cursor: pointer;
468
- padding: 6px 12px;
469
- user-select: none;
470
- background: rgba(var(--overlay-rgb), 0.03);
471
- border-radius: 8px;
472
- transition: background 0.15s;
473
- }
474
-
475
- .thinking-header:hover {
476
- background: rgba(var(--overlay-rgb), 0.06);
477
- }
478
-
479
- .thinking-chevron {
480
- color: var(--text-dimmer);
481
- transition: transform 0.2s;
482
- display: inline-flex;
483
- flex-shrink: 0;
484
- }
485
-
486
- .thinking-chevron .lucide {
487
- width: 14px;
488
- height: 14px;
489
- }
490
-
491
- .thinking-item.expanded .thinking-chevron {
492
- transform: rotate(90deg);
493
- }
494
-
495
- .thinking-label {
496
- font-size: 13px;
497
- color: var(--text-muted);
498
- }
499
-
500
- .thinking-duration {
501
- color: var(--text-dimmer);
502
- font-size: 12px;
503
- }
504
-
505
- .thinking-spinner {
506
- flex-shrink: 0;
507
- color: var(--text-muted);
508
- }
509
-
510
- .thinking-spinner .lucide {
511
- width: 14px;
512
- height: 14px;
513
- }
514
-
515
- .thinking-item.done .thinking-spinner { display: none; }
516
-
517
- .thinking-content {
518
- display: none;
519
- padding: 8px 14px;
520
- margin-top: 4px;
521
- font-size: 13px;
522
- line-height: 1.55;
523
- color: var(--text-muted);
524
- white-space: pre-wrap;
525
- word-break: break-word;
526
- max-height: 300px;
527
- overflow-y: auto;
528
- background: rgba(var(--overlay-rgb), 0.02);
529
- border-radius: 8px;
530
- }
531
-
532
- .thinking-item.expanded .thinking-content { display: block; }
533
-
534
- /* ==========================================================================
535
- Tool Items
536
- ========================================================================== */
537
-
538
- .tool-item {
539
- max-width: var(--content-width);
540
- margin: 4px auto;
541
- padding: 0 20px;
542
- }
543
-
544
- .tool-header {
545
- display: flex;
546
- align-items: center;
547
- gap: 10px;
548
- padding: 8px 12px;
549
- cursor: pointer;
550
- user-select: none;
551
- background: rgba(var(--overlay-rgb), 0.025);
552
- border-radius: 10px;
553
- transition: background 0.15s;
554
- }
555
-
556
- .tool-chevron {
557
- color: var(--text-dimmer);
558
- transition: transform 0.2s;
559
- display: inline-flex;
560
- flex-shrink: 0;
561
- }
562
-
563
- .tool-chevron .lucide {
564
- width: 14px;
565
- height: 14px;
566
- }
567
-
568
- .tool-item.expanded .tool-chevron {
569
- transform: rotate(90deg);
570
- }
571
-
572
- .tool-header:hover {
573
- background: rgba(var(--overlay-rgb), 0.05);
574
- }
575
-
576
- .tool-bullet {
577
- width: 7px;
578
- height: 7px;
579
- border-radius: 50%;
580
- background: var(--text-muted);
581
- flex-shrink: 0;
582
- animation: pulse 1.5s ease-in-out infinite;
583
- }
584
-
585
- .tool-item.done .tool-bullet {
586
- background: var(--text-dimmer);
587
- animation: none;
588
- }
589
-
590
- .tool-item.error .tool-bullet {
591
- background: var(--error);
592
- animation: none;
593
- }
594
-
595
- .tool-name {
596
- font-weight: 600;
597
- font-size: 13px;
598
- color: var(--text-secondary);
599
- flex-shrink: 0;
600
- }
601
-
602
- .tool-desc {
603
- flex: 1;
604
- font-size: 13px;
605
- color: var(--text-muted);
606
- font-family: "SF Mono", Menlo, Monaco, monospace;
607
- overflow: hidden;
608
- text-overflow: ellipsis;
609
- white-space: nowrap;
610
- }
611
-
612
- .tool-desc.tool-desc-link {
613
- cursor: pointer;
614
- text-decoration: underline;
615
- text-decoration-color: transparent;
616
- text-underline-offset: 2px;
617
- transition: color 0.15s, text-decoration-color 0.15s;
618
- }
619
-
620
- .tool-desc.tool-desc-link:hover {
621
- color: var(--accent);
622
- text-decoration-color: var(--accent);
623
- }
624
-
625
- .tool-desc-link-icon {
626
- display: inline-flex;
627
- align-items: center;
628
- margin-left: 4px;
629
- opacity: 0.3;
630
- vertical-align: middle;
631
- transition: opacity 0.15s;
632
- }
633
-
634
- .tool-desc-link-icon .lucide {
635
- width: 11px;
636
- height: 11px;
637
- }
638
-
639
- .tool-desc.tool-desc-link:hover .tool-desc-link-icon {
640
- opacity: 0.8;
641
- }
642
-
643
- .tool-status-icon {
644
- flex-shrink: 0;
645
- width: 16px;
646
- text-align: center;
647
- font-size: 12px;
648
- display: inline-flex;
649
- align-items: center;
650
- justify-content: center;
651
- }
652
-
653
- .tool-status-icon .lucide { width: 14px; height: 14px; }
654
- .tool-status-icon .icon-spin .lucide { width: 14px; height: 14px; color: var(--text-muted); }
655
- .tool-status-icon .check { color: var(--text-dimmer); }
656
- .tool-status-icon .err-icon { color: var(--error); }
657
-
658
- .tool-subtitle {
659
- display: flex;
660
- gap: 6px;
661
- padding: 2px 0 4px 22px;
662
- font-size: 12px;
663
- color: var(--text-dimmer);
664
- font-style: italic;
665
- align-items: flex-start;
666
- }
667
-
668
- .tool-subtitle .tool-connector {
669
- font-family: "SF Mono", Menlo, Monaco, monospace;
670
- font-style: normal;
671
- flex-shrink: 0;
672
- line-height: 1.4;
673
- }
674
-
675
- .tool-result-block {
676
- margin: 4px 0 8px 12px;
677
- background: var(--code-bg);
678
- border: 1px solid var(--border-subtle);
679
- border-radius: 10px;
680
- overflow: hidden;
681
- cursor: pointer;
682
- }
683
-
684
- .tool-result-block.collapsed { display: none; }
685
-
686
- .tool-result-block pre {
687
- padding: 12px 14px;
688
- font-family: "SF Mono", Menlo, Monaco, monospace;
689
- font-size: 12px;
690
- line-height: 1.55;
691
- color: var(--text-muted);
692
- white-space: pre-wrap;
693
- word-break: break-all;
694
- margin: 0;
695
- max-height: 300px;
696
- overflow-y: auto;
697
- }
698
-
699
- .tool-result-block pre.is-error {
700
- color: var(--error);
701
- }
702
-
703
- /* --- Diff rendering --- */
704
- .tool-result-block pre.diff-content {
705
- padding: 12px 14px;
706
- font-family: "SF Mono", Menlo, Monaco, monospace;
707
- font-size: 12px;
708
- line-height: 1.55;
709
- white-space: pre-wrap;
710
- word-break: break-all;
711
- margin: 0;
712
- max-height: 300px;
713
- overflow-y: auto;
714
- }
715
-
716
- .diff-content .diff-add {
717
- color: var(--success);
718
- background: var(--success-8);
719
- display: inline-block;
720
- width: 100%;
721
- }
722
-
723
- .diff-content .diff-del {
724
- color: var(--error);
725
- background: var(--error-8);
726
- display: inline-block;
727
- width: 100%;
728
- }
729
-
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
- .diff-content .diff-ctx { color: var(--text-muted); }
733
-
734
- /* --- Edit diff viewer --- */
735
- .edit-diff-header {
736
- display: flex;
737
- align-items: center;
738
- padding: 6px 14px;
739
- font-size: 12px;
740
- font-family: "SF Mono", Menlo, Monaco, monospace;
741
- color: var(--text-muted);
742
- background: rgba(var(--overlay-rgb), 0.03);
743
- border-bottom: 1px solid var(--border-subtle);
744
- }
745
-
746
- .edit-diff-path { flex: 1; }
747
- .edit-diff-path-link {
748
- cursor: pointer;
749
- }
750
- .edit-diff-path-link:hover {
751
- color: var(--accent);
752
- text-decoration: underline;
753
- }
754
-
755
- .edit-diff-toggles {
756
- display: inline-flex;
757
- border: 1px solid var(--border);
758
- border-radius: 6px;
759
- overflow: hidden;
760
- }
761
-
762
- .edit-diff-toggle {
763
- display: inline-flex;
764
- align-items: center;
765
- justify-content: center;
766
- width: 28px;
767
- height: 24px;
768
- padding: 0;
769
- border: none;
770
- background: var(--bg-alt);
771
- color: var(--text-dimmer);
772
- cursor: pointer;
773
- }
774
- .edit-diff-toggle .lucide { width: 14px; height: 14px; }
775
- .edit-diff-toggle:hover { color: var(--text-secondary); background: var(--sidebar-hover); }
776
- .edit-diff-toggle.active { color: var(--text); background: var(--sidebar-active); }
777
- .edit-diff-toggle + .edit-diff-toggle { border-left: 1px solid var(--border); }
778
-
779
- /* Constrain diff module tables inside tool results */
780
- .edit-diff .diff-unified,
781
- .edit-diff .diff-split-view,
782
- .tool-result-block > .diff-unified {
783
- max-height: 300px;
784
- overflow: auto;
785
- }
786
-
787
- .edit-diff .diff-table,
788
- .tool-result-block > .diff-unified .diff-table {
789
- font-size: 12px;
790
- }
791
-
792
- /* --- Code viewer (Read tool) --- */
793
- .code-viewer {
794
- display: flex;
795
- max-height: 300px;
796
- overflow-y: auto;
797
- overflow-x: hidden;
798
- }
799
-
800
- .code-viewer pre {
801
- margin: 0;
802
- max-height: none;
803
- overflow-y: visible;
804
- font-family: "SF Mono", Menlo, Monaco, monospace;
805
- font-size: 12px;
806
- line-height: 1.55;
807
- white-space: pre;
808
- word-break: normal;
809
- }
810
-
811
- .code-gutter {
812
- flex-shrink: 0;
813
- padding: 12px 12px 12px 14px;
814
- text-align: right;
815
- color: var(--text-dimmer);
816
- user-select: none;
817
- -webkit-user-select: none;
818
- border-right: 1px solid var(--border-subtle);
819
- min-width: 48px;
820
- }
821
-
822
- .code-content {
823
- flex: 1;
824
- padding: 12px 14px;
825
- overflow-x: auto;
826
- min-width: 0;
827
- color: var(--text-muted);
828
- }
829
-
830
- .code-content code {
831
- font-family: inherit;
832
- font-size: inherit;
833
- line-height: inherit;
834
- background: none;
835
- padding: 0;
836
- border-radius: 0;
837
- }
838
-
839
- .code-content .hljs {
840
- background: transparent;
841
- padding: 0;
842
- }
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
-
988
- /* ==========================================================================
989
- Plan Mode
990
- ========================================================================== */
991
-
992
- .plan-banner {
993
- max-width: var(--content-width);
994
- margin: 10px auto;
995
- padding: 0 20px;
996
- }
997
-
998
- .plan-banner > * { vertical-align: middle; }
999
-
1000
- .plan-banner .plan-banner-icon {
1001
- display: inline-flex;
1002
- align-items: center;
1003
- margin-right: 8px;
1004
- }
1005
-
1006
- .plan-banner .plan-banner-icon .lucide { width: 16px; height: 16px; }
1007
- .plan-banner.plan-enter { color: var(--accent); }
1008
- .plan-banner.plan-enter .plan-banner-icon { color: var(--accent); }
1009
- .plan-banner .plan-banner-text { font-size: 13px; font-weight: 600; }
1010
- .plan-banner .plan-banner-hint { font-size: 12px; color: var(--text-muted); font-style: italic; margin-left: 8px; }
1011
- .plan-banner.plan-exit { color: var(--success); }
1012
- .plan-banner.plan-exit .plan-banner-icon { color: var(--success); }
1013
-
1014
- /* --- Plan card --- */
1015
- .plan-card {
1016
- max-width: var(--content-width);
1017
- margin: 10px auto;
1018
- padding: 0 20px;
1019
- }
1020
-
1021
- .plan-card-header {
1022
- display: flex;
1023
- align-items: center;
1024
- gap: 8px;
1025
- padding: 12px 16px;
1026
- background: var(--accent-bg);
1027
- border: 1px solid var(--accent-20);
1028
- border-radius: 12px 12px 0 0;
1029
- cursor: pointer;
1030
- user-select: none;
1031
- }
1032
-
1033
- .plan-card.collapsed .plan-card-header { border-radius: 12px; }
1034
-
1035
- .plan-card-icon { display: inline-flex; color: var(--accent); }
1036
- .plan-card-icon .lucide { width: 16px; height: 16px; }
1037
- .plan-card-title { font-size: 14px; font-weight: 600; color: var(--accent); flex: 1; }
1038
- .plan-card-copy { display: inline-flex; align-items: center; justify-content: center; background: none; border: none; color: var(--text-dimmer); cursor: pointer; padding: 2px; border-radius: 4px; transition: color 0.15s; }
1039
- .plan-card-copy:hover { color: var(--text); }
1040
- .plan-card-copy .lucide { width: 14px; height: 14px; }
1041
- .plan-card-chevron { display: inline-flex; color: var(--text-muted); transition: transform 0.2s; }
1042
- .plan-card-chevron .lucide { width: 14px; height: 14px; }
1043
- .plan-card.collapsed .plan-card-chevron { transform: rotate(-90deg); }
1044
-
1045
- .plan-card-body {
1046
- padding: 16px 18px;
1047
- background: rgba(var(--overlay-rgb), 0.02);
1048
- border: 1px solid var(--border);
1049
- border-top: none;
1050
- border-radius: 0 0 12px 12px;
1051
- font-size: 14px;
1052
- line-height: 1.65;
1053
- max-height: 500px;
1054
- overflow-y: auto;
1055
- }
1056
-
1057
- .plan-card.collapsed .plan-card-body { display: none; }
1058
-
1059
- .plan-card-body p { margin-bottom: 10px; }
1060
- .plan-card-body p:last-child { margin-bottom: 0; }
1061
- .plan-card-body h1, .plan-card-body h2, .plan-card-body h3 { margin: 14px 0 8px; font-weight: 600; line-height: 1.3; }
1062
- .plan-card-body h1 { font-size: 1.3em; }
1063
- .plan-card-body h2 { font-size: 1.15em; }
1064
- .plan-card-body h3 { font-size: 1.05em; }
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; }
1066
- .plan-card-body pre { background: var(--code-bg); border: 1px solid var(--border); border-radius: 8px; margin: 8px 0; }
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; }
1068
- .plan-card-body ul, .plan-card-body ol { padding-left: 22px; margin: 6px 0; }
1069
- .plan-card-body li { margin-bottom: 3px; }
1070
- .plan-card-body strong { font-weight: 600; }
1071
- .plan-card-body blockquote { border-left: 3px solid var(--border); padding-left: 12px; color: var(--text-muted); margin: 8px 0; }
1072
-
1073
- /* --- Plan permission (ExitPlanMode) --- */
1074
- .plan-permission-header {
1075
- background: var(--success-8) !important;
1076
- border-color: var(--success-25) !important;
1077
- }
1078
- .plan-permission-header .permission-icon { color: var(--success) !important; }
1079
- .plan-permission-header .permission-title { color: var(--success) !important; }
1080
-
1081
- /* ==========================================================================
1082
- Todo Widget
1083
- ========================================================================== */
1084
-
1085
- .todo-widget {
1086
- max-width: var(--content-width);
1087
- margin: 12px auto;
1088
- padding: 0 20px;
1089
- }
1090
-
1091
- .todo-header {
1092
- display: flex;
1093
- align-items: center;
1094
- gap: 8px;
1095
- padding: 10px 16px;
1096
- background: rgba(var(--overlay-rgb), 0.03);
1097
- border: 1px solid var(--border);
1098
- border-radius: 12px 12px 0 0;
1099
- }
1100
-
1101
- .todo-header-icon { display: inline-flex; color: var(--accent); }
1102
- .todo-header-icon .lucide { width: 16px; height: 16px; }
1103
- .todo-header-title { font-size: 13px; font-weight: 600; color: var(--text); flex: 1; }
1104
- .todo-header-count { font-size: 12px; color: var(--text-muted); font-family: "SF Mono", Menlo, Monaco, monospace; }
1105
-
1106
- .todo-progress {
1107
- height: 2px;
1108
- background: var(--border);
1109
- border-left: 1px solid var(--border);
1110
- border-right: 1px solid var(--border);
1111
- }
1112
-
1113
- .todo-progress-bar {
1114
- height: 100%;
1115
- background: var(--success);
1116
- transition: width 0.3s ease;
1117
- }
1118
-
1119
- .todo-items {
1120
- border: 1px solid var(--border);
1121
- border-top: none;
1122
- border-radius: 0 0 12px 12px;
1123
- overflow: hidden;
1124
- }
1125
-
1126
- .todo-item {
1127
- display: flex;
1128
- align-items: center;
1129
- gap: 10px;
1130
- padding: 10px 16px;
1131
- font-size: 13px;
1132
- border-bottom: 1px solid var(--border-subtle);
1133
- }
1134
-
1135
- .todo-item:last-child { border-bottom: none; }
1136
-
1137
- .todo-item-icon { display: inline-flex; flex-shrink: 0; }
1138
- .todo-item-icon .lucide { width: 16px; height: 16px; }
1139
- .todo-item.pending .todo-item-icon { color: var(--text-dimmer); }
1140
- .todo-item.in-progress .todo-item-icon { color: var(--accent); }
1141
- .todo-item.completed .todo-item-icon { color: var(--success); }
1142
-
1143
- .todo-item-text { flex: 1; line-height: 1.4; }
1144
- .todo-item.pending .todo-item-text { color: var(--text-muted); }
1145
- .todo-item.in-progress .todo-item-text { color: var(--text); }
1146
- .todo-item.completed .todo-item-text { color: var(--text-dimmer); text-decoration: line-through; }
1147
-
1148
- /* ==========================================================================
1149
- Turn Metadata & System Messages
1150
- ========================================================================== */
1151
-
1152
- .turn-meta {
1153
- max-width: var(--content-width);
1154
- margin: 4px auto 20px;
1155
- padding: 0 20px;
1156
- font-size: 12px;
1157
- color: var(--text-dimmer);
1158
- }
1159
-