Commit Graph
3031 Commits
Author SHA1 Message Date
Bohdan Triapitsyn ea405eafdc fix(mobile): let the keyboard shrink the page on Android browsers
The pre-dvh -webkit-fill-available viewport fix freezes Android Chrome's
root at the pre-keyboard height; when interactive-widget=resizes-content
shrinks the viewport, the document stays taller than the screen and the
clipped composer hides behind the keyboard with no way to scroll to it.
dvh-capable browsers now take a dynamic 100dvh instead, and the legacy
fallback keeps serving browsers without dvh.
2026-08-26 20:24:27 +03:00
𝖎𝖚𝖑𝖎𝖎𝖆 057a4447a3 fix(ui): preserve default in thinking cycle (#3153) 2026-08-26 20:12:01 +03:00
Bohdan Triapitsyn defd0719b7 docs: clarify changelog highlight ordering guidance 2026-08-26 19:58:32 +03:00
Bohdan Triapitsyn 717854d06b refactor: remove aborted status banner from chat UI
Removes the transient aborted banner from the composer status area
Simplifies status row rendering to focus on working state and pending changes
Cleans up unused abort-status localization strings
2026-08-26 19:50:07 +03:00
Bohdan Triapitsyn 340738a33f chore: update changelog entries for chat shortcut and comment text 2026-08-26 19:49:17 +03:00
Bohdan Triapitsyn cb18f8c9af chore: bump @opencode-ai/sdk to 1.18.23 2026-08-26 19:46:23 +03:00
yangyaofei 02ab4136de fix(sync): invalidate bootstrap context when a newer same-directory run starts
## Problem
Review on #3151: with isCurrent reduced to store liveness, a completed
run's context stays current while a forced same-directory rerun starts,
so a late deferred response could commit over the newer run's state.

## Fix
Track a per-directory run sequence. isCurrent captures the sequence at
run start and stays true across settle (deferred recovery pulls still
commit — the original bug) but flips false the moment a newer run for
the same directory begins. Entries are cleared on directory disposal.

## Validation
- New test: after a forced rerun the first context is retired and the
  second is current. 20 pass in child-store.test.ts.
- bun test src/sync/: 540 pass / 15 fail — same 15 pre-existing on main.
- type-check and oxlint clean on authored lines.
2026-08-27 00:30:39 +08:00
Bohdan Triapitsyn c4df01f707 chore(quota): drop the Command Code usage provider
Command Code's official API has no usage endpoints; the old usage source
was the unofficial studio API reached through a now-archived plugin, so
the tile could only ever fail for officially configured users. Removed
across server, shared UI, and the VS Code extension; the provider logo
fallback stays — it serves the model picker, not usage.
2026-08-26 19:29:04 +03:00
yangyaofei cab2f9adf3 fix(sync): keep bootstrap context live for deferred recovery pulls
## Problem
Pending permission requests (and questions, MCP/LSP/VCS status) vanish
permanently after a page reload. The deferred recovery phase in
bootstrapDirectory — the code that re-pulls permission.list after load —
never executed, so the UI had no way to re-render a card for a request
the opencode server still holds. Fixes #3150.

## Root cause
The deferred phase is scheduled via setTimeout(0) guarded by isStale(),
which maps to the pump's isCurrent(). isCurrent required the run token
to still be present in runningBootstraps, but the pump deletes that
token in .finally() as soon as onBootstrap settles — always before the
setTimeout macrotask fires. The guard was therefore deterministically
stale and the phase was dead code (introduced by 85400459).

## Fix
Make isCurrent a store-liveness check — disposed, generation, and store
identity — instead of run-token ownership. The pump never replaces a
running entry for the same directory (queueBootstrap defers via
rerunRequested), so during the run itself this is equivalent. This
mirrors the existing isCurrent contract in session-message-loader.ts.

## Validation
- New regression test in child-store.test.ts fails on main and passes
  with the fix (isCurrent stays true across the post-settle macrotask,
  flips false after teardown).
- bun test src/sync/: 539 pass / 15 fail — the same 15 fail on pristine
  main; the only delta is the new passing test.
- bun run type-check (packages/ui): pass.
- bunx oxlint on both changed files: no findings on authored lines.
2026-08-27 00:21:43 +08:00
Bohdan Triapitsyn 067c6caf0c refactor(chat): slim the selection menu down to comment and notes
Add to input leaves the desktop menu (mod+L owns it; mobile keeps the
button) and the New session action is gone from both variants along with
its handler and dead locale keys.
2026-08-26 19:17:55 +03:00
Bohdan Triapitsyn 4020226984 docs: tighten changelog bullets and normalize contributor credits 2026-08-26 19:11:33 +03:00
Bohdan Triapitsyn fc21ad5e9c docs: headline session tabs instead of the auth-expiry fix 2026-08-26 18:59:52 +03:00
Bohdan Triapitsyn 3f38624850 docs: reorder and tighten the unreleased changelog 2026-08-26 18:58:20 +03:00
Bohdan Triapitsyn b11bace75b docs: add changelog entries for the rail configurator and chat fixes 2026-08-26 18:48:10 +03:00
Nimo Beeren 9717fc5a54 fix(ui): cycle through all thinking variants (#2848) 2026-08-26 18:46:22 +03:00
Bohdan Triapitsyn edec60faff fix(github): stop fork remotes from claiming the local branch's PR badge
PR-status source candidates were every configured remote, so a checkout
carrying contributor forks matched a fork's closed PR whose head merely
shared the branch name — a fork's 'main' surfaced on the local main in the
git and work-status panels. Only the ranked-first remote (the one the
branch pushes to) and its fork network are PR sources now; other remotes
remain search targets but their owner:branch heads no longer count.
2026-08-26 18:40:34 +03:00
Bohdan Triapitsyn 098034dc33 fix(desktop): stop windows from adopting each other's active project
Every window shares one server settings document, and every PUT returns the
merged whole, so one window's activeProjectId write was adopted by the
other on its next unrelated settings save — its sidebar then auto-selected
a session in that project and wrote the pointer back, converging both
windows onto one session. settings-synced now carries an adoptWorkspace
flag: only bootstrap-grade syncs (startup, runtime switch) may adopt the
shared workspace pointers; reconcile responses keep the window's own active
project while it exists. Notification clicks and session deep links also
stopped broadcasting the session switch to every window.
2026-08-26 18:36:50 +03:00
Bohdan Triapitsyn f7a006dc6a feat(auth): detect session expiry live and offer re-login in place
Every response already funnels through runtimeFetch, so a classifier there
spots 401s, confirms them against /auth/session (a proxied provider 401
must not read as a logout), and flips a small auth-session store. The web
and hosted surfaces show a frosted banner under the header whose Log in
button hands off to the session gate's existing unlock flow; sends are
paused while expired, the session-load error screen explains the auth case
and retries itself after login, and returning to a long-idle window
revalidates once via visibility/focus. Native mobile feeds the same signal
into its connection re-probe instead of showing the banner; VS Code is
exempt.
2026-08-26 18:22:04 +03:00
Alan ShumandIuliia Ivashko 5612849bd7 fix(i18n): correct Ukrainian session grammar (#2984)
* fix(i18n): correct Ukrainian session declension

* fix(i18n): complete Ukrainian session declension

* fix(i18n): correct Ukrainian active session agreement

* chore: remove translation fix from changelog

---------

Co-authored-by: Iuliia Ivashko <yulia.ivashko@gmail.com>
2026-08-26 17:33:31 +03:00
Alexandre Reyes Martins 8ea94a119f fix: restore baseline validation (#3142) 2026-08-26 17:15:49 +03:00
Bohdan Triapitsyn 27377efaf3 fix(chat): return the typed prompt to the input on any send failure
The failure handler restored the text only for a new-session draft; a
regular session kept its attachments but lost the prompt to a toast. The
restore now runs before any cause-specific branching: an unchanged composer
gets the text (and the session draft) back, new typing gets the failed
prompt appended instead of clobbered, and a mid-send session switch writes
it into the originating session's persisted draft.
2026-08-26 17:10:05 +03:00
Jakub Syty 7f6eda8ad8 Merge branch 'openchamber:main' into github-usage-rework 2026-08-26 16:02:15 +02:00
Bohdan Triapitsyn ba3a604e9e fix(chat): offer the scroll pill when growth leaves the reader behind
With streaming auto-follow off nothing moves the viewport, so a growing
reply slides below the composer without a single scroll event and the
at-end transition that shows the pill never fires. Content growth now
doubles as the signal: once the measured last row extends past the visible
area by the follow re-arm threshold, the end state clears and the pill is
scheduled.
2026-08-26 16:49:21 +03:00
Bohdan Triapitsyn 087c148b2e fix(chat): rescue stranded viewports and settle navigation jumps
Opening a session (or any relayout that shrinks off-screen size estimates)
could leave the viewport in a phantom tail below the measured content, with
every row out of reach above; a totalSize-change check now detects the
fully blank viewport and returns to the real end, and settling a width
resize re-asserts the end for a reader who was on it. Prompt-rail and
message jumps land on estimated offsets that shift as the target mounts and
measures; a short settle loop now re-aligns the target until layout rests,
backing off on the first user gesture.
2026-08-26 16:42:42 +03:00
Bohdan Triapitsyn 2e49e44205 feat(ui): let users hide context rail surfaces
A trailing configure button on the rail — outside the sortable list and the
digit shortcuts — opens a dialog that toggles each surface. The choice is
stored as the hidden set so newly added surfaces appear for everyone, and
the rail and the mod+alt+digit switcher share the same visibility filter, so
badges and shortcuts always agree. Hidden surfaces keep their data and stay
reachable from the command palette.
2026-08-26 16:18:15 +03:00
Bohdan Triapitsyn f2ec9b1003 feat(ui): add session history navigation, permission keys, and review shortcuts
mod+alt+arrows step through this window's session-open history (or between
neighbouring tabs when session tabs are on), mod+k r renames the current
session inline, and mod+k a toggles permission auto-accept. Pending
permission cards respond to alt+enter / alt+shift+enter / alt+backspace with
the keys printed on the buttons. The commit message box commits on
mod+enter, alt+arrows step the diff review between changed files, and the
command palette gains search-only commands for rare actions so the initial
list stays short.
2026-08-26 15:46:44 +03:00
Jakub Syty c3cb9ca157 Merge remote-tracking branch 'origin/github-usage-rework' into github-usage-rework 2026-08-26 14:00:20 +02:00
Jakub Syty 06a72fed3b Merge branch 'openchamber:main' into github-usage-rework 2026-08-26 13:58:58 +02:00
Jakub Syty 1459b4b360 Adjust for unlimited plan option 2026-08-26 13:58:31 +02:00
Bohdan Triapitsyn 7977842e1e feat(ui): redesign the default shortcut layout around a mod+k leader
Single chords stay for everyday actions; open/go actions move to two-step
mod+k sequences; held mod+digit switches header session tabs and held
mod+alt+digit switches context panel surfaces. Rare actions leave the
shortcut schema for the command palette, every remaining action ships with
a default binding, and stored overrides from the old layout reset once.
Key matching now follows the physical key on non-Latin layouts and for
Option-modified digits on macOS, including in the recording dialog.
2026-08-26 14:52:31 +03:00
Bohdan Triapitsyn 76f977e580 docs: add changelog entries for the centralized shortcut registry 2026-08-26 12:30:48 +03:00
Bohdan Triapitsyn 3a3e719829 Merge pull request #2532 from ChangeHow/feature/shortcut-registry-prefix
feat(ui): centralize shortcuts and add prefix sequences
2026-08-26 12:30:03 +03:00
Bohdan Triapitsyn c09d42760c Merge the centralized shortcut registry onto current main
Lands the shortcut core from this branch on top of current main with review
fixes (close_session_tab support, prefix typing guard, broadened risky-binding
checks) and re-applies every surface migration against the code that moved
since the branch point.
2026-08-26 12:29:15 +03:00
Igor Velho 948f782244 Merge upstream main into feat/subagent-cost-rollup 2026-08-26 09:28:08 +01:00
Bohdan Triapitsyn e904abb794 fix(ui): drop the dead switch_tab actions that collided with surface switching 2026-08-26 11:17:33 +03:00
Bohdan Triapitsyn 94f6b5fd38 feat(ui): migrate all shortcut surfaces to the centralized registry 2026-08-26 10:59:04 +03:00
Bohdan Triapitsyn f1c3870909 feat(ui): land the centralized shortcuts core from #2532 with review fixes
The schema/config/bindings/registry/dispatcher module, useKeybind hooks,
recording dialog, reworked shortcuts settings page, help dialog, and the
localized action labels — re-based onto current main rather than merged
(the branch predates 440+ commits including the session-tabs shortcuts).

Review fixes applied on top of the original:
- close_session_tab (alt+w) joins the schema with labels in every locale;
  it shipped on main after the PR's base and would otherwise silently die.
- switch_context_surface's special-case in conflict resolution is now a
  declared prefixStyle config property instead of a magic id string.
- Duplicate handler registration warns in dev builds.
- The risky-browser-shortcut warning inspects every chord and covers
  mod+q/d/h/j/o/u plus mod+shift+w/q.
- The dispatcher remembers which target armed a two-chord prefix so the
  window-level completion handler can distinguish a deliberate sequence
  from typing in an editable field (guard lands with the dispatch hook).
- Schema tests: unique normalized default bindings enforced, and the
  flat-file-era override format proven to keep resolving.
2026-08-26 10:47:44 +03:00
Bohdan Triapitsyn 428854fd78 refactor(sync): replace the session-status setState monkeypatch with an owned API
The global session-status store patched its own setState to derive
active membership for callers replacing statusById — a boundary that
silently trusted any caller passing both fields to keep them consistent.
replaceGlobalSessionStatusById is now the one sanctioned way to swap the
map from outside the event reducers; the runtime-switch reset and the
tests that replaced the map directly go through it, and the patch is
gone. Follow-up to #3126 review.
2026-08-26 03:13:21 +03:00
Bohdan Triapitsyn 8d8d389294 docs(vscode): changelog for the resilient webview connection status (#2997) 2026-08-26 02:43:35 +03:00
Bohdan Triapitsyn 1d16a5e2f4 docs: changelog for the resilient VS Code webview connection status (#2997) 2026-08-26 02:43:17 +03:00
Bohdan Triapitsyn a29d3ac5c2 Merge pull request #2997 from VinciYan/fix/connection-status-resend
fix: resend connectionStatus at staggered delays to prevent stuck loading screen on slow networks
2026-08-26 02:43:00 +03:00
Bohdan Triapitsyn cc0abad9af refactor(vscode): share the cached-state retry schedule across providers
The staggered re-send lived as three near-identical private methods in
the chat view, agent manager, and session editor providers. One helper
now owns the delays, the connected gate, and the replaced-target guard;
the providers keep thin wrappers over their own panel/view identity.
Also restores the package.json trailing newline the branch dropped.
2026-08-26 02:42:47 +03:00
Bohdan Triapitsyn 8638b8abcd Merge branch 'main' into pr2997-integration 2026-08-26 02:40:48 +03:00
Bohdan Triapitsyn efb985f3a7 docs: changelog for virtualized large file previews (#3061) 2026-08-26 02:26:50 +03:00
Bohdan Triapitsyn 0b1ebbdd78 Merge pull request #3061 from gaojunran/pr1-large-file-preview
feat(ui): virtualize large file preview in FilesView
2026-08-26 02:26:34 +03:00
Bohdan Triapitsyn f0b1c889f0 Merge main into pr1-large-file-preview
The floating editor toolbar this branch was based on was removed on main
(the toolbar is always docked now); the file-view region resolves to
main's structure with this branch's virtualizer-bound ScrollableOverlay.
2026-08-26 02:26:20 +03:00
Bohdan Triapitsyn 9cb9b0f91b docs: changelog for the bounded OpenCode read timeout (#2969) 2026-08-26 02:23:57 +03:00
Bohdan Triapitsyn b4c22815b4 Merge pull request #2969 from herjarsa/fix/opencode-read-timeout-2470
fix(ui): bound OpenCode read requests so half-open sockets cannot freeze bootstrap (#2470)
2026-08-26 02:23:41 +03:00
Bohdan Triapitsyn 79b726451d Merge main and keep the read timeout armed without AbortSignal.any
When the caller passes its own AbortSignal and AbortSignal.any is
unavailable, the timeout was silently dropped — disabling the fix on
exactly the bootstrap reads it targets, since those carry a cancellation
signal. Compose the two signals manually through an AbortController in
that case; listeners detach when the request settles.
2026-08-26 02:23:21 +03:00
Bohdan Triapitsyn 90b6776e5b Merge branch 'main' into pr2969-integration 2026-08-26 02:22:29 +03:00