lonny-agent 0.2.3 → 0.2.6

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 (129) hide show
  1. package/README.md +326 -326
  2. package/dist/agent/index.js +1 -1
  3. package/dist/agent/index.js.map +1 -1
  4. package/dist/agent/llm.d.ts +4 -0
  5. package/dist/agent/llm.d.ts.map +1 -1
  6. package/dist/agent/project.d.ts +26 -0
  7. package/dist/agent/project.d.ts.map +1 -0
  8. package/dist/agent/project.js +303 -0
  9. package/dist/agent/project.js.map +1 -0
  10. package/dist/agent/prompt-builder.d.ts +1 -1
  11. package/dist/agent/prompt-builder.d.ts.map +1 -1
  12. package/dist/agent/prompt-builder.js +22 -13
  13. package/dist/agent/prompt-builder.js.map +1 -1
  14. package/dist/agent/providers/anthropic.d.ts.map +1 -1
  15. package/dist/agent/providers/anthropic.js +20 -2
  16. package/dist/agent/providers/anthropic.js.map +1 -1
  17. package/dist/agent/providers/google.d.ts.map +1 -1
  18. package/dist/agent/providers/google.js +1 -1
  19. package/dist/agent/providers/google.js.map +1 -1
  20. package/dist/agent/providers/ollama.d.ts.map +1 -1
  21. package/dist/agent/providers/ollama.js +2 -1
  22. package/dist/agent/providers/ollama.js.map +1 -1
  23. package/dist/agent/providers/openai.d.ts.map +1 -1
  24. package/dist/agent/providers/openai.js +63 -3
  25. package/dist/agent/providers/openai.js.map +1 -1
  26. package/dist/agent/session.d.ts +8 -2
  27. package/dist/agent/session.d.ts.map +1 -1
  28. package/dist/agent/session.js +250 -153
  29. package/dist/agent/session.js.map +1 -1
  30. package/dist/config/index.d.ts.map +1 -1
  31. package/dist/config/index.js +7 -1
  32. package/dist/config/index.js.map +1 -1
  33. package/dist/tools/__tests__/bash.test.js +1 -1
  34. package/dist/tools/__tests__/bash.test.js.map +1 -1
  35. package/dist/tools/__tests__/edit.test.js +875 -371
  36. package/dist/tools/__tests__/edit.test.js.map +1 -1
  37. package/dist/tools/__tests__/grep.test.js +32 -0
  38. package/dist/tools/__tests__/grep.test.js.map +1 -1
  39. package/dist/tools/__tests__/sed.test.d.ts +2 -0
  40. package/dist/tools/__tests__/sed.test.d.ts.map +1 -0
  41. package/dist/tools/__tests__/sed.test.js +228 -0
  42. package/dist/tools/__tests__/sed.test.js.map +1 -0
  43. package/dist/tools/bash.d.ts.map +1 -1
  44. package/dist/tools/bash.js +83 -10
  45. package/dist/tools/bash.js.map +1 -1
  46. package/dist/tools/edit.d.ts +58 -0
  47. package/dist/tools/edit.d.ts.map +1 -1
  48. package/dist/tools/edit.js +366 -149
  49. package/dist/tools/edit.js.map +1 -1
  50. package/dist/tools/grep.d.ts.map +1 -1
  51. package/dist/tools/grep.js +54 -30
  52. package/dist/tools/grep.js.map +1 -1
  53. package/dist/tools/read.d.ts +6 -0
  54. package/dist/tools/read.d.ts.map +1 -1
  55. package/dist/tools/read.js +42 -15
  56. package/dist/tools/read.js.map +1 -1
  57. package/dist/tools/registry.d.ts +0 -6
  58. package/dist/tools/registry.d.ts.map +1 -1
  59. package/dist/tools/registry.js +2 -33
  60. package/dist/tools/registry.js.map +1 -1
  61. package/dist/tools/sed.d.ts +4 -0
  62. package/dist/tools/sed.d.ts.map +1 -0
  63. package/dist/tools/sed.js +121 -0
  64. package/dist/tools/sed.js.map +1 -0
  65. package/dist/tools/write_plan.d.ts +1 -1
  66. package/dist/tools/write_plan.d.ts.map +1 -1
  67. package/dist/tools/write_plan.js +14 -4
  68. package/dist/tools/write_plan.js.map +1 -1
  69. package/dist/tui/index.d.ts.map +1 -1
  70. package/dist/tui/index.js +5 -4
  71. package/dist/tui/index.js.map +1 -1
  72. package/dist/web/index.d.ts.map +1 -1
  73. package/dist/web/index.js +30 -7
  74. package/dist/web/index.js.map +1 -1
  75. package/dist/web/public/app.js +5 -855
  76. package/dist/web/public/confirm.js +70 -0
  77. package/dist/web/public/index.html +121 -120
  78. package/dist/web/public/input.js +107 -0
  79. package/dist/web/public/messages.js +395 -0
  80. package/dist/web/public/sidebar.js +82 -0
  81. package/dist/web/public/state.js +72 -0
  82. package/dist/web/public/style.css +996 -949
  83. package/dist/web/public/utils.js +37 -0
  84. package/dist/web/public/websocket.js +267 -0
  85. package/dist/web/public/ws.js +19 -0
  86. package/dist/web/session-bridge.d.ts.map +1 -1
  87. package/dist/web/session-bridge.js +3 -7
  88. package/dist/web/session-bridge.js.map +1 -1
  89. package/package.json +55 -54
  90. package/scripts/copy-native.mjs +24 -0
  91. package/scripts/copy-web.mjs +15 -0
  92. package/src/agent/index.ts +25 -25
  93. package/src/agent/llm.ts +4 -0
  94. package/src/agent/project.ts +366 -0
  95. package/src/agent/prompt-builder.ts +23 -13
  96. package/src/agent/providers/anthropic.ts +179 -172
  97. package/src/agent/providers/google.ts +210 -211
  98. package/src/agent/providers/ollama.ts +186 -182
  99. package/src/agent/providers/openai.ts +73 -5
  100. package/src/agent/session.ts +275 -153
  101. package/src/config/index.ts +342 -335
  102. package/src/tools/__tests__/bash.test.ts +1 -1
  103. package/src/tools/__tests__/edit.test.ts +981 -385
  104. package/src/tools/__tests__/grep.test.ts +35 -0
  105. package/src/tools/bash.ts +97 -11
  106. package/src/tools/edit.ts +414 -154
  107. package/src/tools/git.ts +76 -76
  108. package/src/tools/grep.ts +57 -30
  109. package/src/tools/read.ts +61 -25
  110. package/src/tools/registry.ts +231 -265
  111. package/src/tools/write_plan.ts +21 -5
  112. package/src/tui/index.ts +786 -785
  113. package/src/web/index.ts +29 -7
  114. package/src/web/public/app.js +5 -855
  115. package/src/web/public/confirm.js +70 -0
  116. package/src/web/public/index.html +121 -120
  117. package/src/web/public/input.js +107 -0
  118. package/src/web/public/messages.js +395 -0
  119. package/src/web/public/sidebar.js +82 -0
  120. package/src/web/public/state.js +72 -0
  121. package/src/web/public/style.css +996 -949
  122. package/src/web/public/utils.js +37 -0
  123. package/src/web/public/websocket.js +267 -0
  124. package/src/web/public/ws.js +19 -0
  125. package/src/web/session-bridge.ts +193 -194
  126. package/.kilo/plans/1780064105789-mighty-pixel.md +0 -171
  127. package/.kilo/plans/1780293725888-quick-wizard.md +0 -62
  128. package/.lonny/plan-web-cwd-status.md +0 -38
  129. package/src/tools/exec.ts +0 -348
