@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.
- package/dist/web/client.js +27 -10
- package/dist/web/style.css +37 -27
- package/package.json +1 -1
- package/src/web/client.js +27 -10
- package/src/web/style.css +37 -27
package/dist/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/dist/web/style.css
CHANGED
|
@@ -576,33 +576,8 @@ body {
|
|
|
576
576
|
}
|
|
577
577
|
|
|
578
578
|
.agent-new-session {
|
|
579
|
-
|
|
580
|
-
|
|
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
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
|
-
|
|
580
|
-
|
|
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;
|