From 5a9f5e343242a9ae0f03757f6e2f9521ab2e20dc Mon Sep 17 00:00:00 2001 From: yiliang114 <1204183885@qq.com> Date: Thu, 20 Nov 2025 23:14:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(vscode-ide-companion):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=96=B0=E5=BB=BA=E4=BC=9A=E8=AF=9D=E6=8C=89=E9=92=AE=EF=BC=8C?= =?UTF-8?q?=E5=9C=A8=E5=90=8C=E4=B8=80=20view=20column=20=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E6=96=B0=20tab?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: - 之前的实现会复用现有 panel 并清空当前会话 - 期望行为是在同一 view column(不创建分屏)中创建新的 VS Code tab 解决方案: 1. 修改 qwenCode.openNewChatTab 命令 - 总是创建新的 WebviewProvider 和 WebviewPanel - PanelManager 的 findExistingQwenCodeViewColumn() 确保在同一 column 打开 2. 修改 MessageHandler 中的 openNewChatTab 处理 - 调用 VS Code 命令创建新 panel/tab 3. 移除不再需要的 createNewSession 方法 效果: - 点击新建会话按钮会在同一 view column 中创建新的 VS Code tab - 类似 Claude Code 的交互方式 - 不会创建新的分屏 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../src/WebViewProvider.ts | 14 +++++++ .../vscode-ide-companion/src/extension.ts | 15 ++------ .../vscode-ide-companion/src/webview/App.scss | 6 +-- .../vscode-ide-companion/src/webview/App.tsx | 26 +++++-------- .../src/webview/MessageHandler.ts | 4 +- .../src/webview/PanelManager.ts | 37 +++++++++++++++++-- .../src/webview/WebViewContent.ts | 2 +- .../src/webview/components/EmptyState.css | 4 +- .../src/webview/components/EmptyState.tsx | 12 +++--- 9 files changed, 73 insertions(+), 47 deletions(-) diff --git a/packages/vscode-ide-companion/src/WebViewProvider.ts b/packages/vscode-ide-companion/src/WebViewProvider.ts index fc12de65..b73b3f73 100644 --- a/packages/vscode-ide-companion/src/WebViewProvider.ts +++ b/packages/vscode-ide-companion/src/WebViewProvider.ts @@ -364,6 +364,20 @@ export class WebViewProvider { // Register dispose handler this.panelManager.registerDisposeHandler(this.disposables); + // Listen for active editor changes and notify WebView + const editorChangeDisposable = vscode.window.onDidChangeActiveTextEditor( + (editor) => { + const fileName = editor?.document.uri.fsPath + ? getFileName(editor.document.uri.fsPath) + : null; + this.sendMessageToWebView({ + type: 'activeEditorChanged', + data: { fileName }, + }); + }, + ); + this.disposables.push(editorChangeDisposable); + // Capture the tab reference on restore this.panelManager.captureTab(); diff --git a/packages/vscode-ide-companion/src/extension.ts b/packages/vscode-ide-companion/src/extension.ts index f8501c22..1c03ca60 100644 --- a/packages/vscode-ide-companion/src/extension.ts +++ b/packages/vscode-ide-companion/src/extension.ts @@ -189,17 +189,10 @@ export async function activate(context: vscode.ExtensionContext) { } }), vscode.commands.registerCommand('qwenCode.openNewChatTab', () => { - // Check if there's already an open chat panel - if (webViewProviders.length > 0) { - const lastProvider = webViewProviders[webViewProviders.length - 1]; - // Reveal the existing panel and create a new session within it - lastProvider.show(); - lastProvider.createNewSession(); - } else { - // Create first chat tab - const provider = createWebViewProvider(); - provider.show(); - } + // Always create a new WebviewPanel (tab) in the same view column + // The PanelManager will find existing Qwen Code tabs and open in the same column + const provider = createWebViewProvider(); + provider.show(); }), vscode.commands.registerCommand('qwenCode.clearAuthCache', async () => { await authStateManager.clearAuthState(); diff --git a/packages/vscode-ide-companion/src/webview/App.scss b/packages/vscode-ide-companion/src/webview/App.scss index f2f3b0e3..c40b2821 100644 --- a/packages/vscode-ide-companion/src/webview/App.scss +++ b/packages/vscode-ide-companion/src/webview/App.scss @@ -430,8 +430,6 @@ button { =========================== */ .input-form { display: flex; - /* gap: var(--app-spacing-medium); */ - /* padding: 16px; */ background-color: var(--app-primary-background); border-top: 1px solid var(--app-primary-border-color); } @@ -626,8 +624,6 @@ button { color: var(--app-input-foreground); display: flex; flex-direction: column; - // max-width: 680px; - // margin: 0 auto; position: relative; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); transition: border-color 0.2s ease, box-shadow 0.2s ease; @@ -644,7 +640,7 @@ button { .input-form:focus-within { border-color: var(--app-qwen-orange); - box-shadow: 0 0 0 1px var(--app-qwen-orange), 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 2px color-mix(in srgb,var(--app-qwen-orange),transparent 80%); } /* Banner area - for warnings/messages */ diff --git a/packages/vscode-ide-companion/src/webview/App.tsx b/packages/vscode-ide-companion/src/webview/App.tsx index 5db5e86e..094dc3a7 100644 --- a/packages/vscode-ide-companion/src/webview/App.tsx +++ b/packages/vscode-ide-companion/src/webview/App.tsx @@ -612,15 +612,9 @@ export const App: React.FC = () => { }; const handleNewQwenSession = () => { - vscode.postMessage({ type: 'newQwenSession', data: {} }); + // Send message to open a new chat tab + vscode.postMessage({ type: 'openNewChatTab', data: {} }); setShowSessionSelector(false); - setCurrentSessionId(null); - setCurrentSessionTitle('Past Conversations'); // Reset title to default - // Clear messages in UI - setMessages([]); - setCurrentStreamContent(''); - setPlanEntries([]); // Clear plan entries - setToolCalls(new Map()); // Clear tool calls }; // Time ago formatter (matching Claude Code) @@ -1053,6 +1047,14 @@ export const App: React.FC = () => { {getEditModeInfo().icon} {getEditModeInfo().text} + {activeFileName && ( + + {activeFileName} + + )}
- {activeFileName && ( - - {activeFileName} - - )}