mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-19 09:33:53 +00:00
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:
@@ -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
|
||||
*/
|
||||
|
||||
@@ -33,7 +33,7 @@ const HIDE_INSTALLATION_GREETING_IDES: ReadonlySet<IdeInfo['name']> = 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<void> {
|
||||
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}`);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user