From bdda3c36bc459737411ca542529ee606425cd5a6 Mon Sep 17 00:00:00 2001 From: Bohdan Triapitsyn Date: Sun, 30 Aug 2026 19:24:09 +0300 Subject: [PATCH] release v1.22.0 --- CHANGELOG.md | 2 ++ bun.lock | 8 ++++---- package.json | 2 +- packages/electron/package.json | 2 +- packages/ui/package.json | 2 +- packages/ui/src/components/chat/ChatContainer.tsx | 6 +++++- packages/ui/src/components/chat/MarkdownRendererImpl.tsx | 2 +- packages/ui/src/components/layout/Header.tsx | 1 - .../sections/integrations/LinearProjectMapping.tsx | 4 ++-- packages/vscode/CHANGELOG.md | 2 +- packages/vscode/package.json | 2 +- packages/web/package.json | 2 +- 12 files changed, 20 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d881e33..ccdabf6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +## [1.22.0] - 2026-08-30 + - **Linear integration:** connect a workspace in Settings → Integrations, browse and filter issues, and start a session or worktree from an issue. OpenChamber reports session progress back to Linear and can attach an issue to the next chat message (thanks to @AlexKutas). - **Voice:** local text-to-speech and macOS say now choose a voice that matches the reply's language. Additional local models download on first use, and the voice picker lists voices from every installed model. - **Git:** projects containing several repositories can now switch between them from the Git tab. Diff, pull request, walkthrough, mobile Changes, and work status follow the selected repository (thanks to @jaygupta17). diff --git a/bun.lock b/bun.lock index 4267b586..15e74422 100644 --- a/bun.lock +++ b/bun.lock @@ -97,7 +97,7 @@ }, "packages/electron": { "name": "@openchamber/electron", - "version": "1.21.0", + "version": "1.22.0", "dependencies": { "@openchamber/web": "workspace:*", "electron-context-menu": "^4.1.2", @@ -134,7 +134,7 @@ }, "packages/ui": { "name": "@openchamber/ui", - "version": "1.21.0", + "version": "1.22.0", "dependencies": { "@aparajita/capacitor-secure-storage": "^8.0.0", "@base-ui/react": "^1.4.0", @@ -241,7 +241,7 @@ }, "packages/vscode": { "name": "openchamber", - "version": "1.21.0", + "version": "1.22.0", "dependencies": { "@openchamber/ui": "workspace:*", "@opencode-ai/sdk": "1.18.25", @@ -264,7 +264,7 @@ }, "packages/web": { "name": "@openchamber/web", - "version": "1.21.0", + "version": "1.22.0", "bin": { "openchamber": "./bin/cli.js", }, diff --git a/package.json b/package.json index 00d117eb..dc3602d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openchamber-monorepo", - "version": "1.21.1", + "version": "1.22.0", "description": "OpenChamber monorepo workspace for web, ui, and desktop runtimes", "private": true, "type": "module", diff --git a/packages/electron/package.json b/packages/electron/package.json index 5e169440..2281926a 100644 --- a/packages/electron/package.json +++ b/packages/electron/package.json @@ -1,6 +1,6 @@ { "name": "@openchamber/electron", - "version": "1.21.1", + "version": "1.22.0", "private": true, "description": "Electron desktop runtime for OpenChamber", "author": "OpenChamber", diff --git a/packages/ui/package.json b/packages/ui/package.json index 4cfe929e..31181a9e 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@openchamber/ui", - "version": "1.21.1", + "version": "1.22.0", "private": true, "type": "module", "main": "src/main.tsx", diff --git a/packages/ui/src/components/chat/ChatContainer.tsx b/packages/ui/src/components/chat/ChatContainer.tsx index 295a5411..ef0ab2b3 100644 --- a/packages/ui/src/components/chat/ChatContainer.tsx +++ b/packages/ui/src/components/chat/ChatContainer.tsx @@ -748,7 +748,11 @@ export const ChatContainer: React.FC = ({ // One gate per opened session; the scroll hook holds it until the // viewport is pinned to the end so the first visible frame is already // at the bottom. - const revealGate = React.useMemo(() => createTimelineRevealGate(), [currentSessionKey]); + const revealGateRef = React.useRef<{ key: string | null; gate: TimelineRevealGate } | null>(null); + if (revealGateRef.current?.key !== currentSessionKey) { + revealGateRef.current = { key: currentSessionKey, gate: createTimelineRevealGate() }; + } + const revealGate = revealGateRef.current.gate; const chatColumnSession = React.useMemo( () => ({ sessionId: currentSessionId ?? null, directory: currentSessionId ? effectiveSessionDirectory ?? null : null }), [currentSessionId, effectiveSessionDirectory], diff --git a/packages/ui/src/components/chat/MarkdownRendererImpl.tsx b/packages/ui/src/components/chat/MarkdownRendererImpl.tsx index 55b356b8..b6279b24 100644 --- a/packages/ui/src/components/chat/MarkdownRendererImpl.tsx +++ b/packages/ui/src/components/chat/MarkdownRendererImpl.tsx @@ -962,7 +962,7 @@ const useMorphdomMarkdown = ({ // or re-decorating ordinary blocks. refreshMermaidViewers(); } - }, [containerRef, text, streaming, imageMode, ctx, refreshMermaidViewers]); + }, [containerRef, text, streaming, imageMode, ctx, refreshMermaidViewers, revealGate]); React.useEffect(() => () => { mermaidViewerRef.current?.cleanup(); diff --git a/packages/ui/src/components/layout/Header.tsx b/packages/ui/src/components/layout/Header.tsx index 3fce3d60..41bc1dfa 100644 --- a/packages/ui/src/components/layout/Header.tsx +++ b/packages/ui/src/components/layout/Header.tsx @@ -29,7 +29,6 @@ import { useGlobalSessionsStore } from '@/stores/useGlobalSessionsStore'; import { streamPerfCount } from '@/stores/utils/streamDebug'; import { useFeatureFlagsStore } from '@/stores/useFeatureFlagsStore'; -import { useRuntimeAPIs } from '@/hooks/useRuntimeAPIs'; import { useDesktopWindowControlsLayout } from '@/hooks/useDesktopWindowControlsLayout'; import { ContextUsageDisplay } from '@/components/ui/ContextUsageDisplay'; import { WindowsWindowControls } from '@/components/desktop/WindowsWindowControls'; diff --git a/packages/ui/src/components/sections/integrations/LinearProjectMapping.tsx b/packages/ui/src/components/sections/integrations/LinearProjectMapping.tsx index 138bad49..773b687b 100644 --- a/packages/ui/src/components/sections/integrations/LinearProjectMapping.tsx +++ b/packages/ui/src/components/sections/integrations/LinearProjectMapping.tsx @@ -49,11 +49,11 @@ export function LinearProjectMapping({ console.error('Failed to load Linear mapping:', error); setLoadFailed(true); } - }, [connected, linear, organizationId]); + }, [connected, linear]); React.useEffect(() => { void loadMapping(); - }, [loadMapping]); + }, [loadMapping, organizationId]); const saveMapping = React.useCallback(async (next: LinearMappingResult) => { const teamProjectPaths: { [teamId: string]: string } = {}; diff --git a/packages/vscode/CHANGELOG.md b/packages/vscode/CHANGELOG.md index 69651812..29772c5e 100644 --- a/packages/vscode/CHANGELOG.md +++ b/packages/vscode/CHANGELOG.md @@ -1,4 +1,4 @@ -## [Unreleased] +## [1.22.0] - 2026-08-30 - Switching sessions is now visually stable, without conversation jumps or partial rendering. - Chat: a turn that OpenCode stopped no longer ends with nothing on screen — what OpenCode reported shows under the last message, and a message an idle session has left unanswered is named as such. The status report (Ctrl/Cmd+Shift+L) now lists the last session errors and rejected sends. diff --git a/packages/vscode/package.json b/packages/vscode/package.json index a2feb53c..0bbb543c 100644 --- a/packages/vscode/package.json +++ b/packages/vscode/package.json @@ -2,7 +2,7 @@ "name": "openchamber", "displayName": "OpenChamber", "description": "%extension.description%", - "version": "1.21.1", + "version": "1.22.0", "publisher": "fedaykindev", "private": true, "repository": { diff --git a/packages/web/package.json b/packages/web/package.json index 699f65c5..c25da06d 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@openchamber/web", - "version": "1.21.1", + "version": "1.22.0", "private": false, "type": "module", "main": "./server/index.js",