Commit Graph
3292 Commits
Author SHA1 Message Date
Bohdan Triapitsyn 5c2e3a6955 feat(directory-explorer): show success toast after batch project add 2026-08-29 00:50:22 +03:00
Bohdan Triapitsyn e13f27c1a3 Merge remote-tracking branch 'origin/main' into port-2884
# Conflicts:
#	CHANGELOG.md
2026-08-29 00:49:02 +03:00
Bohdan Triapitsyn 7052d94c2a Merge remote-tracking branch 'origin/main' into port-2877
# Conflicts:
#	CHANGELOG.md
2026-08-29 00:48:50 +03:00
Bohdan Triapitsyn 55ae41bde2 Merge remote-tracking branch 'origin/main' into port-2872 2026-08-29 00:48:36 +03:00
Bohdan Triapitsyn 11d2b69651 fix(ui): complete context tab menu icons 2026-08-29 00:41:57 +03:00
Angel Davila a78ecf8a7c feat(ui): add right-click close menu for context panel tabs (#3217)
Resolves openchamber/openchamber#3123.

The right panel's tab strip (browser, files, chat, and other
multi-instance surfaces) now supports a right-click context menu with
Close, Close others, Close to the left, Close to the right, and Close
all. These act on the current surface's tabs and reuse the new bulk
close action, so closing the active surface's last tab still closes the
panel while other surfaces remain.

