feat: vscode extension (#59)

* feat: add initial VS Code extension plan and implementation tasks

* feat(vscode): added initial version of an Openchamber VSCode extension

* feat(vscode): enhance VS Code extension with theme integration and session management

* feat(vscode): implement connection status handling and overlay in VSCode layout

* feat: move extension to secondary sidebar

* chore: upgrade @opencode-ai/sdk to 1.0.150

* vscode: editor bridge, file picker, click-to-open in tool parts

* vscode: layout session lifecycle, theme sync, typography overrides

* ui: compact mode for vscode, model search, autocomplete width fixes

* perf: scroll force flag, raf placeholder, git polling backoff

* ui: tool output styling, markdown code block fix, gitignore

* refactor: update typography handling for VSCode runtime, remove unused styles

* docs: update README with VS Code extension details and add extension image

* docs: update changelog with new features and performance improvements
This commit is contained in:
Bohdan Triapitsyn
2025-12-13 16:34:17 +02:00
committed by GitHub
parent 610ccf4c62
commit bb72c0fb0c
76 changed files with 6097 additions and 296 deletions
+76
View File
@@ -0,0 +1,76 @@
import * as vscode from 'vscode';
import { ChatViewProvider } from './ChatViewProvider';
import { createOpenCodeManager, type OpenCodeManager } from './opencode';
let chatViewProvider: ChatViewProvider | undefined;
let openCodeManager: OpenCodeManager | undefined;
export function activate(context: vscode.ExtensionContext) {
// Create OpenCode manager first
openCodeManager = createOpenCodeManager(context);
// Create chat view provider with manager reference
chatViewProvider = new ChatViewProvider(context, context.extensionUri, openCodeManager);
context.subscriptions.push(
vscode.window.registerWebviewViewProvider(
ChatViewProvider.viewType,
chatViewProvider,
{ webviewOptions: { retainContextWhenHidden: true } }
)
);
context.subscriptions.push(
vscode.commands.registerCommand('openchamber.newSession', () => {
chatViewProvider?.newSession();
})
);
context.subscriptions.push(
vscode.commands.registerCommand('openchamber.focusChat', () => {
vscode.commands.executeCommand('openchamber.chatView.focus');
})
);
context.subscriptions.push(
vscode.commands.registerCommand('openchamber.restartApi', async () => {
await openCodeManager?.restart();
})
);
context.subscriptions.push(
vscode.commands.registerCommand('openchamber.showInSecondarySidebar', async () => {
const viewId = ChatViewProvider.viewType;
const isVisible = chatViewProvider?.isVisible() === true;
if (isVisible) {
await vscode.commands.executeCommand('workbench.action.toggleAuxiliaryBar');
return;
}
await vscode.commands.executeCommand('workbench.action.focusAuxiliaryBar');
await vscode.commands.executeCommand(`${viewId}.focus`);
})
);
context.subscriptions.push(
vscode.window.onDidChangeActiveColorTheme((theme) => {
chatViewProvider?.updateTheme(theme.kind);
})
);
// Subscribe to status changes
context.subscriptions.push(
openCodeManager.onStatusChange((status, error) => {
chatViewProvider?.updateConnectionStatus(status, error);
})
);
// Auto-start OpenCode API
openCodeManager.start();
}
export function deactivate() {
openCodeManager?.stop();
openCodeManager = undefined;
chatViewProvider = undefined;
}