Add files via upload

This commit is contained in:
公明
2026-05-12 14:57:04 +08:00
committed by GitHub
parent 1e7a3299a5
commit 89d1c5124f
3 changed files with 174 additions and 124 deletions
+108 -54
View File
@@ -536,6 +536,10 @@ body {
display: none;
}
.conversation-sidebar.collapsed .conversation-reasoning-card {
display: none;
}
.conversation-sidebar.collapsed .conversation-sidebar-header {
flex-direction: column;
align-items: center;
@@ -1136,13 +1140,13 @@ header {
.hitl-sidebar-card {
border-top: 1px solid var(--border-color);
background: linear-gradient(165deg, #f8fafc 0%, #f1f5f9 55%, #eef2f7 100%);
padding: 14px 12px 16px;
padding: 11px 12px;
flex-shrink: 0;
}
.hitl-sidebar-card-header {
display: flex;
align-items: flex-start;
align-items: center;
justify-content: space-between;
gap: 10px;
cursor: pointer;
@@ -1160,7 +1164,7 @@ header {
overflow: hidden;
max-height: 500px;
opacity: 1;
margin-top: 10px;
margin-top: 8px;
transition: max-height 0.3s ease, opacity 0.2s ease, margin-top 0.3s ease;
}
@@ -1176,19 +1180,19 @@ header {
.hitl-sidebar-heading {
display: flex;
align-items: flex-start;
gap: 10px;
align-items: center;
gap: 8px;
min-width: 0;
}
.hitl-sidebar-icon {
flex-shrink: 0;
width: 36px;
height: 36px;
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 10px;
border-radius: 9px;
background: linear-gradient(145deg, rgba(0, 102, 255, 0.12), rgba(0, 102, 255, 0.06));
color: var(--accent-color);
border: 1px solid rgba(0, 102, 255, 0.18);
@@ -1197,27 +1201,27 @@ header {
.hitl-sidebar-heading-text {
display: flex;
flex-direction: column;
gap: 2px;
gap: 1px;
min-width: 0;
}
.hitl-sidebar-title {
font-size: 15px;
font-size: 14px;
font-weight: 700;
letter-spacing: -0.02em;
color: var(--text-primary);
line-height: 1.25;
line-height: 1.2;
}
.hitl-sidebar-subtitle {
font-size: 11px;
font-weight: 500;
color: var(--text-secondary);
line-height: 1.3;
line-height: 1.25;
}
.hitl-apply-btn {
padding: 8px 14px;
padding: 6px 12px;
border-radius: 10px;
font-size: 12px;
font-weight: 600;
@@ -2409,64 +2413,114 @@ header {
flex-shrink: 0;
}
/* Eino:模型推理收进浮层,保持主输入行简洁 */
.chat-reasoning-wrapper {
/* Eino:模型推理在对话列表侧栏底部,默认折叠 */
.conversation-sidebar .chat-reasoning-wrapper {
width: 100%;
box-sizing: border-box;
flex-shrink: 0;
}
.chat-reasoning-inner {
position: relative;
}
.chat-reasoning-btn {
max-width: 10.5rem;
padding-left: 0.5rem;
padding-right: 0.45rem;
}
.chat-reasoning-btn .chat-reasoning-btn-icon {
.conversation-reasoning-card {
border-top: 1px solid var(--border-color);
background: linear-gradient(165deg, #f8fafc 0%, #f1f5f9 55%, #eef2f7 100%);
padding: 11px 12px;
flex-shrink: 0;
font-size: 0.95rem;
line-height: 1;
opacity: 0.95;
}
.chat-reasoning-btn.active .chat-reasoning-btn-icon {
opacity: 1;
.conversation-reasoning-card-header {
display: flex;
align-items: center;
justify-content: flex-start;
gap: 0;
width: 100%;
padding: 0;
margin: 0;
border: none;
background: transparent;
cursor: pointer;
text-align: left;
font: inherit;
color: inherit;
-webkit-appearance: none;
appearance: none;
border-radius: 0;
}
.chat-reasoning-btn .chat-reasoning-btn-summary {
max-width: 7.6rem;
.conversation-reasoning-card-header:hover .conversation-reasoning-title {
color: var(--accent-color);
}
.conversation-reasoning-heading {
display: flex;
align-items: center;
gap: 8px;
min-width: 0;
flex: 1;
}
.conversation-reasoning-icon {
flex-shrink: 0;
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 9px;
background: linear-gradient(145deg, rgba(0, 102, 255, 0.12), rgba(0, 102, 255, 0.06));
color: var(--accent-color);
border: 1px solid rgba(0, 102, 255, 0.18);
}
.conversation-reasoning-icon svg {
display: block;
}
.conversation-reasoning-heading-text {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 1px;
}
.conversation-reasoning-title {
font-size: 14px;
font-weight: 700;
letter-spacing: -0.02em;
color: var(--text-primary);
line-height: 1.2;
}
.conversation-reasoning-summary {
font-size: 11px;
font-weight: 500;
color: var(--text-secondary);
line-height: 1.25;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.chat-reasoning-btn.active {
border-color: rgba(49, 130, 206, 0.45);
background: rgba(49, 130, 206, 0.06);
.conversation-reasoning-body {
overflow: hidden;
max-height: 280px;
opacity: 1;
margin-top: 8px;
padding-bottom: 0;
transition: max-height 0.3s ease, opacity 0.2s ease, margin-top 0.3s ease;
}
.chat-reasoning-panel {
position: absolute;
bottom: calc(100% + 8px);
left: 0;
width: 288px;
max-width: calc(100vw - 32px);
background: #ffffff;
border: 1px solid rgba(0, 0, 0, 0.08);
border-radius: 16px;
padding: 12px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12), 0 4px 16px rgba(0, 0, 0, 0.08), 0 0 0 1px rgba(0, 0, 0, 0.04);
z-index: 1000;
display: flex;
flex-direction: column;
gap: 10px;
text-align: left;
.conversation-reasoning-card.conversation-reasoning-collapsed .conversation-reasoning-body {
max-height: 0;
opacity: 0;
margin-top: 0;
padding-bottom: 0;
pointer-events: none;
}
.chat-reasoning-panel-header {
margin-bottom: 0;
.conversation-reasoning-body .chat-reasoning-panel-hint {
margin-top: 0;
margin-bottom: 8px;
}
.chat-reasoning-panel-hint {
+25 -26
View File
@@ -534,34 +534,32 @@ function updateChatReasoningSummary() {
}
function closeChatReasoningPanel() {
const panel = document.getElementById('chat-reasoning-panel');
const btn = document.getElementById('chat-reasoning-btn');
if (panel) panel.style.display = 'none';
if (btn) {
btn.classList.remove('active');
btn.setAttribute('aria-expanded', 'false');
const wrap = document.getElementById('chat-reasoning-wrapper');
const toggle = document.getElementById('conversation-reasoning-toggle');
if (wrap) wrap.classList.add('conversation-reasoning-collapsed');
if (toggle) toggle.setAttribute('aria-expanded', 'false');
}
function toggleConversationReasoningCard() {
const wrap = document.getElementById('chat-reasoning-wrapper');
const toggle = document.getElementById('conversation-reasoning-toggle');
if (!wrap || !toggle) return;
wrap.classList.toggle('conversation-reasoning-collapsed');
const collapsed = wrap.classList.contains('conversation-reasoning-collapsed');
toggle.setAttribute('aria-expanded', collapsed ? 'false' : 'true');
if (!collapsed) {
if (typeof closeAgentModePanel === 'function') {
closeAgentModePanel();
}
if (typeof closeRoleSelectionPanel === 'function') {
closeRoleSelectionPanel();
}
updateChatReasoningSummary();
}
}
function toggleChatReasoningPanel() {
const panel = document.getElementById('chat-reasoning-panel');
const btn = document.getElementById('chat-reasoning-btn');
if (!panel || !btn) return;
const isOpen = panel.style.display === 'flex';
if (isOpen) {
closeChatReasoningPanel();
return;
}
if (typeof closeAgentModePanel === 'function') {
closeAgentModePanel();
}
if (typeof closeRoleSelectionPanel === 'function') {
closeRoleSelectionPanel();
}
updateChatReasoningSummary();
panel.style.display = 'flex';
btn.classList.add('active');
btn.setAttribute('aria-expanded', 'true');
toggleConversationReasoningCard();
}
function restoreChatReasoningControlsFromStorage() {
@@ -619,6 +617,7 @@ if (typeof window !== 'undefined') {
window.buildReasoningRequestPayload = buildReasoningRequestPayload;
window.closeChatReasoningPanel = closeChatReasoningPanel;
window.toggleChatReasoningPanel = toggleChatReasoningPanel;
window.toggleConversationReasoningCard = toggleConversationReasoningCard;
window.updateChatReasoningSummary = updateChatReasoningSummary;
}
@@ -7377,8 +7376,8 @@ document.addEventListener('click', function(event) {
}
const reasoningWrap = document.getElementById('chat-reasoning-wrapper');
const reasoningPanel = document.getElementById('chat-reasoning-panel');
if (reasoningWrap && reasoningPanel && reasoningPanel.style.display === 'flex') {
if (reasoningWrap && reasoningWrap.style.display !== 'none' &&
!reasoningWrap.classList.contains('conversation-reasoning-collapsed')) {
if (!reasoningWrap.contains(event.target)) {
closeChatReasoningPanel();
}
+41 -44
View File
@@ -792,11 +792,51 @@
<div id="conversations-list" class="conversations-list"></div>
</div>
</div>
<div id="chat-reasoning-wrapper" class="chat-reasoning-wrapper conversation-reasoning-card conversation-reasoning-collapsed" style="display: none;">
<button type="button" id="conversation-reasoning-toggle" class="conversation-reasoning-card-header" onclick="toggleConversationReasoningCard()" aria-expanded="false" aria-controls="conversation-reasoning-body" data-i18n="chat.reasoningCompactAria" data-i18n-attr="aria-label,title" data-i18n-skip-text="true" aria-label="模型推理选项" title="模型推理选项">
<div class="conversation-reasoning-heading">
<span class="conversation-reasoning-icon" aria-hidden="true">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="11" cy="11" r="7" stroke="currentColor" stroke-width="1.75"/>
<path d="M16 16l5 5" stroke="currentColor" stroke-width="1.75" stroke-linecap="round"/>
</svg>
</span>
<div class="conversation-reasoning-heading-text">
<span class="conversation-reasoning-title" data-i18n="chat.reasoningPanelTitle">模型推理</span>
<span id="chat-reasoning-summary" class="conversation-reasoning-summary"></span>
</div>
</div>
</button>
<div id="conversation-reasoning-body" class="conversation-reasoning-body" role="region">
<p class="chat-reasoning-panel-hint" data-i18n="chat.reasoningPanelHint">仅 Eino 请求生效,与系统设置中的默认值合并。</p>
<div class="chat-reasoning-fields">
<div class="chat-reasoning-field">
<label class="chat-reasoning-field-label" for="chat-reasoning-mode"><span data-i18n="chat.reasoningModeLabel">模式</span></label>
<select id="chat-reasoning-mode" class="chat-reasoning-select" onchange="persistChatReasoningPrefs()">
<option value="default" data-i18n="chat.reasoningModeDefault">跟随系统</option>
<option value="off" data-i18n="chat.reasoningModeOff">关闭</option>
<option value="on" data-i18n="chat.reasoningModeOn">开启</option>
<option value="auto" data-i18n="chat.reasoningModeAuto">自动</option>
</select>
</div>
<div class="chat-reasoning-field">
<label class="chat-reasoning-field-label" for="chat-reasoning-effort"><span data-i18n="chat.reasoningEffortLabel">推理强度</span></label>
<select id="chat-reasoning-effort" class="chat-reasoning-select" onchange="persistChatReasoningPrefs()">
<option value="" data-i18n="chat.reasoningEffortUnset">不指定</option>
<option value="low">low</option>
<option value="medium">medium</option>
<option value="high">high</option>
<option value="max">max</option>
</select>
</div>
</div>
</div>
</div>
<div class="hitl-sidebar-card hitl-sidebar-collapsed" id="hitl-sidebar-card">
<div class="hitl-sidebar-card-header" onclick="toggleHitlSidebarCard()">
<div class="hitl-sidebar-heading">
<span class="hitl-sidebar-icon" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2L4 5v6.09c0 5.05 3.41 9.76 8 10.91 4.59-1.15 8-5.86 8-10.91V5l-8-3z" stroke="currentColor" stroke-width="1.75" stroke-linejoin="round"/>
<path d="M9.5 12.5l2 2 3-4" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
@@ -981,49 +1021,6 @@
</div>
<input type="hidden" id="agent-mode-select" value="react" autocomplete="off">
</div>
<div id="chat-reasoning-wrapper" class="chat-reasoning-wrapper" style="display: none;">
<div class="chat-reasoning-inner">
<button type="button" id="chat-reasoning-btn" class="role-selector-btn chat-reasoning-btn" onclick="toggleChatReasoningPanel()" aria-expanded="false" aria-haspopup="dialog" aria-controls="chat-reasoning-panel" data-i18n="chat.reasoningCompactAria" data-i18n-attr="aria-label,title" data-i18n-skip-text="true" aria-label="模型推理选项" title="模型推理选项">
<span class="chat-reasoning-btn-icon" aria-hidden="true">🔎</span>
<span id="chat-reasoning-summary" class="role-selector-text chat-reasoning-btn-summary"></span>
<svg class="role-selector-arrow" width="10" height="10" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<path d="M6 9l6 6 6-6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<div id="chat-reasoning-panel" class="chat-reasoning-panel" style="display: none;" role="dialog" aria-labelledby="chat-reasoning-panel-title">
<div class="role-selection-panel-header chat-reasoning-panel-header">
<h3 id="chat-reasoning-panel-title" class="role-selection-panel-title" data-i18n="chat.reasoningPanelTitle">模型推理</h3>
<button type="button" class="role-selection-panel-close" onclick="closeChatReasoningPanel()" data-i18n="common.close" data-i18n-attr="title" title="关闭">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18 6L6 18M6 6l12 12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
<p class="chat-reasoning-panel-hint" data-i18n="chat.reasoningPanelHint">仅 Eino 请求生效,与系统设置中的默认值合并。</p>
<div class="chat-reasoning-fields">
<div class="chat-reasoning-field">
<label class="chat-reasoning-field-label" for="chat-reasoning-mode"><span data-i18n="chat.reasoningModeLabel">模式</span></label>
<select id="chat-reasoning-mode" class="chat-reasoning-select" onchange="persistChatReasoningPrefs()">
<option value="default" data-i18n="chat.reasoningModeDefault">跟随系统</option>
<option value="off" data-i18n="chat.reasoningModeOff">关闭</option>
<option value="on" data-i18n="chat.reasoningModeOn">开启</option>
<option value="auto" data-i18n="chat.reasoningModeAuto">自动</option>
</select>
</div>
<div class="chat-reasoning-field">
<label class="chat-reasoning-field-label" for="chat-reasoning-effort"><span data-i18n="chat.reasoningEffortLabel">推理强度</span></label>
<select id="chat-reasoning-effort" class="chat-reasoning-select" onchange="persistChatReasoningPrefs()">
<option value="" data-i18n="chat.reasoningEffortUnset">不指定</option>
<option value="low">low</option>
<option value="medium">medium</option>
<option value="high">high</option>
<option value="max">max</option>
</select>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="chat-input-with-files">
<div id="chat-file-list" class="chat-file-list" aria-label="已选文件列表"></div>