clay-server 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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +281 -0
  3. package/bin/cli.js +2385 -0
  4. package/lib/cli-sessions.js +270 -0
  5. package/lib/config.js +237 -0
  6. package/lib/daemon.js +489 -0
  7. package/lib/ipc.js +112 -0
  8. package/lib/notes.js +120 -0
  9. package/lib/pages.js +664 -0
  10. package/lib/project.js +1433 -0
  11. package/lib/public/app.js +2795 -0
  12. package/lib/public/apple-touch-icon-dark.png +0 -0
  13. package/lib/public/apple-touch-icon.png +0 -0
  14. package/lib/public/css/base.css +264 -0
  15. package/lib/public/css/diff.css +128 -0
  16. package/lib/public/css/filebrowser.css +1114 -0
  17. package/lib/public/css/highlight.css +144 -0
  18. package/lib/public/css/icon-strip.css +296 -0
  19. package/lib/public/css/input.css +573 -0
  20. package/lib/public/css/menus.css +856 -0
  21. package/lib/public/css/messages.css +1445 -0
  22. package/lib/public/css/mobile-nav.css +354 -0
  23. package/lib/public/css/overlays.css +697 -0
  24. package/lib/public/css/rewind.css +505 -0
  25. package/lib/public/css/server-settings.css +761 -0
  26. package/lib/public/css/sidebar.css +936 -0
  27. package/lib/public/css/sticky-notes.css +358 -0
  28. package/lib/public/css/title-bar.css +314 -0
  29. package/lib/public/favicon-dark.svg +1 -0
  30. package/lib/public/favicon.svg +1 -0
  31. package/lib/public/icon-192-dark.png +0 -0
  32. package/lib/public/icon-192.png +0 -0
  33. package/lib/public/icon-512-dark.png +0 -0
  34. package/lib/public/icon-512.png +0 -0
  35. package/lib/public/icon-mono.svg +1 -0
  36. package/lib/public/index.html +762 -0
  37. package/lib/public/manifest.json +27 -0
  38. package/lib/public/modules/diff.js +398 -0
  39. package/lib/public/modules/events.js +21 -0
  40. package/lib/public/modules/filebrowser.js +1411 -0
  41. package/lib/public/modules/fileicons.js +172 -0
  42. package/lib/public/modules/icons.js +54 -0
  43. package/lib/public/modules/input.js +584 -0
  44. package/lib/public/modules/markdown.js +356 -0
  45. package/lib/public/modules/notifications.js +649 -0
  46. package/lib/public/modules/qrcode.js +70 -0
  47. package/lib/public/modules/rewind.js +345 -0
  48. package/lib/public/modules/server-settings.js +510 -0
  49. package/lib/public/modules/sidebar.js +1083 -0
  50. package/lib/public/modules/state.js +3 -0
  51. package/lib/public/modules/sticky-notes.js +688 -0
  52. package/lib/public/modules/terminal.js +697 -0
  53. package/lib/public/modules/theme.js +738 -0
  54. package/lib/public/modules/tools.js +1608 -0
  55. package/lib/public/modules/utils.js +56 -0
  56. package/lib/public/style.css +15 -0
  57. package/lib/public/sw.js +75 -0
  58. package/lib/push.js +124 -0
  59. package/lib/sdk-bridge.js +989 -0
  60. package/lib/server.js +582 -0
  61. package/lib/sessions.js +424 -0
  62. package/lib/terminal-manager.js +187 -0
  63. package/lib/terminal.js +24 -0
  64. package/lib/themes/ayu-light.json +9 -0
  65. package/lib/themes/catppuccin-latte.json +9 -0
  66. package/lib/themes/catppuccin-mocha.json +9 -0
  67. package/lib/themes/clay-light.json +10 -0
  68. package/lib/themes/clay.json +10 -0
  69. package/lib/themes/dracula.json +9 -0
  70. package/lib/themes/everforest-light.json +9 -0
  71. package/lib/themes/everforest.json +9 -0
  72. package/lib/themes/github-light.json +9 -0
  73. package/lib/themes/gruvbox-dark.json +9 -0
  74. package/lib/themes/gruvbox-light.json +9 -0
  75. package/lib/themes/monokai.json +9 -0
  76. package/lib/themes/nord-light.json +9 -0
  77. package/lib/themes/nord.json +9 -0
  78. package/lib/themes/one-dark.json +9 -0
  79. package/lib/themes/one-light.json +9 -0
  80. package/lib/themes/rose-pine-dawn.json +9 -0
  81. package/lib/themes/rose-pine.json +9 -0
  82. package/lib/themes/solarized-dark.json +9 -0
  83. package/lib/themes/solarized-light.json +9 -0
  84. package/lib/themes/tokyo-night-light.json +9 -0
  85. package/lib/themes/tokyo-night.json +9 -0
  86. package/lib/updater.js +97 -0
  87. package/package.json +47 -0
