diff --git a/packages/kilo-vscode/package.json b/packages/kilo-vscode/package.json index 940e19a6f58..3dbed363985 100644 --- a/packages/kilo-vscode/package.json +++ b/packages/kilo-vscode/package.json @@ -44,7 +44,9 @@ "Kilo Code", "kilocode" ], - "activationEvents": [], + "activationEvents": [ + "onWebviewPanel:kilo-code.new.AgentManagerPanel" + ], "main": "./dist/extension.js", "contributes": { "viewsContainers": { diff --git a/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts b/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts index e357c0377db..1942f4909d3 100644 --- a/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts +++ b/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts @@ -109,7 +109,7 @@ export class AgentManagerProvider implements vscode.Disposable { this.log("Opening Agent Manager panel") TelemetryProxy.capture(TelemetryEventName.AGENT_MANAGER_OPENED, { source: PLATFORM }) - this.panel = vscode.window.createWebviewPanel( + const panel = vscode.window.createWebviewPanel( AgentManagerProvider.viewType, "Agent Manager", vscode.ViewColumn.One, @@ -120,15 +120,35 @@ export class AgentManagerProvider implements vscode.Disposable { }, ) - this.panel.iconPath = { + this.attachPanel(panel) + } + + /** Restore the Agent Manager panel from a previously serialized state (VS Code restart). */ + public deserializeWebviewPanel(panel: vscode.WebviewPanel): void { + this.log("Deserializing Agent Manager panel") + this.attachPanel(panel) + } + + /** Wire up a webview panel (shared by openPanel and deserializeWebviewPanel). */ + private attachPanel(panel: vscode.WebviewPanel): void { + this.panel = panel + + // Reapply options — required for deserialized panels where enableScripts + // and localResourceRoots are not carried over from the original creation. + panel.webview.options = { + enableScripts: true, + localResourceRoots: [this.extensionUri], + } + + panel.iconPath = { light: vscode.Uri.joinPath(this.extensionUri, "assets", "icons", "kilo-light.svg"), dark: vscode.Uri.joinPath(this.extensionUri, "assets", "icons", "kilo-dark.svg"), } - this.panel.webview.html = this.getHtml(this.panel.webview) + panel.webview.html = this.getHtml(panel.webview) this.provider = new KiloProvider(this.extensionUri, this.connectionService) - this.provider.attachToWebview(this.panel.webview, { + this.provider.attachToWebview(panel.webview, { onBeforeMessage: (msg) => this.onMessage(msg), }) @@ -136,7 +156,7 @@ export class AgentManagerProvider implements vscode.Disposable { void this.sendRepoInfo() this.sendKeybindings() - this.panel.onDidDispose(() => { + panel.onDidDispose(() => { this.log("Panel disposed") this.statsPoller.stop() this.stopDiffPolling() diff --git a/packages/kilo-vscode/src/extension.ts b/packages/kilo-vscode/src/extension.ts index 97d82fe844d..ebe5f5a0d7a 100644 --- a/packages/kilo-vscode/src/extension.ts +++ b/packages/kilo-vscode/src/extension.ts @@ -50,6 +50,16 @@ export function activate(context: vscode.ExtensionContext) { const agentManagerProvider = new AgentManagerProvider(context.extensionUri, connectionService) context.subscriptions.push(agentManagerProvider) + // Register serializer so Agent Manager restores when VS Code restarts + context.subscriptions.push( + vscode.window.registerWebviewPanelSerializer(AgentManagerProvider.viewType, { + deserializeWebviewPanel(panel: vscode.WebviewPanel) { + agentManagerProvider.deserializeWebviewPanel(panel) + return Promise.resolve() + }, + }), + ) + // Create standalone diff viewer provider for the sidebar "Show Changes" action const diffViewerProvider = new DiffViewerProvider(context.extensionUri, connectionService) diffViewerProvider.setCommentHandler((comments) => {