Commit Graph
1165 Commits
Author SHA1 Message Date
Isaac Sanchez-HawkinsandIsaac Sanchez 83ea6a70eb fix(settings): mark active nav page (#1164)
Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 19:52:13 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 1ef5917932 fix(ui): expose sidebar group collapse state (#1163)
* fix(ui): expose sidebar group collapse state

* fix(ui): keep sidebar group panel mounted

---------

Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 19:50:53 +03:00
Bohdan Triapitsyn 2459ce13ff fix(chat): collapse model controls to icon-only on narrow widths
Bump @container/model-controls thresholds so labels disappear before
they would ellipsis-truncate. Hide order: agent (< 22rem), variant
(< 14rem), model (< 10rem). VS Code keeps its tighter thresholds.
2026-05-08 19:41:03 +03:00
Bohdan Triapitsyn 1a0f3bea8e fix: allow PR worktrees from existing local branches
Use existing local PR branches instead of blocking worktree creation
Only block PR branches already checked out in another worktree
Clarify local branch validation messages across locales
2026-05-08 16:59:31 +03:00
Bohdan Triapitsyn a591f63ed2 release v1.10.3 2026-05-08 16:26:07 +03:00
Wenqiang.Xu 3716deb16c fix: use platform-aware UTF-8 locale fallback for PTY (#1137)
C.UTF-8 does not exist on macOS, causing the terminal to fall back
to ASCII encoding when LANG is unset. Use en_US.UTF-8 on macOS and
C.UTF-8 on Linux. Also set LC_CTYPE with the platform-appropriate
value (UTF-8 on macOS, C.UTF-8 on Linux) for additional safety.
2026-05-08 16:19:24 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 4b6fec774d fix(skills): ignore stale repo scans (#1158)
* fix(skills): ignore stale repo scans

* fix(skills): clear stale repo identity

---------

Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 16:11:26 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 088237c606 fix(skills): ignore stale catalog scans (#1157)
* fix(skills): ignore stale catalog scans

* fix(skills): clear stale catalog identities

---------

Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 16:09:05 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 8f1e5c0085 fix(chat): make linked reference removal focusable (#1156)
Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 16:05:22 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 817fafbe29 fix(chat): guard skill autocomplete tab (#1155)
Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 16:01:33 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 98ef2e87a1 fix(chat): clear text selection timer (#1154)
Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 16:01:13 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 28f7a52ec8 fix(git): forward status mode to runtimes (#1153)
Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 15:57:25 +03:00
14c0bfe0bc fix(sync): skip duplicate status events (#1152)
* fix(sync): skip duplicate status events

* test(sync): cover duplicate idle statuses

---------

Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
2026-05-08 15:56:18 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez c1c21fe340 fix(sync): track only trailing assistant streaming (#1151)
* fix(sync): track only trailing assistant streaming

* test(sync): cover streaming completion paths

---------

Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 15:47:56 +03:00
811aa50312 fix(input): ignore stale attachment reads (#1150)
* fix(input): ignore stale attachment reads

* fix(input): centralize attachment replacement

* fix(input): route queued attachment restores through store action

---------

Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
2026-05-08 15:47:46 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 01c19706f4 fix(queue): auto-send attachment-only messages (#1149)
Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 15:41:36 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez da2145ae25 fix(files): ignore stale directory refreshes (#1148)
Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 15:41:23 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 1d800366a0 fix(chat): refresh memoized action handlers (#1147)
Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 15:36:35 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 006e84dbc4 fix(chat): make queued message removal focusable (#1146)
Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 15:36:18 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 429ed0842e fix(multirun): disable adding models at limit (#1145)
* fix(multirun): disable adding models at limit

* fix(multirun): remove redundant add guards

---------

Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 15:32:05 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 4ac5d7699a fix(ui): allow escape to close mobile settings (#1144)
Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 15:26:36 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 71e902fec6 fix(ui): ignore stale file search results (#1143)
* fix(ui): ignore stale file search results

* fix(ui): skip stale file search notifications

---------

Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 15:18:48 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 4a79af3fb7 fix(event-stream): cancel unavailable upstream bodies (#1142)
Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 15:14:39 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 47fc6a4606 fix(sync): compare retry status metadata (#1141)
* fix(sync): compare retry status metadata

* fix(sync): compare status fields directly

---------

Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 15:12:08 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 4b65a16b12 fix(git): load sandbox db dependency in esm (#1140)
Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 15:09:52 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez a3a82166f1 fix(sync): update request arrays immutably (#1139)
* fix(sync): update request arrays immutably

* test(sync): cover rejected question updates

---------

Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 15:07:40 +03:00
Isaac Sanchez-HawkinsandIsaac Sanchez 9fb3e5d764 fix(electron): preserve desktop hosts when saving SSH instances (#1138)
Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
2026-05-08 15:03:37 +03:00
Bohdan Triapitsyn c827d6b8df fix: restore messages after redo
Refetches session messages before applying redo
Aligns undo/redo navigation with OpenCode behavior
Keeps restored messages visible after unrevert
2026-05-08 14:53:48 +03:00
Bohdan Triapitsyn d659929685 fix(chat): tighten auto-follow release thresholds
Bottom-zone threshold now scales with the scroll container's clientHeight
rather than window.innerHeight. The threshold is meant to mirror the empty
spacer at the end of the chat, but what users perceive as "the empty tail"
is relative to the visible chat area, not the whole viewport — on desktop
the chat is shorter than the window because of the input row below it.
This keeps the scroll-to-bottom button hidden until the user has actually
scrolled past the spacer they see, regardless of viewport size.

Wheel and touch release detection no longer treats every nested
[data-scrollable] as a blocker. The old check returned true for any
nested scrollable ancestor, so wheel-up over a code block already at its
own scrollTop=0 produced no effect — the inner element could not consume
the gesture and the outer chat refused to release auto-follow. The new
check returns true only when the nested element can actually scroll up
(scrollTop > 0); otherwise the gesture bubbles to the chat and releases
auto-follow as expected.
2026-05-08 14:31:16 +03:00
Bohdan Triapitsyn 0ea573f766 refactor: redesign chat scroll system
The previous system layered three hooks (useScrollEngine, useChatScrollManager,
useChatTimelineController) with overlapping responsibilities, four parallel
ResizeObservers/MutationObservers, and six entry points to "scroll to bottom"
(force-flag combinations, persistent follow loops, materialization recovery).
This produced bugs where users could not break free of auto-follow during
streaming: scrollbar drag, keyboard scrolling and find-in-page were not
detected as user intent, and observers kept restarting the follow loop on
every DOM mutation.

The new architecture replaces the two low-level hooks with a single
useChatAutoFollow that owns scroll behaviour end to end:

- One state: 'following' or 'released'. No follow modes, no pin flags,
  no marker pixels.
- One scroll writer: a lerp loop that runs only while the session is
  streaming and state is 'following'. Idle sessions never write scrollTop
  programmatically.
- One user-intent detector: wheel up, touch drag down, keyboard
  (PageUp / Home / ArrowUp), pointerdown on the OverlayScrollbar thumb,
  and explicit releaseAutoFollow() calls all flip the state to 'released'.
- A 1.2s grace period after explicit release: re-pin will not auto-engage
  inside this window, so a small wheel up cannot snap the user back even
  while they remain near the bottom spacer.
- Re-pin and the scroll-to-bottom button share the same threshold: the
  height of the empty bottom spacer (10vh on desktop, 40px on mobile).
  Released users see the button only after they have scrolled past the
  spacer that already exists at the end of the chat.
- Save/restore of scroll position uses ratio mapping, debounced at 150ms
  on user-driven scroll events; programmatic writes are masked via a short
  window so they never persist as user positions.
- Container reattachment is detected via a useLayoutEffect probe over
  scrollRef.current. Listeners and observers re-bind when ChatViewport
  mounts after hydration or after the first message promotes a draft
  session into a real chat.
- A pending-restore queue replays restoreSnapshot once the scroll
  container appears, fixing the case where a hydrating session landed at
  the top instead of the bottom.

Removed: useScrollEngine.ts, useChatScrollManager.ts, the persistent
follow loop with its own ResizeObserver+MutationObserver pair, the
materialization-recovery .finally resume that yanked idle users to the
bottom on transient sync gaps, and the openchamber:session-reselected
event (re-select still works through the existing onSessionSelected
callback). The openchamber:chat-force-scroll-bottom event remains for
synthetic-message paths like git-message generation.

Net change: ~1300 lines removed, two hooks replaced with one, one
observer pair instead of four.
2026-05-08 14:20:16 +03:00
Bohdan Triapitsyn e1ff21bc0a feat: add Electron Mini Chat windows (#1161)
Add dedicated Electron Mini Chat windows for focused chat sessions without the full desktop shell. Mini Chat can open existing sessions or draft sessions, supports pinning above other windows, transfers sessions or drafts back to the main window, and deduplicates existing-session windows.

Expose Mini Chat entry points from the main header, session sidebar, command palette, and `mod+alt+n`. Add a dedicated Vite entry and React runtime so the compact surface can stay isolated from full-app chrome while still sharing chat, sync, theme, locale, model, agent, and worktree behavior.

Keep Mini Chat behavior scoped to the compact surface:
- limit assistant/user message actions to the appropriate Mini Chat set
- hide workspace changed-files UI in Mini Chat
- keep draft worktree selection and streaming directory state in sync
- mark sessions viewed while they are open in Mini Chat
- support Mini Chat-specific keyboard shortcuts for input focus, model selection, thinking variant cycling, favorite model cycling, and opening new Mini Chat drafts

Harden Electron integration by gating Mini Chat controls on desktop IPC availability, restricting pin/unpin IPC to Mini Chat windows, and only closing Mini Chat after the main window handoff succeeds.
2026-05-08 12:22:59 +03:00
Bohdan Triapitsyn 8410c41b01 perf: show Electron splash window sooner
Shows the Electron window earlier during startup
Uses the existing splash SVG while the local runtime starts
2026-05-08 00:17:32 +03:00
Bohdan Triapitsyn 686fec7419 release v1.10.2 2026-05-07 23:54:35 +03:00
zerone0xandBohdan Triapitsyn 3fbcdbc3dc fix(quota): stop showing misleading OpenRouter percentages (#1127)
* fix(quota): stop showing misleading OpenRouter percentages

Fixes #1085

* fix(quota): clean up OpenRouter credit labels

---------
Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
2026-05-07 23:39:53 +03:00
Junlang HuangandBohdan Triapitsyn b65edc3436 fix: handle terminal keyboard input on Android tablet (#1133)
* fix: handle terminal keyboard input on Android with desktop UA

- Detect Android via navigator.userAgentData.platform when UA is
  spoofed by Chrome's "Desktop site" mode, so the <input> overlay
  (useTextInput) is used instead of <textarea>.
- Handle Ctrl+letter and Alt+letter combos in the hidden input
  overlay's keydown handler, so terminal control sequences (^C, ^D,
  ^S, M-x, etc.) work through the touch input path.
- Skip global keyboard shortcuts (sidebar toggle, etc.) when focus
  is inside the terminal viewport, preventing shortcut steal.

* fix: preserve terminal keyboard shortcuts

---------

Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
2026-05-07 23:27:37 +03:00
Bohdan Triapitsyn d5b3590901 fix: prevent live chat from snapping to latest
Keeps manual scroll position during active sessions
Avoids forced resume after missing chat data recovery
2026-05-07 23:03:46 +03:00
Bohdan Triapitsyn 0b0bb11d36 fix: clarify conflict and response style prompts
Conflict resolution prompts now ask for an analysis-first strategy
Response style instructions are wrapped as system reminders
Prompt templates stay separate from reminder formatting
2026-05-07 23:03:46 +03:00
Bohdan Triapitsyn 35d95c3044 fix: allow scrolling during streaming
User scroll-up now unpins active chat streaming
Auto-follow no longer snaps back after trusted upward scrolls
2026-05-07 23:03:46 +03:00
Bohdan Triapitsyn 585e2a55f1 fix: suppress inherited subagent notifications
Subagent completion notifications respect notification settings
Permission auto-accept now suppresses notifications for known child sessions
Server notification checks use OpenCode session parent semantics
2026-05-07 23:03:46 +03:00
Bohdan Triapitsyn add73ad687 fix: keep terminal shortcuts working without blanking chat
Terminal toggle shortcuts work while the terminal is focused
Hiding an expanded terminal no longer leaves a blank page
2026-05-07 23:03:46 +03:00
Wenqiang.Xu cb8ea5e6c5 fix: set LANG env for PTY to support UTF-8/Unicode in terminal (#1129) 2026-05-07 23:03:09 +03:00
Bohdan Triapitsyn e892346c6b refactor: stabilize live chat sync materialization (#1132)
Canonicalize session message/part materialization across load, prefetch, reconnect, and recovery paths so OpenChamber restores session snapshots through one consistent merge flow.

Preserve live assistant streaming text when stale or delayed snapshots arrive, while still replacing optimistic user parts with confirmed server snapshots to avoid duplicated user messages.

Narrow recovery triggers to explicit incomplete snapshot signals instead of broad session-event fallbacks, reducing unnecessary session refetches during active streaming.

Keep turn windowing aligned with parented assistant replies and add regression coverage for materialization gaps, stale snapshot protection, optimistic user replacement, reconnect recovery, and turn grouping.
2026-05-07 18:57:44 +03:00
Bohdan Triapitsyn ff830d3812 fix: protect live session sync caches 2026-05-07 12:30:30 +03:00
Bohdan Triapitsyn 07edd6e9b9 fix: stabilize chat turn projection 2026-05-07 12:10:04 +03:00
Bohdan Triapitsyn 4cc2f1bff6 refactor: split vscode into a dedicated app root
Renders VS Code through its own app entrypoint
Keeps shared app effects focused and reusable
Avoids importing the full desktop app root in VS Code
2026-05-07 01:31:17 +03:00
Bohdan Triapitsyn c902dea89e fix: prevent mobile session row action overlap
Hide quick archive action on mobile session rows
Restore mobile row spacing for the existing menu action
2026-05-07 01:13:35 +03:00
Bohdan Triapitsyn d764ad6872 feat: add repository cloning to project setup
Add project can clone repositories into a chosen folder
Command palette now opens the add project flow
Clone flow supports selecting Git identities
2026-05-07 01:10:17 +03:00
Bohdan Triapitsyn fd3557e5c3 feat: improve preview proxy behavior
Sort dev-server false positive preview errors
Improves preview URL rewriting and navigation handling
Syncs app theme into preview iFrames
2026-05-07 00:02:01 +03:00
Bohdan Triapitsyn 8fb6cd1de3 chore: update screenshot references 2026-05-06 23:17:23 +03:00
Bohdan Triapitsyn 633edb27c3 release v1.10.1 2026-05-06 20:03:29 +03:00