mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-08-14 15:10:20 +02:00
优化项目对话、刷新续流、实时滚动与工具状态恢复 (#245)
* feat(chat): add project-based conversation sidebar * feat(chat): refine Codex-style conversation UI * feat(chat): add Codex-style conversation workflow * feat(ui): 优化对话框与项目侧边栏交互 * fix(chat): 修复暗色输入框圆角填色 * fix(chat): 恢复输入区分层错位布局 * fix(hitl): isolate reviewer state per conversation * feat(hitl): 增加双入口审批与倒计时进度 * fix(hitl): 汇总项目审批并隔离对话状态 * fix(ui): 修复审批状态与无项目新任务 * fix(ui): 优化审批状态与对话切换性能 * fix(ui): 修复中断任务审批仍计时 * fix(ui): 修复多对话并发切换卡顿 * fix(hitl): 主动同步审批并关闭中断状态 * fix(ui): 固定项目审批汇总为绿色 * feat(ui): 同步系统模型与推理强度 * feat(ui): 完善项目侧栏预览与新建入口 * fix(ui): 防止无项目文件夹误展开 * fix(ui): 防止长历史对话滚动误触审批 * fix(ui): 修复对话操作并补充项目置顶 * fix(ui): 移除对话分组并调整项目置顶排序 * feat(ui): 优化迭代导航与审批交互 * fix(hitl): 将 write_file 加入内置免审批工具 * fix(chat): 支持回车发送与 Shift 回车换行 * fix(chat): 优化对话刷新与 Codex 风格交互 * fix(ui): 显示对话具体更新时间 * fix(ui): 优化对话刷新与项目加载 * fix(ui): 修复 Agent 审查文字裁切 * fix(chat): 修复刷新续流与多标签页同步 * fix(chat): 修复滚动跟随与中断任务终态 * fix(ui): 修复流式滚动跳动与工具状态恢复 * fix(ui): 修复刷新后流式输出停止粘底
This commit is contained in:
+155
-51
@@ -23,10 +23,18 @@
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
<link rel="stylesheet" href="/static/css/style.css?v=20260720-2">
|
||||
<script>
|
||||
(function () {
|
||||
var initialPage = String(window.location.hash || '').replace(/^#/, '').split('?')[0];
|
||||
if (initialPage && initialPage !== 'dashboard') {
|
||||
document.documentElement.classList.add('initial-route-pending');
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
<link rel="stylesheet" href="/static/css/style.css?v=20260813-5">
|
||||
<link rel="stylesheet" href="/static/css/c2.css">
|
||||
<link rel="stylesheet" href="/static/vendor/xterm.css">
|
||||
<script src="/static/js/router.js"></script>
|
||||
<script src="/static/js/router.js?v=20260813-2"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="login-overlay" class="login-overlay" style="display: none;">
|
||||
@@ -889,10 +897,10 @@
|
||||
<div class="chat-page-layout">
|
||||
<!-- 历史对话侧边栏(可折叠,与主导航侧边栏类似) -->
|
||||
<aside class="conversation-sidebar" id="conversation-sidebar">
|
||||
<!-- 头部一行:折叠与「新对话」并排,避免绝对定位重叠(flex 为最佳实践) -->
|
||||
<!-- 头部一行:折叠与「新任务」并排;任务底层复用会话数据 -->
|
||||
<div class="sidebar-header conversation-sidebar-header">
|
||||
<button type="button" class="new-chat-btn" data-require-permission="chat:write" onclick="startNewConversation()">
|
||||
<span>+</span> <span data-i18n="chat.newChat">新对话</span>
|
||||
<span>+</span> <span data-i18n="chat.newTask">新任务</span>
|
||||
</button>
|
||||
<button type="button" class="conversation-sidebar-collapse-btn" onclick="toggleConversationSidebar()" data-i18n="chat.toggleConversationPanel" data-i18n-attr="title" data-i18n-skip-text="true" title="折叠/展开对话列表" aria-label="折叠/展开对话列表">
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
||||
@@ -901,13 +909,13 @@
|
||||
</button>
|
||||
</div>
|
||||
<div class="sidebar-content">
|
||||
<!-- 全局搜索 -->
|
||||
<!-- 项目搜索 -->
|
||||
<div class="conversation-search-box">
|
||||
<input type="text" id="conversation-search-input" data-i18n="chat.searchHistory" data-i18n-attr="placeholder" placeholder="搜索历史记录..."
|
||||
oninput="handleConversationSearch(this.value)"
|
||||
onkeypress="if(event.key === 'Enter') handleConversationSearch(this.value)" />
|
||||
<input type="text" id="conversation-search-input" data-i18n="projects.searchProjectsPlaceholder" data-i18n-attr="placeholder" placeholder="搜索项目…"
|
||||
oninput="handleProjectFolderSearch(this.value)"
|
||||
onkeypress="if(event.key === 'Enter') handleProjectFolderSearch(this.value)" />
|
||||
<button class="conversation-search-clear" id="conversation-search-clear"
|
||||
onclick="clearConversationSearch()" style="display: none;" data-i18n="common.clearSearch" data-i18n-attr="title" title="清除搜索">
|
||||
onclick="clearProjectFolderSearch()" style="display: none;" data-i18n="common.clearSearch" data-i18n-attr="title" title="清除搜索">
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
||||
<circle cx="8" cy="8" r="7" fill="currentColor" fill-opacity="0.2"/>
|
||||
<path d="M5.25 5.25l5.5 5.5M10.75 5.25l-5.5 5.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
|
||||
@@ -915,8 +923,21 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- 项目文件夹:复用对话底部项目选择器的真实项目数据 -->
|
||||
<section class="project-folders-section" aria-labelledby="project-folders-title">
|
||||
<div class="section-header project-folders-header">
|
||||
<span id="project-folders-title" class="section-title" data-i18n="chat.projectFolders">项目</span>
|
||||
<button type="button" class="add-group-btn project-folders-add-btn" data-require-permission="project:write" onclick="showNewProjectModalFromChatSidebar()" data-i18n="projects.newProject" data-i18n-attr="title,aria-label" data-i18n-skip-text="true" title="新建项目" aria-label="新建项目">
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
||||
<path d="M12 5v14M5 12h14" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div id="project-folders-list" class="project-folders-list"></div>
|
||||
</section>
|
||||
|
||||
<!-- 按项目筛选对话 -->
|
||||
<div class="conversation-project-filter">
|
||||
<div class="conversation-project-filter" hidden>
|
||||
<label class="conversation-project-filter-label" for="conversation-project-filter" data-i18n="chat.filterByProject">按项目筛选</label>
|
||||
<select id="conversation-project-filter" class="conversation-project-filter-native" onchange="onConversationProjectFilterChange(this.value)" data-i18n="chat.filterByProject" data-i18n-attr="title" title="按项目筛选">
|
||||
<option value="" data-i18n="chat.filterAllProjects">全部项目</option>
|
||||
@@ -924,24 +945,17 @@
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- 对话分组 -->
|
||||
<div class="conversation-groups-section">
|
||||
<div class="section-header">
|
||||
<span class="section-title" data-i18n="chat.conversationGroups">对话分组</span>
|
||||
<button class="add-group-btn" data-require-permission="group:write" onclick="showCreateGroupModal()" data-i18n="chat.addGroup" data-i18n-attr="title" data-i18n-skip-text="true" title="新建分组">
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M12 5v14M5 12h14" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div id="conversation-groups-list" class="conversation-groups-list"></div>
|
||||
</div>
|
||||
|
||||
<!-- 最近对话 -->
|
||||
<div class="recent-conversations-section">
|
||||
<div class="section-header">
|
||||
<div class="recent-conversations-section is-collapsed" id="recent-conversations-section">
|
||||
<button type="button" class="section-header recent-conversations-toggle" id="recent-conversations-toggle" onclick="toggleRecentConversations()" aria-expanded="false" aria-controls="recent-conversations-body" data-i18n="chat.toggleRecentConversations" data-i18n-attr="title,aria-label" data-i18n-skip-text="true" title="展开/折叠最近对话" aria-label="展开/折叠最近对话">
|
||||
<span class="section-title" data-i18n="chat.recentConversations">最近对话</span>
|
||||
<div class="section-header-actions">
|
||||
<span class="recent-conversations-toggle-meta">
|
||||
<span id="recent-conversations-count" class="recent-conversations-count">0</span>
|
||||
<svg class="recent-conversations-chevron" width="16" height="16" viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M9 18l6-6-6-6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
</span>
|
||||
</button>
|
||||
<div id="recent-conversations-body" class="recent-conversations-body" hidden>
|
||||
<div class="section-header-actions recent-conversations-actions">
|
||||
<div class="conversation-sort-dropdown" id="conversation-sort-dropdown">
|
||||
<button type="button" class="conversation-sort-btn" id="conversation-sort-btn" onclick="toggleConversationSortMenu(event)" aria-haspopup="menu" aria-expanded="false" aria-controls="conversation-sort-menu" data-i18n="chat.sortConversations" data-i18n-attr="title" data-i18n-skip-text="true" title="排序">
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
||||
@@ -984,8 +998,8 @@
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div id="conversations-list" class="conversations-list"></div>
|
||||
</div>
|
||||
<div id="conversations-list" class="conversations-list"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="conversations-pagination" class="sidebar-list-pagination conversation-sidebar-pagination"></div>
|
||||
@@ -1068,10 +1082,20 @@
|
||||
<input type="hidden" id="hitl-reviewer-select" value="human" />
|
||||
<p class="hitl-config-hint" data-i18n="chat.hitlReviewerHint">可在人工与审计 Agent 之间随时切换;规则与白名单不变。人机协同为「关闭」时也可预先选择。</p>
|
||||
</div>
|
||||
<div class="hitl-config-field" id="hitl-timeout-field">
|
||||
<label class="hitl-config-label" for="hitl-timeout-select" data-i18n="chat.hitlTimeoutLabel">审批等待时限</label>
|
||||
<select id="hitl-timeout-select" class="hitl-config-select">
|
||||
<option value="60" data-i18n="chat.hitlTimeoutOneMinute">1 分钟</option>
|
||||
<option value="300" selected data-i18n="chat.hitlTimeoutFiveMinutes">5 分钟</option>
|
||||
<option value="600" data-i18n="chat.hitlTimeoutTenMinutes">10 分钟</option>
|
||||
<option value="0" data-i18n="chat.hitlTimeoutUnlimited">不限制</option>
|
||||
</select>
|
||||
<p class="hitl-config-hint" data-i18n="chat.hitlTimeoutHint">到期未处理将自动拒绝;审批卡片会显示倒计时。</p>
|
||||
</div>
|
||||
<div class="hitl-config-field hitl-config-field--tools">
|
||||
<label class="hitl-config-label" for="hitl-sensitive-tools" data-i18n="chat.hitlWhitelistTools">白名单工具(免审批,逗号分隔)</label>
|
||||
<textarea id="hitl-sensitive-tools" class="hitl-config-textarea" rows="3" spellcheck="false" autocomplete="off" data-i18n="chat.hitlWhitelistPlaceholder" data-i18n-attr="placeholder" placeholder=""></textarea>
|
||||
<p class="hitl-config-hint" data-i18n="chat.hitlWhitelistHint">每行一个或逗号分隔;与 config 中全局白名单合并展示。</p>
|
||||
<textarea id="hitl-sensitive-tools" class="hitl-config-textarea" rows="6" spellcheck="false" autocomplete="off" data-i18n="chat.hitlWhitelistPlaceholder" data-i18n-attr="placeholder" placeholder=""></textarea>
|
||||
<p class="hitl-config-hint" data-i18n="chat.hitlWhitelistHint">每行一个或逗号分隔;与 config 中全局白名单合并生效。</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1140,13 +1164,32 @@
|
||||
</div>
|
||||
<div id="active-tasks-bar" class="active-tasks-bar"></div>
|
||||
<div id="chat-messages" class="chat-messages"></div>
|
||||
<button type="button" id="chat-scroll-to-bottom" class="chat-scroll-to-bottom" aria-label="回到底部" title="回到底部">↓ 回到底部</button>
|
||||
<nav id="chat-turn-rail" class="chat-turn-rail" aria-label="对话轮次导航" hidden>
|
||||
<div id="chat-turn-rail-markers" class="chat-turn-rail-markers"></div>
|
||||
</nav>
|
||||
<div id="chat-turn-rail-preview" class="chat-turn-rail-preview" role="tooltip" hidden>
|
||||
<div id="chat-turn-rail-preview-title" class="chat-turn-rail-preview-title"></div>
|
||||
<div id="chat-turn-rail-preview-summary" class="chat-turn-rail-preview-summary"></div>
|
||||
</div>
|
||||
<button type="button" id="chat-return-latest" class="chat-return-latest" hidden
|
||||
data-i18n="chat.returnToLatest" data-i18n-attr="title,aria-label" data-i18n-skip-text="true"
|
||||
title="回到最新消息" aria-label="回到最新消息">
|
||||
<span class="chat-return-latest-dots" aria-hidden="true">
|
||||
<span class="chat-return-latest-dot"></span>
|
||||
<span class="chat-return-latest-dot"></span>
|
||||
<span class="chat-return-latest-dot"></span>
|
||||
</span>
|
||||
</button>
|
||||
<div id="chat-input-container" class="chat-input-container">
|
||||
<div class="chat-input-primary-row">
|
||||
<div class="chat-composer-context" aria-label="当前会话上下文">
|
||||
<div class="chat-input-leading">
|
||||
<div class="role-selector-wrapper project-selector-wrapper">
|
||||
<button type="button" id="chat-project-btn" class="role-selector-btn" onclick="toggleChatProjectPanel()" aria-label="选择项目" aria-haspopup="listbox" aria-expanded="false" title="绑定项目后共享事实黑板(跨对话)" data-i18n="projects.chatSelectorButton" data-i18n-attr="aria-label,title">
|
||||
<span class="role-selector-icon" aria-hidden="true">📁</span>
|
||||
<span class="role-selector-icon" aria-hidden="true">
|
||||
<svg width="19" height="19" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M3.5 6.5A2.5 2.5 0 0 1 6 4h4l2 2h6A2.5 2.5 0 0 1 20.5 8.5v8A2.5 2.5 0 0 1 18 19H6a2.5 2.5 0 0 1-2.5-2.5v-10z" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
</span>
|
||||
<span id="chat-project-text" class="role-selector-text" data-i18n="projects.noProject">无项目</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"/>
|
||||
@@ -1253,6 +1296,9 @@
|
||||
<input type="hidden" id="agent-mode-select" value="eino_single" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<section id="chat-hitl-approval-dock" class="chat-hitl-approval-dock" aria-label="待审批操作" aria-live="polite" hidden></section>
|
||||
<div class="chat-input-primary-row chat-composer-surface">
|
||||
<div class="chat-input-with-files">
|
||||
<div id="chat-file-list" class="chat-file-list" aria-label="已选文件列表"></div>
|
||||
<div id="chat-attachment-progress" class="chat-upload-progress-row" hidden role="status" aria-live="polite">
|
||||
@@ -1260,22 +1306,76 @@
|
||||
<span class="chat-upload-progress-label" id="chat-attachment-progress-label"></span>
|
||||
</div>
|
||||
<div class="chat-input-field">
|
||||
<textarea id="chat-input" data-i18n="chat.inputPlaceholder" data-i18n-attr="placeholder" data-i18n-skip-text="true" placeholder="输入测试目标或命令... (输入 @ 选择工具 | Shift+Enter 换行,Enter 发送)" rows="1"></textarea>
|
||||
<textarea id="chat-input" data-i18n="chat.inputPlaceholder" data-i18n-attr="placeholder" data-i18n-skip-text="true" placeholder="输入测试目标或命令… @ 选择工具" rows="1"></textarea>
|
||||
<div id="mention-suggestions" class="mention-suggestions" role="listbox" aria-label="工具提及候选"></div>
|
||||
</div>
|
||||
</div>
|
||||
<input type="file" id="chat-file-input" class="chat-file-input-hidden" multiple accept="*" data-i18n="chat.selectFile" data-i18n-attr="title" title="选择文件">
|
||||
<button type="button" class="chat-upload-btn" onclick="document.getElementById('chat-file-input').click()" data-i18n="chat.uploadFile" data-i18n-attr="title" title="上传文件(可多选或拖拽到此处)">
|
||||
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M17 8l-5-5-5 5M12 3v12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
</button>
|
||||
<button type="button" class="send-btn" id="chat-send-btn" data-require-permission="chat:write" onclick="sendMessage()">
|
||||
<span data-i18n="chat.send">发送</span>
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
||||
<path d="M5 12h14M12 5l7 7-7 7" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
</button>
|
||||
<div class="chat-composer-footer">
|
||||
<div class="chat-composer-footer-leading">
|
||||
<input type="file" id="chat-file-input" class="chat-file-input-hidden" multiple accept="*" data-i18n="chat.selectFile" data-i18n-attr="title" title="选择文件">
|
||||
<button type="button" class="chat-upload-btn" onclick="document.getElementById('chat-file-input').click()" data-i18n="chat.uploadFile" data-i18n-attr="title,aria-label" data-i18n-skip-text="true" title="上传文件(可多选或拖拽到此处)" aria-label="上传文件(可多选或拖拽到此处)">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
||||
<path d="M12 5v14M5 12h14" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
|
||||
</svg>
|
||||
</button>
|
||||
<button type="button" id="chat-hitl-shortcut" class="chat-session-shortcut chat-hitl-shortcut" onclick="openChatSessionSettings('hitl', event)" data-i18n="chat.sessionSettingsAria" data-i18n-attr="aria-label,title" data-i18n-skip-text="true" aria-label="打开会话设置" title="打开会话设置">
|
||||
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
||||
<path d="M12 3l7 3v5c0 4.6-2.8 8.2-7 10-4.2-1.8-7-5.4-7-10V6l7-3z" stroke="currentColor" stroke-width="1.65" stroke-linejoin="round"/>
|
||||
<path d="M9.5 12l1.7 1.7 3.5-3.7" stroke="currentColor" stroke-width="1.65" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
<span id="chat-hitl-shortcut-text">Agent 审查:关闭</span>
|
||||
<svg class="chat-session-shortcut-chevron" width="12" height="12" viewBox="0 0 24 24" fill="none" aria-hidden="true">
|
||||
<path d="M6 9l6 6 6-6" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div class="chat-composer-footer-trailing">
|
||||
<div id="chat-model-shortcut-wrap" class="chat-model-shortcut-wrap">
|
||||
<button type="button" id="chat-model-shortcut" class="chat-session-shortcut chat-session-meta" onclick="openChatSystemModelPicker(event)" data-i18n="chat.modelSettingsAria" data-i18n-attr="aria-label,title" data-i18n-skip-text="true" aria-label="选择模型与推理强度" title="选择模型与推理强度" aria-haspopup="dialog" aria-expanded="false" aria-controls="chat-system-model-menu">
|
||||
<span id="chat-model-shortcut-text">默认通道</span>
|
||||
<span id="chat-model-shortcut-effort" class="chat-model-shortcut-effort">不指定</span>
|
||||
<svg class="chat-system-model-caret" width="12" height="12" viewBox="0 0 24 24" fill="none" aria-hidden="true">
|
||||
<path d="M6 9l6 6 6-6" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
</button>
|
||||
<div id="chat-system-model-menu" class="chat-system-model-menu" role="dialog" aria-label="模型与推理强度" hidden>
|
||||
<div id="chat-system-model-main" class="chat-system-model-main">
|
||||
<button type="button" class="chat-system-model-setting-row" onclick="openChatSystemModelView('model', event)">
|
||||
<span class="chat-system-model-setting-label" data-i18n="chat.systemModelField">模型</span>
|
||||
<span class="chat-system-model-setting-value">
|
||||
<span id="chat-system-model-current-value">默认通道</span>
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M9 6l6 6-6 6" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
</span>
|
||||
</button>
|
||||
<button type="button" class="chat-system-model-setting-row" onclick="openChatSystemModelView('effort', event)">
|
||||
<span class="chat-system-model-setting-label" data-i18n="chat.reasoningEffortLabel">推理强度</span>
|
||||
<span class="chat-system-model-setting-value">
|
||||
<span id="chat-system-model-effort-value">不指定</span>
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M9 6l6 6-6 6" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
</span>
|
||||
</button>
|
||||
<span id="chat-system-model-status" class="chat-system-model-status chat-system-model-status-live" aria-live="polite"></span>
|
||||
</div>
|
||||
<div id="chat-system-model-subview" class="chat-system-model-subview" hidden>
|
||||
<div class="chat-system-model-menu-header">
|
||||
<button type="button" class="chat-system-model-back" onclick="openChatSystemModelView('main', event)" aria-label="返回">
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M15 18l-6-6 6-6" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
</button>
|
||||
<strong id="chat-system-model-subview-title">模型</strong>
|
||||
<span id="chat-system-model-subview-status" class="chat-system-model-status"></span>
|
||||
</div>
|
||||
<div id="chat-system-model-list" class="chat-system-model-list" role="listbox" aria-label="选项列表"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button type="button" class="send-btn" id="chat-send-btn" data-require-permission="chat:write" onclick="sendMessage()" data-i18n="chat.send" data-i18n-attr="aria-label,title" data-i18n-skip-text="true" aria-label="发送" title="发送">
|
||||
<span class="send-btn-label" data-i18n="chat.send">发送</span>
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
||||
<path d="M12 19V5M6.5 10.5L12 5l5.5 5.5" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -5999,6 +6099,9 @@
|
||||
<div id="projects-list-menu-edit" class="context-menu-item" data-require-permission="project:write" onclick="editProjectFromListMenu()">
|
||||
<span id="projects-list-menu-edit-text"></span>
|
||||
</div>
|
||||
<div id="projects-list-menu-pin" class="context-menu-item" data-require-permission="project:write" onclick="toggleProjectPinnedFromListMenu()">
|
||||
<span id="projects-list-menu-pin-text"></span>
|
||||
</div>
|
||||
<div id="projects-list-menu-archive" class="context-menu-item" data-require-permission="project:write" onclick="toggleProjectArchiveFromListMenu()">
|
||||
<span id="projects-list-menu-archive-text"></span>
|
||||
</div>
|
||||
@@ -6524,6 +6627,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="fact-modal" class="modal-overlay projects-modal-overlay" style="display:none;" role="dialog" aria-modal="true" onclick="if(event.target===this)closeFactModal()">
|
||||
<div class="projects-modal-dialog projects-modal-dialog--wide" onclick="event.stopPropagation()">
|
||||
<div class="projects-modal-header">
|
||||
@@ -6707,17 +6811,17 @@
|
||||
<script src="/static/js/i18n.js"></script>
|
||||
<script src="/static/js/theme.js"></script>
|
||||
<script src="/static/js/builtin-tools.js"></script>
|
||||
<script src="/static/js/auth.js"></script>
|
||||
<script src="/static/js/auth.js?v=20260813-1"></script>
|
||||
<script src="/static/js/modal.js"></script>
|
||||
<script src="/static/js/notifications.js"></script>
|
||||
<script src="/static/js/info-collect.js?v=20260717-1"></script>
|
||||
<script src="/static/js/assets.js?v=20260717-7"></script>
|
||||
<script src="/static/js/agents.js"></script>
|
||||
<script src="/static/js/dashboard.js"></script>
|
||||
<script src="/static/js/chat-scroll.js"></script>
|
||||
<script src="/static/js/monitor.js?v=20260723-1"></script>
|
||||
<script src="/static/js/chat.js?v=20260724-1"></script>
|
||||
<script src="/static/js/hitl.js"></script>
|
||||
<script src="/static/js/chat-scroll.js?v=20260813-6"></script>
|
||||
<script src="/static/js/monitor.js?v=20260813-9"></script>
|
||||
<script src="/static/js/chat.js?v=20260813-3"></script>
|
||||
<script src="/static/js/hitl.js?v=20260811-4"></script>
|
||||
<script src="/static/js/settings.js?v=20260717-1"></script>
|
||||
<script src="/static/js/audit-datetime-picker.js"></script>
|
||||
<script src="/static/js/audit.js"></script>
|
||||
@@ -6728,7 +6832,7 @@
|
||||
<script src="/static/js/knowledge.js"></script>
|
||||
<script src="/static/js/skills.js"></script>
|
||||
<script src="/static/js/fact-graph.js"></script>
|
||||
<script src="/static/js/projects.js?v=20260717-1"></script>
|
||||
<script src="/static/js/projects.js?v=20260812-6"></script>
|
||||
<script src="/static/js/vulnerability.js?v=14"></script>
|
||||
<script src="/static/js/webshell.js"></script>
|
||||
<script src="/static/js/chat-files.js"></script>
|
||||
|
||||
Reference in New Issue
Block a user