Commit Graph
2440 Commits
Author SHA1 Message Date
Bohdan Triapitsyn 0b01f5ae2d feat(diff): add branch scope to context panel diff view
Show every change on the current branch relative to its base in the
Changed/Staged/Last turn dropdown. The base comes from the branch's
reflog record or an explicit per-branch user choice (persisted), never
a main/master guess; when git has no record the user picks a base once
from a searchable branch list.

- server: GET /api/git/branch-base (reflog-derived base),
  GET /api/git/range-files (name-status -z with rename/copy
  destination paths and -C copy detection)
- shared UI: optional getBranchBase/getGitRangeFiles runtime APIs
  with boundary parsing; persisted per-branch overrides keyed by
  runtime+directory+branch
- DiffView: branch scope with confirmed-unavailability coercion of
  persisted tabs (detached HEAD, default-branch checkout, metadata
  settled without a default), range-invalidated diff cache guarded
  against stale completions, bounded branch-metadata retry, read-only
  diff actions in branch scope; hidden in VS Code
- helper module branchDiffScope.ts with tests for coercion,
  availability, race conditions, and retry exhaustion
2026-08-22 01:10:19 +03:00
Bohdan Triapitsyn 9f7d839fc6 docs(integrations): add provider account notice 2026-08-22 01:10:19 +03:00
Bohdan Triapitsyn f29844b2f1 feat(settings): mark integrations as experimental 2026-08-22 01:10:19 +03:00
Bohdan Triapitsyn eda20654a6 fix(chat): let bash output grow with content 2026-08-22 01:10:19 +03:00
Bohdan Triapitsyn 96c7be9342 feat(chat): animate draft session transition 2026-08-22 01:10:19 +03:00
Bohdan Triapitsyn 70a7a77ded refactor(ui): name workspace surfaces 2026-08-22 01:10:19 +03:00
Tom Rochette be234548fa feat(ui): show externally-created sessions in sidebar and Recent view (#2930)
* feat(ui): show externally-created sessions in sidebar and Recent view (#1441)

Sessions created by external OpenCode processes (CLI, other server
instances) share the same database but don't broadcast SSE events to
OpenChamber's connected server. The existing 45s global polling via
experimental.session.list() already discovers these sessions, but the
isKnownActiveSessionDirectory filter in SessionSidebar.tsx removes
them when their directory isn't a registered project.

Add effectiveKnownDirectories that extends knownSessionDirectories
with directories derived from globalActiveSessions themselves, so
external sessions pass the filter and appear in the sidebar and Recent
view.

Validated with two live OpenCode server processes sharing the same
database: global experimental.session.list() returns external sessions
immediately, while per-directory APIs do not.

* Revert "feat(ui): show externally-created sessions in sidebar and Recent view (#1441)"

This reverts commit 94acda43ad3049e7674d8eb3f24b1f74acb0d1c3.

* fix(ui): make sidebar reactive to global session store updates (#1441)

Replace non-reactive useGlobalSessionsStore.getState() with direct
reactive subscriptions for activeSessions and archivedSessions. The
previous getState() pattern relied on proxy subscriptions
(activeSessionStructure, hasAuthoritativeGlobalSessions) to trigger
re-renders, which created a fragility gap where store updates could
go unnoticed by the sidebar.

Add a 45s periodic refreshGlobalSessions() interval in the sidebar,
independent of the tray sync hook. The tray sync's polling is gated
behind isTrayPlatform() and isTrayEnabled(), so on runtimes where
the tray is unavailable, there was no periodic refresh of global
sessions at all. External sessions (created by CLI or other server
processes) were only discovered on initial mount or page refresh.
2026-08-21 16:51:06 +03:00
Tom Rochette a79ae57ae5 fix(ui): scope file-reference stat probes to the session directory (#3022)
* test: add regression test for stat directory scoping (#3019)

* fix: scope file-reference stat probes to the session directory (#3019)

The /api/fs/stat probe sent by the markdown renderer carried no
directory hint, so the server resolved the workspace from
settings.lastDirectory. When the browsed directory differs from the
session directory the stat returns 400 and the renderer treats it as
file-does-not-exist, silently disabling file-reference links.

Send effectiveDirectory as x-opencode-directory on the probe and
qualify the stat cache key by directory so a rejection under one
directory cannot leak into another. The probe logic moves from
MarkdownRendererImpl into fileReferenceStat with unit coverage.
2026-08-21 16:48:32 +03:00
Bohdan Triapitsyn ad5bc2b01b feat: focus chat input after creating a new inline comment
Opens the chat tab when a new inline comment is submitted
Automatically focuses the chat composer for quicker follow-up
Leaves draft updates unchanged when editing an existing comment
2026-08-21 16:38:37 +03:00
Bohdan Triapitsyn b1030d3cb7 fix(chats): align folders and session actions
Render managed Chats through the shared folder-aware session group and keep folder ownership at the Chats root, including new drafts and older per-directory scopes.

Hide worktree actions for Chats, make worktree shortcuts inert on Chat drafts, and let new-session shortcuts inherit an active session directory while explicit Chats controls still create managed Chat drafts.
2026-08-21 16:29:26 +03:00
Bohdan Triapitsyn b879cf323f feat(sidebar): add single-project display mode 2026-08-21 16:25:51 +03:00
Bohdan Triapitsyn bbb2fdbe19 fix(chat): keep draft selectors above composer 2026-08-21 13:13:11 +03:00
Bohdan Triapitsyn 2766e9fd8c fix(chat): tidy composer pickers 2026-08-21 13:10:48 +03:00
Bohdan Triapitsyn 59df2963ae fix(sidebar): keep sticky activity label in sync
Track Chats and Recent section sentinels so the desktop sticky overlay changes identity only when the corresponding section reaches the top of the sidebar.
2026-08-21 12:49:40 +03:00
Bohdan Triapitsyn 9e87d7fdb9 feat(chats): add managed projectless chat sessions
Create projectless chat sessions under a managed, date-scoped Chats directory and clean abandoned or deleted session folders.

Add Chats to sidebar state, startup cache, shared context, and Electron Mini Chat while keeping VS Code project-only. Resolve managed chat directories to one server-side memory owner and document the runtime contracts.
2026-08-21 12:12:40 +03:00
Bohdan Triapitsyn 0d70a631f6 fix(electron): block startup splash history navigation 2026-08-20 21:25:29 +03:00
Bohdan Triapitsyn 3613127e2d fix(quota): support z.ai credit limits 2026-08-20 19:09:13 +03:00
Bohdan Triapitsyn 108c9f529b fix(skills): simplify skill source cards 2026-08-20 19:07:59 +03:00
Bohdan Triapitsyn 647a949369 feat(providers): support custom API protocols 2026-08-20 18:39:13 +03:00
Bohdan Triapitsyn 1ed3f1f575 feat(skills): curated GitHub catalog redesign (#3016)
* feat(skills): remove ClawHub catalog integration

Drop the ClawHub registry as a skills catalog source across web server,
shared UI, VS Code, docs, and locales. The catalog now serves git-based
sources only: the curated Anthropic repo and user-defined repositories.
Also removes the now-unused adm-zip dependency.

* feat(skills): redesign catalog around curated GitHub repositories

Replace the single-source dropdown with a card grid of curated GitHub
repositories (Anthropic, OpenAI, Cursor pstack/skills, Matt Pocock) plus
user-defined sources. Source cards show skill counts, GitHub stars, and
last-updated time; a global search covers all loaded sources.

Server: curated sources gain GitHub repo metadata (stars, pushed_at)
fetched best-effort with a 3-hour in-memory and on-disk cache; scans
run through a concurrency-limited, deduplicated cache with 3-hour TTL
persisted across restarts. Refresh still bypasses the cache.

Shared UI: source cards, global search with clear button, per-skill
GitHub links, install/installed states. VS Code curated list updated
to match. All new copy translated across 12 locales.

* fix(skills): address catalog review findings

- GitHub metadata fetch timeout drops to 1.5s (under the catalog
  client's 3s deadline) and failed lookups cache briefly (5 min) so
  repeated catalog loads do not re-hit a failing API.
- Disk cache files are written with owner-only permissions (0o600);
  rename preserves the mode.
- loadSource deduplicates concurrent in-flight requests per source and
  the shared isLoadingSource flag now clears only when the last active
  source load finishes.
2026-08-20 01:40:10 +03:00
Bohdan Triapitsyn 90d8868bfc fix(ui): keep work status PR checks current 2026-08-20 01:38:43 +03:00
Bohdan Triapitsyn 6a09c63392 feat(small-model): resolve plugin-registered providers from the running OpenCode
Plugin providers are registered from a plugin's `config` hook and credentialed
from its `auth` loader, both inside the running OpenCode process. Nothing about
them reaches `opencode.json` or `auth.json`, so resolution that only reads files
could not see them: selecting such a model failed with "has no known API base
URL" while the same model worked in chat (#2666).

`GET /provider` is where that state is visible. A new `runtime-providers`
module keeps one cached snapshot of it and reports, per provider, the
credential and endpoint OpenCode itself resolved. Credential resolution becomes
config -> runtime -> auth.json, and endpoint resolution config -> openai default
-> runtime -> models.dev catalog.

Providers with a dedicated wire format (Copilot, ChatGPT-plan OpenAI, Anthropic,
Google) are excluded from the runtime credential: for them OpenCode reports an
OAuth access token that their real transport does not accept.

opencode zen is excluded when the user has no zen login. OpenCode then reports
the sentinel `apiKey: "public"` and trims its catalog to free models that run on
its own infrastructure; the sentinel is never read as a credential.

Claude Code stays refused for background actions even when a plugin publishes an
OpenAI-compatible endpoint for it, because that endpoint is a facade over the
Claude Agent SDK and spawns the CLI per request.

No capability probe. Asking `GET /models` does identify a plugin whose protocol
lives in its own `fetch`, but measured across the 166 providers with an `api`
URL in the models.dev catalog it also denies six that work and simply have no
`/models` route. A provider that vanishes from the picker explains nothing,
while one that fails on use says why, so availability stops at credential and
endpoint.

The same list drives the Small Model and Changes Walkthrough pickers.

Validated against a real OpenCode with four plugin providers loaded: offered
providers went from 3 to 7, zen and Claude Code stayed out, and a generation
through a plugin-backed model that previously failed now returns.
2026-08-20 00:47:34 +03:00
Chris Rimmer 52ebe51122 Fix dialog close button hit area (#3014) 2026-08-20 00:38:06 +03:00
Serhii Dziupin 14d7a0ca9b fix: settle busy sessions after managed OpenCode restart (#3002)
* fix: reconcile busy sessions after managed OpenCode restart

Forced health-check restarts previously rebound the event stream without
settling in-flight turns, so sessions stayed busy with no terminal state.
Interrupt those sessions, classify health failures, and retain bounded
process diagnostics for post-restart diagnosis.

Fixes #2943

Co-authored-by: serkraser <serkraser@gmail.com>

* fix: surface interrupted chats after OpenCode restart

Complete unfinished assistant turns as aborted once the session is
authoritatively idle, and show a persistent toast so users can continue
instead of remaining silently stranded.

Fixes #2943

Co-authored-by: serkraser <serkraser@gmail.com>

* fix: redact Basic auth credentials in restart diagnostics

The key/value sanitizer stopped at whitespace, so Authorization: Basic
credentials survived in stderr tails and health snapshots. Redact the
scheme token before that rule runs.

Co-authored-by: serkraser <serkraser@gmail.com>
2026-08-19 11:53:30 +03:00
Bohdan Triapitsyn 13a45aa5a5 fix: skip auth requirement for config-defined custom providers
Shows the auth panel only when provider credentials are actually required
Keeps custom providers defined in config from being treated as incomplete
Adds coverage for the new provider auth check
2026-08-19 10:24:35 +03:00
Bohdan Triapitsyn ef2afdc759 release v1.19.0 2026-08-19 01:18:56 +03:00
Bohdan Triapitsyn 19d3c3d40a fix(settings): hide messengers integrations section 2026-08-19 01:18:31 +03:00
Bohdan Triapitsyn c04b425e70 fix: update file surface icon 2026-08-19 01:02:02 +03:00
Bohdan Triapitsyn 98b5ea2055 docs: add integrations guides and sidebar links
Adds new integrations docs for Claude Code, Command Code, and Cursor
Links the Providers pages to the new integrations guide
Updates the docs sidebar with localized integrations navigation
2026-08-19 00:56:31 +03:00
Bohdan Triapitsyn 4a0cf63f9e chore: update changelog entry with attribution 2026-08-19 00:52:49 +03:00
Yun Feng 36ce73f753 feat(ui): show session cost in VS Code context usage readout (#2991)
Share the desktop session-card currency formatter (lib/money.ts) and surface
the current session's cost in the extension chat-header context usage tooltip.
2026-08-19 00:34:23 +03:00
Bohdan Triapitsyn 434e5ea9aa fix(knowledge): show draft pins in work status 2026-08-19 00:22:54 +03:00
Bohdan Triapitsyn 0843250f07 fix(ui): add 500ms delay to archive and sidebar header tooltips 2026-08-19 00:10:08 +03:00
Bohdan Triapitsyn f9d1ded81a fix(knowledge): scope pins to sessions 2026-08-19 00:07:57 +03:00
Bohdan Triapitsyn a66903c73c chore: update unreleased changelog entries 2026-08-18 23:50:43 +03:00
99873a7b12 fix(files): harden drag-and-drop uploads
Co-authored-by: Serhii Dziupin <serkraser@gmail.com>

Co-authored-by: Alan Chen <2144783+alanzchen@users.noreply.github.com>
2026-08-18 23:16:46 +03:00
Bohdan Triapitsyn 0c5e183c62 fix(electron): load self-signed loopback pages 2026-08-18 23:10:14 +03:00
Bohdan Triapitsyn b754ccbf63 Merge remote-tracking branch 'origin/main' 2026-08-18 21:38:20 +03:00
Bohdan Triapitsyn 584b9304fd fix(ui): use CodeMirror selection handles on iOS 2026-08-18 21:37:57 +03:00
Bohdan Triapitsyn 423f5b9652 feat(files): upload files with drag and drop 2026-08-18 21:24:53 +03:00
Bohdan Triapitsyn 215749a65f fix(ui): compact Office attachment context 2026-08-18 19:54:16 +03:00
Bohdan Triapitsyn 1efc7fb570 fix(fs): open files through workspace symlinks 2026-08-18 19:15:11 +03:00
Bohdan Triapitsyn a29aaa7660 fix(ui): cap extracted document context 2026-08-18 19:15:10 +03:00
Bohdan Triapitsyn 3326ad0ea8 fix(quota): coalesce provider usage refreshes 2026-08-18 19:13:58 +03:00
Bohdan Triapitsyn 84e940a9e4 fix(mobile): bypass ngrok browser interstitial 2026-08-18 19:12:02 +03:00
Bohdan Triapitsyn f6a4492527 fix(ui): clarify work status hierarchy and MCP loading 2026-08-18 18:54:06 +03:00
Serhii DziupinandSerhii Dziupin 9832c0a4a8 fix(git): handle worktrees from forked PRs safely (#2693)
* fix(git): create worktrees from forked PRs via refs/pull/<n>/head fallback

A worktree created from a linked GitHub PR whose head branch lives in a fork
failed when the fork's head repository was missing (deleted fork) or
unfetchable (auth, network): the dialog threw 'PR head repository URL is
unavailable' before any git command ran, and the server had no fallback to
refs/pull/<n>/head, which GitHub serves on the base repository.

- NewWorktreeDialog: when pr.headRepo is absent, send a prRef config
  (refs/pull/<n>/head from origin) instead of throwing; the fork config now
  also carries prRef so the server can fall back when the fork fetch fails.
- git service: fetchPullRequestHeadRef fetches refs/pull/<n>/head into
  refs/remotes/<remote>/pr-<n>-head (same refspec shape as
  fetchRemoteBranchRef) and both validateWorktreeCreate and
  attachGitWorktreeToCandidate fall back to it when the fork path fails;
  fallback worktrees get --no-track and no upstream config because a PR ref
  is not pushable. When both paths fail the original fork error surfaces.
- Focused tests cover the prRef-only path and the fork-unreachable fallback.

Fixes #2422

* fix(git): harden PR worktree fallback against stale fork refs (#12)

After a fork fetch fails, resolve immediately from refs/pull/<n>/head
instead of accepting a cached remotes/<fork>/<branch> tracking ref.
Match the PR base repository by URL (not a hardcoded origin remote),
store fetched PR heads under refs/openchamber/pull/<n>/head, and share
one existing-mode resolver between validate and create.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* fix(git): make PR head SHA authoritative and namespace private refs

Reuse local/remote branches for linked PRs only when their tip matches
pr.headSha; otherwise fall through to fork fetch / refs/pull. Store PR
heads under refs/openchamber/github/<owner>/<repo>/pull/<n>/head, prefer
HTTPS for direct base-repo fallback, and surface composite fork+fallback
errors when both paths fail.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* test(ui): assert validate/create forward deleted-fork PR payload fields

Guards the dialog wiring regression where validate omitted prRef while
create included it, by asserting worktreeManager forwards prRef,
prBaseRepoUrl, and related fields for deleted-fork configs.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* refactor(git): always checkout linked PRs from refs/pull/<n>/head

Move PR worktree resolution to the server. The UI now sends only
pullRequest identity (number + baseRepoUrl + optional head fields);
the server always fetches the authoritative PR head and best-effort
configures fork upstream afterward.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* refactor(ui): drop PrWorktreeConfig; send PR identity only

Delete the prWorktreeConfig module. NewWorktreeDialog maps linked PRs
straight to pullRequest identity, skips upstream defaults for that path,
and leaves checkout + optional fork tracking to the server.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* refactor(git): linked PRs are {number, baseRepoUrl} only

Drop fork upstream / tracking and head/base owner-repo fields from the
linked-PR worktree path. Fetch refs/pull/<n>/head, create --no-track, done.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* fix(git): meet #2422 Must/Should without refs/pull fallback

Linked PRs send fork identity only; the server provisions pr-<owner>,
fetches the head branch, and fails clearly when the fork is missing or
unreachable. Local reuse requires a matching headSha. Prefer HTTPS for
headRepoUrl. Do not write upstream tracking when the upstream ref was
never fetched.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* fix(git): drop invalid upstream fallback and PR branch collisions

Remove setBranchTrackingFallback: if upstream fetch fails, leave tracking
unset. When a linked PR's head branch already exists locally with a
different tip, create pr-<number> instead of git worktree add -b on the
colliding name.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* fix(git): strip PR worktree create back to fork-remote provision (#15)

Keep the original ensureRemoteName/Url path for linked fork PRs, prefer
HTTPS clone URLs, fail clearly when the fork is unreachable, and leave
upstream tracking unset when the upstream ref was never fetched.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>


Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>
2026-08-18 16:56:55 +03:00
Bohdan Triapitsyn bf0dfc4e6b feat: add Command Code provider logo
Adds a new provider logo asset for Command Code
Uses the provider logo in third-party integrations when available
2026-08-18 16:24:30 +03:00
Bohdan Triapitsyn 17d08c0395 feat(quota): add Command Code usage tracking 2026-08-18 16:24:02 +03:00
Serhii Dziupin a01b7eec78 Merge pull request #2914 from pocharlies/fix/context-usage-server-total
fix(ui): stop the context meter from counting every internal round-trip
2026-08-18 11:07:04 +03:00