@@ -0,0 +1,1445 @@
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 (inline in title bar) --- */
13
+ #todo-sticky {
14
+ position: relative;
15
+ flex-shrink: 0;
16
+ margin-left: 8px;
17
+ }
18
+ #todo-sticky.hidden { display: none; }
19
+
20
+ #todo-sticky .todo-sticky-inner {
21
+ background: var(--bg-alt);
22
+ border: 1px solid var(--border);
23
+ border-radius: 10px;
24
+ overflow: hidden;
25
+ }
26
+
27
+ #todo-sticky .todo-sticky-header {
28
+ display: flex;
29
+ align-items: center;
30
+ gap: 6px;
31
+ padding: 5px 10px;
32
+ cursor: pointer;
33
+ user-select: none;
34
+ }
35
+ #todo-sticky .todo-sticky-header:hover { background: rgba(var(--overlay-rgb), 0.03); border-radius: 10px; }
36
+ #todo-sticky .todo-sticky-icon { display: inline-flex; color: var(--accent); }
37
+ #todo-sticky .todo-sticky-icon .lucide { width: 13px; height: 13px; }
38
+ #todo-sticky .todo-sticky-title { font-size: 11px; font-weight: 600; color: var(--text-secondary); }
39
+ #todo-sticky .todo-sticky-count { font-size: 11px; color: var(--text-muted); font-family: "Roboto Mono", monospace; }
40
+ #todo-sticky .todo-sticky-chevron { display: inline-flex; color: var(--text-muted); transition: transform 0.2s; }
41
+ #todo-sticky .todo-sticky-chevron .lucide { width: 11px; height: 11px; }
42
+ #todo-sticky.collapsed .todo-sticky-chevron { transform: rotate(-90deg); }
43
+ #todo-sticky .todo-sticky-active { display: none; }
44
+ #todo-sticky.collapsed .todo-sticky-active {
45
+ display: inline-flex;
46
+ align-items: center;
47
+ gap: 4px;
48
+ flex: 1;
49
+ min-width: 0;
50
+ font-size: 11px;
51
+ color: var(--text-secondary);
52
+ overflow: hidden;
53
+ text-overflow: ellipsis;
54
+ white-space: nowrap;
55
+ }
56
+ #todo-sticky.collapsed .todo-sticky-active .lucide { width: 11px; height: 11px; color: var(--accent); flex-shrink: 0; }
57
+ #todo-sticky.collapsed .todo-sticky-title { flex: none; }
58
+
59
+ #todo-sticky .todo-sticky-progress { height: 2px; background: var(--border); }
60
+ #todo-sticky .todo-sticky-progress-bar { height: 100%; background: var(--success); transition: width 0.3s ease; }
61
+
62
+ /* Expanded dropdown (items list) */
63
+ #todo-sticky .todo-sticky-items {
64
+ position: absolute;
65
+ top: 100%;
66
+ left: 0;
67
+ min-width: 260px;
68
+ max-width: 360px;
69
+ background: var(--bg-alt);
70
+ border: 1px solid var(--border);
71
+ border-radius: 10px;
72
+ box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.3);
73
+ padding: 4px 4px 6px;
74
+ margin-top: 4px;
75
+ z-index: 200;
76
+ }
77
+ #todo-sticky.collapsed .todo-sticky-items { display: none; }
78
+ #todo-sticky.collapsed .todo-sticky-progress { height: 3px; border-radius: 0 0 10px 10px; overflow: hidden; }
79
+
80
+ #todo-sticky .todo-sticky-item {
81
+ display: flex;
82
+ align-items: center;
83
+ gap: 8px;
84
+ padding: 4px 10px;
85
+ font-size: 12px;
86
+ line-height: 1.4;
87
+ }
88
+ #todo-sticky .todo-sticky-item-icon { display: inline-flex; flex-shrink: 0; }
89
+ #todo-sticky .todo-sticky-item.pending .todo-sticky-item-icon { color: var(--text-dimmer); }
90
+ #todo-sticky .todo-sticky-item.in-progress .todo-sticky-item-icon { color: var(--accent); }
91
+ #todo-sticky .todo-sticky-item.completed .todo-sticky-item-icon { color: var(--success); }
92
+ #todo-sticky .todo-sticky-item-text { flex: 1; }
93
+ #todo-sticky .todo-sticky-item.pending .todo-sticky-item-text { color: var(--text-muted); }
94
+ #todo-sticky .todo-sticky-item.in-progress .todo-sticky-item-text { color: var(--text); }
95
+ #todo-sticky .todo-sticky-item.completed .todo-sticky-item-text { color: var(--text-dimmer); text-decoration: line-through; }
96
+
97
+ /* --- Scroll-to-bottom floating button --- */
98
+ #new-msg-btn {
99
+ position: absolute;
100
+ bottom: 80px;
101
+ left: 50%;
102
+ transform: translateX(-50%);
103
+ background: var(--bg-alt);
104
+ color: var(--text-secondary);
105
+ border: 1px solid var(--border);
106
+ border-radius: 20px;
107
+ padding: 6px 16px;
108
+ font-size: 13px;
109
+ cursor: pointer;
110
+ z-index: 10;
111
+ transition: opacity 0.15s;
112
+ box-shadow: 0 2px 8px rgba(var(--shadow-rgb), 0.3);
113
+ }
114
+ #new-msg-btn:hover {
115
+ background: var(--sidebar-hover);
116
+ color: var(--text);
117
+ }
118
+ #new-msg-btn.hidden {
119
+ display: none;
120
+ }
121
+
122
+ /* --- User message --- */
123
+ .msg-user {
124
+ display: flex;
125
+ flex-direction: column;
126
+ align-items: flex-end;
127
+ max-width: var(--content-width);
128
+ margin: 0 auto 8px;
129
+ padding: 0 20px;
130
+ }
131
+
132
+ .msg-user .bubble {
133
+ background: var(--user-bubble);
134
+ border-radius: 20px 20px 4px 20px;
135
+ padding: 12px 18px;
136
+ max-width: 85%;
137
+ font-size: 15px;
138
+ line-height: 1.55;
139
+ word-break: break-word;
140
+ white-space: pre-wrap;
141
+ color: var(--text);
142
+ unicode-bidi: plaintext;
143
+ text-align: start;
144
+ }
145
+
146
+ /* --- User message action bar --- */
147
+ .msg-actions {
148
+ display: flex;
149
+ align-items: center;
150
+ gap: 2px;
151
+ min-height: 28px;
152
+ padding-top: 2px;
153
+ }
154
+
155
+ .msg-action-time {
156
+ font-size: 11px;
157
+ color: var(--text-dimmer);
158
+ margin-right: 4px;
159
+ opacity: 0;
160
+ transition: opacity 0.15s;
161
+ user-select: none;
162
+ font-variant-numeric: tabular-nums;
163
+ }
164
+
165
+ .msg-user:hover .msg-action-time { opacity: 1; }
166
+
167
+ @media (pointer: coarse) {
168
+ .msg-action-time { opacity: 1; }
169
+ }
170
+
171
+ .msg-action-btn {
172
+ display: inline-flex;
173
+ align-items: center;
174
+ justify-content: center;
175
+ width: 28px;
176
+ height: 28px;
177
+ border: none;
178
+ background: transparent;
179
+ color: var(--text-dimmer);
180
+ cursor: pointer;
181
+ border-radius: 6px;
182
+ padding: 0;
183
+ opacity: 0;
184
+ transition: opacity 0.15s, color 0.15s, background 0.15s;
185
+ }
186
+
187
+ .msg-action-btn .lucide { width: 14px; height: 14px; }
188
+
189
+ .msg-action-btn:hover {
190
+ color: var(--text);
191
+ background: rgba(var(--overlay-rgb), 0.08);
192
+ }
193
+
194
+ .msg-user:hover .msg-action-btn:not(.msg-action-hidden) { opacity: 1; }
195
+
196
+ /* Hidden actions (fork/rewind) — created but not shown */
197
+ .msg-action-btn.msg-action-hidden { display: none; }
198
+
199
+ @media (pointer: coarse) {
200
+ .msg-action-btn:not(.msg-action-hidden) { opacity: 1; }
201
+ }
202
+
203
+ /* --- Assistant message --- */
204
+ .msg-assistant {
205
+ max-width: var(--content-width);
206
+ margin: 0 auto 12px;
207
+ padding: 4px 20px;
208
+ border-radius: 12px;
209
+ transition: background 0.15s;
210
+ }
211
+
212
+ .msg-assistant:hover {
213
+ background: rgba(var(--overlay-rgb), 0.02);
214
+ }
215
+
216
+ .msg-assistant.copy-primed {
217
+ background: rgba(var(--overlay-rgb), 0.04);
218
+ cursor: pointer;
219
+ }
220
+
221
+ .msg-assistant.copy-done {
222
+ background: var(--success-8);
223
+ }
224
+
225
+ .msg-copy-hint {
226
+ font-size: 12px;
227
+ color: var(--text-dimmer);
228
+ min-height: 1.3em;
229
+ font-weight: 500;
230
+ opacity: 0;
231
+ transition: color 0.15s, opacity 0.15s;
232
+ }
233
+
234
+ .msg-assistant:hover .msg-copy-hint { opacity: 1; }
235
+ .msg-assistant.copy-primed .msg-copy-hint { opacity: 1; color: var(--accent); }
236
+ .msg-assistant.copy-done .msg-copy-hint { opacity: 1; color: var(--success); }
237
+
238
+ /* ==========================================================================
239
+ Markdown Content
240
+ ========================================================================== */
241
+
242
+ .md-content {
243
+ font-size: 15px;
244
+ line-height: 1.7;
245
+ word-break: break-word;
246
+ color: var(--text);
247
+ unicode-bidi: plaintext;
248
+ text-align: start;
249
+ }
250
+
251
+ .md-content p { margin-bottom: 14px; }
252
+ .md-content p:last-child { margin-bottom: 0; }
253
+
254
+ .md-content h1, .md-content h2, .md-content h3,
255
+ .md-content h4, .md-content h5, .md-content h6 {
256
+ margin: 24px 0 12px;
257
+ font-weight: 600;
258
+ line-height: 1.3;
259
+ color: var(--text);
260
+ }
261
+ .md-content h1 { font-size: 1.35em; }
262
+ .md-content h2 { font-size: 1.2em; }
263
+ .md-content h3 { font-size: 1.1em; }
264
+
265
+ .md-content code {
266
+ background: rgba(var(--overlay-rgb), 0.07);
267
+ padding: 2px 7px;
268
+ border-radius: 6px;
269
+ font-family: "Roboto Mono", monospace;
270
+ font-size: 0.87em;
271
+ }
272
+
273
+ .md-content pre {
274
+ background: var(--code-bg);
275
+ border: 1px solid var(--border-subtle);
276
+ border-radius: 12px;
277
+ margin: 14px 0;
278
+ overflow: hidden;
279
+ }
280
+
281
+ .code-copy-btn {
282
+ position: absolute;
283
+ top: 8px;
284
+ right: 8px;
285
+ background: var(--bg-secondary);
286
+ border: 1px solid var(--border-subtle);
287
+ border-radius: 6px;
288
+ color: var(--text-muted);
289
+ cursor: pointer;
290
+ padding: 5px 6px;
291
+ line-height: 1;
292
+ opacity: 0;
293
+ transition: opacity 0.15s, color 0.15s, background 0.15s;
294
+ z-index: 1;
295
+ }
296
+
297
+ pre:hover .code-copy-btn { opacity: 1; }
298
+
299
+ .code-copy-btn:hover {
300
+ color: var(--text);
301
+ background: var(--sidebar-hover);
302
+ }
303
+
304
+ @media (pointer: coarse) {
305
+ .code-copy-btn { opacity: 1; }
306
+ }
307
+
308
+ .md-content pre code {
309
+ display: block;
310
+ padding: 16px 18px;
311
+ overflow-x: auto;
312
+ font-size: 13px;
313
+ line-height: 1.55;
314
+ background: none;
315
+ border-radius: 0;
316
+ }
317
+
318
+ .md-content strong { font-weight: 600; }
319
+ .md-content em { font-style: italic; }
320
+
321
+ .md-content a {
322
+ color: var(--accent);
323
+ text-decoration: none;
324
+ }
325
+ .md-content a:hover { text-decoration: underline; }
326
+
327
+ .md-content ul, .md-content ol {
328
+ padding-left: 24px;
329
+ margin: 10px 0;
330
+ }
331
+ .md-content li { margin-bottom: 5px; }
332
+
333
+ .md-content blockquote {
334
+ border-left: 3px solid var(--accent);
335
+ padding-left: 16px;
336
+ color: var(--text-secondary);
337
+ margin: 12px 0;
338
+ }
339
+
340
+ .md-content hr {
341
+ border: none;
342
+ border-top: 1px solid var(--border);
343
+ margin: 20px 0;
344
+ }
345
+
346
+ .md-content table {
347
+ border-collapse: collapse;
348
+ margin: 14px 0;
349
+ width: 100%;
350
+ font-size: 14px;
351
+ }
352
+ .md-content th, .md-content td {
353
+ border: 1px solid var(--border);
354
+ padding: 8px 12px;
355
+ text-align: start;
356
+ }
357
+ .md-content th {
358
+ background: rgba(var(--overlay-rgb), 0.04);
359
+ font-weight: 600;
360
+ }
361
+
362
+ /* --- Mermaid Diagrams --- */
363
+ .mermaid-diagram {
364
+ margin: 14px 0;
365
+ padding: 16px;
366
+ background: var(--code-bg);
367
+ border: 1px solid var(--border-subtle);
368
+ border-radius: 12px;
369
+ overflow-x: auto;
370
+ text-align: center;
371
+ cursor: pointer;
372
+ transition: border-color 0.15s;
373
+ position: relative;
374
+ }
375
+
376
+ .mermaid-diagram:hover {
377
+ border-color: var(--text-dimmer);
378
+ }
379
+
380
+ .mermaid-diagram::after {
381
+ content: "Click to expand";
382
+ position: absolute;
383
+ bottom: 6px;
384
+ right: 12px;
385
+ font-size: 11px;
386
+ color: var(--text-dimmer);
387
+ opacity: 0;
388
+ transition: opacity 0.15s;
389
+ pointer-events: none;
390
+ }
391
+
392
+ .mermaid-diagram:hover::after {
393
+ opacity: 1;
394
+ }
395
+
396
+ .mermaid-diagram svg {
397
+ max-width: 100%;
398
+ height: auto;
399
+ }
400
+
401
+ .mermaid-error-hint {
402
+ font-size: 12px;
403
+ color: var(--error);
404
+ padding: 4px 18px 8px;
405
+ font-style: italic;
406
+ }
407
+
408
+ pre.mermaid-error {
409
+ border-color: var(--error-25);
410
+ }
411
+
412
+ /* --- Mermaid Viewer Modal --- */
413
+ #mermaid-modal { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; }
414
+ #mermaid-modal.hidden { display: none; }
415
+ #mermaid-modal .confirm-backdrop { backdrop-filter: none; -webkit-backdrop-filter: none; background: rgba(var(--shadow-rgb), 0.7); }
416
+
417
+ .mermaid-modal-dialog {
418
+ position: relative;
419
+ z-index: 1;
420
+ width: 94vw;
421
+ max-width: 1200px;
422
+ max-height: 90vh;
423
+ display: flex;
424
+ flex-direction: column;
425
+ background: var(--bg-alt);
426
+ border: 1px solid var(--border);
427
+ border-radius: 16px;
428
+ box-shadow: 0 24px 80px rgba(var(--shadow-rgb), 0.5);
429
+ }
430
+
431
+ .mermaid-modal-header {
432
+ display: flex;
433
+ align-items: center;
434
+ justify-content: space-between;
435
+ padding: 14px 20px;
436
+ border-bottom: 1px solid var(--border-subtle);
437
+ flex-shrink: 0;
438
+ }
439
+
440
+ .mermaid-modal-title {
441
+ font-size: 15px;
442
+ font-weight: 600;
443
+ color: var(--text);
444
+ }
445
+
446
+ .mermaid-modal-actions {
447
+ display: flex;
448
+ gap: 4px;
449
+ }
450
+
451
+ .mermaid-modal-btn {
452
+ display: flex;
453
+ align-items: center;
454
+ justify-content: center;
455
+ background: none;
456
+ border: none;
457
+ color: var(--text-muted);
458
+ cursor: pointer;
459
+ padding: 6px;
460
+ border-radius: 6px;
461
+ transition: color 0.15s, background 0.15s;
462
+ }
463
+
464
+ .mermaid-modal-btn:hover { color: var(--text); background: rgba(var(--overlay-rgb), 0.06); }
465
+
466
+ .mermaid-modal-body {
467
+ padding: 24px;
468
+ overflow: auto;
469
+ min-height: 0;
470
+ text-align: center;
471
+ flex: 1;
472
+ }
473
+
474
+ .mermaid-modal-body svg {
475
+ max-width: 100%;
476
+ height: auto;
477
+ max-height: 75vh;
478
+ }
479
+
480
+ /* --- Image lightbox modal --- */
481
+ #image-modal { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; }
482
+ #image-modal.hidden { display: none; }
483
+ #image-modal .confirm-backdrop { backdrop-filter: none; -webkit-backdrop-filter: none; background: rgba(var(--shadow-rgb), 0.8); }
484
+
485
+ .image-modal-dialog {
486
+ position: relative;
487
+ z-index: 1;
488
+ display: flex;
489
+ align-items: center;
490
+ justify-content: center;
491
+ }
492
+
493
+ #image-modal-img {
494
+ max-width: 92vw;
495
+ max-height: 90vh;
496
+ border-radius: 12px;
497
+ object-fit: contain;
498
+ box-shadow: 0 24px 80px rgba(var(--shadow-rgb), 0.6);
499
+ }
500
+
501
+ .image-modal-close {
502
+ position: fixed;
503
+ top: 16px;
504
+ right: 16px;
505
+ z-index: 2;
506
+ display: flex;
507
+ align-items: center;
508
+ justify-content: center;
509
+ background: rgba(var(--shadow-rgb), 0.5);
510
+ border: none;
511
+ color: #fff;
512
+ cursor: pointer;
513
+ padding: 8px;
514
+ border-radius: 50%;
515
+ transition: background 0.15s;
516
+ }
517
+ .image-modal-close:hover { background: rgba(var(--overlay-rgb), 0.2); }
518
+
519
+ /* ==========================================================================
520
+ Thinking
521
+ ========================================================================== */
522
+
523
+ .thinking-item {
524
+ max-width: var(--content-width);
525
+ margin: 6px auto;
526
+ padding: 0 20px;
527
+ }
528
+
529
+ .thinking-header {
530
+ display: inline-flex;
531
+ align-items: center;
532
+ gap: 6px;
533
+ cursor: pointer;
534
+ padding: 6px 12px;
535
+ user-select: none;
536
+ background: rgba(var(--overlay-rgb), 0.03);
537
+ border-radius: 8px;
538
+ transition: background 0.15s;
539
+ }
540
+
541
+ .thinking-header:hover {
542
+ background: rgba(var(--overlay-rgb), 0.06);
543
+ }
544
+
545
+ .thinking-chevron {
546
+ color: var(--text-dimmer);
547
+ transition: transform 0.2s;
548
+ display: inline-flex;
549
+ flex-shrink: 0;
550
+ }
551
+
552
+ .thinking-chevron .lucide {
553
+ width: 14px;
554
+ height: 14px;
555
+ }
556
+
557
+ .thinking-item.expanded .thinking-chevron {
558
+ transform: rotate(90deg);
559
+ }
560
+
561
+ .thinking-label {
562
+ font-size: 13px;
563
+ color: var(--text-muted);
564
+ }
565
+
566
+ .thinking-duration {
567
+ color: var(--text-dimmer);
568
+ font-size: 12px;
569
+ }
570
+
571
+ .thinking-spinner {
572
+ flex-shrink: 0;
573
+ color: var(--text-muted);
574
+ }
575
+
576
+ .thinking-spinner .lucide {
577
+ width: 14px;
578
+ height: 14px;
579
+ }
580
+
581
+ .thinking-item.done .thinking-spinner { display: none; }
582
+
583
+ .thinking-content {
584
+ display: none;
585
+ padding: 8px 14px;
586
+ margin-top: 4px;
587
+ font-size: 13px;
588
+ line-height: 1.55;
589
+ color: var(--text-muted);
590
+ white-space: pre-wrap;
591
+ word-break: break-word;
592
+ max-height: 300px;
593
+ overflow-y: auto;
594
+ background: rgba(var(--overlay-rgb), 0.02);
595
+ border-radius: 8px;
596
+ }
597
+
598
+ .thinking-item.expanded .thinking-content { display: block; }
599
+
600
+ /* ==========================================================================
601
+ Tool Items
602
+ ========================================================================== */
603
+
604
+ .tool-item {
605
+ max-width: var(--content-width);
606
+ margin: 4px auto;
607
+ padding: 0 20px;
608
+ }
609
+
610
+ .tool-header {
611
+ display: flex;
612
+ align-items: center;
613
+ gap: 10px;
614
+ padding: 8px 12px;
615
+ cursor: pointer;
616
+ user-select: none;
617
+ background: rgba(var(--overlay-rgb), 0.025);
618
+ border-radius: 10px;
619
+ transition: background 0.15s;
620
+ }
621
+
622
+ .tool-chevron {
623
+ color: var(--text-dimmer);
624
+ transition: transform 0.2s;
625
+ display: inline-flex;
626
+ flex-shrink: 0;
627
+ }
628
+
629
+ .tool-chevron .lucide {
630
+ width: 14px;
631
+ height: 14px;
632
+ }
633
+
634
+ .tool-item.expanded .tool-chevron {
635
+ transform: rotate(90deg);
636
+ }
637
+
638
+ .tool-header:hover {
639
+ background: rgba(var(--overlay-rgb), 0.05);
640
+ }
641
+
642
+ .tool-bullet {
643
+ width: 7px;
644
+ height: 7px;
645
+ border-radius: 50%;
646
+ background: var(--text-muted);
647
+ flex-shrink: 0;
648
+ animation: pulse 1.5s ease-in-out infinite;
649
+ }
650
+
651
+ .tool-item.done .tool-bullet {
652
+ background: var(--text-dimmer);
653
+ animation: none;
654
+ }
655
+
656
+ .tool-item.error .tool-bullet {
657
+ background: var(--error);
658
+ animation: none;
659
+ }
660
+
661
+ .tool-name {
662
+ font-weight: 600;
663
+ font-size: 13px;
664
+ color: var(--text-secondary);
665
+ flex-shrink: 0;
666
+ }
667
+
668
+ .tool-desc {
669
+ flex: 1;
670
+ font-size: 13px;
671
+ color: var(--text-muted);
672
+ font-family: "Roboto Mono", monospace;
673
+ overflow: hidden;
674
+ text-overflow: ellipsis;
675
+ white-space: nowrap;
676
+ }
677
+
678
+ .tool-desc.tool-desc-link {
679
+ cursor: pointer;
680
+ text-decoration: underline;
681
+ text-decoration-color: transparent;
682
+ text-underline-offset: 2px;
683
+ transition: color 0.15s, text-decoration-color 0.15s;
684
+ }
685
+
686
+ .tool-desc.tool-desc-link:hover {
687
+ color: var(--accent2);
688
+ text-decoration-color: var(--accent2);
689
+ }
690
+
691
+ .tool-desc-link-icon {
692
+ display: inline-flex;
693
+ align-items: center;
694
+ margin-left: 4px;
695
+ opacity: 0.3;
696
+ vertical-align: middle;
697
+ transition: opacity 0.15s;
698
+ }
699
+
700
+ .tool-desc-link-icon .lucide {
701
+ width: 11px;
702
+ height: 11px;
703
+ }
704
+
705
+ .tool-desc.tool-desc-link:hover .tool-desc-link-icon {
706
+ opacity: 0.8;
707
+ }
708
+
709
+ .tool-status-icon {
710
+ flex-shrink: 0;
711
+ width: 16px;
712
+ text-align: center;
713
+ font-size: 12px;
714
+ display: inline-flex;
715
+ align-items: center;
716
+ justify-content: center;
717
+ }
718
+
719
+ .tool-status-icon .lucide { width: 14px; height: 14px; }
720
+ .tool-status-icon .icon-spin .lucide { width: 14px; height: 14px; color: var(--text-muted); }
721
+ .tool-status-icon .check { color: var(--text-dimmer); }
722
+ .tool-status-icon .err-icon { color: var(--error); }
723
+
724
+ .tool-subtitle {
725
+ display: flex;
726
+ gap: 6px;
727
+ padding: 2px 0 4px 22px;
728
+ font-size: 12px;
729
+ color: var(--text-dimmer);
730
+ font-style: italic;
731
+ align-items: flex-start;
732
+ }
733
+
734
+ .tool-subtitle .tool-connector {
735
+ font-family: "Roboto Mono", monospace;
736
+ font-style: normal;
737
+ flex-shrink: 0;
738
+ line-height: 1.4;
739
+ }
740
+
741
+ .tool-result-block {
742
+ margin: 4px 0 8px 12px;
743
+ background: var(--code-bg);
744
+ border: 1px solid var(--border-subtle);
745
+ border-radius: 10px;
746
+ overflow: hidden;
747
+ cursor: pointer;
748
+ }
749
+
750
+ .tool-result-block.collapsed { display: none; }
751
+
752
+ .tool-result-block pre {
753
+ padding: 12px 14px;
754
+ font-family: "Roboto Mono", monospace;
755
+ font-size: 12px;
756
+ line-height: 1.55;
757
+ color: var(--text-muted);
758
+ white-space: pre-wrap;
759
+ word-break: break-all;
760
+ margin: 0;
761
+ max-height: 300px;
762
+ overflow-y: auto;
763
+ }
764
+
765
+ .tool-result-block pre.is-error {
766
+ color: var(--error);
767
+ }
768
+
769
+ /* --- Diff rendering --- */
770
+ .tool-result-block pre.diff-content {
771
+ padding: 12px 14px;
772
+ font-family: "Roboto Mono", monospace;
773
+ font-size: 12px;
774
+ line-height: 1.55;
775
+ white-space: pre-wrap;
776
+ word-break: break-all;
777
+ margin: 0;
778
+ max-height: 300px;
779
+ overflow-y: auto;
780
+ }
781
+
782
+ .diff-content .diff-add {
783
+ color: var(--success);
784
+ background: var(--success-8);
785
+ display: inline-block;
786
+ width: 100%;
787
+ }
788
+
789
+ .diff-content .diff-del {
790
+ color: var(--error);
791
+ background: var(--error-8);
792
+ display: inline-block;
793
+ width: 100%;
794
+ }
795
+
796
+ .diff-content .diff-hunk { color: var(--text-muted); font-style: italic; }
797
+ .diff-content .diff-file-header { color: var(--text-muted); font-weight: 600; }
798
+ .diff-content .diff-ctx { color: var(--text-muted); }
799
+
800
+ /* --- Edit diff viewer --- */
801
+ .edit-diff-header {
802
+ display: flex;
803
+ align-items: center;
804
+ padding: 6px 14px;
805
+ font-size: 12px;
806
+ font-family: "Roboto Mono", monospace;
807
+ color: var(--text-muted);
808
+ background: rgba(var(--overlay-rgb), 0.03);
809
+ border-bottom: 1px solid var(--border-subtle);
810
+ }
811
+
812
+ .edit-diff-path { flex: 1; }
813
+ .edit-diff-path-link {
814
+ cursor: pointer;
815
+ }
816
+ .edit-diff-path-link:hover {
817
+ color: var(--accent2);
818
+ text-decoration: underline;
819
+ }
820
+
821
+ .edit-diff-toggles {
822
+ display: inline-flex;
823
+ border: 1px solid var(--border);
824
+ border-radius: 6px;
825
+ overflow: hidden;
826
+ }
827
+
828
+ .edit-diff-toggle {
829
+ display: inline-flex;
830
+ align-items: center;
831
+ justify-content: center;
832
+ width: 28px;
833
+ height: 24px;
834
+ padding: 0;
835
+ border: none;
836
+ background: var(--bg-alt);
837
+ color: var(--text-dimmer);
838
+ cursor: pointer;
839
+ }
840
+ .edit-diff-toggle .lucide { width: 14px; height: 14px; }
841
+ .edit-diff-toggle:hover { color: var(--text-secondary); background: var(--sidebar-hover); }
842
+ .edit-diff-toggle.active { color: var(--text); background: var(--sidebar-active); }
843
+ .edit-diff-toggle + .edit-diff-toggle { border-left: 1px solid var(--border); }
844
+
845
+ /* Constrain diff module tables inside tool results */
846
+ .edit-diff .diff-unified,
847
+ .edit-diff .diff-split-view,
848
+ .tool-result-block > .diff-unified {
849
+ max-height: 300px;
850
+ overflow: auto;
851
+ }
852
+
853
+ .edit-diff .diff-table,
854
+ .tool-result-block > .diff-unified .diff-table {
855
+ font-size: 12px;
856
+ }
857
+
858
+ /* --- Code viewer (Read tool) --- */
859
+ .code-viewer {
860
+ display: flex;
861
+ max-height: 300px;
862
+ overflow-y: auto;
863
+ overflow-x: hidden;
864
+ }
865
+
866
+ .code-viewer pre {
867
+ margin: 0;
868
+ max-height: none;
869
+ overflow-y: visible;
870
+ font-family: "Roboto Mono", monospace;
871
+ font-size: 12px;
872
+ line-height: 1.55;
873
+ white-space: pre;
874
+ word-break: normal;
875
+ }
876
+
877
+ .code-gutter {
878
+ flex-shrink: 0;
879
+ padding: 12px 12px 12px 14px;
880
+ text-align: right;
881
+ color: var(--text-dimmer);
882
+ user-select: none;
883
+ -webkit-user-select: none;
884
+ border-right: 1px solid var(--border-subtle);
885
+ min-width: 48px;
886
+ }
887
+
888
+ .code-content {
889
+ flex: 1;
890
+ padding: 12px 14px;
891
+ overflow-x: auto;
892
+ min-width: 0;
893
+ color: var(--text-muted);
894
+ }
895
+
896
+ .code-content code {
897
+ font-family: inherit;
898
+ font-size: inherit;
899
+ line-height: inherit;
900
+ background: none;
901
+ padding: 0;
902
+ border-radius: 0;
903
+ }
904
+
905
+ .code-content .hljs {
906
+ background: transparent;
907
+ padding: 0;
908
+ }
909
+
910
+ /* ==========================================================================
911
+ Sub-agent Log (Task tool)
912
+ ========================================================================== */
913
+
914
+ .subagent-log {
915
+ margin: 4px 0 4px 24px;
916
+ padding: 4px 0;
917
+ border-left: 2px solid var(--border-subtle);
918
+ padding-left: 12px;
919
+ max-height: 68px;
920
+ overflow-y: auto;
921
+ }
922
+
923
+ .subagent-log-entry {
924
+ display: flex;
925
+ align-items: center;
926
+ gap: 8px;
927
+ padding: 2px 0;
928
+ font-size: 12px;
929
+ color: var(--text-muted);
930
+ line-height: 1.4;
931
+ }
932
+
933
+ .subagent-log-bullet {
934
+ width: 5px;
935
+ height: 5px;
936
+ border-radius: 50%;
937
+ background: var(--text-dimmer);
938
+ flex-shrink: 0;
939
+ }
940
+
941
+ .subagent-log-tool {
942
+ font-weight: 600;
943
+ color: var(--text-secondary);
944
+ flex-shrink: 0;
945
+ font-size: 11px;
946
+ }
947
+
948
+ .subagent-log-text {
949
+ flex: 1;
950
+ overflow: hidden;
951
+ text-overflow: ellipsis;
952
+ white-space: nowrap;
953
+ font-family: "Roboto Mono", monospace;
954
+ font-size: 11px;
955
+ }
956
+
957
+ .subagent-progress {
958
+ margin: 2px 0 2px 24px;
959
+ padding: 2px 12px;
960
+ font-size: 11px;
961
+ font-family: "Roboto Mono", monospace;
962
+ color: var(--text-dimmer);
963
+ }
964
+
965
+ .subagent-stop-btn {
966
+ margin-left: auto;
967
+ padding: 2px 10px;
968
+ border: 1px solid var(--border);
969
+ border-radius: 6px;
970
+ background: var(--bg-alt);
971
+ color: var(--text-muted);
972
+ font-size: 11px;
973
+ font-family: inherit;
974
+ cursor: pointer;
975
+ transition: background 0.15s, color 0.15s, border-color 0.15s;
976
+ }
977
+
978
+ .subagent-stop-btn:hover {
979
+ background: var(--error-8);
980
+ border-color: var(--error);
981
+ color: var(--error);
982
+ }
983
+
984
+ .subagent-stop-btn:disabled {
985
+ opacity: 0.5;
986
+ cursor: default;
987
+ }
988
+
989
+ /* ==========================================================================
990
+ Tool Groups
991
+ ========================================================================== */
992
+
993
+ .tool-group {
994
+ max-width: var(--content-width);
995
+ margin: 4px auto;
996
+ padding: 0 20px;
997
+ }
998
+
999
+ .tool-group-header {
1000
+ display: inline-flex;
1001
+ align-items: center;
1002
+ gap: 8px;
1003
+ cursor: pointer;
1004
+ padding: 6px 12px;
1005
+ user-select: none;
1006
+ background: rgba(var(--overlay-rgb), 0.03);
1007
+ border-radius: 8px;
1008
+ transition: background 0.15s;
1009
+ }
1010
+
1011
+ .tool-group-header:hover {
1012
+ background: rgba(var(--overlay-rgb), 0.06);
1013
+ }
1014
+
1015
+ .tool-group-chevron {
1016
+ color: var(--text-dimmer);
1017
+ transition: transform 0.2s;
1018
+ display: inline-flex;
1019
+ flex-shrink: 0;
1020
+ }
1021
+
1022
+ .tool-group-chevron .lucide {
1023
+ width: 14px;
1024
+ height: 14px;
1025
+ }
1026
+
1027
+ .tool-group:not(.collapsed) .tool-group-chevron {
1028
+ transform: rotate(90deg);
1029
+ }
1030
+
1031
+ .tool-group-bullet {
1032
+ width: 7px;
1033
+ height: 7px;
1034
+ border-radius: 50%;
1035
+ background: var(--text-muted);
1036
+ flex-shrink: 0;
1037
+ animation: pulse 1.5s ease-in-out infinite;
1038
+ }
1039
+
1040
+ .tool-group.done .tool-group-bullet {
1041
+ background: var(--text-dimmer);
1042
+ animation: none;
1043
+ }
1044
+
1045
+ .tool-group.done .tool-group-bullet.error {
1046
+ background: var(--error);
1047
+ }
1048
+
1049
+ .tool-group-label {
1050
+ font-size: 13px;
1051
+ color: var(--text-muted);
1052
+ font-weight: 500;
1053
+ }
1054
+
1055
+ .tool-group.done .tool-group-label {
1056
+ color: var(--text-dimmer);
1057
+ }
1058
+
1059
+ .tool-group-status-icon {
1060
+ flex-shrink: 0;
1061
+ width: 16px;
1062
+ display: inline-flex;
1063
+ align-items: center;
1064
+ justify-content: center;
1065
+ }
1066
+
1067
+ .tool-group-status-icon .lucide { width: 14px; height: 14px; }
1068
+ .tool-group-status-icon .icon-spin .lucide { width: 14px; height: 14px; color: var(--text-muted); }
1069
+ .tool-group-status-icon .check { color: var(--text-dimmer); }
1070
+ .tool-group-status-icon .err-icon { color: var(--error); }
1071
+
1072
+ .tool-group.done .tool-group-status-icon .icon-spin { display: none; }
1073
+
1074
+ /* Collapsed state: hide individual tool items */
1075
+ .tool-group.collapsed .tool-group-items {
1076
+ display: none;
1077
+ }
1078
+
1079
+ /* Inside a group, tool-items defer layout to the group container */
1080
+ .tool-group .tool-item {
1081
+ max-width: none;
1082
+ margin: 2px 0;
1083
+ padding: 0;
1084
+ }
1085
+
1086
+ /* ==========================================================================
1087
+ Plan Mode
1088
+ ========================================================================== */
1089
+
1090
+ .plan-banner {
1091
+ max-width: var(--content-width);
1092
+ margin: 10px auto;
1093
+ padding: 0 20px;
1094
+ }
1095
+
1096
+ .plan-banner > * { vertical-align: middle; }
1097
+
1098
+ .plan-banner .plan-banner-icon {
1099
+ display: inline-flex;
1100
+ align-items: center;
1101
+ margin-right: 8px;
1102
+ }
1103
+
1104
+ .plan-banner .plan-banner-icon .lucide { width: 16px; height: 16px; }
1105
+ .plan-banner.plan-enter { color: var(--accent); }
1106
+ .plan-banner.plan-enter .plan-banner-icon { color: var(--accent); }
1107
+ .plan-banner .plan-banner-text { font-size: 13px; font-weight: 600; }
1108
+ .plan-banner .plan-banner-hint { font-size: 12px; color: var(--text-muted); font-style: italic; margin-left: 8px; }
1109
+ .plan-banner.plan-exit { color: var(--success); }
1110
+ .plan-banner.plan-exit .plan-banner-icon { color: var(--success); }
1111
+
1112
+ /* --- Plan card --- */
1113
+ .plan-card {
1114
+ max-width: var(--content-width);
1115
+ margin: 10px auto;
1116
+ padding: 0 20px;
1117
+ }
1118
+
1119
+ .plan-card-header {
1120
+ display: flex;
1121
+ align-items: center;
1122
+ gap: 8px;
1123
+ padding: 12px 16px;
1124
+ background: var(--accent-bg);
1125
+ border: 1px solid var(--accent-20);
1126
+ border-radius: 12px 12px 0 0;
1127
+ cursor: pointer;
1128
+ user-select: none;
1129
+ }
1130
+
1131
+ .plan-card.collapsed .plan-card-header { border-radius: 12px; }
1132
+
1133
+ .plan-card-icon { display: inline-flex; color: var(--accent); }
1134
+ .plan-card-icon .lucide { width: 16px; height: 16px; }
1135
+ .plan-card-title { font-size: 14px; font-weight: 600; color: var(--accent); flex: 1; }
1136
+ .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; }
1137
+ .plan-card-copy:hover { color: var(--text); }
1138
+ .plan-card-copy .lucide { width: 14px; height: 14px; }
1139
+ .plan-card-chevron { display: inline-flex; color: var(--text-muted); transition: transform 0.2s; }
1140
+ .plan-card-chevron .lucide { width: 14px; height: 14px; }
1141
+ .plan-card.collapsed .plan-card-chevron { transform: rotate(-90deg); }
1142
+
1143
+ .plan-card-body {
1144
+ padding: 16px 18px;
1145
+ background: rgba(var(--overlay-rgb), 0.02);
1146
+ border: 1px solid var(--border);
1147
+ border-top: none;
1148
+ border-radius: 0 0 12px 12px;
1149
+ font-size: 14px;
1150
+ line-height: 1.65;
1151
+ max-height: 500px;
1152
+ overflow-y: auto;
1153
+ }
1154
+
1155
+ .plan-card.collapsed .plan-card-body { display: none; }
1156
+
1157
+ .plan-card-body p { margin-bottom: 10px; }
1158
+ .plan-card-body p:last-child { margin-bottom: 0; }
1159
+ .plan-card-body h1, .plan-card-body h2, .plan-card-body h3 { margin: 14px 0 8px; font-weight: 600; line-height: 1.3; }
1160
+ .plan-card-body h1 { font-size: 1.3em; }
1161
+ .plan-card-body h2 { font-size: 1.15em; }
1162
+ .plan-card-body h3 { font-size: 1.05em; }
1163
+ .plan-card-body code { background: rgba(var(--overlay-rgb),0.06); padding: 2px 6px; border-radius: 4px; font-family: "Roboto Mono", monospace; font-size: 0.88em; }
1164
+ .plan-card-body pre { background: var(--code-bg); border: 1px solid var(--border); border-radius: 8px; margin: 8px 0; }
1165
+ .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; }
1166
+ .plan-card-body ul, .plan-card-body ol { padding-left: 22px; margin: 6px 0; }
1167
+ .plan-card-body li { margin-bottom: 3px; }
1168
+ .plan-card-body strong { font-weight: 600; }
1169
+ .plan-card-body blockquote { border-left: 3px solid var(--border); padding-left: 12px; color: var(--text-muted); margin: 8px 0; }
1170
+
1171
+ /* --- Plan permission (ExitPlanMode) --- */
1172
+ .plan-permission-header {
1173
+ background: var(--success-8) !important;
1174
+ border-color: var(--success-25) !important;
1175
+ }
1176
+ .plan-permission-header .permission-icon { color: var(--success) !important; }
1177
+ .plan-permission-header .permission-title { color: var(--success) !important; }
1178
+
1179
+ /* Plan permission actions: wrap buttons */
1180
+ .plan-permission-actions {
1181
+ flex-wrap: wrap;
1182
+ }
1183
+ .plan-permission-actions .plan-btn-clear {
1184
+ display: inline-flex;
1185
+ align-items: center;
1186
+ gap: 5px;
1187
+ background: var(--bg-alt);
1188
+ color: var(--text-secondary);
1189
+ border-color: var(--border);
1190
+ }
1191
+ .plan-permission-actions .plan-btn-clear:hover {
1192
+ background: var(--input-bg);
1193
+ opacity: 1;
1194
+ }
1195
+ .plan-permission-actions .plan-btn-clear .lucide { width: 14px; height: 14px; flex-shrink: 0; }
1196
+ .plan-ctx-pct {
1197
+ font-family: "Roboto Mono", monospace;
1198
+ font-size: 11px;
1199
+ opacity: 0.7;
1200
+ }
1201
+
1202
+ /* Plan feedback input row */
1203
+ .plan-feedback-row {
1204
+ display: flex;
1205
+ gap: 6px;
1206
+ padding: 8px 14px 10px;
1207
+ border: 1px solid var(--border);
1208
+ border-top: none;
1209
+ border-radius: 0 0 12px 12px;
1210
+ background: rgba(var(--overlay-rgb), 0.015);
1211
+ }
1212
+ .plan-feedback-input {
1213
+ flex: 1;
1214
+ min-width: 0;
1215
+ padding: 7px 12px;
1216
+ border: 1px solid var(--border);
1217
+ border-radius: 8px;
1218
+ background: var(--input-bg);
1219
+ color: var(--text);
1220
+ font-size: 13px;
1221
+ font-family: inherit;
1222
+ outline: none;
1223
+ transition: border-color 0.15s;
1224
+ }
1225
+ .plan-feedback-input::placeholder { color: var(--text-dimmer); }
1226
+ .plan-feedback-input:focus { border-color: var(--accent); }
1227
+
1228
+ .plan-feedback-send {
1229
+ display: inline-flex;
1230
+ align-items: center;
1231
+ justify-content: center;
1232
+ width: 34px;
1233
+ height: 34px;
1234
+ border-radius: 8px;
1235
+ border: 1px solid var(--border);
1236
+ background: var(--text-dimmer);
1237
+ color: #fff;
1238
+ cursor: pointer;
1239
+ flex-shrink: 0;
1240
+ transition: opacity 0.15s, background 0.15s;
1241
+ }
1242
+ .plan-feedback-send:hover { background: var(--text-muted); }
1243
+ .plan-feedback-send:disabled { opacity: 0.3; cursor: default; }
1244
+ .plan-feedback-send .lucide { width: 16px; height: 16px; }
1245
+
1246
+ /* When plan-permission has feedback row, actions lose bottom radius */
1247
+ .plan-permission .plan-permission-actions {
1248
+ border-radius: 0;
1249
+ }
1250
+
1251
+ /* ==========================================================================
1252
+ Todo Widget
1253
+ ========================================================================== */
1254
+
1255
+ .todo-widget {
1256
+ max-width: var(--content-width);
1257
+ margin: 12px auto;
1258
+ padding: 0 20px;
1259
+ }
1260
+
1261
+ .todo-header {
1262
+ display: flex;
1263
+ align-items: center;
1264
+ gap: 8px;
1265
+ padding: 10px 16px;
1266
+ background: rgba(var(--overlay-rgb), 0.03);
1267
+ border: 1px solid var(--border);
1268
+ border-radius: 12px 12px 0 0;
1269
+ }
1270
+
1271
+ .todo-header-icon { display: inline-flex; color: var(--accent); }
1272
+ .todo-header-icon .lucide { width: 16px; height: 16px; }
1273
+ .todo-header-title { font-size: 13px; font-weight: 600; color: var(--text); flex: 1; }
1274
+ .todo-header-count { font-size: 12px; color: var(--text-muted); font-family: "Roboto Mono", monospace; }
1275
+
1276
+ .todo-progress {
1277
+ height: 2px;
1278
+ background: var(--border);
1279
+ border-left: 1px solid var(--border);
1280
+ border-right: 1px solid var(--border);
1281
+ }
1282
+
1283
+ .todo-progress-bar {
1284
+ height: 100%;
1285
+ background: var(--success);
1286
+ transition: width 0.3s ease;
1287
+ }
1288
+
1289
+ .todo-items {
1290
+ border: 1px solid var(--border);
1291
+ border-top: none;
1292
+ border-radius: 0 0 12px 12px;
1293
+ overflow: hidden;
1294
+ }
1295
+
1296
+ .todo-item {
1297
+ display: flex;
1298
+ align-items: center;
1299
+ gap: 10px;
1300
+ padding: 10px 16px;
1301
+ font-size: 13px;
1302
+ border-bottom: 1px solid var(--border-subtle);
1303
+ }
1304
+
1305
+ .todo-item:last-child { border-bottom: none; }
1306
+
1307
+ .todo-item-icon { display: inline-flex; flex-shrink: 0; }
1308
+ .todo-item-icon .lucide { width: 16px; height: 16px; }
1309
+ .todo-item.pending .todo-item-icon { color: var(--text-dimmer); }
1310
+ .todo-item.in-progress .todo-item-icon { color: var(--accent); }
1311
+ .todo-item.completed .todo-item-icon { color: var(--success); }
1312
+
1313
+ .todo-item-text { flex: 1; line-height: 1.4; }
1314
+ .todo-item.pending .todo-item-text { color: var(--text-muted); }
1315
+ .todo-item.in-progress .todo-item-text { color: var(--text); }
1316
+ .todo-item.completed .todo-item-text { color: var(--text-dimmer); text-decoration: line-through; }
1317
+
1318
+ /* ==========================================================================
1319
+ Turn Metadata & System Messages
1320
+ ========================================================================== */
1321
+
1322
+ .turn-meta {
1323
+ max-width: var(--content-width);
1324
+ margin: 4px auto 20px;
1325
+ padding: 0 20px;
1326
+ font-size: 12px;
1327
+ color: var(--text-dimmer);
1328
+ }
1329
+
1330
+ /* ==========================================================================
1331
+ Process Conflict Message
1332
+ ========================================================================== */
1333
+
1334
+ .conflict-msg {
1335
+ max-width: var(--content-width);
1336
+ margin: 12px auto;
1337
+ padding: 12px 16px;
1338
+ background: color-mix(in srgb, var(--error) 8%, var(--bg));
1339
+ border: 1px solid color-mix(in srgb, var(--error) 30%, transparent);
1340
+ border-radius: 8px;
1341
+ font-size: 13px;
1342
+ }
1343
+
1344
+ .conflict-header {
1345
+ font-weight: 600;
1346
+ color: var(--error);
1347
+ margin-bottom: 4px;
1348
+ }
1349
+
1350
+ .conflict-hint {
1351
+ color: var(--text-dim);
1352
+ font-size: 12px;
1353
+ margin-bottom: 10px;
1354
+ }
1355
+
1356
+ .conflict-process {
1357
+ display: flex;
1358
+ align-items: center;
1359
+ gap: 8px;
1360
+ padding: 6px 8px;
1361
+ background: color-mix(in srgb, var(--error) 5%, var(--bg));
1362
+ border-radius: 4px;
1363
+ margin-top: 4px;
1364
+ }
1365
+
1366
+ .conflict-pid {
1367
+ font-weight: 600;
1368
+ font-size: 12px;
1369
+ color: var(--text);
1370
+ white-space: nowrap;
1371
+ }
1372
+
1373
+ .conflict-cmd {
1374
+ flex: 1;
1375
+ font-size: 11px;
1376
+ color: var(--text-dim);
1377
+ overflow: hidden;
1378
+ text-overflow: ellipsis;
1379
+ white-space: nowrap;
1380
+ }
1381
+
1382
+ .conflict-kill-btn {
1383
+ padding: 4px 12px;
1384
+ border: none;
1385
+ border-radius: 4px;
1386
+ background: var(--error);
1387
+ color: #fff;
1388
+ font-size: 12px;
1389
+ font-weight: 500;
1390
+ cursor: pointer;
1391
+ white-space: nowrap;
1392
+ transition: opacity 0.15s;
1393
+ }
1394
+
1395
+ .conflict-kill-btn:hover { opacity: 0.85; }
1396
+ .conflict-kill-btn:disabled { opacity: 0.5; cursor: default; }
1397
+
1398
+ /* ==========================================================================
1399
+ Context Overflow Message
1400
+ ========================================================================== */
1401
+
1402
+ .context-overflow-msg {
1403
+ max-width: var(--content-width);
1404
+ margin: 12px auto;
1405
+ padding: 14px 18px;
1406
+ background: color-mix(in srgb, var(--warning) 8%, var(--bg));
1407
+ border: 1px solid color-mix(in srgb, var(--warning) 30%, transparent);
1408
+ border-radius: 12px;
1409
+ font-size: 13px;
1410
+ }
1411
+
1412
+ .context-overflow-header {
1413
+ font-weight: 600;
1414
+ color: var(--warning);
1415
+ margin-bottom: 4px;
1416
+ }
1417
+
1418
+ .context-overflow-hint {
1419
+ color: var(--text-muted);
1420
+ font-size: 12px;
1421
+ line-height: 1.5;
1422
+ margin-bottom: 12px;
1423
+ }
1424
+
1425
+ .context-overflow-btn {
1426
+ padding: 8px 20px;
1427
+ border: none;
1428
+ border-radius: 8px;
1429
+ background: var(--accent);
1430
+ color: #fff;
1431
+ font-size: 13px;
1432
+ font-weight: 600;
1433
+ font-family: inherit;
1434
+ cursor: pointer;
1435
+ transition: background 0.15s;
1436
+ }
1437
+
1438
+ .context-overflow-btn:hover { background: var(--accent-hover); }
1439
+
1440
+ /* ==========================================================================
1441
+ Rate Limit Message
1442
+ ========================================================================== */
1443
+
1444
+ /* Rate limit inline cards removed — now header-only with popover (see title-bar.css) */
1445
+