Commit Graph
100 Commits
Author SHA1 Message Date
Bohdan Triapitsyn 3aa45805bc fix(devices): keep the existing device name on re-pair and re-login
A dedupe-keyed client re-mint (QR rescan, password/passkey re-login) replaces
the stored record, which also reset the operator-visible name to the app's
hardcoded default ('OpenChamber Mobile'). The app-reported name is now only a
fallback: an explicit pairing label wins, otherwise the replaced record's
label is kept, and the default applies only to a first-ever pairing.
2026-08-24 14:03:18 +03:00
Bohdan Triapitsyn 5fa6f2c159 fix(chat): center the read-only subagent banner text 2026-08-24 12:49:58 +03:00
Bohdan Triapitsyn 080bd0a969 fix(chat): center the read-only subagent banner in the composer column 2026-08-24 12:49:03 +03:00
Bohdan Triapitsyn 83ea72de0e feat(chat): messenger-style context cards with message-level collapse 2026-08-24 12:46:14 +03:00
Bohdan Triapitsyn cd2a3efcdf fix(chat): keep selection comment popup below the desktop drag header 2026-08-24 12:17:13 +03:00
Bohdan Triapitsyn 58a193aa87 feat(ui): glass surfaces for selection menus and comment popovers
The chat selection menu (desktop pill and mobile sheet), the chat
comment input, the file-preview Comment pill, the shared inline comment
editor, and the composer's context chip preview popover now use the
same translucent blurred glass surface as the btw panel, keeping their
borders and soft shadow.
2026-08-24 01:49:10 +03:00
Bohdan Triapitsyn d678a4244e fix(mobile): knowledge panel tabs, autocomplete height floor, status row gap
The project knowledge panel's section sidebar becomes a horizontal pill
strip on mobile, where a half-width side column left no room for
content. The autocomplete popups get their 120px minimum height back —
browser keyboard panning could put the anchor above the measured
boundary and collapse them to nothing. The status row's 24px footer-swap
reservation now applies only to the assistant-status instance; the
accessory-only row above the composer (pending changes) takes the
normal 8px instead of floating a stray gap.
2026-08-24 01:44:15 +03:00
Bohdan Triapitsyn a547f83ebe docs: draft Unreleased changelog entries 2026-08-24 01:28:53 +03:00
Bohdan Triapitsyn eb03ffaa80 feat(files): comment on selection in read-only markdown previews
Selecting text in a rendered markdown preview shows a Comment pill;
attaching stores a file-quote context draft carrying the file path, the
selected fragment (not whole lines), the user's comment, and a
best-effort source line range resolved by anchoring the fragment's
first and last lines in the raw content — a partially located fragment
gets no range rather than a misleading one. The fragment stays
highlighted while the comment input is open, using the selection
overlay rects shared with chat quote comments, and the preview's
native selection color now matches chat messages. file-quote flows
through the same context contract: composer chip previews, the message
context card, and the metadata round-trip.
2026-08-24 01:21:35 +03:00
Bohdan Triapitsyn e47c027ea0 feat(diff): unified comment UI with gutter plus and content-drag selection
The diff comment editor is restyled as the shared comment pill (context
line inside the box, auto-growing textarea, round attach button;
Cmd/Ctrl+Enter attaches, Enter breaks the line) and the saved-comment
card matches the composer preview entries. Pierre's gutter utility is
enabled: hovering a line shows a small primary-colored plus that opens
a comment for the line, dragging from it selects a range, and it rides
the bottom of an active selection. Clicking a diff line toggles a
single-line comment, and dragging over content maps to the same line
selection the number column produces — the native text selection is
suppressed once a drag crosses a line boundary — opening the editor for
the range on release. Placeholders and meta lines are dimmed relative
to typed text.
2026-08-24 01:02:33 +03:00
Bohdan Triapitsyn 538b532fb1 feat(composer): context chip previews with inline comment editing
Hovering (or tapping) a context chip opens a stacked preview of its
pending items above the composer: numbered entries with a muted header
band, the captured selection, and the user's comment, which can be
edited in place (save/cancel) or removed before sending. The chips
component now subscribes to the draft store itself; the per-kind count
plumbing in ChatInput is gone.
2026-08-24 00:16:26 +03:00
Bohdan Triapitsyn c3f89e0106 fix(ui): soften btw panel shadow
Replace the floating-glass elevation stack with the composer pill's
soft shadow and a plain theme border; the glass background and blur
stay.
2026-08-23 23:40:41 +03:00
Bohdan Triapitsyn f007d07bee fix(desktop): serve packaged index.html with no-store
The openchamber-ui:// handler returned index.html without cache
headers, so the renderer disk cache could keep a freshly installed
build loading the previous version's hashed bundles. Hashed assets
stay cacheable; only the document that names them must not be.
2026-08-23 23:40:40 +03:00
Bohdan Triapitsyn 1ae3aeff5f feat(chat): structured context attachments with metadata round-trip
Every user-attached context item (diff/file/plan comments, terminal
selections, browser annotations, PR comments and failed checks, linked
issues/PRs, and new chat-quote comments from the selection menu) is now
sent as its own synthetic text part carrying an openchamberContext
metadata payload. The model-facing text keeps the previous wording; the
timeline reads the metadata back and renders each item as a context card
instead of raw prompt text. Legacy messages still render via the old
text sniffing.

