From d8cd86361e507f530ee3e32d745fef3ca5bb82f9 Mon Sep 17 00:00:00 2001 From: Roe-xin Date: Sun, 4 Jan 2026 14:10:43 +0800 Subject: [PATCH 01/12] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=BD=93=E5=89=8D=E7=8E=AF=E5=A2=83=E7=9A=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E4=BB=A5=E6=8E=A7=E5=88=B6=E5=BF=AB=E9=80=9F=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=8C=89=E9=92=AE=E7=9A=84=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/webviewContent.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/views/webviewContent.ts b/src/views/webviewContent.ts index 61a0995..47a2633 100644 --- a/src/views/webviewContent.ts +++ b/src/views/webviewContent.ts @@ -18,6 +18,7 @@ import { getMessageAreaScript, } from "./messageArea"; import { getAgentCardStyles, getAgentCardScript } from "./agentCard"; +import { getCurrentEnv } from "../config/settings"; /** * 获取 WebView 面板的 HTML 内容 */ @@ -28,6 +29,10 @@ export function getWebviewContent( syIconUri?: string, maxIconUri?: string ): string { + // 获取当前环境,只在 dev 和 test 环境下显示快速操作按钮 + const currentEnv = getCurrentEnv(); + const showQuickActions = currentEnv === 'dev' || currentEnv === 'test'; + return ` @@ -397,12 +402,12 @@ export function getWebviewContent( 思考中... - + ` : ''} ${getInputAreaContent(autoIconUri, liteIconUri, syIconUri, maxIconUri)} From 8dc34ee435a462336b2dc3d7a8b28dd621c052c7 Mon Sep 17 00:00:00 2001 From: Roe-xin Date: Sun, 4 Jan 2026 16:29:13 +0800 Subject: [PATCH 02/12] =?UTF-8?q?feat:=E8=AE=A9=E7=94=A8=E6=88=B7=E7=9C=8B?= =?UTF-8?q?=E4=B8=8D=E6=87=82=E7=9A=84=E5=B7=A5=E5=85=B7=E9=9A=90=E6=99=A6?= =?UTF-8?q?=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/agentCard.ts | 36 +++++++++++-- src/views/messageArea.ts | 109 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 136 insertions(+), 9 deletions(-) diff --git a/src/views/agentCard.ts b/src/views/agentCard.ts index 2783cd7..7f5ea41 100644 --- a/src/views/agentCard.ts +++ b/src/views/agentCard.ts @@ -96,6 +96,27 @@ export function getAgentCardStyles(): string { padding: 8px; text-align: center; } + /* 低调显示的工具调用样式 */ + .agent-step.low-profile { + opacity: 0.5; + font-size: 10px; + padding: 2px 6px; + background: transparent; + margin-bottom: 2px; + } + .agent-step.low-profile .step-icon { + opacity: 0.4; + font-size: 10px; + } + .agent-step.low-profile .step-name { + font-weight: 300; + color: var(--vscode-descriptionForeground); + opacity: 0.7; + } + .agent-step.low-profile .step-result { + opacity: 0.6; + font-size: 9px; + } `; } @@ -119,8 +140,8 @@ export function getAgentCardScript(): string { 'queryKnowledgeSummary': '查询知识摘要', 'queryRules': '查询规则', 'setModule': '设置模块', - 'addSignal': '添加信号', - 'addSignalExample': '添加信号示例', + 'addSignal': '正在分析信号定义', + 'addSignalExample': '正在处理信号示例', 'validateKnowledgeGraph': '验证知识图谱', 'querySignals': '查询信号', 'addPlan': '添加计划', @@ -147,7 +168,16 @@ export function getAgentCardScript(): string { const icon = step.status === 'completed' ? '✅' : step.status === 'error' ? '❌' : '🔄'; const displayName = getAgentToolDisplayName(step.toolName); const result = step.toolResult ? \`: \${step.toolResult.substring(0, 50)}\${step.toolResult.length > 50 ? '...' : ''}\` : ''; - return \`
\${icon}\${displayName}\${result}
\`; + // 为技术性工具调用添加低调样式(用户看不懂的) + const lowProfileTools = [ + 'knowledge_save', 'knowledge_load', + 'queryKnowledgeSummary', 'queryRules', 'querySignals', + 'setModule', 'addSignal', 'addSignalExample', + 'validateKnowledgeGraph', 'addPlan', 'addEdge', + 'showPlan', 'spawnExplorer' + ]; + const stepClass = lowProfileTools.includes(step.toolName) ? 'agent-step low-profile' : 'agent-step'; + return \`
\${icon}\${displayName}\${result}
\`; }).join(''); segmentDiv.innerHTML = \` diff --git a/src/views/messageArea.ts b/src/views/messageArea.ts index 3dd2a3a..d4d5519 100644 --- a/src/views/messageArea.ts +++ b/src/views/messageArea.ts @@ -373,6 +373,12 @@ export function getMessageAreaStyles(): string { margin: 4px 0; padding: 4px 0; } + /* 低调显示的工具调用 - 移除边距和背景 */ + .segment-tool.low-profile { + margin: 2px 0; + padding: 0; + background: none; + } .tool-segment-header { display: flex; align-items: center; @@ -532,6 +538,23 @@ export function getMessageAreaStyles(): string { .tool-segment-content.collapsed { max-height: 0; } + /* 低调显示的工具调用样式 */ + .segment-tool.low-profile .tool-segment-header { + opacity: 0.65; + font-size: 11px; + } + .segment-tool.low-profile .tool-segment-icon { + opacity: 0.55; + font-size: 11px; + } + .segment-tool.low-profile .tool-segment-name { + font-weight: 300; + opacity: 0.8; + } + .segment-tool.low-profile .tool-segment-result { + opacity: 0.7; + font-size: 10px; + } .segment-question { background: var(--vscode-textBlockQuote-background); border-radius: 6px; @@ -689,8 +712,8 @@ export function getMessageAreaScript(): string { 'queryKnowledgeSummary': '已查询知识摘要', 'queryRules': '已查询规则', 'setModule': '已设置模块', - 'addSignal': '已添加信号', - 'addSignalExample': '已添加信号示例', + 'addSignal': '信号分析完成', + 'addSignalExample': '信号示例处理完成', 'validateKnowledgeGraph': '已验证知识图谱', 'querySignals': '已查询信号', 'addPlan': '已添加计划', @@ -936,8 +959,30 @@ export function getMessageAreaScript(): string { // 清空容器并重新渲染所有段落 currentSegmentedMessage.innerHTML = ''; + // 合并连续相同的工具调用 + const mergedSegments = []; + let i = 0; + while (i < segments.length) { + const segment = segments[i]; + if (segment.type === 'tool') { + // 统计连续相同的工具调用 + let count = 1; + while (i + count < segments.length && + segments[i + count].type === 'tool' && + segments[i + count].toolName === segment.toolName) { + count++; + } + // 添加合并后的段落(带计数) + mergedSegments.push({ ...segment, toolCount: count }); + i += count; + } else { + mergedSegments.push(segment); + i++; + } + } + let toolIndex = 0; // 用于跟踪工具段落的索引 - segments.forEach((segment, index) => { + mergedSegments.forEach((segment, index) => { const segmentDiv = document.createElement('div'); segmentDiv.className = 'message-segment segment-' + segment.type; @@ -949,8 +994,23 @@ export function getMessageAreaScript(): string { if (segment.toolName === 'spawnExplorer') { return; } + + // 为技术性工具调用添加低调样式 + const lowProfileTools = [ + 'knowledge_save', 'knowledge_load', + 'queryKnowledgeSummary', 'queryRules', 'querySignals', + 'setModule', 'addSignal', 'addSignalExample', + 'validateKnowledgeGraph', 'addPlan', 'addEdge', + 'showPlan', 'addRule', 'updateNode', 'addStateTransition' + ]; + if (lowProfileTools.includes(segment.toolName)) { + segmentDiv.className += ' low-profile'; + } + const statusIcon = segment.toolStatus === 'error' ? '❌' : '🔧'; const toolResult = segment.toolResult || ''; + const toolCount = segment.toolCount || 1; + const countSuffix = toolCount > 1 ? \` x\${toolCount}\` : ''; // 检查工具结果是否过长(超过一行显示不下) const shouldCollapse = toolResult && toolResult.length > 60; @@ -964,7 +1024,7 @@ export function getMessageAreaScript(): string { segmentDiv.innerHTML = \`
\${shouldCollapse ? \`\${collapseIconSvg}\` : getToolIcon(segment.toolName)} - \${getToolDisplayName(segment.toolName) || '工具'} + \${getToolDisplayName(segment.toolName) || '工具'}\${countSuffix} \${toolResult && !shouldCollapse ? \`\${toolResult}\` : ''}
\${shouldCollapse ? \`
\${toolResult}
\` : ''} @@ -1162,7 +1222,29 @@ export function getMessageAreaScript(): string { const container = document.createElement('div'); container.className = 'message bot-message segmented-message'; - segments.forEach((segment, index) => { + // 合并连续相同的工具调用 + const mergedSegments = []; + let i = 0; + while (i < segments.length) { + const segment = segments[i]; + if (segment.type === 'tool') { + // 统计连续相同的工具调用 + let count = 1; + while (i + count < segments.length && + segments[i + count].type === 'tool' && + segments[i + count].toolName === segment.toolName) { + count++; + } + // 添加合并后的段落(带计数) + mergedSegments.push({ ...segment, toolCount: count }); + i += count; + } else { + mergedSegments.push(segment); + i++; + } + } + + mergedSegments.forEach((segment, index) => { const segmentDiv = document.createElement('div'); segmentDiv.className = 'message-segment segment-' + segment.type; @@ -1174,8 +1256,23 @@ export function getMessageAreaScript(): string { if (segment.toolName === 'spawnExplorer') { return; } + + // 为技术性工具调用添加低调样式 + const lowProfileTools = [ + 'knowledge_save', 'knowledge_load', + 'queryKnowledgeSummary', 'queryRules', 'querySignals', + 'setModule', 'addSignal', 'addSignalExample', + 'validateKnowledgeGraph', 'addPlan', 'addEdge', + 'showPlan', 'addRule', 'updateNode', 'addStateTransition' + ]; + if (lowProfileTools.includes(segment.toolName)) { + segmentDiv.className += ' low-profile'; + } + const statusIcon = segment.toolStatus === 'error' ? '❌' : '🔧'; const toolResult = segment.toolResult || ''; + const toolCount = segment.toolCount || 1; + const countSuffix = toolCount > 1 ? \` x\${toolCount}\` : ''; // 检查工具结果是否过长(超过一行显示不下) const shouldCollapse = toolResult && toolResult.length > 60; @@ -1183,7 +1280,7 @@ export function getMessageAreaScript(): string { segmentDiv.innerHTML = \`
\${shouldCollapse ? \`\${collapseIconSvg}\` : getToolIcon(segment.toolName)} - \${getToolDisplayName(segment.toolName) || '工具'} + \${getToolDisplayName(segment.toolName) || '工具'}\${countSuffix} \${toolResult && !shouldCollapse ? \`\${toolResult}\` : ''}
\${shouldCollapse ? \`\` : ''} From de3e84aa4e2b966a7fe7667785fc059f2b3cd92a Mon Sep 17 00:00:00 2001 From: Roe-xin Date: Mon, 5 Jan 2026 11:27:06 +0800 Subject: [PATCH 03/12] =?UTF-8?q?feat:=E9=A1=B6=E9=83=A8=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=BF=9B=E5=BA=A6=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/progressBar.ts | 304 ++++++++++++++++++++++++++++++++++++ src/views/webviewContent.ts | 8 + 2 files changed, 312 insertions(+) create mode 100644 src/views/progressBar.ts diff --git a/src/views/progressBar.ts b/src/views/progressBar.ts new file mode 100644 index 0000000..de4aad9 --- /dev/null +++ b/src/views/progressBar.ts @@ -0,0 +1,304 @@ +/** + * 进度条模块 + * + * 功能说明: + * - 显示开发流程进度: Spec -> Design代码编写 -> 仿真检查 -> AST -> Done + * - 支持动态更新当前进度状态 + * - 提供视觉反馈显示已完成和进行中的步骤 + */ + +/** + * 获取进度条的 HTML 内容 + */ +export function getProgressBarContent(): string { + return ` +
+
+
+
+ 1 + +
+
Spec设计文档
+
+ +
+ +
+
+ 2 + +
+
Design代码编写
+
+ +
+ +
+
+ 3 + +
+
Sim仿真检查
+
+ +
+ +
+
+ 4 + +
+
Done完成
+
+
+
+ `; +} + +/** + * 获取进度条的样式 + */ +export function getProgressBarStyles(): string { + return ` + .progress-bar-container { + padding: 10px 20px; + background: var(--vscode-editor-background); + border-bottom: 1px solid var(--vscode-panel-border); + margin-bottom: 5px; + } + + .progress-steps { + display: flex; + align-items: center; + justify-content: space-between; + max-width: 700px; + margin: 0 auto; + } + + .progress-step { + display: flex; + flex-direction: column; + align-items: center; + position: relative; + flex: 0 0 auto; + } + + .step-circle { + width: 24px; + height: 24px; + border-radius: 50%; + background: var(--vscode-input-background); + border: 2px solid var(--vscode-input-border); + display: flex; + align-items: center; + justify-content: center; + position: relative; + transition: all 0.3s ease; + z-index: 2; + } + + .step-number { + font-size: 10px; + font-weight: 600; + color: var(--vscode-foreground); + } + + .step-check { + display: none; + font-size: 12px; + color: var(--vscode-button-foreground); + } + + .step-label { + margin-top: 4px; + font-size: 10px; + color: var(--vscode-descriptionForeground); + text-align: center; + white-space: nowrap; + transition: color 0.3s ease; + } + + .progress-line { + flex: 1; + height: 2px; + background: var(--vscode-input-border); + margin: 0 6px; + position: relative; + top: -10px; + transition: background 0.3s ease; + } + + /* 已完成状态 */ + .progress-step.completed .step-circle { + background: var(--vscode-button-background); + border-color: var(--vscode-button-background); + } + + .progress-step.completed .step-number { + display: none; + } + + .progress-step.completed .step-check { + display: block; + } + + .progress-step.completed .step-label { + color: var(--vscode-foreground); + font-weight: 500; + } + + .progress-step.completed + .progress-line { + background: var(--vscode-button-background); + } + + /* 进行中状态 */ + .progress-step.active .step-circle { + background: var(--vscode-button-background); + border-color: var(--vscode-button-background); + box-shadow: 0 0 0 2px var(--vscode-button-background)33; + animation: pulse 2s infinite; + } + + .progress-step.active .step-number { + color: var(--vscode-button-foreground); + } + + .progress-step.active .step-label { + color: var(--vscode-foreground); + font-weight: 600; + } + + @keyframes pulse { + 0%, 100% { + box-shadow: 0 0 0 2px var(--vscode-button-background)33; + } + 50% { + box-shadow: 0 0 0 4px var(--vscode-button-background)1a; + } + } + + /* 响应式设计 */ + @media (max-width: 768px) { + .progress-steps { + flex-wrap: wrap; + } + + .step-label { + font-size: 9px; + } + + .step-circle { + width: 20px; + height: 20px; + } + + .step-number { + font-size: 9px; + } + + .progress-line { + margin: 0 4px; + } + } + `; +} + +/** + * 获取进度条的脚本 + */ +export function getProgressBarScript(): string { + return ` + // 进度条管理 + const ProgressBar = { + steps: ['spec', 'design', 'simulation', 'done'], + currentStep: 'spec', + + /** + * 初始化进度条 + */ + init() { + this.updateProgress('spec'); + }, + + /** + * 更新进度到指定步骤 + * @param {string} stepName - 步骤名称 + */ + updateProgress(stepName) { + if (!this.steps.includes(stepName)) { + console.warn('Invalid step name:', stepName); + return; + } + + this.currentStep = stepName; + const currentIndex = this.steps.indexOf(stepName); + + // 更新所有步骤的状态 + document.querySelectorAll('.progress-step').forEach((step, index) => { + step.classList.remove('completed', 'active'); + + if (index < currentIndex) { + step.classList.add('completed'); + } else if (index === currentIndex) { + step.classList.add('active'); + } + }); + + // 更新连接线 + document.querySelectorAll('.progress-line').forEach((line, index) => { + if (index < currentIndex) { + line.style.background = 'var(--vscode-button-background)'; + } else { + line.style.background = 'var(--vscode-input-border)'; + } + }); + }, + + /** + * 前进到下一步 + */ + nextStep() { + const currentIndex = this.steps.indexOf(this.currentStep); + if (currentIndex < this.steps.length - 1) { + this.updateProgress(this.steps[currentIndex + 1]); + } + }, + + /** + * 重置进度条 + */ + reset() { + this.updateProgress('spec'); + }, + + /** + * 完成所有步骤 + */ + complete() { + this.updateProgress('done'); + // 将最后一步也标记为完成 + const lastStep = document.querySelector('.progress-step[data-step="done"]'); + if (lastStep) { + lastStep.classList.remove('active'); + lastStep.classList.add('completed'); + } + } + }; + + // 初始化进度条 + ProgressBar.init(); + + // 监听来自扩展的消息以更新进度 + window.addEventListener('message', (event) => { + const message = event.data; + if (message.type === 'updateProgress') { + ProgressBar.updateProgress(message.step); + } else if (message.type === 'resetProgress') { + ProgressBar.reset(); + } else if (message.type === 'completeProgress') { + ProgressBar.complete(); + } + }); + `; +} diff --git a/src/views/webviewContent.ts b/src/views/webviewContent.ts index 47a2633..e3f9eeb 100644 --- a/src/views/webviewContent.ts +++ b/src/views/webviewContent.ts @@ -18,6 +18,11 @@ import { getMessageAreaScript, } from "./messageArea"; import { getAgentCardStyles, getAgentCardScript } from "./agentCard"; +import { + getProgressBarContent, + getProgressBarStyles, + getProgressBarScript, +} from "./progressBar"; import { getCurrentEnv } from "../config/settings"; /** * 获取 WebView 面板的 HTML 内容 @@ -80,6 +85,7 @@ export function getWebviewContent( ${getAgentCardStyles()} ${getWaveformPreviewContent()} ${getConversationHistoryBarStyles()} + ${getProgressBarStyles()} ${getInputAreaStyles()} .file-editor-section { @@ -385,6 +391,7 @@ export function getWebviewContent( ${getConversationHistoryBarContent()} + ${getProgressBarContent()}
IC Coder @@ -701,6 +708,7 @@ export function getWebviewContent( ${getAgentCardScript()} ${getWaveformPreviewScript()} ${getConversationHistoryBarScript()} + ${getProgressBarScript()} ${getInputAreaScript()} `; From 27e3351b55f8474d58c3ebf533b18ed73240830a Mon Sep 17 00:00:00 2001 From: Roe-xin Date: Mon, 5 Jan 2026 15:18:03 +0800 Subject: [PATCH 04/12] =?UTF-8?q?feat:=E8=BE=93=E5=85=A5=E6=A1=86=E5=B1=85?= =?UTF-8?q?=E4=B8=AD=E5=B1=95=E7=A4=BA=20-=20=E7=82=B9=E5=87=BB=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E8=AE=B0=E5=BD=95=E5=92=8C=E5=8F=91=E8=B5=B7=E5=AF=B9?= =?UTF-8?q?=E8=AF=9D=E4=B9=8B=E5=90=8E=E5=9B=9E=E5=88=B0=E5=BA=95=E9=83=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/inputArea.ts | 63 ++++++++++++++++++++++++++++++++++++- src/views/webviewContent.ts | 12 +++++++ 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/src/views/inputArea.ts b/src/views/inputArea.ts index 37e1ea0..5c90150 100644 --- a/src/views/inputArea.ts +++ b/src/views/inputArea.ts @@ -36,7 +36,7 @@ export function getInputAreaContent( maxIcon: string = '' ): string { return ` -
+
@@ -82,6 +82,23 @@ export function getInputAreaStyles(): string { border-top: 1px solid var(--vscode-panel-border); padding-top: 15px; flex-shrink: 0; + transition: all 0.3s ease; + } + /* 居中模式:未发起对话时 */ + .input-area.centered { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: calc(100% - 40px); + max-width: 800px; + border-top: none; + padding-top: 0; + } + /* 底部模式:发起对话后 */ + .input-area.bottom { + position: relative; + transform: none; } .input-group { display: flex; @@ -269,11 +286,28 @@ export function getInputAreaScript(): string { // 对话状态管理 let isConversationActive = false; + let hasMessages = false; // 是否已有消息 // 工作区检测状态 let hasCheckedWorkspace = false; // 是否已经检测过工作区 let hasWorkspace = true; // 工作区状态 + // 切换输入框布局模式 + function updateInputAreaLayout() { + const inputArea = document.getElementById('inputArea'); + if (!inputArea) return; + + if (hasMessages) { + // 有消息时,移到底部 + inputArea.classList.remove('centered'); + inputArea.classList.add('bottom'); + } else { + // 无消息时,居中显示 + inputArea.classList.add('centered'); + inputArea.classList.remove('bottom'); + } + } + // 自动调整 textarea 高度 function autoResizeTextarea() { if (messageInput) { @@ -359,6 +393,10 @@ export function getInputAreaScript(): string { addMessage(text, 'user'); + // 标记已有消息,切换布局到底部 + hasMessages = true; + updateInputAreaLayout(); + // 切换按钮为暂停状态 setSendButtonState(true); @@ -370,5 +408,28 @@ export function getInputAreaScript(): string { // 重置优化状态 resetOptimizeButton(); } + + // 全局函数:重置输入框布局(用于清空对话时) + window.resetInputAreaLayout = function() { + hasMessages = false; + updateInputAreaLayout(); + }; + + // 全局函数:检查是否有消息(用于页面加载时) + window.checkMessagesAndUpdateLayout = function() { + const messagesContainer = document.getElementById('messages'); + if (messagesContainer) { + const messageElements = messagesContainer.querySelectorAll('.message'); + hasMessages = messageElements.length > 0; + updateInputAreaLayout(); + } + }; + + // 页面加载时检查消息状态 + setTimeout(() => { + if (window.checkMessagesAndUpdateLayout) { + window.checkMessagesAndUpdateLayout(); + } + }, 100); `; } diff --git a/src/views/webviewContent.ts b/src/views/webviewContent.ts index e3f9eeb..3c37bb9 100644 --- a/src/views/webviewContent.ts +++ b/src/views/webviewContent.ts @@ -662,6 +662,10 @@ export function getWebviewContent( if (messagesContainer) { messagesContainer.innerHTML = ''; } + // 重置输入框布局到居中 + if (typeof window.resetInputAreaLayout === 'function') { + window.resetInputAreaLayout(); + } break; case 'addUserMessage': @@ -669,6 +673,10 @@ export function getWebviewContent( if (message.text) { addMessage(message.text, 'user'); } + // 检查并更新输入框布局 + if (typeof window.checkMessagesAndUpdateLayout === 'function') { + window.checkMessagesAndUpdateLayout(); + } break; case 'addAiMessage': @@ -676,6 +684,10 @@ export function getWebviewContent( if (message.text) { addMessage(message.text, 'bot'); } + // 检查并更新输入框布局 + if (typeof window.checkMessagesAndUpdateLayout === 'function') { + window.checkMessagesAndUpdateLayout(); + } break; case 'switchMode': From 9b0d2d5e010dedff52bd8f8ada63d73e9a496687 Mon Sep 17 00:00:00 2001 From: Roe-xin Date: Mon, 5 Jan 2026 15:27:40 +0800 Subject: [PATCH 05/12] =?UTF-8?q?feat:=E8=BF=9B=E5=BA=A6=E6=9D=A1=E6=94=B6?= =?UTF-8?q?=E8=B5=B7=E7=9A=84=E5=8A=9F=E8=83=BD=E5=92=8C=E5=8F=91=E8=B5=B7?= =?UTF-8?q?=E5=AF=B9=E8=AF=9D=E6=89=8D=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/panels/ICHelperPanel.ts | 3 + src/views/progressBar.ts | 111 +++++++++++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 2 deletions(-) diff --git a/src/panels/ICHelperPanel.ts b/src/panels/ICHelperPanel.ts index 107f301..11c57a7 100644 --- a/src/panels/ICHelperPanel.ts +++ b/src/panels/ICHelperPanel.ts @@ -141,6 +141,9 @@ export async function showICHelperPanel( // 切换到当前面板的任务上下文 historyManager.switchToPanelTask(panelId); + // 显示进度条 + panel.webview.postMessage({ type: 'showProgress' }); + handleUserMessage( panel, message.text, diff --git a/src/views/progressBar.ts b/src/views/progressBar.ts index de4aad9..2646761 100644 --- a/src/views/progressBar.ts +++ b/src/views/progressBar.ts @@ -12,7 +12,13 @@ */ export function getProgressBarContent(): string { return ` -
+