release v1.5.2
This commit is contained in:
@@ -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
@@ -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,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,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,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,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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
@@ -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,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",
|
||||||
|
|||||||
Reference in New Issue
Block a user