Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
676 commits
Select commit Hold shift + click to select a range
8f94e24
feat(app): jump to a shell from its finished notice (#58663)
Hona Oct 24, 2026
20a6cc7
chore(core): refresh bundled models.dev snapshot
opencode-agent[bot] Oct 24, 2026
1c183cf
fix(app): stop an empty live status row from opening a gap above wait…
Hona Oct 24, 2026
e8c8b1c
fix(app): keep the live status row's height once shown while input wa…
Hona Oct 24, 2026
33ffc3e
feat(app): show Console budgets and Go usage where they stop you (#58…
adamdotdevin Oct 24, 2026
6806c6e
docs(go): replace Gemini 4 Argon Contributor with Gemini 4 Argon (#58…
opencode-agent[bot] Oct 24, 2026
e42f6d1
feat(core): read OpenCode Console usage limits and classify budget re…
adamdotdevin Oct 24, 2026
5e4aa55
feat(tui): show OpenCode Console usage limits (#58731)
adamdotdevin Oct 24, 2026
7ba0e4b
chore(ci): skip CI on draft pull requests (#58750)
Tarquinen Oct 24, 2026
cab780b
docs(console): document the estimated BYOK cost in inference response…
adamdotdevin Oct 24, 2026
53b044d
fix(ai): encode video in Chat routes by default (#58613)
rekram1-node Oct 24, 2026
a5328d2
fix(core): fill Bedrock endpoint region from provider settings (#58538)
rekram1-node Oct 24, 2026
05bc77f
docs(go): remove deprecated LongCat 2.5 Preview Free (#58267)
opencode-agent[bot] Oct 24, 2026
9984539
fix(core): match absolute instruction globs across directories (#58749)
heimoshuiyu Oct 24, 2026
2dc8db4
fix(core): skip malformed MCP tools instead of failing the server (#5…
rekram1-node Oct 24, 2026
1aeb646
fix(ai): classify Bedrock throttling as a retryable rate limit (#58759)
Irish-Joseph Oct 24, 2026
de284dc
refactor(core): keep Go allowance out of messages and sessions (#58765)
adamdotdevin Oct 24, 2026
17b79f4
chore(github): pin actions/cache to commit SHA in GitHub Action (#58769)
opencode-agent[bot] Oct 24, 2026
3de8f3a
fix(tui): contain plugin slots and routes that render bare text (#58144)
anmol0b Oct 24, 2026
0f379f0
feat(app): show a turn's web sources behind the Sources experiment (#…
kitlangton Oct 24, 2026
64aaf2e
feat(desktop): add opt-in memory logging and remote debugging (#58315)
kitlangton Oct 24, 2026
8d52b4e
feat(desktop): capture heaps on an opt-in signal (#58317)
kitlangton Oct 24, 2026
0093fe5
docs(go): add Iceman Contributor Free (#58792)
opencode-agent[bot] Oct 24, 2026
e573115
perf(core): cache git discovery in Project.resolve by metadata finger…
kitlangton Oct 24, 2026
13a615b
perf(core): convert each tool schema once (#58798)
kitlangton Oct 24, 2026
bd2ba0a
fix(schema): validate base64 attachments in linear time (#58811)
rekram1-node Oct 24, 2026
252ed4a
fix(ai): classify AWS modeled errors from every restJson1 identity lo…
rekram1-node Oct 24, 2026
6ac6549
fix(ai): classify failed Google Interactions by reported errors (#58771)
rekram1-node Oct 24, 2026
c34a576
chore(core): refresh bundled models.dev snapshot
opencode-agent[bot] Oct 25, 2026
097a93e
feat(ai): replace experimental evaluation with Decision (#58758)
rekram1-node Oct 25, 2026
1cf1d43
fix(ai): support Messages video inputs (#58614)
rekram1-node Oct 25, 2026
ddd9e10
fix(ai): support Responses video inputs (#58615)
rekram1-node Oct 25, 2026
dad29a8
refactor(ai): make Promise the root entry and move Effect to @opencod…
rekram1-node Oct 25, 2026
e0b6039
refactor(core): convert tool schemas once at registration (#58848)
rekram1-node Oct 25, 2026
ead522a
fix(ai): preserve text and reasoning after the finish reason (#58851)
rekram1-node Oct 25, 2026
9cbdffc
fix(core): import ToolDefinition from @opencode/ai/effect (#58861)
rekram1-node Oct 25, 2026
d7e56bc
fix(ai): send OpenAI Chat options that were silently dropped (#58857)
rekram1-node Oct 25, 2026
16cd50d
fix(ai): keep known throttles out of overflow matching (#58866)
rekram1-node Oct 25, 2026
ed623cc
feat(ai): add OpenAI Responses reasoning mode and context options (#5…
rekram1-node Oct 25, 2026
4c8f4fc
fix(ai): let Groq use the shared Chat parallel_tool_calls and service…
rekram1-node Oct 25, 2026
b7321f7
feat(ai): add Anthropic fast mode speed option (#58870)
rekram1-node Oct 25, 2026
b367fdd
fix(ai): send top_k and drop penalties for xAI Responses (#58868)
rekram1-node Oct 25, 2026
0b7f4c4
fix(core): revalidate the models.dev catalog with its ETag (#58813)
rekram1-node Oct 25, 2026
ce44769
feat(app): rebuild Knobs as a stack of features (#57921)
kitlangton Oct 25, 2026
2afdbcd
ci: gate versioned releases behind the release environment (#58885)
thdxr Oct 25, 2026
dbdf775
fix(ai): keep cassettes of filtered tests when recording (#58890)
rekram1-node Oct 25, 2026
9a1f3d4
ci: remove issue triage workflow, agent, and tool (#58888)
opencode-agent[bot] Oct 25, 2026
8fd2ec1
feat(ai): send min_p on xAI Responses (#58889)
rekram1-node Oct 25, 2026
32b5701
ci: gate production deploys and release publishing behind approval en…
thdxr Oct 25, 2026
a41d09b
feat(core): merge Console config as a config layer (#57703)
vimtor Oct 25, 2026
7a83c69
fix(app): let a custom Close tab shortcut close terminal and browser …
opencode-agent[bot] Oct 25, 2026
53f83e7
feat(core): expose MCP server title from serverInfo (#58950)
opencode-agent[bot] Oct 25, 2026
b79dce4
fix(app): name variant shortcut consistently (#58951)
opencode-agent[bot] Oct 25, 2026
49a112f
fix(app): keep the command palette at a fixed height (#58939)
opencode-agent[bot] Oct 25, 2026
221a254
fix(app): align the vertical tabs sidebar with the traffic lights (#5…
opencode-agent[bot] Oct 25, 2026
280c8e0
fix(app): polish the MCPs dialog (#58953)
opencode-agent[bot] Oct 25, 2026
66a3ed9
fix(app): keep the browser page under a still while a dialog is open …
opencode-agent[bot] Oct 25, 2026
1f8a8bd
fix(app): tidy search shortcuts and add Unbind while recording (#58964)
opencode-agent[bot] Oct 25, 2026
06dc6a0
feat(session-ui): render diagrams with Pele (#57004)
kitlangton Oct 25, 2026
77c61e0
refactor(app): settle shipped motion experiments and fix peek edge (#…
kitlangton Oct 25, 2026
fecd50d
chore(core): refresh bundled models.dev snapshot
opencode-agent[bot] Oct 25, 2026
2432058
chore: update nix node_modules hashes
opencode-agent[bot] Oct 25, 2026
efb6b1d
fix(ui): open neighbouring tooltips without the full delay (#58971)
opencode-agent[bot] Oct 25, 2026
5be4b16
feat(session-ui): add a copy button to shell output (#58974)
opencode-agent[bot] Oct 25, 2026
b7d1cc6
fix(session-ui): tighten execute details code spacing (#58975)
opencode-agent[bot] Oct 25, 2026
32db0d5
fix(app): match Settings MCP rows to the MCPs dialog (#58979)
opencode-agent[bot] Oct 25, 2026
507fc19
fix(app): keep Search projects to the project list (#58978)
opencode-agent[bot] Oct 25, 2026
30890fd
fix(client): reload VCS info when the branch changes (#58982)
opencode-agent[bot] Oct 25, 2026
9e8c5f5
feat(ui): make the line comment card a text field (#58970)
opencode-agent[bot] Oct 25, 2026
2d91ed5
perf(core): skip encoding durable event payloads that aren't persiste…
kitlangton Oct 25, 2026
6a49548
feat(app): rewind and fork from a message, one slash everywhere (#58865)
kitlangton Oct 25, 2026
30311ae
feat(app): build Knobs feature pages from knobs controls (#58896)
kitlangton Oct 25, 2026
585b5a4
docs: describe Console config layer precedence (#58987)
vimtor Oct 25, 2026
1564686
fix(cli): keep the service's XDG_STATE_HOME out of tool shells and na…
kitlangton Oct 25, 2026
b6cbbd7
fix(cli): bound server shutdown with a 10 s deadline (#58817)
kitlangton Oct 25, 2026
9cc9e58
fix(core): start fff search lazily on first find (#58959)
kitlangton Oct 25, 2026
161ad24
fix(app): keep search sessions in a stable order when it opens (#58908)
kitlangton Oct 25, 2026
80dc523
fix(app): let a later steer move work an earlier move missed (#58984)
kitlangton Oct 25, 2026
fc7af90
fix(app): remove the message menu experiment (#58867)
kitlangton Oct 25, 2026
a174153
fix(app): make Add project a normal row in the location dialog
thdxr Oct 25, 2026
70c69f0
feat(core): store session media as media:<hash> refs in a content-add…
kitlangton Oct 25, 2026
5ed03ad
feat(session-ui): quiet automatic compaction divider (#58996)
kitlangton Oct 25, 2026
0997e37
fix(app): put Add project above the projects heading
thdxr Oct 25, 2026
b88fd27
feat(app): add an Add project button to the location search
thdxr Oct 25, 2026
d9920ef
fix(app): tighten spacing under Add project
thdxr Oct 25, 2026
450e7b9
fix(server): don't boot a Location for global session routes (#58997)
kitlangton Oct 25, 2026
b5da081
feat(app): ship number keys for question answers and mark multi-selec…
kitlangton Oct 25, 2026
1743d1a
Remove the OpenCode GitHub Action (#59032)
thdxr Oct 25, 2026
5d8ebf3
refactor(session-ui): parse session diff patches with pierre (#59017)
kitlangton Oct 25, 2026
50ddde9
refactor(app): replace solid-presence with a local createPresence (#5…
kitlangton Oct 25, 2026
54b66f9
chore(session-ui): drop strip-ansi (#59011)
kitlangton Oct 25, 2026
193a556
chore(app): drop @dnd-kit/helpers (#59015)
kitlangton Oct 25, 2026
467d61f
chore(app): drop remeda from app and ui (#59016)
kitlangton Oct 25, 2026
2c0dad3
chore(app): drop @solid-primitives/i18n (#59014)
kitlangton Oct 25, 2026
28907e8
chore(app): move tailwindcss to devDependencies (#59018)
kitlangton Oct 25, 2026
9aeaa3c
feat(util): add a QR encoder (#59056)
kitlangton Oct 25, 2026
798971c
chore(app): drop core-js polyfills (#59007)
kitlangton Oct 25, 2026
3e4463a
chore: use our QR encoder (#59057)
kitlangton Oct 25, 2026
a4eb2f8
refactor(ui): use one animation library (#59025)
kitlangton Oct 25, 2026
44fc9d2
refactor(core): drop unused session_pending table and pin the history…
kitlangton Oct 25, 2026
7c16f4a
Remove the stats and containers workflows (#59075)
thdxr Oct 25, 2026
5ae201c
Remove the models-snapshot workflow (#59076)
thdxr Oct 25, 2026
4b83402
chore: merge dev into beta
Hona Oct 25, 2026
7b5b7a8
ci: name workflows by kind (check-*, bot-*, triage-*) (#59077)
thdxr Oct 25, 2026
e12fad9
feat(core): opt-in blob writes for session media behind experimental.…
kitlangton Oct 25, 2026
6820420
test(core): guard boot work counts for catalog lookups, Azure clones …
kitlangton Oct 25, 2026
71d29ef
feat(console): serve apple-app-site-association for iOS pair links (#…
kitlangton Oct 25, 2026
8b813d3
feat(core): watch files open in the side panel (#59081)
Hona Oct 25, 2026
f699163
fix(client): register running sessions missed while disconnected (#53…
kitlangton Oct 25, 2026
61163cb
fix(server): let agent and provider lists wait for plugins (#59082)
Hona Oct 25, 2026
c8cf3a5
fix(server): stop form polling from booting idle locations (#59083)
Hona Oct 25, 2026
01cd723
fix(core): publish catalog updates only when they change (#59084)
Hona Oct 25, 2026
eba3399
fix(core): reload compatibility skills only for their own sources (#5…
Hona Oct 25, 2026
c156d3c
fix(core): canonicalize location in activity tracking (#59087)
Hona Oct 25, 2026
14d8b1d
fix(core): use the index when loading turn diffs (#59088)
Hona Oct 25, 2026
79469ef
feat(server): report the machine's hostname in /api/info (#59090)
Hona Oct 25, 2026
6f861e2
feat(core): show detected project icons (#59093)
Hona Oct 25, 2026
4703b46
refactor(app): remove the experimental inbox Home page (#59096)
Hona Oct 25, 2026
c4c6065
feat(app): show todowrite todos as a pill above the composer (#59092)
Hona Oct 25, 2026
d1cf7dd
fix(core): send unchanged hooked requests without copying the body (#…
Hona Oct 25, 2026
ca7d60b
chore: merge dev into beta
Hona Oct 25, 2026
91b5a7c
fix(core): stop running tools from keeping the request hook event ali…
Hona Oct 25, 2026
cfb44b5
fix(client): skip catalog refetches for unloaded locations (#59099)
Hona Oct 25, 2026
7b5bd8f
ci: point turbo and docs at check-test.yml (#59100)
thdxr Oct 25, 2026
e943bb6
fix(client): let clients drop tool-result image payloads from the sto…
Hona Oct 25, 2026
f8af56d
fix(cli): retry service file renames on Windows (#59105)
Hona Oct 25, 2026
08ac673
feat(tui): list OpenCode Console before OpenCode Go (#59107)
Hona Oct 25, 2026
5b41e1f
fix(app): toggle MCP servers in the session's location from settings …
opencode-agent[bot] Oct 26, 2026
f669c46
feat(app): show the open session's title in the browser tab (#59131)
opencode-agent[bot] Oct 26, 2026
ec09e45
fix(desktop): finish the macOS Cmd+Q quit after shutdown (#59144)
opencode-agent[bot] Oct 26, 2026
be315b1
chore: merge beta into dev
Hona Oct 26, 2026
22a4eb6
fix(desktop): call the release notes page What's new (#59152)
Hona Oct 26, 2026
350dc1a
chore(core): bump gitlab-ai-provider to 6.23.1 (#58999)
vglafirov Oct 26, 2026
e928d4f
feat(server): add experimental GET /api/experimental/media/:hash and …
kitlangton Oct 26, 2026
ab0b012
refactor(ai): rename decision imageInput to mediaInput (#58879)
rekram1-node Oct 26, 2026
b21b21b
feat(ai): add experimental Extraction API for Cloudflare Clairic (#58…
rekram1-node Oct 26, 2026
421e44e
fix(ai): map avif, heic, heif and mov extensions to media types (#58886)
rekram1-node Oct 26, 2026
c54677b
fix(core): tell HEIC, QuickTime and M4A apart from MP4 (#58887)
rekram1-node Oct 26, 2026
6adc1ae
fix(app): make the browser tests pass after the beta merge (#59160)
Hona Oct 26, 2026
2903845
perf(session): load a step's history once (#59091)
kitlangton Oct 26, 2026
787811f
perf(core): resize images in a worker and release photon memory when …
kitlangton Oct 26, 2026
9007700
feat(ai): configurable prompt cache TTL (#59157)
rekram1-node Oct 26, 2026
f7a9f1b
fix(core): drop bare remote names from branch lists and search remote…
kitlangton Oct 26, 2026
74556a2
feat(ai): add typed Bedrock Converse options (#59171)
rekram1-node Oct 26, 2026
9435378
fix(core): coordinate credential refreshes across locations and proce…
rekram1-node Oct 26, 2026
d5bb993
feat(build): fetch the models.dev catalog once per release and verify…
rekram1-node Oct 26, 2026
041202b
docs(ai): fix stale README and type-check examples (#59179)
rekram1-node Oct 26, 2026
490456d
refactor(core): derive provider option keys from the settings schema …
rekram1-node Oct 26, 2026
ed74ec8
fix(httpapi-codegen): emit flat Promise input field types (#58875)
rekram1-node Oct 26, 2026
5bf3e82
feat(desktop): add a zoom setting that persists (#59277)
opencode-agent[bot] Oct 26, 2026
7359a48
perf(tui): step the tab pulse at 20 fps instead of holding the render…
simonklee Oct 26, 2026
d8607b6
refactor(ai): replace wildcard exports with an explicit public API (#…
rekram1-node Oct 26, 2026
0c4efe2
fix(install): name the temp directory when the download can't be writ…
neriousy Oct 26, 2026
51f93ee
chore: remove the V2 HTTP API audit checklist (#59313)
rekram1-node Oct 26, 2026
1434464
feat(plugin): filter event subscriptions by type (#58864)
rekram1-node Oct 26, 2026
b252621
fix(core): expose code mode tools directly when execute is denied (#5…
rekram1-node Oct 26, 2026
ab4d1f3
chore: upgrade opentui v0.7.0 (#59295)
simonklee Oct 26, 2026
b9e594b
fix(tui): keep pasted text intact when you copy it out of the prompt …
kitlangton Oct 26, 2026
3a7ba7a
fix(ai): send Kimi models the right tool arguments when schemas use t…
kitlangton Oct 26, 2026
6135e07
fix(core): treat trailing-slash directories as the same Location (#59…
rekram1-node Oct 26, 2026
0ca7885
fix(core): close Locations in parallel on shutdown (#59326)
rekram1-node Oct 26, 2026
9f96a33
fix(core): stop custom commands from overwriting $0 and re-filling $A…
kitlangton Oct 26, 2026
dc21f52
fix(core): stop GPT patch edits from deleting a file moved onto itsel…
kitlangton Oct 26, 2026
65096cd
feat(core): read the models.dev catalog from the experimental v2 API …
rekram1-node Oct 26, 2026
d641fc4
perf(core): stop holding huge matched lines in memory during code sea…
kitlangton Oct 26, 2026
7405f93
refactor(core): folder-permission checks use the project's own file s…
kitlangton Oct 26, 2026
be600a2
fix(core): accept a Databricks host that includes the scheme (#59334)
rekram1-node Oct 26, 2026
ba70b48
fix(core): use Vertex multi-region hosts for eu and us (#59335)
rekram1-node Oct 26, 2026
9ed37f8
fix(core): keep codemode on legacy MCP entries (#59126)
tneemo Oct 26, 2026
2bf756e
fix(core): don't warm a session while its model request is running (#…
rekram1-node Oct 26, 2026
4e0fca1
perf(app): stop reloading old history every time you return to a sess…
kitlangton Oct 26, 2026
e31647d
fix(session-ui): make question highlight instant and hover-only (#59333)
kitlangton Oct 26, 2026
552e802
docs(console): list DeepSeek V4 Flash as deprecated (#59344)
opencode-agent[bot] Oct 26, 2026
6996bbc
ci: separate release builds from signing and publishing (#59046)
thdxr Oct 26, 2026
0ed012c
ci: restore deploy.yml environments (#59353)
thdxr Oct 26, 2026
4371c29
fix(core): verify SHA-256 of downloaded ripgrep before running it (#5…
R44VC0RP Oct 26, 2026
0ec4d0f
fix(cli): report run server connection errors as JSON (#59366)
rekram1-node Oct 26, 2026
0f3a0c2
fix(opencode): verify Bun runtime zip checksum in release builds (#59…
R44VC0RP Oct 26, 2026
ae876ee
feat(protocol): list models by types, like event filtering (#59355)
rekram1-node Oct 26, 2026
7ad676b
feat(app): morph between questions in the question dock (#59085)
kitlangton Oct 26, 2026
0749024
fix(server): honor OPENCODE_SERVER_USERNAME for serve and --server (#…
neriousy Oct 26, 2026
804a7f3
fix(app): wait 500ms on the toggle before peeking the sidebar (#59381)
jlongster Oct 26, 2026
a697f53
feat(core): let custom models in config set a model type (#59388)
rekram1-node Oct 26, 2026
4e982c0
fix(core): add GPT-6.1 Terra to Sign in with ChatGPT models (#59359)
opencode-agent[bot] Oct 26, 2026
161d466
fix(app): turn off question dock animation by default (#59389)
kitlangton Oct 26, 2026
cbe110e
test(tui): remove flaky update-restart, session-tabs storage and tab-…
opencode-agent[bot] Oct 26, 2026
cc4faf4
fix(tui): identify config-defined providers (#57007)
OpeOginni Oct 26, 2026
a0dca06
perf(core): sort integrations once per rebuild (#59402)
rekram1-node Oct 26, 2026
8eb272c
fix(app): stop question dock motion when its knob turns off (#59407)
kitlangton Oct 26, 2026
9370121
feat(ai): add opt-in raw provider events to LLM streams (#59382)
rekram1-node Oct 26, 2026
b2e4c77
feat(ai): add image and decision entrypoints for catalog providers (#…
rekram1-node Oct 26, 2026
f97f82c
fix(app): stop the history picker showing a sliver of an extra row, a…
kitlangton Oct 26, 2026
e2bc79d
fix(util): kill spawned process groups when opencode exits (#59411)
rekram1-node Oct 26, 2026
fa5b4bd
fix(release): add repository to ai, plugin and cli package.json (#59422)
thdxr Oct 26, 2026
e1eefca
fix(app): keep the @ menu open while it searches (#59425)
kitlangton Oct 26, 2026
3d67a77
fix(app): question dock review fixes (#59383)
kitlangton Oct 26, 2026
82b5724
fix(app): keep todo rows from shrinking in the todo panel (#59430)
opencode-agent[bot] Oct 26, 2026
8a45070
feat(app): feather the question dock's scroll edge (#59395)
kitlangton Oct 26, 2026
d265088
fix(release): push stable tags with the release deploy key (#59428)
thdxr Oct 26, 2026
59542da
ci: run check on PRs into beta (#59408)
thdxr Oct 26, 2026
4843242
fix(app): build settings search on the shared typeahead (#59412)
kitlangton Oct 26, 2026
c87185b
feat(ai): add LLM.loop to run tools until the model stops (#59421)
rekram1-node Oct 26, 2026
7b3f52f
fix(app): slash in the subagent breadcrumb and a quieter subagent bar…
Hona Oct 26, 2026
cd15a6a
Revert "fix(tui): identify config-defined providers (#57007)" (#59439)
opencode-agent[bot] Oct 26, 2026
0b050ac
Revert "fix(server): honor OPENCODE_SERVER_USERNAME for serve and --s…
neriousy Oct 27, 2026
dae4077
feat(plugin): add OpenCode Desktop GUI plugins (#55246)
Hona Oct 27, 2026
a28f95a
fix(ai): stop LLM.loop when a step reports a provider error (#59442)
rekram1-node Oct 27, 2026
54bb0a9
feat(ai): allow async tools and add generateObject to the Promise cli…
rekram1-node Oct 27, 2026
c11a32f
fix(server): report response encoding failures as server errors (#59459)
rekram1-node Oct 27, 2026
758cf5a
feat(plugin): add toasts, dialogs, notifications, UI, tabs and compos…
Hona Oct 27, 2026
19d87a7
fix(app): list What's new with About in settings (#59471)
Hona Oct 27, 2026
09b4275
ci: publish nix hashes through an auto-merged pull request (#59464)
thdxr Oct 27, 2026
8d26861
fix(core): skip catalog entrypoints this build can't load (#59475)
rekram1-node Oct 27, 2026
560b11b
fix(ai): accept url image results from OpenAI-style image APIs (#59474)
rekram1-node Oct 27, 2026
bc175f6
fix(core): size compaction requests from the provider's last count (#…
rekram1-node Oct 27, 2026
5792c3e
feat(app): manage desktop plugins in Extensions › Plugins (#59489)
Hona Oct 27, 2026
542e683
ci: rename ci-owners team to releasers (#59486)
thdxr Oct 27, 2026
6b1bc48
fix(cli): let plugin add install GUI-only packages (#59492)
Hona Oct 27, 2026
c504b9f
fix(ai): send input images to Cloudflare Workers AI image models (#59…
rekram1-node Oct 27, 2026
fd1e2c1
chore: update nix node_modules hashes (#59484)
github-actions[bot] Oct 27, 2026
8b17d2e
ci(release): only releasers can start stable releases (#59488)
thdxr Oct 27, 2026
a5587e3
refactor(ai): align media and decision responses with the generate AP…
rekram1-node Oct 27, 2026
2a0639a
feat(protocol): define experimental image and decision generation end…
rekram1-node Oct 27, 2026
92b8c57
fix(app): register each shortcut once and drop removed plugins from S…
Hona Oct 27, 2026
f5a1741
fix(ui): stop dialogs creating untracked computations on close (#59501)
Hona Oct 27, 2026
15e56cf
fix(core): pass the catalog's decision media format to decision model…
rekram1-node Oct 27, 2026
08132f1
chore(core): update the bundled models.dev catalog (#59508)
rekram1-node Oct 27, 2026
da638b6
docs: document model compatibility settings (#59509)
rekram1-node Oct 27, 2026
5c83520
chore(ci): deploy dev Cloudflare workers from the dev environment (#5…
thdxr Oct 27, 2026
362e000
ci(release): publish desktop on every dev commit (#59507)
Hona Oct 27, 2026
5f8ee0f
ci(release): push the Homebrew formula with a homebrew-tap deploy key…
thdxr Oct 27, 2026
54dcd34
fix(release): restore desktop app-update.yml and keep V1 as the GitHu…
Hona Oct 27, 2026
6aedf36
fix(session-ui): copy Markdown selections without theme colours (#59151)
opencode-agent[bot] Oct 27, 2026
f993a89
fix(app): show focus ring while renaming the session title (#59148)
opencode-agent[bot] Oct 27, 2026
1097e26
release: v2.2.0
github-actions[bot] Oct 27, 2026
27e6bf3
chore(sync): merge upstream v2 through v2.2.0
cursoragent Oct 27, 2026
53f8d7b
fix(ai): close the tool-failure test spliced with upstream video cases
cursoragent Oct 27, 2026
cc8ea64
fix(sync): keep fork server flag and release env after the v2.2.0 merge
cursoragent Oct 27, 2026
d725844
fix(sync): restore fork evaluation API and server event filters
cursoragent Oct 27, 2026
afdb99e
fix(sync): reconcile client generation, tests and fork packaging
shuv1337 Oct 27, 2026
3b259fd
fix(cli): restore the release workflow publisher entrypoint
shuv1337 Oct 27, 2026
11b30ba
fix(codemode): restore the fork CI package verification entrypoint
shuv1337 Oct 27, 2026
0b9ceb0
fix(sync): retain the fork test workflow in cache inputs
shuv1337 Oct 27, 2026
9a6eee6
test(tui): wait for terminal focus before checking pane selection
shuv1337 Oct 27, 2026
9123acb
fix(hygiene): clear home-path findings from the v2.2.0 sync
cursoragent Oct 28, 2026
7f26880
fix(core): key the code-mode runtime cache on the active tool set
cursoragent Oct 28, 2026
ef8e77a
fix(hygiene): scope home-alias allowlist entries to importing files
cursoragent Oct 28, 2026
004a809
docs: list AI subpaths removed by the explicit export map
cursoragent Oct 28, 2026
fd2aa6d
fix(ai): send only text in Anthropic error tool results
cursoragent Oct 28, 2026
b313077
chore(sync): merge integration-v2 to clear the plugin-browser conflict
cursoragent Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
6 changes: 6 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
packages/core/migration/**/snapshot.json linguist-generated
packages/core/src/database/migration.gen.ts linguist-generated
packages/core/src/models-dev/snapshot.txt linguist-generated
packages/core/src/database/schema.gen.ts linguist-generated
packages/desktop/src/main/storage/migration.gen.ts linguist-generated
packages/protocol/openapi.json linguist-generated
packages/client/src/promise/generated/** linguist-generated
packages/client/src/effect/generated/** linguist-generated
packages/client/src/effect/api/** linguist-generated
packages/core/src/**/*.txt text eol=lf
packages/httpapi-codegen/test/generated/*.ts text eol=lf
4 changes: 4 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# web + desktop packages
packages/app/ @Hona @Brendonovich
packages/desktop/ @Hona @Brendonovich

# CI and releases. Release jobs that hold secrets run only .github/workflows/release.yml and .github/release/,
# which makes this path the release security boundary.
/.github/ @anomalyco/releasers
5 changes: 4 additions & 1 deletion .github/actions/setup-bun/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,10 @@ runs:
uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ${{ steps.cache.outputs.dir }}
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
key: ${{ runner.os }}-${{ runner.arch }}-bun-${{ steps.cache.outputs.version }}-${{ hashFiles('bun.lock', 'patches/**') }}
# Each dev merge changes beta's bun.lock. Beta falls back to the newest cache for the same Bun version
# (Bun's cache stores every package version separately) instead of installing everything from npm.
restore-keys: ${{ (github.ref_name == 'beta' && format('{0}-{1}-bun-{2}-', runner.os, runner.arch, steps.cache.outputs.version)) || '' }}

- name: Install setuptools for distutils compatibility
run: python3 -m pip install setuptools || pip install setuptools || true
Expand Down
18 changes: 11 additions & 7 deletions .github/hygiene-allowlist.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,7 @@ pii:*.stories.*
pii:*/test/*
pii:*/e2e/*
pii:*fixture*
pii:packages/app/src/home/projects/view.tsx
pii:packages/app/src/home/sessions/controller.tsx
pii:packages/app/src/settings/workspaces/project-options.tsx
pii:packages/app/src/settings/workspaces/projects.tsx
pii:packages/app/src/shell/routes/routes.tsx
pii:packages/core/drizzle.config.ts
pii:packages/desktop/scripts/profile-by-source.ts
pii:packages/storybook/.storybook/mocks/gui-extensions/ssh.tsx
pii:packages/tui/src/feature-plugins/system/storybook/session-location-missing.tsx
pii:packages/web/src/content/docs/ar/permissions.mdx
pii:packages/web/src/content/docs/bs/permissions.mdx
Expand All @@ -42,3 +35,14 @@ pii:services/www/src/docs/content/cli/config.mdx
pii:services/www/src/docs/content/plugins.mdx
# Synthetic home directory in upstream documentation examples.
text:/home/me
# `@/home/<segment>` module aliases. Scoped to the files that import them.
pii:packages/app/src/home/projects/view.tsx
pii:packages/app/src/home/sessions/controller.tsx
pii:packages/app/src/session/session-identity-header.tsx
pii:packages/app/src/settings/workspaces/project-options.tsx
pii:packages/app/src/settings/workspaces/projects.tsx
pii:packages/app/src/shell/routes/routes.tsx
pii:packages/app/src/shell/shell.tsx
pii:packages/app/src/shell/titlebar/inbox-model.ts
pii:packages/app/src/shell/titlebar/recently-closed-tabs-menu.tsx
pii:packages/stories/mocks/gui-plugins/ssh.tsx
66 changes: 66 additions & 0 deletions .github/nix-hashes/publish.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#!/usr/bin/env bash
# publish.sh <hashes.json>: run from a checkout of dev. Puts <hashes.json> on bot/nix-hashes as one commit on top of dev,
# opens or updates the pull request into dev, dispatches its required checks and enables auto-merge. Closes the pull
# request instead when dev already has these hashes. Uses git, gh and jq only; never runs repository code.
set -euo pipefail

here=$(cd "$(dirname "$0")" && pwd)
new=$(realpath "$1")
branch=bot/nix-hashes
file=nix/hashes.json
title="chore: update nix node_modules hashes"
: "${GH_REPO:?}" "${GITHUB_SHA:?}"
git=(git -c core.hooksPath=/dev/null -c user.name='github-actions[bot]' -c user.email='41898282+github-actions[bot]@users.noreply.github.com')

bash "$here/validate.sh" "$new"

"${git[@]}" fetch --no-tags --depth=1 origin "+refs/heads/dev:refs/remotes/origin/dev" "$GITHUB_SHA"

# A newer push that changed the inputs has its own run, which publishes hashes for it. Mirrors on.push.paths.
if ! git diff --quiet "$GITHUB_SHA" origin/dev -- bun.lock package.json ':(glob)packages/*/package.json' \
':(glob)services/*/package.json' flake.lock nix/node_modules.nix nix/scripts patches; then
echo "::notice::dev changed the hash inputs since $GITHUB_SHA; leaving it to the newer run"
exit 0
fi

# Only a same-repository pull request is the bot's; a fork can use the same branch name.
find_pr() {
gh pr list --repo "$GH_REPO" --base dev --head "$branch" --state open --json number,isCrossRepository \
--jq 'map(select(.isCrossRepository | not)) | .[0].number // empty'
}
pr=$(find_pr)

"${git[@]}" checkout -B "$branch" origin/dev
if cmp -s "$new" "$file"; then
echo "dev already has these hashes"
if [ -n "$pr" ]; then
gh pr close "$pr" --repo "$GH_REPO" --delete-branch --comment "dev already has these hashes."
fi
exit 0
fi

cp "$new" "$file"
bash "$here/validate.sh" "$file"
"${git[@]}" add -- "$file"
"${git[@]}" commit --no-verify -m "$title"
[ "$(git diff --name-only origin/dev HEAD)" = "$file" ] || {
echo "::error::the commit changes more than $file" >&2
exit 1
}
"${git[@]}" push --no-verify --force origin "HEAD:refs/heads/$branch"

if [ -z "$pr" ]; then
gh pr create --repo "$GH_REPO" --base dev --head "$branch" --title "$title" \
--body "Updates \`$file\` to the node_modules hashes computed for $GITHUB_SHA by bot-nix-hashes. check-bot-scope keeps this branch to that file."
pr=$(find_pr)
fi

# Pushes and pull requests made with GITHUB_TOKEN start no workflows; dispatches do. These produce the checks dev
# requires on the new head.
for workflow in check.yml check-test.yml check-bot-scope.yml; do
gh workflow run "$workflow" --repo "$GH_REPO" --ref "$branch"
done

gh pr merge "$pr" --repo "$GH_REPO" --auto --squash
echo "### Nix hashes" >> "${GITHUB_STEP_SUMMARY:-/dev/null}"
echo "Updated pull request #$pr" >> "${GITHUB_STEP_SUMMARY:-/dev/null}"
27 changes: 27 additions & 0 deletions .github/nix-hashes/validate.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#!/usr/bin/env bash
# validate.sh <file>: fails unless <file> has exactly the shape of nix/hashes.json, so the hashes bot can only ever publish
# three SRI hashes. Used by bot-nix-hashes.yml before it commits and by check-bot-scope.yml on the bot's pull request.
# Adding a system to the flake means adding it to SYSTEMS here.
set -euo pipefail

file=${1:?usage: validate.sh <file>}
SYSTEMS='["aarch64-darwin","aarch64-linux","x86_64-linux"]'

fail() {
echo "::error::$file: $*" >&2
exit 1
}

if [ ! -f "$file" ] || [ -L "$file" ]; then fail "not a regular file"; fi
[ "$(wc -c < "$file")" -lt 4096 ] || fail "4096 bytes or larger"
jq -se 'length == 1' "$file" > /dev/null 2>&1 || fail "not a single JSON value"
jq -e --argjson systems "$SYSTEMS" '
type == "object"
and keys == ["nodeModules"]
and (.nodeModules | type == "object")
and (.nodeModules | keys == $systems)
and (.nodeModules | all(.[]; type == "string" and test("\\Asha256-[A-Za-z0-9+/]{43}=\\z")))
' "$file" > /dev/null || fail "expected {\"nodeModules\": {<$SYSTEMS>: \"sha256-<44 base64 chars>\"}}"
# The canonical form rules out duplicate keys and anything else jq would drop on parse.
jq . "$file" | cmp -s - "$file" || fail "not formatted as jq . prints it"
echo "$file: valid"
71 changes: 0 additions & 71 deletions .github/publish-python-sdk.yml

This file was deleted.

7 changes: 7 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,13 @@ Please provide a description of the issue, the changes you made to fix it, and w

### How did you verify your code works?

### Visual

_Optional, for user-facing changes: a small looping animated SVG (240×72) of the change, shown in the desktop app's "What's new in beta". Replace the block below or delete this section._

```svg
```

### Screenshots / recordings

_If this is a UI change, please include a screenshot or recording._
Expand Down
21 changes: 21 additions & 0 deletions .github/release/download/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Download release artifacts
description: Downloads artifacts into $RUNNER_TEMP/in/<name> and verifies each against its SHA256SUMS.
inputs:
pattern:
description: Artifact name pattern
required: true
digests:
description: Space-separated name=digest pairs for artifacts made by sign jobs, from their job outputs
required: false
default: ""
runs:
using: composite
steps:
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
pattern: ${{ inputs.pattern }}
path: ${{ runner.temp }}/in
- shell: bash
run: bash "${GITHUB_ACTION_PATH//\\//}/../verify-artifacts.sh" "$RUNNER_TEMP/in"
env:
OPENCODE_DIGESTS: ${{ inputs.digests }}
110 changes: 110 additions & 0 deletions .github/release/lib.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
# shellcheck shell=bash
# Shared helpers for the release scripts. Sourced, never executed.
#
# These scripts run in sign and publish jobs that hold secrets. They must never execute repository code
# or artifact contents: artifacts are data, and every value that names a destination comes from the
# environment the workflow sets (OPENCODE_VERSION, OPENCODE_CHANNEL, OPENCODE_DRY_RUN, ...).

set -euo pipefail

# shellcheck disable=SC2034 # used by the scripts that source this file
release_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)

die() {
echo "::error::$*" >&2
exit 1
}

dry_run() {
[ "${OPENCODE_DRY_RUN:-false}" = true ]
}

sha256() {
if command -v sha256sum > /dev/null; then sha256sum "$@"; else shasum -a 256 "$@"; fi
}

# Windows runners pass D:\a\_temp style paths; Git Bash tools want /d/a/_temp.
posix() {
if command -v cygpath > /dev/null; then cygpath -u "$1"; else printf '%s' "$1"; fi
}

size() {
wc -c < "$1" | tr -d ' '
}

# Uploads files to opencode.ai/files/bin/<version>/ and prints the update-server file map.
upload_files() {
local credentials=false
for file in "$@"; do
test -s "$file" || die "Missing release file: $file"
local name type
name=$(basename "$file")
case "$name" in
*.tar.gz) type=application/gzip ;;
*.zip) type=application/zip ;;
*) type=application/octet-stream ;;
esac
if dry_run; then
echo "dry-run upload: bin/$OPENCODE_VERSION/$name" >&2
else
if [ "$credentials" = false ]; then
r2_credentials
credentials=true
fi
aws s3 cp "$file" "s3://opencode-production-files/bin/$OPENCODE_VERSION/$name" --only-show-errors \
--endpoint-url "https://$CLOUDFLARE_ACCOUNT_ID.r2.cloudflarestorage.com" \
--content-type "$type" --content-disposition "attachment; filename=\"$name\"" \
--cache-control "public, max-age=31536000, immutable" >&2
fi
jq -n --arg name "$name" --arg url "https://opencode.ai/files/bin/$OPENCODE_VERSION/$name" \
--arg sha256 "$(sha256 "$file" | cut -c1-64)" --argjson size "$(size "$file")" \
'{($name): {url: $url, sha256: $sha256, size: $size}}'
done | jq -s 'add'
}

# R2 accepts the API token ID as the access key and SHA-256(token) as the secret.
r2_credentials() {
local id
id=$(curl -fsS -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
"https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/tokens/verify" | jq -er .result.id)
export AWS_ACCESS_KEY_ID="$id"
AWS_SECRET_ACCESS_KEY=$(printf '%s' "$CLOUDFLARE_API_TOKEN" | sha256 | cut -c1-64)
export AWS_SECRET_ACCESS_KEY
export AWS_DEFAULT_REGION=auto AWS_REQUEST_CHECKSUM_CALCULATION=when_required AWS_RESPONSE_CHECKSUM_VALIDATION=when_required
}

# Registers one artifact with the update server: publish_update <name> <distribution> <metadata json>.
publish_update() {
local body status token attempt
body=$(jq -n --arg channel "$OPENCODE_CHANNEL" --arg version "$OPENCODE_VERSION" --arg name "$1" --arg distribution "$2" \
--argjson metadata "$3" '{channel: $channel, name: $name, distribution: $distribution, version: $version, metadata: $metadata}')
echo "$body" | jq .
if dry_run; then return; fi
token=$(curl -fsS -H "Authorization: Bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \
"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=https://update.opencode.ai" | jq -er .value)
for attempt in 1 2 3; do
status=$(curl -sS -o "$RUNNER_TEMP/update-response" -w '%{http_code}' -X POST https://opencode.ai/update/api/publish \
-H "Authorization: Bearer $token" -H "Content-Type: application/json" --data "$body")
if [ "$status" -lt 300 ]; then return; fi
cat "$RUNNER_TEMP/update-response"
# D1 can commit the upsert and still time out. Replaying the same artifact is safe.
if [ "$status" -lt 500 ] || [ "$attempt" = 3 ]; then die "Update server returned $status"; fi
sleep "$attempt"
done
}

# Clones a repository, lets a render script fill it, then commits and pushes any change:
# push_git <clone url> <commit message> <render script> [args...]. Dry runs render into an empty directory.
push_git() {
local url=$1 message=$2 dir
shift 2
dir=$(mktemp -d)
if ! dry_run; then git clone -q "$url" "$dir"; fi
"$@" "$dir"
if dry_run; then return; fi
git -C "$dir" add -A
if git -C "$dir" diff --cached --quiet; then return; fi
git -C "$dir" -c user.name="github-actions[bot]" -c user.email="41898282+github-actions[bot]@users.noreply.github.com" \
commit -q -m "$message"
git -C "$dir" push -q origin HEAD:master
}
Loading
Loading