@xcanwin/manyoyo 6.2.0 → 6.2.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.
@@ -13,7 +13,6 @@
13
13
 
14
14
  --line: #d9c7ad;
15
15
  --line-strong: #b59263;
16
- --line-soft: rgba(181, 146, 99, 0.26);
17
16
  --line-medium: rgba(181, 146, 99, 0.4);
18
17
  --tree-guide: rgba(181, 146, 99, 0.44);
19
18
  --tree-guide-soft: rgba(181, 146, 99, 0.44);
@@ -26,7 +25,6 @@
26
25
 
27
26
  --accent: #c4551f;
28
27
  --accent-strong: #9d4418;
29
- --accent-soft: #fee4d6;
30
28
 
31
29
  --subaccent: #0f7c72;
32
30
  --subaccent-strong: #0a655e;
@@ -36,14 +34,9 @@
36
34
  --danger-strong: #962824;
37
35
  --danger-soft: #ffe8e5;
38
36
 
39
- --status-running-bg: #e0f5ef;
40
37
  --status-running-text: #0c695f;
41
- --status-stopped-bg: #fff0dd;
42
38
  --status-stopped-text: #9a5a09;
43
- --status-history-bg: #ece7df;
44
- --status-history-text: #645647;
45
39
  --tree-history-text: #b7b0a7;
46
- --status-unknown-bg: #ece9ff;
47
40
  --status-unknown-text: #5a4bb0;
48
41
 
49
42
  --user-bubble: #fee9dd;
@@ -54,7 +47,6 @@
54
47
  --terminal-fg: #e8edf5;
55
48
  --terminal-cursor: #ffd166;
56
49
 
57
- --shadow-soft: 0 14px 34px rgba(44, 31, 15, 0.16);
58
50
  --shadow-strong: 0 24px 54px rgba(44, 31, 15, 0.24);
59
51
  }
60
52
 
@@ -526,136 +518,6 @@ textarea:focus-visible {
526
518
  border-radius: 8px;
527
519
  }
528
520
 
529
- .session-item {
530
- text-align: left;
531
- width: 100%;
532
- border: 1px solid var(--line);
533
- background: var(--panel-strong);
534
- color: var(--text);
535
- border-radius: 10px;
536
- padding: 11px 11px 11px 10px;
537
- animation: itemIn 220ms ease both;
538
- animation-delay: calc(var(--item-index, 0) * 30ms);
539
- }
540
-
541
- .session-item:hover {
542
- border-color: #d1aa7f;
543
- background: #fff8ef;
544
- box-shadow: inset 3px 0 0 #d39c6d;
545
- }
546
-
547
- .session-item.active {
548
- border-color: #c68d5a;
549
- background: #fff3e8;
550
- box-shadow: inset 3px 0 0 var(--accent), 0 0 0 2px rgba(196, 85, 31, 0.14);
551
- }
552
-
553
- .session-item.status-history:not(.active),
554
- .session-item.status-stopped:not(.active),
555
- .session-item.status-unknown:not(.active) {
556
- border-color: rgba(181, 146, 99, 0.22);
557
- background: rgba(255, 252, 247, 0.72);
558
- box-shadow: none;
559
- }
560
-
561
- .session-item.status-history:not(.active) .session-name,
562
- .session-item.status-history:not(.active) .session-meta,
563
- .session-item.status-history:not(.active) .session-time,
564
- .session-item.status-stopped:not(.active) .session-name,
565
- .session-item.status-stopped:not(.active) .session-meta,
566
- .session-item.status-stopped:not(.active) .session-time,
567
- .session-item.status-unknown:not(.active) .session-name,
568
- .session-item.status-unknown:not(.active) .session-meta,
569
- .session-item.status-unknown:not(.active) .session-time {
570
- opacity: 0.25;
571
- }
572
-
573
- .session-name {
574
- font-size: 13px;
575
- font-weight: 700;
576
- margin-bottom: 6px;
577
- word-break: break-all;
578
- }
579
-
580
- .session-meta {
581
- display: flex;
582
- align-items: center;
583
- gap: 7px;
584
- font-size: 12px;
585
- }
586
-
587
- .session-status {
588
- border-radius: 999px;
589
- padding: 2px 8px;
590
- font-weight: 700;
591
- font-size: 11px;
592
- line-height: 1.4;
593
- border: 1px solid transparent;
594
- }
595
-
596
- .session-status.running {
597
- background: var(--status-running-bg);
598
- color: var(--status-running-text);
599
- border-color: #a9dacf;
600
- }
601
-
602
- .session-status.stopped {
603
- background: var(--status-stopped-bg);
604
- color: var(--status-stopped-text);
605
- border-color: #edc98e;
606
- }
607
-
608
- .session-status.history {
609
- background: var(--status-history-bg);
610
- color: var(--status-history-text);
611
- border-color: #d8cebe;
612
- }
613
-
614
- .session-status.unknown {
615
- background: var(--status-unknown-bg);
616
- color: var(--status-unknown-text);
617
- border-color: #cac1fb;
618
- }
619
-
620
- .session-count {
621
- color: var(--muted);
622
- }
623
-
624
- .session-time {
625
- margin-top: 6px;
626
- font-size: 11px;
627
- color: #7b6d5d;
628
- }
629
-
630
- .workbench-group {
631
- display: flex;
632
- flex-direction: column;
633
- gap: 10px;
634
- }
635
-
636
- button.tree-toggle {
637
- width: 100%;
638
- text-align: left;
639
- color: var(--text);
640
- background: rgba(255, 250, 242, 0.92);
641
- border-color: rgba(181, 146, 99, 0.38);
642
- padding: 10px 12px;
643
- display: flex;
644
- align-items: flex-start;
645
- justify-content: flex-start;
646
- gap: 0;
647
- }
648
-
649
- button.tree-toggle:hover {
650
- transform: none;
651
- background: #fff6eb;
652
- border-color: #d1aa7f;
653
- }
654
-
655
- button.tree-toggle:active {
656
- transform: none;
657
- }
658
-
659
521
  .tree-node-block,
