From 95b67bbebd88726cfb36118b0aa7d34144652f2f Mon Sep 17 00:00:00 2001 From: yiliang114 <1204183885@qq.com> Date: Thu, 20 Nov 2025 23:07:56 +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=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E6=96=B0=E5=88=86=E5=B1=8F=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: - 点击新建会话按钮时,会在 VS Code 中创建一个新的 webview panel(分屏) - 期望行为是在同一个 panel 内创建新会话,类似 Claude Code 的交互方式 解决方案: 1. 修改 extension.ts 中的 openNewChatTab 命令 - 检查是否已有 webview panel 打开 - 如果有,则在现有 panel 中创建新会话 - 如果没有,才创建新 panel 2. 在 WebViewProvider 中添加 createNewSession 方法 - 通过 agentManager 创建新会话 - 清空当前对话 UI 3. 修改 MessageHandler 中的 openNewChatTab 处理 - 直接调用 handleNewQwenSession 创建新会话 - 不再执行 VS Code 命令创建新 panel 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../src/WebViewProvider.ts | 26 +++++++++ .../vscode-ide-companion/src/extension.ts | 56 ++++++++++++++----- .../src/webview/MessageHandler.ts | 5 ++ 3 files changed, 73 insertions(+), 14 deletions(-) diff --git a/packages/vscode-ide-companion/src/WebViewProvider.ts b/packages/vscode-ide-companion/src/WebViewProvider.ts index f7b81c20..fc12de65 100644 --- a/packages/vscode-ide-companion/src/WebViewProvider.ts +++ b/packages/vscode-ide-companion/src/WebViewProvider.ts @@ -426,6 +426,32 @@ export class WebViewProvider { } } + /** + * Create a new session in the current panel + * This is called when the user clicks the "New Session" button + */ + async createNewSession(): Promise { + console.log('[WebViewProvider] Creating new session in current panel'); + try { + const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; + const workingDir = workspaceFolder?.uri.fsPath || process.cwd(); + + // Create new Qwen session via agent manager + await this.agentManager.createNewSession(workingDir); + + // Clear current conversation UI + this.sendMessageToWebView({ + type: 'conversationCleared', + data: {}, + }); + + console.log('[WebViewProvider] New session created successfully'); + } catch (error) { + console.error('[WebViewProvider] Failed to create new session:', error); + vscode.window.showErrorMessage(`Failed to create new session: ${error}`); + } + } + /** * Dispose the WebView provider and clean up resources */ diff --git a/packages/vscode-ide-companion/src/extension.ts b/packages/vscode-ide-companion/src/extension.ts index 8588b98d..f8501c22 100644 --- a/packages/vscode-ide-companion/src/extension.ts +++ b/packages/vscode-ide-companion/src/extension.ts @@ -33,7 +33,7 @@ const HIDE_INSTALLATION_GREETING_IDES: ReadonlySet = new Set([ let ideServer: IDEServer; let logger: vscode.OutputChannel; -let webViewProvider: WebViewProvider; +let webViewProviders: WebViewProvider[] = []; // Track multiple chat tabs let authStateManager: AuthStateManager; let log: (message: string) => void = () => {}; @@ -117,8 +117,12 @@ export async function activate(context: vscode.ExtensionContext) { // Initialize Auth State Manager authStateManager = new AuthStateManager(context); - // Initialize WebView Provider - webViewProvider = new WebViewProvider(context, context.extensionUri); + // Helper function to create a new WebView provider instance + const createWebViewProvider = (): WebViewProvider => { + const provider = new WebViewProvider(context, context.extensionUri); + webViewProviders.push(provider); + return provider; + }; // Register WebView panel serializer for persistence across reloads context.subscriptions.push( @@ -132,12 +136,13 @@ export async function activate(context: vscode.ExtensionContext) { state, ); - // Restore the WebView provider with the existing panel - webViewProvider.restorePanel(webviewPanel); + // Create a new provider for the restored panel + const provider = createWebViewProvider(); + provider.restorePanel(webviewPanel); // Restore state if available if (state && typeof state === 'object') { - webViewProvider.restoreState( + provider.restoreState( state as { conversationId: string | null; agentInitialized: boolean; @@ -173,15 +178,36 @@ export async function activate(context: vscode.ExtensionContext) { } }), vscode.commands.registerCommand('qwenCode.openChat', () => { - webViewProvider.show(); + // Open or reveal the most recent chat tab + if (webViewProviders.length > 0) { + const lastProvider = webViewProviders[webViewProviders.length - 1]; + lastProvider.show(); + } else { + // Create first chat tab + const provider = createWebViewProvider(); + provider.show(); + } + }), + 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(); + } }), vscode.commands.registerCommand('qwenCode.clearAuthCache', async () => { await authStateManager.clearAuthState(); - // Reset WebView agent state to force re-authentication - if (webViewProvider) { - webViewProvider.resetAgentState(); - } + // Reset all WebView agent states to force re-authentication + webViewProviders.forEach((provider) => { + provider.resetAgentState(); + }); vscode.window.showInformationMessage( 'Qwen Code authentication cache cleared. You will need to login again on next connection.', @@ -260,9 +286,11 @@ export async function deactivate(): Promise { if (ideServer) { await ideServer.stop(); } - if (webViewProvider) { - webViewProvider.dispose(); - } + // Dispose all WebView providers + webViewProviders.forEach((provider) => { + provider.dispose(); + }); + webViewProviders = []; } catch (err) { const message = err instanceof Error ? err.message : String(err); log(`Failed to stop IDE server during deactivation: ${message}`); diff --git a/packages/vscode-ide-companion/src/webview/MessageHandler.ts b/packages/vscode-ide-companion/src/webview/MessageHandler.ts index 8a49df47..dec4c639 100644 --- a/packages/vscode-ide-companion/src/webview/MessageHandler.ts +++ b/packages/vscode-ide-companion/src/webview/MessageHandler.ts @@ -169,6 +169,11 @@ export class MessageHandler { ); break; + case 'openNewChatTab': + // Create a new session in the current panel instead of opening a new panel + await this.handleNewQwenSession(); + break; + default: console.warn('[MessageHandler] Unknown message type:', message.type); break;