fix(vscode-ide-companion): 修复新建会话按钮创建新分屏的问题

问题:
- 点击新建会话按钮时,会在 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 <noreply@anthropic.com>
This commit is contained in:
yiliang114
2025-11-20 23:07:56 +08:00
parent 492c56a780
commit 95b67bbebd
3 changed files with 73 additions and 14 deletions

View File

@@ -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<void> {
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 * Dispose the WebView provider and clean up resources
*/ */

View File

@@ -33,7 +33,7 @@ const HIDE_INSTALLATION_GREETING_IDES: ReadonlySet<IdeInfo['name']> = new Set([
let ideServer: IDEServer; let ideServer: IDEServer;
let logger: vscode.OutputChannel; let logger: vscode.OutputChannel;
let webViewProvider: WebViewProvider; let webViewProviders: WebViewProvider[] = []; // Track multiple chat tabs
let authStateManager: AuthStateManager; let authStateManager: AuthStateManager;
let log: (message: string) => void = () => {}; let log: (message: string) => void = () => {};
@@ -117,8 +117,12 @@ export async function activate(context: vscode.ExtensionContext) {
// Initialize Auth State Manager // Initialize Auth State Manager
authStateManager = new AuthStateManager(context); authStateManager = new AuthStateManager(context);
// Initialize WebView Provider // Helper function to create a new WebView provider instance
webViewProvider = new WebViewProvider(context, context.extensionUri); const createWebViewProvider = (): WebViewProvider => {
const provider = new WebViewProvider(context, context.extensionUri);
webViewProviders.push(provider);
return provider;
};
// Register WebView panel serializer for persistence across reloads // Register WebView panel serializer for persistence across reloads
context.subscriptions.push( context.subscriptions.push(
@@ -132,12 +136,13 @@ export async function activate(context: vscode.ExtensionContext) {
state, state,
); );
// Restore the WebView provider with the existing panel // Create a new provider for the restored panel
webViewProvider.restorePanel(webviewPanel); const provider = createWebViewProvider();
provider.restorePanel(webviewPanel);
// Restore state if available // Restore state if available
if (state && typeof state === 'object') { if (state && typeof state === 'object') {
webViewProvider.restoreState( provider.restoreState(
state as { state as {
conversationId: string | null; conversationId: string | null;
agentInitialized: boolean; agentInitialized: boolean;
@@ -173,15 +178,36 @@ export async function activate(context: vscode.ExtensionContext) {
} }
}), }),
vscode.commands.registerCommand('qwenCode.openChat', () => { 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 () => { vscode.commands.registerCommand('qwenCode.clearAuthCache', async () => {
await authStateManager.clearAuthState(); await authStateManager.clearAuthState();
// Reset WebView agent state to force re-authentication // Reset all WebView agent states to force re-authentication
if (webViewProvider) { webViewProviders.forEach((provider) => {
webViewProvider.resetAgentState(); provider.resetAgentState();
} });
vscode.window.showInformationMessage( vscode.window.showInformationMessage(
'Qwen Code authentication cache cleared. You will need to login again on next connection.', 'Qwen Code authentication cache cleared. You will need to login again on next connection.',
@@ -260,9 +286,11 @@ export async function deactivate(): Promise<void> {
if (ideServer) { if (ideServer) {
await ideServer.stop(); await ideServer.stop();
} }
if (webViewProvider) { // Dispose all WebView providers
webViewProvider.dispose(); webViewProviders.forEach((provider) => {
} provider.dispose();
});
webViewProviders = [];
} catch (err) { } catch (err) {
const message = err instanceof Error ? err.message : String(err); const message = err instanceof Error ? err.message : String(err);
log(`Failed to stop IDE server during deactivation: ${message}`); log(`Failed to stop IDE server during deactivation: ${message}`);

View File

@@ -169,6 +169,11 @@ export class MessageHandler {
); );
break; break;
case 'openNewChatTab':
// Create a new session in the current panel instead of opening a new panel
await this.handleNewQwenSession();
break;
default: default:
console.warn('[MessageHandler] Unknown message type:', message.type); console.warn('[MessageHandler] Unknown message type:', message.type);
break; break;