From a1a29f2a5e3375b4c3198b9ceba1407fb50e7890 Mon Sep 17 00:00:00 2001 From: Marius Date: Thu, 2 Apr 2026 13:16:00 +0200 Subject: [PATCH] fix(agent-manager): route clipboard write through extension host (#8161) The Copy Path context menu item called navigator.clipboard.writeText() directly from the webview, which throws NotAllowedError when the webview loses focus to the context menu. Route through vscode.env.clipboard via the Host abstraction instead. --- .../kilo-vscode/src/agent-manager/AgentManagerProvider.ts | 4 ++++ packages/kilo-vscode/src/agent-manager/host.ts | 3 +++ packages/kilo-vscode/src/agent-manager/types.ts | 6 ++++++ packages/kilo-vscode/src/agent-manager/vscode-host.ts | 4 ++++ .../webview-ui/agent-manager/AgentManagerApp.tsx | 4 +++- packages/kilo-vscode/webview-ui/src/types/messages.ts | 7 +++++++ 6 files changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts b/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts index 3cb37941533..424d0b54b07 100644 --- a/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts +++ b/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts @@ -250,6 +250,10 @@ export class AgentManagerProvider implements Disposable { this.openWorktreeDirectory(m.worktreeId) return null } + if (m.type === "agentManager.copyToClipboard") { + this.host.copyToClipboard(m.text) + return null + } if (m.type === "previewImage") { return msg } diff --git a/packages/kilo-vscode/src/agent-manager/host.ts b/packages/kilo-vscode/src/agent-manager/host.ts index 80d151ba8d4..34bbdd3b7f3 100644 --- a/packages/kilo-vscode/src/agent-manager/host.ts +++ b/packages/kilo-vscode/src/agent-manager/host.ts @@ -101,6 +101,9 @@ export interface Host { /** Get the CLI server port (for webview CSP). */ serverPort(): number | undefined + /** Copy text to the system clipboard. */ + copyToClipboard(text: string): void + /** Capture a telemetry event. */ capture(event: string, properties?: Record): void diff --git a/packages/kilo-vscode/src/agent-manager/types.ts b/packages/kilo-vscode/src/agent-manager/types.ts index c9ebb5dd12f..aeffd54bbce 100644 --- a/packages/kilo-vscode/src/agent-manager/types.ts +++ b/packages/kilo-vscode/src/agent-manager/types.ts @@ -262,6 +262,11 @@ interface OpenWorktreeIn { worktreeId: string } +interface CopyToClipboardIn { + type: "agentManager.copyToClipboard" + text: string +} + interface ShowExistingLocalTerminalIn { type: "agentManager.showExistingLocalTerminal" } @@ -462,6 +467,7 @@ export type AgentManagerInMessage = | ShowTerminalIn | ShowLocalTerminalIn | OpenWorktreeIn + | CopyToClipboardIn | ShowExistingLocalTerminalIn | RequestRepoInfoIn | CreateMultiVersionIn diff --git a/packages/kilo-vscode/src/agent-manager/vscode-host.ts b/packages/kilo-vscode/src/agent-manager/vscode-host.ts index f21e39bd0e6..f3f3a4c969f 100644 --- a/packages/kilo-vscode/src/agent-manager/vscode-host.ts +++ b/packages/kilo-vscode/src/agent-manager/vscode-host.ts @@ -152,6 +152,10 @@ export class VscodeHost implements Host { return this.connectionService.getServerInfo()?.port } + copyToClipboard(text: string): void { + void vscode.env.clipboard.writeText(text) + } + capture(event: string, properties?: Record): void { TelemetryProxy.capture(event as TelemetryEventName, properties) } diff --git a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx index 8c69841d95a..49d7728424e 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx @@ -2340,7 +2340,9 @@ const AgentManagerContent: Component = () => { onCommitRename={() => commitRename(wt.id)} onCancelRename={cancelRename} onRemoveStale={() => confirmRemoveStaleWorktree(wt.id)} - onCopyPath={() => navigator.clipboard.writeText(wt.path)} + onCopyPath={() => + vscode.postMessage({ type: "agentManager.copyToClipboard", text: wt.path }) + } onOpen={() => vscode.postMessage({ type: "agentManager.openWorktree", worktreeId: wt.id }) } diff --git a/packages/kilo-vscode/webview-ui/src/types/messages.ts b/packages/kilo-vscode/webview-ui/src/types/messages.ts index bedfec5e918..34a85e8fa0e 100644 --- a/packages/kilo-vscode/webview-ui/src/types/messages.ts +++ b/packages/kilo-vscode/webview-ui/src/types/messages.ts @@ -1772,6 +1772,12 @@ export interface OpenWorktreeRequest { worktreeId: string } +// Copy text to the system clipboard via the extension host +export interface CopyToClipboardRequest { + type: "agentManager.copyToClipboard" + text: string +} + // Show existing local terminal when switching to local context (no-op if none exists) export interface ShowExistingLocalTerminalRequest { type: "agentManager.showExistingLocalTerminal" @@ -2096,6 +2102,7 @@ export type WebviewMessage = | ShowTerminalRequest | ShowLocalTerminalRequest | OpenWorktreeRequest + | CopyToClipboardRequest | ShowExistingLocalTerminalRequest | AgentManagerOpenFileRequest | CreateMultiVersionRequest