660
522
  .tree-node-children {
661
523
  display: flex;
@@ -1657,16 +1519,18 @@ body.terminal-mode .composer {
1657
1519
  gap: 6px;
1658
1520
  animation: msgIn 210ms ease both;
1659
1521
  animation-delay: 0ms;
1660
- /* animation 会让每条消息各自建立独立的层叠上下文(transform/opacity 动画的副作用),
1661
- 悬浮显示的 .msg-actions 浮层因此只能在本条消息内部比较 z-index,
1662
- 会被后面消息按 DOM 序整体盖住;悬浮时显式提升本条消息的 z-index 才能穿透 */
1663
- z-index: 0;
1664
1522
  }
1665
1523
 
1666
- .msg:hover,
1667
- .msg:focus-within {
1668
- /* 需要高于移动端 .composer 的 z-index: 3(position: sticky,悬浮在滚动内容之上),
1669
- 否则最后一条消息的浮层会被吸底的输入框盖住 */
1524
+ /* .msg-actions 悬浮浮层会伸到气泡下方,给带浮层的消息多留一点底部间距,
1525
+ 让浮层完整落在消息之间的空白里,不需要靠 z-index 去抢下一条消息的地盘 */
1526
+ .msg:has(.msg-actions) {
1527
+ margin-bottom: 20px;
1528
+ }
1529
+
1530
+ .msg:last-child {
1531
+ /* animation 会让每条消息各自建立独立的层叠上下文(transform/opacity 动画的副作用);
1532
+ 只有最后一条消息的浮层可能伸到吸底 composer(移动端 position: sticky, z-index: 3)
1533
+ 的区域里,需要显式盖过它 */
1670
1534
  z-index: 4;
1671
1535
  }
1672
1536
 
@@ -1747,12 +1611,6 @@ body.terminal-mode .composer {
1747
1611
  opacity: 1;
1748
1612
  pointer-events: auto;
1749
1613
  }
1750
-
1751
- /* 触屏设备没有真正的 :hover,上面 .msg:hover 提升 z-index 的规则永远不会触发;
1752
- 这里常驻按住基础 z-index 之上,浮层才不会被吸底输入框(sticky, z-index: 3)盖住 */
1753
- .msg {
1754
- z-index: 4;
1755
- }
1756
1614
  }
1757
1615
 
1758
1616
  .msg-copy-btn {
@@ -1781,24 +1639,6 @@ body.terminal-mode .composer {
1781
1639
  background: var(--subaccent-soft);
1782
1640
  }
1783
1641
 
1784
- .msg-exit {
1785
- font-family: var(--font-mono);
1786
- font-size: 11px;
1787
- letter-spacing: 0.1px;
1788
- color: var(--muted);
1789
- }
1790
-
1791
- .msg.user .msg-exit {
1792
- align-self: flex-end;
1793
- text-align: right;
1794
- }
1795
-
1796
- .msg.assistant .msg-exit,
1797
- .msg.system .msg-exit {
1798
- align-self: flex-start;
1799
- text-align: left;
1800
- }
1801
-
1802
1642
  .bubble {
1803
1643
  position: relative;
1804
1644
  border: 1px solid var(--line);
@@ -1823,14 +1663,12 @@ body.terminal-mode .composer {
1823
1663
  }
1824
1664
 
1825
1665
  body.agent-mode .msg.origin-command .bubble,
1826
- body.agent-mode .msg.origin-command .msg-meta,
1827
- body.agent-mode .msg.origin-command .msg-exit {
1666
+ body.agent-mode .msg.origin-command .msg-meta {
1828
1667
  opacity: 0.25;
1829
1668
  }
1830
1669
 
1831
1670
  body.command-mode .msg.origin-agent .bubble,
1832
- body.command-mode .msg.origin-agent .msg-meta,
1833
- body.command-mode .msg.origin-agent .msg-exit {
1671
+ body.command-mode .msg.origin-agent .msg-meta {
1834
1672
  opacity: 0.25;
1835
1673
  }
1836
1674
 
@@ -2039,6 +1877,14 @@ details.trace-card > .trace-card-summary {
2039
1877
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.32) 0%, rgba(255, 249, 240, 0.78) 100%);
2040
1878
  }
2041
1879
 
1880
+ body.composer-options-open .composer {
1881
+ /* 移动端 .composer 是 position: sticky + z-index: 3 自成一个层叠上下文,
1882
+ "选项"面板的 z-index: 8 只在这个上下文内部有效,会被消息区里
1883
+ z-index 更高的内容(如 .msg:last-child)整体盖住;下拉展开时
1884
+ 把 composer 本身的层级也一起抬高,才能让面板真正浮在最上层 */
1885
+ z-index: 20;
1886
+ }
1887
+
2042
1888
  .composer-inner {
2043
1889
  display: grid;
2044
1890
  grid-template-columns: 1fr auto;
@@ -2131,17 +1977,6 @@ body.composer-options-open .composer-options-panel {
2131
1977
  }
2132
1978
  }
2133
1979
 
2134
- @keyframes itemIn {
2135
- from {
2136
- opacity: 0;
2137
- transform: translateY(6px);
2138
- }
2139
- to {
2140
- opacity: 1;
2141
- transform: translateY(0);
2142
- }
2143
- }
2144
-
2145
1980
  @keyframes msgIn {
2146
1981
  from {
2147
1982
  opacity: 0;
@@ -951,17 +951,6 @@
951
951
  return base.replace(/\/+$/, '') + '/' + child.replace(/^\/+/, '');
952
952
  }
953
953
 
954
- function envMapToText(envMap) {
955
- if (!envMap || typeof envMap !== 'object') {
956
- return '';
957
- }
958
- return Object.entries(envMap)
959
- .map(function (entry) {
960
- return entry[0] + '=' + String(entry[1] == null ? '' : entry[1]);
961
- })
962
- .join('\n');
963
- }
964
-
965
954
  function textToLineArray(text) {
966
955
  return String(text || '')
967
956
  .split('\n')
@@ -2953,10 +2942,6 @@
2953
2942
  });
2954
2943
  }
2955
2944
 
2956
- function createTreeMetaText(parts) {
2957
- return (parts || []).filter(Boolean).join(' · ');
2958
- }
2959
-
2960
2945
  function getSessionCreatedTime(session) {
2961
2946
  if (session && session.createdAt) {
2962
2947
  const time = new Date(session.createdAt).getTime();
@@ -3368,7 +3353,7 @@
3368
3353
  });
3369
3354
  }
3370
3355
 
3371
- function renderSessionTreeNodes(nodes, parentNode, ancestorHasNext, itemCounter) {
3356
+ function renderSessionTreeNodes(nodes, parentNode, ancestorHasNext) {
3372
3357
  (Array.isArray(nodes) ? nodes : []).forEach(function (node, index) {
3373
3358
  const isLastSibling = index === nodes.length - 1;
3374
3359
  const item = createTreeItem({
@@ -3390,8 +3375,6 @@
3390
3375
 
3391
3376
  if (node.kind === 'agent') {
3392
3377
  item.button.dataset.sessionName = node.sessionName || '';
3393
- item.button.style.setProperty('--item-index', String(itemCounter.value));
3394
- itemCounter.value += 1;
3395
3378
  state.sessionNodeMap.set(node.sessionName, item.button);
3396
3379
  item.button.addEventListener('click', function () {
3397
3380
  handleSessionItemClick(node.sessionName || '');
@@ -3409,7 +3392,7 @@
3409
3392
  childrenNode.className = `tree-node-children tree-node-children-${node.kind}`;
3410
3393
  childrenNode.setAttribute('role', 'group');
3411
3394
  childrenNode.hidden = !node.expanded;
3412
- renderSessionTreeNodes(node.children || [], childrenNode, ancestorHasNext.concat(!isLastSibling), itemCounter);
3395
+ renderSessionTreeNodes(node.children || [], childrenNode, ancestorHasNext.concat(!isLastSibling));
3413
3396
  block.appendChild(childrenNode);
3414
3397
  parentNode.appendChild(block);
3415
3398
 
@@ -3505,8 +3488,7 @@
3505
3488
 
3506
3489
  const grouped = groupSessionsByDirectory(state.sessions);
3507
3490
  const treeNodes = buildSessionTreeNodes(grouped);
3508
- const itemCounter = { value: 0 };
3509
- renderSessionTreeNodes(treeNodes, sessionList, [], itemCounter);
3491
+ renderSessionTreeNodes(treeNodes, sessionList, []);
3510
3492
  updateSidebarActiveSelection();
3511
3493
 
3512
3494
  scrollActiveSessionIntoView();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xcanwin/manyoyo",
3
- "version": "6.2.0",
3
+ "version": "6.2.1",
4
4
  "imageVersion": "1.9.1-common",
5
5
  "playwrightCliVersion": "0.1.18",
6
6
  "description": "AI Agent CLI Security Sandbox for Docker and Podman",