The selection menu gains a Comment option with an inline multiline
input, the quoted fragment stays highlighted while commenting, and on
mobile the input overlays the composer pill by rendering inside the
composer form. Add to chat is renamed Add to input; the menu is
restyled and the mobile Copy tile removed. Terminal drafts move their
terminal id out of the language field (persisted-draft migration v3),
and the dead preview-console source is deleted.
2026-08-23 23:40:32 +03:00
Bohdan Triapitsyn 1af8b14bbb fix(chat): unify OpenCode notice styling 2026-08-23 19:13:14 +03:00
Bohdan Triapitsyn 264ea02ee1 fix(ui): constrain draft menus to chat area 2026-08-23 18:27:35 +03:00
Bohdan Triapitsyn 2ca3280b39 fix(ui): keep draft dropdowns below header 2026-08-23 17:24:59 +03:00
Bohdan Triapitsyn 421a868a1a feat(ui): add Linear and Cloudflare tool icons 2026-08-23 17:21:31 +03:00
Bohdan Triapitsyn 526bbe246d fix: delay sidebar item tooltip hover 2026-08-23 16:01:30 +03:00
Bohdan Triapitsyn 9a40eea7c1 fix: include archived sessions in header lookup
Header now finds the current session in archived sessions too.
2026-08-23 15:54:28 +03:00
Bohdan Triapitsyn fe80d246ea release v1.20.0 2026-08-23 02:10:48 +03:00
Bohdan Triapitsyn a5b0272f01 chore: update unreleased changelog 2026-08-23 01:05:14 +03:00
Bohdan Triapitsyn 8f2c1ecc8b fix(chat): hide autocomplete tooltips on mobile 2026-08-23 01:05:09 +03:00
Bohdan Triapitsyn 1a627e06ad docs(changelog): note /btw side questions and the status-line handoff 2026-08-23 00:42:23 +03:00
Bohdan Triapitsyn 3195fb1190 fix(chat): make the working status row swap seamlessly into the turn footer
The streaming status line and the finished turn footer are the same visual
line, but the swap used to jump: different font/color, a 2px left inset, a
20px row vs the footer's 32px (its h-8 action buttons set the height), and
the bottom-anchored chat pulling the line up because the finished message
carries more structure below its footer than the status row had.

Match the footer exactly: text-sm at muted-foreground/60, no left inset,
h-8 row, and mb-6 reserving the missing space below. Verified against the
live DOM: the footer appears at the exact pixel position the status row
occupied.
2026-08-23 00:41:40 +03:00
Bohdan Triapitsyn a317a156cb test(ui): restore the two suites CI was failing on
Neither failure came from the change that surfaced them; both suites were
asserting behavior the product had already moved.

