@xcanwin/manyoyo 5.7.14 → 5.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,6 +14,8 @@
14
14
  --line: #d9c7ad;
15
15
  --line-strong: #b59263;
16
16
  --line-soft: rgba(181, 146, 99, 0.26);
17
+ --tree-guide: rgba(181, 146, 99, 0.44);
18
+ --tree-guide-soft: rgba(181, 146, 99, 0.2);
17
19
 
18
20
  --text: #1f1a14;
19
21
  --muted: #6a5f52;
@@ -36,6 +38,7 @@
36
38
  --status-stopped-text: #9a5a09;
37
39
  --status-history-bg: #ece7df;
38
40
  --status-history-text: #645647;
41
+ --tree-history-text: #b7b0a7;
39
42
  --status-unknown-bg: #ece9ff;
40
43
  --status-unknown-text: #5a4bb0;
41
44
 
@@ -400,6 +403,10 @@ textarea:focus-visible {
400
403
  resize: vertical;
401
404
  }
402
405
 
406
+ .agent-template-modal {
407
+ width: min(760px, calc(100vw - 24px));
408
+ }
409
+
403
410
  .session-head {
404
411
  display: flex;
405
412
  justify-content: space-between;
@@ -546,8 +553,8 @@ button.tree-toggle {
546
553
  padding: 10px 12px;
547
554
  display: flex;
548
555
  align-items: flex-start;
549
- justify-content: space-between;
550
- gap: 12px;
556
+ justify-content: flex-start;
557
+ gap: 0;
551
558
  }
552
559
 
553
560
  button.tree-toggle:hover {
@@ -560,320 +567,267 @@ button.tree-toggle:active {
560
567
  transform: none;
561
568
  }
562
569
 
563
- button.tree-toggle:focus-visible {
564
- outline: none;
565
- box-shadow: 0 0 0 3px rgba(196, 85, 31, 0.14);
566
- }
567
-
568
- .tree-toggle-main {
569
- min-width: 0;
570
+ .tree-node-block,
571
+ .tree-node-children {
570
572
  display: flex;
571
573
  flex-direction: column;
572
- gap: 4px;
574
+ gap: 8px;
573
575
  }
574
576
 
575
- .tree-toggle-meta {
576
- color: var(--muted);
577
- font-size: 11px;
578
- line-height: 1.45;
579
- word-break: break-word;
577
+ .tree-node-row {
578
+ display: grid;
579
+ grid-template-columns: auto minmax(0, 1fr);
580
+ align-items: stretch;
581
+ column-gap: 8px;
580
582
  }
581
583
 
582
- .tree-toggle-caret {
583
- color: #8c7257;
584
- font-size: 18px;
585
- line-height: 1;
586
- flex-shrink: 0;
587
- transition: transform 140ms ease;
584
+ .tree-node-row.tree-node-row-container {
585
+ position: relative;
586
+ grid-template-columns: auto minmax(0, 1fr);
588
587
  }
589
588
 
590
- .tree-toggle[aria-expanded="true"] .tree-toggle-caret {
591
- transform: rotate(90deg);
589
+ .tree-prefix {
590
+ min-height: 38px;
591
+ display: inline-flex;
592
+ align-items: stretch;
593
+ gap: 3px;
594
+ position: relative;
592
595
  }
593
596
 
594
- .workbench-group-head {
595
- padding: 10px 14px;
596
- border: 1px solid rgba(181, 146, 99, 0.34);
597
- border-radius: 999px;
598
- background: linear-gradient(180deg, rgba(255, 250, 242, 0.98) 0%, rgba(252, 242, 230, 0.96) 100%);
597
+ .tree-prefix-toggle {
598
+ position: relative;
599
+ width: 16px;
600
+ flex: 0 0 16px;
601
+ display: inline-flex;
602
+ align-items: center;
603
+ justify-content: center;
599
604
  }
600
605
 
601
- .workbench-path-bar .tree-toggle-main {
602
- flex: 1;
603
- min-width: 0;
604
- display: grid;
605
- grid-template-columns: auto minmax(0, 1fr);
606
- align-items: center;
607
- column-gap: 10px;
608
- row-gap: 3px;
606
+ .tree-prefix-segment,
607
+ .tree-prefix-branch {
608
+ position: relative;
609
+ width: 10px;
610
+ flex: 0 0 10px;
609
611
  }
610
612
 
611
- .workbench-path-bar .workbench-group-kicker {
612
- grid-column: 1;
613
- grid-row: 1;
614
- display: inline-flex;
615
- align-items: center;
616
- padding: 3px 8px;
617
- border-radius: 999px;
618
- border: 1px solid rgba(181, 146, 99, 0.34);
619
- background: rgba(255, 255, 255, 0.56);
613
+ .tree-prefix-branch::before,
614
+ .tree-prefix-branch::after {
615
+ content: "";
616
+ position: absolute;
617
+ background: var(--tree-guide);
620
618
  }
621
619
 
622
- .workbench-path-bar .workbench-group-title {
623
- grid-column: 2;
624
- grid-row: 1;
625
- margin-top: 0;
626
- min-width: 0;
627
- overflow: hidden;
628
- text-overflow: ellipsis;
629
- white-space: nowrap;
630
- font-family: var(--font-mono);
631
- font-size: 12px;
632
- font-weight: 600;
620
+ .tree-prefix-branch::before {
621
+ left: 5px;
622
+ top: -6px;
623
+ bottom: 50%;
624
+ width: 1px;
633
625
  }
634
626
 
635
- .workbench-path-bar .tree-toggle-meta {
636
- grid-column: 2;
637
- grid-row: 2;
627
+ .tree-prefix-branch.is-mid::before {
628
+ bottom: -6px;
638
629
  }
639
630
 
640
- .workbench-group.has-active .workbench-group-head,
641
- .container-card.has-active {
642
- border-color: #c68d5a;
643
- box-shadow: 0 0 0 2px rgba(196, 85, 31, 0.08);
631
+ .tree-prefix-branch::after {
632
+ left: 5px;
633
+ top: 50%;
634
+ width: 9px;
635
+ height: 1px;
636
+ background: var(--tree-guide-soft);
644
637
  }
645
638
 
646
- .workbench-group-body {
647
- display: flex;
648
- flex-direction: column;
649
- gap: 10px;
650
- margin-left: 14px;
651
- padding-left: 12px;
652
- border-left: 1px solid var(--line-soft);
639
+ .tree-prefix-leaf {
640
+ position: relative;
641
+ width: 12px;
642
+ flex: 0 0 12px;
653
643
  }
654
644
 
655
- .workbench-group-body[hidden] {
656
- display: none;
645
+ .tree-prefix-leaf::before {
646
+ content: "";
647
+ position: absolute;
648
+ left: 1px;
649
+ top: 50%;
650
+ width: 10px;
651
+ height: 1px;
652
+ background: var(--tree-guide-soft);
653
+ transform: translateY(-0.5px);
657
654
  }
658
655
 
659
- .workbench-group-kicker,
660
- .container-card-kicker {
661
- color: var(--muted);
662
- font-size: 10px;
663
- font-weight: 700;
664
- letter-spacing: 0.7px;
665
- text-transform: uppercase;
656
+ .disclosure-toggle {
657
+ width: 16px;
658
+ height: 16px;
659
+ padding: 0;
660
+ align-self: center;
661
+ display: inline-flex;
662
+ align-items: center;
663
+ justify-content: center;
664
+ border: none;
665
+ border-radius: 6px;
666
+ color: #8c7257;
667
+ background: transparent;
668
+ transition: transform 140ms ease, background-color 140ms ease, color 140ms ease;
666
669
  }
667
670
 
668
- .workbench-group-title,
669
- .container-card-title {
670
- margin-top: 3px;
671
- font-weight: 700;
672
- font-size: 13px;
673
- line-height: 1.45;
674
- word-break: break-word;
671
+ .disclosure-toggle svg {
672
+ width: 12px;
673
+ height: 12px;
674
+ display: block;
675
+ fill: none;
676
+ stroke: currentColor;
677
+ stroke-width: 1.8;
678
+ stroke-linecap: round;
679
+ stroke-linejoin: round;
680
+ vector-effect: non-scaling-stroke;
675
681
  }
676
682
 
677
- .container-stack {
678
- display: flex;
679
- flex-direction: column;
680
- gap: 10px;
683
+ .disclosure-toggle:hover {
684
+ transform: none;
685
+ color: var(--accent-strong);
686
+ background: rgba(196, 85, 31, 0.08);
681
687
  }
682
688
 
683
- .container-card {
684
- border: 1px solid rgba(181, 146, 99, 0.52);
685
- border-radius: 16px;
686
- background: linear-gradient(180deg, rgba(255, 255, 255, 0.96) 0%, rgba(249, 242, 232, 0.98) 100%);
687
- padding: 12px;
688
- display: flex;
689
- flex-direction: column;
690
- gap: 10px;
691
- box-shadow: 0 10px 22px rgba(44, 31, 15, 0.08);
689
+ .disclosure-toggle:active {
690
+ transform: none;
692
691
  }
693
692
 
694
- .container-card-head {
695
- display: flex;
696
- flex-wrap: wrap;
697
- align-items: flex-start;
698
- justify-content: space-between;
699
- gap: 12px;
693
+ .disclosure-toggle[aria-expanded="true"] {
694
+ transform: rotate(90deg);
700
695
  }
701
696
 
702
- .container-toggle {
703
- flex: 1;
704
- min-width: 0;
705
- padding: 0;
706
- border: none;
707
- background: transparent;
697
+ .disclosure-toggle[aria-expanded="true"]:hover {
698
+ transform: rotate(90deg);
699
+ }
700
+
701
+ .tree-node-button {
702
+ width: 100%;
703
+ text-align: left;
704
+ border: 1px solid rgba(181, 146, 99, 0.38);
705
+ background: rgba(255, 255, 255, 0.94);
708
706
  color: var(--text);
709
- display: flex;
710
- align-items: flex-start;
711
- justify-content: space-between;
712
- gap: 12px;
707
+ border-radius: 12px;
708
+ padding: 10px 11px;
713
709
  }
714
710
 
715
- button.container-toggle:hover,
716
- button.container-toggle:active {
711
+ .tree-node-button:hover {
712
+ transform: none;
713
+ border-color: #d1aa7f;
714
+ background: #fff8ef;
715
+ }
716
+
717
+ .tree-node-button:active {
717
718
  transform: none;
718
- background: transparent;
719
719
  }
720
720
 
721
- button.container-toggle:focus-visible {
721
+ .tree-node-button:focus-visible {
722
722
  outline: none;
723
723
  box-shadow: 0 0 0 3px rgba(196, 85, 31, 0.14);
724
724
  }
725
725
 
726
- .container-toggle-main {
727
- min-width: 0;
728
- flex: 1;
729
- display: flex;
730
- flex-direction: column;
731
- gap: 8px;
726
+ .tree-node-button.active {
727
+ border-color: #c68d5a;
728
+ background: #fff3e8;
729
+ box-shadow: inset 3px 0 0 var(--accent), 0 0 0 2px rgba(196, 85, 31, 0.14);
732
730
  }
733
731
 
734
- .container-title-row {
735
- display: flex;
736
- align-items: flex-start;
737
- gap: 10px;
738
- min-width: 0;
732
+ .tree-node-button.tree-node-tone-history .tree-node-title,
733
+ .tree-node-button.tree-node-tone-history .tree-node-meta {
734
+ color: var(--tree-history-text);
739
735
  }
740
736
 
741
- .container-title-stack {
742
- min-width: 0;
743
- display: flex;
744
- flex-direction: column;
745
- gap: 4px;
737
+ .tree-node-block.has-active > .tree-node-row > .tree-node-button:not(.active) {
738
+ border-color: #c68d5a;
739
+ box-shadow: 0 0 0 2px rgba(196, 85, 31, 0.08);
746
740
  }
747
741
 
748
- .sidebar-icon {
749
- width: 32px;
750
- height: 32px;
751
- flex: 0 0 auto;
752
- display: inline-flex;
753
- align-items: center;
754
- justify-content: center;
755
- border-radius: 11px;
756
- border: 1px solid rgba(181, 146, 99, 0.34);
757
- background: linear-gradient(180deg, rgba(255, 244, 232, 0.96) 0%, rgba(255, 252, 247, 0.9) 100%);
758
- color: var(--accent-strong);
759
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.9);
742
+ .tree-node-button-directory,
743
+ .tree-node-button-container {
744
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.96) 0%, rgba(249, 242, 232, 0.98) 100%);
760
745
  }
761
746
 
762
- .sidebar-icon svg {
763
- width: 18px;
764
- height: 18px;
765
- display: block;
747
+ .tree-node-row-container .tree-node-button-container {
748
+ padding-right: 52px;
766
749
  }
767
750
 
768
- .container-card-meta {
751
+ .tree-node-main {
752
+ min-width: 0;
769
753
  display: flex;
770
- flex-wrap: wrap;
771
- gap: 8px;
772
- align-items: center;
754
+ flex-direction: column;
755
+ gap: 6px;
773
756
  }
774
757
 
775
- .sidebar-badge {
776
- display: inline-flex;
777
- align-items: center;
778
- gap: 4px;
779
- min-height: 26px;
780
- padding: 4px 10px;
781
- border-radius: 999px;
782
- border: 1px solid transparent;
783
- font-size: 11px;
758
+ .tree-node-title {
759
+ margin-top: 0;
784
760
  font-weight: 700;
785
- line-height: 1.2;
786
- }
787
-
788
- .container-status-pill {
789
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.55);
761
+ font-size: 13px;
762
+ line-height: 1.5;
763
+ overflow-wrap: anywhere;
790
764
  }
791
765
 
792
- .container-agent-badge {
793
- background: rgba(15, 124, 114, 0.1);
794
- border-color: rgba(15, 124, 114, 0.22);
795
- color: var(--subaccent-strong);
766
+ .tree-node-button-directory .tree-node-title,
767
+ .tree-node-button-container .tree-node-title {
768
+ font-family: var(--font-mono);
769
+ font-size: 12px;
770
+ font-weight: 600;
796
771
  }
797
772
 
798
- .container-card-info {
773
+ .tree-node-meta {
799
774
  color: #7b6d5d;
800
775
  font-size: 11px;
801
776
  line-height: 1.45;
802
- white-space: nowrap;
803
- overflow: hidden;
804
- text-overflow: ellipsis;
777
+ overflow-wrap: anywhere;
805
778
  }
806
779
 
807
- .add-agent-btn {
808
- align-self: flex-start;
809
- padding: 7px 11px;
780
+ .tree-node-status {
781
+ font-weight: 700;
810
782
  font-size: 12px;
811
- border-radius: 999px;
812
- white-space: nowrap;
813
- margin-bottom: 2px;
814
- }
815
-
816
- .agent-list {
817
- display: flex;
818
- flex-direction: column;
819
- gap: 7px;
820
783
  }
821
784
 
822
- .container-card-body {
823
- margin-top: 2px;
824
- padding: 10px;
825
- border: 1px solid rgba(181, 146, 99, 0.28);
826
- border-top-color: rgba(181, 146, 99, 0.4);
827
- border-radius: 13px;
828
- background: linear-gradient(180deg, rgba(244, 238, 228, 0.88) 0%, rgba(255, 255, 255, 0.98) 100%);
829
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.88);
785
+ .tree-node-status.running {
786
+ color: var(--status-running-text);
830
787
  }
831
788
 
832
- .agent-list[hidden] {
833
- display: none;
789
+ .tree-node-status.stopped {
790
+ color: var(--status-stopped-text);
834
791
  }
835
792
 
836
- .agent-item {
837
- text-align: left;
838
- width: 100%;
839
- border: 1px solid rgba(181, 146, 99, 0.38);
840
- background: rgba(255, 255, 255, 0.94);
841
- color: var(--text);
842
- border-radius: 12px;
843
- padding: 10px 11px;
844
- animation: itemIn 220ms ease both;
845
- animation-delay: calc(var(--item-index, 0) * 24ms);
793
+ .tree-node-status.history {
794
+ color: var(--tree-history-text);
846
795
  }
847
796
 
848
- .agent-item:hover {
849
- border-color: #d1aa7f;
850
- background: #fff8ef;
797
+ .tree-node-status.unknown {
798
+ color: var(--status-unknown-text);
851
799
  }
852
800
 
853
- .agent-item.active {
854
- border-color: #c68d5a;
855
- background: #fff3e8;
856
- box-shadow: inset 3px 0 0 var(--accent), 0 0 0 2px rgba(196, 85, 31, 0.14);
801
+ .tree-node-hover-menu {
802
+ position: absolute;
803
+ top: 50%;
804
+ right: 10px;
805
+ display: inline-flex;
806
+ align-items: center;
807
+ gap: 6px;
808
+ opacity: 0;
809
+ pointer-events: none;
810
+ transform: translateY(-50%) translateX(4px);
811
+ transition: opacity 140ms ease, transform 140ms ease;
857
812
  }
858
813
 
859
- .agent-name {
860
- font-size: 13px;
861
- font-weight: 700;
862
- margin-bottom: 6px;
863
- word-break: break-word;
814
+ .tree-node-row-container:hover .tree-node-hover-menu,
815
+ .tree-node-hover-menu:focus-within {
816
+ opacity: 1;
817
+ pointer-events: auto;
818
+ transform: translateY(-50%) translateX(0);
864
819
  }
865
820
 
866
- .agent-meta {
867
- display: flex;
868
- align-items: center;
869
- gap: 7px;
870
- font-size: 12px;
821
+ .tree-node-menu-item {
822
+ padding: 6px 9px;
823
+ font-size: 11px;
824
+ border-radius: 999px;
825
+ white-space: nowrap;
826
+ box-shadow: 0 10px 22px rgba(44, 31, 15, 0.12);
871
827
  }
872
828
 
873
- .agent-time {
874
- margin-top: 6px;
875
- font-size: 11px;
876
- color: #7b6d5d;
829
+ .tree-node-children[hidden] {
830
+ display: none;
877
831
  }
878
832
 
879
833
  .dir-picker-modal {
@@ -1631,14 +1585,36 @@ details.trace-card > .trace-card-summary {
1631
1585
  margin-bottom: 10px;
1632
1586
  }
1633
1587
 
1588
+ .composer-toolbar-meta {
1589
+ display: inline-flex;
1590
+ align-items: center;
1591
+ gap: 10px;
1592
+ margin-left: auto;
1593
+ }
1594
+
1634
1595
  .composer-mode-switch {
1635
1596
  display: inline-flex;
1636
1597
  gap: 8px;
1637
1598
  }
1638
1599
 
1639
- .composer-toolbar-tip {
1600
+ .toolbar-mini-btn {
1601
+ padding: 7px 12px;
1602
+ font-size: 12px;
1603
+ white-space: nowrap;
1604
+ }
1605
+
1606
+ .toolbar-chip {
1607
+ display: inline-flex;
1608
+ align-items: center;
1609
+ min-height: 32px;
1610
+ padding: 7px 12px;
1611
+ border: 1px solid var(--line);
1612
+ border-radius: 10px;
1613
+ background: var(--panel-soft);
1640
1614
  color: var(--muted);
1641
1615
  font-size: 12px;
1616
+ line-height: 1;
1617
+ white-space: nowrap;
1642
1618
  }
1643
1619
 
1644
1620
  .composer-inner {
@@ -1883,8 +1859,10 @@ details.trace-card > .trace-card-summary {
1883
1859
  align-items: flex-start;
1884
1860
  }
1885
1861
 
1886
- .composer-toolbar-tip {
1887
- display: none;
1862
+ .composer-toolbar-meta {
1863
+ width: 100%;
1864
+ justify-content: space-between;
1865
+ margin-left: 0;
1888
1866
  }
1889
1867
 
1890
1868
  .composer-mode-switch {
@@ -34,7 +34,7 @@
34
34
  <span>工作台</span>
35
35
  <span id="sessionCount">0 个</span>
36
36
  </div>
37
- <div id="sessionList"></div>
37
+ <div id="sessionList" role="tree" aria-label="会话树"></div>
38
38
  </aside>
39
39
  <main class="main">
40
40
  <header class="header">
@@ -105,7 +105,10 @@
105
105
  <button type="button" id="activityAgentBtn" class="secondary is-active">Agent</button>
106
106
  <button type="button" id="activityCommandBtn" class="secondary">命令</button>
107
107
  </div>
108
- <div class="composer-toolbar-tip">活动页支持 Agent 提示词和容器命令两种输入。</div>
108
+ <div class="composer-toolbar-meta">
109
+ <button type="button" id="agentTemplateBtn" class="secondary toolbar-mini-btn">CLI · —</button>
110
+ <span id="activityModelChip" class="toolbar-chip" aria-live="polite">模型 · —</span>
111
+ </div>
109
112
  </div>
110
113
  <div class="composer-inner">
111
114
  <textarea id="commandInput" placeholder="输入容器命令,例如: ls -la"></textarea>
@@ -220,6 +223,31 @@
220
223
  </div>
221
224
  </section>
222
225
  </div>
226
+
227
+ <div id="agentTemplateModal" class="modal-backdrop" hidden>
228
+ <section class="modal agent-template-modal" role="dialog" aria-modal="true" aria-labelledby="agentTemplateTitle">
229
+ <header class="modal-header">
230
+ <h2 id="agentTemplateTitle">设置 CLI / Agent 模板</h2>
231
+ <button type="button" id="agentTemplateCancelBtn" class="secondary">关闭</button>
232
+ </header>
233
+ <div class="modal-body">
234
+ <div id="agentTemplateTip" class="modal-tip"></div>
235
+ <label class="text-block">容器默认 agentPromptCommand
236
+ <textarea id="containerAgentPromptEditor" placeholder="例如 codex exec --skip-git-repo-check {prompt}"></textarea>
237
+ </label>
238
+ <div id="agentTemplateOverrideGroup">
239
+ <label class="text-block">当前 AGENT 覆盖模板
240
+ <textarea id="agentPromptOverrideEditor" placeholder="留空则继承容器默认模板"></textarea>
241
+ </label>
242
+ </div>
243
+ <div id="agentTemplateError" class="modal-error" hidden></div>
244
+ </div>
245
+ <footer class="modal-footer">
246
+ <button type="button" id="agentTemplateResetBtn" class="secondary">恢复当前值</button>
247
+ <button type="button" id="agentTemplateSaveBtn">保存</button>
248
+ </footer>
249
+ </section>
250
+ </div>
223
251
  </div>
224
252
 
225
253
  <script src="/app/vendor/xterm.js"></script>