@bolloon/bolloon-agent 0.1.20 → 0.1.21

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.
@@ -467,20 +467,13 @@ function renderChannels() {
467
467
  </svg>
468
468
  </button>
469
469
  <button class="channel-delete" title="删除智能体">×</button>
470
- <button class="agent-new-session" title="新建会话">
471
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
472
- <line x1="12" y1="5" x2="12" y2="19"></line>
473
- <line x1="5" y1="12" x2="19" y2="12"></line>
474
- </svg>
475
- </button>
476
470
  </span>
477
471
  `;
478
472
 
479
473
  // 行点击:切换展开;点击名字/图标区域则切到该智能体
480
474
  row.addEventListener('click', (ev) => {
481
- // 如果点在删除/新会话/配置按钮上, 单独处理
475
+ // 如果点在删除/配置按钮上, 单独处理
482
476
  if (ev.target.closest('.channel-delete')
483
- || ev.target.closest('.agent-new-session')
484
477
  || ev.target.closest('.agent-config-btn')) return;
485
478
  if (ev.target.closest('.agent-caret')) {
486
479
  toggleAgentExpand(ch.id, ev);
@@ -495,8 +488,6 @@ function renderChannels() {
495
488
 
496
489
  // 智能体删除
497
490
  row.querySelector('.channel-delete').addEventListener('click', (ev) => deleteChannel(ch.id, ev));
498
- // 新会话按钮
499
- row.querySelector('.agent-new-session').addEventListener('click', (ev) => createNewSessionForChannel(ch.id, ev));
500
491
  // 配置按钮: 打开同一个 modal 编辑已有智能体
501
492
  row.querySelector('.agent-config-btn').addEventListener('click', (ev) => {
502
493
  ev.stopPropagation();
@@ -509,6 +500,32 @@ function renderChannels() {
509
500
  const sessionUl = document.createElement('ul');
510
501
  sessionUl.className = 'session-list';
511
502
  if (isExpanded) {
503
+ // "新建会话" 按钮 — 放在 session 列表最前面, 始终可见
504
+ const newSessLi = document.createElement('li');
505
+ newSessLi.className = 'session-new-item';
506
+ newSessLi.setAttribute('role', 'button');
507
+ newSessLi.setAttribute('tabindex', '0');
508
+ newSessLi.title = '新建会话';
509
+ newSessLi.innerHTML = `
510
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
511
+ <line x1="12" y1="5" x2="12" y2="19"></line>
512
+ <line x1="5" y1="12" x2="19" y2="12"></line>
513
+ </svg>
514
+ <span>新建会话</span>
515
+ `;
516
+ const onNewSession = (ev) => {
517
+ ev.stopPropagation();
518
+ createNewSessionForChannel(ch.id, ev);
519
+ };
520
+ newSessLi.addEventListener('click', onNewSession);
521
+ newSessLi.addEventListener('keydown', (ev) => {
522
+ if (ev.key === 'Enter' || ev.key === ' ') {
523
+ ev.preventDefault();
524
+ onNewSession(ev);
525
+ }
526
+ });
527
+ sessionUl.appendChild(newSessLi);
528
+
512
529
  const sessions = Array.isArray(ch.sessions) ? ch.sessions : [];
513
530
  sessions.forEach(sess => {
514
531
  const sessLi = document.createElement('li');
@@ -576,33 +576,8 @@ body {
576
576
  }
577
577
 
578
578
  .agent-new-session {
579
- width: 22px;
580
- height: 22px;
581
- border-radius: 5px;
582
- background: transparent;
583
- border: none;
584
- color: var(--text-muted);
585
- cursor: pointer;
586
- display: flex;
587
- align-items: center;
588
- justify-content: center;
589
- opacity: 0;
590
- transition: var(--transition);
591
- flex-shrink: 0;
592
- }
593
-
594
- .agent-row:hover .agent-new-session {
595
- opacity: 1;
596
- }
597
-
598
- .agent-new-session:hover {
599
- background: var(--accent);
600
- color: var(--bg);
601
- }
602
-
603
- .agent-new-session svg {
604
- width: 14px;
605
- height: 14px;
579
+ /* 已废弃: 新建会话按钮迁移到 session 列表顶部, 见 .session-new-item */
580
+ display: none;
606
581
  }
607
582
 
608
583
  /* Session list nested under each agent */
@@ -662,6 +637,41 @@ body {
662
637
  font-weight: 500;
663
638
  }
664
639
 
640
+ /* "新建会话" 入口, 固定在 session 列表最前面, 始终可见 */
641
+ .session-new-item {
642
+ display: flex;
643
+ align-items: center;
644
+ gap: 8px;
645
+ padding: 6px 10px;
646
+ margin-bottom: 2px;
647
+ border-radius: 5px;
648
+ cursor: pointer;
649
+ font-size: 12px;
650
+ color: var(--text-secondary);
651
+ background: transparent;
652
+ border: 1px dashed var(--border-light);
653
+ transition: var(--transition);
654
+ user-select: none;
655
+ }
656
+
657
+ .session-new-item:hover {
658
+ background: var(--accent);
659
+ color: var(--bg);
660
+ border-color: var(--accent);
661
+ border-style: solid;
662
+ }
663
+
664
+ .session-new-item:focus-visible {
665
+ outline: 2px solid var(--accent);
666
+ outline-offset: 1px;
667
+ }
668
+
669
+ .session-new-item svg {
670
+ width: 12px;
671
+ height: 12px;
672
+ flex-shrink: 0;
673
+ }
674
+
665
675
  .session-name {
666
676
  flex: 1;
667
677
  font-size: 13px;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bolloon/bolloon-agent",
3
- "version": "0.1.20",
3
+ "version": "0.1.21",
4
4
  "type": "module",
5
5
  "description": "P2P AI Document Agent - 全局安装后执行 `bolloon` 启动产品",
6
6
  "main": "dist/cli.js",
package/src/web/client.js CHANGED
@@ -467,20 +467,13 @@ function renderChannels() {
467
467
  </svg>
468
468
  </button>
469
469
  <button class="channel-delete" title="删除智能体">×</button>
470
- <button class="agent-new-session" title="新建会话">
471
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
472
- <line x1="12" y1="5" x2="12" y2="19"></line>
473
- <line x1="5" y1="12" x2="19" y2="12"></line>
474
- </svg>
475
- </button>
476
470
  </span>
477
471
  `;
478
472
 
479
473
  // 行点击:切换展开;点击名字/图标区域则切到该智能体
480
474
  row.addEventListener('click', (ev) => {
481
- // 如果点在删除/新会话/配置按钮上, 单独处理
475
+ // 如果点在删除/配置按钮上, 单独处理
482
476
  if (ev.target.closest('.channel-delete')
483
- || ev.target.closest('.agent-new-session')
484
477
  || ev.target.closest('.agent-config-btn')) return;
485
478
  if (ev.target.closest('.agent-caret')) {
486
479
  toggleAgentExpand(ch.id, ev);
@@ -495,8 +488,6 @@ function renderChannels() {
495
488
 
496
489
  // 智能体删除
497
490
  row.querySelector('.channel-delete').addEventListener('click', (ev) => deleteChannel(ch.id, ev));
498
- // 新会话按钮
499
- row.querySelector('.agent-new-session').addEventListener('click', (ev) => createNewSessionForChannel(ch.id, ev));
500
491
  // 配置按钮: 打开同一个 modal 编辑已有智能体
501
492
  row.querySelector('.agent-config-btn').addEventListener('click', (ev) => {
502
493
  ev.stopPropagation();
@@ -509,6 +500,32 @@ function renderChannels() {
509
500
  const sessionUl = document.createElement('ul');
510
501
  sessionUl.className = 'session-list';
511
502
  if (isExpanded) {
503
+ // "新建会话" 按钮 — 放在 session 列表最前面, 始终可见
504
+ const newSessLi = document.createElement('li');
505
+ newSessLi.className = 'session-new-item';
506
+ newSessLi.setAttribute('role', 'button');
507
+ newSessLi.setAttribute('tabindex', '0');
508
+ newSessLi.title = '新建会话';
509
+ newSessLi.innerHTML = `
510
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
511
+ <line x1="12" y1="5" x2="12" y2="19"></line>
512
+ <line x1="5" y1="12" x2="19" y2="12"></line>
513
+ </svg>
514
+ <span>新建会话</span>
515
+ `;
516
+ const onNewSession = (ev) => {
517
+ ev.stopPropagation();
518
+ createNewSessionForChannel(ch.id, ev);
519
+ };
520
+ newSessLi.addEventListener('click', onNewSession);
521
+ newSessLi.addEventListener('keydown', (ev) => {
522
+ if (ev.key === 'Enter' || ev.key === ' ') {
523
+ ev.preventDefault();
524
+ onNewSession(ev);
525
+ }
526
+ });
527
+ sessionUl.appendChild(newSessLi);
528
+
512
529
  const sessions = Array.isArray(ch.sessions) ? ch.sessions : [];
513
530
  sessions.forEach(sess => {
514
531
  const sessLi = document.createElement('li');
package/src/web/style.css CHANGED
@@ -576,33 +576,8 @@ body {
576
576
  }
577
577
 
578
578
  .agent-new-session {
579
- width: 22px;
580
- height: 22px;
581
- border-radius: 5px;
582
- background: transparent;
583
- border: none;
584
- color: var(--text-muted);
585
- cursor: pointer;
586
- display: flex;
587
- align-items: center;
588
- justify-content: center;
589
- opacity: 0;
590
- transition: var(--transition);
591
- flex-shrink: 0;
592
- }
593
-
594
- .agent-row:hover .agent-new-session {
595
- opacity: 1;
596
- }
597
-
598
- .agent-new-session:hover {
599
- background: var(--accent);
600
- color: var(--bg);
601
- }
602
-
603
- .agent-new-session svg {
604
- width: 14px;
605
- height: 14px;
579
+ /* 已废弃: 新建会话按钮迁移到 session 列表顶部, 见 .session-new-item */
580
+ display: none;
606
581
  }
607
582
 
608
583
  /* Session list nested under each agent */
@@ -662,6 +637,41 @@ body {
662
637
  font-weight: 500;
663
638
  }
664
639
 
640
+ /* "新建会话" 入口, 固定在 session 列表最前面, 始终可见 */
641
+ .session-new-item {
642
+ display: flex;
643
+ align-items: center;
644
+ gap: 8px;
645
+ padding: 6px 10px;
646
+ margin-bottom: 2px;
647
+ border-radius: 5px;
648
+ cursor: pointer;
649
+ font-size: 12px;
650
+ color: var(--text-secondary);
651
+ background: transparent;
652
+ border: 1px dashed var(--border-light);
653
+ transition: var(--transition);
654
+ user-select: none;
655
+ }
656
+
657
+ .session-new-item:hover {
658
+ background: var(--accent);
659
+ color: var(--bg);
660
+ border-color: var(--accent);
661
+ border-style: solid;
662
+ }
663
+
664
+ .session-new-item:focus-visible {
665
+ outline: 2px solid var(--accent);
666
+ outline-offset: 1px;
667
+ }
668
+
669
+ .session-new-item svg {
670
+ width: 12px;
671
+ height: 12px;
672
+ flex-shrink: 0;
673
+ }
674
+
665
675
  .session-name {
666
676
  flex: 1;
667
677
  font-size: 13px;