diff --git a/extensions/vscode/package.json b/extensions/vscode/package.json index 4854b85c49..5c9052a588 100644 --- a/extensions/vscode/package.json +++ b/extensions/vscode/package.json @@ -127,6 +127,10 @@ } }, "commands": [ + { + "command": "pearai.switchWebview", + "title": "PearAI: Switch Chat View" + }, { "command": "pearai.acceptDiff", "category": "PearAI", @@ -530,6 +534,12 @@ "id": "pearai.continueGUIView", "name": "", "visibility": "visible" + }, + { + "type": "webview", + "id": "pearai.continueGUIView2", + "name": "Chat 2", + "visibility": "visible" } ] }, diff --git a/extensions/vscode/src/commands.ts b/extensions/vscode/src/commands.ts index c9069b48a0..729511ed74 100644 --- a/extensions/vscode/src/commands.ts +++ b/extensions/vscode/src/commands.ts @@ -526,6 +526,9 @@ const commandsMap: ( extensionContext.subscriptions, ); }, + "pearai.switchWebview": () => { + vscode.commands.executeCommand("pearai.internal.switchWebview"); + }, "pearai.openConfigJson": () => { ide.openFile(getConfigJsonPath()); }, diff --git a/extensions/vscode/src/extension/VsCodeExtension.ts b/extensions/vscode/src/extension/VsCodeExtension.ts index 56deb2a96b..cc44d8314b 100644 --- a/extensions/vscode/src/extension/VsCodeExtension.ts +++ b/extensions/vscode/src/extension/VsCodeExtension.ts @@ -41,7 +41,8 @@ export class VsCodeExtension { private ide: VsCodeIde; private tabAutocompleteModel: TabAutocompleteModel; private sidebar: ContinueGUIWebviewViewProvider; - private windowId: string; + private sidebar2: ContinueGUIWebviewViewProvider; + private activeWebview: 'sidebar' | 'sidebar2' = 'sidebar'; private windowId: string; private diffManager: DiffManager; private verticalDiffManager: VerticalPerLineDiffManager; webviewProtocolPromise: Promise; @@ -95,6 +96,29 @@ export class VsCodeExtension { ); resolveWebviewProtocol(this.sidebar.webviewProtocol); + this.sidebar2 = new ContinueGUIWebviewViewProvider( + configHandlerPromise, + this.windowId + "_2", + this.extensionContext, + ); + + // Register second sidebar + context.subscriptions.push( + vscode.window.registerWebviewViewProvider( + "pearai.continueGUIView2", + this.sidebar2, + { + webviewOptions: { retainContextWhenHidden: true }, + }, + ), + ); + + context.subscriptions.push( + vscode.commands.registerCommand("pearai.internal.switchWebview", () => { + this.switchWebview(); + }) + ); + // Config Handler with output channel const outputChannel = vscode.window.createOutputChannel( "PearAI", @@ -372,6 +396,21 @@ export class VsCodeExtension { static continueVirtualDocumentScheme = "pearai"; + public switchWebview() { + this.activeWebview = this.activeWebview === 'sidebar' ? 'sidebar2' : 'sidebar'; + const activeProvider = this.activeWebview === 'sidebar' ? this.sidebar : this.sidebar2; + + this.webviewProtocolPromise.then(protocol => { + if (activeProvider.webview) { + protocol.webview = activeProvider.webview; + } + }); + // Refresh the webview content + activeProvider.webviewProtocol?.request("didChangeAvailableProfiles", { profiles: [] }); + + vscode.commands.executeCommand(`pearai.continueGUIView${this.activeWebview === 'sidebar' ? '' : '2'}.focus`); + } + // eslint-disable-next-line @typescript-eslint/naming-convention private PREVIOUS_BRANCH_FOR_WORKSPACE_DIR: { [dir: string]: string } = {};