- Add closeContextPanelTabs(directory, ids) to useUIStore
- Add opt-in tabContextMenu prop to SortableTabsStrip (no impact on other consumers)
- Wire the menu in ContextPanel with full i18n coverage across 11 locales
- Cover the bulk close with store tests
2026-08-29 00:35:24 +03:00
Bohdan Triapitsyn cbe908009b chore: changelog entries for the second contribution batch
Claude-Session: https://claude.ai/code/session_017TK5JAYDfT3Fotc23UEg98
2026-08-29 00:31:49 +03:00
Bohdan Triapitsyn d557c168de feat(ui): attach large text pastes as virtual files (#2619)
feat(ui): attach large text pastes as virtual files
2026-08-29 00:31:04 +03:00
Bohdan Triapitsyn ef0755da8b fix(sync): settle completed turns and finished messages promptly (#2667)
fix(sync): settle completed turns and finished messages promptly
2026-08-29 00:30:01 +03:00
Bohdan Triapitsyn 6b17c0b4e2 chore(ui): finish large text paste merge into main
Adds the Turkish dictionary entries main introduced after this branch was
opened, keeps the composer's four-space style in the new paste modules,
and drops the unused offer-action type plus the widening return
annotation flagged by the anti-slop lint.
2026-08-29 00:30:01 +03:00
Bohdan Triapitsyn 10634c4512 fix(sync): settle completed turns and finished messages promptly
A lost or delayed turn-ending `session.idle` left the busy spinner up until
the watchdog poll caught it (5-10s). An assistant `message.updated` carrying
`time.completed` now schedules one status check for that session, and
`streaming.ts` stops treating a completed trailing message as streaming.

The check is deferred by 750ms and re-reads the session status when the timer
fires, so the overwhelmingly common case — the turn's own `session.idle`
arriving right behind the completed message — settles on its own and costs
zero extra requests; only a session the store still believes busy spends a
fetch. The poll shares the watchdog's in-flight directory guard, so the
deferred check and the periodic poll cannot overlap on one directory.
Status authority is unchanged: the monotonic pass never lowers status, and an
authoritative resync runs only when the snapshot disagrees.
2026-08-29 00:29:42 +03:00
Bohdan Triapitsyn 15ff5c750e fix(chat): show context text before a pending question (#2655)
fix(chat): show context text before a pending question
2026-08-29 00:27:21 +03:00
Bohdan Triapitsyn 5fd86a420d fix(chat): match question tool name exactly
Use an exact-match comparison for the question tool name instead of
toLowerCase(), matching the convention used elsewhere in this file.
2026-08-29 00:27:06 +03:00
Bohdan Triapitsyn 63755a8e45 Merge remote-tracking branch 'origin/main' into port-2619
# Conflicts:
#	packages/ui/src/components/sections/openchamber/OpenChamberVisualSettings.tsx
2026-08-29 00:26:49 +03:00
Bohdan Triapitsyn 5c26c6ae21 Merge remote-tracking branch 'origin/main' into port-2667 2026-08-29 00:26:15 +03:00
Bohdan Triapitsyn 340e20f996 Merge remote-tracking branch 'origin/main' into port-2655 2026-08-29 00:25:56 +03:00
Bohdan Triapitsyn ddc8ab91d9 chore: consolidate the unreleased changelogs by theme
Claude-Session: https://claude.ai/code/session_017TK5JAYDfT3Fotc23UEg98
2026-08-28 23:59:10 +03:00
Bohdan Triapitsyn 635c24e396 chore: changelog entries for the merged contribution batch
Claude-Session: https://claude.ai/code/session_017TK5JAYDfT3Fotc23UEg98
2026-08-28 23:55:32 +03:00
Bohdan Triapitsyn 2a5a25d5a2 fix(small-model): harden configured headers 2026-08-28 23:50:04 +03:00
Bohdan Triapitsyn 46284301b8 fix(ui): add in-document search to the Markdown file preview (#2697)
fix(ui): add in-document search to the Markdown file preview
2026-08-28 23:48:56 +03:00
Bohdan Triapitsyn 2e9fd75925 fix(ui): prevent Shiki template-call OOM on backtick JS files (#2618)
fix(ui): prevent Shiki template-call OOM on backtick JS files
2026-08-28 23:48:37 +03:00
Bohdan Triapitsyn e47d87c3d6 feat(ui): add in-document search to the Markdown file preview
Ctrl/Cmd+F (and a toolbar button) opens a compact find bar over the
rendered Markdown preview, with match highlighting, a live count, and
next/previous navigation that scrolls the current match into view.
Escape closes the bar and returns focus where it was.

Merge follow-ups on top of the contribution: mount the bar in the
fullscreen viewer as well as the inline preview, combine it with the
FilePreviewCommentMenu wrapper that landed on main, debounce the
highlight pass so typing does not re-walk the whole document on every
keystroke, use the status-warning theme utilities instead of raw CSS
variables for the highlights, and add the Turkish strings for the
locale added after the branch was cut.

Closes #2401
2026-08-28 23:48:35 +03:00
Bohdan Triapitsyn b6e78fbed5 fix(ui): stop shiki template-call backtracking from OOMing the renderer
Shiki's bundled JS/TS/JSX/TSX grammars carry a `template-call` rule whose
triple-nested lookahead sends the Oniguruma WASM engine into exponential
backtracking on ordinary backtick templates. The WASM heap grows until the
renderer runs out of memory and the window goes black.

Strip `template-call` from those four grammars as they are loaded in the
Shiki worker. Plain backticks and simple tagged templates still highlight;
only the rare `ident<TypeArgs>` tagged-template form loses its specialized
type-argument coloring.

Add a 5s per-request budget on the worker client as a safety net for any
other pathological pattern. Matching is synchronous inside the worker, so
the only way to reclaim its heap is to terminate it from the main thread.
A timed-out request resolves `null` like any other failure, so the caller
keeps plain text and nothing is written to the result cache.

Closes #2587
2026-08-28 23:48:15 +03:00
Bohdan Triapitsyn 08fe004b83 fix(chat): render completed reasoning in full instead of simulating streaming (#2736)
fix(chat): render completed reasoning in full instead of simulating streaming
2026-08-28 23:46:49 +03:00
Bohdan Triapitsyn 49ca62a8a2 fix(sidebar): keep permission badge and hover actions from overlapping (#2738)
fix(sidebar): keep permission badge and hover actions from overlapping
2026-08-28 23:46:43 +03:00
Bohdan Triapitsyn 88812e791a fix(chat): clamp text selection menu Y position to the viewport (#2733)
fix(chat): clamp text selection menu Y position to the viewport
2026-08-28 23:46:33 +03:00
Bohdan Triapitsyn e64fc710fc fix(chat): render completed reasoning in full instead of simulating streaming
Reasoning streaming state now derives only from the live stream phase
(streaming/cooldown), never from missing persisted timing data. A cached
part without time.end is no longer treated as live just because the
timing field is absent, so completed reasoning renders in full on load
instead of replaying a fake stream.

While resolving the merge onto main, also fixed a regression the merge
uncovered: main had added block-level streaming reveal (commitStreamedText)
to ReasoningPart since this fix was authored, which caused the busy
"Thinking…" header to stay hidden for the first moments of a short,
single-paragraph streaming response (no committed line yet). The busy
header now mounts as soon as streaming starts, independent of whether
any text has been committed for display.

Closes #2020
2026-08-28 23:46:14 +03:00
Bohdan Triapitsyn 627add0dd0 fix(chat): clamp text selection menu Y position to the viewport
Selecting text that crosses the top scroll edge could push the
floating selection menu above the viewport because only the X
position was clamped, not Y. Add getDesktopClampedY alongside the
existing X clamp in selectionMenuPosition.ts, measure the menu's
height the same way its width is measured, and re-clamp Y in
showMenu, the layout effect, and the resize handler.

Ported by hand: TextSelectionMenu.tsx changed significantly on main
(comment mode, glass surfaces, header drag-zone push-down) since this
fix was written, so main's file was kept and the fix re-applied on
top of it.

Closes #2257
2026-08-28 23:46:12 +03:00
Dmitrii 3903cb53b1 fix(small-model): send configured provider headers (#3214)
readProviderConfig read only options.baseURL and options.apiKey, and the
OpenAI-compatible dispatch hardcoded a bearer token, so provider
options.headers never reached the request. OpenCode sends those headers on
every chat turn, which left the small model authenticating differently from
the request path against the same URL.

Providers behind a gateway that authenticates on its own header, such as the
Ocp-Apim-Subscription-Key default of Azure API Management, answered 401 for
walkthroughs, session goal audits, titles and commit summaries while the same
model worked in chat.

Read options.headers alongside the API key, resolve {env:...} and {file:...}
in the values with the existing resolveConfigApiKey, and merge them into the
request after the bearer default so a gateway whose header is the credential
can override it.

Closes #3213
2026-08-28 23:46:05 +03:00
Bohdan Triapitsyn 8bd4995b8b fix(chat): do not hijack ctrl/cmd+digit while typing in an input (Fixes #2503) (#2689)
fix(chat): do not hijack ctrl/cmd+digit while typing in an input (Fixes #2503)
2026-08-28 23:45:57 +03:00
Bohdan Triapitsyn 507c9cad54 feat(sidebar): show compact timestamp in recent activity rows (#2684)
feat(sidebar): show compact timestamp in recent activity rows
2026-08-28 23:45:49 +03:00
Bohdan Triapitsyn 6a80882d72 fix(chat): ignore Ctrl/Cmd+digit surface switching while typing in an input
The Ctrl/Cmd+digit shortcut for switching context surfaces fired even
while the user was typing in an editable target (input, textarea,
select, or contenteditable element), hijacking the keystroke. Guard the
switchSurfaceDigit branch in useKeyboardShortcuts with the existing
isEditableEventTarget helper, matching how other shortcuts in the same
hook already bail out of editable targets.

Closes #2503
2026-08-28 23:45:41 +03:00
Bohdan Triapitsyn 1b58b54f29 fix(sidebar): show compact timestamp in recent activity rows
The Recent list's metadata slot only opened for activity duration, a
goal glyph, or a branch marker, so plain rows fell back to hover-only
or touch-only timestamps. Extend the slot guard to also open for
renderContext === 'recent' and render the compact timestamp inline,
mirroring the existing touch-only branch.

Closes #2560
2026-08-28 23:45:30 +03:00
Bohdan Triapitsyn 44439c2795 fix(settings): let fixed-width controls scale with font size and density (#2739)
fix(settings): let fixed-width controls scale with font size and density
2026-08-28 23:45:27 +03:00
Bohdan Triapitsyn e0869efeb0 Merge remote-tracking branch 'origin/main' into port-2738
# Conflicts:
#	packages/ui/src/components/session/sidebar/DOCUMENTATION.md
#	packages/ui/src/components/session/sidebar/sessions/SessionNodeItem.tsx
#	packages/ui/src/components/session/sidebar/sessions/sessionNodeItemUtils.test.ts
2026-08-28 23:45:25 +03:00
Bohdan Triapitsyn ebb7f07532 fix(server): forward Small Model override to managed OpenCode config (#2687)
fix(server): forward Small Model override to managed OpenCode config
2026-08-28 23:45:21 +03:00
Bohdan Triapitsyn 5332d124a6 fix(settings): let fixed-width controls scale with font size and density
Merge main and resolve conflicts in RemoteInstancesPage.tsx (re-applied
the width bumps by hand at their current locations) and
KeyboardShortcutsSettings.tsx (dropped the PR's hunk entirely: main
replaced that fixed-width input with ShortcutRecordingDialog, which has
no equivalent clipping at 200% interface font size).

Closes #2320
2026-08-28 23:45:12 +03:00
Bohdan Triapitsyn ac1881fab7 fix(server): forward Small Model override to managed OpenCode config
The Small Model override chosen in Settings never reached the managed
OpenCode process config, so OpenCode's own title/summary generation
kept using its fallback chain instead of the user's explicit choice
and sessions stayed untitled.

Merge main into this branch to pick up the includeWeb/includeMemory
flags added to prepareManagedOpenCodeEnv, and re-apply the Small
Model injection on top of that current env shape in
getManagedOpenCodeEnv (server/index.js).

Closes #2497
2026-08-28 23:45:04 +03:00
Bohdan Triapitsyn ea0a01a046 fix(sidebar): make file tree rows reliably clickable (#2737)
fix(sidebar): make file tree rows reliably clickable
2026-08-28 23:44:45 +03:00
Bohdan Triapitsyn 69b39db427 fix(sidebar): make file tree rows reliably clickable
On macOS trackpads, a light touch on a file/folder row can start a
native HTML5 drag after ~4px of movement, and Chromium then swallows
the resulting click. Track the drag start position and, on dragend,
treat a micro-drag (dropEffect 'none' and under 8px of travel) as the
click the gesture was meant to be.

Reconciled with main's OS file drag-drop upload handlers on the same
rows: kept onDrop/onDragOver/hasExternalFiles for external file
uploads, and wired the new click-recovery logic alongside it on both
the file tree row and the search-results row. Dropped the row's
cursor-grab/active:cursor-grabbing classes, since these rows are not
meant to read as draggable to the user.

Closes #2368
2026-08-28 23:44:27 +03:00
Bohdan Triapitsyn 52fc1fb25d merge main 2026-08-28 23:44:00 +03:00
Bohdan Triapitsyn 14ca125b5d Merge remote-tracking branch 'origin/main' into port-2736
# Conflicts:
#	packages/ui/src/components/chat/message/parts/ReasoningPart.tsx
2026-08-28 23:43:20 +03:00
Bohdan Triapitsyn 8a82bbaf21 fix(ui): complete VS Code bootstrap detection for directory startup (#2359) (#2462)
fix(ui): complete VS Code bootstrap detection for directory startup (#2359)
2026-08-28 23:41:34 +03:00
Bohdan Triapitsyn 5a0a9af8e3 fix(chat): keep sticky header gradient inside its padding (#2676)
fix(chat): keep sticky header gradient inside its padding
2026-08-28 23:41:25 +03:00
Bohdan Triapitsyn d8737d397d fix(ui): keep the selected model when switching agent modes (#2690)
fix(ui): keep the selected model when switching agent modes
2026-08-28 23:41:16 +03:00
Bohdan Triapitsyn 1f7b7f8a16 fix(settings): flush pending debounced settings writes on page unload (#2734)
fix(settings): flush pending debounced settings writes on page unload
2026-08-28 23:41:07 +03:00
Bohdan Triapitsyn 9e5890729c fix(git): include remote-only branches from ls-remote in branch lists (#2735)
fix(git): include remote-only branches from ls-remote in branch lists
2026-08-28 23:40:58 +03:00
Bohdan Triapitsyn f10fc5ffab fix(git): make post-mutation status refresh authoritative (#2740)
fix(git): make post-mutation status refresh authoritative
2026-08-28 23:40:49 +03:00
Bohdan Triapitsyn ae6a7fa826 chore: changelog entry for bounded shell probes
Claude-Session: https://claude.ai/code/session_017TK5JAYDfT3Fotc23UEg98
2026-08-28 23:25:01 +03:00
Bohdan Triapitsyn 8d44e5e561 fix(server): bound login-shell probes so a slow rc file cannot stall startup (#1742)
fix(cli): detect brew-installed opencode on macOS (#1720)
2026-08-28 23:23:27 +03:00