feat: improve VS Code dev flow and stabilize sidebar/chat behavior (#754)

* fix: improve session sidebar tooltip and truncation behavior

- Keep new-draft tooltip anchored to its trigger button
- Fix minimal-mode worktree/group header text truncation
- Tune minimal-mode right padding to reduce early label clipping

* fix: render reasoning through markdown pipeline

- Use Streamdown rendering for reasoning in live chat mode
- Remove italic styling from reasoning text
- Render expanded reasoning content with MarkdownRenderer

* chore: remove legacy electron dependencies

- Removed unused Electron packages from root and UI manifests
- Deleted obsolete Electron context menu type declaration
- Regenerated lockfile after dependency cleanup

* fix: handle non-repository folders in git status API

- Prevent 500 errors when status is requested outside a valid Git repo
- Improve repository detection using `git rev-parse --git-dir`
- Reduce noisy server logs for expected non-repo status checks

* fix unloaded session chat layout flicker

* fix: reduce noisy TTS status polling

Cache and dedupe TTS status requests, and only check provider availability when the related voice features are enabled so disabled voice setups stay quiet.

* perf: throttle background PR git status refreshes

* fix: improve VS Code Explorer file drop mentions in chat

- Add Explorer context action to insert selected files as @mentions.
- Handle Explorer drag-and-drop to prefill @file mentions instead of attachments.
- Prevent duplicate plain-path text when dropping multiple files.

* fix: deduplicate recent sessions in VS Code sidebar

- Hide sessions from main list when already shown in recent
- Apply dedup only in VS Code runtime
- Keep session search behavior unchanged

* feat: add true HMR dev flow for VS Code extension

- Load VS Code webview from Vite dev server with React refresh preamble
- Add `vscode:dev` runner that starts watchers and opens Extension Development Host
- Update VS Code dev docs and scripts to use the new HMR startup flow

* feat: polish VS Code session sidebar and attachment UX

- Add resizable sessions sidebar in VS Code layout
- Tighten session list spacing and hover behavior in VS Code
- Remove bulk file/image attach success toasts while keeping error toasts
This commit is contained in:
Bohdan Triapitsyn
2026-03-23 23:51:55 +02:00
committed by GitHub
parent ea6d4c4d43
commit 1231fd773e
39 changed files with 1441 additions and 791 deletions
+60
View File
@@ -269,6 +269,66 @@ export async function activate(context: vscode.ExtensionContext) {
})
);
context.subscriptions.push(
vscode.commands.registerCommand('openchamber.attachExplorerToChat', async (resource?: vscode.Uri, resources?: vscode.Uri[]) => {
const uriCandidates: vscode.Uri[] = [];
if (Array.isArray(resources)) {
uriCandidates.push(...resources.filter((entry): entry is vscode.Uri => entry instanceof vscode.Uri));
}
if (resource instanceof vscode.Uri) {
uriCandidates.push(resource);
}
if (uriCandidates.length === 0) {
const activeEditorUri = vscode.window.activeTextEditor?.document.uri;
if (activeEditorUri) {
uriCandidates.push(activeEditorUri);
}
}
const uniqueUris = Array.from(new Map(uriCandidates.map((uri) => [uri.toString(), uri])).values());
const mentionPaths: string[] = [];
const skippedEntries: string[] = [];
for (const uri of uniqueUris) {
if (uri.scheme !== 'file') {
skippedEntries.push(uri.toString());
continue;
}
try {
const stat = await vscode.workspace.fs.stat(uri);
if ((stat.type & vscode.FileType.Directory) !== 0) {
skippedEntries.push(vscode.workspace.asRelativePath(uri, false));
continue;
}
} catch {
skippedEntries.push(vscode.workspace.asRelativePath(uri, false));
continue;
}
const relativePath = vscode.workspace.asRelativePath(uri, false).replace(/\\/g, '/').trim();
if (!relativePath) {
skippedEntries.push(uri.fsPath || uri.toString());
continue;
}
mentionPaths.push(relativePath);
}
if (mentionPaths.length === 0) {
vscode.window.showWarningMessage('OpenChamber: No file selected to mention');
return;
}
await vscode.commands.executeCommand('openchamber.openSidebar');
await new Promise((resolve) => setTimeout(resolve, 80));
chatViewProvider?.addFileMentions(mentionPaths);
if (skippedEntries.length > 0) {
vscode.window.showInformationMessage('OpenChamber: Some selected entries were skipped (folders or unsupported resources)');
}
})
);
context.subscriptions.push(
vscode.commands.registerCommand('openchamber.explain', async () => {
const editor = vscode.window.activeTextEditor;