issue-2039 mocks `session-actions`, and session creation's authoritative
steps live there: the created session becomes current under the directory
the server confirmed, and that directory enters sync's routing index. The
mock did neither, so every assertion about current session and directory
routing read an empty store. It now performs both, which is what makes
those assertions test the store's real resolution order again.

issue-2903 pinned `<ChatEmptyState />` inside ChatContainer's empty-and-idle
branch. The draft transition animation moved that surface to the draft, and
the branch now returns a neutral placeholder. What the test is actually for
— the idle branch not rendering a status row of its own — is kept.
2026-08-22 20:39:27 +03:00
Bohdan Triapitsyn 2740c7b3a2 feat(projects): pin a thinking level next to a project's model
A project could pin the model new chats start on, but not the level to
run it at: the default cascade dropped any variant as soon as a project
model won, and only ever considered the global one — which belongs to
the global model.

Projects now carry `defaultVariant` alongside `defaultModel`, stored and
sanitized only next to that model, and the cascade passes it through.
Both controls sit in one "Defaults for new chats" group laid out like the
Sessions defaults, and the level appears only for models that offer them.
2026-08-22 20:31:31 +03:00
Bohdan Triapitsyn e2e55756e2 fix(settings): stop defaults from repointing a chat that has its own model
Changing the default model, variant or agent wrote the chat's live
selection unconditionally. For a session carrying its own choice the
effect was mostly transient — ModelControls restores that choice on the
next hydration — but a message sent right after the change went out on
the new model.

The guard is the same pair of signals ModelControls restores from
(shouldPreserveManualModelOverride): a manual selection plus a saved
selection for the current session. Chats following the default still
switch immediately.
2026-08-22 20:31:31 +03:00
Bohdan Triapitsyn 0079347edc refactor(settings): scope the settings project selector to settings
Picking a project in Settings called setActiveProject, which relocates
the chat, the session list, the file tree and the Git surface. Reading
another project's MCP servers or agents moved the user's whole app.

It had to, because the configuration stores resolved the directory
themselves from the active project and held one flat list. Each of them
now takes an explicit directory — omitted still means the active project,
so every caller outside Settings is unchanged — and keys loaded data by
directory next to a flat mirror of the active project. Chat, autocompletes
and pickers keep reading that mirror; a load for another directory writes
only the map. A failed load restores that directory's previous list.

Settings resolves its own directory through useSettingsDirectory, backed
by a session-local settingsProjectPath that follows the active project
until the user picks something else.
2026-08-22 20:31:31 +03:00
Bohdan Triapitsyn ac0b17c9fd docs(changelog): note the providers and work status fixes 2026-08-22 20:31:31 +03:00
Bohdan Triapitsyn e970154809 fix(chat): yield the work status card to the context panel in project-less chats
The visibility hook looked the context panel up under the directory the
card reports about. A managed Chat reports about none, so the lookup ran
against an empty key and answered "closed" while the panel was open.

It now resolves the key the way the rail and the panel do, through
useEffectiveDirectory. The reporting directory is no longer an input to
this hook at all.
2026-08-22 20:31:31 +03:00
Bohdan Triapitsyn 887127b5d0 fix(providers): keep the settings provider selection under one owner
The selected provider on the Providers settings page shared a field with
the chat's model resolution. Changing the chat model or agent, and
`loadAgents` reconciling a selection, all wrote to it, so the page jumped
to an unrelated provider while the user was reading or editing one.

Only the sidebar click writes it now. A refresh no longer re-derives it
either: a provider missing from a refreshed list is expected while
OpenCode restarts and plugin-registered providers re-register.
2026-08-22 20:31:31 +03:00
Bohdan Triapitsyn f7a0d1f0f6 feat(ssh): rework remote instance setup and fix remote installs
Adding an SSH connection now starts from the hosts in the SSH config
instead of a blank command field, ports and install options sit behind
Advanced settings, and each connection reports one of three states with
the failure text and an action that resolves it.

