@xcanwin/manyoyo 7.0.26 → 7.1.1

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.
@@ -1,2269 +0,0 @@
1
- :root {
2
- --font-ui: "IBM Plex Sans", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
3
- --font-display: "IBM Plex Sans Condensed", "IBM Plex Sans", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
4
- --font-mono: "IBM Plex Mono", "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
5
-
6
- --bg-canvas: #f3ede4;
7
- --bg-canvas-alt: #efe4d3;
8
- --bg-grid: rgba(138, 114, 83, 0.16);
9
-
10
- --panel: #fffdfa;
11
- --panel-soft: #f9f2e7;
12
- --panel-strong: #ffffff;
13
-
14
- --line: #d9c7ad;
15
- --line-strong: #b59263;
16
- --tree-active: #e0c99b;
17
- --session-card-hover: #f0e0c4;
18
-
19
- --surface-panel: linear-gradient(180deg, rgba(255, 255, 255, 0.88) 0%, rgba(252, 246, 236, 0.88) 100%);
20
-
21
- --text: #1f1a14;
22
- --muted: #6a5f52;
23
-
24
- --accent: #c4551f;
25
- --accent-strong: #9d4418;
26
-
27
- --subaccent: #0f7c72;
28
- --subaccent-strong: #0a655e;
29
- --subaccent-soft: #ddf3f0;
30
-
31
- --danger: #bf332d;
32
- --danger-strong: #962824;
33
- --danger-soft: #ffe8e5;
34
-
35
- --status-running-text: #0c695f;
36
- --status-stopped-text: #9a5a09;
37
- --tree-history-text: #b7b0a7;
38
- --status-unknown-text: #5a4bb0;
39
-
40
- --user-bubble: #fee9dd;
41
- --assistant-bubble: #fffdf8;
42
- --system-bubble: #e5f3f1;
43
-
44
- --terminal-bg: #11161d;
45
- --terminal-fg: #e8edf5;
46
- --terminal-cursor: #ffd166;
47
-
48
- --shadow-strong: 0 24px 54px rgba(44, 31, 15, 0.24);
49
- }
50
-
51
- * {
52
- box-sizing: border-box;
53
- }
54
-
55
- html,
56
- body {
57
- height: 100%;
58
- touch-action: manipulation;
59
- }
60
-
61
- body {
62
- margin: 0;
63
- min-height: 100vh;
64
- overflow: hidden;
65
- position: relative;
66
- font-family: var(--font-ui);
67
- color: var(--text);
68
- background:
69
- radial-gradient(120% 80% at 8% -8%, #f8f2ea 0%, rgba(248, 242, 234, 0) 56%),
70
- radial-gradient(90% 62% at 92% 108%, #f2ddc6 0%, rgba(242, 221, 198, 0) 68%),
71
- linear-gradient(170deg, var(--bg-canvas) 0%, var(--bg-canvas-alt) 100%);
72
- }
73
-
74
- body::before,
75
- body::after {
76
- content: "";
77
- position: absolute;
78
- inset: 0;
79
- pointer-events: none;
80
- }
81
-
82
- body::before {
83
- background-image:
84
- repeating-linear-gradient(
85
- 90deg,
86
- transparent 0,
87
- transparent 27px,
88
- var(--bg-grid) 27px,
89
- var(--bg-grid) 28px
90
- );
91
- opacity: 0.22;
92
- }
93
-
94
- body::after {
95
- background-image:
96
- linear-gradient(145deg, rgba(196, 85, 31, 0.08) 0%, rgba(196, 85, 31, 0) 46%),
97
- linear-gradient(-145deg, rgba(15, 124, 114, 0.08) 0%, rgba(15, 124, 114, 0) 42%);
98
- }
99
-
100
- .app {
101
- position: relative;
102
- z-index: 1;
103
- height: 100vh;
104
- height: 100dvh;
105
- padding: 0;
106
- display: grid;
107
- grid-template-columns: minmax(282px, 334px) minmax(0, 1fr);
108
- gap: 0;
109
- }
110
-
111
- .sidebar,
112
- .main {
113
- border-radius: 0;
114
- border: none;
115
- }
116
-
117
- .sidebar {
118
- min-height: 0;
119
- padding: 16px 12px 8px;
120
- display: flex;
121
- flex-direction: column;
122
- gap: 12px;
123
- background:
124
- linear-gradient(165deg, #fffefd 0%, #f8f1e7 100%);
125
- border-right: 1px solid var(--line);
126
- animation: panelIn 320ms ease both;
127
- }
128
-
129
- .sidebar-top {
130
- display: flex;
131
- align-items: flex-start;
132
- justify-content: space-between;
133
- gap: 10px;
134
- padding-bottom: 8px;
135
- border-bottom: 1px solid rgba(181, 146, 99, 0.45);
136
- }
137
-
138
- .brand-wrap {
139
- display: flex;
140
- flex-direction: column;
141
- gap: 2px;
142
- min-width: 0;
143
- }
144
-
145
- .brand {
146
- font-family: var(--font-display);
147
- font-weight: 700;
148
- letter-spacing: 1.1px;
149
- font-size: 22px;
150
- line-height: 1;
151
- text-transform: uppercase;
152
- white-space: nowrap;
153
- }
154
-
155
- .sidebar-actions {
156
- display: inline-flex;
157
- gap: 8px;
158
- align-items: center;
159
- flex-wrap: wrap;
160
- margin-left: auto;
161
- justify-content: flex-end;
162
- }
163
-
164
- .sidebar-actions button {
165
- min-width: 62px;
166
- }
167
-
168
- .sidebar-create button,
169
- .sidebar-bottom button {
170
- width: 100%;
171
- }
172
-
173
- .sidebar-bottom {
174
- display: flex;
175
- margin-top: -4px;
176
- }
177
-
178
- input:focus,
179
- textarea:focus {
180
- outline: none;
181
- border-color: var(--accent);
182
- box-shadow: 0 0 0 3px rgba(196, 85, 31, 0.16);
183
- }
184
-
185
- button {
186
- border: 1px solid transparent;
187
- border-radius: 10px;
188
- padding: 9px 14px;
189
- font-weight: 650;
190
- font-size: 13px;
191
- cursor: pointer;
192
- color: #ffffff;
193
- background: var(--accent);
194
- transition: transform 140ms ease, background-color 140ms ease, border-color 140ms ease, box-shadow 140ms ease;
195
- }
196
-
197
- button:hover {
198
- transform: translateY(-1px);
199
- background: var(--accent-strong);
200
- }
201
-
202
- button:active {
203
- transform: translateY(0);
204
- }
205
-
206
- button:disabled {
207
- opacity: 0.58;
208
- cursor: not-allowed;
209
- transform: none;
210
- box-shadow: none;
211
- }
212
-
213
- button.secondary {
214
- color: var(--text);
215
- background: var(--panel-soft);
216
- border-color: var(--line);
217
- }
218
-
219
- button.secondary:hover {
220
- background: #f5ebdf;
221
- border-color: var(--line-strong);
222
- }
223
-
224
- button.danger-outline {
225
- color: var(--danger);
226
- background: #fff5f3;
227
- border-color: #edc1bc;
228
- }
229
-
230
- button.danger-outline:hover {
231
- background: var(--danger-soft);
232
- border-color: #df9791;
233
- }
234
-
235
- button.danger {
236
- background: var(--danger);
237
- }
238
-
239
- button.danger:hover {
240
- background: var(--danger-strong);
241
- }
242
-
243
- button:focus-visible,
244
- input:focus-visible,
245
- textarea:focus-visible {
246
- outline: 2px solid rgba(196, 85, 31, 0.45);
247
- outline-offset: 2px;
248
- }
249
-
250
- .mobile-session-toggle,
251
- .mobile-sidebar-close,
252
- .sidebar-backdrop {
253
- display: none;
254
- }
255
-
256
- .sidebar-backdrop[hidden] {
257
- display: none !important;
258
- }
259
-
260
- .modal-backdrop {
261
- position: fixed;
262
- inset: 0;
263
- z-index: 80;
264
- display: flex;
265
- align-items: center;
266
- justify-content: center;
267
- padding: 16px;
268
- background: rgba(23, 17, 11, 0.48);
269
- }
270
-
271
- .modal-backdrop[hidden] {
272
- display: none !important;
273
- }
274
-
275
- /* showNotice/showConfirm/showPrompt 可能从已经打开的其它 modal(如目录选择器)内部触发,
276
- 和其它 .modal-backdrop 共用 z-index:80 时,谁在 DOM 里排后面谁盖住谁,容易被埋到底下;
277
- 这里给一个更高的 z-index,保证它始终浮在最上层 */
278
- #genericDialogModal {
279
- z-index: 90;
280
- }
281
-
282
- .modal {
283
- width: min(960px, calc(100vw - 24px));
284
- max-height: min(92vh, 860px);
285
- display: flex;
286
- flex-direction: column;
287
- border: 1px solid var(--line);
288
- border-radius: 14px;
289
- background: #fffefb;
290
- box-shadow: var(--shadow-strong);
291
- overflow: hidden;
292
- }
293
-
294
- .modal.modal-sm {
295
- width: min(420px, calc(100vw - 24px));
296
- }
297
-
298
- .modal-header {
299
- display: flex;
300
- align-items: center;
301
- justify-content: space-between;
302
- gap: 12px;
303
- padding: 12px 14px;
304
- border-bottom: 1px solid var(--line);
305
- background: #fff8ef;
306
- }
307
-
308
- .modal-header h2 {
309
- margin: 0;
310
- font-size: 16px;
311
- line-height: 1.3;
312
- }
313
-
314
- .modal-body {
315
- padding: 12px 14px;
316
- overflow: auto;
317
- min-height: 0;
318
- }
319
-
320
- .modal-footer {
321
- display: flex;
322
- justify-content: flex-end;
323
- gap: 8px;
324
- padding: 12px 14px;
325
- border-top: 1px solid var(--line);
326
- background: #fff8ef;
327
- }
328
-
329
- .modal-tip {
330
- color: var(--muted);
331
- font-size: 12px;
332
- margin-bottom: 10px;
333
- word-break: break-all;
334
- }
335
-
336
- .modal-message {
337
- margin: 0;
338
- color: var(--text);
339
- font-size: 13px;
340
- line-height: 1.6;
341
- }
342
-
343
- .modal-dialog-input {
344
- width: 100%;
345
- margin-top: 10px;
346
- border: 1px solid var(--line);
347
- border-radius: 10px;
348
- padding: 9px 11px;
349
- background: var(--panel-strong);
350
- color: var(--text);
351
- font-size: 13px;
352
- }
353
-
354
- .modal-dialog-input[hidden] {
355
- display: none;
356
- }
357
-
358
- .modal-error {
359
- margin-top: 10px;
360
- color: var(--danger);
361
- font-size: 13px;
362
- padding: 8px 10px;
363
- border: 1px solid #efb2ad;
364
- border-radius: 8px;
365
- background: #fff2f0;
366
- white-space: pre-wrap;
367
- }
368
-
369
- .modal-success {
370
- margin-top: 10px;
371
- color: #196c43;
372
- font-size: 13px;
373
- padding: 8px 10px;
374
- border: 1px solid #9fd1b4;
375
- border-radius: 8px;
376
- background: #eef9f1;
377
- white-space: pre-wrap;
378
- }
379
-
380
- .link-confirm-url {
381
- margin-top: 2px;
382
- padding: 12px 14px;
383
- border: 1px solid rgba(146, 100, 42, 0.18);
384
- border-radius: 10px;
385
- background: #fff8ef;
386
- color: var(--text);
387
- font-family: var(--font-mono);
388
- font-size: 12px;
389
- line-height: 1.6;
390
- word-break: break-all;
391
- user-select: text;
392
- }
393
-
394
- .config-editor {
395
- width: 100%;
396
- min-height: 340px;
397
- border: 1px solid var(--line);
398
- border-radius: 10px;
399
- overflow: hidden;
400
- background: #fffdfa;
401
- }
402
-
403
- .config-editor .cm-editor {
404
- height: 340px;
405
- font-size: 13px;
406
- }
407
-
408
- .config-editor .cm-scroller {
409
- overflow: auto;
410
- }
411
-
412
- .form-grid {
413
- display: grid;
414
- grid-template-columns: repeat(2, minmax(0, 1fr));
415
- gap: 10px;
416
- }
417
-
418
- .form-grid label,
419
- .text-block {
420
- display: flex;
421
- flex-direction: column;
422
- gap: 6px;
423
- font-size: 12px;
424
- color: var(--muted);
425
- }
426
-
427
- .text-block[hidden] {
428
- display: none;
429
- }
430
-
431
- .form-grid input,
432
- .form-grid select,
433
- .text-block textarea,
434
- .text-block input,
435
- .text-block select {
436
- border: 1px solid var(--line);
437
- border-radius: 10px;
438
- padding: 9px 11px;
439
- background: var(--panel-strong);
440
- color: var(--text);
441
- font-size: 13px;
442
- font-family: var(--font-ui);
443
- }
444
-
445
- .field-inline {
446
- display: grid;
447
- grid-template-columns: minmax(0, 1fr) auto;
448
- gap: 8px;
449
- align-items: center;
450
- }
451
-
452
- .field-picker-btn {
453
- white-space: nowrap;
454
- }
455
-
456
- .text-block {
457
- margin-top: 10px;
458
- }
459
-
460
- .text-block textarea {
461
- min-height: 88px;
462
- font-family: var(--font-mono);
463
- resize: vertical;
464
- }
465
-
466
- .agent-template-modal {
467
- width: min(760px, calc(100vw - 24px));
468
- }
469
-
470
- .agent-template-primary .text-block {
471
- margin-top: 0;
472
- }
473
-
474
- .agent-template-primary .text-block + .text-block,
475
- #agentTemplateOverrideGroup {
476
- margin-top: 12px;
477
- }
478
-
479
- .agent-template-primary select,
480
- .agent-template-primary textarea {
481
- border: 1px solid var(--line);
482
- border-radius: 10px;
483
- padding: 9px 11px;
484
- background: var(--panel-strong);
485
- color: var(--text);
486
- font-size: 13px;
487
- font-family: var(--font-ui);
488
- }
489
-
490
- .agent-template-primary textarea {
491
- min-height: 92px;
492
- font-family: var(--font-mono);
493
- resize: vertical;
494
- }
495
-
496
- .agent-template-section {
497
- padding: 12px;
498
- border: 1px solid var(--line);
499
- border-radius: 12px;
500
- background: rgba(255, 253, 250, 0.92);
501
- }
502
-
503
- .agent-template-section + .agent-template-section {
504
- margin-top: 12px;
505
- }
506
-
507
- .agent-template-section-title {
508
- margin-bottom: 8px;
509
- font-size: 12px;
510
- font-weight: 700;
511
- color: var(--text);
512
- }
513
-
514
- .agent-template-section .text-block {
515
- margin-top: 0;
516
- }
517
-
518
- .agent-template-section .text-block + .text-block {
519
- margin-top: 10px;
520
- }
521
-
522
- .agent-template-section select,
523
- .agent-template-section textarea {
524
- border: 1px solid var(--line);
525
- border-radius: 10px;
526
- padding: 9px 11px;
527
- background: var(--panel-strong);
528
- color: var(--text);
529
- font-size: 13px;
530
- font-family: var(--font-ui);
531
- }
532
-
533
- .agent-template-section textarea {
534
- min-height: 92px;
535
- font-family: var(--font-mono);
536
- resize: vertical;
537
- }
538
-
539
- .session-head {
540
- display: flex;
541
- justify-content: space-between;
542
- align-items: center;
543
- color: var(--muted);
544
- font-size: 12px;
545
- padding: 0 2px;
546
- }
547
-
548
- #sessionList {
549
- flex: 1;
550
- min-height: 0;
551
- overflow-y: auto;
552
- padding-right: 4px;
553
- display: flex;
554
- flex-direction: column;
555
- gap: 10px;
556
- }
557
-
558
- #sessionList::-webkit-scrollbar,
559
- #messages::-webkit-scrollbar {
560
- width: 10px;
561
- }
562
-
563
- #sessionList::-webkit-scrollbar-thumb,
564
- #messages::-webkit-scrollbar-thumb {
565
- background: #d6c1a5;
566
- border-radius: 8px;
567
- }
568
-
569
- .crumb-bar {
570
- display: flex;
571
- flex-wrap: wrap;
572
- align-items: center;
573
- gap: 6px;
574
- padding: 0 2px;
575
- min-height: 20px;
576
- }
577
-
578
- .container-search-input {
579
- width: 100%;
580
- font-size: 12px;
581
- padding: 6px 9px;
582
- border: 1px solid var(--line);
583
- border-radius: 8px;
584
- background: var(--panel-soft);
585
- color: var(--text);
586
- }
587
-
588
- .container-search-input[hidden] {
589
- display: none;
590
- }
591
-
592
- .crumb-item {
593
- border: none;
594
- background: transparent;
595
- color: var(--accent-strong);
596
- font-size: 12px;
597
- font-weight: 600;
598
- padding: 2px 2px;
599
- border-radius: 6px;
600
- cursor: pointer;
601
- max-width: 220px;
602
- overflow: hidden;
603
- text-overflow: ellipsis;
604
- white-space: nowrap;
605
- }
606
-
607
- .crumb-item:hover {
608
- transform: none;
609
- /* 不显式设置背景色的话,通用 button:hover 规则的深色背景会覆盖进来,
610
- 和同色系的文字撞色看不清,这里保持透明背景即可 */
611
- background: transparent;
612
- text-decoration: underline;
613
- }
614
-
615
- .crumb-item.is-current {
616
- color: var(--text);
617
- cursor: default;
618
- font-weight: 700;
619
- }
620
-
621
- .crumb-item.is-current:hover {
622
- text-decoration: none;
623
- }
624
-
625
- .crumb-sep {
626
- color: #a3927c;
627
- font-size: 12px;
628
- }
629
-
630
- .crumb-jump-active {
631
- margin-left: auto;
632
- border: 1px solid var(--line);
633
- background: var(--panel-soft);
634
- color: var(--accent-strong);
635
- font-size: 11px;
636
- font-weight: 600;
637
- padding: 3px 8px;
638
- border-radius: 999px;
639
- }
640
-
641
- .crumb-jump-active:hover {
642
- /* 同 .crumb-item:hover,避免通用 button:hover 的深色背景和文字撞色 */
643
- background: var(--panel-soft);
644
- }
645
-
646
- .session-card {
647
- position: relative;
648
- }
649
-
650
- .session-card-button {
651
- width: 100%;
652
- text-align: left;
653
- border: 1px solid transparent;
654
- background: transparent;
655
- color: var(--text);
656
- border-radius: 10px;
657
- padding: 10px 11px;
658
- transition: background-color 120ms ease;
659
- }
660
-
661
- .session-card-container .session-card-button,
662
- .session-card-agent .session-card-button {
663
- padding-right: 46px;
664
- }
665
-
666
- .session-card-button:hover {
667
- transform: none;
668
- background: var(--session-card-hover);
669
- }
670
-
671
- .session-card-button:active {
672
- transform: none;
673
- }
674
-
675
- .session-card-button:focus-visible {
676
- outline: none;
677
- box-shadow: 0 0 0 3px rgba(196, 85, 31, 0.14);
678
- }
679
-
680
- .session-card-button.active {
681
- background: var(--tree-active);
682
- }
683
-
684
- .session-card.tree-node-tone-history .session-card-title,
685
- .session-card.tree-node-tone-history .session-card-meta {
686
- color: var(--tree-history-text);
687
- }
688
-
689
- .session-card.has-active .session-card-button:not(.active) {
690
- background: var(--tree-active);
691
- }
692
-
693
- .session-card-main {
694
- min-width: 0;
695
- display: flex;
696
- flex-direction: column;
697
- gap: 6px;
698
- }
699
-
700
- .session-card-title-row {
701
- display: flex;
702
- align-items: center;
703
- justify-content: space-between;
704
- gap: 8px;
705
- }
706
-
707
- .session-card-title {
708
- margin-top: 0;
709
- font-weight: 700;
710
- font-size: 13px;
711
- line-height: 1.5;
712
- overflow-wrap: anywhere;
713
- min-width: 0;
714
- overflow: hidden;
715
- text-overflow: ellipsis;
716
- white-space: nowrap;
717
- }
718
-
719
- .session-card-container .session-card-title {
720
- font-family: var(--font-mono);
721
- font-size: 12px;
722
- font-weight: 600;
723
- }
724
-
725
- .session-card-meta {
726
- color: #7b6d5d;
727
- font-size: 11px;
728
- line-height: 1.45;
729
- overflow-wrap: anywhere;
730
- }
731
-
732
- .session-card-submeta {
733
- color: #a3927c;
734
- font-size: 10px;
735
- line-height: 1.4;
736
- overflow: hidden;
737
- text-overflow: ellipsis;
738
- white-space: nowrap;
739
- }
740
-
741
- .tree-node-status {
742
- font-weight: 700;
743
- font-size: 12px;
744
- }
745
-
746
- .tree-node-status.running {
747
- color: var(--status-running-text);
748
- }
749
-
750
- .tree-node-status.stopped {
751
- color: var(--status-stopped-text);
752
- }
753
-
754
- .tree-node-status.history {
755
- color: var(--tree-history-text);
756
- }
757
-
758
- .tree-node-status.unknown {
759
- color: var(--status-unknown-text);
760
- }
761
-
762
- .tree-node-menu {
763
- position: absolute;
764
- top: 50%;
765
- right: 6px;
766
- z-index: 9;
767
- transform: translateY(-50%);
768
- opacity: 0;
769
- pointer-events: none;
770
- transition: opacity 140ms ease;
771
- }
772
-
773
- .session-card:hover .tree-node-menu,
774
- .tree-node-menu:focus-within,
775
- .tree-node-menu.is-open {
776
- opacity: 1;
777
- pointer-events: auto;
778
- }
779
-
780
- .tree-node-menu.is-open {
781
- z-index: 20;
782
- }
783
-
784
- @media (hover: none) {
785
- .tree-node-menu {
786
- opacity: 1;
787
- pointer-events: auto;
788
- }
789
- }
790
-
791
- .crumb-bar .tree-node-menu {
792
- position: relative;
793
- top: auto;
794
- right: auto;
795
- transform: none;
796
- opacity: 1;
797
- pointer-events: auto;
798
- }
799
-
800
- .tree-node-menu-trigger {
801
- width: 30px;
802
- height: 30px;
803
- padding: 0;
804
- display: inline-flex;
805
- align-items: center;
806
- justify-content: center;
807
- border-radius: 9px;
808
- }
809
-
810
- .tree-node-menu-trigger svg {
811
- width: 16px;
812
- height: 16px;
813
- fill: currentColor;
814
- }
815
-
816
- .tree-node-menu-panel {
817
- position: absolute;
818
- top: calc(100% + 4px);
819
- right: 0;
820
- z-index: 9;
821
- width: max-content;
822
- min-width: 140px;
823
- padding: 6px;
824
- border: 1px solid var(--line);
825
- border-radius: 10px;
826
- background: #fffaf2;
827
- box-shadow: var(--shadow-strong);
828
- display: flex;
829
- flex-direction: column;
830
- gap: 2px;
831
- }
832
-
833
- .tree-node-menu-panel[hidden] {
834
- display: none;
835
- }
836
-
837
- .tree-node-menu-panel-item {
838
- width: 100%;
839
- text-align: left;
840
- border: none;
841
- background: transparent;
842
- color: var(--text);
843
- font-weight: 600;
844
- font-size: 12px;
845
- padding: 7px 9px;
846
- border-radius: 6px;
847
- }
848
-
849
- .tree-node-menu-panel-item:hover {
850
- transform: none;
851
- background: var(--panel-soft);
852
- }
853
-
854
- .tree-node-menu-panel-item.is-danger {
855
- color: var(--danger);
856
- }
857
-
858
- .tree-node-menu-panel-item.is-danger:hover {
859
- background: var(--danger-soft);
860
- }
861
-
862
- .dir-picker-modal {
863
- width: min(720px, calc(100vw - 24px));
864
- }
865
-
866
- .dir-picker-toolbar {
867
- margin-bottom: 10px;
868
- padding-left: 0;
869
- padding-right: 0;
870
- border-bottom: 0;
871
- background: transparent;
872
- }
873
-
874
- .dir-picker-toolbar-meta {
875
- flex-wrap: wrap;
876
- }
877
-
878
- .dir-picker-list {
879
- max-height: min(52vh, 420px);
880
- border: 1px solid var(--line);
881
- border-radius: 14px;
882
- overflow: auto;
883
- background: rgba(255, 255, 255, 0.86);
884
- }
885
-
886
- .empty {
887
- padding: 12px 10px;
888
- border: 1px dashed #d4bf9f;
889
- border-radius: 10px;
890
- color: var(--muted);
891
- font-size: 13px;
892
- background: rgba(255, 252, 245, 0.86);
893
- }
894
-
895
- .skeleton {
896
- position: relative;
897
- overflow: hidden;
898
- background: #f4ebde;
899
- border-radius: 10px;
900
- border: 1px solid #e4d3bd;
901
- }
902
-
903
- .skeleton::after {
904
- content: "";
905
- position: absolute;
906
- inset: 0;
907
- transform: translateX(-100%);
908
- background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.66) 50%, rgba(255, 255, 255, 0) 100%);
909
- animation: shimmer 1.1s ease-in-out 6;
910
- }
911
-
912
- .skeleton.session {
913
- height: 74px;
914
- }
915
-
916
- .skeleton.message {
917
- height: 88px;
918
- width: min(720px, 88%);
919
- }
920
-
921
- .main {
922
- min-height: 0;
923
- padding: 8px 14px;
924
- display: grid;
925
- grid-template-rows: auto minmax(0, 1fr) auto;
926
- gap: 0;
927
- /* 和 #messages / .composer 用同一个 --surface-panel,避免包裹它们的这层
928
- 在缝隙处显得比内容区更深一截 */
929
- background: var(--surface-panel);
930
- animation: panelIn 360ms ease 60ms both;
931
- }
932
-
933
- .header {
934
- position: relative;
935
- display: flex;
936
- justify-content: space-between;
937
- align-items: flex-start;
938
- gap: 12px;
939
- padding: 0 8px 4px;
940
- }
941
-
942
- .header-main {
943
- flex: 1;
944
- min-width: 0;
945
- display: flex;
946
- }
947
-
948
- .workbench-tabs {
949
- flex: 1;
950
- display: flex;
951
- flex-wrap: wrap;
952
- align-items: center;
953
- gap: 8px;
954
- }
955
-
956
- .workbench-tabs button.is-active,
957
- .composer-options-panel button.is-active {
958
- color: #ffffff;
959
- background: var(--accent);
960
- border-color: var(--accent-strong);
961
- }
962
-
963
- .workspace-switcher {
964
- position: relative;
965
- display: inline-flex;
966
- /* 始终贴住这一行的右侧:桌面端只有它自己时贴最右,移动端"会话"贴最左时它仍贴最右 */
967
- margin-left: auto;
968
- }
969
-
970
- .workspace-switcher-btn {
971
- width: 34px;
972
- height: 34px;
973
- padding: 0;
974
- display: inline-flex;
975
- align-items: center;
976
- justify-content: center;
977
- }
978
-
979
- .workspace-switcher-btn svg {
980
- width: 16px;
981
- height: 16px;
982
- fill: currentColor;
983
- }
984
-
985
- .workspace-switcher-btn.is-active {
986
- color: #ffffff;
987
- background: var(--accent);
988
- border-color: var(--accent-strong);
989
- }
990
-
991
- .workspace-switcher-panel {
992
- display: none;
993
- position: absolute;
994
- top: calc(100% + 8px);
995
- /* 触发按钮固定贴住这一行右侧,面板也从右边缘向左展开,避免在宽屏下超出视口 */
996
- right: 0;
997
- z-index: 8;
998
- width: max-content;
999
- padding: 8px;
1000
- border: 1px solid var(--line);
1001
- border-radius: 10px;
1002
- background: #fffaf2;
1003
- box-shadow: var(--shadow-strong);
1004
- flex-direction: column;
1005
- gap: 6px;
1006
- }
1007
-
1008
- body.workspace-switcher-open .workspace-switcher-panel {
1009
- display: flex;
1010
- }
1011
-
1012
- .workspace-switcher-panel button {
1013
- text-align: left;
1014
- }
1015
-
1016
- .workspace-shell {
1017
- min-height: 0;
1018
- height: 100%;
1019
- padding-top: 6px;
1020
- display: block;
1021
- overflow: hidden;
1022
- }
1023
-
1024
- .workspace-main {
1025
- height: 100%;
1026
- min-height: 0;
1027
- display: grid;
1028
- grid-template-rows: minmax(0, 1fr) auto;
1029
- gap: 0;
1030
- overflow: hidden;
1031
- }
1032
-
1033
- .workspace-pane {
1034
- min-height: 0;
1035
- height: 100%;
1036
- }
1037
-
1038
- .workspace-pane[hidden],
1039
- .composer[hidden] {
1040
- display: none !important;
1041
- }
1042
-
1043
- #messages {
1044
- min-height: 0;
1045
- overflow-y: auto;
1046
- margin: 0;
1047
- padding: 14px 14px 44px;
1048
- border-radius: 14px;
1049
- display: flex;
1050
- flex-direction: column;
1051
- gap: 14px;
1052
- scroll-behavior: smooth;
1053
- background: var(--surface-panel);
1054
- }
1055
-
1056
- #terminalPanel {
1057
- min-height: 0;
1058
- flex-direction: column;
1059
- margin: 0;
1060
- border: 1px solid var(--line);
1061
- border-radius: 14px;
1062
- overflow: hidden;
1063
- background: #131923;
1064
- }
1065
-
1066
- .files-pane {
1067
- min-height: 0;
1068
- border: 1px solid var(--line);
1069
- border-radius: 14px;
1070
- overflow: hidden;
1071
- background: var(--surface-panel);
1072
- }
1073
-
1074
- .files-browser {
1075
- height: 100%;
1076
- min-height: 0;
1077
- display: grid;
1078
- grid-template-rows: auto minmax(0, 1fr);
1079
- }
1080
-
1081
- .files-toolbar {
1082
- display: flex;
1083
- align-items: center;
1084
- gap: 8px;
1085
- flex-wrap: nowrap;
1086
- padding: 12px 14px;
1087
- border-bottom: 1px solid var(--line);
1088
- background: rgba(255, 251, 244, 0.96);
1089
- }
1090
-
1091
- .files-toolbar-path-group {
1092
- flex: 1;
1093
- min-width: 0;
1094
- display: flex;
1095
- align-items: center;
1096
- gap: 8px;
1097
- }
1098
-
1099
- .files-toolbar-path-input {
1100
- flex: 1;
1101
- min-width: 0;
1102
- padding: 8px 10px;
1103
- border: 1px solid rgba(181, 146, 99, 0.35);
1104
- border-radius: 10px;
1105
- background: #fffdf9;
1106
- color: var(--text);
1107
- font-family: var(--font-mono);
1108
- font-size: 12px;
1109
- line-height: 1.5;
1110
- }
1111
-
1112
- .files-toolbar-path-input:focus {
1113
- outline: none;
1114
- border-color: rgba(120, 78, 27, 0.45);
1115
- box-shadow: 0 0 0 3px rgba(181, 146, 99, 0.12);
1116
- }
1117
-
1118
- .files-toolbar-status {
1119
- color: var(--muted);
1120
- font-size: 12px;
1121
- }
1122
-
1123
- .files-toolbar-meta {
1124
- display: flex;
1125
- align-items: center;
1126
- gap: 8px;
1127
- margin-left: auto;
1128
- }
1129
-
1130
- .files-layout {
1131
- min-height: 0;
1132
- display: grid;
1133
- grid-template-columns: minmax(220px, 300px) minmax(0, 1fr);
1134
- }
1135
-
1136
- .files-sidebar {
1137
- min-height: 0;
1138
- border-right: 1px solid var(--line);
1139
- background: rgba(255, 255, 255, 0.86);
1140
- overflow: auto;
1141
- }
1142
-
1143
- .files-list {
1144
- display: flex;
1145
- flex-direction: column;
1146
- gap: 0;
1147
- padding: 4px 0;
1148
- }
1149
-
1150
- .files-entry {
1151
- width: 100%;
1152
- display: grid;
1153
- grid-template-columns: minmax(0, 1fr) auto;
1154
- align-items: start;
1155
- gap: 10px;
1156
- padding: 7px 12px;
1157
- border: 0;
1158
- border-bottom: 1px solid rgba(181, 146, 99, 0.18);
1159
- border-radius: 0;
1160
- background: transparent;
1161
- color: var(--text);
1162
- text-align: left;
1163
- cursor: pointer;
1164
- }
1165
-
1166
- .files-entry:hover {
1167
- background: rgba(255, 247, 233, 0.72);
1168
- }
1169
-
1170
- .files-entry.is-active {
1171
- background: rgba(255, 244, 224, 0.95);
1172
- box-shadow: inset 3px 0 0 rgba(120, 78, 27, 0.58);
1173
- }
1174
-
1175
- .files-entry-parent {
1176
- font-style: italic;
1177
- }
1178
-
1179
- .files-entry-name {
1180
- flex: 1;
1181
- min-width: 0;
1182
- }
1183
-
1184
- .files-entry-title {
1185
- font-size: 13px;
1186
- font-weight: 600;
1187
- white-space: normal;
1188
- word-break: break-all;
1189
- overflow-wrap: anywhere;
1190
- }
1191
-
1192
- .files-entry-meta {
1193
- flex-shrink: 0;
1194
- color: var(--muted);
1195
- font-size: 11px;
1196
- white-space: nowrap;
1197
- text-align: right;
1198
- }
1199
-
1200
- .files-list > .files-empty {
1201
- padding: 8px 12px;
1202
- border: 0;
1203
- border-bottom: 1px solid rgba(181, 146, 99, 0.18);
1204
- border-radius: 0;
1205
- background: transparent;
1206
- color: var(--muted);
1207
- line-height: 1.5;
1208
- }
1209
-
1210
- .files-preview {
1211
- min-height: 0;
1212
- display: grid;
1213
- grid-template-rows: auto minmax(0, 1fr);
1214
- }
1215
-
1216
- .files-preview-head {
1217
- display: flex;
1218
- align-items: flex-start;
1219
- justify-content: space-between;
1220
- gap: 12px;
1221
- flex-wrap: nowrap;
1222
- padding: 10px 12px;
1223
- border-bottom: 1px solid var(--line);
1224
- background: rgba(255, 251, 244, 0.96);
1225
- }
1226
-
1227
- .files-preview-head-main {
1228
- flex: 1 1 280px;
1229
- min-width: 0;
1230
- display: flex;
1231
- flex-direction: column;
1232
- gap: 6px;
1233
- }
1234
-
1235
- .files-preview-actions {
1236
- flex-shrink: 0;
1237
- display: flex;
1238
- align-items: center;
1239
- gap: 8px;
1240
- margin-left: auto;
1241
- }
1242
-
1243
- .files-back-btn {
1244
- display: none;
1245
- flex-shrink: 0;
1246
- }
1247
-
1248
- .files-preview-title {
1249
- font-family: var(--font-display);
1250
- font-size: 14px;
1251
- font-weight: 700;
1252
- word-break: break-all;
1253
- overflow-wrap: anywhere;
1254
- }
1255
-
1256
- .files-preview-meta {
1257
- color: var(--muted);
1258
- font-size: 11px;
1259
- word-break: break-all;
1260
- }
1261
-
1262
- .files-preview-body {
1263
- min-height: 0;
1264
- overflow: auto;
1265
- padding: 8px;
1266
- }
1267
-
1268
- .files-empty,
1269
- .files-note {
1270
- padding: 14px;
1271
- border: 1px dashed rgba(181, 146, 99, 0.45);
1272
- border-radius: 12px;
1273
- background: rgba(255, 255, 255, 0.7);
1274
- color: var(--muted);
1275
- line-height: 1.6;
1276
- }
1277
-
1278
- .files-pre {
1279
- margin: 0;
1280
- white-space: pre-wrap;
1281
- word-break: break-word;
1282
- font-family: var(--font-mono);
1283
- font-size: 12px;
1284
- line-height: 1.6;
1285
- }
1286
-
1287
- .files-markdown-preview {
1288
- padding: 4px 6px;
1289
- }
1290
-
1291
- .files-image-preview {
1292
- display: flex;
1293
- justify-content: center;
1294
- padding: 12px;
1295
- }
1296
-
1297
- .files-image-preview img {
1298
- max-width: 100%;
1299
- height: auto;
1300
- border-radius: 8px;
1301
- border: 1px solid rgba(181, 146, 99, 0.2);
1302
- }
1303
-
1304
- .files-editor-host {
1305
- min-height: 100%;
1306
- }
1307
-
1308
- .files-editor-host .cm-editor {
1309
- height: 100%;
1310
- border: 1px solid rgba(181, 146, 99, 0.2);
1311
- border-radius: 8px;
1312
- overflow: hidden;
1313
- background: rgba(255, 255, 255, 0.98);
1314
- }
1315
-
1316
- .files-editor-host .cm-scroller {
1317
- font-family: var(--font-mono);
1318
- line-height: 1.45;
1319
- }
1320
-
1321
- .files-editor-host .cm-gutters {
1322
- border-right: 1px solid rgba(181, 146, 99, 0.14);
1323
- background: rgba(252, 248, 241, 0.92);
1324
- }
1325
-
1326
- .files-editor-host .cm-lineNumbers .cm-gutterElement {
1327
- font-size: 11px;
1328
- }
1329
-
1330
- .inspector-pane {
1331
- overflow-y: auto;
1332
- padding: 0;
1333
- border: 1px solid var(--line);
1334
- border-radius: 14px;
1335
- background: var(--surface-panel);
1336
- }
1337
-
1338
- .inspector-stack {
1339
- display: flex;
1340
- flex-direction: column;
1341
- gap: 12px;
1342
- padding: 14px;
1343
- }
1344
-
1345
- .info-card {
1346
- display: flex;
1347
- flex-direction: column;
1348
- gap: 10px;
1349
- padding: 14px;
1350
- border: 1px solid rgba(181, 146, 99, 0.4);
1351
- border-radius: 14px;
1352
- background: rgba(255, 253, 250, 0.9);
1353
- }
1354
-
1355
- .empty-card {
1356
- min-height: 112px;
1357
- justify-content: center;
1358
- }
1359
-
1360
- .card-head {
1361
- display: flex;
1362
- align-items: center;
1363
- justify-content: space-between;
1364
- gap: 10px;
1365
- }
1366
-
1367
- .card-title {
1368
- font-family: var(--font-display);
1369
- font-size: 15px;
1370
- font-weight: 700;
1371
- letter-spacing: 0.3px;
1372
- }
1373
-
1374
- .card-desc {
1375
- color: var(--muted);
1376
- font-size: 13px;
1377
- line-height: 1.55;
1378
- }
1379
-
1380
- .inline-action {
1381
- padding: 6px 10px;
1382
- font-size: 12px;
1383
- }
1384
-
1385
- .kv-list,
1386
- .check-list {
1387
- display: flex;
1388
- flex-direction: column;
1389
- gap: 8px;
1390
- }
1391
-
1392
- .kv-row {
1393
- display: grid;
1394
- grid-template-columns: 108px minmax(0, 1fr);
1395
- gap: 10px;
1396
- align-items: start;
1397
- padding-top: 8px;
1398
- border-top: 1px dashed rgba(181, 146, 99, 0.34);
1399
- }
1400
-
1401
- .kv-row:first-child {
1402
- padding-top: 0;
1403
- border-top: none;
1404
- }
1405
-
1406
- .kv-label {
1407
- min-width: 0;
1408
- color: var(--muted);
1409
- font-size: 12px;
1410
- font-weight: 700;
1411
- text-transform: none;
1412
- letter-spacing: 0.1px;
1413
- line-height: 1.45;
1414
- overflow-wrap: anywhere;
1415
- }
1416
-
1417
- .kv-value {
1418
- min-width: 0;
1419
- color: var(--text);
1420
- font-family: var(--font-mono);
1421
- font-size: 12px;
1422
- line-height: 1.5;
1423
- word-break: break-word;
1424
- }
1425
-
1426
- .check-item {
1427
- display: flex;
1428
- flex-direction: column;
1429
- gap: 4px;
1430
- padding: 10px 12px;
1431
- border-radius: 12px;
1432
- border: 1px solid rgba(181, 146, 99, 0.28);
1433
- background: rgba(255, 252, 246, 0.86);
1434
- }
1435
-
1436
- .check-main {
1437
- display: flex;
1438
- align-items: center;
1439
- justify-content: space-between;
1440
- gap: 10px;
1441
- }
1442
-
1443
- .check-label,
1444
- .check-value {
1445
- font-weight: 700;
1446
- font-size: 13px;
1447
- }
1448
-
1449
- .check-detail {
1450
- color: var(--muted);
1451
- font-size: 12px;
1452
- line-height: 1.45;
1453
- }
1454
-
1455
- .tone-ok .check-value,
1456
- .kv-row.tone-ok .kv-value {
1457
- color: var(--subaccent-strong);
1458
- }
1459
-
1460
- .tone-warn .check-value,
1461
- .kv-row.tone-warn .kv-value {
1462
- color: #9a5a09;
1463
- }
1464
-
1465
- .tone-danger .check-value,
1466
- .kv-row.tone-danger .kv-value {
1467
- color: var(--danger);
1468
- }
1469
-
1470
- .term-keybar {
1471
- display: flex;
1472
- gap: 4px;
1473
- padding: 4px 6px;
1474
- background: #1a1a1a;
1475
- border-bottom: 1px solid rgba(255, 255, 255, 0.08);
1476
- flex-shrink: 0;
1477
- }
1478
-
1479
- .term-key-btn {
1480
- background: rgba(255, 255, 255, 0.07);
1481
- color: #bbb;
1482
- border: 1px solid rgba(255, 255, 255, 0.13);
1483
- border-radius: 4px;
1484
- padding: 2px 9px;
1485
- font-size: 12px;
1486
- font-family: monospace;
1487
- cursor: pointer;
1488
- user-select: none;
1489
- line-height: 1.6;
1490
- }
1491
-
1492
- .term-key-btn:hover {
1493
- background: rgba(255, 255, 255, 0.14);
1494
- color: #eee;
1495
- }
1496
-
1497
- .term-key-btn.is-active {
1498
- background: var(--accent);
1499
- color: #fff;
1500
- border-color: var(--accent-strong);
1501
- }
1502
-
1503
- #terminalScreen {
1504
- flex: 1;
1505
- min-height: 0;
1506
- height: 100%;
1507
- overflow: hidden;
1508
- background: var(--terminal-bg);
1509
- }
1510
-
1511
- #terminalScreen .xterm {
1512
- width: 100%;
1513
- height: 100%;
1514
- padding: 4px 6px;
1515
- }
1516
-
1517
- #terminalScreen .xterm-screen {
1518
- width: 100%;
1519
- }
1520
-
1521
- body.command-mode #messages {
1522
- display: flex;
1523
- }
1524
-
1525
- body.agent-mode #messages {
1526
- display: flex;
1527
- }
1528
-
1529
- body.command-mode #terminalPanel {
1530
- display: none;
1531
- }
1532
-
1533
- body.agent-mode #terminalPanel {
1534
- display: none;
1535
- }
1536
-
1537
- body.command-mode .composer {
1538
- display: block;
1539
- }
1540
-
1541
- body.agent-mode .composer {
1542
- display: block;
1543
- }
1544
-
1545
- body.terminal-mode #messages {
1546
- display: none;
1547
- }
1548
-
1549
- body.terminal-mode #terminalPanel {
1550
- display: flex;
1551
- }
1552
-
1553
- body.terminal-mode .composer {
1554
- display: none;
1555
- }
1556
-
1557
- .msg {
1558
- max-width: min(920px, 94%);
1559
- width: fit-content;
1560
- display: flex;
1561
- flex-direction: column;
1562
- gap: 6px;
1563
- animation: msgIn 210ms ease both;
1564
- animation-delay: 0ms;
1565
- }
1566
-
1567
- /* .msg-actions 悬浮浮层会伸到气泡下方,给带浮层的消息多留一点底部间距,
1568
- 让浮层完整落在消息之间的空白里,不需要靠 z-index 去抢下一条消息的地盘 */
1569
- .msg:has(.msg-actions) {
1570
- margin-bottom: 20px;
1571
- }
1572
-
1573
- .msg:last-child {
1574
- /* animation 会让每条消息各自建立独立的层叠上下文(transform/opacity 动画的副作用);
1575
- 只有最后一条消息的浮层可能伸到吸底 composer(移动端 position: sticky, z-index: 3)
1576
- 的区域里,需要显式盖过它 */
1577
- z-index: 4;
1578
- }
1579
-
1580
- .msg.user {
1581
- align-self: flex-end;
1582
- }
1583
-
1584
- .msg.assistant,
1585
- .msg.system {
1586
- align-self: flex-start;
1587
- }
1588
-
1589
- .msg-meta {
1590
- color: var(--muted);
1591
- font-size: 12px;
1592
- font-weight: 600;
1593
- display: flex;
1594
- flex-direction: column;
1595
- gap: 2px;
1596
- line-height: 1.25;
1597
- }
1598
-
1599
- .msg-meta-line {
1600
- white-space: nowrap;
1601
- }
1602
-
1603
- .msg.user .msg-meta {
1604
- align-items: flex-end;
1605
- text-align: right;
1606
- }
1607
-
1608
- .msg.assistant .msg-meta,
1609
- .msg.system .msg-meta {
1610
- align-items: flex-start;
1611
- text-align: left;
1612
- }
1613
-
1614
- .msg-meta-time {
1615
- font-weight: 500;
1616
- }
1617
-
1618
- .msg-meta-role {
1619
- font-weight: 700;
1620
- }
1621
-
1622
- .msg-actions {
1623
- position: absolute;
1624
- top: 100%;
1625
- /* 用 padding-top 而不是 margin-top 留白:margin 在盒子外,鼠标从气泡移到按钮
1626
- 之间会经过一段没有任何元素承接的"死区",:hover 提前丢失导致按钮还没碰到就消失;
1627
- padding 仍属于本元素的可命中区域,鼠标全程都在同一个悬浮触发范围内 */
1628
- padding-top: 4px;
1629
- display: flex;
1630
- gap: 6px;
1631
- opacity: 0;
1632
- pointer-events: none;
1633
- transition: opacity 140ms ease;
1634
- z-index: 1;
1635
- }
1636
-
1637
- .msg.user .msg-actions {
1638
- right: 0;
1639
- }
1640
-
1641
- .msg.assistant .msg-actions,
1642
- .msg.system .msg-actions {
1643
- left: 0;
1644
- }
1645
-
1646
- .msg:hover .msg-actions,
1647
- .msg:focus-within .msg-actions {
1648
- opacity: 1;
1649
- pointer-events: auto;
1650
- }
1651
-
1652
- @media (hover: none) {
1653
- .msg-actions {
1654
- opacity: 1;
1655
- pointer-events: auto;
1656
- }
1657
- }
1658
-
1659
- .msg-copy-btn {
1660
- border: 1px solid var(--line);
1661
- border-radius: 10px;
1662
- background: var(--panel-soft);
1663
- color: var(--muted);
1664
- font-size: 11px;
1665
- font-weight: 600;
1666
- padding: 2px 8px;
1667
- cursor: pointer;
1668
- transition: color 140ms ease, border-color 140ms ease, background-color 140ms ease;
1669
- }
1670
-
1671
- .msg-copy-btn:hover {
1672
- color: var(--accent-strong);
1673
- /* 不显式设置背景色的话,通用 button:hover 规则的深色背景会覆盖进来,
1674
- 和同色系的文字撞色看不清,这里只需要比默认背景微微变深 */
1675
- background: #f0e6d3;
1676
- border-color: var(--line-strong);
1677
- }
1678
-
1679
- .msg-copy-btn.is-copied {
1680
- color: var(--subaccent-strong);
1681
- border-color: var(--subaccent);
1682
- background: var(--subaccent-soft);
1683
- }
1684
-
1685
- .bubble {
1686
- position: relative;
1687
- border: 1px solid var(--line);
1688
- border-radius: 10px;
1689
- background: var(--assistant-bubble);
1690
- padding: 10px 12px;
1691
- box-shadow: 0 8px 16px rgba(46, 31, 13, 0.08);
1692
- }
1693
-
1694
- .msg.user .bubble {
1695
- background: var(--user-bubble);
1696
- border-color: #e9b994;
1697
- }
1698
-
1699
- .msg.system .bubble {
1700
- background: var(--system-bubble);
1701
- border-color: #b8e3dd;
1702
- }
1703
-
1704
- .msg.pending .bubble {
1705
- opacity: 0.78;
1706
- }
1707
-
1708
- body.agent-mode .msg.origin-command .bubble,
1709
- body.agent-mode .msg.origin-command .msg-meta {
1710
- opacity: 0.25;
1711
- }
1712
-
1713
- body.command-mode .msg.origin-agent .bubble,
1714
- body.command-mode .msg.origin-agent .msg-meta {
1715
- opacity: 0.25;
1716
- }
1717
-
1718
- body.agent-mode .msg.origin-command .bubble,
1719
- body.command-mode .msg.origin-agent .bubble {
1720
- box-shadow: none;
1721
- }
1722
-
1723
- .bubble pre {
1724
- margin: 0;
1725
- white-space: pre-wrap;
1726
- word-break: break-word;
1727
- font-family: var(--font-mono);
1728
- font-size: 13px;
1729
- line-height: 1.55;
1730
- }
1731
-
1732
- .trace-bubble {
1733
- padding: 12px;
1734
- }
1735
-
1736
- .trace-structured {
1737
- display: flex;
1738
- flex-direction: column;
1739
- gap: 10px;
1740
- margin-bottom: 10px;
1741
- }
1742
-
1743
- .trace-flow {
1744
- display: flex;
1745
- flex-direction: column;
1746
- gap: 8px;
1747
- }
1748
-
1749
- .trace-flow-toggle {
1750
- border: 1px solid rgba(181, 146, 99, 0.26);
1751
- border-radius: 10px;
1752
- background: rgba(255, 250, 242, 0.7);
1753
- overflow: hidden;
1754
- }
1755
-
1756
- .trace-flow-toggle[open] {
1757
- background: transparent;
1758
- border-color: transparent;
1759
- }
1760
-
1761
- .trace-flow-toggle-summary {
1762
- list-style: none;
1763
- display: flex;
1764
- align-items: center;
1765
- gap: 6px;
1766
- padding: 8px 10px;
1767
- cursor: pointer;
1768
- font-size: 12px;
1769
- color: var(--muted);
1770
- }
1771
-
1772
- .trace-flow-toggle-summary::-webkit-details-marker {
1773
- display: none;
1774
- }
1775
-
1776
- .trace-flow-toggle-summary::before {
1777
- content: '';
1778
- width: 8px;
1779
- height: 8px;
1780
- flex: 0 0 auto;
1781
- border-right: 1.6px solid currentColor;
1782
- border-bottom: 1.6px solid currentColor;
1783
- transform: rotate(-45deg);
1784
- transition: transform 140ms ease;
1785
- }
1786
-
1787
- .trace-flow-toggle[open] > .trace-flow-toggle-summary::before {
1788
- transform: rotate(45deg);
1789
- }
1790
-
1791
- .trace-flow-toggle > .trace-flow {
1792
- padding: 0 10px 10px;
1793
- }
1794
-
1795
- .trace-card {
1796
- border: 1px solid rgba(181, 146, 99, 0.32);
1797
- border-left-width: 3px;
1798
- border-radius: 10px;
1799
- background: rgba(255, 255, 255, 0.88);
1800
- overflow: hidden;
1801
- }
1802
-
1803
- .trace-card.trace-tone-command {
1804
- border-left-color: var(--subaccent);
1805
- }
1806
-
1807
- .trace-card.trace-tone-mcp {
1808
- border-left-color: var(--accent);
1809
- }
1810
-
1811
- .trace-card.trace-tone-note {
1812
- border-left-color: #6f62b5;
1813
- }
1814
-
1815
- .trace-card.trace-tone-status {
1816
- border-left-color: #7d8aa1;
1817
- }
1818
-
1819
- .trace-card.trace-tone-error {
1820
- border-left-color: var(--danger);
1821
- background: rgba(255, 239, 236, 0.92);
1822
- }
1823
-
1824
- .trace-card.trace-tone-neutral {
1825
- border-left-color: var(--line-strong);
1826
- }
1827
-
1828
- .trace-card.trace-card-residual {
1829
- background: rgba(255, 250, 242, 0.86);
1830
- box-shadow: none;
1831
- }
1832
-
1833
- .trace-card-summary {
1834
- list-style: none;
1835
- display: flex;
1836
- align-items: center;
1837
- gap: 8px;
1838
- padding: 9px 10px;
1839
- cursor: default;
1840
- }
1841
-
1842
- details.trace-card > .trace-card-summary {
1843
- cursor: pointer;
1844
- }
1845
-
1846
- .trace-card-summary::-webkit-details-marker {
1847
- display: none;
1848
- }
1849
-
1850
- .trace-card-badge {
1851
- flex: 0 0 auto;
1852
- display: inline-flex;
1853
- align-items: center;
1854
- justify-content: center;
1855
- min-width: 42px;
1856
- padding: 2px 7px;
1857
- border-radius: 999px;
1858
- background: rgba(31, 26, 20, 0.08);
1859
- color: var(--text);
1860
- font-size: 11px;
1861
- font-weight: 700;
1862
- letter-spacing: 0.2px;
1863
- }
1864
-
1865
- .trace-card-title {
1866
- min-width: 0;
1867
- flex: 1;
1868
- color: var(--text);
1869
- font-size: 12px;
1870
- font-weight: 600;
1871
- line-height: 1.45;
1872
- word-break: break-word;
1873
- }
1874
-
1875
- .trace-card-phase {
1876
- flex: 0 0 auto;
1877
- color: var(--muted);
1878
- font-size: 11px;
1879
- font-weight: 700;
1880
- }
1881
-
1882
- .trace-card-body {
1883
- padding: 0 10px 10px;
1884
- display: flex;
1885
- flex-direction: column;
1886
- gap: 8px;
1887
- }
1888
-
1889
- .trace-card-body-section {
1890
- display: flex;
1891
- flex-direction: column;
1892
- gap: 4px;
1893
- }
1894
-
1895
- .trace-card-body-label {
1896
- color: var(--muted);
1897
- font-size: 11px;
1898
- font-weight: 700;
1899
- letter-spacing: 0.2px;
1900
- text-transform: uppercase;
1901
- }
1902
-
1903
- .trace-card-body-pre {
1904
- margin: 0;
1905
- padding: 8px 9px;
1906
- border-radius: 8px;
1907
- background: rgba(31, 26, 20, 0.05);
1908
- color: var(--text);
1909
- white-space: pre-wrap;
1910
- word-break: break-word;
1911
- font-family: var(--font-mono);
1912
- font-size: 12px;
1913
- line-height: 1.5;
1914
- }
1915
-
1916
- .composer {
1917
- margin-top: 4px;
1918
- padding: 4px 8px 0;
1919
- border-radius: 14px;
1920
- background: linear-gradient(180deg, rgba(255, 255, 255, 0.32) 0%, rgba(255, 249, 240, 0.78) 100%);
1921
- }
1922
-
1923
- body.composer-options-open .composer {
1924
- /* 移动端 .composer 是 position: sticky + z-index: 3 自成一个层叠上下文,
1925
- "选项"面板的 z-index: 8 只在这个上下文内部有效,会被消息区里
1926
- z-index 更高的内容(如 .msg:last-child)整体盖住;下拉展开时
1927
- 把 composer 本身的层级也一起抬高,才能让面板真正浮在最上层 */
1928
- z-index: 20;
1929
- }
1930
-
1931
- .composer-inner {
1932
- display: grid;
1933
- grid-template-columns: 1fr auto;
1934
- align-items: flex-end;
1935
- gap: 10px;
1936
- }
1937
-
1938
- .composer-actions {
1939
- display: flex;
1940
- flex-direction: column;
1941
- gap: 8px;
1942
- }
1943
-
1944
- .composer-options {
1945
- position: relative;
1946
- display: flex;
1947
- }
1948
-
1949
- #composerOptionsToggle {
1950
- min-width: 92px;
1951
- }
1952
-
1953
- .composer-options-panel {
1954
- display: none;
1955
- position: absolute;
1956
- /* 触发按钮在 composer 底部,下拉框往下展开会跑出视口,改成往上展开 */
1957
- bottom: calc(100% + 8px);
1958
- right: 0;
1959
- z-index: 8;
1960
- width: max-content;
1961
- min-width: 140px;
1962
- padding: 8px;
1963
- border: 1px solid var(--line);
1964
- border-radius: 10px;
1965
- background: #fffaf2;
1966
- box-shadow: var(--shadow-strong);
1967
- flex-direction: column;
1968
- gap: 6px;
1969
- }
1970
-
1971
- body.composer-options-open .composer-options-panel {
1972
- display: flex;
1973
- }
1974
-
1975
- .composer-options-panel button {
1976
- text-align: left;
1977
- }
1978
-
1979
- .composer-options-info {
1980
- display: inline-flex;
1981
- align-items: center;
1982
- min-height: 32px;
1983
- padding: 7px 12px;
1984
- border: 1px solid var(--line);
1985
- border-radius: 10px;
1986
- background: var(--panel-soft);
1987
- color: var(--muted);
1988
- font-size: 12px;
1989
- line-height: 1;
1990
- white-space: nowrap;
1991
- }
1992
-
1993
- #commandInput {
1994
- width: 100%;
1995
- min-height: 116px;
1996
- max-height: 300px;
1997
- border: 1px solid var(--line);
1998
- border-radius: 10px;
1999
- padding: 11px 12px;
2000
- resize: vertical;
2001
- background: var(--panel-strong);
2002
- color: var(--text);
2003
- font-family: var(--font-mono);
2004
- font-size: 13px;
2005
- line-height: 1.5;
2006
- }
2007
-
2008
- #sendBtn {
2009
- min-width: 92px;
2010
- }
2011
-
2012
- @keyframes panelIn {
2013
- from {
2014
- opacity: 0;
2015
- transform: translateY(8px);
2016
- }
2017
- to {
2018
- opacity: 1;
2019
- transform: translateY(0);
2020
- }
2021
- }
2022
-
2023
- @keyframes msgIn {
2024
- from {
2025
- opacity: 0;
2026
- transform: translateY(5px);
2027
- }
2028
- to {
2029
- opacity: 1;
2030
- transform: translateY(0);
2031
- }
2032
- }
2033
-
2034
- .streaming-reply {
2035
- border-color: var(--subaccent);
2036
- box-shadow: 0 8px 16px rgba(15, 124, 114, 0.10);
2037
- }
2038
-
2039
- .streaming-cursor {
2040
- display: inline-block;
2041
- width: 7px;
2042
- height: 16px;
2043
- margin-left: 2px;
2044
- vertical-align: text-bottom;
2045
- background: var(--subaccent);
2046
- border-radius: 2px;
2047
- animation: blink-cursor 640ms steps(2, start) infinite;
2048
- }
2049
-
2050
- @keyframes blink-cursor {
2051
- to {
2052
- visibility: hidden;
2053
- }
2054
- }
2055
-
2056
- @keyframes shimmer {
2057
- 100% {
2058
- transform: translateX(100%);
2059
- }
2060
- }
2061
-
2062
- @media (max-width: 980px) {
2063
- body {
2064
- height: 100vh;
2065
- height: 100dvh;
2066
- overflow: hidden;
2067
- }
2068
-
2069
- body.mobile-sessions-open {
2070
- overflow: hidden;
2071
- }
2072
-
2073
- .app {
2074
- height: auto;
2075
- min-height: 0;
2076
- padding: 0;
2077
- grid-template-columns: 1fr;
2078
- gap: 0;
2079
- }
2080
-
2081
- .sidebar {
2082
- position: fixed;
2083
- left: env(safe-area-inset-left, 0px);
2084
- top: env(safe-area-inset-top, 0px);
2085
- bottom: env(safe-area-inset-bottom, 0px);
2086
- width: min(86vw, 346px);
2087
- max-width: 346px;
2088
- max-height: none;
2089
- background: rgba(255, 252, 246, 0.98);
2090
- border-radius: 0;
2091
- z-index: 40;
2092
- transform: translateX(calc(-100% - 16px));
2093
- opacity: 0;
2094
- pointer-events: none;
2095
- transition: transform 220ms ease, opacity 220ms ease;
2096
- animation: none;
2097
- }
2098
-
2099
- body.mobile-sessions-open .sidebar {
2100
- transform: translateX(0);
2101
- opacity: 1;
2102
- pointer-events: auto;
2103
- }
2104
-
2105
- .main {
2106
- position: fixed;
2107
- left: env(safe-area-inset-left, 0px);
2108
- right: env(safe-area-inset-right, 0px);
2109
- top: env(safe-area-inset-top, 0px);
2110
- bottom: env(safe-area-inset-bottom, 0px);
2111
- height: auto;
2112
- min-height: auto;
2113
- overflow: hidden;
2114
- z-index: 1;
2115
- grid-template-columns: minmax(0, 1fr);
2116
- }
2117
-
2118
- #messages,
2119
- #terminalPanel,
2120
- .inspector-pane {
2121
- min-height: 0;
2122
- }
2123
-
2124
- .composer {
2125
- position: sticky;
2126
- bottom: 0;
2127
- z-index: 3;
2128
- }
2129
-
2130
- .mobile-session-toggle,
2131
- .mobile-sidebar-close {
2132
- display: inline-flex;
2133
- padding: 8px 12px;
2134
- font-size: 13px;
2135
- }
2136
-
2137
- .sidebar-backdrop {
2138
- display: block;
2139
- position: fixed;
2140
- inset: 0;
2141
- z-index: 30;
2142
- background: rgba(23, 17, 11, 0.45);
2143
- opacity: 0;
2144
- pointer-events: none;
2145
- transition: opacity 220ms ease;
2146
- }
2147
-
2148
- body.mobile-sessions-open .sidebar-backdrop {
2149
- opacity: 1;
2150
- pointer-events: auto;
2151
- }
2152
- }
2153
-
2154
- @media (max-width: 640px) {
2155
- .sidebar-actions {
2156
- width: 100%;
2157
- justify-content: flex-end;
2158
- }
2159
-
2160
- .header {
2161
- padding: 4px 12px;
2162
- }
2163
-
2164
- .workbench-tabs {
2165
- gap: 6px;
2166
- }
2167
-
2168
- .files-layout {
2169
- grid-template-columns: minmax(0, 1fr);
2170
- grid-template-rows: minmax(0, 1fr);
2171
- }
2172
-
2173
- .files-sidebar {
2174
- border-right: 0;
2175
- border-bottom: 1px solid var(--line);
2176
- }
2177
-
2178
- .files-toolbar {
2179
- flex-wrap: wrap;
2180
- }
2181
-
2182
- .files-toolbar-path-group {
2183
- flex-basis: 100%;
2184
- }
2185
-
2186
- .files-toolbar-meta {
2187
- flex-basis: 100%;
2188
- flex-wrap: wrap;
2189
- margin-left: 0;
2190
- }
2191
-
2192
- .files-browser[data-mobile-pane="list"] .files-preview {
2193
- display: none;
2194
- }
2195
-
2196
- .files-browser[data-mobile-pane="preview"] .files-sidebar {
2197
- display: none;
2198
- }
2199
-
2200
- .files-browser[data-mobile-pane="preview"] .files-toolbar {
2201
- display: none;
2202
- }
2203
-
2204
- .files-browser[data-mobile-pane="preview"] .files-back-btn {
2205
- display: inline-flex;
2206
- order: 1;
2207
- }
2208
-
2209
- .files-preview-head {
2210
- flex-wrap: wrap;
2211
- align-items: center;
2212
- }
2213
-
2214
- .files-preview-actions {
2215
- order: 2;
2216
- }
2217
-
2218
- .files-preview-head-main {
2219
- order: 3;
2220
- flex-basis: 100%;
2221
- }
2222
-
2223
- .files-preview-meta {
2224
- display: none;
2225
- }
2226
-
2227
- .composer-inner {
2228
- align-items: stretch;
2229
- }
2230
-
2231
- #commandInput {
2232
- min-height: 68px;
2233
- max-height: 160px;
2234
- }
2235
-
2236
- #sendBtn,
2237
- #composerOptionsToggle {
2238
- width: auto;
2239
- min-width: 74px;
2240
- align-self: stretch;
2241
- }
2242
-
2243
- .composer {
2244
- padding: 8px 8px 6px;
2245
- }
2246
-
2247
- .modal-backdrop {
2248
- padding: 8px;
2249
- }
2250
-
2251
- .modal {
2252
- width: calc(100vw - 16px);
2253
- max-height: calc(100vh - 16px);
2254
- }
2255
-
2256
- .form-grid {
2257
- grid-template-columns: 1fr;
2258
- }
2259
- }
2260
-
2261
- @media (prefers-reduced-motion: reduce) {
2262
- *,
2263
- *::before,
2264
- *::after {
2265
- animation-duration: 0.01ms !important;
2266
- animation-iteration-count: 1 !important;
2267
- transition-duration: 0.01ms !important;
2268
- }
2269
- }