Commit Graph
3381 Commits
Author SHA1 Message Date
Bohdan Triapitsyn 285c63e238 Merge pull request #1946 from divyam234/fix/theme-runtime-symlink-themes
fix: load symlinked custom themes
2026-08-28 01:22:52 +03:00
Bohdan Triapitsyn 5c03a2a6a7 Merge pull request #2880 from franzudev/fix/markdown-fence-caret
fix(composer): keep caret inside completed fence
2026-08-28 01:22:45 +03:00
Bohdan Triapitsyn 27be3f3193 Merge pull request #3038 from colinmollenhour/bug/Fix-External-OpenCode-Host-Recovery
fix(opencode): preserve external host during recovery
2026-08-28 01:22:23 +03:00
Bohdan Triapitsyn ce61646b27 Merge pull request #2510 from IbrahimKhan12/fix/2504-composer-double-space-period
fix: keep the composer's autocorrect on where the platform provides one
2026-08-28 01:22:16 +03:00
Bohdan Triapitsyn c3f3c5aeb7 Merge pull request #3040 from gaojunran/fix/cjk-markdown-links
fix(markdown): keep CJK/fullwidth punctuation out of bare-URL autolinks
2026-08-28 01:22:11 +03:00
Bohdan Triapitsyn d4e6bff056 Merge pull request #2987 from bashrusakh/fix/2476-vscode-model-menu-hover
fix(vscode): pair selection foreground with highlight in model picker
2026-08-27 23:17:22 +03:00
Bohdan Triapitsyn 87eacc4c5e Merge main 2026-08-27 23:17:06 +03:00
Bohdan Triapitsyn 054f7b1fca Merge pull request #3170 from gaojunran/fix/raise-open-file-line-limit
fix(ui): raise file open line limit to 20k lines
2026-08-27 23:16:44 +03:00
Bohdan Triapitsyn 8663411fdd Merge main 2026-08-27 23:16:29 +03:00
Bohdan Triapitsyn 78457611e4 Merge pull request #1890 from a0000001/fix/win-process-tree-kill
fix: kill process tree on Windows via taskkill before SIGTERM fallback
2026-08-27 23:15:45 +03:00
Bohdan Triapitsyn 64f3f46d93 Merge pull request #1957 from bketelsen/fix/sw-notificationclick-focus
fix(pwa): focus existing window on notification click
2026-08-27 23:15:39 +03:00
Bohdan Triapitsyn 3d8b801d52 Merge pull request #2120 from herjarsa/fix/chat-anchor-save-race
fix(chat): save previous-session anchor in microtask with bail check
2026-08-27 23:15:33 +03:00
Bohdan Triapitsyn ef51b95749 Merge pull request #2171 from greghaynes/clever-heron
fix(web): shorten PWA install app name
2026-08-27 23:15:26 +03:00
Bohdan Triapitsyn eac661de57 Merge pull request #2310 from Silvenga/feat/android-user-ca-trust
feat: allow user CA's when validating server's certs under android
2026-08-27 23:15:19 +03:00
Bohdan Triapitsyn 7b0d5b2ce2 Merge pull request #2610 from TTTPOB/fix/composer-empty-caret
fix(ui): keep empty composer caret visible
2026-08-27 23:15:12 +03:00
Bohdan Triapitsyn 2e76f04131 Merge pull request #2613 from TTTPOB/fix/vscode-reuse-manager-output-channel
fix(vscode): reuse manager output channel across restarts
2026-08-27 23:15:05 +03:00
Bohdan Triapitsyn 5da564df81 Merge pull request #2639 from weixiang1862/fix/add-project-browse-added-directory
fix(ui): allow entering already-added directories in the add-project picker
2026-08-27 23:14:59 +03:00
Bohdan Triapitsyn fb9306745e Merge pull request #2774 from IngTian/fix/omit-thinking-config-non-reasoning
fix(small-model): omit thinkingConfig for non-reasoning Google models
2026-08-27 23:14:53 +03:00
Bohdan Triapitsyn 2396510a14 Merge pull request #2817 from Dawnfz-Lenfeng/fix/init-command-always-available
fix(ui): always show /init command in autocomplete
2026-08-27 23:14:46 +03:00
Bohdan Triapitsyn f721d4aae3 Merge pull request #2891 from Ttungx/fix/skill-visibility-windows-paths
fix(ui): normalize Windows paths in skill visibility filtering
2026-08-27 23:14:40 +03:00
Bohdan Triapitsyn 413b7b5e58 Merge pull request #2971 from rvaldemar/fix/chat-input-no-model-toast
fix(chat): show visible error toast when no provider or model is selected
2026-08-27 23:14:33 +03:00
Bohdan Triapitsyn af1706c6a7 Merge pull request #2995 from bashrusakh/fix/2763-opencode-binary
fix(server): keep env-provided OPENCODE_BINARY when settings clear the override
2026-08-27 23:14:10 +03:00
Bohdan Triapitsyn 50d97a78e5 Merge pull request #3051 from pascalandr/fix/3046-editor-font-size-persistence
fix(settings): persist editor font size
2026-08-27 23:14:04 +03:00
Bohdan Triapitsyn d537d58dd7 Merge pull request #3052 from pascalandr/fix/2788-truncated-diff-crash
fix(chat): handle truncated diff headers
2026-08-27 23:13:57 +03:00
Bohdan Triapitsyn a2f55df211 Merge pull request #3066 from gaojunran/fix/branch-base-created-from-head
fix(git): don't treat bare HEAD as a branch diff base
2026-08-27 23:13:50 +03:00
Bohdan Triapitsyn 8d98ba3826 Merge pull request #3104 from fitzgpt/fix/non-ascii-directory-header
fix(server): percent-encode non-ASCII directory headers to OpenCode
2026-08-27 23:13:44 +03:00
Bohdan Triapitsyn f60d56c423 Merge pull request #3168 from AyoubAchour/fix/cloudflared-download-link
fix(tunnels): update cloudflared download link
2026-08-27 23:13:17 +03:00
Pascal André 03a76c9de0 fix(chat): rearm follow after returning to end 2026-08-27 21:51:10 +02:00
Pascal André 9b2d02c3a7 fix(chat): preserve explicit scroll release intent 2026-08-27 21:36:00 +02:00
Bohdan Triapitsyn 43c4cc625f fix(ui): open saved plans against their owning project
Saved Project knowledge plans opened as an empty editor whenever the
viewer could not resolve the owning project from the current directory:
managed chats (openchamber:chats is not a registered project), worktrees
outside the repo path, and plan tabs restored after a reload. Titles
still rendered because the list reads the manifest through the correct
owner.

