fix (vscode): focus chat input after opening the chat view

Opens the chat view before focusing the input
Routes a new webview command to focus the composer
Refocuses the input after adding a VS Code selection attachment
This commit is contained in:
Bohdan Triapitsyn
2026-08-13 23:50:54 +03:00
parent 2a5be62c58
commit 1b02310a28
3 changed files with 24 additions and 2 deletions
+12
View File
@@ -200,6 +200,18 @@ export class ChatViewProvider implements vscode.WebviewViewProvider {
}
}
public focusChatInput(): void {
if (!this._view) {
return;
}
this._view.show(true);
void this._view.webview.postMessage({
type: 'command',
command: 'focusChatInput',
});
}
public addContextSelection(selection: { filePath: string; filename: string; text: string }) {
if (!this._view) {
return;
+4 -1
View File
@@ -182,7 +182,10 @@ export async function activate(context: vscode.ExtensionContext) {
context.subscriptions.push(
vscode.commands.registerCommand('openchamber.focusChat', async () => {
await vscode.commands.executeCommand('openchamber.chatView.focus');
if (!(await revealChatViewForPayload())) {
return;
}
chatViewProvider?.focusChatInput();
})
);
+8 -1
View File
@@ -16,6 +16,7 @@ import type { VSCodeActiveEditorFile } from '@/sync/input-store';
import { usePermissionStore } from '@openchamber/ui/stores/permissionStore';
import { processVSCodePermissionAutoAccept } from '@openchamber/ui/sync/vscode-permission-auto-accept';
import type { PermissionRequest } from '@opencode-ai/sdk/v2/client';
import { focusChatInput } from '@openchamber/ui/components/chat/composer/editor/dom';
type ConnectionStatus = 'connecting' | 'connected' | 'error' | 'disconnected';
type PanelType = 'chat' | 'agentManager';
@@ -1292,6 +1293,10 @@ window.fetch = async (input: RequestInfo | URL, init?: RequestInit) => {
return originalFetch(input as RequestInfo, init);
};
onCommand('focusChatInput', () => {
focusChatInput();
});
onCommand('addContextSelection', (payload) => {
const { filePath, filename, text } = payload as { filePath?: unknown; filename?: unknown; text?: unknown };
if (typeof filePath !== 'string' || typeof filename !== 'string' || typeof text !== 'string') {
@@ -1306,7 +1311,9 @@ onCommand('addContextSelection', (payload) => {
import('@/sync/input-store').then(({ useInputStore }) => {
const file = new File([new Blob([text], { type: 'text/plain' })], trimmedFilename, { type: 'text/plain' });
void useInputStore.getState().addVSCodeSelectionAttachment(trimmedPath, file);
void useInputStore.getState().addVSCodeSelectionAttachment(trimmedPath, file).finally(() => {
focusChatInput();
});
});
});