Remote installs no longer touch the root-owned global npm prefix: npm is
pinned to a prefix under $HOME and bun is resolved at its known location,
because an SSH login shell exposes neither on PATH. The opencode CLI is
resolved the same way and handed to the remote server through
OPENCODE_BINARY, and the server is started and stopped through the
resolved binary rather than PATH — the HTTP shutdown route sits behind UI
authentication and never stopped anything.

A managed remote server can also be published to the remote machine's own
network. That requires a UI password, enforced in the form and again in
the SSH manager.
2026-08-22 16:45:56 +03:00
Bohdan Triapitsyn eed317f18d fix(chat): handle unavailable persisted models 2026-08-22 14:53:44 +03:00
Bohdan Triapitsyn 09f75b75e1 fix(desktop): retry Windows settings file replacement 2026-08-22 14:44:03 +03:00
Bohdan Triapitsyn 049ff52427 fix(queue): keep remote host identity stable 2026-08-22 13:22:42 +03:00
Bohdan Triapitsyn 171a03d8f1 fix(sync): reconcile completed turns after reconnect 2026-08-22 13:19:36 +03:00
Bohdan Triapitsyn 90f150bd0c chore: bump @opencode-ai/sdk to 1.18.21 2026-08-22 12:13:54 +03:00
Bohdan Triapitsyn fcbe2c0414 fix(settings): clean up orphaned temp files and harden atomic writes 2026-08-22 11:55:38 +03:00
Bohdan Triapitsyn 735a9463ca fix(chats): use a dedicated empty message
Show a localized Chats-specific empty state instead of reusing the project workspace session message.
2026-08-22 11:41:59 +03:00
Bohdan Triapitsyn 952e8d6463 feat: require Cmd/Ctrl+Enter to send in expanded chat composer
Plain Enter now inserts a newline in the expanded composer
Cmd/Ctrl+Enter still sends the message
Helps avoid accidental sends while writing long prompts
2026-08-22 11:33:30 +03:00
Bohdan Triapitsyn 556b151492 fix(chat): limit draft transition animation 2026-08-22 11:32:01 +03:00
Bohdan Triapitsyn 80068c634d fix(sessions): centralize global polling 2026-08-22 02:49:45 +03:00
Bohdan Triapitsyn c232d358da chore: update unreleased changelog entries 2026-08-22 02:48:02 +03:00
Bohdan Triapitsyn 11d7c7b481 fix(chat): keep long user messages expandable
Truncation was measured once on mount and watched through a ResizeObserver
on the clamped element, whose own height stops changing under line-clamp.
A message measured before its content settled never regained the expand
affordance, and a just-sent one measured before its turn finished laying
out could not be expanded at all.

Measure at click time so expanding depends on whether the text is clipped
right now, re-read once on the next frame after mount, and observe the
children (which keep their natural height) plus subtree swaps.
2026-08-22 02:45:34 +03:00
Bohdan Triapitsyn 77479127a5 fix: reduce code block highlight flicker
Preserve layout with invisible placeholders while worker highlighting loads
Reuse cached highlighted lines on first render when available
Differentiate loading from failed highlighting results for better fallback behavior
2026-08-22 02:10:03 +03:00
Bohdan Triapitsyn 4021dd4e26 fix(git): separate generated PR prompt blocks
The additional context and pull request template blocks ran into the file
list without a blank line, and the template's markdown headings blended into
the surrounding instructions. Each block now starts on its own, and template
content is fenced with explicit markers labelled as structure to reuse rather
than instructions to follow.

Claude-Session: https://claude.ai/code/session_01NzK8hD1hFHHHwv2FgZJwC2
2026-08-22 02:04:06 +03:00
Bohdan Triapitsyn cd46f0e3fb fix(chat): stop the just-sent user message from flickering
The server echo of an optimistic user message carries different part
ids, so the reducer dropped the optimistic part and appended the server
one at the end, and MessageBody keyed user parts by part id. The key
change remounted the text subtree (blank frame, markdown re-parse,
truncation state reset) and the append reordered text against file
parts.

