|
@@ -244,20 +244,25 @@
|
|
|
<div v-if="message.thinkingContent" class="thinking-panel">
|
|
<div v-if="message.thinkingContent" class="thinking-panel">
|
|
|
<button class="thinking-panel-header" @click="toggleThinkingPanel(message)">
|
|
<button class="thinking-panel-header" @click="toggleThinkingPanel(message)">
|
|
|
<div class="thinking-panel-title">
|
|
<div class="thinking-panel-title">
|
|
|
- <span class="thinking-panel-badge">{{ message.showThinking !== false ? '已思考' : '思考过程' }}</span>
|
|
|
|
|
|
|
+ <span class="thinking-panel-badge">{{ message.thinkingStreaming ? '思考中' : '已思考' }}</span>
|
|
|
<span class="thinking-panel-label">模型思考过程</span>
|
|
<span class="thinking-panel-label">模型思考过程</span>
|
|
|
</div>
|
|
</div>
|
|
|
- <span class="thinking-panel-arrow">{{ message.showThinking !== false ? '收起' : '展开' }}</span>
|
|
|
|
|
|
|
+ <span class="thinking-panel-arrow">{{ message.showThinking !== false ? '折叠' : '展开' }}</span>
|
|
|
</button>
|
|
</button>
|
|
|
- <div v-show="message.showThinking !== false" class="thinking-panel-body">
|
|
|
|
|
- <StreamMarkdown :content="message.thinkingContent" :streaming="false" />
|
|
|
|
|
|
|
+ <div v-show="message.showThinking !== false" class="thinking-panel-body thinking-panel-scrollable">
|
|
|
|
|
+ <StreamMarkdown :content="getDisplayThinkingContent(message.thinkingContent)" :streaming="Boolean(message.thinkingStreaming)" />
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <!-- 问题总结 -->
|
|
|
|
|
- <div v-if="message.summary" class="question-summary">
|
|
|
|
|
- <StreamMarkdown :content="message.summary" :streaming="false" />
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <!-- 简要回答 -->
|
|
|
|
|
+ <div
|
|
|
|
|
+ v-if="message.displayContent && message.displayContent.length > 0 && !message.isDocument"
|
|
|
|
|
+ class="brief-answer-card"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div class="ai-markdown-content">
|
|
|
|
|
+ <div v-html="message.displayContent"></div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
|
|
|
<!-- 报告生成中的Loading动画 - 当还没有报告时显示 -->
|
|
<!-- 报告生成中的Loading动画 - 当还没有报告时显示 -->
|
|
|
<div v-if="message.isTyping && (!message.reports || message.reports.length === 0) && message.progress < 100" class="report-loading">
|
|
<div v-if="message.isTyping && (!message.reports || message.reports.length === 0) && message.progress < 100" class="report-loading">
|
|
@@ -278,19 +283,17 @@
|
|
|
:category="report.category"
|
|
:category="report.category"
|
|
|
:number="report.number"
|
|
:number="report.number"
|
|
|
:count="report.count"
|
|
:count="report.count"
|
|
|
- @toggle="(data) => handleCategoryToggle(index, data)"
|
|
|
|
|
/>
|
|
/>
|
|
|
<!-- 文件报告 -->
|
|
<!-- 文件报告 -->
|
|
|
<FileReportCard
|
|
<FileReportCard
|
|
|
v-else-if="!report.type || report.type !== 'category_title'"
|
|
v-else-if="!report.type || report.type !== 'category_title'"
|
|
|
- v-show="isCategoryExpanded(index, report.metadata?._displayCategory || report.metadata?.primary_category)"
|
|
|
|
|
:report="report"
|
|
:report="report"
|
|
|
@preview-file="handleFilePreview"
|
|
@preview-file="handleFilePreview"
|
|
|
/>
|
|
/>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<!-- 分类下的Loading动画 - 当有分类但还在等待报告时 -->
|
|
<!-- 分类下的Loading动画 - 当有分类但还在等待报告时 -->
|
|
|
- <div v-if="message.isTyping && message.progress < 100 && hasOnlyCategoryTitles(message.reports)" class="report-loading">
|
|
|
|
|
|
|
+ <div v-if="message.isTyping && hasOnlyCategoryTitles(message.reports)" class="report-loading">
|
|
|
<span class="loading-text">AI正在思考中...</span>
|
|
<span class="loading-text">AI正在思考中...</span>
|
|
|
<div class="thinking-animation">
|
|
<div class="thinking-animation">
|
|
|
<span class="dot"></span>
|
|
<span class="dot"></span>
|
|
@@ -298,6 +301,11 @@
|
|
|
<span class="dot"></span>
|
|
<span class="dot"></span>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 查询结果总结 -->
|
|
|
|
|
+ <div v-if="message.summary" class="question-summary result-summary-card">
|
|
|
|
|
+ <StreamMarkdown :content="message.summary" :streaming="false" />
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 网络搜索总结 -->
|
|
<!-- 网络搜索总结 -->
|
|
@@ -341,16 +349,12 @@
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <!-- 原有的AI文本内容(如果没有报告数据时显示) -->
|
|
|
|
|
- <div v-if="!message.reports || message.reports.length === 0" class="ai-text">
|
|
|
|
|
- <div v-if="message.displayContent && message.displayContent.length > 0 && !message.isDocument" class="ai-markdown-content">
|
|
|
|
|
- <div v-html="message.displayContent"></div>
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <!-- 原有的AI文本容器 -->
|
|
|
|
|
+ <div v-if="!message.reports || message.reports.length === 0" class="ai-text"></div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <div v-show="!message.isTyping && ((message.displayContent && message.displayContent.length > 0) || message.summary)" class="divider"></div>
|
|
|
|
|
- <div v-show="!message.isTyping && ((message.displayContent && message.displayContent.length > 0) || message.summary)" class="message-actions">
|
|
|
|
|
|
|
+ <div v-show="!message.isTyping && ((message.displayContent && message.displayContent.length > 0) || message.summary || (message.reports && message.reports.length > 0))" class="divider"></div>
|
|
|
|
|
+ <div v-show="!message.isTyping && ((message.displayContent && message.displayContent.length > 0) || message.summary || (message.reports && message.reports.length > 0))" class="message-actions">
|
|
|
<div class="left-actions">
|
|
<div class="left-actions">
|
|
|
<button class="action-btn copy-btn" @click="copyAIMessage(message)">
|
|
<button class="action-btn copy-btn" @click="copyAIMessage(message)">
|
|
|
<img :src="copyIcon" alt="复制" class="action-icon">
|
|
<img :src="copyIcon" alt="复制" class="action-icon">
|
|
@@ -418,7 +422,7 @@
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 推荐问题Loading -->
|
|
<!-- 推荐问题Loading -->
|
|
|
- <div v-show="!message.isTyping && ((message.displayContent && message.displayContent.length > 0) || message.summary) && isGettingRelatedQuestions && (relatedQuestionsMessageId === message.id || relatedQuestionsMessageId === message.ai_message_id) && aiRelatedQuestions.length === 0" class="related-questions-loading">
|
|
|
|
|
|
|
+ <div v-show="!message.isTyping && ((message.displayContent && message.displayContent.length > 0) || message.summary || (message.reports && message.reports.length > 0)) && isGettingRelatedQuestions && (relatedQuestionsMessageId === message.id || relatedQuestionsMessageId === message.ai_message_id) && aiRelatedQuestions.length === 0" class="related-questions-loading">
|
|
|
<div class="thinking-animation">
|
|
<div class="thinking-animation">
|
|
|
<span class="dot"></span>
|
|
<span class="dot"></span>
|
|
|
<span class="dot"></span>
|
|
<span class="dot"></span>
|
|
@@ -427,7 +431,7 @@
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 提问联想 -->
|
|
<!-- 提问联想 -->
|
|
|
- <div v-show="!message.isTyping && ((message.displayContent && message.displayContent.length > 0) || message.summary) && (relatedQuestionsMessageId === message.id || relatedQuestionsMessageId === message.ai_message_id) && aiRelatedQuestions.length > 0" class="related-questions">
|
|
|
|
|
|
|
+ <div v-show="!message.isTyping && ((message.displayContent && message.displayContent.length > 0) || message.summary || (message.reports && message.reports.length > 0)) && (relatedQuestionsMessageId === message.id || relatedQuestionsMessageId === message.ai_message_id) && aiRelatedQuestions.length > 0" class="related-questions">
|
|
|
<div
|
|
<div
|
|
|
v-for="(question, index) in aiRelatedQuestions"
|
|
v-for="(question, index) in aiRelatedQuestions"
|
|
|
:key="index"
|
|
:key="index"
|
|
@@ -2175,6 +2179,8 @@ const getConversationMessages = async (conversationId) => {
|
|
|
webSearchTotal: message.webSearchRaw?.total || 0,
|
|
webSearchTotal: message.webSearchRaw?.total || 0,
|
|
|
thinkingContent: thinkingContent,
|
|
thinkingContent: thinkingContent,
|
|
|
showThinking: Boolean(thinkingContent),
|
|
showThinking: Boolean(thinkingContent),
|
|
|
|
|
+ thinkingStreaming: false,
|
|
|
|
|
+ answerStreaming: false,
|
|
|
// 状态管理(历史记录默认完成状态)
|
|
// 状态管理(历史记录默认完成状态)
|
|
|
showStats: totalFiles > 0,
|
|
showStats: totalFiles > 0,
|
|
|
currentStatus: 'completed',
|
|
currentStatus: 'completed',
|
|
@@ -3003,11 +3009,11 @@ const updateMessageStatus = (aiMessage, status, customMessage = null) => {
|
|
|
progress: 70
|
|
progress: 70
|
|
|
},
|
|
},
|
|
|
deep_thinking: {
|
|
deep_thinking: {
|
|
|
- message: '🤔 <span class="ai-name">蜀道安全管理AI智能助手</span>正在深度思考中,请您稍等片刻……',
|
|
|
|
|
|
|
+ message: '🤔 <span class="ai-name">蜀道安全管理AI智能助手</span>正在梳理回答思路,请稍等……',
|
|
|
progress: 75
|
|
progress: 75
|
|
|
},
|
|
},
|
|
|
outputting: {
|
|
outputting: {
|
|
|
- message: '😄 <span class="ai-name">蜀道安全管理AI智能助手</span>正在整理分析中!',
|
|
|
|
|
|
|
+ message: '😄 <span class="ai-name">蜀道安全管理AI智能助手</span>正在整理回答内容……',
|
|
|
progress: 90
|
|
progress: 90
|
|
|
},
|
|
},
|
|
|
completed: {
|
|
completed: {
|
|
@@ -3050,23 +3056,79 @@ const updateMessageStatus = (aiMessage, status, customMessage = null) => {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+const THINKING_FALLBACK_TEXT = '正在结合检索结果梳理回答重点,请稍等……'
|
|
|
|
|
+const THINKING_HEADING_REPLACEMENTS = [
|
|
|
|
|
+ [/^\s*\d+\.\s*Analyze the Request:?\s*$/i, '### 问题理解'],
|
|
|
|
|
+ [/^\s*Analyze the Request:?\s*$/i, '### 问题理解'],
|
|
|
|
|
+ [/^\s*\d+\.\s*Response Plan:?\s*$/i, '### 回答组织'],
|
|
|
|
|
+ [/^\s*Response Plan:?\s*$/i, '### 回答组织'],
|
|
|
|
|
+ [/^\s*\d+\.\s*Key Points:?\s*$/i, '### 回答重点'],
|
|
|
|
|
+ [/^\s*Key Points:?\s*$/i, '### 回答重点']
|
|
|
|
|
+]
|
|
|
|
|
+const THINKING_BLOCKLIST_PATTERNS = [
|
|
|
|
|
+ /^\s*Thinking Process:?\s*$/i,
|
|
|
|
|
+ /^\s*[-*•]?\s*Role:\s*/i,
|
|
|
|
|
+ /^\s*[-*•]?\s*Task:\s*/i,
|
|
|
|
|
+ /^\s*[-*•]?\s*Input:\s*/i,
|
|
|
|
|
+ /^\s*[-*•]?\s*Constraints:?\s*$/i,
|
|
|
|
|
+ /^\s*[-*•]?\s*Prioritize knowledge base snippets/i,
|
|
|
|
|
+ /^\s*[-*•]?\s*Do not fabricate information/i,
|
|
|
|
|
+ /^\s*[-*•]?\s*Direct answer, no meta-talk/i,
|
|
|
|
|
+ /^\s*[-*•]?\s*Structure:\s*/i,
|
|
|
|
|
+ /^\s*[-*•]?\s*Tone:\s*/i
|
|
|
|
|
+]
|
|
|
|
|
+
|
|
|
|
|
+const getDisplayThinkingContent = (content) => {
|
|
|
|
|
+ const rawContent = String(content || '')
|
|
|
|
|
+ if (!rawContent.trim()) return ''
|
|
|
|
|
+
|
|
|
|
|
+ const hasMetaBoilerplate = /Thinking Process:|Analyze the Request|Role:|Task:|Input:|Constraints:/i.test(rawContent)
|
|
|
|
|
+ const normalizedLines = rawContent
|
|
|
|
|
+ .split('\n')
|
|
|
|
|
+ .map(line => line.replace(/\r/g, ''))
|
|
|
|
|
+ .map(line => {
|
|
|
|
|
+ const trimmed = line.trim()
|
|
|
|
|
+ if (!trimmed) return ''
|
|
|
|
|
+ for (const [pattern, replacement] of THINKING_HEADING_REPLACEMENTS) {
|
|
|
|
|
+ if (pattern.test(trimmed)) {
|
|
|
|
|
+ return replacement
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return line
|
|
|
|
|
+ })
|
|
|
|
|
+ .filter(line => {
|
|
|
|
|
+ const trimmed = line.trim()
|
|
|
|
|
+ if (!trimmed) return false
|
|
|
|
|
+ return !THINKING_BLOCKLIST_PATTERNS.some(pattern => pattern.test(trimmed))
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ const normalizedContent = normalizedLines.join('\n').trim()
|
|
|
|
|
+ if (normalizedContent) {
|
|
|
|
|
+ return normalizedContent
|
|
|
|
|
+ }
|
|
|
|
|
+ return hasMetaBoilerplate ? THINKING_FALLBACK_TEXT : rawContent.trim()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
const appendThinkingContent = (aiMessage, sectionTitle, content) => {
|
|
const appendThinkingContent = (aiMessage, sectionTitle, content) => {
|
|
|
const normalized = (content || '').trim()
|
|
const normalized = (content || '').trim()
|
|
|
if (!normalized) return
|
|
if (!normalized) return
|
|
|
|
|
|
|
|
- const section = sectionTitle
|
|
|
|
|
- ? `### ${sectionTitle}\n\n${normalized}`
|
|
|
|
|
- : normalized
|
|
|
|
|
-
|
|
|
|
|
if (!aiMessage.thinkingContent) {
|
|
if (!aiMessage.thinkingContent) {
|
|
|
- aiMessage.thinkingContent = section
|
|
|
|
|
- } else if (!aiMessage.thinkingContent.includes(section)) {
|
|
|
|
|
- aiMessage.thinkingContent = `${aiMessage.thinkingContent}\n\n---\n\n${section}`
|
|
|
|
|
|
|
+ aiMessage.thinkingContent = normalized
|
|
|
|
|
+ } else if (!aiMessage.thinkingContent.includes(normalized)) {
|
|
|
|
|
+ aiMessage.thinkingContent = `${aiMessage.thinkingContent}${normalized}`
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
aiMessage.showThinking = true
|
|
aiMessage.showThinking = true
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+const appendThinkingDelta = (aiMessage, chunk) => {
|
|
|
|
|
+ const normalized = chunk || ''
|
|
|
|
|
+ if (!normalized) return
|
|
|
|
|
+ aiMessage.thinkingContent = `${aiMessage.thinkingContent || ''}${normalized}`
|
|
|
|
|
+ aiMessage.showThinking = true
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
const toggleThinkingPanel = (message) => {
|
|
const toggleThinkingPanel = (message) => {
|
|
|
message.showThinking = message.showThinking === false
|
|
message.showThinking = message.showThinking === false
|
|
|
}
|
|
}
|
|
@@ -3128,7 +3190,6 @@ const handleSSEMessage = (data, aiMessageIndex) => {
|
|
|
|
|
|
|
|
case 'intent':
|
|
case 'intent':
|
|
|
aiMessage.isProfessionalQuestion = data.is_professional_question !== false
|
|
aiMessage.isProfessionalQuestion = data.is_professional_question !== false
|
|
|
- appendThinkingContent(aiMessage, '意图分析', data.thinking_content)
|
|
|
|
|
|
|
|
|
|
// 检查是否为专业问题
|
|
// 检查是否为专业问题
|
|
|
if (data.is_professional_question === false) {
|
|
if (data.is_professional_question === false) {
|
|
@@ -3169,7 +3230,67 @@ const handleSSEMessage = (data, aiMessageIndex) => {
|
|
|
}
|
|
}
|
|
|
break
|
|
break
|
|
|
|
|
|
|
|
|
|
+ case 'answer_thinking_start':
|
|
|
|
|
+ aiMessage.thinkingStreaming = true
|
|
|
|
|
+ aiMessage.showThinking = true
|
|
|
|
|
+ if (shouldApplyMessageProgressStatus(aiMessage, 'deep_thinking')) {
|
|
|
|
|
+ updateMessageStatus(aiMessage, 'deep_thinking')
|
|
|
|
|
+ }
|
|
|
|
|
+ break
|
|
|
|
|
+
|
|
|
|
|
+ case 'answer_thinking_delta':
|
|
|
|
|
+ appendThinkingDelta(aiMessage, data.chunk || '')
|
|
|
|
|
+ break
|
|
|
|
|
+
|
|
|
|
|
+ case 'answer_thinking_done':
|
|
|
|
|
+ aiMessage.thinkingStreaming = false
|
|
|
|
|
+ if (!shouldHideStatsForStreamingAnswer(aiMessage) && aiMessage.currentStatus === 'deep_thinking') {
|
|
|
|
|
+ updateMessageStatus(
|
|
|
|
|
+ aiMessage,
|
|
|
|
|
+ 'outputting',
|
|
|
|
|
+ '😄 <span class="ai-name">蜀道安全管理AI智能助手</span>正在整理回答内容……'
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
|
|
+ break
|
|
|
|
|
+
|
|
|
|
|
+ case 'answer_content_start':
|
|
|
|
|
+ if (shouldHideStatsForStreamingAnswer(aiMessage)) {
|
|
|
|
|
+ aiMessage.showStats = false
|
|
|
|
|
+ } else {
|
|
|
|
|
+ updateMessageStatus(aiMessage, 'outputting')
|
|
|
|
|
+ }
|
|
|
|
|
+ if (shouldClearSummaryForOnlineAnswer(aiMessage)) {
|
|
|
|
|
+ aiMessage.summary = ''
|
|
|
|
|
+ aiMessage._fullSummary = ''
|
|
|
|
|
+ }
|
|
|
|
|
+ aiMessage.answerStreaming = true
|
|
|
|
|
+ aiMessage.isTyping = true
|
|
|
|
|
+ if (!aiMessage.content) {
|
|
|
|
|
+ aiMessage.content = ''
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!aiMessage.displayContent) {
|
|
|
|
|
+ aiMessage.displayContent = ''
|
|
|
|
|
+ }
|
|
|
|
|
+ break
|
|
|
|
|
+
|
|
|
|
|
+ case 'answer_content_delta': {
|
|
|
|
|
+ const delta = data.chunk || ''
|
|
|
|
|
+ if (!delta) break
|
|
|
|
|
+ aiMessage.content = `${aiMessage.content || ''}${delta}`
|
|
|
|
|
+ const processedReply = processAIResponse(aiMessage.content)
|
|
|
|
|
+ aiMessage.displayContent = renderMarkdownContent(processedReply)
|
|
|
|
|
+ aiMessage.isTyping = true
|
|
|
|
|
+ break
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ case 'answer_content_done':
|
|
|
|
|
+ aiMessage.answerStreaming = false
|
|
|
|
|
+ aiMessage.isTyping = false
|
|
|
|
|
+ break
|
|
|
|
|
+
|
|
|
case 'online_answer': {
|
|
case 'online_answer': {
|
|
|
|
|
+ aiMessage.answerStreaming = false
|
|
|
|
|
+ aiMessage.thinkingStreaming = false
|
|
|
if (shouldHideStatsForStreamingAnswer(aiMessage)) {
|
|
if (shouldHideStatsForStreamingAnswer(aiMessage)) {
|
|
|
aiMessage.showStats = false
|
|
aiMessage.showStats = false
|
|
|
} else {
|
|
} else {
|
|
@@ -3928,6 +4049,8 @@ const handleReportGeneratorSubmit = async (data) => {
|
|
|
isProfessionalQuestion: null,
|
|
isProfessionalQuestion: null,
|
|
|
thinkingContent: '',
|
|
thinkingContent: '',
|
|
|
showThinking: true,
|
|
showThinking: true,
|
|
|
|
|
+ thinkingStreaming: false,
|
|
|
|
|
+ answerStreaming: false,
|
|
|
totalFiles: 0,
|
|
totalFiles: 0,
|
|
|
webSearchTotal: 0,
|
|
webSearchTotal: 0,
|
|
|
progress: 0,
|
|
progress: 0,
|
|
@@ -6481,13 +6604,32 @@ onActivated(async () => {
|
|
|
width: 100%;
|
|
width: 100%;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ .brief-answer-card,
|
|
|
.question-summary {
|
|
.question-summary {
|
|
|
margin-bottom: 16px;
|
|
margin-bottom: 16px;
|
|
|
|
|
+ padding: 0;
|
|
|
|
|
+ background: transparent;
|
|
|
|
|
+ border: none;
|
|
|
|
|
+ border-radius: 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .response-section-title {
|
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
|
+ color: #111827;
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .question-summary {
|
|
|
font-size: 16px;
|
|
font-size: 16px;
|
|
|
line-height: 1.8;
|
|
line-height: 1.8;
|
|
|
color: #606266;
|
|
color: #606266;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ .result-summary-card {
|
|
|
|
|
+ background: transparent;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
.thinking-panel {
|
|
.thinking-panel {
|
|
|
margin-bottom: 16px;
|
|
margin-bottom: 16px;
|
|
|
background: #f8fafc;
|
|
background: #f8fafc;
|
|
@@ -6545,6 +6687,13 @@ onActivated(async () => {
|
|
|
line-height: 1.8;
|
|
line-height: 1.8;
|
|
|
border-top: 1px solid #eef2f7;
|
|
border-top: 1px solid #eef2f7;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ .thinking-panel-scrollable {
|
|
|
|
|
+ max-height: 240px;
|
|
|
|
|
+ overflow-y: auto;
|
|
|
|
|
+ overscroll-behavior: contain;
|
|
|
|
|
+ scrollbar-gutter: stable;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
.web-search-capsule-outer {
|
|
.web-search-capsule-outer {
|
|
|
margin-bottom: 7px;
|
|
margin-bottom: 7px;
|