@@ -1,949 +1,996 @@
1
- /* ── Reset & Base ─────────────────────────────────────────────── */
2
- *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
3
-
4
- :root {
5
- --bg-primary: #1a1a2e;
6
- --bg-secondary: #16213e;
7
- --bg-tertiary: #0f3460;
8
- --text-primary: #e0e0e0;
9
- --text-secondary: #8888aa;
10
- --text-dim: #666688;
11
- --accent: #00aaff;
12
- --accent-dim: #0088cc;
13
- --success: #44cc88;
14
- --warning: #ffb030;
15
- --error: #ff4466;
16
- --border: #2a2a4a;
17
- --input-bg: #0d1117;
18
- --msg-user-bg: #1a3a5c;
19
- --msg-assistant-bg: transparent;
20
- --font-mono: 'Cascadia Code', 'Fira Code', 'JetBrains Mono', 'Consolas', monospace;
21
- --font-ui: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
22
- }
23
-
24
- html, body {
25
- height: 100%;
26
- background: var(--bg-primary);
27
- color: var(--text-primary);
28
- font-family: var(--font-ui);
29
- font-size: 14px;
30
- line-height: 1.6;
31
- overflow: hidden;
32
- }
33
-
34
- /* ── Status Bar ──────────────────────────────────────────────── */
35
- #status-bar {
36
- display: flex;
37
- justify-content: space-between;
38
- align-items: center;
39
- height: 32px;
40
- padding: 0 12px;
41
- background: var(--bg-secondary);
42
- border-bottom: 1px solid var(--border);
43
- font-size: 13px;
44
- user-select: none;
45
- flex-shrink: 0;
46
- }
47
-
48
- .status-left, .status-right {
49
- display: flex;
50
- align-items: center;
51
- gap: 8px;
52
- }
53
-
54
- .logo {
55
- color: var(--accent);
56
- font-weight: bold;
57
- font-family: var(--font-mono);
58
- }
59
-
60
- .separator {
61
- color: var(--text-dim);
62
- }
63
-
64
- .status-idle { color: var(--text-secondary); }
65
- .status-running { color: var(--success); }
66
-
67
- .mode-badge {
68
- padding: 1px 6px;
69
- border-radius: 3px;
70
- font-size: 11px;
71
- font-weight: 600;
72
- text-transform: uppercase;
73
- background: var(--bg-tertiary);
74
- color: var(--accent);
75
- }
76
-
77
- .model-name { color: var(--text-secondary); font-size: 12px; }
78
- .token-stats { color: var(--text-dim); font-size: 12px; display: flex; align-items: center; gap: 2px; }
79
- .token-in { color: var(--accent-dim); }
80
- .token-out { color: var(--success); }
81
- .token-sep { color: var(--text-dim); margin: 0 1px; }
82
- .token-calls { color: var(--text-secondary); margin-left: 4px; }
83
-
84
- .balance-display {
85
- color: var(--warning);
86
- font-size: 12px;
87
- display: flex;
88
- align-items: center;
89
- gap: 2px;
90
- }
91
-
92
- .cwd-text {
93
- color: var(--text-dim);
94
- font-size: 12px;
95
- max-width: 300px;
96
- overflow: hidden;
97
- text-overflow: ellipsis;
98
- white-space: nowrap;
99
- vertical-align: middle;
100
- font-family: var(--font-mono);
101
- }
102
-
103
- /* ── Chat Container ──────────────────────────────────────────── */
104
- #chat-container {
105
- flex: 1;
106
- overflow-y: auto;
107
- padding: 16px;
108
- scroll-behavior: smooth;
109
- min-height: 0;
110
- }
111
-
112
- #chat-container::-webkit-scrollbar {
113
- width: 6px;
114
- }
115
- #chat-container::-webkit-scrollbar-track {
116
- background: transparent;
117
- }
118
- #chat-container::-webkit-scrollbar-thumb {
119
- background: var(--border);
120
- border-radius: 3px;
121
- }
122
-
123
- body {
124
- display: flex;
125
- flex-direction: column;
126
- height: 100vh;
127
- }
128
-
129
- /* ── App Content Layout ───────────────────────────────────────── */
130
- #app-content {
131
- display: flex;
132
- flex-direction: row;
133
- flex: 1;
134
- overflow: hidden;
135
- min-height: 0;
136
- }
137
-
138
- #chat-panel {
139
- display: flex;
140
- flex-direction: column;
141
- flex: 1;
142
- min-width: 0;
143
- overflow: hidden;
144
- }
145
-
146
- /* ── Messages ────────────────────────────────────────────────── */
147
- #messages {
148
- max-width: 800px;
149
- margin: 0 auto;
150
- }
151
-
152
- .message {
153
- margin-bottom: 16px;
154
- animation: fadeIn 0.2s ease-out;
155
- }
156
-
157
- @keyframes fadeIn {
158
- from { opacity: 0; transform: translateY(4px); }
159
- to { opacity: 1; transform: translateY(0); }
160
- }
161
-
162
- .message-header {
163
- display: flex;
164
- align-items: center;
165
- gap: 8px;
166
- margin-bottom: 4px;
167
- font-size: 12px;
168
- color: var(--text-secondary);
169
- }
170
-
171
- .message-header .label {
172
- font-weight: 600;
173
- font-family: var(--font-mono);
174
- }
175
-
176
- .message-header .label.user { color: var(--accent); }
177
- .message-header .label.assistant { color: var(--success); }
178
- .message-header .label.system { color: var(--warning); }
179
- .message-header .label.error { color: var(--error); }
180
-
181
- .message-body {
182
- padding: 8px 12px;
183
- border-radius: 8px;
184
- font-family: var(--font-ui);
185
- line-height: 1.1;
186
- white-space: pre-wrap;
187
- word-break: break-word;
188
- }
189
-
190
- .message-body.user {
191
- background: var(--msg-user-bg);
192
- border: 1px solid var(--border);
193
- }
194
-
195
- .message-body.assistant {
196
- background: var(--msg-assistant-bg);
197
- }
198
-
199
- .message-body.system {
200
- background: transparent;
201
- color: var(--text-secondary);
202
- font-style: italic;
203
- }
204
-
205
- .message-body.error {
206
- color: var(--error);
207
- background: rgba(255, 68, 102, 0.08);
208
- border: 1px solid rgba(255, 68, 102, 0.2);
209
- }
210
-
211
- /* Streaming cursor */
212
- .message-body.assistant.streaming::after {
213
- content: '▋';
214
- animation: blink 0.8s step-end infinite;
215
- color: var(--success);
216
- }
217
-
218
- @keyframes blink {
219
- 50% { opacity: 0; }
220
- }
221
-
222
- /* ── Markdown Content ────────────────────────────────────────── */
223
- .message-body :first-child { margin-top: 0; }
224
- .message-body :last-child { margin-bottom: 0; }
225
-
226
- .message-body p {
227
- margin: 0.25em 0;
228
- }
229
-
230
- .message-body ul, .message-body ol {
231
- margin: 0.15em 0;
232
- padding-left: 1.5em;
233
- }
234
-
235
- .message-body li {
236
- margin: 0;
237
- line-height: 1.2;
238
- }
239
-
240
- /* Neutralize <p> inside <li> (marked wraps list items in <p> when there are blank lines) */
241
- .message-body li > p {
242
- margin: 0;
243
- display: inline;
244
- }
245
-
246
- /* Neutralize ALL block-level children inside li (marked can nest multiple p, div, etc.) */
247
- .message-body li > * {
248
- margin-top: 0;
249
- margin-bottom: 0;
250
- }
251
-
252
- /* Remove <br> spacing inside list items (from breaks:true option) */
253
- .message-body li br {
254
- display: none;
255
- }
256
-
257
- .message-body blockquote {
258
- margin: 0.3em 0;
259
- padding: 3px 10px;
260
- border-left: 3px solid var(--accent-dim);
261
- color: var(--text-secondary);
262
- background: rgba(0, 170, 255, 0.04);
263
- border-radius: 0 4px 4px 0;
264
- }
265
-
266
- .message-body pre {
267
- margin: 0.35em 0;
268
- padding: 8px 12px;
269
- background: var(--input-bg);
270
- border: 1px solid var(--border);
271
- border-radius: 6px;
272
- overflow-x: auto;
273
- font-family: var(--font-mono);
274
- font-size: 13px;
275
- line-height: 1.2;
276
- color: var(--text-primary);
277
- }
278
-
279
- .message-body code {
280
- font-family: var(--font-mono);
281
- font-size: 0.9em;
282
- padding: 1px 4px;
283
- background: rgba(255,255,255,0.06);
284
- border-radius: 3px;
285
- color: var(--warning);
286
- }
287
-
288
- .message-body pre code {
289
- padding: 0;
290
- background: none;
291
- color: inherit;
292
- font-size: inherit;
293
- }
294
-
295
- .message-body table {
296
- margin: 0.35em 0;
297
- border-collapse: collapse;
298
- width: 100%;
299
- font-size: 13px;
300
- }
301
-
302
- .message-body th, .message-body td {
303
- padding: 4px 8px;
304
- border: 1px solid var(--border);
305
- text-align: left;
306
- }
307
-
308
- .message-body th {
309
- background: var(--bg-secondary);
310
- font-weight: 600;
311
- color: var(--text-secondary);
312
- }
313
-
314
- .message-body hr {
315
- margin: 0.5em 0;
316
- border: none;
317
- border-top: 1px solid var(--border);
318
- }
319
-
320
- .message-body h1, .message-body h2, .message-body h3,
321
- .message-body h4, .message-body h5, .message-body h6 {
322
- margin: 0.4em 0 0.2em;
323
- color: var(--text-primary);
324
- font-weight: 600;
325
- line-height: 1.3;
326
- }
327
-
328
- .message-body h1 { font-size: 1.2em; }
329
- .message-body h2 { font-size: 1.15em; }
330
- .message-body h3 { font-size: 1.05em; }
331
- .message-body h4 { font-size: 1em; }
332
-
333
- .message-body a {
334
- color: var(--accent);
335
- text-decoration: none;
336
- }
337
-
338
- .message-body a:hover {
339
- text-decoration: underline;
340
- }
341
-
342
- .message-body img {
343
- max-width: 100%;
344
- border-radius: 6px;
345
- margin: 0.35em 0;
346
- }
347
-
348
- /* ── Tool Calls & Results ───────────────────────────────────── */
349
- .tool-call,
350
- .tool-result {
351
- margin: 2px 0 2px 12px;
352
- padding: 3px 8px;
353
- border-left: 2px solid var(--border);
354
- font-size: 13px;
355
- font-family: var(--font-mono);
356
- color: var(--text-secondary);
357
- line-height: 1.5;
358
- }
359
-
360
- .tool-call .tool-name { color: var(--accent-dim); }
361
- .tool-call .tool-name.tool-name-edit { color: var(--warning); }
362
- .tool-call .tool-input { color: var(--text-dim); }
363
- .tool-call .tool-input.tool-input-edit { font-family: var(--font-mono); font-size: 0.85em; }
364
- .tool-call.completed { opacity: 0.6; }
365
- .tool-call.completed .tool-name::before { display: none; }
366
-
367
- .tool-result .tool-result-success { color: var(--success); }
368
- .tool-result .tool-result-error { color: var(--error); }
369
- .tool-result .tool-result-summary {
370
- display: block;
371
- color: var(--text-secondary);
372
- font-size: 0.85em;
373
- margin-top: 2px;
374
- line-height: 1.3;
375
- }
376
-
377
- /* ── Edit Diff Display ─────────────────────────────────────────── */
378
- .tool-result .tool-result-diff {
379
- display: block;
380
- margin-top: 2px;
381
- }
382
-
383
- .tool-result .tool-result-diff pre {
384
- max-height: 300px;
385
- max-width: 100%;
386
- overflow-y: auto;
387
- overflow-x: auto;
388
- background: var(--input-bg);
389
- border: 1px solid var(--border);
390
- border-radius: 6px;
391
- padding: 8px 12px;
392
- margin: 4px 0;
393
- font-size: 12px;
394
- line-height: 1.4;
395
- white-space: pre;
396
- word-break: break-all;
397
- }
398
-
399
- .tool-result .tool-result-diff code {
400
- font-family: var(--font-mono);
401
- font-size: inherit;
402
- color: inherit;
403
- background: none;
404
- padding: 0;
405
- }
406
-
407
- .tool-result .diff-added {
408
- color: var(--success);
409
- }
410
-
411
- .tool-result .diff-removed {
412
- color: var(--error);
413
- }
414
-
415
- /* ── Thinking Block ──────────────────────────────────────────── */
416
- .thinking-block {
417
- margin: 4px 0 4px 12px;
418
- padding: 6px 10px;
419
- border-left: 2px solid var(--warning);
420
- background: rgba(255, 176, 48, 0.05);
421
- border-radius: 4px;
422
- font-size: 13px;
423
- color: var(--text-dim);
424
- font-family: var(--font-mono);
425
- }
426
-
427
- .thinking-block .thinking-label {
428
- color: var(--warning);
429
- font-size: 11px;
430
- font-weight: 600;
431
- text-transform: uppercase;
432
- margin-bottom: 2px;
433
- }
434
-
435
- .thinking-block .thinking-content {
436
- white-space: pre-wrap;
437
- word-break: break-word;
438
- line-height: 1.5;
439
- }
440
-
441
- /* Markdown styles for thinking content */
442
- .thinking-content :first-child { margin-top: 0; }
443
- .thinking-content :last-child { margin-bottom: 0; }
444
- .thinking-content p { margin: 0.2em 0; }
445
- .thinking-content ul, .thinking-content ol { margin: 0.15em 0; padding-left: 1.5em; }
446
- .thinking-content li { margin: 0; line-height: 1.2; }
447
- .thinking-content li > p { margin: 0; display: inline; }
448
- .thinking-content li > * { margin-top: 0; margin-bottom: 0; }
449
- .thinking-content code {
450
- font-family: var(--font-mono);
451
- font-size: 0.9em;
452
- padding: 1px 4px;
453
- background: rgba(255,255,255,0.08);
454
- border-radius: 3px;
455
- color: var(--warning);
456
- }
457
- .thinking-content pre {
458
- margin: 0.4em 0;
459
- padding: 8px 12px;
460
- background: var(--input-bg);
461
- border: 1px solid var(--border);
462
- border-radius: 4px;
463
- overflow-x: auto;
464
- font-size: 12px;
465
- line-height: 1.5;
466
- }
467
- .thinking-content pre code { padding: 0; background: none; color: inherit; font-size: inherit; }
468
-
469
- .thinking-block.thinking-done {
470
- opacity: 0.7;
471
- border-left-color: var(--text-dim);
472
- }
473
-
474
- .thinking-block.thinking-done .thinking-label {
475
- color: var(--text-dim);
476
- }
477
-
478
- /* ── Token Stats ─────────────────────────────────────────────── */
479
- .token-stats-bar {
480
- margin: 8px 0 12px 12px;
481
- padding: 4px 8px;
482
- font-size: 12px;
483
- color: var(--text-dim);
484
- font-family: var(--font-mono);
485
- border-left: 2px solid var(--border);
486
- }
487
-
488
- /* ── System Messages ─────────────────────────────────────────── */
489
- .system-message {
490
- text-align: center;
491
- color: var(--text-dim);
492
- font-size: 13px;
493
- margin: 8px 0;
494
- padding: 4px 8px;
495
- }
496
-
497
- /* ── Input Area ──────────────────────────────────────────────── */
498
- #input-area {
499
- flex-shrink: 0;
500
- border-top: 1px solid var(--border);
501
- background: var(--bg-secondary);
502
- padding: 8px 16px;
503
- }
504
-
505
- .input-wrapper {
506
- display: flex;
507
- gap: 8px;
508
- max-width: 800px;
509
- margin: 0 auto;
510
- align-items: flex-end;
511
- }
512
-
513
- .input-container {
514
- flex: 1;
515
- position: relative;
516
- }
517
-
518
- /* ── Slash Command Hint ─────────────────────────────────────── */
519
- .slash-hint {
520
- position: absolute;
521
- bottom: 100%;
522
- left: 0;
523
- right: 0;
524
- margin-bottom: 4px;
525
- background: var(--bg-tertiary);
526
- border: 1px solid var(--border);
527
- border-radius: 8px;
528
- padding: 6px 0;
529
- font-size: 13px;
530
- z-index: 100;
531
- box-shadow: 0 -4px 16px rgba(0,0,0,0.3);
532
- }
533
-
534
- .slash-hint-header {
535
- padding: 4px 12px 6px;
536
- font-size: 11px;
537
- font-weight: 600;
538
- text-transform: uppercase;
539
- color: var(--text-dim);
540
- letter-spacing: 0.5px;
541
- }
542
-
543
- .slash-hint-item {
544
- padding: 6px 12px;
545
- cursor: pointer;
546
- color: var(--text-primary);
547
- font-family: var(--font-mono);
548
- font-size: 13px;
549
- transition: background 0.15s;
550
- }
551
-
552
- .slash-hint-item:hover,
553
- .slash-hint-item.selected {
554
- background: rgba(0, 170, 255, 0.12);
555
- }
556
-
557
- .slash-hint-item .hint-arg {
558
- color: var(--warning);
559
- }
560
-
561
- .slash-hint-item .hint-desc {
562
- color: var(--text-dim);
563
- font-family: var(--font-ui);
564
- font-size: 12px;
565
- margin-left: 6px;
566
- }
567
-
568
- #chat-input {
569
- flex: 1;
570
- background: var(--input-bg);
571
- border: 1px solid var(--border);
572
- border-radius: 8px;
573
- color: var(--text-primary);
574
- font-family: var(--font-mono);
575
- font-size: 14px;
576
- padding: 10px 14px;
577
- resize: none;
578
- outline: none;
579
- line-height: 1.5;
580
- transition: border-color 0.2s;
581
- width: 100%;
582
- }
583
-
584
- #chat-input:focus {
585
- border-color: var(--accent);
586
- }
587
-
588
- #chat-input::placeholder {
589
- color: var(--text-dim);
590
- }
591
-
592
- #send-btn {
593
- background: var(--accent);
594
- border: none;
595
- border-radius: 8px;
596
- width: 40px;
597
- height: 40px;
598
- display: flex;
599
- align-items: center;
600
- justify-content: center;
601
- cursor: pointer;
602
- color: white;
603
- transition: background 0.2s, opacity 0.2s;
604
- flex-shrink: 0;
605
- }
606
-
607
- #send-btn:hover { background: var(--accent-dim); }
608
- #send-btn:disabled {
609
- opacity: 0.4;
610
- cursor: not-allowed;
611
- }
612
-
613
- /* ── Stop Button ────────────────────────────────────────────── */
614
- #stop-btn {
615
- background: var(--error);
616
- border: none;
617
- border-radius: 8px;
618
- width: 40px;
619
- height: 40px;
620
- display: flex;
621
- align-items: center;
622
- justify-content: center;
623
- cursor: pointer;
624
- color: white;
625
- transition: background 0.2s, opacity 0.2s;
626
- flex-shrink: 0;
627
- }
628
-
629
- #stop-btn:hover { background: #cc2244; }
630
- #stop-btn:disabled {
631
- opacity: 0.4;
632
- cursor: not-allowed;
633
- }
634
-
635
- /* ── Tool Running State ──────────────────────────────────────── */
636
- .tool-call.executing .tool-name {
637
- color: var(--warning);
638
- }
639
- .tool-call.executing .tool-name::before {
640
- content: '';
641
- display: inline-block;
642
- width: 12px;
643
- height: 12px;
644
- margin-right: 4px;
645
- border: 2px solid var(--warning);
646
- border-top-color: transparent;
647
- border-radius: 50%;
648
- animation: spin 0.6s linear infinite;
649
- vertical-align: middle;
650
- }
651
-
652
- /* ── Confirm Dialog ──────────────────────────────────────────── */
653
- .confirm-dialog {
654
- background: var(--bg-secondary);
655
- border: 1px solid var(--border);
656
- border-radius: 12px;
657
- padding: 20px;
658
- min-width: 360px;
659
- max-width: 480px;
660
- box-shadow: 0 8px 32px rgba(0,0,0,0.4);
661
- }
662
-
663
- .confirm-header {
664
- font-size: 15px;
665
- font-weight: 600;
666
- color: var(--text-primary);
667
- margin-bottom: 12px;
668
- }
669
-
670
- .confirm-tool-list {
671
- margin-bottom: 16px;
672
- }
673
-
674
- .confirm-tool-item {
675
- padding: 6px 10px;
676
- margin-bottom: 4px;
677
- background: rgba(255,255,255,0.03);
678
- border-radius: 6px;
679
- font-family: var(--font-mono);
680
- font-size: 13px;
681
- color: var(--text-secondary);
682
- line-height: 1.4;
683
- }
684
-
685
- .confirm-tool-item .confirm-tool-name {
686
- color: var(--accent-dim);
687
- font-weight: 600;
688
- }
689
-
690
- .confirm-tool-item .confirm-tool-input {
691
- color: var(--text-dim);
692
- word-break: break-all;
693
- }
694
-
695
- .confirm-actions {
696
- display: flex;
697
- gap: 8px;
698
- justify-content: flex-end;
699
- }
700
-
701
- .confirm-btn {
702
- padding: 8px 20px;
703
- border: none;
704
- border-radius: 6px;
705
- font-family: var(--font-ui);
706
- font-size: 14px;
707
- font-weight: 600;
708
- cursor: pointer;
709
- transition: background 0.15s, opacity 0.15s;
710
- }
711
-
712
- .confirm-btn-allow {
713
- background: var(--success);
714
- color: white;
715
- }
716
-
717
- .confirm-btn-allow:hover {
718
- opacity: 0.85;
719
- }
720
-
721
- .confirm-btn-reject {
722
- background: transparent;
723
- color: var(--text-secondary);
724
- border: 1px solid var(--border);
725
- }
726
-
727
- .confirm-btn-reject:hover {
728
- background: rgba(255,255,255,0.06);
729
- color: var(--text-primary);
730
- }
731
-
732
- /* ── Connection Overlay ──────────────────────────────────────── */
733
- .overlay {
734
- position: fixed;
735
- inset: 0;
736
- background: rgba(0, 0, 0, 0.6);
737
- display: flex;
738
- align-items: center;
739
- justify-content: center;
740
- z-index: 1000;
741
- }
742
-
743
- .overlay.hidden {
744
- display: none;
745
- }
746
-
747
- .overlay-content {
748
- text-align: center;
749
- color: var(--text-primary);
750
- }
751
-
752
- .overlay-content p {
753
- margin-top: 16px;
754
- color: var(--text-secondary);
755
- }
756
-
757
- .spinner {
758
- width: 40px;
759
- height: 40px;
760
- margin: 0 auto;
761
- border: 3px solid var(--border);
762
- border-top-color: var(--accent);
763
- border-radius: 50%;
764
- animation: spin 0.8s linear infinite;
765
- }
766
-
767
- @keyframes spin {
768
- to { transform: rotate(360deg); }
769
- }
770
-
771
- /* ── Scrollbar for chat ──────────────────────────────────────── */
772
- #chat-container::-webkit-scrollbar { width: 8px; }
773
- #chat-container::-webkit-scrollbar-track { background: transparent; }
774
- #chat-container::-webkit-scrollbar-thumb {
775
- background: var(--text-dim);
776
- border-radius: 4px;
777
- }
778
- #chat-container::-webkit-scrollbar-thumb:hover {
779
- background: var(--text-secondary);
780
- }
781
-
782
- /* ── Right Sidebar ────────────────────────────────────────────── */
783
- #sidebar {
784
- width: 280px;
785
- flex-shrink: 0;
786
- background: var(--bg-secondary);
787
- border-left: 1px solid var(--border);
788
- display: flex;
789
- flex-direction: column;
790
- overflow: hidden;
791
- }
792
-
793
- .sidebar-tabs {
794
- display: flex;
795
- border-bottom: 1px solid var(--border);
796
- flex-shrink: 0;
797
- }
798
-
799
- .sidebar-tab {
800
- flex: 1;
801
- padding: 8px 4px;
802
- background: transparent;
803
- border: none;
804
- color: var(--text-dim);
805
- font-family: var(--font-ui);
806
- font-size: 12px;
807
- font-weight: 600;
808
- cursor: pointer;
809
- transition: color 0.15s, background 0.15s;
810
- text-transform: uppercase;
811
- letter-spacing: 0.5px;
812
- }
813
-
814
- .sidebar-tab:hover {
815
- color: var(--text-secondary);
816
- background: rgba(255,255,255,0.03);
817
- }
818
-
819
- .sidebar-tab.active {
820
- color: var(--accent);
821
- background: rgba(0,170,255,0.06);
822
- border-bottom: 2px solid var(--accent);
823
- }
824
-
825
- .sidebar-content {
826
- flex: 1;
827
- overflow-y: auto;
828
- min-height: 0;
829
- }
830
-
831
- .sidebar-content::-webkit-scrollbar {
832
- width: 6px;
833
- }
834
- .sidebar-content::-webkit-scrollbar-track {
835
- background: transparent;
836
- }
837
- .sidebar-content::-webkit-scrollbar-thumb {
838
- background: var(--text-dim);
839
- border-radius: 3px;
840
- }
841
- .sidebar-content::-webkit-scrollbar-thumb:hover {
842
- background: var(--text-secondary);
843
- }
844
-
845
- .sidebar-pane {
846
- display: none;
847
- padding: 8px;
848
- }
849
-
850
- .sidebar-pane.active {
851
- display: block;
852
- }
853
-
854
- .sidebar-placeholder {
855
- color: var(--text-dim);
856
- font-size: 13px;
857
- text-align: center;
858
- padding: 20px 8px;
859
- font-style: italic;
860
- }
861
-
862
- /* ── Plan List Items ─────────────────────────────────────────── */
863
- .plan-item {
864
- padding: 8px 10px;
865
- margin-bottom: 4px;
866
- border-radius: 6px;
867
- cursor: pointer;
868
- transition: background 0.15s;
869
- border: 1px solid transparent;
870
- }
871
-
872
- .plan-item:hover {
873
- background: rgba(0,170,255,0.06);
874
- border-color: var(--border);
875
- }
876
-
877
- .plan-item.active {
878
- background: rgba(0,170,255,0.1);
879
- border-color: var(--accent-dim);
880
- }
881
-
882
- .plan-item .plan-name {
883
- color: var(--text-primary);
884
- font-size: 13px;
885
- font-weight: 600;
886
- font-family: var(--font-mono);
887
- word-break: break-all;
888
- }
889
-
890
- .plan-item .plan-time {
891
- color: var(--text-dim);
892
- font-size: 11px;
893
- margin-top: 2px;
894
- }
895
-
896
- /* ── Todo Items ──────────────────────────────────────────────── */
897
- .todo-item {
898
- display: flex;
899
- align-items: flex-start;
900
- gap: 6px;
901
- padding: 5px 8px;
902
- margin-bottom: 2px;
903
- border-radius: 4px;
904
- font-size: 13px;
905
- line-height: 1.4;
906
- transition: background 0.15s;
907
- }
908
-
909
- .todo-item:hover {
910
- background: rgba(255,255,255,0.03);
911
- }
912
-
913
- .todo-item .todo-check {
914
- flex-shrink: 0;
915
- margin-top: 1px;
916
- font-size: 14px;
917
- }
918
-
919
- .todo-item .todo-check.done {
920
- color: var(--success);
921
- }
922
-
923
- .todo-item .todo-check.pending {
924
- color: var(--text-dim);
925
- }
926
-
927
- .todo-item .todo-text {
928
- color: var(--text-primary);
929
- word-break: break-word;
930
- }
931
-
932
- .todo-item .todo-text.done {
933
- color: var(--text-dim);
934
- text-decoration: line-through;
935
- }
936
-
937
- .todo-header-text {
938
- color: var(--text-secondary);
939
- font-size: 11px;
940
- font-weight: 600;
941
- padding: 4px 8px 6px;
942
- text-transform: uppercase;
943
- letter-spacing: 0.5px;
944
- border-bottom: 1px solid var(--border);
945
- margin-bottom: 4px;
946
- }
947
-
948
- /* ── Utility ─────────────────────────────────────────────────── */
949
- .hidden { display: none !important; }
1
+ /* ── Reset & Base ─────────────────────────────────────────────── */
2
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
3
+
4
+ :root {
5
+ --bg-primary: #1a1a2e;
6
+ --bg-secondary: #16213e;
7
+ --bg-tertiary: #0f3460;
8
+ --text-primary: #e0e0e0;
9
+ --text-secondary: #8888aa;
10
+ --text-dim: #666688;
11
+ --accent: #00aaff;
12
+ --accent-dim: #0088cc;
13
+ --success: #44cc88;
14
+ --warning: #ffb030;
15
+ --error: #ff4466;
16
+ --border: #2a2a4a;
17
+ --input-bg: #0d1117;
18
+ --msg-user-bg: #1a3a5c;
19
+ --msg-assistant-bg: transparent;
20
+ --font-mono: 'Cascadia Code', 'Fira Code', 'JetBrains Mono', 'Consolas', monospace;
21
+ --font-ui: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
22
+ }
23
+
24
+ html, body {
25
+ height: 100%;
26
+ background: var(--bg-primary);
27
+ color: var(--text-primary);
28
+ font-family: var(--font-ui);
29
+ font-size: 14px;
30
+ line-height: 1.6;
31
+ overflow: hidden;
32
+ }
33
+
34
+ /* ── Status Bar ──────────────────────────────────────────────── */
35
+ #status-bar {
36
+ display: flex;
37
+ justify-content: space-between;
38
+ align-items: center;
39
+ height: 32px;
40
+ padding: 0 12px;
41
+ background: var(--bg-secondary);
42
+ border-bottom: 1px solid var(--border);
43
+ font-size: 13px;
44
+ user-select: none;
45
+ flex-shrink: 0;
46
+ }
47
+
48
+ .status-left, .status-right {
49
+ display: flex;
50
+ align-items: center;
51
+ gap: 8px;
52
+ }
53
+
54
+ .logo {
55
+ color: var(--accent);
56
+ font-weight: bold;
57
+ font-family: var(--font-mono);
58
+ }
59
+
60
+ .separator {
61
+ color: var(--text-dim);
62
+ }
63
+
64
+ .status-idle { color: var(--text-secondary); }
65
+ .status-running { color: var(--success); }
66
+
67
+ .mode-badge {
68
+ padding: 1px 6px;
69
+ border-radius: 3px;
70
+ font-size: 11px;
71
+ font-weight: 600;
72
+ text-transform: uppercase;
73
+ background: var(--bg-tertiary);
74
+ color: var(--accent);
75
+ }
76
+
77
+ .model-name { color: var(--text-secondary); font-size: 12px; }
78
+ .token-stats { color: var(--text-dim); font-size: 12px; display: flex; align-items: center; gap: 2px; }
79
+ .token-in { color: var(--accent-dim); }
80
+ .token-out { color: var(--success); }
81
+ .token-sep { color: var(--text-dim); margin: 0 1px; }
82
+ .token-calls { color: var(--text-secondary); margin-left: 4px; }
83
+ .token-cache { color: var(--accent-dim); font-size: 12px; margin-left: 4px; }
84
+
85
+ .balance-display {
86
+ color: var(--warning);
87
+ font-size: 12px;
88
+ display: flex;
89
+ align-items: center;
90
+ gap: 2px;
91
+ }
92
+
93
+ .cwd-text {
94
+ color: var(--text-dim);
95
+ font-size: 12px;
96
+ max-width: 300px;
97
+ overflow: hidden;
98
+ text-overflow: ellipsis;
99
+ white-space: nowrap;
100
+ vertical-align: middle;
101
+ font-family: var(--font-mono);
102
+ }
103
+
104
+ /* ── Chat Container ──────────────────────────────────────────── */
105
+ #chat-container {
106
+ flex: 1;
107
+ overflow-y: auto;
108
+ padding: 16px;
109
+ scroll-behavior: smooth;
110
+ min-height: 0;
111
+ }
112
+
113
+ #chat-container::-webkit-scrollbar {
114
+ width: 6px;
115
+ }
116
+ #chat-container::-webkit-scrollbar-track {
117
+ background: transparent;
118
+ }
119
+ #chat-container::-webkit-scrollbar-thumb {
120
+ background: var(--border);
121
+ border-radius: 3px;
122
+ }
123
+
124
+ body {
125
+ display: flex;
126
+ flex-direction: column;
127
+ height: 100vh;
128
+ }
129
+
130
+ /* ── App Content Layout ───────────────────────────────────────── */
131
+ #app-content {
132
+ display: flex;
133
+ flex-direction: row;
134
+ flex: 1;
135
+ overflow: hidden;
136
+ min-height: 0;
137
+ }
138
+
139
+ #chat-panel {
140
+ display: flex;
141
+ flex-direction: column;
142
+ flex: 1;
143
+ min-width: 0;
144
+ overflow: hidden;
145
+ }
146
+
147
+ /* ── Messages ────────────────────────────────────────────────── */
148
+ #messages {
149
+ max-width: 1200px;
150
+ margin: 0 auto;
151
+ }
152
+
153
+ .message {
154
+ margin-bottom: 16px;
155
+ animation: fadeIn 0.2s ease-out;
156
+ }
157
+
158
+ @keyframes fadeIn {
159
+ from { opacity: 0; transform: translateY(4px); }
160
+ to { opacity: 1; transform: translateY(0); }
161
+ }
162
+
163
+ .message-header {
164
+ display: flex;
165
+ align-items: center;
166
+ gap: 8px;
167
+ margin-bottom: 4px;
168
+ font-size: 12px;
169
+ color: var(--text-secondary);
170
+ }
171
+
172
+ .message-header .label {
173
+ font-weight: 600;
174
+ font-family: var(--font-mono);
175
+ }
176
+
177
+ .message-header .label.user { color: var(--accent); }
178
+ .message-header .label.assistant { color: var(--success); }
179
+ .message-header .label.system { color: var(--warning); }
180
+ .message-header .label.error { color: var(--error); }
181
+
182
+ .message-body {
183
+ padding: 8px 12px;
184
+ border-radius: 8px;
185
+ font-family: var(--font-ui);
186
+ line-height: 1.1;
187
+ white-space: pre-wrap;
188
+ word-break: break-word;
189
+ }
190
+
191
+ .message-body.user {
192
+ background: var(--msg-user-bg);
193
+ border: 1px solid var(--border);
194
+ }
195
+
196
+ .message-body.assistant {
197
+ background: var(--msg-assistant-bg);
198
+ }
199
+
200
+ .message-body.system {
201
+ background: transparent;
202
+ color: var(--text-secondary);
203
+ font-style: italic;
204
+ }
205
+
206
+ .message-body.error {
207
+ color: var(--error);
208
+ background: rgba(255, 68, 102, 0.08);
209
+ border: 1px solid rgba(255, 68, 102, 0.2);
210
+ }
211
+
212
+ /* Streaming cursor */
213
+ .message-body.assistant.streaming::after {
214
+ content: '▋';
215
+ animation: blink 0.8s step-end infinite;
216
+ color: var(--success);
217
+ }
218
+
219
+ @keyframes blink {
220
+ 50% { opacity: 0; }
221
+ }
222
+
223
+ /* ── Markdown Content ────────────────────────────────────────── */
224
+ .message-body :first-child { margin-top: 0; }
225
+ .message-body :last-child { margin-bottom: 0; }
226
+
227
+ .message-body p {
228
+ margin: 0.25em 0;
229
+ }
230
+
231
+ .message-body ul, .message-body ol {
232
+ margin: 0.15em 0;
233
+ padding-left: 1.5em;
234
+ }
235
+
236
+ .message-body li {
237
+ margin: 0;
238
+ line-height: 1.2;
239
+ }
240
+
241
+ /* Neutralize <p> inside <li> (marked wraps list items in <p> when there are blank lines) */
242
+ .message-body li > p {
243
+ margin: 0;
244
+ display: inline;
245
+ }
246
+
247
+ /* Neutralize ALL block-level children inside li (marked can nest multiple p, div, etc.) */
248
+ .message-body li > * {
249
+ margin-top: 0;
250
+ margin-bottom: 0;
251
+ }
252
+
253
+ /* Remove <br> spacing inside list items (from breaks:true option) */
254
+ .message-body li br {
255
+ display: none;
256
+ }
257
+
258
+ .message-body blockquote {
259
+ margin: 0.3em 0;
260
+ padding: 3px 10px;
261
+ border-left: 3px solid var(--accent-dim);
262
+ color: var(--text-secondary);
263
+ background: rgba(0, 170, 255, 0.04);
264
+ border-radius: 0 4px 4px 0;
265
+ }
266
+
267
+ .message-body pre {
268
+ margin: 0.35em 0;
269
+ padding: 8px 12px;
270
+ background: var(--input-bg);
271
+ border: 1px solid var(--border);
272
+ border-radius: 6px;
273
+ overflow-x: auto;
274
+ font-family: var(--font-mono);
275
+ font-size: 13px;
276
+ line-height: 1.2;
277
+ color: var(--text-primary);
278
+ }
279
+
280
+ .message-body code {
281
+ font-family: var(--font-mono);
282
+ font-size: 0.9em;
283
+ padding: 1px 4px;
284
+ background: rgba(255,255,255,0.06);
285
+ border-radius: 3px;
286
+ color: var(--warning);
287
+ }
288
+
289
+ .message-body pre code {
290
+ padding: 0;
291
+ background: none;
292
+ color: inherit;
293
+ font-size: inherit;
294
+ }
295
+
296
+ .message-body table {
297
+ margin: 0.35em 0;
298
+ border-collapse: collapse;
299
+ width: 100%;
300
+ font-size: 13px;
301
+ }
302
+
303
+ .message-body th, .message-body td {
304
+ padding: 4px 8px;
305
+ border: 1px solid var(--border);
306
+ text-align: left;
307
+ }
308
+
309
+ .message-body th {
310
+ background: var(--bg-secondary);
311
+ font-weight: 600;
312
+ color: var(--text-secondary);
313
+ }
314
+
315
+ .message-body hr {
316
+ margin: 0.5em 0;
317
+ border: none;
318
+ border-top: 1px solid var(--border);
319
+ }
320
+
321
+ .message-body h1, .message-body h2, .message-body h3,
322
+ .message-body h4, .message-body h5, .message-body h6 {
323
+ margin: 0.4em 0 0.2em;
324
+ color: var(--text-primary);
325
+ font-weight: 600;
326
+ line-height: 1.3;
327
+ }
328
+
329
+ .message-body h1 { font-size: 1.2em; }
330
+ .message-body h2 { font-size: 1.15em; }
331
+ .message-body h3 { font-size: 1.05em; }
332
+ .message-body h4 { font-size: 1em; }
333
+
334
+ .message-body a {
335
+ color: var(--accent);
336
+ text-decoration: none;
337
+ }
338
+
339
+ .message-body a:hover {
340
+ text-decoration: underline;
341
+ }
342
+
343
+ .message-body img {
344
+ max-width: 100%;
345
+ border-radius: 6px;
346
+ margin: 0.35em 0;
347
+ }
348
+
349
+ /* ── Tool Calls & Results ───────────────────────────────────── */
350
+ .tool-call,
351
+ .tool-result {
352
+ margin: 2px 0 2px 12px;
353
+ padding: 3px 8px;
354
+ border-left: 2px solid var(--border);
355
+ font-size: 13px;
356
+ font-family: var(--font-mono);
357
+ color: var(--text-secondary);
358
+ line-height: 1.5;
359
+ }
360
+
361
+ .tool-call .tool-name { color: var(--accent-dim); }
362
+ .tool-call .tool-name.tool-name-edit { color: var(--warning); }
363
+ .tool-call .tool-input { color: var(--text-dim); }
364
+ .tool-call .tool-input.tool-input-edit { font-family: var(--font-mono); font-size: 0.85em; }
365
+
366
+ .tool-change-badge {
367
+ display: inline-block;
368
+ font-size: 10px;
369
+ font-weight: 700;
370
+ text-transform: uppercase;
371
+ padding: 0 5px;
372
+ border-radius: 3px;
373
+ margin-left: 4px;
374
+ letter-spacing: 0.3px;
375
+ vertical-align: middle;
376
+ line-height: 1.6;
377
+ }
378
+ .tool-change-edit {
379
+ color: var(--accent);
380
+ background: rgba(0, 170, 255, 0.12);
381
+ }
382
+ .tool-change-create {
383
+ color: var(--success);
384
+ background: rgba(68, 204, 136, 0.12);
385
+ }
386
+ .tool-call.completed { opacity: 0.6; }
387
+ .tool-call.completed .tool-name::before { display: none; }
388
+
389
+ .tool-result .tool-result-success { color: var(--success); }
390
+ .tool-result .tool-result-error { color: var(--error); }
391
+ .tool-result .tool-result-summary {
392
+ display: block;
393
+ color: var(--text-secondary);
394
+ font-size: 0.85em;
395
+ margin-top: 2px;
396
+ line-height: 1.3;
397
+ }
398
+
399
+ /* ── Edit Diff Display ─────────────────────────────────────────── */
400
+ .tool-result .tool-result-diff {
401
+ display: block;
402
+ margin-top: 2px;
403
+ }
404
+
405
+ .tool-result .tool-result-diff pre {
406
+ max-height: 300px;
407
+ max-width: 100%;
408
+ overflow-y: auto;
409
+ overflow-x: auto;
410
+ background: var(--input-bg);
411
+ border: 1px solid var(--border);
412
+ border-radius: 6px;
413
+ padding: 8px 12px;
414
+ margin: 4px 0;
415
+ font-size: 12px;
416
+ line-height: 1.4;
417
+ white-space: pre;
418
+ word-break: break-all;
419
+ }
420
+
421
+ .tool-result .tool-result-diff code {
422
+ font-family: var(--font-mono);
423
+ font-size: inherit;
424
+ color: inherit;
425
+ background: none;
426
+ padding: 0;
427
+ }
428
+
429
+ .tool-result .diff-added {
430
+ color: var(--success);
431
+ }
432
+
433
+ .tool-result .diff-removed {
434
+ color: var(--error);
435
+ }
436
+
437
+ /* ── Tool Error Display ──────────────────────────────────────────── */
438
+ .tool-result .tool-error-detail {
439
+ display: block;
440
+ margin-top: 4px;
441
+ padding: 6px 10px;
442
+ background: rgba(255, 68, 102, 0.06);
443
+ border: 1px solid rgba(255, 68, 102, 0.15);
444
+ border-radius: 4px;
445
+ font-size: 12px;
446
+ line-height: 1.4;
447
+ color: var(--text-secondary);
448
+ max-height: 120px;
449
+ overflow-y: auto;
450
+ word-break: break-all;
451
+ white-space: pre-wrap;
452
+ }
453
+
454
+ .tool-result .tool-error-files {
455
+ display: block;
456
+ margin-top: 2px;
457
+ font-size: 12px;
458
+ color: var(--error);
459
+ font-weight: 600;
460
+ }
461
+
462
+ /* ── Thinking Block ──────────────────────────────────────────── */
463
+ .thinking-block {
464
+ margin: 4px 0 4px 12px;
465
+ padding: 6px 10px;
466
+ border-left: 2px solid var(--warning);
467
+ background: rgba(255, 176, 48, 0.05);
468
+ border-radius: 4px;
469
+ font-size: 13px;
470
+ color: var(--text-dim);
471
+ font-family: var(--font-mono);
472
+ }
473
+
474
+ .thinking-block .thinking-label {
475
+ color: var(--warning);
476
+ font-size: 11px;
477
+ font-weight: 600;
478
+ text-transform: uppercase;
479
+ margin-bottom: 2px;
480
+ }
481
+
482
+ .thinking-block .thinking-content {
483
+ white-space: pre-wrap;
484
+ word-break: break-word;
485
+ line-height: 1.5;
486
+ }
487
+
488
+ /* Markdown styles for thinking content */
489
+ .thinking-content :first-child { margin-top: 0; }
490
+ .thinking-content :last-child { margin-bottom: 0; }
491
+ .thinking-content p { margin: 0.2em 0; }
492
+ .thinking-content ul, .thinking-content ol { margin: 0.15em 0; padding-left: 1.5em; }
493
+ .thinking-content li { margin: 0; line-height: 1.2; }
494
+ .thinking-content li > p { margin: 0; display: inline; }
495
+ .thinking-content li > * { margin-top: 0; margin-bottom: 0; }
496
+ .thinking-content code {
497
+ font-family: var(--font-mono);
498
+ font-size: 0.9em;
499
+ padding: 1px 4px;
500
+ background: rgba(255,255,255,0.08);
501
+ border-radius: 3px;
502
+ color: var(--warning);
503
+ }
504
+ .thinking-content pre {
505
+ margin: 0.4em 0;
506
+ padding: 8px 12px;
507
+ background: var(--input-bg);
508
+ border: 1px solid var(--border);
509
+ border-radius: 4px;
510
+ overflow-x: auto;
511
+ font-size: 12px;
512
+ line-height: 1.5;
513
+ }
514
+ .thinking-content pre code { padding: 0; background: none; color: inherit; font-size: inherit; }
515
+
516
+ .thinking-block.thinking-done {
517
+ opacity: 0.7;
518
+ border-left-color: var(--text-dim);
519
+ }
520
+
521
+ .thinking-block.thinking-done .thinking-label {
522
+ color: var(--text-dim);
523
+ }
524
+
525
+ /* ── Token Stats ─────────────────────────────────────────────── */
526
+ .token-stats-bar {
527
+ margin: 8px 0 12px 12px;
528
+ padding: 4px 8px;
529
+ font-size: 12px;
530
+ color: var(--text-dim);
531
+ font-family: var(--font-mono);
532
+ border-left: 2px solid var(--border);
533
+ }
534
+
535
+ /* ── System Messages ─────────────────────────────────────────── */
536
+ .system-message {
537
+ text-align: center;
538
+ color: var(--text-dim);
539
+ font-size: 13px;
540
+ margin: 8px 0;
541
+ padding: 4px 8px;
542
+ }
543
+
544
+ /* ── Input Area ──────────────────────────────────────────────── */
545
+ #input-area {
546
+ flex-shrink: 0;
547
+ border-top: 1px solid var(--border);
548
+ background: var(--bg-secondary);
549
+ padding: 8px 16px;
550
+ }
551
+
552
+ .input-wrapper {
553
+ display: flex;
554
+ gap: 8px;
555
+ max-width: 800px;
556
+ margin: 0 auto;
557
+ align-items: flex-end;
558
+ }
559
+
560
+ .input-container {
561
+ flex: 1;
562
+ position: relative;
563
+ }
564
+
565
+ /* ── Slash Command Hint ─────────────────────────────────────── */
566
+ .slash-hint {
567
+ position: absolute;
568
+ bottom: 100%;
569
+ left: 0;
570
+ right: 0;
571
+ margin-bottom: 4px;
572
+ background: var(--bg-tertiary);
573
+ border: 1px solid var(--border);
574
+ border-radius: 8px;
575
+ padding: 6px 0;
576
+ font-size: 13px;
577
+ z-index: 100;
578
+ box-shadow: 0 -4px 16px rgba(0,0,0,0.3);
579
+ }
580
+
581
+ .slash-hint-header {
582
+ padding: 4px 12px 6px;
583
+ font-size: 11px;
584
+ font-weight: 600;
585
+ text-transform: uppercase;
586
+ color: var(--text-dim);
587
+ letter-spacing: 0.5px;
588
+ }
589
+
590
+ .slash-hint-item {
591
+ padding: 6px 12px;
592
+ cursor: pointer;
593
+ color: var(--text-primary);
594
+ font-family: var(--font-mono);
595
+ font-size: 13px;
596
+ transition: background 0.15s;
597
+ }
598
+
599
+ .slash-hint-item:hover,
600
+ .slash-hint-item.selected {
601
+ background: rgba(0, 170, 255, 0.12);
602
+ }
603
+
604
+ .slash-hint-item .hint-arg {
605
+ color: var(--warning);
606
+ }
607
+
608
+ .slash-hint-item .hint-desc {
609
+ color: var(--text-dim);
610
+ font-family: var(--font-ui);
611
+ font-size: 12px;
612
+ margin-left: 6px;
613
+ }
614
+
615
+ #chat-input {
616
+ flex: 1;
617
+ background: var(--input-bg);
618
+ border: 1px solid var(--border);
619
+ border-radius: 8px;
620
+ color: var(--text-primary);
621
+ font-family: var(--font-mono);
622
+ font-size: 14px;
623
+ padding: 10px 14px;
624
+ resize: none;
625
+ outline: none;
626
+ line-height: 1.5;
627
+ transition: border-color 0.2s;
628
+ width: 100%;
629
+ }
630
+
631
+ #chat-input:focus {
632
+ border-color: var(--accent);
633
+ }
634
+
635
+ #chat-input::placeholder {
636
+ color: var(--text-dim);
637
+ }
638
+
639
+ #send-btn {
640
+ background: var(--accent);
641
+ border: none;
642
+ border-radius: 8px;
643
+ width: 40px;
644
+ height: 40px;
645
+ display: flex;
646
+ align-items: center;
647
+ justify-content: center;
648
+ cursor: pointer;
649
+ color: white;
650
+ transition: background 0.2s, opacity 0.2s;
651
+ flex-shrink: 0;
652
+ }
653
+
654
+ #send-btn:hover { background: var(--accent-dim); }
655
+ #send-btn:disabled {
656
+ opacity: 0.4;
657
+ cursor: not-allowed;
658
+ }
659
+
660
+ /* ── Stop Button ────────────────────────────────────────────── */
661
+ #stop-btn {
662
+ background: var(--error);
663
+ border: none;
664
+ border-radius: 8px;
665
+ width: 40px;
666
+ height: 40px;
667
+ display: flex;
668
+ align-items: center;
669
+ justify-content: center;
670
+ cursor: pointer;
671
+ color: white;
672
+ transition: background 0.2s, opacity 0.2s;
673
+ flex-shrink: 0;
674
+ }
675
+
676
+ #stop-btn:hover { background: #cc2244; }
677
+ #stop-btn:disabled {
678
+ opacity: 0.4;
679
+ cursor: not-allowed;
680
+ }
681
+
682
+ /* ── Tool Running State ──────────────────────────────────────── */
683
+ .tool-call.executing .tool-name {
684
+ color: var(--warning);
685
+ }
686
+ .tool-call.executing .tool-name::before {
687
+ content: '';
688
+ display: inline-block;
689
+ width: 12px;
690
+ height: 12px;
691
+ margin-right: 4px;
692
+ border: 2px solid var(--warning);
693
+ border-top-color: transparent;
694
+ border-radius: 50%;
695
+ animation: spin 0.6s linear infinite;
696
+ vertical-align: middle;
697
+ }
698
+
699
+ /* ── Confirm Dialog ──────────────────────────────────────────── */
700
+ .confirm-dialog {
701
+ background: var(--bg-secondary);
702
+ border: 1px solid var(--border);
703
+ border-radius: 12px;
704
+ padding: 20px;
705
+ min-width: 360px;
706
+ max-width: 480px;
707
+ box-shadow: 0 8px 32px rgba(0,0,0,0.4);
708
+ }
709
+
710
+ .confirm-header {
711
+ font-size: 15px;
712
+ font-weight: 600;
713
+ color: var(--text-primary);
714
+ margin-bottom: 12px;
715
+ }
716
+
717
+ .confirm-tool-list {
718
+ margin-bottom: 16px;
719
+ }
720
+
721
+ .confirm-tool-item {
722
+ padding: 6px 10px;
723
+ margin-bottom: 4px;
724
+ background: rgba(255,255,255,0.03);
725
+ border-radius: 6px;
726
+ font-family: var(--font-mono);
727
+ font-size: 13px;
728
+ color: var(--text-secondary);
729
+ line-height: 1.4;
730
+ }
731
+
732
+ .confirm-tool-item .confirm-tool-name {
733
+ color: var(--accent-dim);
734
+ font-weight: 600;
735
+ }
736
+
737
+ .confirm-tool-item .confirm-tool-input {
738
+ color: var(--text-dim);
739
+ word-break: break-all;
740
+ }
741
+
742
+ .confirm-actions {
743
+ display: flex;
744
+ gap: 8px;
745
+ justify-content: flex-end;
746
+ }
747
+
748
+ .confirm-btn {
749
+ padding: 8px 20px;
750
+ border: none;
751
+ border-radius: 6px;
752
+ font-family: var(--font-ui);
753
+ font-size: 14px;
754
+ font-weight: 600;
755
+ cursor: pointer;
756
+ transition: background 0.15s, opacity 0.15s;
757
+ }
758
+
759
+ .confirm-btn-allow {
760
+ background: var(--success);
761
+ color: white;
762
+ }
763
+
764
+ .confirm-btn-allow:hover {
765
+ opacity: 0.85;
766
+ }
767
+
768
+ .confirm-btn-reject {
769
+ background: transparent;
770
+ color: var(--text-secondary);
771
+ border: 1px solid var(--border);
772
+ }
773
+
774
+ .confirm-btn-reject:hover {
775
+ background: rgba(255,255,255,0.06);
776
+ color: var(--text-primary);
777
+ }
778
+
779
+ /* ── Connection Overlay ──────────────────────────────────────── */
780
+ .overlay {
781
+ position: fixed;
782
+ inset: 0;
783
+ background: rgba(0, 0, 0, 0.6);
784
+ display: flex;
785
+ align-items: center;
786
+ justify-content: center;
787
+ z-index: 1000;
788
+ }
789
+
790
+ .overlay.hidden {
791
+ display: none;
792
+ }
793
+
794
+ .overlay-content {
795
+ text-align: center;
796
+ color: var(--text-primary);
797
+ }
798
+
799
+ .overlay-content p {
800
+ margin-top: 16px;
801
+ color: var(--text-secondary);
802
+ }
803
+
804
+ .spinner {
805
+ width: 40px;
806
+ height: 40px;
807
+ margin: 0 auto;
808
+ border: 3px solid var(--border);
809
+ border-top-color: var(--accent);
810
+ border-radius: 50%;
811
+ animation: spin 0.8s linear infinite;
812
+ }
813
+
814
+ @keyframes spin {
815
+ to { transform: rotate(360deg); }
816
+ }
817
+
818
+ /* ── Scrollbar for chat ──────────────────────────────────────── */
819
+ #chat-container::-webkit-scrollbar { width: 8px; }
820
+ #chat-container::-webkit-scrollbar-track { background: transparent; }
821
+ #chat-container::-webkit-scrollbar-thumb {
822
+ background: var(--text-dim);
823
+ border-radius: 4px;
824
+ }
825
+ #chat-container::-webkit-scrollbar-thumb:hover {
826
+ background: var(--text-secondary);
827
+ }
828
+
829
+ /* ── Right Sidebar ────────────────────────────────────────────── */
830
+ #sidebar {
831
+ width: 280px;
832
+ flex-shrink: 0;
833
+ background: var(--bg-secondary);
834
+ border-left: 1px solid var(--border);
835
+ display: flex;
836
+ flex-direction: column;
837
+ overflow: hidden;
838
+ }
839
+
840
+ .sidebar-tabs {
841
+ display: flex;
842
+ border-bottom: 1px solid var(--border);
843
+ flex-shrink: 0;
844
+ }
845
+
846
+ .sidebar-tab {
847
+ flex: 1;
848
+ padding: 8px 4px;
849
+ background: transparent;
850
+ border: none;
851
+ color: var(--text-dim);
852
+ font-family: var(--font-ui);
853
+ font-size: 12px;
854
+ font-weight: 600;
855
+ cursor: pointer;
856
+ transition: color 0.15s, background 0.15s;
857
+ text-transform: uppercase;
858
+ letter-spacing: 0.5px;
859
+ }
860
+
861
+ .sidebar-tab:hover {
862
+ color: var(--text-secondary);
863
+ background: rgba(255,255,255,0.03);
864
+ }
865
+
866
+ .sidebar-tab.active {
867
+ color: var(--accent);
868
+ background: rgba(0,170,255,0.06);
869
+ border-bottom: 2px solid var(--accent);
870
+ }
871
+
872
+ .sidebar-content {
873
+ flex: 1;
874
+ overflow-y: auto;
875
+ min-height: 0;
876
+ }
877
+
878
+ .sidebar-content::-webkit-scrollbar {
879
+ width: 6px;
880
+ }
881
+ .sidebar-content::-webkit-scrollbar-track {
882
+ background: transparent;
883
+ }
884
+ .sidebar-content::-webkit-scrollbar-thumb {
885
+ background: var(--text-dim);
886
+ border-radius: 3px;
887
+ }
888
+ .sidebar-content::-webkit-scrollbar-thumb:hover {
889
+ background: var(--text-secondary);
890
+ }
891
+
892
+ .sidebar-pane {
893
+ display: none;
894
+ padding: 8px;
895
+ }
896
+
897
+ .sidebar-pane.active {
898
+ display: block;
899
+ }
900
+
901
+ .sidebar-placeholder {
902
+ color: var(--text-dim);
903
+ font-size: 13px;
904
+ text-align: center;
905
+ padding: 20px 8px;
906
+ font-style: italic;
907
+ }
908
+
909
+ /* ── Plan List Items ─────────────────────────────────────────── */
910
+ .plan-item {
911
+ padding: 8px 10px;
912
+ margin-bottom: 4px;
913
+ border-radius: 6px;
914
+ cursor: pointer;
915
+ transition: background 0.15s;
916
+ border: 1px solid transparent;
917
+ }
918
+
919
+ .plan-item:hover {
920
+ background: rgba(0,170,255,0.06);
921
+ border-color: var(--border);
922
+ }
923
+
924
+ .plan-item.active {
925
+ background: rgba(0,170,255,0.1);
926
+ border-color: var(--accent-dim);
927
+ }
928
+
929
+ .plan-item .plan-name {
930
+ color: var(--text-primary);
931
+ font-size: 13px;
932
+ font-weight: 600;
933
+ font-family: var(--font-mono);
934
+ word-break: break-all;
935
+ }
936
+
937
+ .plan-item .plan-time {
938
+ color: var(--text-dim);
939
+ font-size: 11px;
940
+ margin-top: 2px;
941
+ }
942
+
943
+ /* ── Todo Items ──────────────────────────────────────────────── */
944
+ .todo-item {
945
+ display: flex;
946
+ align-items: flex-start;
947
+ gap: 6px;
948
+ padding: 5px 8px;
949
+ margin-bottom: 2px;
950
+ border-radius: 4px;
951
+ font-size: 13px;
952
+ line-height: 1.4;
953
+ transition: background 0.15s;
954
+ }
955
+
956
+ .todo-item:hover {
957
+ background: rgba(255,255,255,0.03);
958
+ }
959
+
960
+ .todo-item .todo-check {
961
+ flex-shrink: 0;
962
+ margin-top: 1px;
963
+ font-size: 14px;
964
+ }
965
+
966
+ .todo-item .todo-check.done {
967
+ color: var(--success);
968
+ }
969
+
970
+ .todo-item .todo-check.pending {
971
+ color: var(--text-dim);
972
+ }
973
+
974
+ .todo-item .todo-text {
975
+ color: var(--text-primary);
976
+ word-break: break-word;
977
+ }
978
+
979
+ .todo-item .todo-text.done {
980
+ color: var(--text-dim);
981
+ text-decoration: line-through;
982
+ }
983
+
984
+ .todo-header-text {
985
+ color: var(--text-secondary);
986
+ font-size: 11px;
987
+ font-weight: 600;
988
+ padding: 4px 8px 6px;
989
+ text-transform: uppercase;
990
+ letter-spacing: 0.5px;
991
+ border-bottom: 1px solid var(--border);
992
+ margin-bottom: 4px;
993
+ }
994
+
995
+ /* ── Utility ─────────────────────────────────────────────────── */
996
+ .hidden { display: none !important; }