Replace the optimistic part in place and key user parts positionally.
2026-08-22 01:55:52 +03:00
Bohdan Triapitsyn 514d2e82da feat(git): follow repository style when generating commit and PR text
Commit generation now samples the last 10 commit subjects and instructs the
model to match their language, prefix convention, and length, falling back to
Conventional Commits only when the history shows no consistent style.

PR generation probes the conventional pull request template locations and
reuses the repository's own sections and checklists as the body structure when
one is found.

Claude-Session: https://claude.ai/code/session_01NzK8hD1hFHHHwv2FgZJwC2
2026-08-22 01:52:19 +03:00
Bohdan Triapitsyn 4078deb90a fix(desktop): align Windows close button chrome 2026-08-22 01:36:12 +03:00
Bohdan Triapitsyn d849742d22 fix(chats): hide repository work status
Prevent managed Chat drafts and sessions from inheriting an active project's repository context in the Work Status panel while retaining directory-independent status sections.
2026-08-22 01:31:02 +03:00
Bohdan Triapitsyn 3992e65c7a fix(chat): improve autocomplete popups 2026-08-22 01:10:19 +03:00
Bohdan Triapitsyn 64006cf2cd fix(chat): smooth draft session transition 2026-08-22 01:10:19 +03:00
Bohdan Triapitsyn 23928d342c feat(dictation): transcribe after recording instead of live
Parakeet is an offline model trained on whole utterances, so re-decoding
the growing buffer to animate a live transcript cost O(n^2) work for a
result the final decode replaced. Sessions now decode once per committed
segment, and the composer shows a scrolling waveform of the mic level
instead of running text.

Long dictations split at a pause once past 60s (hard cap 90s) instead of
on a blind 15s timer, so cuts no longer land mid-word. Committed segments
decode while the user is still speaking: a 185s dictation returns 4.1s
after stop instead of 11.0s, with identical text (816 vs 817 words).

Also fixes two ways the stream manager could silently drop transcribed
audio. It now counts the commits it issued instead of trusting the
session's echoed events, so a commit still in flight when the client
finishes can no longer be left out of the final text. And segment
byte/peak accounting is reset where the commit is issued rather than when
the event arrives, which could mistake the tail of a dictation for
silence and clear it.
2026-08-22 01:10:19 +03:00
Bohdan Triapitsyn 35998f9f4d fix(sidebar): indent sessions inside folders 2026-08-22 01:10:19 +03:00
Bohdan Triapitsyn 0d50253efa refactor(integrations): retire unavailable options
Remove retired Command Code, Discord, and Telegram integration entries, search targets, and documentation. Keep Command Code provider usage and logo support available through normalized provider ID aliases.
2026-08-22 01:10:19 +03:00
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
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 d80a011cbd docs: require loading communication-style skill at task start
Adds a mandatory early load step for the communication-style skill.
Removes the blanket always-on trigger from the skills table.
Clarifies that the guidance applies to all task output.
2026-08-20 01:54:08 +03:00
Bohdan Triapitsyn 8cb9e4838a docs: add communication style skill and enable it globally
Adds a new communication-style skill for rewriting text in a more human voice
Replaces the old unslop skill with the new name and guidance
Updates agent instructions to apply the communication-style skill to every task
2026-08-20 01:51:29 +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 a2a9eabd04 docs: add unslop writing guide
Defines a process for rewriting text to sound more human
Lists patterns to remove, including AI-style phrasing and overused punctuation
Adds practical guidance for clearer, more direct prose
2026-08-20 01:16:34 +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
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
Bohdan Triapitsyn 47525c0cf5 ci: disable pr-review workflow and switch issue agents to mimo-v2.5 2026-08-19 00:33:53 +03:00
Bohdan Triapitsyn 94be8ee898 docs(changelog): mention project knowledge pinning 2026-08-19 00:24:04 +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