Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
7adb6e4
feat(desktop): upgrade to latest version on error page
adamdotdevin Dec 30, 2025
3fe5d91
chore: generate
actions-user Dec 30, 2025
81fef60
fix: ensure variants also work for completely custom models (#6481)
rekram1-node Dec 30, 2025
c8b3b31
chore: generate
actions-user Dec 30, 2025
0b3b0c0
feat: allow users to edit suggested changes before applying
dmmulroy Dec 30, 2025
76c25ef
feat(format): add rustfmt formatter for Rust files (#6482)
frhd Dec 30, 2025
77b9baa
Merge branch 'dev' into push-mkkkrpltpomy
dmmulroy Dec 30, 2025
7349626
feat: add model usage statistics with input/output token breakdown to…
processtrader Dec 30, 2025
324ae9c
fix: openai variants for codex models
rekram1-node Dec 31, 2025
a3819e0
docs: for `stats --models` flag (#6492)
opencode-agent[bot] Dec 31, 2025
eb81994
tweak: adjust keys for uniqueness calculations to use provider/model
rekram1-node Dec 31, 2025
b9ef09a
tweak: read plurals too and stop erroring on them
rekram1-node Dec 31, 2025
48f2419
fix(desktop): better notification icon
adamdotdevin Dec 30, 2025
1e74560
feat(app): model variants
adamdotdevin Dec 31, 2025
52e4dd1
feat(app): hide reasoning once agent is done
adamdotdevin Dec 31, 2025
94dca30
fix(app): don't open native folder select with remote server
adamdotdevin Dec 31, 2025
ed4ce67
core: add configurable timeout for MCP tool calls to prevent hanging …
thdxr Dec 31, 2025
d4cf78b
chore: generate
actions-user Dec 31, 2025
2434965
Update mise install command (#6504)
brianclinkenbeard Dec 31, 2025
a6d2255
fix: cleaner view subagents hint text (#6437)
iamdavidhill Dec 31, 2025
b6dafcd
fix(opencode): restore variant field in session prompt API
shuv1337 Dec 31, 2025
ecd204d
refactor(opencode): extract CORS logic to dedicated module
shuv1337 Dec 31, 2025
2655908
feat(app): add server URL persistence and welcome screen for hosted e…
shuv1337 Dec 31, 2025
e6330bc
fix: optimize Ripgrep.tree() for large repositories (109x faster)
Karavil Dec 31, 2025
0b1f6a7
feat: bundle in @ai-sdk/vercel version 1.0.31 for aisdk v5 support (#…
OpeOginni Dec 31, 2025
db84ee1
feat: add gemini-3-flash to fast models list (#6497)
junmediatek Dec 31, 2025
977c9a3
Update Nix flake.lock and hashes
actions-user Dec 31, 2025
57a2b5f
feat: mcp prompts as slash commands (alternative) (#5767)
paoloricciuti Dec 31, 2025
dfb9caa
chore: generate
actions-user Dec 31, 2025
5c9d619
docs: add variants docs (#6516)
rekram1-node Dec 31, 2025
537970f
feat(app): improve review pane with width constraints and empty state
shuv1337 Dec 31, 2025
ed135f8
refactor(app): reorder header buttons for better UX
shuv1337 Dec 31, 2025
d6d1326
feat: merge upstream PR #6478 - parallel subtasks, model inheritance,…
shuv1337 Dec 31, 2025
b1a6333
feat(core): configurable cors hosts
adamdotdevin Dec 31, 2025
05c3bc2
chore: generate
actions-user Dec 31, 2025
34e9392
chore: daytona skip preview warning
adamdotdevin Dec 31, 2025
e7e89dc
chore: cleanup
adamdotdevin Dec 31, 2025
22091c2
ignore: update download stats 2025-12-31
actions-user Dec 31, 2025
3650fef
fix(desktop): don't expand tools by default
adamdotdevin Dec 31, 2025
50ef866
fix(core): mdns fails if service already registered
adamdotdevin Dec 31, 2025
8aa34ab
release: v1.0.219
Dec 31, 2025
ebf5ad2
fix(desktop): not rendering large sessions
adamdotdevin Dec 31, 2025
a6f5d33
fix(tui): use unwrap() for KV store serialization and add ready guard
shuv1337 Dec 31, 2025
4811302
feat(tui): persist sidebar section expansion states across sessions
shuv1337 Dec 31, 2025
fbfa2a9
feat(tui): add Linux/Ghostty drag-and-drop and clipboard image paste …
shuv1337 Dec 31, 2025
2ec6a21
feat(desktop): unified diff toggle
adamdotdevin Dec 31, 2025
4309d43
chore: generate
actions-user Dec 31, 2025
6e3ead1
fix(ui): radio group styles
adamdotdevin Dec 31, 2025
5249f04
fix: display MCP tag for prompts in autocomplete but not in prompt (#…
paoloricciuti Dec 31, 2025
18a5eb2
fix(desktop): better new session button
adamdotdevin Dec 31, 2025
ed70a07
fix(desktop): cleanup user message style
adamdotdevin Dec 31, 2025
a7c4f83
fix(desktop): remove status bar, new elements in header
adamdotdevin Dec 31, 2025
840fe03
zen: fix fee instruction
fwang Dec 31, 2025
c42bd49
docs: new configurable CORS option (#6522)
opencode-agent[bot] Dec 31, 2025
fcfcdd9
fix: Clarify agent-name placeholder in tips (#6520)
anzulaqeel-anunzio Dec 31, 2025
b97d20f
feat(cli): New debug agent <name> subcommand (#6529)
Eric-Guo Dec 31, 2025
2dc1471
docs: Add plannotator plugin (#6510)
backnotprop Dec 31, 2025
094af4d
chore: generate
actions-user Dec 31, 2025
e0450e7
fix: plugin & mode globs
rekram1-node Dec 31, 2025
decc616
release: v1.0.220
Dec 31, 2025
5d9fce3
sync: merge upstream v1.0.220 into shuvcode-dev
shuv1337 Dec 31, 2025
7c4fdb6
fix(app): restore Header component and fix theme/font picker placement
shuv1337 Dec 31, 2025
1f6df9a
fix(app): allow review pane to resize up to half screen width
shuv1337 Dec 31, 2025
3b3fc2d
fix(app): remove session width clamping that broke review pane resize
shuv1337 Dec 31, 2025
3924d5f
fix(app): prevent Add Project tab labels from overflowing on small sc…
shuv1337 Dec 31, 2025
89e5d36
feat(app): use slider-style RadioGroup for diff split/unified toggle
shuv1337 Dec 31, 2025
bcd441d
fix(app): use shorter tab labels on small screens in Add Project dialog
shuv1337 Dec 31, 2025
f1c6145
fix(app): fix path display in status bar and add click-to-copy
shuv1337 Dec 31, 2025
3d6e259
Local test merge of PR #6507: fix: optimize Ripgrep.tree() for large …
shuv1337 Dec 31, 2025
2e74a9e
docs: add PR #6507 to merged PRs (Ripgrep.tree optimization)
shuv1337 Dec 31, 2025
7b67f47
Local test merge of PR #6476: feat: allow users to edit suggested cha…
shuv1337 Dec 31, 2025
9c3bac9
docs: add PR #6476 to merged PRs (edit suggested changes before apply…
shuv1337 Dec 31, 2025
185614d
updates
shuv1337 Dec 31, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/last-synced-tag
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v1.0.218
v1.0.220
34 changes: 0 additions & 34 deletions .opencode/agent/docs.md

This file was deleted.

4 changes: 4 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@

- To test opencode in the `packages/opencode` directory you can run `bun dev`

## SDK

To regenerate the javascript SDK, run ./packages/sdk/js/script/build.ts

## Tool Calling

- ALWAYS USE PARALLEL TOOLS WHEN APPLICABLE.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ The following PRs have been merged into this fork and are awaiting merge into up

| PR | Title | Author | Status | Description |
| ----------------------------------------------------------------------------- | ------------------------------------------- | ------------------------------------------------------------ | ------ | ------------------------------------------------------------------------ |
| [#6476](https://github.com/sst/opencode/pull/6476) | Edit suggested changes before applying | [@dmmulroy](https://github.com/dmmulroy) | Open | Press 'e' to edit AI suggestions in your editor before accepting |
| [#6507](https://github.com/sst/opencode/pull/6507) | Optimize Ripgrep.tree() (109x faster) | [@Karavil](https://github.com/Karavil) | Open | 109x performance improvement for large repos by streaming ripgrep output |
| [#6360](https://github.com/sst/opencode/pull/6360) | Desktop: Edit Project | [@dbpolito](https://github.com/dbpolito) | Merged | Edit project name, icon color, and custom icon image in desktop sidebar |
| [#6368](https://github.com/sst/opencode/pull/6368) | Desktop: Sidebar subsessions support | [@dbpolito](https://github.com/dbpolito) | Open | Expand/collapse subsessions in sidebar with chevron indicators |
| [#6372](https://github.com/sst/opencode/pull/6372) | Desktop: Image Preview and Dedupe | [@dbpolito](https://github.com/dbpolito) | Merged | Click user attachments to preview images, dedupe file uploads |
Expand All @@ -78,7 +80,7 @@ The following PRs have been merged into this fork and are awaiting merge into up
| [#140](https://github.com/Latitudes-Dev/shuvcode/pull/140) | Toggle transparent background | [@JosXa](https://github.com/JosXa) | Open | Command palette toggle for transparent TUI background on any theme |
| [Branch](https://github.com/ariane-emory/opencode/tree/feat/glob-permissions) | Granular File Permissions | [@ariane-emory](https://github.com/ariane-emory) | N/A | Glob pattern support for `permission.edit` to restrict agent file access |

_Last updated: 2025-12-29_
_Last updated: 2025-12-31_

---

Expand Down
1 change: 1 addition & 0 deletions STATS.md
Original file line number Diff line number Diff line change
Expand Up @@ -186,3 +186,4 @@
| 2025-12-28 | 1,390,388 (+18,617) | 1,245,690 (+7,454) | 2,636,078 (+26,071) |
| 2025-12-29 | 1,415,560 (+25,172) | 1,257,101 (+11,411) | 2,672,661 (+36,583) |
| 2025-12-30 | 1,445,450 (+29,890) | 1,272,689 (+15,588) | 2,718,139 (+45,478) |
| 2025-12-31 | 1,479,598 (+34,148) | 1,293,235 (+20,546) | 2,772,833 (+54,694) |
39 changes: 24 additions & 15 deletions bun.lock
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
},
"packages/app": {
"name": "@opencode-ai/app",
"version": "1.0.218",
"version": "1.0.220",
"dependencies": {
"@kobalte/core": "catalog:",
"@opencode-ai/sdk": "workspace:*",
Expand Down Expand Up @@ -71,7 +71,7 @@
},
"packages/console/app": {
"name": "@opencode-ai/console-app",
"version": "1.0.218",
"version": "1.0.220",
"dependencies": {
"@cloudflare/vite-plugin": "1.15.2",
"@ibm/plex": "6.4.1",
Expand Down Expand Up @@ -99,7 +99,7 @@
},
"packages/console/core": {
"name": "@opencode-ai/console-core",
"version": "1.0.218",
"version": "1.0.220",
"dependencies": {
"@aws-sdk/client-sts": "3.782.0",
"@jsx-email/render": "1.1.1",
Expand All @@ -126,7 +126,7 @@
},
"packages/console/function": {
"name": "@opencode-ai/console-function",
"version": "1.0.218",
"version": "1.0.220",
"dependencies": {
"@ai-sdk/anthropic": "2.0.0",
"@ai-sdk/openai": "2.0.2",
Expand All @@ -150,7 +150,7 @@
},
"packages/console/mail": {
"name": "@opencode-ai/console-mail",
"version": "1.0.218",
"version": "1.0.220",
"dependencies": {
"@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3",
Expand All @@ -174,7 +174,7 @@
},
"packages/desktop": {
"name": "@shuvcode/desktop",
"version": "1.0.218",
"version": "1.0.220",
"dependencies": {
"@opencode-ai/app": "workspace:*",
"@solid-primitives/storage": "catalog:",
Expand Down Expand Up @@ -202,7 +202,7 @@
},
"packages/enterprise": {
"name": "@opencode-ai/enterprise",
"version": "1.0.218",
"version": "1.0.220",
"dependencies": {
"@opencode-ai/ui": "workspace:*",
"@opencode-ai/util": "workspace:*",
Expand Down Expand Up @@ -231,7 +231,7 @@
},
"packages/function": {
"name": "@opencode-ai/function",
"version": "1.0.218",
"version": "1.0.220",
"dependencies": {
"@octokit/auth-app": "8.0.1",
"@octokit/rest": "catalog:",
Expand All @@ -247,7 +247,7 @@
},
"packages/opencode": {
"name": "opencode",
"version": "1.0.218",
"version": "1.0.220",
"bin": {
"opencode": "./bin/opencode",
},
Expand All @@ -272,6 +272,7 @@
"@ai-sdk/provider": "2.0.0",
"@ai-sdk/provider-utils": "3.0.19",
"@ai-sdk/togetherai": "1.0.30",
"@ai-sdk/vercel": "1.0.31",
"@ai-sdk/xai": "2.0.42",
"@clack/prompts": "1.0.0-alpha.1",
"@hono/standard-validator": "0.1.5",
Expand Down Expand Up @@ -349,7 +350,7 @@
},
"packages/plugin": {
"name": "@opencode-ai/plugin",
"version": "1.0.218",
"version": "1.0.220",
"dependencies": {
"@opencode-ai/sdk": "workspace:*",
"zod": "catalog:",
Expand All @@ -369,7 +370,7 @@
},
"packages/sdk/js": {
"name": "@opencode-ai/sdk",
"version": "1.0.218",
"version": "1.0.220",
"devDependencies": {
"@hey-api/openapi-ts": "0.88.1",
"@tsconfig/node22": "catalog:",
Expand All @@ -380,7 +381,7 @@
},
"packages/slack": {
"name": "@opencode-ai/slack",
"version": "1.0.218",
"version": "1.0.220",
"dependencies": {
"@opencode-ai/sdk": "workspace:*",
"@slack/bolt": "^3.17.1",
Expand All @@ -393,7 +394,7 @@
},
"packages/ui": {
"name": "@opencode-ai/ui",
"version": "1.0.218",
"version": "1.0.220",
"dependencies": {
"@kobalte/core": "catalog:",
"@opencode-ai/sdk": "workspace:*",
Expand Down Expand Up @@ -431,7 +432,7 @@
},
"packages/util": {
"name": "@opencode-ai/util",
"version": "1.0.218",
"version": "1.0.220",
"dependencies": {
"zod": "catalog:",
},
Expand All @@ -442,7 +443,7 @@
},
"packages/web": {
"name": "@opencode-ai/web",
"version": "1.0.218",
"version": "1.0.220",
"dependencies": {
"@astrojs/cloudflare": "12.6.3",
"@astrojs/markdown-remark": "6.3.1",
Expand Down Expand Up @@ -574,6 +575,8 @@

"@ai-sdk/togetherai": ["@ai-sdk/[email protected]", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.29", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.19" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-9bxQbIXnWSN4bNismrza3NvIo+ui/Y3pj3UN6e9vCszCWFCN45RgISi4oDe10RqmzaJ/X8cfO/Tem+K8MT3wGQ=="],

"@ai-sdk/vercel": ["@ai-sdk/[email protected]", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.30", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ggvwAMt/KsbqcdR6ILQrjwrRONLV/8aG6rOLbjcOGvV0Ai+WdZRRKQj5nOeQ06PvwVQtKdkp7S4IinpXIhCiHg=="],

"@ai-sdk/xai": ["@ai-sdk/[email protected]", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.29", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.19" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-wlwO4yRoZ/d+ca29vN8SDzxus7POdnL7GBTyRdSrt6icUF0hooLesauC8qRUC4aLxtqvMEc1YHtJOU7ZnLWbTQ=="],

"@alloc/quick-lru": ["@alloc/[email protected]", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
Expand Down Expand Up @@ -4188,6 +4191,12 @@

"@ai-sdk/togetherai/@ai-sdk/openai-compatible": ["@ai-sdk/[email protected]", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.19" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-cZUppWzxjfpNaH1oVZ6U8yDLKKsdGbC9X0Pex8cG9CXhKWSoVLLnW1rKr6tu9jDISK5okjBIW/O1ZzfnbUrtEw=="],

"@ai-sdk/vercel/@ai-sdk/openai-compatible": ["@ai-sdk/[email protected]", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-thubwhRtv9uicAxSWwNpinM7hiL/0CkhL/ymPaHuKvI494J7HIzn8KQZQ2ymRz284WTIZnI7VMyyejxW4RMM6w=="],

"@ai-sdk/vercel/@ai-sdk/provider": ["@ai-sdk/[email protected]", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng=="],

"@ai-sdk/vercel/@ai-sdk/provider-utils": ["@ai-sdk/[email protected]", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-iXHVe0apM2zUEzauqJwqmpC37A5rihrStAih5Ks+JE32iTe4LZ58y17UGBjpQQTCRw9YxMeo2UFLxLpBluyvLQ=="],

"@ai-sdk/xai/@ai-sdk/openai-compatible": ["@ai-sdk/[email protected]", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.19" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-cZUppWzxjfpNaH1oVZ6U8yDLKKsdGbC9X0Pex8cG9CXhKWSoVLLnW1rKr6tu9jDISK5okjBIW/O1ZzfnbUrtEw=="],

"@apideck/better-ajv-errors/ajv": ["[email protected]", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
Expand Down
2 changes: 1 addition & 1 deletion nix/hashes.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"nodeModules": "sha256-2Wbnxy9SPcZkO03Sis3uiypPXa87jc5TzKbo6PvMlxY="
"nodeModules": "sha256-7zMUWgMCnoe2As8WdEKazkKiGEcUIk5rP4zFvX9USgA="
}
2 changes: 1 addition & 1 deletion packages/app/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/app",
"version": "1.0.218",
"version": "1.0.220",
"description": "",
"type": "module",
"exports": {
Expand Down
21 changes: 12 additions & 9 deletions packages/app/src/components/dialog-create-project.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -363,27 +363,30 @@ export const DialogCreateProject: Component = () => {
<div class="flex gap-1 p-1 bg-surface-base rounded-lg">
<Button
variant={activeTab() === "existing" ? "secondary" : "ghost"}
class="flex-1 justify-center"
class="flex-1 justify-center min-w-0 px-2 sm:px-3"
onClick={() => setActiveTab("existing")}
>
<Icon name="folder-add-left" />
Add Existing
<Icon name="folder-add-left" class="shrink-0" />
<span class="hidden sm:inline">Add Existing</span>
<span class="sm:hidden">Existing</span>
</Button>
<Button
variant={activeTab() === "create" ? "secondary" : "ghost"}
class="flex-1 justify-center"
class="flex-1 justify-center min-w-0 px-2 sm:px-3"
onClick={() => setActiveTab("create")}
>
<Icon name="plus" />
Create New
<Icon name="plus" class="shrink-0" />
<span class="hidden sm:inline">Create New</span>
<span class="sm:hidden">New</span>
</Button>
<Button
variant={activeTab() === "clone" ? "secondary" : "ghost"}
class="flex-1 justify-center"
class="flex-1 justify-center min-w-0 px-2 sm:px-3"
onClick={() => setActiveTab("clone")}
>
<Icon name="github" />
Git Clone
<Icon name="github" class="shrink-0" />
<span class="hidden sm:inline">Git Clone</span>
<span class="sm:hidden">Clone</span>
</Button>
</div>

Expand Down
14 changes: 9 additions & 5 deletions packages/app/src/components/header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@ export function Header(props: {
when={layout.projects.list().length > 0 && params.dir}
fallback={
<div class="hidden md:flex items-center gap-2 ml-auto">
<FontPicker />
<ThemePicker />
<FontPicker />
</div>
}
>
Expand Down Expand Up @@ -121,6 +121,12 @@ export function Header(props: {
</Show>
</div>
<div class="flex items-center gap-4">
{/* Theme and Font first - desktop only */}
<div class="hidden md:flex items-center gap-2">
<ThemePicker />
<FontPicker />
</div>
{/* Review toggle - requires session */}
<Show when={currentSession()}>
<Tooltip
class="hidden md:block shrink-0"
Expand Down Expand Up @@ -152,6 +158,7 @@ export function Header(props: {
</Button>
</Tooltip>
</Show>
{/* Terminal toggle - always visible on desktop */}
<Tooltip
class="hidden md:block shrink-0"
value={
Expand Down Expand Up @@ -181,6 +188,7 @@ export function Header(props: {
</div>
</Button>
</Tooltip>
{/* Share - requires session and share enabled */}
<Show when={shareEnabled() && currentSession()}>
<Popover
title="Share session"
Expand Down Expand Up @@ -216,10 +224,6 @@ export function Header(props: {
})}
</Popover>
</Show>
<div class="hidden md:flex items-center gap-2">
<FontPicker />
<ThemePicker />
</div>
</div>
</>
)
Expand Down
Loading