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
|
* 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 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}`);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user