- Thread the owner explicitly (savedProjectPlan = { projectRef, planId })
  from the panel, mobile surfaces, and persisted context tabs; PlanView
  no longer guesses the project.
- An unrecognized directory resolves to no owner instead of borrowing
  the active project's knowledge.
- Serialize plan writes per document (planSaveQueue) so close/switch
  within the autosave debounce no longer drops the last edits, saves
  cannot land out of order, and a recovered save clears the error banner.
- Send saved-plan contents inline in Improve/Implement prompts (they
  have no file path); disable those actions for managed-chat plans,
  which have no project directory to create a session in.
- Drop persisted plan tabs that carry an id without an owner rather than
  reopening them against a guessed project.
2026-08-27 20:18:12 +03:00
Bohdan Triapitsyn 03f4b5e3e0 fix(ui): scope agent memory to project context owner 2026-08-27 20:18:12 +03:00
ChangeHowandIuliia Ivashko 7aae5a6634 fix: preserve Markdown blocks when copying messages (#2944)
* fix: preserve Markdown blocks when copying messages

* fix: preserve blank lines when copying code

---------

Co-authored-by: Iuliia Ivashko <yulia.ivashko@gmail.com>
2026-08-27 19:37:49 +03:00
dibanez 0389af6cb3 refactor(btw): read the promoted flag from the panel state, not a second subscription
`useBtwPanelState` already subscribes to the composer's own session — it is
what the fork link is derived from — so asking `useSession` for the same
session and directory a second time in `ChatInput` was a duplicate
subscription for a value already in hand. Expose it as `parentSession` and
read the promoted flag from there.

No behavior change.
2026-08-27 14:04:12 +02:00
dibanez 7a95efc4ac fix(btw): stop the boundary from outliving the session it applies to
Review catch: `promoteBtwSession` removes the btw metadata, but the
boundary instruction is persisted on every message the session sent while
it was a side conversation, and there is no API to delete a message part
after the fact. A promoted session therefore keeps reading "no sub-agents,
do not touch the workspace" out of its own history, in a session that is
no longer a side conversation.

Promotion cannot delete those lines, so it answers them instead:
`withoutBtwSessionMarker` now leaves `openchamber.btwPromoted`, and the
composer sends `BTW_PROMOTION_NOTICE` with every message in a session
carrying it — stating that the session is now the main thread and the
usual tool, sub-agent and workspace permissions are in force.

It rides with every send for the same reason the boundary does: the
instructions it revokes are re-read on every turn, so a one-shot notice
would lose its position relative to them as the conversation grows.

`btwPromoted` is additive and optional. A session that never went through
`/btw` never has it, and one promoted before this change simply keeps the
old behavior.
2026-08-27 13:54:29 +02:00
Igor Velho da3a3bf1ec Merge upstream main into feat/subagent-cost-rollup 2026-08-27 11:08:57 +01:00
Jakub Syty 22bd738180 Merge branch 'openchamber:main' into github-usage-rework 2026-08-27 10:06:53 +02:00
dibanez b0083f6e0f feat(btw): fork at the last completed turn, and never leak the inherited tail
Two related fixes to what a btw session inherits and shows.

**Fork point.** `/btw` is typically typed *while* the main thread is
working — that is the moment a side question comes up. Forking at HEAD
then clones a turn that is still streaming, so the fork inherits a
truncated assistant message and the user instruction that provoked it as
the newest, most salient thing in its context. Fork at the parent's last
completed assistant turn instead, read from the sync store with no extra
round-trip. A parent with no completed turn yet keeps the previous
fork-at-HEAD behavior.

**Boundary.** `filterBtwTailMessages` shows every inherited message when
the boundary is `null`, and the boundary is `null` whenever the
newest-cloned read comes back empty. That is correct for a fork of an
empty parent, but it also turns an empty read into "nothing was
inherited" for a fork that demonstrably did inherit history — the panel
then opens with the parent's whole transcript in it. Having picked a
fork point proves the parent had turns, so fall back to that id instead
of `null`. The fork's own messages are created later and still sort
after it, so its tail stays complete either way.
2026-08-27 09:37:43 +02:00
dibanez 92c3e0d5e5 feat(btw): keep the inherited thread as reference, not an active plan
`/btw` forks the session, so the model receives the parent's whole
conversation — including whatever plan was in flight when the user typed
the command. Nothing tells it that this history is context rather than
its own task, so the fork frequently carries on with the parent's work
instead of answering the side question, which is the opposite of what
`/btw` is for.

Send a boundary instruction as a synthetic part with every message in a
btw session: with the first question in `startBtwSession`, and with each
later send while the panel is expanded and the composer is talking to the
fork.

The wording is deliberately position-independent — it names the history
inherited from the parent thread rather than "everything before this
boundary". The instruction rides along with each send instead of being
pinned once at fork time, so a positional phrasing would be re-anchored
every turn and would end up telling the model to disregard the btw
session's own earlier turns.

The part is synthetic, so it is filtered out of the rendered transcript
whenever the message also carries user text — which is always the case
here. No visual change.
2026-08-27 09:21:42 +02:00
gaojunran d495771cee fix(ui): raise file open line limit to 20k lines 2026-08-27 12:56:56 +08:00
wq.pan b63e48c7c6 fix(electron): recover crashed renderer windows 2026-08-27 11:22:33 +08:00
wq.pan 5f1c1434f8 test(electron): cover renderer recovery policy 2026-08-27 11:22:18 +08:00
Ayoub Achour 61741e58c4 fix(tunnels): update cloudflared download link 2026-08-27 04:10:09 +01:00
Alexandre Reyes Martins 56cf45115f feat(ui): cascade undo and redo to subagents 2026-08-27 03:00:30 +00:00
Colin Mollenhour 2428d88907 fix(opencode): preserve external host during recovery 2026-08-27 01:10:06 +00:00
Bohdan Triapitsyn 2a1c10cb3e docs: update support link to Patreon 2026-08-27 00:17:41 +03:00
Bohdan Triapitsyn 2ead348c08 Merge pull request #3098 from TomzxForks/document-magic-prompts
docs: document where each magic prompt runs and when it fires
2026-08-26 23:46:58 +03:00
Bohdan Triapitsyn 8598f3a37c release v1.21.0 2026-08-26 23:15:55 +03:00
Bohdan Triapitsyn 4b0fcfaa7b fix(desktop): boot relay-paired default hosts without the recovery wall
The startup path probed a relay host's stored direct URL — often the
pairing creator's own loopback — and any failure landed on the Remote
Server Unreachable screen before the renderer's relay restore could run.
A relay-capable default host now boots to main on the local substrate for
any failed direct probe (unreachable, wrong-service, incompatible), skips
the 10s second probe, and lets the renderer's existing restore pick
direct-or-relay.
2026-08-26 23:10:37 +03:00
Bohdan Triapitsyn 11dd8c4eb0 fix(mobile): pin the chat composer above the keyboard on Android browsers
The chat screen relied on the browser's focused-field reveal, which holds
on iOS Safari but not on Android, where interactive-widget is also widely
ignored — the composer just stayed behind the keyboard. The draft screen's
visual-viewport pin now covers the chat screen on Android; iOS chat keeps
the native reveal.
2026-08-26 23:10:37 +03:00
Bohdan Triapitsyn 25be1985ef chore(ui): remove code orphaned by the shortcut and plan-action cleanups
The eslint pass in release:prepare caught what the package-scoped checks
did not: Header's handleOpenContextPlan and servicesTabs lost their last
callers with the removed shortcuts, the settings-synced listeners no
longer need the DesktopSettings import, and the store's openContextPlan
action itself went unused once the plan surface was reachable only through
the digit switcher and the rail.
2026-08-26 20:40:18 +03:00