release v1.5.2

This commit is contained in:
Bohdan Triapitsyn
2026-01-17 22:44:09 +02:00
parent bb9c181b72
commit 8879573def
12 changed files with 54 additions and 33 deletions
+13
View File
@@ -4,11 +4,24 @@ All notable changes to this project will be documented in this file.
## [Unreleased] ## [Unreleased]
## [1.5.2] - 2026-01-17
- Sessions: added branch picker dialog to start new worktree sessions from local branches (thanks to @nilskroe).
- Sessions: added project header worktree button, active-session loader, and right-click context menu in the sessions sidebar (thanks to @nilskroe).
- Sessions: improved worktree delete dialog with linked session details, dirty-change warnings, and optional remote branch removal.
- Git: added gitmoji picker in commit message composer with cached emoji list (thanks to @TaylorBeeston).
- Chat: optimized message loading for opening sessions.
- UI: added one-click diagnostics copy in the About dialog.
- VSCode: tuned layout breakpoint and server readiness timeout for steadier startup.
- Reliability: improved OpenCode process cleanup to reduce orphaned servers.
## [1.5.1] - 2026-01-16 ## [1.5.1] - 2026-01-16
- Desktop: fixed orphaned OpenCode processes not being cleaned up on restart or exit. - Desktop: fixed orphaned OpenCode processes not being cleaned up on restart or exit.
- Opencode: fixed issue with reloading configuration was killing the app - Opencode: fixed issue with reloading configuration was killing the app
## [1.5.0] - 2026-01-16 ## [1.5.0] - 2026-01-16
- UI: added a new Files tab to browse workspace files directly from the interface. - UI: added a new Files tab to browse workspace files directly from the interface.
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "openchamber-monorepo", "name": "openchamber-monorepo",
"version": "1.5.1", "version": "1.5.2",
"description": "OpenChamber monorepo workspace for web, ui, and desktop runtimes", "description": "OpenChamber monorepo workspace for web, ui, and desktop runtimes",
"private": true, "private": true,
"type": "module", "type": "module",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@openchamber/desktop", "name": "@openchamber/desktop",
"version": "1.5.1", "version": "1.5.2",
"private": true, "private": true,
"type": "module", "type": "module",
"desktopPrerequisites": [ "desktopPrerequisites": [
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "openchamber-desktop" name = "openchamber-desktop"
version = "1.5.1" version = "1.5.2"
edition = "2021" edition = "2021"
publish = false publish = false
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"$schema": "../node_modules/@tauri-apps/cli/schema.json", "$schema": "../node_modules/@tauri-apps/cli/schema.json",
"productName": "OpenChamber", "productName": "OpenChamber",
"version": "1.5.1", "version": "1.5.2",
"identifier": "ai.opencode.openchamber", "identifier": "ai.opencode.openchamber",
"build": { "build": {
"beforeDevCommand": "bun run dev", "beforeDevCommand": "bun run dev",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@openchamber/ui", "name": "@openchamber/ui",
"version": "1.5.1", "version": "1.5.2",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "src/main.tsx", "main": "src/main.tsx",
@@ -5,7 +5,7 @@ import { ModelSelector } from '@/components/sections/agents/ModelSelector';
import { AgentSelector } from '@/components/sections/commands/AgentSelector'; import { AgentSelector } from '@/components/sections/commands/AgentSelector';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import { updateDesktopSettings } from '@/lib/persistence'; import { updateDesktopSettings } from '@/lib/persistence';
import { isDesktopRuntime, getDesktopSettings } from '@/lib/desktop'; import { getDesktopSettings, isDesktopRuntime, isVSCodeRuntime } from '@/lib/desktop';
import { useConfigStore } from '@/stores/useConfigStore'; import { useConfigStore } from '@/stores/useConfigStore';
import { getRegisteredRuntimeAPIs } from '@/contexts/runtimeAPIRegistry'; import { getRegisteredRuntimeAPIs } from '@/contexts/runtimeAPIRegistry';
import { getModifierLabel } from '@/lib/utils'; import { getModifierLabel } from '@/lib/utils';
@@ -58,6 +58,8 @@ export const DefaultsSettings: React.FC = () => {
return getDisplayModel(defaultModel, providers); return getDisplayModel(defaultModel, providers);
}, [defaultModel, providers]); }, [defaultModel, providers]);
const isVSCode = React.useMemo(() => isVSCodeRuntime(), []);
// Load current settings // Load current settings
React.useEffect(() => { React.useEffect(() => {
const loadSettings = async () => { const loadSettings = async () => {
@@ -312,24 +314,26 @@ export const DefaultsSettings: React.FC = () => {
</div> </div>
)} )}
<div className="pt-2"> {!isVSCode && (
<label className="flex items-center gap-2 cursor-pointer"> <div className="pt-2">
<input <label className="flex items-center gap-2 cursor-pointer">
type="checkbox" <input
className="h-3.5 w-3.5 accent-primary" type="checkbox"
checked={settingsAutoCreateWorktree} className="h-3.5 w-3.5 accent-primary"
onChange={handleAutoWorktreeChange} checked={settingsAutoCreateWorktree}
/> onChange={handleAutoWorktreeChange}
<span className="typography-ui-label text-foreground"> />
Always create worktree for new sessions <span className="typography-ui-label text-foreground">
</span> Always create worktree for new sessions
</label> </span>
<p className="typography-meta text-muted-foreground pl-5.5 mt-1"> </label>
{settingsAutoCreateWorktree <p className="typography-meta text-muted-foreground pl-5.5 mt-1">
? `New session (Worktree): ${getModifierLabel()} + N • New session (Standard): Shift + ${getModifierLabel()} + N` {settingsAutoCreateWorktree
: `New session (Standard): ${getModifierLabel()} + N • New session (Worktree): Shift + ${getModifierLabel()} + N`} ? `New session (Worktree): ${getModifierLabel()} + N • New session (Standard): Shift + ${getModifierLabel()} + N`
</p> : `New session (Standard): ${getModifierLabel()} + N • New session (Worktree): Shift + ${getModifierLabel()} + N`}
</div> </p>
</div>
)}
</div> </div>
); );
}; };
@@ -104,6 +104,7 @@ const writeGitmojiCache = (gitmojis: GitmojiEntry[]) => {
}; };
localStorage.setItem(GITMOJI_CACHE_KEY, JSON.stringify(payload)); localStorage.setItem(GITMOJI_CACHE_KEY, JSON.stringify(payload));
} catch { } catch {
return;
} }
}; };
+7
View File
@@ -1,3 +1,10 @@
## [1.5.2] - 2026-01-17
- Chat: optimized message loading for opening sessions.
- Layout: tuned responsive breakpoint and server readiness timeout for steadier startup.
- Reliability: improved OpenCode process cleanup to reduce orphaned servers.
## [1.5.1] - 2026-01-16 ## [1.5.1] - 2026-01-16
- No notable changes - No notable changes
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "openchamber", "name": "openchamber",
"displayName": "OpenChamber", "displayName": "OpenChamber",
"description": "AI coding assistant powered by OpenCode", "description": "AI coding assistant powered by OpenCode",
"version": "1.5.1", "version": "1.5.2",
"publisher": "fedaykindev", "publisher": "fedaykindev",
"private": true, "private": true,
"repository": { "repository": {
+3 -7
View File
@@ -85,7 +85,7 @@ function getCandidateBaseUrls(serverUrl: string): string[] {
} }
} }
async function waitForReady(serverUrl: string, timeoutMs = 15000, workingDirectory = ''): Promise<ReadyResult> { async function waitForReady(serverUrl: string, timeoutMs = 15000): Promise<ReadyResult> {
const start = Date.now(); const start = Date.now();
const candidates = getCandidateBaseUrls(serverUrl); const candidates = getCandidateBaseUrls(serverUrl);
let attempts = 0; let attempts = 0;
@@ -120,10 +120,6 @@ async function waitForReady(serverUrl: string, timeoutMs = 15000, workingDirecto
return { ok: false, elapsedMs: Date.now() - start, attempts }; return { ok: false, elapsedMs: Date.now() - start, attempts };
} }
function inferApiPrefixFromUrl(): string {
return '';
}
export function createOpenCodeManager(_context: vscode.ExtensionContext): OpenCodeManager { export function createOpenCodeManager(_context: vscode.ExtensionContext): OpenCodeManager {
// Discard unused parameter - reserved for future use (state persistence, subscriptions) // Discard unused parameter - reserved for future use (state persistence, subscriptions)
void _context; void _context;
@@ -248,7 +244,7 @@ export function createOpenCodeManager(_context: vscode.ExtensionContext): OpenCo
if (server && server.url) { if (server && server.url) {
// Validate readiness for the current workspace context. // Validate readiness for the current workspace context.
const ready = await waitForReady(server.url, 10000, workingDirectory); const ready = await waitForReady(server.url, 10000);
lastReadyElapsedMs = ready.elapsedMs; lastReadyElapsedMs = ready.elapsedMs;
lastReadyAttempts = ready.attempts; lastReadyAttempts = ready.attempts;
if (ready.ok) { if (ready.ok) {
@@ -382,7 +378,7 @@ export function createOpenCodeManager(_context: vscode.ExtensionContext): OpenCo
} }
async function setWorkingDirectory(newPath: string): Promise<{ success: boolean; restarted: boolean; path: string }> { async function setWorkingDirectory(newPath: string): Promise<{ success: boolean; restarted: boolean; path: string }> {
const target = typeof newPath === 'string' && newPath.trim().length > 0 ? newPath.trim() : workspaceDirectory(); void newPath;
const workspacePath = workspaceDirectory(); const workspacePath = workspaceDirectory();
const nextDirectory = workspacePath; const nextDirectory = workspacePath;
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@openchamber/web", "name": "@openchamber/web",
"version": "1.5.1", "version": "1.5.2",
"private": false, "private": false,
"type": "module", "type": "module",
"main": "./server/index.js", "main": "./server/index.js",