Compare commits

...

1182 Commits

Author SHA1 Message Date
Daniel Polito 3320e2bd6c Add Eyes Reaction instead of Comment Working on Github Action (#5072)
publish-github-action / publish (push) Waiting to run
Update Nix Hashes / update (push) Waiting to run
2025-12-10 13:35:55 -06:00
Aiden Cline 46cae6260a ignore: fix test 2025-12-10 13:31:45 -06:00
GitHub Action 001abec2f7 chore: format code 2025-12-10 19:31:11 +00:00
Dax Raad d1f87dd45e add models.dev family 2025-12-10 14:30:28 -05:00
Aiden Cline d9f443d333 more interleaved thinking fixes (#5334) 2025-12-10 13:29:26 -06:00
Aiden Cline 1cb69581b4 tweak: set gemini thinkingLevel to high by default 2025-12-10 13:09:27 -06:00
Github Action 91e936d293 Update Nix flake.lock and hashes 2025-12-10 19:04:03 +00:00
Tom Aylott 15b0da75e1 fix: upgrade OpenRouter sdk pkg (#5302)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-12-10 13:02:26 -06:00
Dax Raad b7a8a3012b fix /provider endpoint to return loaded providers 2025-12-10 13:49:45 -05:00
GitHub Action 41f9fd3741 chore: format code 2025-12-10 18:32:21 +00:00
Nick 36216133cd docs: add opencode-type-inject to ecosystem plugins (#5331) 2025-12-10 12:31:44 -06:00
GitHub Action dcd8a21885 chore: format code
publish-github-action / publish (push) Waiting to run
Update Nix Hashes / update (push) Waiting to run
2025-12-10 16:55:19 +00:00
Stanislas 5e499831ff docs: add wakatime plugin to ecosystem page (#5326)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-10 10:54:45 -06:00
Matt Silverlock c37febd7f2 themes: update orng theme (#5329) 2025-12-10 10:52:58 -06:00
GitHub Action d762a07d19 chore: format code 2025-12-10 16:50:49 +00:00
Noè ae80265995 docs: Added opencode-antigravity-auth to ecosystem documentation (#5303) 2025-12-10 10:50:12 -06:00
Frank 2c8841d034 zen: sync 2025-12-10 11:44:37 -05:00
arc-source-coder 950c273289 tui: only show active MCP server count (#5327) 2025-12-10 10:27:59 -06:00
Connor Adams 6437fd8ed8 docs: configure mise to use latest version instead of pinned version (#5316) 2025-12-10 10:11:48 -06:00
Aiden Cline 5828033cc7 ci: stop zed sync temporarily 2025-12-10 09:57:34 -06:00
Github Action 738af5856a Update Nix flake.lock and hashes 2025-12-10 14:04:52 +00:00
GitHub Action 2654ede6ac chore: format code 2025-12-10 14:04:08 +00:00
Sebastian Herrlinger 505b744f5d bump opentui to v0.1.60, fixing doubled key events on some older terminal emulators and add_buffer leaks for prompt input 2025-12-10 15:03:14 +01:00
Sebastian Herrlinger 56984a15b6 remove input_forward_delete special handling 2025-12-10 14:55:56 +01:00
GitHub Action 60d064eb84 chore: format code 2025-12-10 13:53:21 +00:00
opencode 7ba65ffce6 release: v1.0.143
Update Nix Hashes / update (push) Waiting to run
2025-12-10 13:53:21 +00:00
Dax Raad 674aa65d71 docs: improve bash and grep tool documentation with clearer usage guidelines 2025-12-10 08:48:41 -05:00
opencode 3e73202ff5 release: v1.0.142
Update Nix Hashes / update (push) Waiting to run
2025-12-10 13:25:55 +00:00
GitHub Action 98108351b0 ignore: update download stats 2025-12-10 2025-12-10 12:04:47 +00:00
Adam 274f0b8a5a fix: exit aliases 2025-12-10 02:49:54 -06:00
Aiden Cline 7718a1188e fix: revert hook try/catch that surpressed errors 2025-12-10 00:14:24 -06:00
GitHub Action a9ee71cbd7 chore: format code 2025-12-10 06:02:31 +00:00
spoj 30884c610a fix: add Windows support for shell mode (! command) (#5311) 2025-12-10 00:01:56 -06:00
Adam f8558a92e1 fix: types 2025-12-09 21:44:34 -06:00
Adam 53eb3bab9c wip(desktop): progress 2025-12-09 21:39:13 -06:00
Adam 6b4f8f07fe wip(desktop): progress 2025-12-09 21:39:13 -06:00
Adam 400cc012ab feat: provider icon component 2025-12-09 21:39:12 -06:00
GitHub Action 926e3d1746 chore: format code 2025-12-10 03:32:26 +00:00
Brendan Allan 2205184a8e tauri: don't ask to restart separately in updater 2025-12-10 11:31:50 +08:00
Brendan Allan 5730ee1f16 tauri: update macos icon 2025-12-10 11:28:40 +08:00
Brendan Allan c138a6a5da tauri: comment out restart server dialog 2025-12-10 11:18:17 +08:00
Brendan Allan ba42cc5619 fix: use project references for desktop typecheck 2025-12-10 11:15:12 +08:00
Dax Raad 0b36759a79 ci 2025-12-09 22:14:18 -05:00
GitHub Action 2a71b4f37c chore: format code 2025-12-10 03:10:18 +00:00
Timor b38d841c28 feat: add CLI arguments to agent create command for scripting (#5157) 2025-12-09 21:09:45 -06:00
Dax Raad ee71ce63e0 ci 2025-12-10 02:57:39 +00:00
opencode b87c9621c8 release: v1.0.141
Update Nix Hashes / update (push) Waiting to run
2025-12-10 02:57:38 +00:00
Dax Raad b606c21b23 ci 2025-12-09 21:49:38 -05:00
Dax Raad 46f1477939 ci 2025-12-09 21:49:05 -05:00
Dax Raad d6e27b39ac ci 2025-12-09 21:44:13 -05:00
Dax Raad 181274c3c3 ci: publish with multiple tags instead of using dist-tag
npm dist-tag add command is broken, so publish package multiple times
with different tags directly instead
2025-12-09 21:39:05 -05:00
Dax Raad 3381781b67 core: enable project discovery for experimental builds 2025-12-09 21:23:55 -05:00
Hosenur Rahaman fcf5d84ddc docs: Add portal project to ecosystem documentation (#5300)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-09 20:23:14 -06:00
Dax Raad a4ed74e9fa ci 2025-12-09 21:16:36 -05:00
Dax Raad e3483d7edc ci 2025-12-09 21:16:23 -05:00
Dax Raad 35d63438f3 ci 2025-12-09 21:16:00 -05:00
Dax Raad 59c5817f6f ci 2025-12-09 21:10:58 -05:00
Dax Raad 8f25ac2e81 sync 2025-12-09 21:06:57 -05:00
Dax Raad e4fed175d4 ci 2025-12-09 21:04:06 -05:00
Dax Raad b784872d06 ci 2025-12-09 21:03:19 -05:00
Dax Raad 51b85bb657 ci 2025-12-09 21:02:04 -05:00
Dax Raad ecf4a0b6f7 ci 2025-12-09 21:01:48 -05:00
Dax Raad b898ecb17f ci 2025-12-09 21:01:39 -05:00
Dax Raad 82176070a2 ci 2025-12-09 20:59:31 -05:00
Dax Raad 73f59bbad0 ci 2025-12-09 20:58:01 -05:00
Dax Raad f350c99788 ci 2025-12-09 20:56:13 -05:00
Dax Raad 7ce319108c ci 2025-12-09 20:54:56 -05:00
Dax Raad 9f32376979 ci 2025-12-09 20:51:54 -05:00
Dax Raad 2d9e75b561 ci 2025-12-09 20:51:25 -05:00
Dax Raad f90a13f874 ci 2025-12-09 20:50:46 -05:00
Adam ee1f652b89 fix: re-enable tauri typecheck 2025-12-09 19:34:07 -06:00
Dax Raad e7f6a040de ci 2025-12-09 20:26:46 -05:00
Dax Raad 5335e80e61 ci 2025-12-09 20:24:31 -05:00
Dax Raad 1e1bc2f31b ci 2025-12-09 20:22:00 -05:00
Dax Raad 00d310b4f5 ci 2025-12-09 20:20:47 -05:00
Dax Raad a2b432e51a ci 2025-12-09 20:19:43 -05:00
Dax Raad da192cee1a ci 2025-12-09 20:17:07 -05:00
Dax Raad 9235598ba6 ci 2025-12-09 19:53:50 -05:00
Dax Raad 836f02a1b3 ci 2025-12-09 19:46:59 -05:00
Dax Raad a2a3bd31e9 ci 2025-12-09 19:46:38 -05:00
Dax Raad 74b6bdb683 ci: combine sdk and format workflows into single generate workflow 2025-12-09 19:41:23 -05:00
GitHub Action 25eeb738e7 chore: regen sdk 2025-12-10 00:33:05 +00:00
Dax Raad 89591c6911 ci 2025-12-09 19:32:30 -05:00
GitHub Action 83d529f128 chore: format code 2025-12-10 00:28:05 +00:00
GitHub Action ad5338e411 chore: regen sdk 2025-12-10 00:27:29 +00:00
Dax Raad 6d84291200 ci fix 2025-12-09 19:26:54 -05:00
Github Action 95229ddb19 Update Nix flake.lock and hashes 2025-12-09 23:56:13 +00:00
Aiden Cline 4f939708f9 ignore: rm chalk 2025-12-09 17:54:53 -06:00
Aiden Cline eab9e8f45d tweak: add OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS 2025-12-09 17:28:34 -06:00
David Hill a22b6d094a fix: add spacer before queued badge 2025-12-09 22:56:44 +00:00
Aiden Cline b9ad1b09cb better interleaved thinking support (#5298) 2025-12-09 16:32:12 -06:00
Adam 2c0101d9cb wip(desktop): progress 2025-12-09 16:23:05 -06:00
Adam f105fe4190 wip(desktop): progress 2025-12-09 16:23:05 -06:00
Dax Raad 28e015bf97 core: fix project icon update handling to preserve existing icon properties 2025-12-09 16:55:26 -05:00
Adam b55f680982 wip(desktop): progress 2025-12-09 15:55:08 -06:00
Adam 76e77d80ac wip(desktop): progress 2025-12-09 15:53:08 -06:00
Adam ffef5db0d9 wip(desktop): progress 2025-12-09 15:46:23 -06:00
Aiden Cline 8f3ce99177 add OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT 2025-12-09 15:44:56 -06:00
Adam 8fa4d39b51 wip(desktop): progress 2025-12-09 15:39:44 -06:00
Adam 7fc1058a8f wip(desktop): progress 2025-12-09 15:32:36 -06:00
ry2009 24969bb0a3 feat: add Biome LSP support (#5290) 2025-12-09 15:31:13 -06:00
Adam 582ea6d4ee wip(desktop): progress 2025-12-09 15:24:11 -06:00
Adam 43ec725d60 wip(desktop): progress 2025-12-09 15:21:47 -06:00
Adam 8de1025b54 wip(desktop): progress 2025-12-09 15:21:47 -06:00
Adam e755286636 wip(desktop): progress 2025-12-09 15:21:47 -06:00
Adam dbffa05550 wip(desktop): progress 2025-12-09 15:21:45 -06:00
Aiden Cline 034de9b81c ci: fix sdk workflow 2025-12-09 15:08:30 -06:00
Nick 55de10191b fix: resolve 'latest' to actual version when caching plugins (#5292) 2025-12-09 15:07:59 -06:00
Dax Raad a745dac54b format on write 2025-12-09 16:06:57 -05:00
GitHub Action 496675e969 chore: format code 2025-12-09 21:05:09 +00:00
GitHub Action e234824b37 chore: regen sdk 2025-12-09 21:04:37 +00:00
Dax Raad 40609faeac fix types 2025-12-09 16:03:58 -05:00
Dax Raad 3433e5bbd1 fix tests 2025-12-09 16:03:33 -05:00
GitHub Action 43dc138d88 chore: format code 2025-12-09 20:53:06 +00:00
GitHub Action 12c82fc5d6 chore: regen sdk 2025-12-09 20:52:31 +00:00
Dax Raad edbe015078 discover logic 2025-12-09 15:51:55 -05:00
GitHub Action 5d248a1d08 chore: format code 2025-12-09 20:49:25 +00:00
GitHub Action 3d8e8dcdec chore: regen sdk 2025-12-09 20:48:49 +00:00
Dax Raad f8bffeaca1 sync 2025-12-09 15:48:22 -05:00
GitHub Action eeb986153a chore: format code 2025-12-09 20:44:09 +00:00
GitHub Action 3c98711df1 chore: regen sdk 2025-12-09 20:43:35 +00:00
Dax Raad 40b2a24753 core: fix project event emission to include updated worktree data 2025-12-09 15:41:38 -05:00
Dax Raad 0dc4cc396c test fixes 2025-12-09 15:41:38 -05:00
GitHub Action 314923045f chore: format code 2025-12-09 20:26:02 +00:00
GitHub Action 49363dae9e chore: regen sdk 2025-12-09 20:25:21 +00:00
Aiden Cline dfd4e716fd fix: read when file is svg 2025-12-09 14:24:30 -06:00
GitHub Action 71e39b0648 chore: format code 2025-12-09 20:20:03 +00:00
GitHub Action 262d6e1740 chore: regen sdk 2025-12-09 20:19:27 +00:00
Dax Raad 71eced2fc9 core: fix project creation to include updated timestamp 2025-12-09 15:18:55 -05:00
Dax Raad 7b5a485d65 core: make project updated timestamp optional to support legacy project data 2025-12-09 15:18:55 -05:00
GitHub Action 59d96f6928 chore: format code 2025-12-09 20:17:37 +00:00
GitHub Action 97ae5039de chore: regen sdk 2025-12-09 20:16:59 +00:00
Aiden Cline 099816efeb ci: fix sdk gen 2025-12-09 14:16:22 -06:00
GitHub Action 5b6b2eab00 chore: format code 2025-12-09 20:12:07 +00:00
GitHub Action 4a5c27f175 chore: regen sdk 2025-12-09 20:11:32 +00:00
Dax Raad 30598c8766 core: fix project icon update to preserve existing icon properties 2025-12-09 15:11:00 -05:00
GitHub Action fad7c06ad9 chore: format code 2025-12-09 20:07:32 +00:00
GitHub Action bebbbb4856 chore: regen sdk 2025-12-09 20:06:57 +00:00
Dax Raad 31c49cd6c7 core: add automatic project icon discovery from favicon/logo files 2025-12-09 15:06:24 -05:00
GitHub Action 5f300fa9dc chore: format code 2025-12-09 19:54:54 +00:00
GitHub Action 453b445796 chore: regen sdk 2025-12-09 19:54:19 +00:00
Dax Raad 12d730ec45 fix ci 2025-12-09 14:53:47 -05:00
Dax Raad 839b8903ef rework project loading 2025-12-09 14:41:14 -05:00
Dax Raad c4d4c5cf7c rename bus 2025-12-09 14:32:09 -05:00
GitHub Action 11598fe8ba chore: format code 2025-12-09 19:31:07 +00:00
GitHub Action 8f1e439c9d chore: regen sdk 2025-12-09 19:30:32 +00:00
Adam bd3cef5398 feat: add color to project 2025-12-09 13:29:59 -06:00
Adam 98790fc143 wip(desktop): progress 2025-12-09 13:24:37 -06:00
Dax Raad 6d86da7e46 add project.name/icon 2025-12-09 13:57:18 -05:00
GitHub Action 54e67e3c3a chore: format code 2025-12-09 18:37:14 +00:00
GitHub Action 1d8b17b81e chore: regen sdk 2025-12-09 18:36:38 +00:00
Adam 057a387c34 wip(desktop): progress 2025-12-09 12:36:06 -06:00
GitHub Action d5ebb9b7f7 chore: format code 2025-12-09 18:10:31 +00:00
GitHub Action f3339a30d5 chore: regen sdk 2025-12-09 18:07:43 +00:00
Aiden Cline 3fe1711166 core: add test to prevent MCP headers regression when OAuth is enabled
Custom headers configured for remote MCP servers were being silently
dropped when OAuth was enabled (the default). This test ensures headers
are always sent to MCP servers regardless of OAuth configuration.
2025-12-09 12:06:40 -06:00
opencode 874b15d875 release: v1.0.138
Update Nix Hashes / update (push) Waiting to run
2025-12-09 18:05:21 +00:00
GitHub Action 8f13597215 chore: format code 2025-12-09 17:53:53 +00:00
GitHub Action 517737f86d chore: regen sdk 2025-12-09 17:53:14 +00:00
Adam f223274d97 wip(desktop): progress 2025-12-09 11:52:43 -06:00
GitHub Action 58222d22d1 chore: format code 2025-12-09 17:45:35 +00:00
Jay cd8a956895 docs: Modify documentation for SDK ecosystem references
Updated link text to refer to community-built projects.
2025-12-09 12:44:33 -05:00
GitHub Action 7409aca847 chore: regen sdk 2025-12-09 17:43:58 +00:00
Jay 537068b598 docs: Update community plugins reference in documentation 2025-12-09 12:43:29 -05:00
GitHub Action 6311c89db1 chore: format code 2025-12-09 17:39:25 +00:00
Aiden Cline 75ef0772dd ci: sdk stuff 2025-12-09 11:38:22 -06:00
GitHub Action 5f983cfa1f chore: regen sdk 2025-12-09 17:38:01 +00:00
Jay a27f3af40b docs: Add submission note for OpenCode projects
Added a note about submitting projects to the list.
2025-12-09 12:37:34 -05:00
GitHub Action db9e73133a chore: format code 2025-12-09 17:37:32 +00:00
GitHub Action 4ee21b7725 chore: regen sdk 2025-12-09 17:34:45 +00:00
Aiden Cline 7a124aaf27 docs: fix name 2025-12-09 11:34:15 -06:00
GitHub Action 143d310216 chore: format code 2025-12-09 17:26:28 +00:00
Aiden Cline 8cdb0c0cf0 docs: OpenCode ecosystem (#5287)
Co-authored-by: GitHub Action <action@github.com>
2025-12-09 11:25:28 -06:00
GitHub Action 2b7a227530 chore: format code 2025-12-09 17:10:13 +00:00
GitHub Action a5c92d307f chore: regen sdk 2025-12-09 17:09:35 +00:00
Adam e099d53526 wip(desktop): progress 2025-12-09 11:09:00 -06:00
Adam 7df4d7aeed wip(desktop): progress 2025-12-09 11:09:00 -06:00
GitHub Action dda3278752 chore: format code 2025-12-09 16:53:58 +00:00
GitHub Action 1005821d6f chore: regen sdk 2025-12-09 16:53:24 +00:00
Dax Raad b2f59e9d08 core: add project update timestamps to track when projects were last modified
Projects now track when they were last updated, making it easier for users
to see recent activity and identify stale projects in their workspace.
2025-12-09 11:52:53 -05:00
GitHub Action 80799b57fe chore: format code 2025-12-09 15:53:48 +00:00
GitHub Action 5b956eee91 chore: regen sdk 2025-12-09 15:53:12 +00:00
André Cruz 0676c0c917 fix(mcp): send custom headers regardless of OAuth settings (#5273)
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-12-09 09:52:39 -06:00
GitHub Action 5aff369b73 chore: format code 2025-12-09 15:47:54 +00:00
GitHub Action d9a3aa8a5c chore: regen sdk 2025-12-09 15:47:19 +00:00
Ravi Kumar a0c11b958b feat(telemetry): Add userId and sessionId metadata to experimental_telemetry (#5279) 2025-12-09 09:46:48 -06:00
GitHub Action 7e12e61209 chore: format code 2025-12-09 12:16:05 +00:00
GitHub Action 0c7d66b26a chore: regen sdk 2025-12-09 12:15:30 +00:00
Adam 7aa60add45 chore: cleanup 2025-12-09 06:14:58 -06:00
Adam e4cd93868b chore: cleanup 2025-12-09 06:14:22 -06:00
Adam 0963bd84d1 fix(tui): order 2025-12-09 06:13:36 -06:00
Adam 59237b71b6 wip(desktop): progress 2025-12-09 06:12:09 -06:00
Adam fcc47597b2 wip(desktop): progress 2025-12-09 06:12:09 -06:00
Adam 3ab22fbb89 fix: diff scroll gutter 2025-12-09 06:12:09 -06:00
GitHub Action d2038ee3e5 ignore: update download stats 2025-12-09 2025-12-09 12:04:56 +00:00
Github Action dcf38220dc Update Nix flake.lock and hashes 2025-12-09 11:15:34 +00:00
GitHub Action 2693eb674a chore: format code 2025-12-09 11:15:02 +00:00
GitHub Action b9a86a9abd chore: regen sdk 2025-12-09 11:14:23 +00:00
Brendan Allan 9513ab51b8 fix: use ts project references for desktop and tauri 2025-12-09 19:13:51 +08:00
Github Action 921da0663e Update Nix flake.lock and hashes 2025-12-09 09:17:58 +00:00
GitHub Action d25cea2c61 chore: format code 2025-12-09 09:17:36 +00:00
GitHub Action 853d4d6261 chore: regen sdk 2025-12-09 09:17:00 +00:00
Brendan Allan 4cca4c66f1 desktop: move updater logic to js 2025-12-09 17:16:24 +08:00
GitHub Action 71fbee39fb chore: format code 2025-12-09 07:26:55 +00:00
GitHub Action 1152eadfd4 chore: regen sdk 2025-12-09 07:26:16 +00:00
Aiden Cline 14183f06c6 core: refactor providerOptions function to accept Provider.Model for cleaner API 2025-12-09 01:25:36 -06:00
GitHub Action 54ad6cfcfe chore: format code 2025-12-09 06:42:56 +00:00
Aiden Cline 91a56095d9 ci: run format workflow after sdk workflow completion 2025-12-09 00:41:40 -06:00
GitHub Action 4cc3af0447 chore: regen sdk 2025-12-09 06:37:35 +00:00
Aiden Cline 676b5fbfa3 core: remove unused fzf dependency to address CVE
- Eliminates fzf binary dependency that was no longer used after file search overhaul
- Removes fzf from Nix package configuration and Arch Linux PKGBUILD dependencies
2025-12-09 00:36:33 -06:00
GitHub Action 48ab55231a chore: format code 2025-12-09 03:18:47 +00:00
terakael c53d6e6f4a tui: add permission indicator to footer (#4813)
Co-authored-by: terakael <terakael@gmail.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-12-08 21:18:17 -06:00
opencode a4df18d7c5 release: v1.0.137
Update Nix Hashes / update (push) Waiting to run
2025-12-09 03:00:50 +00:00
GitHub Action 84d7ea095e chore: regen sdk 2025-12-09 02:17:38 +00:00
Matt Silverlock 632f32434c themes: add new orng theme (#5267)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-12-08 20:17:10 -06:00
GitHub Action c39bb83b78 chore: format code 2025-12-09 02:07:00 +00:00
Aiden Cline e05854a38a ci: ignore 2025-12-08 20:06:27 -06:00
GitHub Action c896b78a39 chore: regen sdk 2025-12-09 01:07:23 +00:00
Dax Raad 239fd157e5 ci 2025-12-08 20:06:36 -05:00
Github Action ec64591822 Update Nix flake.lock and hashes 2025-12-09 00:52:48 +00:00
GitHub Action bbcbbbf16d chore: format code 2025-12-09 00:52:05 +00:00
Sebastian Herrlinger 798731e2bd bump opentui to v0.1.59, allowing shift+space insert as char again 2025-12-09 01:51:27 +01:00
GitHub Action 86ef7e45e4 chore: regen sdk 2025-12-08 23:46:24 +00:00
Aiden Cline 2b6278f950 ci: ignore 2025-12-08 17:45:50 -06:00
GitHub Action 88980eb8b4 chore: format code 2025-12-08 22:44:57 +00:00
Aiden Cline af2ae4ddc4 ignore: mark ripgrep as an sst/tap/opencode depends_on 2025-12-08 16:42:32 -06:00
GitHub Action 0748f8c1f9 chore: regen sdk 2025-12-08 22:16:30 +00:00
Ariane Emory 2c79dff7e4 fix: improve sidebar working directory colour contrast with modified files (resolves #5184 (#5188) 2025-12-08 16:15:40 -06:00
Github Action cee17efd41 Update Nix flake.lock and hashes 2025-12-08 22:11:38 +00:00
GitHub Action 043ff20a83 chore: format code 2025-12-08 22:10:46 +00:00
Aiden Cline 092f609332 fix: parcel watcher musl support 2025-12-08 16:08:53 -06:00
GitHub Action 57448b9ba2 chore: regen sdk 2025-12-08 21:29:05 +00:00
Ravi Kumar 8cbfd3c161 fix: apply provider filtering to /connect endpoint (#5233) 2025-12-08 15:28:32 -06:00
GitHub Action b5df0123c1 chore: format code 2025-12-08 21:05:09 +00:00
Ariane Emory 064cfa96b6 fix: sort sessions by updated time (resolves #5074) (#5080) 2025-12-08 15:04:39 -06:00
Github Action 16873a6b8c Update Nix flake.lock and hashes 2025-12-08 21:00:43 +00:00
GitHub Action 33c5055131 chore: regen sdk 2025-12-08 20:59:55 +00:00
Sebastian Herrlinger 7471e025c1 bump opentui to v0.1.58, fixing diff color issues in light themes 2025-12-08 21:59:09 +01:00
GitHub Action e4a2bb23c7 chore: format code 2025-12-08 20:34:25 +00:00
Shoubhit Dash 921a913b2a add ocaml lsp support (#5230) 2025-12-08 14:33:45 -06:00
GitHub Action a578783797 chore: regen sdk 2025-12-08 20:06:51 +00:00
Sebastian Herrlinger 405aa27c57 fix colors for dialog prompt (like session rename prompt in light theme) 2025-12-08 21:06:03 +01:00
Sebastian Herrlinger 2a7c72f220 set theme text color for no matching items in auto complete 2025-12-08 20:59:00 +01:00
GitHub Action 323448812d chore: format code 2025-12-08 18:06:48 +00:00
Aiden Cline 75fb55e981 docs: lsp & formatters 2025-12-08 12:05:25 -06:00
GitHub Action 2cd1352451 chore: regen sdk 2025-12-08 18:02:54 +00:00
rari404 c4bc264ef9 feat: add terraform-ls language server and formatter (#5243) 2025-12-08 12:02:25 -06:00
GitHub Action d505f87c10 chore: format code 2025-12-08 17:40:24 +00:00
rari404 0505d9b8aa feat: add bash-language-server LSP (#5246) 2025-12-08 11:39:49 -06:00
GitHub Action 5a64fd79e3 chore: regen sdk 2025-12-08 17:37:58 +00:00
Shoubhit Dash 0904e20387 add ocamlformat support (#5229) 2025-12-08 11:37:30 -06:00
GitHub Action 60e2cacfa1 chore: format code 2025-12-08 17:31:56 +00:00
Daniel Polito 12db150690 feat: ability to toggle MCP Servers in TUI (#4509) 2025-12-08 11:31:22 -06:00
GitHub Action cbb9741a07 chore: regen sdk 2025-12-08 17:28:14 +00:00
Jérôme Benoit 8a00917ad5 fix: SAP AI Core Vercel AI SDK v2 support (#5180)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
2025-12-08 11:27:47 -06:00
GitHub Action 267addffeb chore: format code 2025-12-08 17:07:18 +00:00
rari404 3141b2f0a7 feat: add theme support for thinking text opacity (#5240) 2025-12-08 11:06:46 -06:00
GitHub Action 3a5161095f chore: regen sdk 2025-12-08 16:27:32 +00:00
Bishal Roy f698e3af23 feat: add catppuccin-macchiato theme (#5225) 2025-12-08 10:27:03 -06:00
Adam 7bcff6da1a feat: resize handle 2025-12-08 10:24:26 -06:00
Adam 62e2539696 wip(desktop): progress 2025-12-08 10:24:26 -06:00
GitHub Action f07347403f chore: regen sdk 2025-12-08 15:48:52 +00:00
Adam da3f48ecfc fix: opencode web command 2025-12-08 09:48:21 -06:00
Adam 3eac4f7b8c revert: opencode web command changes
This reverts commit fb8a5a79d6.
2025-12-08 09:47:43 -06:00
GitHub Action b2d798bba6 chore: format code 2025-12-08 15:40:18 +00:00
Adam fb8a5a79d6 fix: opencode web command 2025-12-08 09:39:41 -06:00
GitHub Action d70b86ef34 chore: regen sdk 2025-12-08 15:35:44 +00:00
Adam d97ae51689 fix: opencode web command 2025-12-08 09:35:12 -06:00
GitHub Action b6a648780c chore: format code 2025-12-08 15:19:26 +00:00
Adam adea39e54e fix: opencode web command 2025-12-08 09:18:46 -06:00
Adam c8e5f2b8d7 fix: bump localstorage 2025-12-08 09:05:26 -06:00
GitHub Action 20e458bb95 chore: regen sdk 2025-12-08 12:48:30 +00:00
Adam 8307f4378f chore: identity cleanup, vscode ext images 2025-12-08 06:47:57 -06:00
Github Action c63ee22905 Update Nix flake.lock and hashes 2025-12-08 12:25:44 +00:00
GitHub Action 94ba575cf7 chore: format code 2025-12-08 12:24:56 +00:00
Adam 856443c9f2 feat: better code and diff perf 2025-12-08 06:24:24 -06:00
GitHub Action 0e721f86ce ignore: update download stats 2025-12-08 2025-12-08 12:04:36 +00:00
GitHub Action 87b495018a chore: regen sdk 2025-12-08 05:46:02 +00:00
Brendan Allan 9f6e350a85 Export DesktopInterface from desktop and add PlatformContext 2025-12-08 13:43:36 +08:00
GitHub Action 20b4f36d18 chore: format code 2025-12-08 04:54:08 +00:00
Justin Vogt 7118b7d56d docs: Update "model" inheritance for agents (#4894)
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-12-07 22:53:41 -06:00
GitHub Action ef6f5aa13e chore: regen sdk 2025-12-08 04:43:13 +00:00
Aiden Cline 7cf876df54 bump plugin versions 2025-12-07 22:42:35 -06:00
GitHub Action cd569426ec chore: format code 2025-12-08 04:22:50 +00:00
ry2009 9793546702 fix: ensure Auth.all returns valid objs (#5128) 2025-12-07 22:22:21 -06:00
GitHub Action a07b79b048 chore: regen sdk 2025-12-08 04:21:06 +00:00
Ariane Emory 7d446e570b fix: Sort themes in the /theme modal alphabetically (resolves #5217) (#5219)
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-12-07 22:20:40 -06:00
GitHub Action ff9ba8ea95 chore: format code 2025-12-08 04:20:07 +00:00
opencode-agent[bot] 94d664ba46 docs: azure content filter note (#5212)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
Co-authored-by: GitHub Action <action@github.com>
2025-12-07 22:19:39 -06:00
GitHub Action fff1d6414c chore: regen sdk 2025-12-08 03:54:26 +00:00
Aiden Cline d38bb05c69 pdf support in read tool (#5222)
Co-authored-by: ammi1378 <ammi1378@users.noreply.github.com>
2025-12-07 21:54:00 -06:00
GitHub Action 83bfba8729 chore: format code 2025-12-08 03:49:13 +00:00
Aiden Cline cd706d0999 ci: fix fmt 2025-12-07 21:48:41 -06:00
Adam e2d86e057e fix: use diff context instead of prop drilling 2025-12-07 21:21:18 -06:00
GitHub Action 92f5f4d4c1 chore: regen sdk 2025-12-08 02:56:09 +00:00
Dax Raad 090e0b5636 openapi 2025-12-07 21:55:36 -05:00
Dax Raad 1cdd92361b ci 2025-12-07 21:51:22 -05:00
GitHub Action 2c7f3a0017 chore: regen sdk 2025-12-08 02:29:26 +00:00
Aiden Cline 1b1e4a6485 ci: fix fmt 2025-12-07 20:28:50 -06:00
GitHub Action ef17940577 chore: format code 2025-12-08 02:11:26 +00:00
Aiden Cline a254b69266 tweak: additional error msg parsing case 2025-12-07 20:10:54 -06:00
GitHub Action 1c353eba0b chore: regen sdk 2025-12-08 01:48:52 +00:00
Aiden Cline cf2d21499e ignore: update description 2025-12-07 19:48:23 -06:00
GitHub Action 61a5d04573 chore: format code 2025-12-08 01:47:31 +00:00
Ariane Emory 3d012c1a87 fix: toggle timestamps now properly hides/shows timestamps when toggled (resolves #5142) (#5145) 2025-12-07 19:47:02 -06:00
GitHub Action 3d2962ce88 chore: regen sdk 2025-12-08 01:44:32 +00:00
franlol c47e33e3ed feat: add experimental.text.complete plugin hook (#4962) 2025-12-07 19:44:04 -06:00
GitHub Action 935970317d chore: format code 2025-12-08 01:13:22 +00:00
Patrick Erichsen 65fa98ab3f fix(cli): prevent help text wrapping (#5185) 2025-12-07 19:12:54 -06:00
GitHub Action 826eb61415 chore: regen sdk 2025-12-08 00:58:40 +00:00
Dax Raad 900f245e30 playing with sdk docs 2025-12-07 19:58:04 -05:00
Github Action 4341cc9fe5 Update Nix flake.lock and hashes 2025-12-08 00:05:25 +00:00
GitHub Action cd4687b3e4 chore: format code 2025-12-08 00:04:40 +00:00
Dax 616265d0ef v2 SDK (#5216)
Co-authored-by: GitHub Action <action@github.com>
2025-12-07 19:04:14 -05:00
GitHub Action 978b09c561 chore: format code 2025-12-07 20:53:12 +00:00
Dax Raad 2b6ea5d8c3 remove outdated SDKs 2025-12-07 15:52:27 -05:00
Github Action 875bc052c1 Update Nix flake.lock and hashes 2025-12-07 20:49:39 +00:00
GitHub Action 6bb0108f5f chore: regen sdk 2025-12-07 20:47:51 +00:00
André Cruz 29a40e2267 feat(mcp): add OAuth authentication support for remote MCP servers (#5014) 2025-12-07 15:47:27 -05:00
GitHub Action 4a6dbfdfea chore: regen sdk 2025-12-07 19:23:56 +00:00
rari404 26fa90c4f4 feat: add uninstall command (#5208) 2025-12-07 13:23:30 -06:00
GitHub Action e073efbb02 chore: format code 2025-12-07 19:08:48 +00:00
secretninjaman 28ffb333fb fix: use basename for shell detection to support non-standard paths (#5205)
Co-authored-by: Ayato French <a@ayatofrench.com>
2025-12-07 13:08:26 -06:00
GitHub Action d9d29597ec chore: format code 2025-12-07 19:06:37 +00:00
Aiden Cline 0eadf18120 ignore: add test for provider url case 2025-12-07 13:06:12 -06:00
GitHub Action 83b6d8f923 chore: regen sdk 2025-12-07 19:01:34 +00:00
Aiden Cline a3c2278164 fix: provider url merging logic 2025-12-07 13:01:05 -06:00
GitHub Action 81ec8e3133 chore: format code 2025-12-07 18:48:45 +00:00
Dax Raad 329251fec8 enable zoom hotkeys 2025-12-07 13:48:12 -05:00
GitHub Action 6cc646b75d chore: regen sdk 2025-12-07 18:42:48 +00:00
Brendan Allan 7d131f75e6 Desktop macOS codesigning and notarization (#5154)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Dax Raad <d@ironbay.co>
2025-12-07 13:42:23 -05:00
GitHub Action acd1488468 chore: format code 2025-12-07 18:26:05 +00:00
Mikheil Berishvili b01398d9d3 fix: autocomplete popup repositions on window resize (#5196) 2025-12-07 12:25:35 -06:00
GitHub Action ee34e486e1 chore: regen sdk 2025-12-07 18:18:10 +00:00
Aiden Cline c3636f9133 ci: fix format 2025-12-07 12:17:40 -06:00
GitHub Action 4df3ea2fdb chore: format code 2025-12-07 15:33:51 +00:00
Carsten Kragelund Jørgensen 0c96c2cc9e fix: update zed agent server linux url to tar.gz (#5194) 2025-12-07 09:33:23 -06:00
GitHub Action 80027d0a9b ignore: update download stats 2025-12-07 2025-12-07 12:04:11 +00:00
GitHub Action a0886694a4 chore: regen sdk 2025-12-07 05:55:31 +00:00
Aiden Cline 476e3ca9f0 tweak: make bash give agent more awareness of cwd, bump default timeout, drop max timeout (#5140) 2025-12-06 23:55:07 -06:00
GitHub Action 9740d97e98 chore: format code 2025-12-07 05:45:36 +00:00
Arindam Majumder c9ea340c86 docs: Nebius Token Factory provider documentation (#2997) 2025-12-06 23:45:08 -06:00
GitHub Action 89121e85d8 chore: regen sdk 2025-12-07 05:33:26 +00:00
Aiden Cline 6ff4106a1e core: prevent sessions from disappearing after git init
Previously, sessions created in a non-git directory would disappear from
the session picker after running git init and making the first commit.
This happened because the migration logic ran prematurely before a stable
project ID existed.
2025-12-06 23:32:47 -06:00
GitHub Action bf15b00501 chore: format code 2025-12-06 23:25:16 +00:00
Aiden Cline 2bb9b8d59a ci: fix review 2025-12-06 17:24:44 -06:00
GitHub Action 9888319fa1 chore: regen sdk 2025-12-06 23:23:24 +00:00
Dax Raad 7d9d39d4fb ci 2025-12-06 18:22:55 -05:00
GitHub Action 50f3dac1e6 chore: format code 2025-12-06 23:22:04 +00:00
Dax Raad 6ea4900f84 sync 2025-12-06 18:21:32 -05:00
GitHub Action f0fff56cac chore: regen sdk 2025-12-06 23:19:47 +00:00
Dax Raad 3f74236db9 tui: add visual separator between username and timestamp for better readability 2025-12-06 18:19:18 -05:00
Dax Raad e224c55556 tui: prevent deprecated models from appearing in model picker 2025-12-06 18:18:45 -05:00
GitHub Action 701c62c46a chore: format code 2025-12-06 23:15:39 +00:00
Aiden Cline b957004391 ci: fix format 2025-12-06 17:15:04 -06:00
GitHub Action b83e8b911b chore: regen sdk 2025-12-06 22:05:07 +00:00
Aiden Cline 7cdc97bc58 fix: reduce overhead of task tool metadata 2025-12-06 16:04:33 -06:00
GitHub Action f5e50e69fa chore: format code 2025-12-06 20:49:33 +00:00
Saatvik Arya edaf18830f feat(tui): add dynamic terminal window title (#5112) 2025-12-06 14:49:11 -06:00
GitHub Action 0e52ecdd26 chore: regen sdk 2025-12-06 20:48:46 +00:00
Anchit Bajaj 29b774ca91 fix: update description to lowercase for ACP command (to be consistent with other commands) (#5137) 2025-12-06 14:48:21 -06:00
GitHub Action 05df229a0d chore: format code 2025-12-06 20:43:15 +00:00
Ariane Emory 41ca76614f fix: make timestamp toggle text dynamic in command list (resolves #5106) (#5108) 2025-12-06 14:42:46 -06:00
GitHub Action ba0f759454 chore: regen sdk 2025-12-06 20:30:00 +00:00
Ben Vargas 9b787abea9 feat: restore experimental flag for websearch/codesearch tools (#5132)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-12-06 14:29:34 -06:00
GitHub Action a350479579 chore: format code 2025-12-06 20:28:25 +00:00
Cody Rayment 616f237fba docs: update server API reference with complete endpoint list (#5136) 2025-12-06 14:28:02 -06:00
Dak Washbrook dbf1922ef7 feat: add mercury.com theme (#5141) 2025-12-06 14:27:56 -06:00
Github Action af43e5d691 Update Nix flake.lock and hashes 2025-12-06 12:45:14 +00:00
GitHub Action 64624dafb8 chore: regen sdk 2025-12-06 12:44:22 +00:00
Adam 9409b40001 fix: terminal serialization and isolation 2025-12-06 06:43:53 -06:00
GitHub Action 9793feced8 ignore: update download stats 2025-12-06 2025-12-06 12:04:12 +00:00
GitHub Action 0b80ddd4a9 chore: format code 2025-12-06 11:53:20 +00:00
Adam a9a5688513 fix: exclude dist 2025-12-06 05:52:47 -06:00
Adam e54eb9fc77 chore: update tauri update pub key 2025-12-06 05:49:05 -06:00
GitHub Action 70a715f109 chore: regen sdk 2025-12-06 01:21:17 +00:00
Dax Raad 541f8decc4 sync 2025-12-05 20:20:47 -05:00
GitHub Action 1f3c1cd3a4 chore: format code 2025-12-06 01:14:58 +00:00
Dax fc48f669a4 Documentation edits made through Mintlify web editor 2025-12-05 20:14:29 -05:00
Dax c3cb83d1b2 Documentation edits made through Mintlify web editor 2025-12-05 20:14:10 -05:00
GitHub Action 6147cac19e chore: regen sdk 2025-12-06 01:13:23 +00:00
Dax Raad 0249d7bf98 ci 2025-12-05 20:12:52 -05:00
Dax Raad 19e3b64824 openapi route 2025-12-05 20:11:01 -05:00
GitHub Action ed42d2a4a2 chore: format code 2025-12-06 01:09:36 +00:00
Dax Raad 676e4f9f1b openapi json 2025-12-05 20:07:24 -05:00
GitHub Action 1d0e38e022 chore: format code 2025-12-06 01:02:41 +00:00
Dax Raad c825a314f4 openapi generate 2025-12-05 20:01:55 -05:00
David Hill f7e9afb975 fix: add extra line break to install page 2025-12-05 23:43:26 +00:00
Adam ad9742a60c feat: consistent (updated) social share images 2025-12-05 15:42:19 -06:00
GitHub Action 2ff967dabb chore: format code 2025-12-05 21:42:15 +00:00
Dax Raad 168b66ef2a ignore: docs test 2025-12-05 16:41:35 -05:00
GitHub Action 42f6ed6245 chore: regen sdk 2025-12-05 21:02:17 +00:00
Aiden Cline 3b0ddf3e5f ci: regen sdk instead of failing tests 2025-12-05 15:01:41 -06:00
GitHub Action a3e8d555af chore: format code 2025-12-05 20:50:13 +00:00
franlol d907c34e93 feat: add optional scrollbar to the session chat (#5116)
Co-authored-by: Sebastian <hasta84@gmail.com>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-12-05 14:49:05 -06:00
opencode 8b1da87a55 release: v1.0.134
Update Nix Hashes / update (push) Waiting to run
2025-12-05 20:46:49 +00:00
Github Action 7eb4e29db5 Update Nix flake.lock and hashes 2025-12-05 20:41:00 +00:00
Brendan Allan 19d739b3ed OpenCode Desktop app (#5044)
Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com>
2025-12-05 14:39:49 -06:00
Shantur Rathore 2f082043cf tweak: bash tool improve output metadata for agent consumption, fix small timeout issue (#5131) 2025-12-05 13:56:56 -06:00
Nathan Thomas dc2d711b19 feat: add max steps for supervisor and sub-agents (#4062)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-12-05 12:26:44 -06:00
Adam d731c16959 fix(desktop): terminal cursor position 2025-12-05 12:05:30 -06:00
Adam 10cd40403c fix(desktop): prompting 2025-12-05 10:51:35 -06:00
Aiden Cline 46476e594a ignore: regen sdk 2025-12-05 10:50:14 -06:00
Noam Bressler 3eaeb48de1 add experimental.open_telemetry config option to enable OTEL spans (#4978)
Co-authored-by: noamzbr <noamzbr@users.noreply.github.com>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-12-05 10:48:22 -06:00
Adam 49655aef0c fix(desktop): clone pty session on reconnect 2025-12-05 10:30:48 -06:00
Adam 775c78108c fix(desktop): new session not selecting tab 2025-12-05 10:30:48 -06:00
Anthony Shew 84fde5ee99 feat(theme): Vercel (#5119)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-12-05 10:01:20 -06:00
Julian Visser cccafbba58 fix: #5064 ProviderInitError github-copilot-enterprise (#5123) 2025-12-05 09:53:32 -06:00
Dax Raad 7b38b4c721 do not use required pty for local dev 2025-12-05 10:39:44 -05:00
Frank 08ddacce55 Zen: add codex max 2025-12-05 09:05:00 -05:00
GitHub Action 3c66efdd73 ignore: update download stats 2025-12-05 2025-12-05 12:04:29 +00:00
Aiden Cline e68039a889 ignore: tweak 2025-12-05 01:00:47 -06:00
Aiden Cline e3a734e9eb fix: ensure projects that go from having no commits to having commits have sessions migrated (#5105)
Co-authored-by: GitHub Action <action@github.com>
2025-12-05 00:49:07 -06:00
Aiden Cline e9f2d6878e ci: keybinds 2025-12-05 00:22:28 -06:00
ry2009 3d930c0341 tui: wrap dialog option descriptions (#5083) 2025-12-05 00:19:48 -06:00
Aiden Cline ac227be928 ignore: cmd tweak 2025-12-05 00:11:47 -06:00
GitHub Action 93d893d414 chore: format code 2025-12-05 05:14:21 +00:00
Aiden Cline 3c493dd554 ignore: rm slop commnand (only for opencode repo this isnt shipping) 2025-12-04 23:13:41 -06:00
Aiden Cline 848cfda06e fix: ensure that vcs is still set to git even if no commits in repo 2025-12-04 23:02:11 -06:00
Aiden Cline bc806f538c ci: review 2025-12-04 23:02:11 -06:00
Dax Raad 0ff47b1fb8 increase default scroll speed 2025-12-04 23:54:46 -05:00
Dax Raad 2995db2d11 fix 2025-12-04 23:48:32 -05:00
Dax Raad d81f631b55 fix pty builds 2025-12-04 23:47:57 -05:00
Jérôme Benoit 2cb12b8db2 fix: add getModel to SAP AI Core provider for correct SDK initialization (#5086)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
2025-12-04 22:43:22 -06:00
opencode-agent[bot] b658029e31 docs: llama.cpp docs: limit moved under model (#5089)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: GitHub Action <action@github.com>
2025-12-04 22:39:13 -06:00
Dax Raad 0c9f6928af ignore: fix provider credentials query for BYOK
Provider credentials field was being selected from ProviderTable even when the table wasn't joined (when byokProvider was undefined). Now the join is conditional - when byokProvider exists, we join and get the credentials; when it doesn't, the join condition is always false so provider remains null.
2025-12-04 22:57:39 -05:00
Frank 5ac9d189c9 zen: fix byok 2025-12-04 21:53:33 -05:00
Github Action f5372b6081 Update Nix flake.lock and hashes 2025-12-05 02:33:39 +00:00
GitHub Action 3c73fc96d5 chore: format code 2025-12-05 02:33:01 +00:00
Adam 9b3c90e3fe Reapply "feat(desktop): terminal pane (#5081)"
This reverts commit 03a0312e5b.
2025-12-04 20:32:08 -06:00
Github Action 378cbb30e2 Update Nix flake.lock and hashes 2025-12-04 22:02:17 +00:00
opencode d88c862503 release: v1.0.133
Update Nix Hashes / update (push) Waiting to run
2025-12-04 22:02:17 +00:00
Aiden Cline 03a0312e5b Revert "feat(desktop): terminal pane (#5081)"
This reverts commit def9fc463c.
2025-12-04 15:57:01 -06:00
Adam def9fc463c feat(desktop): terminal pane (#5081)
Co-authored-by: Github Action <action@github.com>
Co-authored-by: Dax Raad <d@ironbay.co>
2025-12-04 15:37:29 -06:00
Dax Raad 267cf11962 core: add test for custom model npm package inheritance 2025-12-04 16:30:54 -05:00
Aiden Cline 999f3dfac2 tweak: bash tool description re commit stuff 2025-12-04 15:27:23 -06:00
Cason Adams 4f734f6bd8 docs: add CodeCompanion.nvim integration instructions (#5079) 2025-12-04 14:49:51 -06:00
Dax Raad 3f1772ee9a core: ensure model npm package falls back to dev models config when not explicitly defined 2025-12-04 15:39:52 -05:00
Jérôme Benoit c2e206f03a feat: Add SAP AI Core provider support (#5023)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
2025-12-04 14:07:23 -06:00
Aiden Cline 9abf8ca055 bump: builtin plugin versions 2025-12-04 12:37:14 -06:00
Daniel Polito 40e4a0b681 add optional prompt Input to Github Action (#4828)
Co-authored-by: Github Action <action@github.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
2025-12-04 12:10:56 -06:00
Aiden Cline 9c1ff1c9a5 tui: fix /new slash command being persisted in prompt input 2025-12-04 12:01:13 -06:00
Shantur Rathore 6688105bbb tweak: bash tool messages regarding timeouts and truncation more clear for agent (#5066) 2025-12-04 11:33:00 -06:00
Aiden Cline 68a63054d2 fix: model not being passed correctly to tool 2025-12-04 11:15:30 -06:00
Daniel Gray dd7670c48a Preserve prompt input when creating new session (#4993) 2025-12-04 11:12:58 -06:00
Adam 7e21f41892 fix(tui): cursor color 2025-12-04 06:56:48 -06:00
GitHub Action 80f2ccdd98 ignore: update download stats 2025-12-04 2025-12-04 12:04:38 +00:00
Aiden Cline 6b9989ddf4 ci: cleaner 2025-12-04 01:14:09 -06:00
Aiden Cline 1573f348e4 ci: only maintainer can trigger 2025-12-04 01:07:04 -06:00
Frank d5cfd2e8bc zen: make session provider sticky 2025-12-03 23:33:46 -05:00
wsx99outlook bffd79e719 ci: use blacksmith runners in review workflow too (#5042) 2025-12-03 22:30:00 -06:00
GitHub Action 0336bad155 chore: format code 2025-12-04 04:29:03 +00:00
YeonGyu-Kim 289475cece fix: ensure checkUpgrade sets init: (#5040) 2025-12-03 22:28:35 -06:00
opencode ec07aafa79 release: v1.0.132
Update Nix Hashes / update (push) Waiting to run
2025-12-04 04:23:39 +00:00
GitHub Action 7c3bc4c279 chore: format code 2025-12-04 04:19:15 +00:00
Dax Raad 0466e6f36e fix anthropic api key error 2025-12-03 23:18:24 -05:00
opencode 80898220bc release: v1.0.131
Update Nix Hashes / update (push) Waiting to run
2025-12-04 04:11:48 +00:00
Aiden Cline 345269719d fix: TypeError: undefined is not an object 2025-12-03 22:03:42 -06:00
GitHub Action 619a38e73e chore: format code 2025-12-04 03:42:08 +00:00
Frank 816759d16f zen: fix chart loading 2025-12-03 22:41:31 -05:00
opencode 9904a8cebf release: v1.0.130
Update Nix Hashes / update (push) Waiting to run
2025-12-04 03:38:18 +00:00
Jakub Matjanowski 73c6b95c7d feat: Enhance DeepSeek reasoning content handling (#4975)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-12-03 21:31:36 -06:00
Jack Bisceglia d1ca2f826b docs: remove outdated theme section as system theme is now added back (#5041) 2025-12-03 21:10:26 -06:00
Aiden Cline d88fb2084a ci: add note about iife 2025-12-03 21:08:12 -06:00
Aiden Cline f3f7cb29eb fix: provider id issue 2025-12-03 20:45:55 -06:00
Aiden Cline ac54645dc1 fix: compaction type issue 2025-12-03 20:43:47 -06:00
Aiden Cline 8d83815413 fix: dax typo 2025-12-03 20:39:11 -06:00
Github Action ff94aeff29 Update Nix flake.lock and hashes 2025-12-04 02:34:26 +00:00
Aiden Cline 4bc9e710d1 bump opentui 2025-12-03 20:33:08 -06:00
Dax 85d8825cb1 core: refactor provider and model system (#5033)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: thdxr <thdxr@users.noreply.github.com>
2025-12-03 21:09:03 -05:00
Dax Raad 5c0dccdc6c core: add provider test coverage for upcoming refactor
Add comprehensive test suite for Provider module to ensure safe
refactoring of provider internals. Tests cover:
- Provider loading from env vars and config
- Provider filtering (disabled_providers, enabled_providers)
- Model whitelist/blacklist
- Model aliasing and custom providers
- getModel, getProvider, closest, defaultModel functions

Also adds Env module for instance-scoped environment variable access,
enabling isolated test environments without global state pollution.
2025-12-03 18:30:42 -05:00
Frank 8123f8a8c8 zen: fix chart loading
closes #5030
2025-12-03 18:12:28 -05:00
Aiden Cline f49a17bcb1 ci: review tweak 2025-12-03 16:16:08 -06:00
Ariane Emory 154c57fe9d feat: add tool_details keybind w/ no default (#4976)
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-12-03 13:38:09 -06:00
Aiden Cline 541bf2d5c1 ci: review ready for review action 2025-12-03 13:35:49 -06:00
Aiden Cline 8ed97ed480 ci: tweak review cmd 2025-12-03 13:34:45 -06:00
Frank 6fcd9aed2f zen: usage graph respect light/dark mode 2025-12-03 14:24:44 -05:00
Aiden Cline 6e46bb8c09 ci: make review only fire on non draft pr creation 2025-12-03 13:10:40 -06:00
Aiden Cline b905cf202c ci: add pr review 2025-12-03 12:45:06 -06:00
Ariane Emory 77df6c2ba1 feat: add messages_last_user command to scroll TUI to last user message (implements #4847) (#4855)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-12-03 12:30:11 -06:00
Luke Parker c7102d9cee fix: bunfs path on windows (#5011) 2025-12-03 11:21:13 -06:00
Spoon e4f11b6f5b feat: experimental.primary_tools, allow user to set the tools that should only be available to primary agents (#4913)
Co-authored-by: GitHub Action <action@github.com>
2025-12-03 11:19:43 -06:00
Aiden Cline 388c5b69ae add retry case for grok resource exhausted 2025-12-03 11:16:27 -06:00
GitHub Action cbaafbc0af chore: format code 2025-12-03 16:47:25 +00:00
Aiden Cline fec666e641 ignore: docs & style 2025-12-03 10:46:48 -06:00
GitHub Action 9198a06737 ignore: update download stats 2025-12-03 2025-12-03 12:04:36 +00:00
opencode d09ef88fd4 release: v1.0.129
Update Nix Hashes / update (push) Waiting to run
2025-12-03 11:39:04 +00:00
Aiden Cline 25a4a855e3 core: fix GitHub Copilot Enterprise authentication failing with sdk.chat undefined error 2025-12-02 23:37:10 -06:00
Jason Cheatham 8db84c3116 tweak: adjust light/dark theme toggle (#5007) 2025-12-02 23:03:24 -06:00
Ben Vargas 2d54f98afa fix: correct Provider type in chat.params plugin hook (#5003) 2025-12-02 22:50:21 -06:00
Jason Cheatham 0abc227805 fix: handle 0 in ANSI theme color definitions (#5009) 2025-12-02 22:42:30 -06:00
Frank 627a147f7f zen: fix removing provider 2025-12-02 21:52:12 -05:00
Github Action 7617ed5a9f Update Nix flake.lock and hashes 2025-12-03 02:17:49 +00:00
Sebastian Herrlinger a08f50b1a4 actually bump opentui to v0.1.55
- fix scrollbox empty/blank last items at bottom
- fix should not insert chars with modifiers in input/textarea anymore
- do not wrap OSC4 palette sequences for tmux 3.6
2025-12-03 03:16:32 +01:00
Sebastian Herrlinger 7e045fecde Revert "bump opentui to v0.1.55"
This reverts commit e5d19f0c3f.
2025-12-03 03:14:08 +01:00
Github Action 77ce9aef61 Update Nix flake.lock and hashes 2025-12-03 02:06:35 +00:00
Sebastian Herrlinger e5d19f0c3f bump opentui to v0.1.55
- fix scrollbox empty/blank last items at bottom
- fix should not insert chars with modifiers in input/textarea anymore
- do not wrap OSC4 palette sequences for tmux 3.6
2025-12-03 03:03:52 +01:00
Aiden Cline 0816f83cbb add basic session list command 2025-12-02 19:24:05 -06:00
Aiden Cline 8993f76967 Make homebrew update check use homebrew registry version info 2025-12-02 17:43:33 -06:00
Frank a432fd69f7 wip: zen 2025-12-02 18:36:15 -05:00
Dalton Alexandre 6005e75549 fix: allow unignoring files in .ignore (#4814) 2025-12-02 17:15:12 -06:00
Jay V e8bb7265c0 ignore: commands 2025-12-02 18:09:16 -05:00
Jay V 95e9c6b26e docs: replace deprecated opencode auth login command with /connect across all documentation
Users no longer need to exit the TUI to add providers - they can now use the /connect command directly in the terminal interface. Updated all provider setup instructions to use simplified format with /connect command instead of the deprecated opencode auth login CLI command. Added /connect to TUI commands reference and streamlined provider documentation to show clearer, more concise setup steps.
2025-12-02 18:08:39 -05:00
Aiden Cline 7d654d7cc7 tweak: make message border match color of agent it was sent to 2025-12-02 16:59:31 -06:00
Aiden Cline 803af16bb7 bump default lsp server timeout 2025-12-02 16:04:08 -06:00
Adam c5c7014b72 fix: session turn margins 2025-12-02 15:50:24 -06:00
Jaga Santagostino 5269630b6e toggle to hide username in TUI (#4750)
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-12-02 15:11:03 -06:00
GitHub Action e1fa68c89a chore: format code 2025-12-02 20:28:17 +00:00
Aiden Cline 65c7ac5dcd ci: dont forget our european designer 2025-12-02 14:27:41 -06:00
opencode-agent[bot] e1c1cbf973 add OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT (#4996)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-12-02 20:14:23 +00:00
opencode c9369c4bd4 release: v1.0.128
Update Nix Hashes / update (push) Waiting to run
2025-12-02 20:14:22 +00:00
GitHub Action d9246cc25b chore: format code 2025-12-02 19:52:47 +00:00
Frank efa655c868 zen: data dumper 2025-12-02 14:51:27 -05:00
Adam 1e73bd17a6 chore: remove comment (redeploy) 2025-12-02 13:49:48 -06:00
Adam 23b47f87d1 fix: vite config 2025-12-02 13:08:59 -06:00
U Cirello 25284c39e4 fix(run): allow messages to start with dash (-) (#4904) 2025-12-02 12:52:05 -06:00
Aiden Cline 3eb43c6a0b tweak: hide [REDACTED] chunks 2025-12-02 12:29:20 -06:00
Adam 50a32254f5 chore: update landing page stats 2025-12-02 11:59:37 -06:00
Adam 504d3d0149 chore: update landing page stats 2025-12-02 11:52:53 -06:00
GitHub Action 27f9813d5d chore: format code 2025-12-02 17:07:27 +00:00
David Hill 11c036f480 Merge branch 'dev' of https://github.com/sst/opencode into dev 2025-12-02 17:06:54 +00:00
David Hill c4b098402b fix: add docs button 2025-12-02 17:06:37 +00:00
GitHub Action f36aa882f6 chore: format code 2025-12-02 17:02:39 +00:00
David Hill 00d1f1f949 Merge branch 'dev' of https://github.com/sst/opencode into dev 2025-12-02 17:00:45 +00:00
David Hill 59a86633e7 fix: website hero copy 2025-12-02 17:00:40 +00:00
GitHub Action 152b47746a chore: format code 2025-12-02 16:45:56 +00:00
Dalton Alexandre 46b4dcdb48 fix: handle ANSI color indexes in theme resolution (#4842) 2025-12-02 10:45:22 -06:00
opencode 78206bbde4 release: v1.0.127
Update Nix Hashes / update (push) Waiting to run
2025-12-02 16:05:59 +00:00
Adam 1301fbf54f fix: share page ssr 2025-12-02 07:08:25 -06:00
Github Action 939759bc06 Update Nix flake.lock and hashes 2025-12-02 12:52:28 +00:00
GitHub Action e361aed6b7 chore: format code 2025-12-02 12:51:37 +00:00
Adam 94bb70e120 fix: type error 2025-12-02 06:51:05 -06:00
Adam c153eb9423 feat: better code and diff rendering performance 2025-12-02 06:50:21 -06:00
GitHub Action 4b2614205f ignore: update download stats 2025-12-02 2025-12-02 12:04:35 +00:00
David Hill b59e43b800 fix: update the install copy 2025-12-02 11:37:41 +00:00
Aiden Cline 77239c2a34 feat: add overridable review slash command (#4973) 2025-12-02 00:18:58 -06:00
Ariane Emory e9f3a1a3ed feat: toggle tool details visibility (resolves #4824) (#4882)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-12-01 19:38:44 -06:00
Adam aa907dc287 fix: install orange 2025-12-01 19:21:55 -06:00
Aiden Cline 844d326f90 fix: tui crash when no authed providers and default provider disabled (#4964) 2025-12-01 18:35:40 -06:00
Frank 8c1f684975 zen: remove unnecessary transactions 2025-12-01 18:33:32 -05:00
Stephen Collings f28249110f fix(auth): Respect disabled/enabled providers config in auth login (#4940)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-12-01 17:01:10 -06:00
Aiden Cline dba8059c45 fix: add .quiet 2025-12-01 16:59:32 -06:00
opencode-agent[bot] 74c16793dc fix: respect npm registry (#4958)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-12-01 16:58:39 -06:00
Adam 6811ba570c fix: safari icons 2025-12-01 16:27:12 -06:00
Aiden Cline f5cdf14820 fix: sanitize more invalid schema cases for gemini models 2025-12-01 16:19:10 -06:00
Dax Raad e5a31bfd50 core: fix share compaction reprocessing same events by making storage list boundaries exclusive 2025-12-01 16:58:59 -05:00
Dax Raad 0f3136faf6 core: add debug logging to troubleshoot share compaction loading 2025-12-01 16:46:57 -05:00
Github Action 329ce68161 Update Nix flake.lock and hashes 2025-12-01 21:38:38 +00:00
Dax Raad c7445952e5 core: prevent share tests from cleaning up storage used by other tests 2025-12-01 16:37:54 -05:00
Dax Raad 0cd65a5147 fix types 2025-12-01 16:36:56 -05:00
GitHub Action 28888034da chore: format code 2025-12-01 21:35:51 +00:00
Dax Raad c3585ebf72 core: reduce latency when loading shared sessions through event compaction 2025-12-01 16:35:07 -05:00
Dax Raad 2c5a3984f1 limit grep line length to 2000 2025-12-01 16:35:07 -05:00
Aiden Cline c50a1b83f3 fix: copilot responses bug w/ gpt 5 mini 2025-12-01 14:36:49 -06:00
GitHub Action ceda7de457 chore: format code 2025-12-01 19:03:13 +00:00
Aiden Cline 0399ec2808 fix case where opencode wasn't retrying 2025-12-01 13:02:33 -06:00
opencode c4510e3eb8 release: v1.0.126
Update Nix Hashes / update (push) Waiting to run
2025-12-01 19:00:00 +00:00
blacksmith-sh[bot] 6a4018db03 .github/workflows: Migrate workflows to Blacksmith runners (#4941)
Co-authored-by: blacksmith-sh[bot] <157653362+blacksmith-sh[bot]@users.noreply.github.com>
2025-12-01 09:43:33 -05:00
GitHub Action a846e0387f chore: format code 2025-12-01 14:43:23 +00:00
Dax Raad 2cceffb565 log fetch time 2025-12-01 09:35:08 -05:00
GitHub Action b4afb8d098 chore: format code 2025-12-01 14:23:36 +00:00
opencode 3517417431 release: v1.0.125
Update Nix Hashes / update (push) Waiting to run
2025-12-01 14:23:35 +00:00
Dax Raad 32f6c3baac docs: add rebase instructions to commit command 2025-12-01 09:14:54 -05:00
Dax Raad 9948e1c123 core: close SSE stream when instance is disposed 2025-12-01 09:14:00 -05:00
Sebastian Herrlinger 653d7fd545 no conceal for write tool output 2025-12-01 15:12:47 +01:00
GitHub Action 316586a8f4 chore: format code 2025-12-01 13:27:29 +00:00
adamelmore c40c2a39c2 chore: otf fonts 2025-12-01 07:20:53 -06:00
GitHub Action 1b5f34480d ignore: update download stats 2025-12-01 2025-12-01 12:08:56 +00:00
opencode 7a58c6cd9d release: v1.0.124
Update Nix Hashes / update (push) Waiting to run
2025-12-01 09:20:29 +00:00
Aiden Cline 2788fac2ac tweak: better err msgs 2025-12-01 01:33:32 -06:00
Aiden Cline 78d54aad3c fix: drop absolute flag to resolve issues when using older git versions 2025-12-01 00:23:19 -06:00
GitHub Action b750f698b3 chore: format code 2025-12-01 02:53:41 +00:00
Aiden Cline 97fe935998 bump anthropic plugin to fix header issue 2025-11-30 20:52:50 -06:00
opencode f49d5927a9 release: v1.0.123
Update Nix Hashes / update (push) Waiting to run
2025-12-01 01:07:50 +00:00
Github Action c447e67535 Update Nix flake.lock and hashes 2025-12-01 01:00:23 +00:00
Sebastian Herrlinger 1cb2b6581f bump opentui to v0.1.54, removing the cc flicker feature, fixing diffs and input event handling 2025-12-01 01:57:55 +01:00
Shantur Rathore db2a069383 tweak: compaction prompt (#4838)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-11-30 14:31:57 -06:00
Justin Vogt ad36dc4cff docs: explore subagent (#4893) 2025-11-30 14:04:27 -06:00
GitHub Action 40de95ec1b ignore: update download stats 2025-11-30 2025-11-30 12:04:23 +00:00
Adam 00089983d1 feat(share): split diffs on wide screens 2025-11-30 05:29:07 -06:00
Aiden Cline e20b6f6591 tweak: plan prompt 2025-11-30 01:03:35 -06:00
Aiden Cline 84798cf7f5 chore: cleanup 2025-11-30 00:32:43 -06:00
opencode-agent[bot] 098ae8c780 Added "Open docs" command to palette (#4915)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-11-29 23:49:45 -06:00
Justin Vogt 7191bf38ee docs: Move tip to correct tool (#4891) 2025-11-29 22:03:20 -06:00
Aiden Cline b3fa3d4475 get codex working in copilot (#4914)
Co-authored-by: OpeOginni <107570612+OpeOginni@users.noreply.github.com>
Co-authored-by: GitHub Action <action@github.com>
2025-11-29 21:47:29 -06:00
opencode 064a444ef7 release: v1.0.122
Update Nix Hashes / update (push) Waiting to run
2025-11-30 00:35:34 +00:00
Github Action 63e9865d8d Update Nix flake.lock and hashes 2025-11-29 23:56:14 +00:00
Sebastian Herrlinger 85cd86fce4 bump opentui to v0.1.53, fixing an event listener leak in the line number renderable (perf) 2025-11-30 00:52:32 +01:00
Sebastian Herrlinger 211ae32359 tweak spinner to be bg independent 2025-11-30 00:50:30 +01:00
GitHub Action d84edc7637 chore: format code 2025-11-29 21:41:00 +00:00
Dax Raad 93196f2e2d core: clarify general agent can execute multiple parallel tasks 2025-11-29 16:40:15 -05:00
Dax Raad 2ef51ca6c3 ci: allow snapshot builds from any branch starting with snapshot- prefix 2025-11-29 21:30:38 +00:00
opencode c8696063c2 release: v1.0.121
Update Nix Hashes / update (push) Waiting to run
2025-11-29 21:30:38 +00:00
Github Action 1960ecc282 Update Nix flake.lock and hashes 2025-11-29 21:20:24 +00:00
Sebastian Herrlinger ead6f57d11 upgrade opentui to v0.1.52, fixing #4906 - key repeat handling 2025-11-29 22:18:08 +01:00
kavin 42ffb4487c fix(tui): add missing fg color to permission keybind hints (#4899)
Co-authored-by: Github Action <action@github.com>
2025-11-29 14:22:20 -06:00
Adam 4981fbddf5 chore: cleanup duplicate markup 2025-11-29 06:18:51 -06:00
GitHub Action 005abeb0a7 ignore: update download stats 2025-11-29 2025-11-29 12:04:12 +00:00
Dorian Karter 99b60488de fix: minor ui bug for transparent backgrounds (#4886) 2025-11-28 23:58:44 -06:00
Dax Raad 827564401e core: improve explore agent description to clarify tool availability 2025-11-28 21:47:45 -05:00
GitHub Action 6fcc0be7ed chore: format code 2025-11-29 02:44:40 +00:00
Dax Raad 40e1f1be14 Merge remote-tracking branch 'origin/dev' into dev 2025-11-28 21:44:02 -05:00
Dax Raad 6ac9199826 core: update generated types to include explore agent configuration 2025-11-28 21:43:56 -05:00
opencode 9853c7b6d9 release: v1.0.120
Update Nix Hashes / update (push) Waiting to run
2025-11-29 02:34:23 +00:00
Dax Raad 35b313fa40 tui: improve task display in session view to show tool names and completion status 2025-11-28 21:19:15 -05:00
Dax Raad 6a87d2fb30 Merge remote-tracking branch 'origin/dev' into dev 2025-11-28 21:13:13 -05:00
Dax Raad e3d6847112 core: add explore agent for fast codebase navigation and improve task UI display 2025-11-28 21:13:07 -05:00
Adam eade62e7d6 fix: diffs double rendering when CSR'd 2025-11-28 20:08:50 -06:00
Adam 9baa9fdc31 fix: theme-color value 2025-11-28 19:57:01 -06:00
Github Action 741449a9d4 Update Nix flake.lock and hashes 2025-11-29 01:55:02 +00:00
Sebastian Herrlinger a3f0e61161 opentui diffs 2025-11-29 02:52:17 +01:00
Dax Raad 95bc09449d ignore 2025-11-28 20:29:58 -05:00
GitHub Action c2d035be74 chore: format code 2025-11-28 22:43:33 +00:00
Justin Vogt 148e884428 docs: Add tip to tools about subagents re todos (#4875) 2025-11-28 15:49:24 -06:00
Aiden Cline 1e0e581468 ci: add community contributors to the changelog 2025-11-28 15:44:21 -06:00
Ariane Emory 7849f9713c feat: persist thinking blocks display to KV and indicate its current display state in the command_list (resolves #4582) (#4810)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-11-28 15:01:05 -06:00
Aiden Cline c07e6879cd ci: use haiku 2025-11-28 14:41:32 -06:00
Github Action e9036a6480 Update Nix flake.lock and hashes 2025-11-28 20:32:46 +00:00
Aiden Cline c649baa5b9 bump openrouter & google ai sdk packages 2025-11-28 14:30:22 -06:00
Aiden Cline 2be3dffb5e Revert "fix: title gen when first msg(s) are shell invocations (#4874)"
This reverts commit ae68698cd0.
2025-11-28 12:18:02 -06:00
Aiden Cline ae68698cd0 fix: title gen when first msg(s) are shell invocations (#4874)
Co-authored-by: GitHub Action <action@github.com>
2025-11-28 11:55:22 -06:00
Sergio Garcia 46e9439c4f docs: formatter: false and lsp: false (#4833)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
2025-11-28 11:22:48 -06:00
jaov 1d9c43d9dc tweak: gemini retry message to not be explicitly about gemini 3 (#4864)
Co-authored-by: jesuso <j.ochoa@norteconecta.net>
2025-11-28 11:14:53 -06:00
Dax Raad 37c42b2cd6 ci stuff 2025-11-28 10:59:52 -05:00
Dax Raad 25ba813f35 add otui-diffs 2025-11-28 10:59:07 -05:00
GitHub Action 018fb2b0b3 ignore: update download stats 2025-11-28 2025-11-28 12:04:42 +00:00
Adam 1994f2c9a4 fix: theme-color value 2025-11-28 05:48:07 -06:00
Adam c415d21cde fix: desktop and share layouts 2025-11-28 05:35:35 -06:00
Adam b3ca55ef33 fix: unified diff as default 2025-11-28 05:35:35 -06:00
Christoph aa2a0dbd7b core: add built-in Dart LSP server and formatter (#4841) 2025-11-28 00:33:45 -06:00
Github Action 4eed4242f7 Update Nix flake.lock and hashes 2025-11-28 06:27:49 +00:00
DS 0698c072b5 fix: filter empty messages in toModelMessage (#4811) 2025-11-28 00:26:48 -06:00
Aiden Cline 58399ceafa bump anthropic package 2025-11-28 00:25:16 -06:00
Adam cb9857c162 fix(desktop): layout 2025-11-27 20:15:49 -06:00
Adam 3be19b3e1b fix: unwrap solid store part 2025-11-27 20:15:49 -06:00
Dax Raad 050cbce815 ci: add bun version check to pre-push hook to ensure version consistency 2025-11-27 15:50:23 -05:00
Dax Raad bb051b9a36 fix lock 2025-11-27 15:48:16 -05:00
Dax Raad 1fa838525d tui: simplify model dialog ordering logic to reduce complexity 2025-11-27 14:38:51 -05:00
Dax Raad 64d10c09c3 tui: improve provider dialog text clarity for better user guidance 2025-11-27 14:09:53 -05:00
Dax Raad 8c82767a56 tui: fix provider sorting to prioritize recommended options 2025-11-27 13:54:42 -05:00
Dax Raad 86d1b1dd54 tui: remove cancel keybind hint from prompt dialog to simplify UI 2025-11-27 13:48:34 -05:00
Dax Raad a1ff0556fc tui: hide favorite keybind in model dialog when disconnected to prevent errors 2025-11-27 13:42:36 -05:00
GitHub Action e554d29b38 chore: format code 2025-11-27 17:15:41 +00:00
Jay V 81bcf8e00b ignore: lock 2025-11-27 12:14:50 -05:00
Jay V 55acbb58ef ignore: add reply-to support for enterprise form emails 2025-11-27 12:12:44 -05:00
Albert O'Shea 19a27ecc38 nix: fix workflow failing on PRs (#4820)
Co-authored-by: Github Action <action@github.com>
2025-11-27 10:05:51 -06:00
Frank c6a82650e4 doc: slashing kimi k2 thinking price 2025-11-27 09:58:57 -05:00
GitHub Action 27b2414712 ignore: update download stats 2025-11-27 2025-11-27 12:04:30 +00:00
Adam 26478e641c fix: desktop layout and scroll gutters 2025-11-27 05:41:50 -06:00
Adam 6d77a07e18 fix: session turn margins 2025-11-27 05:25:39 -06:00
GitHub Action 6c2d2e0ba8 chore: format code 2025-11-27 11:06:46 +00:00
Adam 8661e5db52 fix: simpler sanitize 2025-11-27 05:05:55 -06:00
opencode 9d2bf1df73 release: v1.0.119
Update Nix Hashes / update (push) Waiting to run
2025-11-27 03:15:40 +00:00
Dax Raad 6ca32b1d0e core: prevent codesearch and websearch tools when webfetch permission is denied 2025-11-26 22:08:50 -05:00
GitHub Action a0ea0857ca chore: format code 2025-11-27 03:08:33 +00:00
Dax Raad c0995239fa core: prevent external diff tools from interfering with snapshot generation 2025-11-26 22:07:51 -05:00
opencode 013763f44b release: v1.0.118
Update Nix Hashes / update (push) Waiting to run
2025-11-27 02:43:07 +00:00
Dax Raad 8de0e3530c tui: prevent footer from shrinking when terminal is resized 2025-11-26 21:35:56 -05:00
Github Action bd0822d8b1 Update Nix flake.lock and hashes 2025-11-27 01:33:35 +00:00
GitHub Action 14a04f1496 chore: format code 2025-11-27 01:32:04 +00:00
Dax Raad 2b3a900c5e revert ts lsp to monorepo root 2025-11-26 20:31:26 -05:00
opencode c0c58b0737 release: v1.0.117
Update Nix Hashes / update (push) Waiting to run
2025-11-27 01:29:00 +00:00
Dax Raad fead40328f roll back vtsls 2025-11-26 20:18:40 -05:00
Dax Raad 5ff94e4a8c temporarily restrict codesearch and websearch to opencode zen users. need to figure out how to opt out for enterprise users who do not want this 2025-11-26 20:13:20 -05:00
Dax 50ccfd7b75 tui design refinement (#4809) 2025-11-26 20:11:39 -05:00
Aiden Cline 15c8d556e1 enable parcel file watcher, expand parcel ignore patterns, replace fs watcher for git branches with parcel (#4805) 2025-11-26 17:33:43 -06:00
Aiden Cline 99726b2c89 Revert "fix: disable virtual extmarks for file/agent mentions (#4731)"
This reverts commit 4f9d27a667.
2025-11-26 14:55:39 -06:00
GitHub Action 30c7bb3783 chore: format code 2025-11-26 19:10:51 +00:00
rosmur 1d04ce9973 docs: add llama.cpp provider for local LLM inference (#4769)
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-11-26 13:10:15 -06:00
Aiden Cline e2c1f4a29e fix: svg paste bug 2025-11-26 12:38:48 -06:00
Dax Raad 723cbf548a lil branch refactor 2025-11-26 12:34:48 -05:00
GitHub Action a50f145d17 chore: format code 2025-11-26 17:26:46 +00:00
Tommy D. Rossi a0d7653bdf fix(tui): dedupe file references in prompt (#4775) 2025-11-26 11:26:05 -06:00
opencode f111b2af66 release: v1.0.115
Update Nix Hashes / update (push) Waiting to run
2025-11-26 16:57:35 +00:00
Jensen 75254b1afd fix(tui): show bootstrap errors instead of {} to trace (#4779)
Co-authored-by: Github Action <action@github.com>
2025-11-26 10:49:55 -06:00
Yug Agarwal 5b93c6568b docs: IO.NET Provider (#4762) 2025-11-26 10:44:05 -06:00
GitHub Action c1fc4263b6 ignore: update download stats 2025-11-26 2025-11-26 12:04:44 +00:00
Adam 7e071f2447 fix: useData 2025-11-26 06:03:13 -06:00
Adam bce0a100b2 fix: scroll gutter padding 2025-11-26 05:58:30 -06:00
Github Action f065b8bab8 Update Nix flake.lock and hashes 2025-11-26 11:31:37 +00:00
Adam 69864aec74 deps: update pierre diffs 2025-11-26 05:29:31 -06:00
opencode-agent[bot] 3aa85e85a0 Renamed vcs.changed to vcs.branch.updated (#4771)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-11-26 01:17:59 -06:00
Dmitry Halushka 0e7c91e29e fix: transform MCP tool schemas for Google/Gemini compatibility (#4538)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
Co-authored-by: Github Action <action@github.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-11-26 00:58:20 -06:00
Aiden Cline 606d25d4d6 Remove keybinds from favorites feature, keep functionality 2025-11-26 00:45:33 -06:00
shuv 533f642e8e Add favorites to model selector (#23) (#4343)
Co-authored-by: Github Action <action@github.com>
2025-11-26 00:41:41 -06:00
Meysam Najafi Fard d80b1dd19e fix: handle remote image URLs in paste handler (#4691)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-11-26 00:34:22 -06:00
Aiden Cline a3abb8a019 ignore: fix type issue 2025-11-26 00:14:04 -06:00
Aiden Cline aa3120d20d Reapply "feat(github): add ability to react to PR Review Comments in Workflow (#4705)"
This reverts commit c71f709296.
2025-11-25 23:51:46 -06:00
Aiden Cline c71f709296 Revert "feat(github): add ability to react to PR Review Comments in Workflow (#4705)"
This reverts commit 64876e1189.
2025-11-25 23:51:23 -06:00
U Cirello 64876e1189 feat(github): add ability to react to PR Review Comments in Workflow (#4705)
Co-authored-by: GitHub Action <action@github.com>
2025-11-25 23:45:19 -06:00
george larson d301d6cd66 docs: add Venice.ai provider (#4748)
Co-authored-by: George Larson <georgeglarson@users.noreply.github.com>
2025-11-25 23:40:52 -06:00
Ariane Emory cc3c4277d0 feat: add a diff_style option to allow disabling columnar diffs (resolve #4677) (#4756)
Co-authored-by: Dax Raad <d@ironbay.co>
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-11-25 23:34:58 -06:00
Frank 138291ca24 zen: trial 2025-11-25 23:44:57 -05:00
Aiden Cline 21bf5a10e5 show current git branch in tui (#4765)
Co-authored-by: GitHub Action <action@github.com>
2025-11-25 21:39:20 -06:00
Dax Raad beab4d85f4 enable exa code/websearch 2025-11-25 22:06:26 -05:00
Frank e8e6baa096 wip: zen 2025-11-25 22:01:34 -05:00
Adam aa38509d48 fix: pierre separators 2025-11-25 20:39:20 -06:00
Adam e65dcacc00 chore: cleanup pierre stuff 2025-11-25 20:39:20 -06:00
GitHub Action 06bd8087ab chore: format code 2025-11-26 02:33:36 +00:00
Dax Raad 239db60587 tui: fix event subscription cleanup in SDK context 2025-11-25 21:32:56 -05:00
opencode 4fe88dbb00 release: v1.0.114
Update Nix Hashes / update (push) Waiting to run
2025-11-26 00:32:22 +00:00
GitHub Action c8616f411d chore: format code 2025-11-26 00:24:10 +00:00
Dax Raad 45cee03b10 switch to vtsls for typescript lsp 2025-11-25 19:23:23 -05:00
Aiden Cline 5ddaa97e63 fix: global prefix handling w/ aws bedrock (#4757) 2025-11-26 00:21:59 +00:00
opencode b39df2d4f2 release: v1.0.113
Update Nix Hashes / update (push) Waiting to run
2025-11-26 00:21:59 +00:00
Dax Raad a69ca86eec switch typescript lsp to be one per package to ensure it loads when typescript is not installed at root 2025-11-25 19:14:07 -05:00
Shantur Rathore e80e5b1974 config: add setCacheKey in provider options (#4738)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-11-25 17:53:56 -06:00
Frank a34970046f wip: zen 2025-11-25 18:04:25 -05:00
GitHub Action 4b543ae7d5 chore: format code 2025-11-25 22:59:55 +00:00
Frank a4c14e4480 wip: zen 2025-11-25 17:58:59 -05:00
Frank 8c648c730e wip: zen 2025-11-25 17:57:24 -05:00
Frank a56cc1040d zen: trial 2025-11-25 17:57:24 -05:00
Tommy D. Rossi d047ec00da fix(tui): abort in-progress generation on undo (#4744) 2025-11-25 16:35:34 -06:00
Adam 665e8251f5 fix: build error 2025-11-25 16:27:53 -06:00
Adam 929db79a3f fix: missing deps 2025-11-25 16:27:26 -06:00
Haris Gušić 839c2cbcc5 fix: prompt submit error with opencode -c (#4496)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-11-25 16:27:06 -06:00
Adam 18f160c091 fix: sanitize absolute paths 2025-11-25 16:02:31 -06:00
Aiden Cline 76e00bf387 ci: change changelog model 2025-11-25 15:36:26 -06:00
Aiden Cline 23c7f99167 update install script to handle musl & avx 2025-11-25 15:35:10 -06:00
Aiden Cline 8d2522f4f5 ci: update changelog prompt 2025-11-25 15:34:49 -06:00
Jaga Santagostino 358f6f9cf2 docs: improve notes on mobile (#4747) 2025-11-25 15:27:28 -06:00
GitHub Action 4be2aef2c3 chore: format code 2025-11-25 21:10:31 +00:00
Dax Raad 3039314689 better overloaded message 2025-11-25 21:10:31 +00:00
opencode 85c50bc56e release: v1.0.112
Update Nix Hashes / update (push) Waiting to run
2025-11-25 21:10:30 +00:00
opencode 234df44ee8 release: v1.0.111
Update Nix Hashes / update (push) Waiting to run
2025-11-25 20:54:40 +00:00
Dax Raad b4c5044d92 retry anthropic overloaded errors 2025-11-25 15:47:34 -05:00
Adam f331ef6210 fix: accordion styles 2025-11-25 14:46:22 -06:00
Adam 237535b69a fix: css code splitting off for desktop 2025-11-25 14:33:49 -06:00
Aiden Cline 7982f1a89a tweak stats command to show avg & median # of tokens per session 2025-11-25 14:14:06 -06:00
Jaga Santagostino 168c1cf51f docs: reduce mobile padding (#4745) 2025-11-25 14:04:55 -06:00
Youssef Achy 97875a5e83 Theme selector UX (current theme indicator and easier selection) (#4623)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-11-25 13:53:01 -06:00
Adam ca3ad9a167 fix: scroll gutter 2025-11-25 13:49:46 -06:00
Aiden Cline 3ddac682b1 fix: add missing compacted event 2025-11-25 13:47:10 -06:00
Adam 99189609b9 fix: markdown inline code style 2025-11-25 13:11:21 -06:00
Adam 94da900104 fix(share): style issues 2025-11-25 12:53:43 -06:00
Adam a255984f7f fix(share): don't highlight words unless split 2025-11-25 12:21:39 -06:00
Aiden Cline 5e2b334039 fix: dont auto continue if compaction was manual 2025-11-25 12:11:09 -06:00
Adam ea68d880e3 fix(share): metadata and popover close delay 2025-11-25 12:09:22 -06:00
Github Action af90eb8d7a Update Nix flake.lock and hashes 2025-11-25 17:45:45 +00:00
Dax Raad a14bcc0e8e core(enterprise): use aws4fetch for smaller bundle size on edge runtimes 2025-11-25 12:43:36 -05:00
Tommy D. Rossi 4f9d27a667 fix: disable virtual extmarks for file/agent mentions (#4731) 2025-11-25 11:37:46 -06:00
Ariane Emory 8d4940f95f tweak: alphabetical (mostly) opencode models output (#4725)
Co-authored-by: Dax Raad <d@ironbay.co>
2025-11-25 11:37:05 -06:00
Ariane Emory b71c39fcdd fix: merge plugin selections (resolves #4565) (#4724)
Co-authored-by: Dax Raad <d@ironbay.co>
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-11-25 11:34:21 -06:00
Aiden Cline d156ce8fef ci: setup bun 2025-11-25 11:27:29 -06:00
Github Action c7a50077dc Update Nix flake.lock and hashes 2025-11-25 16:56:01 +00:00
GitHub Action d4e2acdf29 chore: format code 2025-11-25 16:46:00 +00:00
Adam da7e9cc6ac fix: favicons across all web properties 2025-11-25 10:45:18 -06:00
Albert O'Shea 78557168f1 nix: set dontFixup = true (#4735) 2025-11-25 10:16:53 -06:00
Github Action c31d7715a1 Update Nix flake.lock and hashes 2025-11-25 13:50:22 +00:00
GitHub Action 918282adff chore: format code 2025-11-25 13:49:03 +00:00
Adam 3cbe2cfd45 fix(enterprise): custom element defs 2025-11-25 07:48:18 -06:00
Adam 5768404428 fix(enterprise): custom element defs 2025-11-25 07:47:25 -06:00
Adam 9fc5d0b281 feat(share): SSR'd diffs 2025-11-25 07:40:16 -06:00
GitHub Action 2fc8e0bef7 ignore: update download stats 2025-11-25 2025-11-25 12:05:06 +00:00
Aiden Cline b63c5b4ce2 better scroll speed default for windows 2025-11-25 01:16:21 -06:00
Shantur Rathore a74114b063 prompt_async: Allows to receive prompt and return immediately, start … (#4664)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-11-24 23:52:57 -06:00
Aiden Cline 5243e17ba6 Revert "Support basic auth in opencode sdk (#4697)"
This reverts commit e952f2e6b4.
2025-11-24 23:12:00 -06:00
Aiden Cline cf52061619 ci: adjust nix hash 2025-11-24 22:50:32 -06:00
Dax Raad ca7f9c4521 fixed suspense in enterprise 2025-11-24 23:33:47 -05:00
Frank de4468dc15 zen: remove official support for unified endpoint 2025-11-24 23:33:23 -05:00
Frank 2d2df723e3 zen: add zai logo 2025-11-24 23:33:23 -05:00
Aiden Cline 90d38a69dc Revert "config: add setCacheKey in provider options (#4654)"
This reverts commit 3617f90c73.
2025-11-24 22:30:56 -06:00
Shantur Rathore 3617f90c73 config: add setCacheKey in provider options (#4654)
Co-authored-by: GitHub Action <action@github.com>
2025-11-24 22:20:52 -06:00
Aiden Cline dcc803b51c ignore: comment out thingy 2025-11-24 22:15:00 -06:00
Frank a36f3b5a15 zen: graduate kimi k2 thinking 2025-11-24 23:14:46 -05:00
Frank 15ea6a281a zen: sticky session 2025-11-24 23:14:46 -05:00
Dax Raad 951f3291e8 log data 2025-11-24 23:13:28 -05:00
GitHub Action 40c6e4e588 chore: format code 2025-11-25 03:59:28 +00:00
Dax Raad 41ce6b5625 core: refactor share system to separate session IDs from share IDs
- Generate shorter share IDs from session IDs for better URL structure
- Update API routes to use shareID parameter instead of sessionID
- Improve sync mechanism with better data queuing and deduplication
- Maintain backward compatibility while improving security and organization
2025-11-24 22:58:47 -05:00
Dax Raad e36f4d2603 tui: align session panel content with consistent left padding 2025-11-25 03:08:12 +00:00
opencode 03ba21c587 release: v1.0.110
Update Nix Hashes / update (push) Waiting to run
2025-11-25 03:08:12 +00:00
Dax Raad 0e5d2c31f9 tui: use standard middle dot separator for better terminal compatibility 2025-11-24 22:00:44 -05:00
Adam 73f5096d66 fix(tui): spacing 2025-11-24 20:44:30 -06:00
Dax Raad cca71babf4 tui: prevent re-fetching already synced sessions when switching sessions 2025-11-24 21:43:11 -05:00
Adam 3ecfaf6b8a fix(desktop): content animations 2025-11-24 20:35:51 -06:00
Adam 61f6f6726e fix(desktop): message summaries 2025-11-24 19:56:12 -06:00
Github Action ab30b52f0a Update Nix flake.lock and hashes 2025-11-25 00:03:08 +00:00
Sebastian Herrlinger 2e23e22214 bump opentui to v0.1.50
- fix another segfault
- fix weird tmux window/pane title
- fix selection in textarea (use shift+arrow keys)
2025-11-25 01:00:48 +01:00
Adam 6cf917d2b3 fix(share): responsiveness 2025-11-24 17:59:37 -06:00
GitHub Action d2662517dd chore: format code 2025-11-24 23:06:21 +00:00
Andrew Joslin e952f2e6b4 Support basic auth in opencode sdk (#4697) 2025-11-24 17:05:35 -06:00
opencode 42f497f59a release: v1.0.109
Update Nix Hashes / update (push) Waiting to run
2025-11-24 22:30:42 +00:00
Aiden Cline dfddac1895 remove hardcoded openrouter provider 2025-11-24 16:11:12 -06:00
Frank 56773e6faf zen: byok for gemini 2025-11-24 17:09:54 -05:00
Adam Hosker de3308b2a0 Add --refresh flag to models command (#4707) 2025-11-24 16:06:51 -06:00
Adam ece43ba172 fix(desktop): layout 2025-11-24 15:57:48 -06:00
Frank 4d3cf509c3 zen: display reasoning tokens 2025-11-24 16:54:54 -05:00
Frank bd051f3f1b wip: zen 2025-11-24 16:54:54 -05:00
Aiden Cline 51a8355378 adjust bundled provider logic, fix tree shaking stuff (#4708) 2025-11-24 15:48:54 -06:00
Adam a563234be5 fix(console): remove extra favicon 2025-11-24 15:48:11 -06:00
GitHub Action 38d8ce4120 chore: format code 2025-11-24 21:17:40 +00:00
Adam cdfc18f655 fix(console): favicon issues 2025-11-24 15:10:40 -06:00
Adam 9bc200a6eb wip(share): enterprise favicon 2025-11-24 15:10:40 -06:00
Adam 950bb0b660 wip(share): more styling 2025-11-24 15:10:40 -06:00
Adam 8faaea9c01 wip(share): more styling 2025-11-24 15:10:40 -06:00
Adam 59c30ed511 wip(share): more styling 2025-11-24 15:10:39 -06:00
Frank 4b42810c26 zen: add opus 4.5 2025-11-24 15:39:38 -05:00
Aiden Cline 867318e9c8 add autoupdate: notify 2025-11-24 14:32:38 -06:00
Aiden Cline 973e463c42 ci: nix hash 2025-11-24 14:26:55 -06:00
Frank 0a885f59f8 wip: zen 2025-11-24 15:24:44 -05:00
GitHub Action 1d5948c2af chore: format code 2025-11-24 19:53:00 +00:00
Sebastian Herrlinger b964c94e36 textarea highlight cursor color 2025-11-24 20:51:07 +01:00
opencode c9a24055c8 release: v1.0.108
Update Nix Hashes / update (push) Waiting to run
2025-11-24 19:16:14 +00:00
GitHub Action 6b59f15634 chore: format code 2025-11-24 18:40:01 +00:00
Sebastian Herrlinger c35322f0b6 non-corpo loading spinner 2025-11-24 19:39:09 +01:00
Frankie Seabrook f62fa971e2 docs: add Ollama Cloud provider setup to providers.mdx (#4693) 2025-11-24 10:51:16 -06:00
GitHub Action 190e8ccc47 ignore: update download stats 2025-11-24 2025-11-24 12:04:34 +00:00
Carli Samuele 9b20bf871d TUI: fix: add null check for user.time in duration calculation (#4679) 2025-11-24 02:06:09 -06:00
Ariane Emory d88672c43e tweak: display MCPs in alphabetic order in the sidebar. (#4680)
Co-authored-by: Github Action <action@github.com>
2025-11-24 02:02:04 -06:00
GitHub Action e0e03c4e0e chore: format code 2025-11-24 07:51:59 +00:00
Aiden Cline cad68b1e70 fix: persist light vs dark mode 2025-11-24 01:51:13 -06:00
Aiden Cline c4e7024cce tweak: modified files sidebar 2025-11-24 01:51:13 -06:00
opencode 95ab830328 release: v1.0.107
Update Nix Hashes / update (push) Waiting to run
2025-11-24 07:06:41 +00:00
Aiden Cline 37fa3dd61b bump copilot plugin, give better error message for copilot (#4678) 2025-11-24 00:40:15 -06:00
Aiden Cline 5d7728617e fix: fatal: undefined is not an object (evaluating 'color.buffer') 2025-11-23 23:56:15 -06:00
GitHub Action d81c286e0b chore: format code 2025-11-24 04:55:13 +00:00
Albert O'Shea 2a3acd0214 nix: bundle js dist with bun and patch tree-sitter wasm paths (#4644)
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
Co-authored-by: Github Action <action@github.com>
2025-11-23 22:54:29 -06:00
Huang Qi 3a7142883a fix: add explicit fallback model and prevent direct opencode provider calls (#4653)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-11-23 22:51:15 -06:00
GitHub Action ce4a25875d chore: format code 2025-11-23 20:59:37 +00:00
Frank 094d5a64d6 wip: zen 2025-11-23 15:58:55 -05:00
Frank 96ca5fb20d wip: zen 2025-11-23 15:21:47 -05:00
Aiden Cline c123eab6aa tweak: slight improvements to title gen 2025-11-23 14:04:39 -06:00
Dax Raad 633a5b6547 ci: remove log 2025-11-23 15:00:29 -05:00
Dax Raad 92bb949ad3 ci: ignore 2025-11-23 14:56:24 -05:00
Dax Raad 9110b2b220 ci: ignore 2025-11-23 14:56:24 -05:00
Dax Raad 15f0c8b7cc ci: ignore 2025-11-23 14:44:05 -05:00
GitHub Action 344758c2c0 chore: format code 2025-11-23 19:37:19 +00:00
Dax Raad 9b7f982fb9 ci: secret 2025-11-23 14:36:36 -05:00
Dax Raad b498c74dab token 2025-11-23 19:35:39 +00:00
Dax Raad e6b946a2a7 ci: ignore 2025-11-23 19:35:39 +00:00
Github Action d5484753f1 Update Nix flake.lock and hashes 2025-11-23 19:35:39 +00:00
opencode 017d61509c release: v1.0.106
Update Nix Hashes / update (push) Waiting to run
2025-11-23 19:35:38 +00:00
Dax Raad 75ae9b2de2 ci: ignore 2025-11-23 14:28:10 -05:00
Aiden Cline b92584490f fix bash tool wsl 2025-11-23 12:29:15 -06:00
Github Action dde6d80095 Update Nix flake.lock and hashes 2025-11-23 17:57:34 +00:00
Dax Raad b4e9c1b472 ci: stuff 2025-11-23 12:55:33 -05:00
Github Action 6a9b8376b0 Update Nix flake.lock and hashes 2025-11-23 17:45:24 +00:00
Dax Raad 53e86f57ba ci: stuff 2025-11-23 12:43:23 -05:00
Dax Raad bb42918919 sync 2025-11-23 12:43:23 -05:00
Aiden Cline 09a9970d81 tweak: fix bool 2025-11-23 11:43:09 -06:00
Github Action 7a8263218e Update Nix flake.lock and hashes 2025-11-23 17:09:33 +00:00
Dax Raad 98450f7ff0 ignore: update @solidjs/start dependency and fix console redirect handling
Updates the @solidjs/start dependency to latest version and removes deprecated getResponseHeaders usage from auth callback. Also adds error handling for workspace ID lookup to prevent redirect failures.
2025-11-23 12:07:28 -05:00
GitHub Action af968a403c ignore: update download stats 2025-11-23 2025-11-23 12:04:01 +00:00
Ariane Emory 3942dd7769 feature: optional selectedListItemText element in themes and luminance-based fallback to solve 4369 (#4572)
Co-authored-by: knanao <nao.7ken@gmail.com>
Co-authored-by: knanao <k@knanao.com>
2025-11-23 01:51:07 -06:00
Aiden Cline c1782c7573 ci: fix action 2025-11-23 01:36:45 -06:00
Tyler Limbach 41efa8ad2f fix: make tui session text respect theme fg (#4618) (#4620) 2025-11-23 01:34:31 -06:00
Github Action 629db84238 Update Nix flake.lock and hashes 2025-11-23 07:31:17 +00:00
Aiden Cline d17702abd5 tweak: start bundling in some ai-sdk packages (#4649) 2025-11-23 01:29:20 -06:00
terakael 467902d220 fix: prevent permission shortcuts when ctrl/meta pressed (#4631)
Co-authored-by: terakael <terakael@gmail.com>
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-11-22 23:58:10 -06:00
Dax Raad 5a538615ed fix suspense 2025-11-23 00:16:06 -05:00
Dax Raad dd708f707b fix logout 2025-11-23 00:12:58 -05:00
Dax Raad 96bffda649 fix logout 2025-11-22 23:59:50 -05:00
Dax Raad 2086524d5f fixed 2025-11-22 23:56:37 -05:00
GitHub Action e572045f87 chore: format code 2025-11-23 04:54:26 +00:00
Dax Raad 8af5ebb881 fix auth 2025-11-22 23:53:41 -05:00
Github Action f7627fe5bf Update Nix flake.lock and hashes 2025-11-23 00:44:43 +00:00
Sebastian Herrlinger af16210542 bump opentui to v0.1.49
- fix stdin handling for suspend/resume
- fix textarea cursor movement segfault for wcdwidth (alacritty/tmux)
2025-11-23 01:42:33 +01:00
GitHub Action b5d98fc018 chore: format code 2025-11-23 00:20:07 +00:00
Adam 86eb2a571b wip(share): more styling 2025-11-22 18:19:02 -06:00
opencode 8f2fceeec8 release: v1.0.105
Update Nix Hashes / update (push) Waiting to run
2025-11-22 22:39:18 +00:00
Dax Raad 06a554b484 core: prevent concurrent bun package installs that could cause corruption or conflicts 2025-11-22 17:32:53 -05:00
Dax Raad fce36d4744 tui: fix message completion timing and duration display in session view 2025-11-22 17:28:50 -05:00
GitHub Action 7e3adc8a63 chore: format code 2025-11-22 22:27:23 +00:00
Ravi Kumar 2417e7ea87 fix: auto upgrade toast message (#4625)
Co-authored-by: Dax Raad <d@ironbay.co>
Co-authored-by: opencode <opencode@sst.dev>
2025-11-22 16:26:46 -06:00
opencode de31b6cb59 release: v1.0.104
Update Nix Hashes / update (push) Waiting to run
2025-11-22 20:03:20 +00:00
Dax Raad 7532255530 reset cache 2025-11-22 14:56:35 -05:00
Dax Raad 5eaae8e109 load desktop app 2025-11-22 14:40:11 -05:00
Dax Raad 5b8fe7cbd3 docs: add Docker installation option for OpenCode 2025-11-22 14:13:04 -05:00
Goni Zahavy e7dc4e2365 tui: added ctrl-z terminal suspension support (#3983) 2025-11-22 12:48:23 -06:00
shuv 44857fced6 proper fix for image attachments (#4562)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-11-22 12:47:57 -06:00
opencode 9b346ac822 release: v1.0.103
Update Nix Hashes / update (push) Waiting to run
2025-11-22 18:21:49 +00:00
Dax Raad 630b993434 tui: remove bullet prefix from timestamps in session view for cleaner display 2025-11-22 13:11:08 -05:00
GitHub Action 80a01a9baa chore: format code 2025-11-22 18:04:34 +00:00
Dax Raad 5e45e84942 more flickering fixes 2025-11-22 13:03:44 -05:00
Dax Raad a15abe7d46 tui: keep assistant footer from crashing after compaction 2025-11-22 18:00:54 +00:00
opencode eecd7af127 release: v1.0.100
Update Nix Hashes / update (push) Waiting to run
2025-11-22 18:00:54 +00:00
Dax Raad 962a266ac1 improve model footer 2025-11-22 12:54:02 -05:00
GitHub Action c2731114cf chore: format code 2025-11-22 17:50:32 +00:00
Valerio Di Maggio 7a47275827 Showed end time for agent loop and changed message time to show date if not current day (#4503)
Co-authored-by: GitHub Action <action@github.com>
2025-11-22 11:49:50 -06:00
Dax Raad 8126ed6c26 sync 2025-11-22 16:43:47 +00:00
opencode 9ae62154be release: v1.0.99
Update Nix Hashes / update (push) Waiting to run
2025-11-22 16:43:46 +00:00
Dax Raad 7747652bf6 summary optimizaitons 2025-11-22 11:32:49 -05:00
Dax Raad 625a4d3889 ci: add Node.js setup to deploy workflow for consistent runtime environment 2025-11-22 10:47:18 -05:00
Dax Raad 3caf91e78b fix missing vite 2025-11-22 10:45:06 -05:00
Dax Raad 6d758c971f upgrade bun lock version 2025-11-22 10:42:09 -05:00
Github Action b8c53a3cd1 Update Nix flake.lock and hashes 2025-11-22 15:41:29 +00:00
Brendan Allan 3b4815356d Use devinxi-ed Solid Start (#4635)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Dax Raad <d@ironbay.co>
2025-11-22 10:39:25 -05:00
GitHub Action 5080097cbb ignore: update download stats 2025-11-22 2025-11-22 12:04:02 +00:00
opencode 56e12a2b56 release: v1.0.98
Update Nix Hashes / update (push) Waiting to run
2025-11-22 06:00:23 +00:00
Dax Raad 42628ad9a4 fix flickering/layout shift during work 2025-11-22 00:49:35 -05:00
GitHub Action 4be2d4521b chore: format code 2025-11-22 05:15:55 +00:00
Dax Raad 334ab2cbc7 tauri 2025-11-22 00:15:01 -05:00
opencode afa639ef16 release: v1.0.97
Update Nix Hashes / update (push) Waiting to run
2025-11-22 05:02:16 +00:00
Dax Raad 6df2b1b977 core: add missing system libraries to docker image so the agent starts successfully 2025-11-21 23:52:01 -05:00
GitHub Action af4a082da9 chore: format code 2025-11-22 04:48:52 +00:00
Dax Raad 7a4ff6e07f fix dockerfile 2025-11-21 23:48:09 -05:00
opencode 762d59821a release: v1.0.95
Update Nix Hashes / update (push) Waiting to run
2025-11-22 04:27:20 +00:00
Dax Raad 1b29c0d658 ci: ignore 2025-11-21 23:08:35 -05:00
Dax Raad afb95eb8b8 release: v1.0.94
Update Nix Hashes / update (push) Waiting to run
2025-11-21 23:06:37 -05:00
Dax Raad abd090ecd1 sync 2025-11-21 22:58:20 -05:00
Dax Raad 0c3bd73a65 ci stuff 2025-11-21 22:53:58 -05:00
GitHub Action 2f418700b2 chore: format code 2025-11-22 03:31:29 +00:00
opencode 8da48c147f release: v1.0.92
Update Nix Hashes / update (push) Waiting to run
2025-11-22 03:31:28 +00:00
Dax Raad c0602a793e publish tar.gz for linux 2025-11-21 22:24:36 -05:00
opencode 070e85f5a1 release: v1.0.91
Update Nix Hashes / update (push) Waiting to run
2025-11-22 02:19:56 +00:00
Dax Raad b9518c654e fix arg parsing 2025-11-21 21:13:43 -05:00
Github Action 5bb245bcd2 Update Nix flake.lock and hashes 2025-11-22 01:43:03 +00:00
Dax aed647068f enterprise (#4617)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com>
2025-11-21 20:41:27 -05:00
opencode d3ea2fbaee release: v1.0.90
Update Nix Hashes / update (push) Waiting to run
2025-11-22 00:16:10 +00:00
GitHub Action 0a1be5a184 chore: format code 2025-11-22 00:09:32 +00:00
Dax Raad edb2002294 ci: disable automatic config loading during CLI builds to prevent configuration interference 2025-11-21 19:08:51 -05:00
opencode 8dafbfc530 release: v1.0.89
Update Nix Hashes / update (push) Waiting to run
2025-11-22 00:00:23 +00:00
Tommy D. Rossi d58fc8fd63 feat: lower opacity for thinking summaries (#4610) 2025-11-21 17:35:47 -06:00
Dax Raad ee64c0ad2b tui: split revert memo into smaller tracked computations to prevent unnecessary re-evaluations 2025-11-21 18:27:25 -05:00
GitHub Action 86217f0cae chore: format code 2025-11-21 22:42:39 +00:00
Dax Raad c37a28464b tui: batch SDK events to reduce render churn and improve responsiveness
Intelligently queue events and flush them in 16ms batches. Events processed within 16ms of the last flush are batched together to reduce the number of store updates and re-renders, preventing jank when receiving rapid consecutive events. Events after a 16ms gap are processed immediately to avoid adding latency.
2025-11-21 17:42:02 -05:00
opencode 4a9d44a7c5 release: v1.0.88
Update Nix Hashes / update (push) Waiting to run
2025-11-21 22:37:46 +00:00
GitHub Action 7a1fca2d23 chore: format code 2025-11-21 22:30:46 +00:00
Aiden Cline db7561eef0 tweak: bash tool behavior w/ /bin/zsh 2025-11-21 16:30:00 -06:00
opencode 81cc7df098 release: v1.0.87
Update Nix Hashes / update (push) Waiting to run
2025-11-21 21:58:10 +00:00
Dax Raad 965f687a81 if finish reason is unknown, continue 2025-11-21 16:51:32 -05:00
Frank d7f491afa0 doc: update gpt pricing 2025-11-21 15:48:54 -05:00
GitHub Action 8f70ff21ac chore: format code 2025-11-21 20:33:42 +00:00
Ivan Starkov 5fb8afcb67 fix: make bash tool respect $SHELL (#3494)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-11-21 14:33:04 -06:00
opencode 7b8665837a release: v1.0.86
Update Nix Hashes / update (push) Waiting to run
2025-11-21 20:32:47 +00:00
Aiden Cline 363a324ee0 bump bun to 1.3.3 2025-11-21 13:56:46 -06:00
Frank f0de3764c0 update logic for local and dev providers 2025-11-21 13:31:33 -05:00
GitHub Action 87d18bca1e chore: format code 2025-11-21 17:57:33 +00:00
Frank 764a813d94 wip: zen 2025-11-21 12:50:51 -05:00
Adam 3ad1e1904d feat(install): better install script visuals, custom progress bar and next steps (#4589) 2025-11-21 07:29:52 -06:00
GitHub Action 3b4b5512e3 ignore: update download stats 2025-11-21 2025-11-21 12:04:49 +00:00
Patrick Wolf cef68219f3 fix: preserve agent context during compaction (#4556) 2025-11-21 02:13:10 -06:00
Ian Maurer c19dc1ec61 fix(cli): ensure clean exit on provider/model errors (#4223)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-11-21 02:01:19 -06:00
Aiden Cline ff7b61c828 ignore: update sdk 2025-11-21 01:25:06 -06:00
Aiden Cline 5ce61f68cd add provider whitelist 2025-11-21 01:24:44 -06:00
Aiden Cline cd82f8a957 ignore: sync sdk 2025-11-21 01:04:02 -06:00
geril07 e70c7b257a feat: whitelist/blacklist config options for provider (#3416)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-11-21 01:01:30 -06:00
GitHub Action 2420ce5182 chore: format code 2025-11-21 06:03:38 +00:00
opencode facd436aca release: v1.0.85
Update Nix Hashes / update (push) Waiting to run
2025-11-21 06:03:38 +00:00
Dax Raad 1fa2d3e032 hide gpt5 nano 2025-11-21 00:58:02 -05:00
opencode 996cfd8da8 release: v1.0.84
Update Nix Hashes / update (push) Waiting to run
2025-11-21 05:55:03 +00:00
Dax Raad cbe5707ae3 tui: replace text shimmer with animated progress bar during model processing 2025-11-21 00:47:27 -05:00
Dax Raad 7901aa0e54 tui: simplify popular providers list to show only top 6 instead of applying provider priority sorting 2025-11-21 00:32:21 -05:00
Dax e9141bf5cd Tui onboarding (#4569)
Co-authored-by: GitHub Action <action@github.com>
2025-11-21 00:21:06 -05:00
Zak 849a7bc69c tweak: adjust invalid directory error message (#4567)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-11-20 22:36:07 -06:00
Aiden Cline a542f64924 fix: split not a function error 2025-11-20 22:33:59 -06:00
Spoon 8bf1143932 feat: add field to allow user only messages (#4554)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-11-20 19:13:42 -06:00
GitHub Action 640b5a0f7a chore: format code 2025-11-21 00:49:39 +00:00
opencode 5d2d032c7b release: v1.0.83
Update Nix Hashes / update (push) Waiting to run
2025-11-21 00:49:39 +00:00
Aiden Cline c52cbc0c1a fix: undefined err 2025-11-20 18:43:58 -06:00
opencode 76f002f74e release: v1.0.82
Update Nix Hashes / update (push) Waiting to run
2025-11-20 22:44:37 +00:00
Aiden Cline f0059242c8 fix: make use openrouter ai sdk package to fix interlevened thinking models 2025-11-20 16:32:44 -06:00
Jay 7f81dc4a74 docs: Clarify model provider recommendations in README
Updated the README to clarify model provider recommendations.
2025-11-20 17:21:19 -05:00
Aiden Cline a762aead7f tweak: navigate to child session if it is asking for permissions 2025-11-20 15:46:49 -06:00
Aiden Cline 1331c5a4ab Revert "Image tag fix for real this time (#4540)"
This reverts commit 97d62fc17d.
2025-11-20 14:14:02 -06:00
Aiden Cline 9c171c15ed Revert "ignore: write todo"
This reverts commit 9728bec100.
2025-11-20 14:13:56 -06:00
Aiden Cline 0b6d7b3613 ignore: fix mdx 2025-11-20 14:07:25 -06:00
Aiden Cline 859abc7b80 change default child session cycle keybind to <leader>right, and <leader>left 2025-11-20 14:01:02 -06:00
jian fd4fc8e4ae chore: rm empty file (#4552) 2025-11-20 13:33:09 -06:00
GitHub Action e99a5bde97 chore: format code 2025-11-20 19:17:06 +00:00
Aiden Cline c4abf78116 docs: update model list 2025-11-20 13:16:27 -06:00
Aiden Cline 9728bec100 ignore: write todo 2025-11-20 12:35:34 -06:00
shuv 97d62fc17d Image tag fix for real this time (#4540)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-11-20 12:34:39 -06:00
GitHub Action de10556ae9 chore: format code 2025-11-20 17:35:43 +00:00
William Tan 2b5a652a8c tweak: Prefer VISUAL environment variable over EDITOR per Unix convention (#4549)
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-11-20 11:27:16 -06:00
opencode 18a9120d5b release: v1.0.81
Update Nix Hashes / update (push) Waiting to run
2025-11-20 17:16:31 +00:00
Aiden Cline aaf0aa9b32 fix: aur build 2025-11-20 11:04:09 -06:00
cc-bjojac 5920c3a90e Make the MAX_OUTPUT_LENGTH in bash.ts overridable by OPENCODE_EXPERIMENTAL_BASH_MAX_OUTPUT_LENGTH (#4497)
Co-authored-by: Björn Jacobs <bjoern.jacobs.ext@bundesanzeiger.de>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-11-20 10:45:13 -06:00
Haris Gušić 6077a87563 fix: Autocomplete with existing space after trigger (#4121)
Co-authored-by: GitHub Action <action@github.com>
2025-11-20 10:37:45 -06:00
Aiden Cline 6b5ccd4a9d fix: lockfile 2025-11-20 10:16:34 -06:00
processtrader 3613d77eac fix: replace ruby-lsp with rubocop for better LSP performance (#4543) 2025-11-20 09:54:47 -06:00
Frank 7dbb50094a wip: zen 2025-11-20 10:31:35 -05:00
GitHub Action a4247d089a chore: format code 2025-11-20 14:55:06 +00:00
Frank 605b7631ac zen: show token breakdown 2025-11-20 09:54:22 -05:00
Albert O'Shea 9582405e0e nix: update flake.lock as part of the github workflow (#4535)
Co-authored-by: Github Action <action@github.com>
2025-11-20 08:43:13 -06:00
Tommy D. Rossi a492d422bd fix: do not print ai sdk warnings (#4541)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-20 08:42:24 -06:00
Roberto Gongora ab2a5fcc31 docs: typo in PHP Intelephense documentation (#4545) 2025-11-20 08:41:31 -06:00
Asmae_ELAZRAK dfc59fdc2f docs: add cortecs docs (#4547) 2025-11-20 08:34:04 -06:00
GitHub Action 43887e0fc9 ignore: update download stats 2025-11-20 2025-11-20 12:04:55 +00:00
Aiden Cline dfbf310bbd chore: rm unused code 2025-11-20 00:10:51 -06:00
Aiden Cline edd4c63993 tweak: let user name export file 2025-11-19 23:58:40 -06:00
Aiden Cline 19d7a9ec8c fix: make toast wrap 2025-11-19 22:50:27 -06:00
Aiden Cline db2353a33b tweak: make /export go to cwd 2025-11-19 22:45:40 -06:00
Frank ec113ad089 zen: add gemini icon 2025-11-19 21:14:31 -05:00
Frank 2424871ac7 zen: update gemini provider name 2025-11-19 20:58:22 -05:00
Frank 01a3808971 docs: add gemini 3 pricing 2025-11-19 20:50:43 -05:00
GitHub Action b09b19078d chore: format code 2025-11-20 01:27:50 +00:00
opencode 3a24bdd2e5 release: v1.0.80
Update Nix Hashes / update (push) Waiting to run
2025-11-20 01:27:49 +00:00
Dax Raad 7d2f35f420 refactor: switch to Switch/Match pattern for assistant message status rendering 2025-11-19 20:18:15 -05:00
opencode c55a7d0b2c release: v1.0.79
Update Nix Hashes / update (push) Waiting to run
2025-11-20 01:11:20 +00:00
althafdemiandra 00e401e615 chore: bump ai-sdk to v5.0.97 (#4518)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-11-19 18:44:33 -06:00
Aiden Cline 2ffdfca724 make aur build check if u are glibc system or a musl system (#4519) 2025-11-19 18:36:33 -06:00
Github Action e5d52ee35e Update Nix hashes 2025-11-19 23:30:37 +00:00
Sebastian Herrlinger 226a9d56b2 bump opentui version to v0.1.47
- fixing cursor issues with some graphemes in textarea
- proper suspend/resume
2025-11-20 00:28:25 +01:00
Aiden Cline 337ac615ed tweak: default to disabling fetch timeout in provider options 2025-11-19 16:20:29 -06:00
Daniel Polito c6c9eb6daa Adding LSP: PHP Intelephense (#4504)
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-11-19 16:01:18 -06:00
Aiden Cline 358593ddaa ignore: todo fix test case 2025-11-19 15:18:21 -06:00
Iljo 217fd04d36 Add YAML language server support (#4508)
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-11-19 14:47:04 -06:00
Aiden Cline 491c26bae3 ignore: flaky test be a lil less flaky plz 2025-11-19 14:46:06 -06:00
Aiden Cline 692984a2a4 ignore: fix hanging test 2025-11-19 14:38:12 -06:00
Aiden Cline a1d91a3f2f tweak: make getUsage function handle missing usage data 2025-11-19 14:29:19 -06:00
Aiden Cline d2c4bc5b50 fix: openrouter ai sdk package support 2025-11-19 14:22:51 -06:00
Aiden Cline 8a42de8e5e tweak: add bun install retries 2025-11-19 13:04:20 -06:00
Aiden Cline 500b5d85b4 fix: make external_directory permission wildcarding more sane 2025-11-19 12:55:02 -06:00
Adam 3577c7c382 Revert "feat(cli): better install script output"
This reverts commit 23c18e8b86.
2025-11-19 12:44:35 -06:00
Aiden Cline 010146569f fix: make bash tool use external_directory perm 2025-11-19 12:31:34 -06:00
Dax Raad 7642ca7066 use bash description as task title 2025-11-19 13:23:29 -05:00
Dax 352ffac8bd fix: resolve issue 4475 (#4505) 2025-11-19 13:10:09 -05:00
Aiden Cline 1be2d83976 tweak: bash description 2025-11-19 11:31:12 -06:00
Tommy D. Rossi ad2963bb30 fix: show reasoning summaries for gemini models (#4491)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-19 11:25:18 -06:00
Aiden Cline 319a740ef1 Revert "Added subagents to agents modal, non-selectable (#4460)"
This reverts commit 84bd53a679.
2025-11-19 11:00:38 -06:00
Aiden Cline 891ade0efb ci: auto label nix 2025-11-19 10:51:11 -06:00
Adam 60231e3e1a fix(web): stats 2025-11-19 10:05:39 -06:00
Adam 23c18e8b86 feat(cli): better install script output 2025-11-19 09:30:41 -06:00
Adam f3c96d48cf fix(desktop): message animation 2025-11-19 06:04:20 -06:00
Adam 0a9f5140a8 fix(desktop): text part styling 2025-11-19 06:04:20 -06:00
Adam d31f8396da fix(desktop): pre styling 2025-11-19 06:04:19 -06:00
Aiden Cline bb3a069b1d tweak: toast 2025-11-19 00:51:07 -06:00
opencode-agent[bot] 84bd53a679 Added subagents to agents modal, non-selectable (#4460)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-11-19 00:40:47 -06:00
Shantur Rathore c021a04a7e allow task tool to have resume capabilities (#4204)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
2025-11-19 00:17:26 -06:00
Frank ffda5aa076 zen: fix cost in graph 2025-11-18 23:43:26 -05:00
GitHub Action f7942ad6b4 chore: format code 2025-11-19 01:02:57 +00:00
Dax Raad d821067be4 feat: add @opencode-ai/util package with utility functions 2025-11-18 20:02:10 -05:00
GitHub Action 4b0a238c88 chore: format code 2025-11-18 23:49:29 +00:00
Aiden Cline eeaecdf65c feat: add top level lsp: false and formatter: false to allow disabling all formatters or lsps at once 2025-11-18 17:48:40 -06:00
opencode b3708b4293 release: v1.0.78
Update Nix Hashes / update (push) Waiting to run
2025-11-18 23:36:35 +00:00
shuv e0741c1425 fix: pass model info to ReadTool to enable image support check (#4473)
Co-authored-by: GitHub Action <action@github.com>
2025-11-18 17:20:03 -06:00
K Whiteside fa10bad600 fix: permission checks for external_directory and doom_loop (#4433)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
Co-authored-by: AerionDyseti <AerionDyseti@users.noreply.github.com>
2025-11-18 17:18:23 -06:00
Frank 5405749389 wip: zen 2025-11-18 17:42:48 -05:00
GitHub Action a953494e10 chore: format code 2025-11-18 22:24:29 +00:00
Eric Juden 3dd72efcda docs: Improving Plugin Documentation - Adding Events (#4438) 2025-11-18 16:23:46 -06:00
opencode 928595cfd4 release: v1.0.77
Update Nix Hashes / update (push) Waiting to run
2025-11-18 22:17:39 +00:00
Dax Raad 61d961e713 better gemini retry errors 2025-11-18 17:11:29 -05:00
OpeOginni 59cebb31b2 fix: allow for theme references (#4450) 2025-11-18 14:26:42 -06:00
Adam 9ba47e8192 fix(desktop): animating too much 2025-11-18 14:24:26 -06:00
GitHub Action c514effc7d chore: format code 2025-11-18 20:23:29 +00:00
Longlone 0ded744067 fix: update reasoningEffort logic for gpt-5.1 models in SessionPrompt-ensureTitle (#4456)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-11-18 14:22:44 -06:00
opencode 8188114773 release: v1.0.76
Update Nix Hashes / update (push) Waiting to run
2025-11-18 20:12:38 +00:00
Aiden Cline 5ac956b845 fix windows bash tool issue 2025-11-18 14:06:45 -06:00
Adam 9a3ecc8346 chore(desktop): remove logging 2025-11-18 13:52:29 -06:00
Adam 529adb82b0 fix(desktop): reactivity issue on route change 2025-11-18 13:45:27 -06:00
Frank b07d2682db zen: gemini 2025-11-18 14:28:31 -05:00
opencode-agent[bot] 98fcde4e65 Added opencode agent list command to show all available agents with details. (#4446)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-11-18 13:25:53 -06:00
GitHub Action ac2d0858ba chore: format code 2025-11-18 18:35:26 +00:00
Adam 6aea0c0c20 fix(desktop): only animate response once 2025-11-18 12:34:34 -06:00
opencode 2639250e54 release: v1.0.75
Update Nix Hashes / update (push) Waiting to run
2025-11-18 18:16:14 +00:00
Dax Raad b0cdcb234b fix gpt compaction issue 2025-11-18 13:10:00 -05:00
Aiden Cline 15ca13204b tweak: use temperature 1 for gemini 3 pro 2025-11-18 11:49:39 -06:00
Adam a22ef48225 fix(desktop): css typo 2025-11-18 11:40:50 -06:00
Adam 068cab2cf2 fix(desktop): busy state and reactivity 2025-11-18 11:35:23 -06:00
GitHub Action 2273b11416 chore: format code 2025-11-18 17:16:07 +00:00
opencode 9209fc2f0e release: v1.0.74
Update Nix Hashes / update (push) Waiting to run
2025-11-18 17:16:06 +00:00
Dax Raad 9673e10d91 fix model dialog sorting 2025-11-18 12:10:19 -05:00
Adam 42d1dd0ff6 wip(desktop): new layout work 2025-11-18 17:07:34 +00:00
Adam 483a96a557 wip(desktop): new layout work 2025-11-18 17:07:34 +00:00
opencode 25fe218dc3 release: v1.0.73
Update Nix Hashes / update (push) Waiting to run
2025-11-18 17:07:33 +00:00
Dax Raad 6330f0a468 rework default model 2025-11-18 12:01:41 -05:00
GitHub Action 48327a63d3 ignore: update download stats 2025-11-18 2025-11-18 12:04:35 +00:00
Aiden Cline 8a335951dd ci: ignore update nix hash job 2025-11-18 01:26:30 -06:00
Aiden Cline fb32ffcd37 ignore: fix snapshot (#4444)
Co-authored-by: opencode <opencode@sst.dev>
2025-11-18 01:22:38 -06:00
Aiden Cline 70fb779852 fix: snapshot? 2025-11-18 01:02:52 -06:00
Aiden Cline c3486de362 ci: ignore 2025-11-18 00:53:08 -06:00
Aiden Cline 1aaf354ebf ignore: format 2025-11-18 00:49:17 -06:00
Albert O'Shea 56f211ffd9 feat: nix support for the nix folks (#3924)
Co-authored-by: opencode <opencode@sst.dev>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
2025-11-18 00:46:49 -06:00
Frank 4536fcbd1f wip: zen 2025-11-18 01:27:31 -05:00
opencode-agent[bot] f10ee34a19 Added width constraints to toast component for proper text wrapping. (#4441)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-11-18 00:23:36 -06:00
GitHub Action 4d105817d6 chore: format code 2025-11-18 05:46:02 +00:00
Frank c598cc56a3 zen: add usage graph 2025-11-18 00:45:14 -05:00
Jake Nelson bf22f3672d feat: add Swift syntax highlighting support (#4434) 2025-11-17 21:53:03 -06:00
GitHub Action 30222114d4 chore: format code 2025-11-18 03:19:47 +00:00
Aiden Cline b7929e26bd Revert "Updated scroll_speed to allow any positive number" (#4437) 2025-11-17 21:19:06 -06:00
opencode-agent[bot] 2c3ccb5495 Updated scroll_speed to allow any positive number (#4436)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
Co-authored-by: GitHub Action <action@github.com>
2025-11-17 21:18:33 -06:00
opencode dbbd6a81c9 release: v1.0.72 2025-11-18 03:03:54 +00:00
GitHub Action a4b7b94bd5 chore: format code 2025-11-18 02:53:13 +00:00
Aiden Cline 704a638f0b fix: noreply 2025-11-17 20:52:25 -06:00
opencode a68e9d85a6 release: v1.0.71 2025-11-18 01:59:40 +00:00
Dax Raad d3de88af1d respect server suggestion for default model 2025-11-17 20:53:48 -05:00
GitHub Action f0ef294fa6 chore: format code 2025-11-18 01:27:22 +00:00
Jay V e15461d69e docs: clarify custom tools can execute scripts in any language with Python example 2025-11-17 20:26:27 -05:00
opencode 948adcb435 release: v1.0.70 2025-11-17 23:45:49 +00:00
Sebastian Herrlinger 8e78afbdfc upgrade opentui to v0.1.46
- enable bracketed paste (and more) on win
- fix word wrapping with CJK and at wrap/chunk boundaries
- old style meta+arrow
- allow <1 scroll speed for slowdown
2025-11-18 00:22:21 +01:00
Daniel Hofheinz 3c11d85ab3 docs: add built-in agents reference to README (#3047)
Co-authored-by: Jay V <air@live.ca>
2025-11-17 17:19:14 -05:00
Aiden Cline ca93938a78 fix /exit 2025-11-17 16:13:41 -06:00
Aiden Cline aa8912f36c Revert "fix: system theme background to use 'none' for terminal transparency (#4408)"
This reverts commit de7090ecf4.
2025-11-17 16:03:27 -06:00
GitHub Action 0b51bcdb20 chore: format code 2025-11-17 21:46:10 +00:00
Aiden Cline d2be02faf2 ci: tweak 2025-11-17 15:45:23 -06:00
Aiden Cline 3dba9cbe0e docs: tweak wording 2025-11-17 21:26:46 +00:00
opencode a6d1ecd2ac release: v1.0.69 2025-11-17 21:26:46 +00:00
opencode-agent[bot] d45210c1ec Added /thinking slash command to toggle thinking blocks visibility in OpenTUI. (#4424)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-11-17 15:16:35 -06:00
Haris Gušić 19626fcfe6 docs(contributing): Add "Setting up a Debugger" section (#4421)
Co-authored-by: GitHub Action <action@github.com>
2025-11-17 14:28:06 -06:00
Haris Gušić c7eaee452e chore: Remove obsolete 'any' type annotation (#4423) 2025-11-17 14:27:43 -06:00
Aiden Cline f2998324ac tweak: whitelist 2025-11-17 13:18:13 -06:00
Dax Raad 51b9fbbab7 deprecated session.idle event 2025-11-17 11:42:45 -05:00
Aiden Cline 35825c2835 Reapply "fix: system theme background to use 'none' for terminal transparency" (#4415)
This reverts commit 368a75c983.
2025-11-17 10:39:53 -06:00
Dax Raad 84b2d45ecd core: honor retry-after values exceeding 10 minutes instead of discarding them 2025-11-17 11:33:28 -05:00
Dax Raad da559dac9e ignore 2025-11-17 11:32:07 -05:00
Dax Raad a601bc1c40 better retry display 2025-11-17 11:31:10 -05:00
Aiden Cline 368a75c983 Revert "fix: system theme background to use 'none' for terminal transparency" (#4415) 2025-11-17 10:24:20 -06:00
Jensen de7090ecf4 fix: system theme background to use 'none' for terminal transparency (#4408) 2025-11-17 10:22:31 -06:00
opencode-agent[bot] 8bfc741543 Updated help dialog to use dynamic keybind (#4414)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-11-17 10:18:59 -06:00
Dax 9fdf25c750 Refactor agent loop (#4412) 2025-11-17 10:57:18 -05:00
GitHub Action 9ae3f342a0 ignore: update download stats 2025-11-17 2025-11-17 12:04:41 +00:00
Luke Parker 40659a5f34 fix: Line count on win (#4401) 2025-11-17 01:08:22 -06:00
Keath Milligan 27c035a2f7 fix: handle Git Bash path mapping on windows (#4380) 2025-11-17 01:06:44 -06:00
Aiden Cline 8b48944c93 chore: update type 2025-11-17 00:07:23 -06:00
Tyler Gannon aa2b7318c8 chore: replace z.union with z.enum for cleaner OpenAPI generation (#4394) 2025-11-17 00:06:40 -06:00
Spoon 61994e57b0 fix(batch): simple UX feedback (#4396) 2025-11-17 00:02:05 -06:00
Youssef Achy e13b4dc18e add support for azure cognitive services provider (#4397) 2025-11-17 00:01:45 -06:00
opencode-agent[bot] 6f2a7ccefe Fixed OPENCODE_CONFIG_DIR to load config files. (#4400)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-11-16 23:48:36 -06:00
Jay bab6cfec9e docs: Add clarification for projects using 'opencode' name
Added a section to clarify the affiliation of related projects.
2025-11-16 20:51:41 -05:00
Aiden Cline 0d31818c43 fix: vercel gateway options 2025-11-16 18:39:31 -06:00
Sebastian Herrlinger c327a0dea0 bump opentui version to 0.1.45, fixing highlighting on windows 2025-11-16 23:56:11 +01:00
Aiden Cline 902fe8b49e docs: permissions 2025-11-16 16:40:48 -06:00
Aiden Cline 4d38903d14 ignore: rm 2025-11-16 16:32:04 -06:00
Baptiste Cavallo 77b94e5375 fix(batch): restore per-tool UI feedback + UX improvements (#4387) 2025-11-16 16:31:41 -06:00
opencode-agent[bot] f7a3c4caa3 Added copy option to message context menu (#4389)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
Co-authored-by: GitHub Action <action@github.com>
2025-11-16 15:35:05 -06:00
opencode 56c95d56ac release: v1.0.68 2025-11-16 20:38:48 +00:00
Aiden Cline f4ee72f295 fix: promptCacheKey set unnecessarily 2025-11-16 14:32:57 -06:00
GitHub Action fd46fc49d9 ignore: update download stats 2025-11-16 2025-11-16 12:04:11 +00:00
Frank cd047c2ca9 wip: zen 2025-11-16 03:32:13 -05:00
GitHub Action 53cea858fd chore: format code 2025-11-16 08:30:36 +00:00
Frank ee74c5a75e zen: usage paging 2025-11-16 03:29:52 -05:00
opencode 3a939b5fbd release: v1.0.67 2025-11-16 07:49:52 +00:00
GitHub Action a33794249c chore: format code 2025-11-16 07:44:06 +00:00
Aiden Cline dec5d350c6 fix: panic when theme has 'none' 2025-11-16 01:43:23 -06:00
opencode 2fe5ce0edd release: v1.0.66 2025-11-16 07:27:25 +00:00
Aiden Cline e861839f90 fix: initial val 2025-11-16 01:14:49 -06:00
Aiden Cline 07a9d1dcce fix: history jsonl file corruption cases (#4364) 2025-11-16 00:50:13 -06:00
Zeno Jiricek 3602706db8 docs: mise installation command (#2938) 2025-11-15 21:44:28 -06:00
GitHub Action 0d6e661c11 chore: format code 2025-11-16 03:38:13 +00:00
xiaojie.zj 7b730e5225 add: add zenmux doc and header (#3597)
Co-authored-by: xiaojie.zj <xiaojie.zj@antgroup.com>
2025-11-15 21:37:30 -06:00
Alvin Johansson 9dc39bcc82 Add Flexoki theme (#3986) 2025-11-15 21:28:13 -06:00
Luke Parker fca9943523 fix: Diff view now ignores line endings changes/windows autocrlf (#4356) 2025-11-15 21:18:39 -06:00
Aiden Cline 4e54a4aec9 fix aur build (#4359) 2025-11-15 20:16:19 -06:00
Aiden Cline 9aa734810c fix: omit ref for todo tool 2025-11-15 19:19:36 -06:00
Aiden Cline 071cc516b2 tweak: make zod error more prompty 2025-11-15 13:19:24 -06:00
GitHub Action 4a81ca2f86 ignore: update download stats 2025-11-15 2025-11-15 12:04:09 +00:00
Chris Olszewski 43f7cb6326 fix: snapshot history when running from git worktrees (#4312) 2025-11-15 01:02:00 -06:00
Baptiste Cavallo 8ace6bc0a1 experimental batch tool (#2983)
Co-authored-by: GitHub Action <action@github.com>
2025-11-15 00:54:36 -06:00
Aiden Cline d28e298459 tweak: only show dropdown for 3+ items (#4345) 2025-11-14 23:45:48 -06:00
Abílio Costa 348e2d6ed2 docs: clarify that config files are merged, not replaced (#4342)
Co-authored-by: Claude <noreply@anthropic.com>
2025-11-14 17:49:47 -06:00
Tyler Gannon dffc402817 fix: replace union type with enum "true"/"false" in /find/file endpoint (#4338) 2025-11-14 17:48:23 -06:00
Frank 45c046fcfb fix: incorrect sonnet price calculation 2025-11-14 18:46:43 -05:00
GitHub Action 3344655b11 chore: format code 2025-11-14 22:44:36 +00:00
sredfern 9c6c5fa346 fix(provider): support local file paths for custom providers (#4323) 2025-11-14 16:43:59 -06:00
Brian Cheung 1ed664ff05 feat: support images in mcp tool responses (#4100)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2025-11-14 15:00:52 -06:00
Aiden Cline 6ef0b7201f fix: add azure exclusion 2025-11-14 11:54:00 -06:00
Aiden Cline e569a81396 set verbosity to low for gpt-5.1 (match codex) 2025-11-14 11:52:29 -06:00
Dax Raad 25b9d759ef fix sdk types 2025-11-14 12:42:46 -05:00
Dax Raad d7e1e89013 fix sdk types 2025-11-14 12:42:46 -05:00
Shantur Rathore 6ee3cd1a17 set promptCacheKey for openai compatible providers (#4203)
Co-authored-by: GitHub Action <action@github.com>
2025-11-14 11:41:01 -06:00
Dax Raad b4b84a1cbd add global.event.subscribe() to sdk 2025-11-14 12:32:43 -05:00
Frank 176073d1ba doc: add baseten provider 2025-11-14 12:19:58 -05:00
GitHub Action 77951169f3 ignore: update download stats 2025-11-14 2025-11-14 12:04:48 +00:00
Frank 98da385d44 zen: add gpt-5-nano model 2025-11-14 00:59:42 -05:00
Frank a03daf6331 zen: use gpt-5-nano as small model 2025-11-14 00:59:00 -05:00
Frank 261248bdb2 zen: add gpt5.1 to docs 2025-11-13 23:47:38 -05:00
Frank 3eabbcfb15 zen: hide alpha models 2025-11-13 23:10:06 -05:00
Dax Raad 8a7548a817 improve read tool end-of-file detection to prevent infinite loops 2025-11-13 21:41:06 -05:00
GitHub Action 689e7db372 chore: format code 2025-11-14 01:16:58 +00:00
Aiden Cline eb6999d434 no mr llm, you may not read that 2025-11-13 19:16:07 -06:00
opencode ea11331497 release: v1.0.65 2025-11-14 00:10:30 +00:00
Dax Raad 09e96e7525 handle config errors gracefully 2025-11-13 18:59:09 -05:00
GitHub Action d1778b213e chore: format code 2025-11-13 22:39:53 +00:00
Aiden Cline 840f332700 fix: max tokens when using models like opus with providers other than anthropic (#4307) 2025-11-13 16:39:09 -06:00
opencode cc0a3c7770 release: v1.0.64 2025-11-13 22:12:44 +00:00
Aiden Cline 8c5d76412c fix: typeerror case 2025-11-13 15:51:23 -06:00
Adam 10564c35d5 fix(desktop): default theme 2025-11-13 15:26:36 -06:00
GitHub Action b2e1e0e889 chore: format code 2025-11-13 20:48:10 +00:00
Adam 953c1c2f50 wip(desktop): layout improvements 2025-11-13 14:47:29 -06:00
Aiden Cline ec8df862cf fix: opencode run timeout 2025-11-13 14:27:33 -06:00
GitHub Action 0044de0a69 chore: format code 2025-11-13 19:42:31 +00:00
Valerio Di Maggio 46f0464fc0 Fix: unreadable texts in light mode (#4301) 2025-11-13 13:41:56 -06:00
opencode 47ab5602e1 release: v1.0.63 2025-11-13 19:00:14 +00:00
Aiden Cline c7bdfbdaab fix: windows install (#4293)
Co-authored-by: GitHub Action <action@github.com>
2025-11-13 12:22:07 -06:00
Luke Parker b17bea4c60 fix: resolve bun/pnpm global install failures on Windows (#4275)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2025-11-13 10:38:57 -06:00
Tommy D. Rossi 5fca8cf817 Add scroll acceleration support to TUI (#4289) 2025-11-13 17:02:10 +01:00
GitHub Action 231dae0219 ignore: update download stats 2025-11-13 2025-11-13 12:04:32 +00:00
Aiden Cline 1c87a4f875 fixes 2025-11-12 22:05:07 -06:00
Luke Parker c62e4d6a72 fix: Enable Windows builds and fix bun+pnpm install on Windows (#4273) 2025-11-12 21:57:44 -06:00
Aiden Cline 5f53553c94 fix: dirty check 2025-11-12 19:03:46 -06:00
GitHub Action 5835d30e1c chore: format code 2025-11-13 00:53:22 +00:00
Aiden Cline b17cb358b3 ci: update zed sync 2025-11-12 18:52:39 -06:00
2198 changed files with 64364 additions and 50416 deletions
+17 -9
View File
@@ -6,7 +6,7 @@ on:
jobs:
auto-label:
runs-on: ubuntu-latest
runs-on: blacksmith-4vcpu-ubuntu-2404
permissions:
contents: read
issues: write
@@ -28,14 +28,14 @@ jobs:
const versionPattern = /[v]?1\.0\./i;
const isVersionRelated = versionPattern.test(title) || versionPattern.test(description);
// Check for "nix" keyword
const nixPattern = /\bnix\b/i;
const isNixRelated = nixPattern.test(title) || nixPattern.test(description);
const labels = [];
if (isWebRelated) {
// Add web label
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
labels: ['web']
});
labels.push('web');
// Assign to adamdotdevin
await github.rest.issues.addAssignees({
@@ -46,10 +46,18 @@ jobs:
});
} else if (isVersionRelated) {
// Only add opentui if NOT web-related
labels.push('opentui');
}
if (isNixRelated) {
labels.push('nix');
}
if (labels.length > 0) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
labels: ['opentui']
labels: labels
});
}
+5 -1
View File
@@ -11,12 +11,16 @@ concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
deploy:
runs-on: ubuntu-latest
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/setup-bun
- uses: actions/setup-node@v4
with:
node-version: "24"
- run: bun sst deploy --stage=${{ github.ref_name }}
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
+8 -5
View File
@@ -6,7 +6,7 @@ on:
jobs:
check-duplicates:
runs-on: ubuntu-latest
runs-on: blacksmith-4vcpu-ubuntu-2404
permissions:
contents: read
issues: write
@@ -21,18 +21,18 @@ jobs:
- name: Check for duplicate issues
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OPENCODE_PERMISSION: |
{
"bash": {
"gh issue*": "allow",
"*": "deny"
},
"*": "deny"
},
"webfetch": "deny"
}
run: |
opencode run -m anthropic/claude-sonnet-4-20250514 "A new issue has been created:'
opencode run -m opencode/claude-haiku-4-5 "A new issue has been created:'
Issue number:
${{ github.event.issue.number }}
@@ -55,4 +55,7 @@ jobs:
Feel free to ignore if none of these address your specific case.'
Additionally, if the issue mentions keybinds, keyboard shortcuts, or key bindings, please add a comment mentioning the pinned keybinds issue #4997:
'For keybind-related issues, please also check our pinned keybinds documentation: #4997'
If no clear duplicates are found, do not comment."
-29
View File
@@ -1,29 +0,0 @@
name: format
on:
push:
branches-ignore:
- production
pull_request:
branches-ignore:
- production
workflow_dispatch:
jobs:
format:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Bun
uses: ./.github/actions/setup-bun
- name: run
run: |
./script/format.ts
env:
CI: true
+38
View File
@@ -0,0 +1,38 @@
name: generate
on:
push:
branches-ignore:
- production
pull_request:
branches-ignore:
- production
workflow_dispatch:
jobs:
generate:
runs-on: blacksmith-4vcpu-ubuntu-2404
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }}
ref: ${{ github.event.pull_request.head.ref || github.ref_name }}
- name: Setup Bun
uses: ./.github/actions/setup-bun
- name: Generate SDK
run: |
bun ./packages/sdk/js/script/build.ts
(cd packages/opencode && bun dev generate > ../sdk/openapi.json)
bun x prettier --write packages/sdk/openapi.json
- name: Format
run: ./script/format.ts
env:
CI: true
PUSH_BRANCH: ${{ github.event.pull_request.head.ref || github.ref_name }}
-53
View File
@@ -1,53 +0,0 @@
name: Guidelines Check
on:
# Disabled - uncomment to re-enable
# pull_request_target:
# types: [opened, synchronize]
jobs:
check-guidelines:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Install opencode
run: curl -fsSL https://opencode.ai/install | bash
- name: Check PR guidelines compliance
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OPENCODE_PERMISSION: '{ "bash": { "gh*": "allow", "gh pr review*": "deny", "*": "deny" } }'
run: |
opencode run -m anthropic/claude-sonnet-4-20250514 "A new pull request has been created: '${{ github.event.pull_request.title }}'
<pr-number>
${{ github.event.pull_request.number }}
</pr-number>
<pr-description>
${{ github.event.pull_request.body }}
</pr-description>
Please check all the code changes in this pull request against the guidelines in AGENTS.md file in this repository. Diffs are important but make sure you read the entire file to get proper context. Make it clear the suggestions are merely suggestions and the human can decide what to do
Use the gh cli to create comments on the files for the violations. Try to leave the comment on the exact line number. If you have a suggested fix include it in a suggestion code block.
Command MUST be like this.
```
gh api \
--method POST \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/comments \
-f 'body=[summary of issue]' -f 'commit_id=${{ github.event.pull_request.head.sha }}' -f 'path=[path-to-file]' -F "line=[line]" -f 'side=RIGHT'
```
Only create comments for actual violations. If the code follows all guidelines, don't run any gh commands."
+1 -1
View File
@@ -6,7 +6,7 @@ on:
jobs:
notify:
runs-on: ubuntu-latest
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- name: Send nicely-formatted embed to Discord
uses: SethCohen/github-releases-to-discord@v1
+6 -2
View File
@@ -3,6 +3,8 @@ name: opencode
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
jobs:
opencode:
@@ -11,7 +13,7 @@ jobs:
startsWith(github.event.comment.body, '/oc') ||
contains(github.event.comment.body, ' /opencode') ||
startsWith(github.event.comment.body, '/opencode')
runs-on: ubuntu-latest
runs-on: blacksmith-4vcpu-ubuntu-2404
permissions:
id-token: write
contents: read
@@ -21,9 +23,11 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4
- uses: ./.github/actions/setup-bun
- name: Run opencode
uses: sst/opencode/github@latest
env:
OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
with:
model: opencode/glm-4.6
model: opencode/claude-haiku-4-5
+1 -1
View File
@@ -14,7 +14,7 @@ permissions:
jobs:
publish:
runs-on: ubuntu-latest
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: actions/checkout@v3
with:
+1 -1
View File
@@ -13,7 +13,7 @@ permissions:
jobs:
publish:
runs-on: ubuntu-latest
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: actions/checkout@v3
with:
+122 -14
View File
@@ -2,11 +2,15 @@ name: publish
run-name: "${{ format('release {0}', inputs.bump) }}"
on:
push:
branches:
- dev
- snapshot-*
workflow_dispatch:
inputs:
bump:
description: "Bump major, minor, or patch"
required: true
required: false
type: choice
options:
- major
@@ -20,12 +24,14 @@ on:
concurrency: ${{ github.workflow }}-${{ github.ref }}
permissions:
id-token: write
contents: write
packages: write
jobs:
publish:
runs-on: ubuntu-latest
runs-on: blacksmith-4vcpu-ubuntu-2404
if: github.repository == 'sst/opencode' && github.ref == 'refs/heads/dev'
steps:
- uses: actions/checkout@v3
with:
@@ -33,20 +39,13 @@ jobs:
- run: git fetch --force --tags
- uses: actions/setup-go@v5
with:
go-version: ">=1.24.0"
cache: true
cache-dependency-path: go.sum
- uses: ./.github/actions/setup-bun
- name: Install makepkg
- name: Setup SSH for AUR
if: inputs.bump || inputs.version
run: |
sudo apt-get update
sudo apt-get install -y pacman-package-manager
- name: Setup SSH for AUR
run: |
mkdir -p ~/.ssh
echo "${{ secrets.AUR_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
@@ -55,15 +54,97 @@ jobs:
ssh-keyscan -H aur.archlinux.org >> ~/.ssh/known_hosts || true
- name: Install OpenCode
if: inputs.bump || inputs.version
run: curl -fsSL https://opencode.ai/install | bash
- name: Setup npm auth
run: |
echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > ~/.npmrc
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/setup-node@v4
with:
node-version: "24"
registry-url: "https://registry.npmjs.org"
- name: Publish
run: |
./script/publish.ts
env:
OPENCODE_BUMP: ${{ inputs.bump }}
OPENCODE_VERSION: ${{ inputs.version }}
OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
AUR_KEY: ${{ secrets.AUR_KEY }}
GITHUB_TOKEN: ${{ secrets.SST_GITHUB_TOKEN }}
NPM_CONFIG_PROVENANCE: false
publish-tauri:
if: false # inputs.bump || inputs.version
continue-on-error: true
strategy:
fail-fast: false
matrix:
settings:
- host: macos-latest
target: x86_64-apple-darwin
- host: macos-latest
target: aarch64-apple-darwin
- host: windows-latest
target: x86_64-pc-windows-msvc
- host: ubuntu-24.04
target: x86_64-unknown-linux-gnu
runs-on: ${{ matrix.settings.host }}
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: apple-actions/import-codesign-certs@v2
if: ${{ runner.os == 'macOS' }}
with:
keychain: build
p12-file-base64: ${{ secrets.APPLE_CERTIFICATE }}
p12-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
- name: Verify Certificate
if: ${{ runner.os == 'macOS' }}
run: |
CERT_INFO=$(security find-identity -v -p codesigning build.keychain | grep "Developer ID Application")
CERT_ID=$(echo "$CERT_INFO" | awk -F'"' '{print $2}')
echo "CERT_ID=$CERT_ID" >> $GITHUB_ENV
echo "Certificate imported."
- name: Setup Apple API Key
if: ${{ runner.os == 'macOS' }}
run: |
echo "${{ secrets.APPLE_API_KEY_PATH }}" > $RUNNER_TEMP/apple-api-key.p8
- run: git fetch --force --tags
- uses: ./.github/actions/setup-bun
- name: install dependencies (ubuntu only)
if: startsWith(matrix.settings.host, 'ubuntu')
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
- name: install Rust stable
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.settings.target }}
- uses: Swatinem/rust-cache@v2
with:
workspaces: packages/tauri/src-tauri
shared-key: ${{ matrix.settings.target }}
- name: Prepare
run: |
cd packages/tauri
bun ./scripts/prepare.ts
env:
OPENCODE_BUMP: ${{ inputs.bump }}
OPENCODE_VERSION: ${{ inputs.version }}
@@ -72,3 +153,30 @@ jobs:
GITHUB_TOKEN: ${{ secrets.SST_GITHUB_TOKEN }}
AUR_KEY: ${{ secrets.AUR_KEY }}
OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
RUST_TARGET: ${{ matrix.settings.target }}
GH_TOKEN: ${{ github.token }}
# Fixes AppImage build issues, can be removed when https://github.com/tauri-apps/tauri/pull/12491 is released
- run: cargo install tauri-cli --git https://github.com/tauri-apps/tauri --branch feat/truly-portable-appimage
if: startsWith(matrix.settings.host, 'ubuntu')
- name: Build and upload artifacts
uses: tauri-apps/tauri-action@390cbe447412ced1303d35abe75287949e43437a
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_BUNDLER_NEW_APPIMAGE_FORMAT: true
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ env.CERT_ID }}
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
APPLE_API_KEY_PATH: ${{ runner.temp }}/apple-api-key.p8
with:
projectPath: packages/tauri
uploadWorkflowArtifacts: true
tauriScript: ${{ (startsWith(matrix.settings.host, 'ubuntu') && 'cargo tauri') || '' }}
args: --target ${{ matrix.settings.target }}
updaterJsonPreferNsis: true
# releaseId: TODO
+79
View File
@@ -0,0 +1,79 @@
name: Guidelines Check
on:
issue_comment:
types: [created]
jobs:
check-guidelines:
if: |
github.event.issue.pull_request &&
startsWith(github.event.comment.body, '/review') &&
contains(fromJson('["OWNER","MEMBER"]'), github.event.comment.author_association)
runs-on: blacksmith-4vcpu-ubuntu-2404
permissions:
contents: read
pull-requests: write
steps:
- name: Get PR number
id: pr-number
run: |
if [ "${{ github.event_name }}" = "pull_request_target" ]; then
echo "number=${{ github.event.pull_request.number }}" >> $GITHUB_OUTPUT
else
echo "number=${{ github.event.issue.number }}" >> $GITHUB_OUTPUT
fi
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Install opencode
run: curl -fsSL https://opencode.ai/install | bash
- name: Get PR details
id: pr-details
run: |
gh api /repos/${{ github.repository }}/pulls/${{ steps.pr-number.outputs.number }} > pr_data.json
echo "title=$(jq -r .title pr_data.json)" >> $GITHUB_OUTPUT
echo "sha=$(jq -r .head.sha pr_data.json)" >> $GITHUB_OUTPUT
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Check PR guidelines compliance
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OPENCODE_PERMISSION: '{ "bash": { "gh*": "allow", "gh pr review*": "deny", "*": "deny" } }'
PR_TITLE: ${{ steps.pr-details.outputs.title }}
run: |
PR_BODY=$(jq -r .body pr_data.json)
opencode run -m anthropic/claude-opus-4-5 "A new pull request has been created: '${PR_TITLE}'
<pr-number>
${{ steps.pr-number.outputs.number }}
</pr-number>
<pr-description>
$PR_BODY
</pr-description>
Please check all the code changes in this pull request against the style guide, also look for any bugs if they exist. Diffs are important but make sure you read the entire file to get proper context. Make it clear the suggestions are merely suggestions and the human can decide what to do
When critiquing code against the style guide, be sure that the code is ACTUALLY in violation, don't complain about else statements if they already use early returns there. You may complain about excessive nesting though, regardless of else statement usage.
When critiquing code style don't be a zealot, we don't like "let" statements but sometimes they are the simpliest option, if someone does a bunch of nesting with let, they should consider using iife (see packages/opencode/src/util.iife.ts)
Use the gh cli to create comments on the files for the violations. Try to leave the comment on the exact line number. If you have a suggested fix include it in a suggestion code block.
Command MUST be like this.
\`\`\`
gh api \
--method POST \
-H \"Accept: application/vnd.github+json\" \
-H \"X-GitHub-Api-Version: 2022-11-28\" \
/repos/${{ github.repository }}/pulls/${{ steps.pr-number.outputs.number }}/comments \
-f 'body=[summary of issue]' -f 'commit_id=${{ steps.pr-details.outputs.sha }}' -f 'path=[path-to-file]' -F \"line=[line]\" -f 'side=RIGHT'
\`\`\`
Only create comments for actual violations. If the code follows all guidelines, comment on the issue using gh cli: 'lgtm' AND NOTHING ELSE!!!!."
-35
View File
@@ -1,35 +0,0 @@
name: snapshot
on:
push:
branches:
- dev
- opentui
- v0
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- run: git fetch --force --tags
- uses: actions/setup-go@v5
with:
go-version: ">=1.24.0"
cache: true
cache-dependency-path: go.sum
- uses: ./.github/actions/setup-bun
- name: Publish
run: |
./script/publish.ts
env:
GITHUB_TOKEN: ${{ secrets.SST_GITHUB_TOKEN }}
NPM_CONFIG_TOKEN: ${{ secrets.NPM_TOKEN }}
+1 -1
View File
@@ -7,7 +7,7 @@ on:
jobs:
stats:
runs-on: ubuntu-latest
runs-on: blacksmith-4vcpu-ubuntu-2404
permissions:
contents: write
+3 -3
View File
@@ -2,13 +2,13 @@ name: "sync-zed-extension"
on:
workflow_dispatch:
release:
types: [published]
# release:
# types: [published]
jobs:
zed:
name: Release Zed Extension
runs-on: ubuntu-latest
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: actions/checkout@v4
with:
+1 -1
View File
@@ -10,7 +10,7 @@ on:
workflow_dispatch:
jobs:
test:
runs-on: ubuntu-latest
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- name: Checkout repository
uses: actions/checkout@v4
+1 -1
View File
@@ -7,7 +7,7 @@ on:
jobs:
typecheck:
runs-on: ubuntu-latest
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- name: Checkout repository
uses: actions/checkout@v4
+102
View File
@@ -0,0 +1,102 @@
name: Update Nix Hashes
permissions:
contents: write
on:
workflow_dispatch:
push:
paths:
- "bun.lock"
- "package.json"
- "packages/*/package.json"
pull_request:
paths:
- "bun.lock"
- "package.json"
- "packages/*/package.json"
jobs:
update:
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
runs-on: blacksmith-4vcpu-ubuntu-2404
env:
SYSTEM: x86_64-linux
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0
ref: ${{ github.head_ref || github.ref_name }}
repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }}
- name: Setup Nix
uses: DeterminateSystems/nix-installer-action@v20
- name: Configure git
run: |
git config --global user.email "action@github.com"
git config --global user.name "Github Action"
- name: Update flake.lock
run: |
set -euo pipefail
echo "📦 Updating flake.lock..."
nix flake update
echo "✅ flake.lock updated successfully"
- name: Update node_modules hash
run: |
set -euo pipefail
echo "🔄 Updating node_modules hash..."
nix/scripts/update-hashes.sh
echo "✅ node_modules hash updated successfully"
- name: Commit hash changes
env:
TARGET_BRANCH: ${{ github.head_ref || github.ref_name }}
run: |
set -euo pipefail
echo "🔍 Checking for changes in tracked Nix files..."
summarize() {
local status="$1"
{
echo "### Nix Hash Update"
echo ""
echo "- ref: ${GITHUB_REF_NAME}"
echo "- status: ${status}"
} >> "$GITHUB_STEP_SUMMARY"
if [ -n "${GITHUB_SERVER_URL:-}" ] && [ -n "${GITHUB_REPOSITORY:-}" ] && [ -n "${GITHUB_RUN_ID:-}" ]; then
echo "- run: ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" >> "$GITHUB_STEP_SUMMARY"
fi
echo "" >> "$GITHUB_STEP_SUMMARY"
}
FILES=(flake.lock flake.nix nix/node-modules.nix nix/hashes.json)
STATUS="$(git status --short -- "${FILES[@]}" || true)"
if [ -z "$STATUS" ]; then
echo "✅ No changes detected. Hashes are already up to date."
summarize "no changes"
exit 0
fi
echo "📝 Changes detected:"
echo "$STATUS"
echo "🔗 Staging files..."
git add "${FILES[@]}"
echo "💾 Committing changes..."
git commit -m "Update Nix flake.lock and hashes"
echo "✅ Changes committed"
BRANCH="${TARGET_BRANCH:-${GITHUB_REF_NAME}}"
echo "🌳 Pulling latest from branch: $BRANCH"
git pull --rebase origin "$BRANCH"
echo "🚀 Pushing changes to branch: $BRANCH"
git push origin HEAD:"$BRANCH"
echo "✅ Changes pushed successfully"
summarize "committed $(git rev-parse --short HEAD)"
+7 -1
View File
@@ -6,10 +6,16 @@ node_modules
.idea
.vscode
*~
openapi.json
playground
tmp
dist
ts-dist
.turbo
**/.serena
.serena/
/result
refs
Session.vim
opencode.json
a.out
target
+7
View File
@@ -1,2 +1,9 @@
#!/bin/sh
# Check if bun version matches package.json
EXPECTED_VERSION=$(grep '"packageManager"' package.json | sed 's/.*"bun@\([^"]*\)".*/\1/')
CURRENT_VERSION=$(bun --version)
if [ "$CURRENT_VERSION" != "$EXPECTED_VERSION" ]; then
echo "Error: Bun version $CURRENT_VERSION does not match expected version $EXPECTED_VERSION from package.json"
exit 1
fi
bun typecheck
+5 -1
View File
@@ -1,5 +1,6 @@
---
description: Git commit and push
description: git commit and push
model: opencode/glm-4.6
---
commit and push
@@ -21,3 +22,6 @@ WHAT was done.
do not do generic messages like "improved agent experience" be very specific
about what user facing changes were made
if there are changes do a git pull --rebase
if there are conflicts DO NOT FIX THEM. notify me and I will fix them
-8
View File
@@ -1,8 +0,0 @@
---
description: hello world iaosd ioasjdoiasjd oisadjoisajd osiajd oisaj dosaij dsoajsajdaijdoisa jdoias jdoias jdoia jois jo jdois jdoias jdoias j djoasdj
---
hey there $ARGUMENTS
!`ls`
check out @README.md
+23
View File
@@ -0,0 +1,23 @@
---
description: "find issue(s) on github"
model: opencode/claude-haiku-4-5
---
Search through existing issues in sst/opencode using the gh cli to find issues matching this query:
$ARGUMENTS
Consider:
1. Similar titles or descriptions
2. Same error messages or symptoms
3. Related functionality or components
4. Similar feature requests
Please list any matching issues with:
- Issue number and title
- Brief explanation of why it matches the query
- Link to the issue
If no clear matches are found, say so.
+15
View File
@@ -0,0 +1,15 @@
---
description: Remove AI code slop
---
Check the diff against dev, and remove all AI generated slop introduced in this branch.
This includes:
- Extra comments that a human wouldn't add or is inconsistent with the rest of the file
- Extra defensive checks or try/catch blocks that are abnormal for that area of the codebase (especially if called by trusted / validated codepaths)
- Casts to any to get around type issues
- Any other style that is inconsistent with the file
- Unnecessary emoji usage
Report at the end with only a 1-3 sentence summary of what you changed
+1 -1
View File
@@ -1,5 +1,5 @@
---
description: Spellcheck all markdown file changes
description: spellcheck all markdown file changes
---
Look at all the unstaged changes to markdown (.md, .mdx) files, pull out the lines that have changed, and check for spelling and grammar errors.
-4
View File
@@ -1,4 +0,0 @@
{
"$schema": "https://opencode.ai/config.json",
"plugin": ["opencode-openai-codex-auth"]
}
+26
View File
@@ -0,0 +1,26 @@
{
"$schema": "https://opencode.ai/config.json",
"plugin": ["opencode-openai-codex-auth"],
// "enterprise": {
// "url": "https://enterprise.dev.opencode.ai",
// },
"instructions": ["STYLE_GUIDE.md"],
"provider": {
"opencode": {
"options": {},
},
},
"mcp": {
"exa": {
"type": "remote",
"url": "https://mcp.exa.ai/mcp",
},
"morph": {
"type": "local",
"command": ["bunx", "@morphllm/morphmcp"],
"environment": {
"ENABLED_TOOLS": "warp_grep",
},
},
},
}
+1
View File
@@ -0,0 +1 @@
sst-env.d.ts
+11
View File
@@ -0,0 +1,11 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "bun",
"request": "attach",
"name": "opencode (attach)",
"url": "ws://localhost:6499/"
}
]
}
+5
View File
@@ -0,0 +1,5 @@
{
"recommendations": [
"oven.bun-vscode"
]
}
-13
View File
@@ -1,16 +1,3 @@
## IMPORTANT
- Try to keep things in one function unless composable or reusable
- DO NOT do unnecessary destructuring of variables
- DO NOT use `else` statements unless necessary
- DO NOT use `try`/`catch` if it can be avoided
- AVOID `try`/`catch` where possible
- AVOID `else` statements
- AVOID using `any` type
- AVOID `let` statements
- PREFER single word variable names where possible
- Use as many bun apis as possible like Bun.file()
## Debugging
- To test opencode in the `packages/opencode` directory you can run `bun dev`
+34
View File
@@ -42,6 +42,40 @@ Want to take on an issue? Leave a comment and a maintainer may assign it to you
> [!NOTE]
> After touching `packages/opencode/src/server/server.ts`, run "./packages/sdk/js/script/build.ts" to regenerate the JS sdk.
Please try to follow the [style guide](./STYLE_GUIDE.md)
### Setting up a Debugger
Bun debugging is currently rough around the edges. We hope this guide helps you get set up and avoid some pain points.
The most reliable way to debug OpenCode is to run it manually in a terminal via `bun run --inspect=<url> dev ...` and attach
your debugger via that URL. Other methods can result in breakpoints being mapped incorrectly, at least in VSCode (YMMV).
Caveats:
- `*.tsx` files won't have their breakpoints correctly mapped. This seems due to Bun currently not supporting source maps on code transformed
via `BunPlugin`s (currently necessary due to our dependency on `@opentui/solid`). Currently, the best you can do in terms of debugging `*.tsx`
files is writing a `debugger;` statement. Debugging facilities like stepping won't work, but at least you will be informed if a specific code
is triggered.
- If you want to run the OpenCode TUI and have breakpoints triggered in the server code, you might need to run `bun dev spawn` instead of
the usual `bun dev`. This is because `bun dev` runs the server in a worker thread and breakpoints might not work there.
Other tips and tricks:
- You might want to use `--inspect-wait` or `--inspect-brk` instead of `--inspect`, depending on your workflow
- Specifying `--inspect=ws://localhost:6499/` on every invocation can be tiresome, you may want to `export BUN_OPTIONS=--inspect=ws://localhost:6499/` instead
#### VSCode Setup
If you use VSCode, you can use our example configurations [.vscode/settings.example.json](.vscode/settings.example.json) and [.vscode/launch.example.json](.vscode/launch.example.json).
Some debug methods that can be problematic:
- Debug configurations with `"request": "launch"` can have breakpoints incorrectly mapped and thus unusable
- The same problem arises when running OpenCode in the VSCode `JavaScript Debug Terminal`
With that said, you may want to try these methods, as they might work for you.
## Pull Request Expectations
- Try to keep pull requests small and focused.
+24 -2
View File
@@ -28,8 +28,10 @@ curl -fsSL https://opencode.ai/install | bash
npm i -g opencode-ai@latest # or bun/pnpm/yarn
scoop bucket add extras; scoop install extras/opencode # Windows
choco install opencode # Windows
brew install opencode # macOS and Linux
brew install opencode # macOS and Linux
paru -S opencode-bin # Arch Linux
mise use -g ubi:sst/opencode # Any OS
nix run nixpkgs#opencode # or github:sst/opencode for latest dev branch
```
> [!TIP]
@@ -50,6 +52,22 @@ OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bas
XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
```
### Agents
OpenCode includes two built-in agents you can switch between,
you can switch between these using the `Tab` key.
- **build** - Default, full access agent for development work
- **plan** - Read-only agent for analysis and code exploration
- Denies file edits by default
- Asks permission before running bash commands
- Ideal for exploring unfamiliar codebases or planning changes
Also, included is a **general** subagent for complex searches and multi-step tasks.
This is used internally and can be invoked using `@general` in messages.
Learn more about [agents](https://opencode.ai/docs/agents).
### Documentation
For more info on how to configure OpenCode [**head over to our docs**](https://opencode.ai/docs).
@@ -58,6 +76,10 @@ For more info on how to configure OpenCode [**head over to our docs**](https://o
If you're interested in contributing to OpenCode, please read our [contributing docs](./CONTRIBUTING.md) before submitting a pull request.
### Building on OpenCode
If you are working on a project that's related to OpenCode and is using "opencode" as a part of its name; for example, "opencode-dashboard" or "opencode-mobile", please add a note to your README to clarify that it is not built by the OpenCode team and is not affiliated with us in anyway.
### FAQ
#### How is this different than Claude Code?
@@ -65,7 +87,7 @@ If you're interested in contributing to OpenCode, please read our [contributing
It's very similar to Claude Code in terms of capability. Here are the key differences:
- 100% open source
- Not coupled to any provider. Although Anthropic is recommended, OpenCode can be used with OpenAI, Google or even local models. As models evolve the gaps between them will close and pricing will drop so being provider-agnostic is important.
- Not coupled to any provider. Although we recommend the models we provide through [OpenCode Zen](https://opencode.ai/zen); OpenCode can be used with Claude, OpenAI, Google or even local models. As models evolve the gaps between them will close and pricing will drop so being provider-agnostic is important.
- Out of the box LSP support
- A focus on TUI. OpenCode is built by neovim users and the creators of [terminal.shop](https://terminal.shop); we are going to push the limits of what's possible in the terminal.
- A client/server architecture. This for example can allow OpenCode to run on your computer, while you can drive it remotely from a mobile app. Meaning that the TUI frontend is just one of the possible clients.
+166 -138
View File
@@ -1,140 +1,168 @@
# Download Stats
| Date | GitHub Downloads | npm Downloads | Total |
| ---------- | ----------------- | ----------------- | ------------------- |
| 2025-06-29 | 18,789 (+0) | 39,420 (+0) | 58,209 (+0) |
| 2025-06-30 | 20,127 (+1,338) | 41,059 (+1,639) | 61,186 (+2,977) |
| 2025-07-01 | 22,108 (+1,981) | 43,745 (+2,686) | 65,853 (+4,667) |
| 2025-07-02 | 24,814 (+2,706) | 46,168 (+2,423) | 70,982 (+5,129) |
| 2025-07-03 | 27,834 (+3,020) | 49,955 (+3,787) | 77,789 (+6,807) |
| 2025-07-04 | 30,608 (+2,774) | 54,758 (+4,803) | 85,366 (+7,577) |
| 2025-07-05 | 32,524 (+1,916) | 58,371 (+3,613) | 90,895 (+5,529) |
| 2025-07-06 | 33,766 (+1,242) | 59,694 (+1,323) | 93,460 (+2,565) |
| 2025-07-08 | 38,052 (+4,286) | 64,468 (+4,774) | 102,520 (+9,060) |
| 2025-07-09 | 40,924 (+2,872) | 67,935 (+3,467) | 108,859 (+6,339) |
| 2025-07-10 | 43,796 (+2,872) | 71,402 (+3,467) | 115,198 (+6,339) |
| 2025-07-11 | 46,982 (+3,186) | 77,462 (+6,060) | 124,444 (+9,246) |
| 2025-07-12 | 49,302 (+2,320) | 82,177 (+4,715) | 131,479 (+7,035) |
| 2025-07-13 | 50,803 (+1,501) | 86,394 (+4,217) | 137,197 (+5,718) |
| 2025-07-14 | 53,283 (+2,480) | 87,860 (+1,466) | 141,143 (+3,946) |
| 2025-07-15 | 57,590 (+4,307) | 91,036 (+3,176) | 148,626 (+7,483) |
| 2025-07-16 | 62,313 (+4,723) | 95,258 (+4,222) | 157,571 (+8,945) |
| 2025-07-17 | 66,684 (+4,371) | 100,048 (+4,790) | 166,732 (+9,161) |
| 2025-07-18 | 70,379 (+3,695) | 102,587 (+2,539) | 172,966 (+6,234) |
| 2025-07-19 | 73,497 (+3,117) | 105,904 (+3,317) | 179,401 (+6,434) |
| 2025-07-20 | 76,453 (+2,956) | 109,044 (+3,140) | 185,497 (+6,096) |
| 2025-07-21 | 80,197 (+3,744) | 113,537 (+4,493) | 193,734 (+8,237) |
| 2025-07-22 | 84,251 (+4,054) | 118,073 (+4,536) | 202,324 (+8,590) |
| 2025-07-23 | 88,589 (+4,338) | 121,436 (+3,363) | 210,025 (+7,701) |
| 2025-07-24 | 92,469 (+3,880) | 124,091 (+2,655) | 216,560 (+6,535) |
| 2025-07-25 | 96,417 (+3,948) | 126,985 (+2,894) | 223,402 (+6,842) |
| 2025-07-26 | 100,646 (+4,229) | 131,411 (+4,426) | 232,057 (+8,655) |
| 2025-07-27 | 102,644 (+1,998) | 134,736 (+3,325) | 237,380 (+5,323) |
| 2025-07-28 | 105,446 (+2,802) | 136,016 (+1,280) | 241,462 (+4,082) |
| 2025-07-29 | 108,998 (+3,552) | 137,542 (+1,526) | 246,540 (+5,078) |
| 2025-07-30 | 113,544 (+4,546) | 140,317 (+2,775) | 253,861 (+7,321) |
| 2025-07-31 | 118,339 (+4,795) | 143,344 (+3,027) | 261,683 (+7,822) |
| 2025-08-01 | 123,539 (+5,200) | 146,680 (+3,336) | 270,219 (+8,536) |
| 2025-08-02 | 127,864 (+4,325) | 149,236 (+2,556) | 277,100 (+6,881) |
| 2025-08-03 | 131,397 (+3,533) | 150,451 (+1,215) | 281,848 (+4,748) |
| 2025-08-04 | 136,266 (+4,869) | 153,260 (+2,809) | 289,526 (+7,678) |
| 2025-08-05 | 141,596 (+5,330) | 155,752 (+2,492) | 297,348 (+7,822) |
| 2025-08-06 | 147,067 (+5,471) | 158,309 (+2,557) | 305,376 (+8,028) |
| 2025-08-07 | 152,591 (+5,524) | 160,889 (+2,580) | 313,480 (+8,104) |
| 2025-08-08 | 158,187 (+5,596) | 163,448 (+2,559) | 321,635 (+8,155) |
| 2025-08-09 | 162,770 (+4,583) | 165,721 (+2,273) | 328,491 (+6,856) |
| 2025-08-10 | 165,695 (+2,925) | 167,109 (+1,388) | 332,804 (+4,313) |
| 2025-08-11 | 169,297 (+3,602) | 167,953 (+844) | 337,250 (+4,446) |
| 2025-08-12 | 176,307 (+7,010) | 171,876 (+3,923) | 348,183 (+10,933) |
| 2025-08-13 | 182,997 (+6,690) | 177,182 (+5,306) | 360,179 (+11,996) |
| 2025-08-14 | 189,063 (+6,066) | 179,741 (+2,559) | 368,804 (+8,625) |
| 2025-08-15 | 193,608 (+4,545) | 181,792 (+2,051) | 375,400 (+6,596) |
| 2025-08-16 | 198,118 (+4,510) | 184,558 (+2,766) | 382,676 (+7,276) |
| 2025-08-17 | 201,299 (+3,181) | 186,269 (+1,711) | 387,568 (+4,892) |
| 2025-08-18 | 204,559 (+3,260) | 187,399 (+1,130) | 391,958 (+4,390) |
| 2025-08-19 | 209,814 (+5,255) | 189,668 (+2,269) | 399,482 (+7,524) |
| 2025-08-20 | 214,497 (+4,683) | 191,481 (+1,813) | 405,978 (+6,496) |
| 2025-08-21 | 220,465 (+5,968) | 194,784 (+3,303) | 415,249 (+9,271) |
| 2025-08-22 | 225,899 (+5,434) | 197,204 (+2,420) | 423,103 (+7,854) |
| 2025-08-23 | 229,005 (+3,106) | 199,238 (+2,034) | 428,243 (+5,140) |
| 2025-08-24 | 232,098 (+3,093) | 201,157 (+1,919) | 433,255 (+5,012) |
| 2025-08-25 | 236,607 (+4,509) | 202,650 (+1,493) | 439,257 (+6,002) |
| 2025-08-26 | 242,783 (+6,176) | 205,242 (+2,592) | 448,025 (+8,768) |
| 2025-08-27 | 248,409 (+5,626) | 205,242 (+0) | 453,651 (+5,626) |
| 2025-08-28 | 252,796 (+4,387) | 205,242 (+0) | 458,038 (+4,387) |
| 2025-08-29 | 256,045 (+3,249) | 211,075 (+5,833) | 467,120 (+9,082) |
| 2025-08-30 | 258,863 (+2,818) | 212,397 (+1,322) | 471,260 (+4,140) |
| 2025-08-31 | 262,004 (+3,141) | 213,944 (+1,547) | 475,948 (+4,688) |
| 2025-09-01 | 265,359 (+3,355) | 215,115 (+1,171) | 480,474 (+4,526) |
| 2025-09-02 | 270,483 (+5,124) | 217,075 (+1,960) | 487,558 (+7,084) |
| 2025-09-03 | 274,793 (+4,310) | 219,755 (+2,680) | 494,548 (+6,990) |
| 2025-09-04 | 280,430 (+5,637) | 222,103 (+2,348) | 502,533 (+7,985) |
| 2025-09-05 | 283,769 (+3,339) | 223,793 (+1,690) | 507,562 (+5,029) |
| 2025-09-06 | 286,245 (+2,476) | 225,036 (+1,243) | 511,281 (+3,719) |
| 2025-09-07 | 288,623 (+2,378) | 225,866 (+830) | 514,489 (+3,208) |
| 2025-09-08 | 293,341 (+4,718) | 227,073 (+1,207) | 520,414 (+5,925) |
| 2025-09-09 | 300,036 (+6,695) | 229,788 (+2,715) | 529,824 (+9,410) |
| 2025-09-10 | 307,287 (+7,251) | 233,435 (+3,647) | 540,722 (+10,898) |
| 2025-09-11 | 314,083 (+6,796) | 237,356 (+3,921) | 551,439 (+10,717) |
| 2025-09-12 | 321,046 (+6,963) | 240,728 (+3,372) | 561,774 (+10,335) |
| 2025-09-13 | 324,894 (+3,848) | 245,539 (+4,811) | 570,433 (+8,659) |
| 2025-09-14 | 328,876 (+3,982) | 248,245 (+2,706) | 577,121 (+6,688) |
| 2025-09-15 | 334,201 (+5,325) | 250,983 (+2,738) | 585,184 (+8,063) |
| 2025-09-16 | 342,609 (+8,408) | 255,264 (+4,281) | 597,873 (+12,689) |
| 2025-09-17 | 351,117 (+8,508) | 260,970 (+5,706) | 612,087 (+14,214) |
| 2025-09-18 | 358,717 (+7,600) | 266,922 (+5,952) | 625,639 (+13,552) |
| 2025-09-19 | 365,401 (+6,684) | 271,859 (+4,937) | 637,260 (+11,621) |
| 2025-09-20 | 372,092 (+6,691) | 276,917 (+5,058) | 649,009 (+11,749) |
| 2025-09-21 | 377,079 (+4,987) | 280,261 (+3,344) | 657,340 (+8,331) |
| 2025-09-22 | 382,492 (+5,413) | 284,009 (+3,748) | 666,501 (+9,161) |
| 2025-09-23 | 387,008 (+4,516) | 289,129 (+5,120) | 676,137 (+9,636) |
| 2025-09-24 | 393,325 (+6,317) | 294,927 (+5,798) | 688,252 (+12,115) |
| 2025-09-25 | 398,879 (+5,554) | 301,663 (+6,736) | 700,542 (+12,290) |
| 2025-09-26 | 404,334 (+5,455) | 306,713 (+5,050) | 711,047 (+10,505) |
| 2025-09-27 | 411,618 (+7,284) | 317,763 (+11,050) | 729,381 (+18,334) |
| 2025-09-28 | 414,910 (+3,292) | 322,522 (+4,759) | 737,432 (+8,051) |
| 2025-09-29 | 419,919 (+5,009) | 328,033 (+5,511) | 747,952 (+10,520) |
| 2025-09-30 | 427,991 (+8,072) | 336,472 (+8,439) | 764,463 (+16,511) |
| 2025-10-01 | 433,591 (+5,600) | 341,742 (+5,270) | 775,333 (+10,870) |
| 2025-10-02 | 440,852 (+7,261) | 348,099 (+6,357) | 788,951 (+13,618) |
| 2025-10-03 | 446,829 (+5,977) | 359,937 (+11,838) | 806,766 (+17,815) |
| 2025-10-04 | 452,561 (+5,732) | 370,386 (+10,449) | 822,947 (+16,181) |
| 2025-10-05 | 455,559 (+2,998) | 374,745 (+4,359) | 830,304 (+7,357) |
| 2025-10-06 | 460,927 (+5,368) | 379,489 (+4,744) | 840,416 (+10,112) |
| 2025-10-07 | 467,336 (+6,409) | 385,438 (+5,949) | 852,774 (+12,358) |
| 2025-10-08 | 474,643 (+7,307) | 394,139 (+8,701) | 868,782 (+16,008) |
| 2025-10-09 | 479,203 (+4,560) | 400,526 (+6,387) | 879,729 (+10,947) |
| 2025-10-10 | 484,374 (+5,171) | 406,015 (+5,489) | 890,389 (+10,660) |
| 2025-10-11 | 488,427 (+4,053) | 414,699 (+8,684) | 903,126 (+12,737) |
| 2025-10-12 | 492,125 (+3,698) | 418,745 (+4,046) | 910,870 (+7,744) |
| 2025-10-14 | 505,130 (+13,005) | 429,286 (+10,541) | 934,416 (+23,546) |
| 2025-10-15 | 512,717 (+7,587) | 439,290 (+10,004) | 952,007 (+17,591) |
| 2025-10-16 | 517,719 (+5,002) | 447,137 (+7,847) | 964,856 (+12,849) |
| 2025-10-17 | 526,239 (+8,520) | 457,467 (+10,330) | 983,706 (+18,850) |
| 2025-10-18 | 531,564 (+5,325) | 465,272 (+7,805) | 996,836 (+13,130) |
| 2025-10-19 | 536,209 (+4,645) | 469,078 (+3,806) | 1,005,287 (+8,451) |
| 2025-10-20 | 541,264 (+5,055) | 472,952 (+3,874) | 1,014,216 (+8,929) |
| 2025-10-21 | 548,721 (+7,457) | 479,703 (+6,751) | 1,028,424 (+14,208) |
| 2025-10-22 | 557,949 (+9,228) | 491,395 (+11,692) | 1,049,344 (+20,920) |
| 2025-10-23 | 564,716 (+6,767) | 498,736 (+7,341) | 1,063,452 (+14,108) |
| 2025-10-24 | 572,692 (+7,976) | 506,905 (+8,169) | 1,079,597 (+16,145) |
| 2025-10-25 | 578,927 (+6,235) | 516,129 (+9,224) | 1,095,056 (+15,459) |
| 2025-10-26 | 584,409 (+5,482) | 521,179 (+5,050) | 1,105,588 (+10,532) |
| 2025-10-27 | 589,999 (+5,590) | 526,001 (+4,822) | 1,116,000 (+10,412) |
| 2025-10-28 | 595,776 (+5,777) | 532,438 (+6,437) | 1,128,214 (+12,214) |
| 2025-10-29 | 606,259 (+10,483) | 542,064 (+9,626) | 1,148,323 (+20,109) |
| 2025-10-30 | 613,746 (+7,487) | 542,064 (+0) | 1,155,810 (+7,487) |
| 2025-10-30 | 617,846 (+4,100) | 555,026 (+12,962) | 1,172,872 (+17,062) |
| 2025-10-31 | 626,612 (+8,766) | 564,579 (+9,553) | 1,191,191 (+18,319) |
| 2025-11-01 | 636,100 (+9,488) | 581,806 (+17,227) | 1,217,906 (+26,715) |
| 2025-11-02 | 644,067 (+7,967) | 590,004 (+8,198) | 1,234,071 (+16,165) |
| 2025-11-03 | 653,130 (+9,063) | 597,139 (+7,135) | 1,250,269 (+16,198) |
| 2025-11-04 | 663,912 (+10,782) | 608,056 (+10,917) | 1,271,968 (+21,699) |
| 2025-11-05 | 675,074 (+11,162) | 619,690 (+11,634) | 1,294,764 (+22,796) |
| 2025-11-06 | 686,252 (+11,178) | 630,885 (+11,195) | 1,317,137 (+22,373) |
| 2025-11-07 | 696,646 (+10,394) | 642,146 (+11,261) | 1,338,792 (+21,655) |
| 2025-11-08 | 706,035 (+9,389) | 653,489 (+11,343) | 1,359,524 (+20,732) |
| 2025-11-09 | 713,462 (+7,427) | 660,459 (+6,970) | 1,373,921 (+14,397) |
| 2025-11-10 | 722,288 (+8,826) | 668,225 (+7,766) | 1,390,513 (+16,592) |
| 2025-11-11 | 729,769 (+7,481) | 677,501 (+9,276) | 1,407,270 (+16,757) |
| 2025-11-12 | 740,180 (+10,411) | 686,454 (+8,953) | 1,426,634 (+19,364) |
| Date | GitHub Downloads | npm Downloads | Total |
| ---------- | ------------------- | ----------------- | ------------------- |
| 2025-06-29 | 18,789 (+0) | 39,420 (+0) | 58,209 (+0) |
| 2025-06-30 | 20,127 (+1,338) | 41,059 (+1,639) | 61,186 (+2,977) |
| 2025-07-01 | 22,108 (+1,981) | 43,745 (+2,686) | 65,853 (+4,667) |
| 2025-07-02 | 24,814 (+2,706) | 46,168 (+2,423) | 70,982 (+5,129) |
| 2025-07-03 | 27,834 (+3,020) | 49,955 (+3,787) | 77,789 (+6,807) |
| 2025-07-04 | 30,608 (+2,774) | 54,758 (+4,803) | 85,366 (+7,577) |
| 2025-07-05 | 32,524 (+1,916) | 58,371 (+3,613) | 90,895 (+5,529) |
| 2025-07-06 | 33,766 (+1,242) | 59,694 (+1,323) | 93,460 (+2,565) |
| 2025-07-08 | 38,052 (+4,286) | 64,468 (+4,774) | 102,520 (+9,060) |
| 2025-07-09 | 40,924 (+2,872) | 67,935 (+3,467) | 108,859 (+6,339) |
| 2025-07-10 | 43,796 (+2,872) | 71,402 (+3,467) | 115,198 (+6,339) |
| 2025-07-11 | 46,982 (+3,186) | 77,462 (+6,060) | 124,444 (+9,246) |
| 2025-07-12 | 49,302 (+2,320) | 82,177 (+4,715) | 131,479 (+7,035) |
| 2025-07-13 | 50,803 (+1,501) | 86,394 (+4,217) | 137,197 (+5,718) |
| 2025-07-14 | 53,283 (+2,480) | 87,860 (+1,466) | 141,143 (+3,946) |
| 2025-07-15 | 57,590 (+4,307) | 91,036 (+3,176) | 148,626 (+7,483) |
| 2025-07-16 | 62,313 (+4,723) | 95,258 (+4,222) | 157,571 (+8,945) |
| 2025-07-17 | 66,684 (+4,371) | 100,048 (+4,790) | 166,732 (+9,161) |
| 2025-07-18 | 70,379 (+3,695) | 102,587 (+2,539) | 172,966 (+6,234) |
| 2025-07-19 | 73,497 (+3,117) | 105,904 (+3,317) | 179,401 (+6,434) |
| 2025-07-20 | 76,453 (+2,956) | 109,044 (+3,140) | 185,497 (+6,096) |
| 2025-07-21 | 80,197 (+3,744) | 113,537 (+4,493) | 193,734 (+8,237) |
| 2025-07-22 | 84,251 (+4,054) | 118,073 (+4,536) | 202,324 (+8,590) |
| 2025-07-23 | 88,589 (+4,338) | 121,436 (+3,363) | 210,025 (+7,701) |
| 2025-07-24 | 92,469 (+3,880) | 124,091 (+2,655) | 216,560 (+6,535) |
| 2025-07-25 | 96,417 (+3,948) | 126,985 (+2,894) | 223,402 (+6,842) |
| 2025-07-26 | 100,646 (+4,229) | 131,411 (+4,426) | 232,057 (+8,655) |
| 2025-07-27 | 102,644 (+1,998) | 134,736 (+3,325) | 237,380 (+5,323) |
| 2025-07-28 | 105,446 (+2,802) | 136,016 (+1,280) | 241,462 (+4,082) |
| 2025-07-29 | 108,998 (+3,552) | 137,542 (+1,526) | 246,540 (+5,078) |
| 2025-07-30 | 113,544 (+4,546) | 140,317 (+2,775) | 253,861 (+7,321) |
| 2025-07-31 | 118,339 (+4,795) | 143,344 (+3,027) | 261,683 (+7,822) |
| 2025-08-01 | 123,539 (+5,200) | 146,680 (+3,336) | 270,219 (+8,536) |
| 2025-08-02 | 127,864 (+4,325) | 149,236 (+2,556) | 277,100 (+6,881) |
| 2025-08-03 | 131,397 (+3,533) | 150,451 (+1,215) | 281,848 (+4,748) |
| 2025-08-04 | 136,266 (+4,869) | 153,260 (+2,809) | 289,526 (+7,678) |
| 2025-08-05 | 141,596 (+5,330) | 155,752 (+2,492) | 297,348 (+7,822) |
| 2025-08-06 | 147,067 (+5,471) | 158,309 (+2,557) | 305,376 (+8,028) |
| 2025-08-07 | 152,591 (+5,524) | 160,889 (+2,580) | 313,480 (+8,104) |
| 2025-08-08 | 158,187 (+5,596) | 163,448 (+2,559) | 321,635 (+8,155) |
| 2025-08-09 | 162,770 (+4,583) | 165,721 (+2,273) | 328,491 (+6,856) |
| 2025-08-10 | 165,695 (+2,925) | 167,109 (+1,388) | 332,804 (+4,313) |
| 2025-08-11 | 169,297 (+3,602) | 167,953 (+844) | 337,250 (+4,446) |
| 2025-08-12 | 176,307 (+7,010) | 171,876 (+3,923) | 348,183 (+10,933) |
| 2025-08-13 | 182,997 (+6,690) | 177,182 (+5,306) | 360,179 (+11,996) |
| 2025-08-14 | 189,063 (+6,066) | 179,741 (+2,559) | 368,804 (+8,625) |
| 2025-08-15 | 193,608 (+4,545) | 181,792 (+2,051) | 375,400 (+6,596) |
| 2025-08-16 | 198,118 (+4,510) | 184,558 (+2,766) | 382,676 (+7,276) |
| 2025-08-17 | 201,299 (+3,181) | 186,269 (+1,711) | 387,568 (+4,892) |
| 2025-08-18 | 204,559 (+3,260) | 187,399 (+1,130) | 391,958 (+4,390) |
| 2025-08-19 | 209,814 (+5,255) | 189,668 (+2,269) | 399,482 (+7,524) |
| 2025-08-20 | 214,497 (+4,683) | 191,481 (+1,813) | 405,978 (+6,496) |
| 2025-08-21 | 220,465 (+5,968) | 194,784 (+3,303) | 415,249 (+9,271) |
| 2025-08-22 | 225,899 (+5,434) | 197,204 (+2,420) | 423,103 (+7,854) |
| 2025-08-23 | 229,005 (+3,106) | 199,238 (+2,034) | 428,243 (+5,140) |
| 2025-08-24 | 232,098 (+3,093) | 201,157 (+1,919) | 433,255 (+5,012) |
| 2025-08-25 | 236,607 (+4,509) | 202,650 (+1,493) | 439,257 (+6,002) |
| 2025-08-26 | 242,783 (+6,176) | 205,242 (+2,592) | 448,025 (+8,768) |
| 2025-08-27 | 248,409 (+5,626) | 205,242 (+0) | 453,651 (+5,626) |
| 2025-08-28 | 252,796 (+4,387) | 205,242 (+0) | 458,038 (+4,387) |
| 2025-08-29 | 256,045 (+3,249) | 211,075 (+5,833) | 467,120 (+9,082) |
| 2025-08-30 | 258,863 (+2,818) | 212,397 (+1,322) | 471,260 (+4,140) |
| 2025-08-31 | 262,004 (+3,141) | 213,944 (+1,547) | 475,948 (+4,688) |
| 2025-09-01 | 265,359 (+3,355) | 215,115 (+1,171) | 480,474 (+4,526) |
| 2025-09-02 | 270,483 (+5,124) | 217,075 (+1,960) | 487,558 (+7,084) |
| 2025-09-03 | 274,793 (+4,310) | 219,755 (+2,680) | 494,548 (+6,990) |
| 2025-09-04 | 280,430 (+5,637) | 222,103 (+2,348) | 502,533 (+7,985) |
| 2025-09-05 | 283,769 (+3,339) | 223,793 (+1,690) | 507,562 (+5,029) |
| 2025-09-06 | 286,245 (+2,476) | 225,036 (+1,243) | 511,281 (+3,719) |
| 2025-09-07 | 288,623 (+2,378) | 225,866 (+830) | 514,489 (+3,208) |
| 2025-09-08 | 293,341 (+4,718) | 227,073 (+1,207) | 520,414 (+5,925) |
| 2025-09-09 | 300,036 (+6,695) | 229,788 (+2,715) | 529,824 (+9,410) |
| 2025-09-10 | 307,287 (+7,251) | 233,435 (+3,647) | 540,722 (+10,898) |
| 2025-09-11 | 314,083 (+6,796) | 237,356 (+3,921) | 551,439 (+10,717) |
| 2025-09-12 | 321,046 (+6,963) | 240,728 (+3,372) | 561,774 (+10,335) |
| 2025-09-13 | 324,894 (+3,848) | 245,539 (+4,811) | 570,433 (+8,659) |
| 2025-09-14 | 328,876 (+3,982) | 248,245 (+2,706) | 577,121 (+6,688) |
| 2025-09-15 | 334,201 (+5,325) | 250,983 (+2,738) | 585,184 (+8,063) |
| 2025-09-16 | 342,609 (+8,408) | 255,264 (+4,281) | 597,873 (+12,689) |
| 2025-09-17 | 351,117 (+8,508) | 260,970 (+5,706) | 612,087 (+14,214) |
| 2025-09-18 | 358,717 (+7,600) | 266,922 (+5,952) | 625,639 (+13,552) |
| 2025-09-19 | 365,401 (+6,684) | 271,859 (+4,937) | 637,260 (+11,621) |
| 2025-09-20 | 372,092 (+6,691) | 276,917 (+5,058) | 649,009 (+11,749) |
| 2025-09-21 | 377,079 (+4,987) | 280,261 (+3,344) | 657,340 (+8,331) |
| 2025-09-22 | 382,492 (+5,413) | 284,009 (+3,748) | 666,501 (+9,161) |
| 2025-09-23 | 387,008 (+4,516) | 289,129 (+5,120) | 676,137 (+9,636) |
| 2025-09-24 | 393,325 (+6,317) | 294,927 (+5,798) | 688,252 (+12,115) |
| 2025-09-25 | 398,879 (+5,554) | 301,663 (+6,736) | 700,542 (+12,290) |
| 2025-09-26 | 404,334 (+5,455) | 306,713 (+5,050) | 711,047 (+10,505) |
| 2025-09-27 | 411,618 (+7,284) | 317,763 (+11,050) | 729,381 (+18,334) |
| 2025-09-28 | 414,910 (+3,292) | 322,522 (+4,759) | 737,432 (+8,051) |
| 2025-09-29 | 419,919 (+5,009) | 328,033 (+5,511) | 747,952 (+10,520) |
| 2025-09-30 | 427,991 (+8,072) | 336,472 (+8,439) | 764,463 (+16,511) |
| 2025-10-01 | 433,591 (+5,600) | 341,742 (+5,270) | 775,333 (+10,870) |
| 2025-10-02 | 440,852 (+7,261) | 348,099 (+6,357) | 788,951 (+13,618) |
| 2025-10-03 | 446,829 (+5,977) | 359,937 (+11,838) | 806,766 (+17,815) |
| 2025-10-04 | 452,561 (+5,732) | 370,386 (+10,449) | 822,947 (+16,181) |
| 2025-10-05 | 455,559 (+2,998) | 374,745 (+4,359) | 830,304 (+7,357) |
| 2025-10-06 | 460,927 (+5,368) | 379,489 (+4,744) | 840,416 (+10,112) |
| 2025-10-07 | 467,336 (+6,409) | 385,438 (+5,949) | 852,774 (+12,358) |
| 2025-10-08 | 474,643 (+7,307) | 394,139 (+8,701) | 868,782 (+16,008) |
| 2025-10-09 | 479,203 (+4,560) | 400,526 (+6,387) | 879,729 (+10,947) |
| 2025-10-10 | 484,374 (+5,171) | 406,015 (+5,489) | 890,389 (+10,660) |
| 2025-10-11 | 488,427 (+4,053) | 414,699 (+8,684) | 903,126 (+12,737) |
| 2025-10-12 | 492,125 (+3,698) | 418,745 (+4,046) | 910,870 (+7,744) |
| 2025-10-14 | 505,130 (+13,005) | 429,286 (+10,541) | 934,416 (+23,546) |
| 2025-10-15 | 512,717 (+7,587) | 439,290 (+10,004) | 952,007 (+17,591) |
| 2025-10-16 | 517,719 (+5,002) | 447,137 (+7,847) | 964,856 (+12,849) |
| 2025-10-17 | 526,239 (+8,520) | 457,467 (+10,330) | 983,706 (+18,850) |
| 2025-10-18 | 531,564 (+5,325) | 465,272 (+7,805) | 996,836 (+13,130) |
| 2025-10-19 | 536,209 (+4,645) | 469,078 (+3,806) | 1,005,287 (+8,451) |
| 2025-10-20 | 541,264 (+5,055) | 472,952 (+3,874) | 1,014,216 (+8,929) |
| 2025-10-21 | 548,721 (+7,457) | 479,703 (+6,751) | 1,028,424 (+14,208) |
| 2025-10-22 | 557,949 (+9,228) | 491,395 (+11,692) | 1,049,344 (+20,920) |
| 2025-10-23 | 564,716 (+6,767) | 498,736 (+7,341) | 1,063,452 (+14,108) |
| 2025-10-24 | 572,692 (+7,976) | 506,905 (+8,169) | 1,079,597 (+16,145) |
| 2025-10-25 | 578,927 (+6,235) | 516,129 (+9,224) | 1,095,056 (+15,459) |
| 2025-10-26 | 584,409 (+5,482) | 521,179 (+5,050) | 1,105,588 (+10,532) |
| 2025-10-27 | 589,999 (+5,590) | 526,001 (+4,822) | 1,116,000 (+10,412) |
| 2025-10-28 | 595,776 (+5,777) | 532,438 (+6,437) | 1,128,214 (+12,214) |
| 2025-10-29 | 606,259 (+10,483) | 542,064 (+9,626) | 1,148,323 (+20,109) |
| 2025-10-30 | 613,746 (+7,487) | 542,064 (+0) | 1,155,810 (+7,487) |
| 2025-10-30 | 617,846 (+4,100) | 555,026 (+12,962) | 1,172,872 (+17,062) |
| 2025-10-31 | 626,612 (+8,766) | 564,579 (+9,553) | 1,191,191 (+18,319) |
| 2025-11-01 | 636,100 (+9,488) | 581,806 (+17,227) | 1,217,906 (+26,715) |
| 2025-11-02 | 644,067 (+7,967) | 590,004 (+8,198) | 1,234,071 (+16,165) |
| 2025-11-03 | 653,130 (+9,063) | 597,139 (+7,135) | 1,250,269 (+16,198) |
| 2025-11-04 | 663,912 (+10,782) | 608,056 (+10,917) | 1,271,968 (+21,699) |
| 2025-11-05 | 675,074 (+11,162) | 619,690 (+11,634) | 1,294,764 (+22,796) |
| 2025-11-06 | 686,252 (+11,178) | 630,885 (+11,195) | 1,317,137 (+22,373) |
| 2025-11-07 | 696,646 (+10,394) | 642,146 (+11,261) | 1,338,792 (+21,655) |
| 2025-11-08 | 706,035 (+9,389) | 653,489 (+11,343) | 1,359,524 (+20,732) |
| 2025-11-09 | 713,462 (+7,427) | 660,459 (+6,970) | 1,373,921 (+14,397) |
| 2025-11-10 | 722,288 (+8,826) | 668,225 (+7,766) | 1,390,513 (+16,592) |
| 2025-11-11 | 729,769 (+7,481) | 677,501 (+9,276) | 1,407,270 (+16,757) |
| 2025-11-12 | 740,180 (+10,411) | 686,454 (+8,953) | 1,426,634 (+19,364) |
| 2025-11-13 | 749,905 (+9,725) | 696,157 (+9,703) | 1,446,062 (+19,428) |
| 2025-11-14 | 759,928 (+10,023) | 705,237 (+9,080) | 1,465,165 (+19,103) |
| 2025-11-15 | 765,955 (+6,027) | 712,870 (+7,633) | 1,478,825 (+13,660) |
| 2025-11-16 | 771,069 (+5,114) | 716,596 (+3,726) | 1,487,665 (+8,840) |
| 2025-11-17 | 780,161 (+9,092) | 723,339 (+6,743) | 1,503,500 (+15,835) |
| 2025-11-18 | 791,563 (+11,402) | 732,544 (+9,205) | 1,524,107 (+20,607) |
| 2025-11-19 | 804,409 (+12,846) | 747,624 (+15,080) | 1,552,033 (+27,926) |
| 2025-11-20 | 814,620 (+10,211) | 757,907 (+10,283) | 1,572,527 (+20,494) |
| 2025-11-21 | 826,309 (+11,689) | 769,307 (+11,400) | 1,595,616 (+23,089) |
| 2025-11-22 | 837,269 (+10,960) | 780,996 (+11,689) | 1,618,265 (+22,649) |
| 2025-11-23 | 846,609 (+9,340) | 795,069 (+14,073) | 1,641,678 (+23,413) |
| 2025-11-24 | 856,733 (+10,124) | 804,033 (+8,964) | 1,660,766 (+19,088) |
| 2025-11-25 | 869,423 (+12,690) | 817,339 (+13,306) | 1,686,762 (+25,996) |
| 2025-11-26 | 881,414 (+11,991) | 832,518 (+15,179) | 1,713,932 (+27,170) |
| 2025-11-27 | 893,960 (+12,546) | 846,180 (+13,662) | 1,740,140 (+26,208) |
| 2025-11-28 | 901,741 (+7,781) | 856,482 (+10,302) | 1,758,223 (+18,083) |
| 2025-11-29 | 908,689 (+6,948) | 863,361 (+6,879) | 1,772,050 (+13,827) |
| 2025-11-30 | 916,116 (+7,427) | 870,194 (+6,833) | 1,786,310 (+14,260) |
| 2025-12-01 | 925,898 (+9,782) | 876,500 (+6,306) | 1,802,398 (+16,088) |
| 2025-12-02 | 939,250 (+13,352) | 890,919 (+14,419) | 1,830,169 (+27,771) |
| 2025-12-03 | 952,249 (+12,999) | 903,713 (+12,794) | 1,855,962 (+25,793) |
| 2025-12-04 | 965,611 (+13,362) | 916,471 (+12,758) | 1,882,082 (+26,120) |
| 2025-12-05 | 977,996 (+12,385) | 930,616 (+14,145) | 1,908,612 (+26,530) |
| 2025-12-06 | 987,884 (+9,888) | 943,773 (+13,157) | 1,931,657 (+23,045) |
| 2025-12-07 | 994,046 (+6,162) | 951,425 (+7,652) | 1,945,471 (+13,814) |
| 2025-12-08 | 1,000,898 (+6,852) | 957,149 (+5,724) | 1,958,047 (+12,576) |
| 2025-12-09 | 1,011,488 (+10,590) | 973,922 (+16,773) | 1,985,410 (+27,363) |
| 2025-12-10 | 1,025,891 (+14,403) | 991,708 (+17,786) | 2,017,599 (+32,189) |
+12
View File
@@ -0,0 +1,12 @@
## Style Guide
- Try to keep things in one function unless composable or reusable
- DO NOT do unnecessary destructuring of variables
- DO NOT use `else` statements unless necessary
- DO NOT use `try`/`catch` if it can be avoided
- AVOID `try`/`catch` where possible
- AVOID `else` statements
- AVOID using `any` type
- AVOID `let` statements
- PREFER single word variable names where possible
- Use as many bun apis as possible like Bun.file()
+977 -676
View File
File diff suppressed because it is too large Load Diff
Generated
+27
View File
@@ -0,0 +1,27 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1765270179,
"narHash": "sha256-g2a4MhRKu4ymR4xwo+I+auTknXt/+j37Lnf0Mvfl1rE=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "677fbe97984e7af3175b6c121f3c39ee5c8d62c9",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}
+107
View File
@@ -0,0 +1,107 @@
{
description = "OpenCode development flake";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
};
outputs =
{
nixpkgs,
...
}:
let
systems = [
"aarch64-linux"
"x86_64-linux"
"aarch64-darwin"
"x86_64-darwin"
];
lib = nixpkgs.lib;
forEachSystem = lib.genAttrs systems;
pkgsFor = system: nixpkgs.legacyPackages.${system};
packageJson = builtins.fromJSON (builtins.readFile ./packages/opencode/package.json);
bunTarget = {
"aarch64-linux" = "bun-linux-arm64";
"x86_64-linux" = "bun-linux-x64";
"aarch64-darwin" = "bun-darwin-arm64";
"x86_64-darwin" = "bun-darwin-x64";
};
defaultNodeModules = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
hashesFile = "${./nix}/hashes.json";
hashesData =
if builtins.pathExists hashesFile then builtins.fromJSON (builtins.readFile hashesFile) else { };
nodeModulesHash = hashesData.nodeModules or defaultNodeModules;
modelsDev = forEachSystem (
system:
let
pkgs = pkgsFor system;
in
pkgs."models-dev"
);
in
{
devShells = forEachSystem (
system:
let
pkgs = pkgsFor system;
in
{
default = pkgs.mkShell {
packages = with pkgs; [
bun
nodejs_20
pkg-config
openssl
git
];
};
}
);
packages = forEachSystem (
system:
let
pkgs = pkgsFor system;
mkNodeModules = pkgs.callPackage ./nix/node-modules.nix {
hash = nodeModulesHash;
};
mkPackage = pkgs.callPackage ./nix/opencode.nix { };
in
{
default = mkPackage {
version = packageJson.version;
src = ./.;
scripts = ./nix/scripts;
target = bunTarget.${system};
modelsDev = "${modelsDev.${system}}/dist/_api.json";
mkNodeModules = mkNodeModules;
};
}
);
apps = forEachSystem (
system:
let
pkgs = pkgsFor system;
in
{
opencode-dev = {
type = "app";
meta = {
description = "Nix devshell shell for OpenCode";
runtimeInputs = [ pkgs.bun ];
};
program = "${
pkgs.writeShellApplication {
name = "opencode-dev";
text = ''
exec bun run dev "$@"
'';
}
}/bin/opencode-dev";
};
}
);
};
}
+26
View File
@@ -30,6 +30,24 @@ Leave the following comment on a GitHub PR. opencode will implement the requeste
Delete the attachment from S3 when the note is removed /oc
```
#### Review specific code lines
Leave a comment directly on code lines in the PR's "Files" tab. opencode will automatically detect the file, line numbers, and diff context to provide precise responses.
```
[Comment on specific lines in Files tab]
/oc add error handling here
```
When commenting on specific lines, opencode receives:
- The exact file being reviewed
- The specific lines of code
- The surrounding diff context
- Line number information
This allows for more targeted requests without needing to specify file paths or line numbers manually.
## Installation
Run the following command in the terminal from your GitHub repo:
@@ -51,6 +69,8 @@ This will walk you through installing the GitHub app, creating the workflow, and
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
jobs:
opencode:
@@ -135,3 +155,9 @@ Replace the image URL `https://github.com/user-attachments/assets/xxxxxxxx` with
```
MOCK_EVENT='{"eventName":"issue_comment","repo":{"owner":"sst","repo":"hello-world"},"actor":"fwang","payload":{"issue":{"number":4,"pull_request":{}},"comment":{"id":1,"body":"hey opencode, summarize thread"}}}'
```
### PR review comment event
```
MOCK_EVENT='{"eventName":"pull_request_review_comment","repo":{"owner":"sst","repo":"hello-world"},"actor":"fwang","payload":{"pull_request":{"number":7},"comment":{"id":1,"body":"hey opencode, add error handling","path":"src/components/Button.tsx","diff_hunk":"@@ -45,8 +45,11 @@\n- const handleClick = () => {\n- console.log('clicked')\n+ const handleClick = useCallback(() => {\n+ console.log('clicked')\n+ doSomething()\n+ }, [doSomething])","line":47,"original_line":45,"position":10,"commit_id":"abc123","original_commit_id":"def456"}}}'
```
+5
View File
@@ -13,6 +13,10 @@ inputs:
description: "Share the opencode session (defaults to true for public repos)"
required: false
prompt:
description: "Custom prompt to override the default prompt"
required: false
runs:
using: "composite"
steps:
@@ -27,3 +31,4 @@ runs:
env:
MODEL: ${{ inputs.model }}
SHARE: ${{ inputs.share }}
PROMPT: ${{ inputs.prompt }}
+44 -7
View File
@@ -5,7 +5,7 @@ import { graphql } from "@octokit/graphql"
import * as core from "@actions/core"
import * as github from "@actions/github"
import type { Context as GitHubContext } from "@actions/github/lib/context"
import type { IssueCommentEvent } from "@octokit/webhooks-types"
import type { IssueCommentEvent, PullRequestReviewCommentEvent } from "@octokit/webhooks-types"
import { createOpencodeClient } from "@opencode-ai/sdk"
import { spawn } from "node:child_process"
@@ -124,7 +124,7 @@ let exitCode = 0
type PromptFiles = Awaited<ReturnType<typeof getUserPrompt>>["promptFiles"]
try {
assertContextEvent("issue_comment")
assertContextEvent("issue_comment", "pull_request_review_comment")
assertPayloadKeyword()
await assertOpencodeConnected()
@@ -241,19 +241,43 @@ function createOpencode() {
}
function assertPayloadKeyword() {
const payload = useContext().payload as IssueCommentEvent
const payload = useContext().payload as IssueCommentEvent | PullRequestReviewCommentEvent
const body = payload.comment.body.trim()
if (!body.match(/(?:^|\s)(?:\/opencode|\/oc)(?=$|\s)/)) {
throw new Error("Comments must mention `/opencode` or `/oc`")
}
}
function getReviewCommentContext() {
const context = useContext()
if (context.eventName !== "pull_request_review_comment") {
return null
}
const payload = context.payload as PullRequestReviewCommentEvent
return {
file: payload.comment.path,
diffHunk: payload.comment.diff_hunk,
line: payload.comment.line,
originalLine: payload.comment.original_line,
position: payload.comment.position,
commitId: payload.comment.commit_id,
originalCommitId: payload.comment.original_commit_id,
}
}
async function assertOpencodeConnected() {
let retry = 0
let connected = false
do {
try {
await client.app.get<true>()
await client.app.log<true>({
body: {
service: "github-workflow",
level: "info",
message: "Prepare to react to Github Workflow event",
},
})
connected = true
break
} catch (e) {}
@@ -383,11 +407,24 @@ async function createComment() {
}
async function getUserPrompt() {
const context = useContext()
const payload = context.payload as IssueCommentEvent | PullRequestReviewCommentEvent
const reviewContext = getReviewCommentContext()
let prompt = (() => {
const payload = useContext().payload as IssueCommentEvent
const body = payload.comment.body.trim()
if (body === "/opencode" || body === "/oc") return "Summarize this thread"
if (body.includes("/opencode") || body.includes("/oc")) return body
if (body === "/opencode" || body === "/oc") {
if (reviewContext) {
return `Review this code change and suggest improvements for the commented lines:\n\nFile: ${reviewContext.file}\nLines: ${reviewContext.line}\n\n${reviewContext.diffHunk}`
}
return "Summarize this thread"
}
if (body.includes("/opencode") || body.includes("/oc")) {
if (reviewContext) {
return `${body}\n\nContext: You are reviewing a comment on file "${reviewContext.file}" at line ${reviewContext.line}.\n\nDiff context:\n${reviewContext.diffHunk}`
}
return body
}
throw new Error("Comments must mention `/opencode` or `/oc`")
})()
+1 -1
View File
@@ -6,4 +6,4 @@
/// <reference path="../sst-env.d.ts" />
import "sst"
export {}
export {}
+10 -4
View File
@@ -97,8 +97,12 @@ export const stripeWebhook = new stripe.WebhookEndpoint("StripeWebhookEndpoint",
],
})
const ZEN_MODELS1 = new sst.Secret("ZEN_MODELS1")
const ZEN_MODELS2 = new sst.Secret("ZEN_MODELS2")
const ZEN_MODELS = [
new sst.Secret("ZEN_MODELS1"),
new sst.Secret("ZEN_MODELS2"),
new sst.Secret("ZEN_MODELS3"),
new sst.Secret("ZEN_MODELS4"),
]
const STRIPE_SECRET_KEY = new sst.Secret("STRIPE_SECRET_KEY")
const AUTH_API_URL = new sst.Linkable("AUTH_API_URL", {
properties: { value: auth.url.apply((url) => url!) },
@@ -112,6 +116,8 @@ const gatewayKv = new sst.cloudflare.Kv("GatewayKv")
// CONSOLE
////////////////
const bucket = new sst.cloudflare.Bucket("ZenData")
const AWS_SES_ACCESS_KEY_ID = new sst.Secret("AWS_SES_ACCESS_KEY_ID")
const AWS_SES_SECRET_ACCESS_KEY = new sst.Secret("AWS_SES_SECRET_ACCESS_KEY")
@@ -128,15 +134,15 @@ new sst.cloudflare.x.SolidStart("Console", {
domain,
path: "packages/console/app",
link: [
bucket,
database,
AUTH_API_URL,
STRIPE_WEBHOOK_SECRET,
STRIPE_SECRET_KEY,
ZEN_MODELS1,
ZEN_MODELS2,
EMAILOCTOPUS_API_KEY,
AWS_SES_ACCESS_KEY_ID,
AWS_SES_SECRET_ACCESS_KEY,
...ZEN_MODELS,
...($dev
? [
new sst.Secret("CLOUDFLARE_DEFAULT_ACCOUNT_ID", process.env.CLOUDFLARE_DEFAULT_ACCOUNT_ID!),
+17
View File
@@ -0,0 +1,17 @@
import { SECRET } from "./secret"
import { domain } from "./stage"
const storage = new sst.cloudflare.Bucket("EnterpriseStorage")
const enterprise = new sst.cloudflare.x.SolidStart("Enterprise", {
domain: "enterprise." + domain,
path: "packages/enterprise",
buildCommand: "bun run build:cloudflare",
environment: {
OPENCODE_STORAGE_ADAPTER: "r2",
OPENCODE_STORAGE_ACCOUNT_ID: sst.cloudflare.DEFAULT_ACCOUNT_ID,
OPENCODE_STORAGE_ACCESS_KEY_ID: SECRET.R2AccessKey.value,
OPENCODE_STORAGE_SECRET_ACCESS_KEY: SECRET.R2SecretKey.value,
OPENCODE_STORAGE_BUCKET: storage.name,
},
})
+4
View File
@@ -0,0 +1,4 @@
export const SECRET = {
R2AccessKey: new sst.Secret("R2AccessKey", "unknown"),
R2SecretKey: new sst.Secret("R2SecretKey", "unknown"),
}
+200 -29
View File
@@ -2,49 +2,103 @@
set -euo pipefail
APP=opencode
MUTED='\033[0;2m'
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
ORANGE='\033[38;2;255;140;0m'
ORANGE='\033[38;5;214m'
NC='\033[0m' # No Color
requested_version=${VERSION:-}
raw_os=$(uname -s)
os=$(echo "$raw_os" | tr '[:upper:]' '[:lower:]')
# Normalize various Unix-like identifiers
case "$raw_os" in
Darwin*) os="darwin" ;;
Linux*) os="linux" ;;
MINGW*|MSYS*|CYGWIN*) os="windows" ;;
esac
arch=$(uname -m)
esac
arch=$(uname -m)
if [[ "$arch" == "aarch64" ]]; then
arch="arm64"
elif [[ "$arch" == "x86_64" ]]; then
fi
if [[ "$arch" == "x86_64" ]]; then
arch="x64"
fi
filename="$APP-$os-$arch.zip"
if [ "$os" = "darwin" ] && [ "$arch" = "x64" ]; then
rosetta_flag=$(sysctl -n sysctl.proc_translated 2>/dev/null || echo 0)
if [ "$rosetta_flag" = "1" ]; then
arch="arm64"
fi
fi
case "$filename" in
*"-linux-"*)
[[ "$arch" == "x64" || "$arch" == "arm64" ]] || exit 1
combo="$os-$arch"
case "$combo" in
linux-x64|linux-arm64|darwin-x64|darwin-arm64|windows-x64)
;;
*"-darwin-"*)
[[ "$arch" == "x64" || "$arch" == "arm64" ]] || exit 1
;;
*"-windows-"*)
[[ "$arch" == "x64" ]] || exit 1
;;
*)
echo -e "${RED}Unsupported OS/Arch: $os/$arch${NC}"
exit 1
*)
echo -e "${RED}Unsupported OS/Arch: $os/$arch${NC}"
exit 1
;;
esac
archive_ext=".zip"
if [ "$os" = "linux" ]; then
archive_ext=".tar.gz"
fi
is_musl=false
if [ "$os" = "linux" ]; then
if [ -f /etc/alpine-release ]; then
is_musl=true
fi
if command -v ldd >/dev/null 2>&1; then
if ldd --version 2>&1 | grep -qi musl; then
is_musl=true
fi
fi
fi
needs_baseline=false
if [ "$arch" = "x64" ]; then
if [ "$os" = "linux" ]; then
if ! grep -qi avx2 /proc/cpuinfo 2>/dev/null; then
needs_baseline=true
fi
fi
if [ "$os" = "darwin" ]; then
avx2=$(sysctl -n hw.optional.avx2_0 2>/dev/null || echo 0)
if [ "$avx2" != "1" ]; then
needs_baseline=true
fi
fi
fi
target="$os-$arch"
if [ "$needs_baseline" = "true" ]; then
target="$target-baseline"
fi
if [ "$is_musl" = "true" ]; then
target="$target-musl"
fi
filename="$APP-$target$archive_ext"
if [ "$os" = "linux" ]; then
if ! command -v tar >/dev/null 2>&1; then
echo -e "${RED}Error: 'tar' is required but not installed.${NC}"
exit 1
fi
else
if ! command -v unzip >/dev/null 2>&1; then
echo -e "${RED}Error: 'unzip' is required but not installed.${NC}"
exit 1
fi
fi
INSTALL_DIR=$HOME/.opencode/bin
mkdir -p "$INSTALL_DIR"
@@ -67,8 +121,8 @@ print_message() {
local color=""
case $level in
info) color="${GREEN}" ;;
warning) color="${YELLOW}" ;;
info) color="${NC}" ;;
warning) color="${NC}" ;;
error) color="${RED}" ;;
esac
@@ -86,19 +140,119 @@ check_version() {
installed_version=$(echo $installed_version | awk '{print $2}')
if [[ "$installed_version" != "$specific_version" ]]; then
print_message info "Installed version: ${YELLOW}$installed_version."
print_message info "${MUTED}Installed version: ${NC}$installed_version."
else
print_message info "Version ${YELLOW}$specific_version${GREEN} already installed"
print_message info "${MUTED}Version ${NC}$specific_version${MUTED} already installed"
exit 0
fi
fi
}
unbuffered_sed() {
if echo | sed -u -e "" >/dev/null 2>&1; then
sed -nu "$@"
elif echo | sed -l -e "" >/dev/null 2>&1; then
sed -nl "$@"
else
local pad="$(printf "\n%512s" "")"
sed -ne "s/$/\\${pad}/" "$@"
fi
}
print_progress() {
local bytes="$1"
local length="$2"
[ "$length" -gt 0 ] || return 0
local width=50
local percent=$(( bytes * 100 / length ))
[ "$percent" -gt 100 ] && percent=100
local on=$(( percent * width / 100 ))
local off=$(( width - on ))
local filled=$(printf "%*s" "$on" "")
filled=${filled// /■}
local empty=$(printf "%*s" "$off" "")
empty=${empty// /・}
printf "\r${ORANGE}%s%s %3d%%${NC}" "$filled" "$empty" "$percent" >&4
}
download_with_progress() {
local url="$1"
local output="$2"
if [ -t 2 ]; then
exec 4>&2
else
exec 4>/dev/null
fi
local tmp_dir=${TMPDIR:-/tmp}
local basename="${tmp_dir}/opencode_install_$$"
local tracefile="${basename}.trace"
rm -f "$tracefile"
mkfifo "$tracefile"
# Hide cursor
printf "\033[?25l" >&4
trap "trap - RETURN; rm -f \"$tracefile\"; printf '\033[?25h' >&4; exec 4>&-" RETURN
(
curl --trace-ascii "$tracefile" -s -L -o "$output" "$url"
) &
local curl_pid=$!
unbuffered_sed \
-e 'y/ACDEGHLNORTV/acdeghlnortv/' \
-e '/^0000: content-length:/p' \
-e '/^<= recv data/p' \
"$tracefile" | \
{
local length=0
local bytes=0
while IFS=" " read -r -a line; do
[ "${#line[@]}" -lt 2 ] && continue
local tag="${line[0]} ${line[1]}"
if [ "$tag" = "0000: content-length:" ]; then
length="${line[2]}"
length=$(echo "$length" | tr -d '\r')
bytes=0
elif [ "$tag" = "<= recv" ]; then
local size="${line[3]}"
bytes=$(( bytes + size ))
if [ "$length" -gt 0 ]; then
print_progress "$bytes" "$length"
fi
fi
done
}
wait $curl_pid
local ret=$?
echo "" >&4
return $ret
}
download_and_install() {
print_message info "Downloading ${ORANGE}opencode ${GREEN}version: ${YELLOW}$specific_version ${GREEN}..."
print_message info "\n${MUTED}Installing ${NC}opencode ${MUTED}version: ${NC}$specific_version"
mkdir -p opencodetmp && cd opencodetmp
curl -# -L -o "$filename" "$url"
unzip -q "$filename"
if [[ "$os" == "windows" ]] || ! download_with_progress "$url" "$filename"; then
# Fallback to standard curl on Windows or if custom progress fails
curl -# -L -o "$filename" "$url"
fi
if [ "$os" = "linux" ]; then
tar -xzf "$filename"
else
unzip -q "$filename"
fi
mv opencode "$INSTALL_DIR"
chmod 755 "${INSTALL_DIR}/opencode"
cd .. && rm -rf opencodetmp
@@ -117,7 +271,7 @@ add_to_path() {
elif [[ -w $config_file ]]; then
echo -e "\n# opencode" >> "$config_file"
echo "$command" >> "$config_file"
print_message info "Successfully added ${ORANGE}opencode ${GREEN}to \$PATH in $config_file"
print_message info "${MUTED}Successfully added ${NC}opencode ${MUTED}to \$PATH in ${NC}$config_file"
else
print_message warning "Manually add the directory to $config_file (or similar):"
print_message info " $command"
@@ -191,3 +345,20 @@ if [ -n "${GITHUB_ACTIONS-}" ] && [ "${GITHUB_ACTIONS}" == "true" ]; then
echo "$INSTALL_DIR" >> $GITHUB_PATH
print_message info "Added $INSTALL_DIR to \$GITHUB_PATH"
fi
echo -e ""
echo -e "${MUTED}  ${NC} ▄ "
echo -e "${MUTED}█▀▀█ █▀▀█ █▀▀█ █▀▀▄ ${NC}█▀▀▀ █▀▀█ █▀▀█ █▀▀█"
echo -e "${MUTED}█░░█ █░░█ █▀▀▀ █░░█ ${NC}█░░░ █░░█ █░░█ █▀▀▀"
echo -e "${MUTED}▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀ ▀ ${NC}▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀"
echo -e ""
echo -e ""
echo -e "${MUTED}OpenCode includes free models, to start:${NC}"
echo -e ""
echo -e "cd <project> ${MUTED}# Open directory${NC}"
echo -e "opencode ${MUTED}# Run command${NC}"
echo -e ""
echo -e "${MUTED}For more information visit ${NC}https://opencode.ai/docs"
echo -e ""
echo -e ""
+40
View File
@@ -0,0 +1,40 @@
#!/usr/bin/env bun
import solidPlugin from "./node_modules/@opentui/solid/scripts/solid-plugin"
import path from "path"
import fs from "fs"
const dir = process.cwd()
const parser = fs.realpathSync(path.join(dir, "node_modules/@opentui/core/parser.worker.js"))
const worker = "./src/cli/cmd/tui/worker.ts"
const version = process.env.OPENCODE_VERSION ?? "local"
const channel = process.env.OPENCODE_CHANNEL ?? "local"
fs.rmSync(path.join(dir, "dist"), { recursive: true, force: true })
const result = await Bun.build({
entrypoints: ["./src/index.ts", worker, parser],
outdir: "./dist",
target: "bun",
sourcemap: "none",
tsconfig: "./tsconfig.json",
plugins: [solidPlugin],
external: ["@opentui/core"],
define: {
OPENCODE_VERSION: `'${version}'`,
OPENCODE_CHANNEL: `'${channel}'`,
// Leave undefined so runtime picks bundled/dist worker or fallback in code.
OPENCODE_WORKER_PATH: "undefined",
OTUI_TREE_SITTER_WORKER_PATH: 'new URL("./cli/cmd/tui/parser.worker.js", import.meta.url).href',
},
})
if (!result.success) {
console.error("bundle failed")
for (const log of result.logs) console.error(log)
process.exit(1)
}
const parserOut = path.join(dir, "dist/src/cli/cmd/tui/parser.worker.js")
fs.mkdirSync(path.dirname(parserOut), { recursive: true })
await Bun.write(parserOut, Bun.file(parser))
+3
View File
@@ -0,0 +1,3 @@
{
"nodeModules": "sha256-JT8J+Nd2kk0x46BcyotmBbM39tuKOW7VzXfOV3R3sqQ="
}
+52
View File
@@ -0,0 +1,52 @@
{ hash, lib, stdenvNoCC, bun, cacert, curl }:
args:
stdenvNoCC.mkDerivation {
pname = "opencode-node_modules";
version = args.version;
src = args.src;
impureEnvVars =
lib.fetchers.proxyImpureEnvVars
++ [
"GIT_PROXY_COMMAND"
"SOCKS_SERVER"
];
nativeBuildInputs = [ bun cacert curl ];
dontConfigure = true;
buildPhase = ''
runHook preBuild
export HOME=$(mktemp -d)
export BUN_INSTALL_CACHE_DIR=$(mktemp -d)
bun install \
--cpu="*" \
--os="*" \
--frozen-lockfile \
--ignore-scripts \
--no-progress \
--linker=isolated
bun --bun ${args.canonicalizeScript}
bun --bun ${args.normalizeBinsScript}
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out
while IFS= read -r dir; do
rel="''${dir#./}"
dest="$out/$rel"
mkdir -p "$(dirname "$dest")"
cp -R "$dir" "$dest"
done < <(find . -type d -name node_modules -prune | sort)
runHook postInstall
'';
dontFixup = true;
outputHashAlgo = "sha256";
outputHashMode = "recursive";
outputHash = hash;
}
+135
View File
@@ -0,0 +1,135 @@
{ lib, stdenvNoCC, bun, ripgrep, makeBinaryWrapper }:
args:
let
scripts = args.scripts;
mkModules =
attrs:
args.mkNodeModules (
attrs
// {
canonicalizeScript = scripts + "/canonicalize-node-modules.ts";
normalizeBinsScript = scripts + "/normalize-bun-binaries.ts";
}
);
in
stdenvNoCC.mkDerivation (finalAttrs: {
pname = "opencode";
version = args.version;
src = args.src;
node_modules = mkModules {
version = finalAttrs.version;
src = finalAttrs.src;
};
nativeBuildInputs = [
bun
makeBinaryWrapper
];
env.MODELS_DEV_API_JSON = args.modelsDev;
env.OPENCODE_VERSION = args.version;
env.OPENCODE_CHANNEL = "stable";
dontConfigure = true;
buildPhase = ''
runHook preBuild
cp -r ${finalAttrs.node_modules}/node_modules .
cp -r ${finalAttrs.node_modules}/packages .
(
cd packages/opencode
chmod -R u+w ./node_modules
mkdir -p ./node_modules/@opencode-ai
rm -f ./node_modules/@opencode-ai/{script,sdk,plugin}
ln -s $(pwd)/../../packages/script ./node_modules/@opencode-ai/script
ln -s $(pwd)/../../packages/sdk/js ./node_modules/@opencode-ai/sdk
ln -s $(pwd)/../../packages/plugin ./node_modules/@opencode-ai/plugin
cp ${./bundle.ts} ./bundle.ts
chmod +x ./bundle.ts
bun run ./bundle.ts
)
runHook postBuild
'';
installPhase = ''
runHook preInstall
cd packages/opencode
if [ ! -d dist ]; then
echo "ERROR: dist directory missing after bundle step"
exit 1
fi
mkdir -p $out/lib/opencode
cp -r dist $out/lib/opencode/
chmod -R u+w $out/lib/opencode/dist
# Select bundled worker assets deterministically (sorted find output)
worker_file=$(find "$out/lib/opencode/dist" -type f \( -path '*/tui/worker.*' -o -name 'worker.*' \) | sort | head -n1)
parser_worker_file=$(find "$out/lib/opencode/dist" -type f -name 'parser.worker.*' | sort | head -n1)
if [ -z "$worker_file" ]; then
echo "ERROR: bundled worker not found"
exit 1
fi
main_wasm=$(printf '%s\n' "$out"/lib/opencode/dist/tree-sitter-*.wasm | sort | head -n1)
wasm_list=$(find "$out/lib/opencode/dist" -maxdepth 1 -name 'tree-sitter-*.wasm' -print)
for patch_file in "$worker_file" "$parser_worker_file"; do
[ -z "$patch_file" ] && continue
[ ! -f "$patch_file" ] && continue
if [ -n "$wasm_list" ] && grep -q 'tree-sitter' "$patch_file"; then
# Rewrite wasm references to absolute store paths to avoid runtime resolve failures.
bun --bun ${scripts + "/patch-wasm.ts"} "$patch_file" "$main_wasm" $wasm_list
fi
done
mkdir -p $out/lib/opencode/node_modules
cp -r ../../node_modules/.bun $out/lib/opencode/node_modules/
mkdir -p $out/lib/opencode/node_modules/@opentui
mkdir -p $out/bin
makeWrapper ${bun}/bin/bun $out/bin/opencode \
--add-flags "run" \
--add-flags "$out/lib/opencode/dist/src/index.js" \
--prefix PATH : ${lib.makeBinPath [ ripgrep ]} \
--argv0 opencode
runHook postInstall
'';
postInstall = ''
for pkg in $out/lib/opencode/node_modules/.bun/@opentui+core-* $out/lib/opencode/node_modules/.bun/@opentui+solid-* $out/lib/opencode/node_modules/.bun/@opentui+core@* $out/lib/opencode/node_modules/.bun/@opentui+solid@*; do
if [ -d "$pkg" ]; then
pkgName=$(basename "$pkg" | sed 's/@opentui+\([^@]*\)@.*/\1/')
ln -sf ../.bun/$(basename "$pkg")/node_modules/@opentui/$pkgName \
$out/lib/opencode/node_modules/@opentui/$pkgName
fi
done
'';
dontFixup = true;
meta = {
description = "AI coding agent built for the terminal";
longDescription = ''
OpenCode is a terminal-based agent that can build anything.
It combines a TypeScript/JavaScript core with a Go-based TUI
to provide an interactive AI coding experience.
'';
homepage = "https://github.com/sst/opencode";
license = lib.licenses.mit;
platforms = [
"aarch64-linux"
"x86_64-linux"
"aarch64-darwin"
"x86_64-darwin"
];
mainProgram = "opencode";
};
})
+115
View File
@@ -0,0 +1,115 @@
import solidPlugin from "./packages/opencode/node_modules/@opentui/solid/scripts/solid-plugin"
import path from "path"
import fs from "fs"
const version = "@VERSION@"
const pkg = path.join(process.cwd(), "packages/opencode")
const parser = fs.realpathSync(path.join(pkg, "./node_modules/@opentui/core/parser.worker.js"))
const worker = "./src/cli/cmd/tui/worker.ts"
const target = process.env["BUN_COMPILE_TARGET"]
if (!target) {
throw new Error("BUN_COMPILE_TARGET not set")
}
process.chdir(pkg)
const manifestName = "opencode-assets.manifest"
const manifestPath = path.join(pkg, manifestName)
const readTrackedAssets = () => {
if (!fs.existsSync(manifestPath)) return []
return fs
.readFileSync(manifestPath, "utf8")
.split("\n")
.map((line) => line.trim())
.filter((line) => line.length > 0)
}
const removeTrackedAssets = () => {
for (const file of readTrackedAssets()) {
const filePath = path.join(pkg, file)
if (fs.existsSync(filePath)) {
fs.rmSync(filePath, { force: true })
}
}
}
const assets = new Set<string>()
const addAsset = async (p: string) => {
const file = path.basename(p)
const dest = path.join(pkg, file)
await Bun.write(dest, Bun.file(p))
assets.add(file)
}
removeTrackedAssets()
const result = await Bun.build({
conditions: ["browser"],
tsconfig: "./tsconfig.json",
plugins: [solidPlugin],
sourcemap: "external",
entrypoints: ["./src/index.ts", parser, worker],
define: {
OPENCODE_VERSION: `'@VERSION@'`,
OTUI_TREE_SITTER_WORKER_PATH: "/$bunfs/root/" + path.relative(pkg, parser).replace(/\\/g, "/"),
OPENCODE_CHANNEL: "'latest'",
},
compile: {
target,
outfile: "opencode",
execArgv: ["--user-agent=opencode/" + version, '--env-file=""', "--"],
windows: {},
},
})
if (!result.success) {
console.error("Build failed!")
for (const log of result.logs) {
console.error(log)
}
throw new Error("Compilation failed")
}
const assetOutputs = result.outputs?.filter((x) => x.kind === "asset") ?? []
for (const x of assetOutputs) {
await addAsset(x.path)
}
const bundle = await Bun.build({
entrypoints: [worker],
tsconfig: "./tsconfig.json",
plugins: [solidPlugin],
target: "bun",
outdir: "./.opencode-worker",
sourcemap: "none",
})
if (!bundle.success) {
console.error("Worker build failed!")
for (const log of bundle.logs) {
console.error(log)
}
throw new Error("Worker compilation failed")
}
const workerAssets = bundle.outputs?.filter((x) => x.kind === "asset") ?? []
for (const x of workerAssets) {
await addAsset(x.path)
}
const output = bundle.outputs.find((x) => x.kind === "entry-point")
if (!output) {
throw new Error("Worker build produced no entry-point output")
}
const dest = path.join(pkg, "opencode-worker.js")
await Bun.write(dest, Bun.file(output.path))
fs.rmSync(path.dirname(output.path), { recursive: true, force: true })
const list = Array.from(assets)
await Bun.write(manifestPath, list.length > 0 ? list.join("\n") + "\n" : "")
console.log("Build successful!")
+113
View File
@@ -0,0 +1,113 @@
import { lstat, mkdir, readdir, rm, symlink } from "fs/promises"
import { join, relative } from "path"
type SemverLike = {
valid: (value: string) => string | null
rcompare: (left: string, right: string) => number
}
type Entry = {
dir: string
version: string
label: string
}
const root = process.cwd()
const bunRoot = join(root, "node_modules/.bun")
const linkRoot = join(bunRoot, "node_modules")
const directories = (await readdir(bunRoot)).sort()
const versions = new Map<string, Entry[]>()
for (const entry of directories) {
const full = join(bunRoot, entry)
const info = await lstat(full)
if (!info.isDirectory()) {
continue
}
const parsed = parseEntry(entry)
if (!parsed) {
continue
}
const list = versions.get(parsed.name) ?? []
list.push({ dir: full, version: parsed.version, label: entry })
versions.set(parsed.name, list)
}
const semverModule = (await import(join(bunRoot, "node_modules/semver"))) as
| SemverLike
| {
default: SemverLike
}
const semver = "default" in semverModule ? semverModule.default : semverModule
const selections = new Map<string, Entry>()
for (const [slug, list] of versions) {
list.sort((a, b) => {
const left = semver.valid(a.version)
const right = semver.valid(b.version)
if (left && right) {
const delta = semver.rcompare(left, right)
if (delta !== 0) {
return delta
}
}
if (left && !right) {
return -1
}
if (!left && right) {
return 1
}
return b.version.localeCompare(a.version)
})
selections.set(slug, list[0])
}
await rm(linkRoot, { recursive: true, force: true })
await mkdir(linkRoot, { recursive: true })
const rewrites: string[] = []
for (const [slug, entry] of Array.from(selections.entries()).sort((a, b) => a[0].localeCompare(b[0]))) {
const parts = slug.split("/")
const leaf = parts.pop()
if (!leaf) {
continue
}
const parent = join(linkRoot, ...parts)
await mkdir(parent, { recursive: true })
const linkPath = join(parent, leaf)
const desired = join(entry.dir, "node_modules", slug)
const exists = await lstat(desired)
.then((info) => info.isDirectory())
.catch(() => false)
if (!exists) {
continue
}
const relativeTarget = relative(parent, desired)
const resolved = relativeTarget.length === 0 ? "." : relativeTarget
await rm(linkPath, { recursive: true, force: true })
await symlink(resolved, linkPath)
rewrites.push(slug + " -> " + resolved)
}
rewrites.sort()
console.log("[canonicalize-node-modules] rebuilt", rewrites.length, "links")
for (const line of rewrites.slice(0, 20)) {
console.log(" ", line)
}
if (rewrites.length > 20) {
console.log(" ...")
}
function parseEntry(label: string) {
const marker = label.startsWith("@") ? label.indexOf("@", 1) : label.indexOf("@")
if (marker <= 0) {
return null
}
const name = label.slice(0, marker).replace(/\+/g, "/")
const version = label.slice(marker + 1)
if (!name || !version) {
return null
}
return { name, version }
}
+138
View File
@@ -0,0 +1,138 @@
import { lstat, mkdir, readdir, rm, symlink } from "fs/promises"
import { join, relative } from "path"
type PackageManifest = {
name?: string
bin?: string | Record<string, string>
}
const root = process.cwd()
const bunRoot = join(root, "node_modules/.bun")
const bunEntries = (await safeReadDir(bunRoot)).sort()
let rewritten = 0
for (const entry of bunEntries) {
const modulesRoot = join(bunRoot, entry, "node_modules")
if (!(await exists(modulesRoot))) {
continue
}
const binRoot = join(modulesRoot, ".bin")
await rm(binRoot, { recursive: true, force: true })
await mkdir(binRoot, { recursive: true })
const packageDirs = await collectPackages(modulesRoot)
for (const packageDir of packageDirs) {
const manifest = await readManifest(packageDir)
if (!manifest) {
continue
}
const binField = manifest.bin
if (!binField) {
continue
}
const seen = new Set<string>()
if (typeof binField === "string") {
const fallback = manifest.name ?? packageDir.split("/").pop()
if (fallback) {
await linkBinary(binRoot, fallback, packageDir, binField, seen)
}
} else {
const entries = Object.entries(binField).sort((a, b) => a[0].localeCompare(b[0]))
for (const [name, target] of entries) {
await linkBinary(binRoot, name, packageDir, target, seen)
}
}
}
}
console.log(`[normalize-bun-binaries] rewrote ${rewritten} links`)
async function collectPackages(modulesRoot: string) {
const found: string[] = []
const topLevel = (await safeReadDir(modulesRoot)).sort()
for (const name of topLevel) {
if (name === ".bin" || name === ".bun") {
continue
}
const full = join(modulesRoot, name)
if (!(await isDirectory(full))) {
continue
}
if (name.startsWith("@")) {
const scoped = (await safeReadDir(full)).sort()
for (const child of scoped) {
const scopedDir = join(full, child)
if (await isDirectory(scopedDir)) {
found.push(scopedDir)
}
}
continue
}
found.push(full)
}
return found.sort()
}
async function readManifest(dir: string) {
const file = Bun.file(join(dir, "package.json"))
if (!(await file.exists())) {
return null
}
const data = (await file.json()) as PackageManifest
return data
}
async function linkBinary(binRoot: string, name: string, packageDir: string, target: string, seen: Set<string>) {
if (!name || !target) {
return
}
const normalizedName = normalizeBinName(name)
if (seen.has(normalizedName)) {
return
}
const resolved = join(packageDir, target)
const script = Bun.file(resolved)
if (!(await script.exists())) {
return
}
seen.add(normalizedName)
const destination = join(binRoot, normalizedName)
const relativeTarget = relative(binRoot, resolved) || "."
await rm(destination, { force: true })
await symlink(relativeTarget, destination)
rewritten++
}
async function exists(path: string) {
try {
await lstat(path)
return true
} catch {
return false
}
}
async function isDirectory(path: string) {
try {
const info = await lstat(path)
return info.isDirectory()
} catch {
return false
}
}
async function safeReadDir(path: string) {
try {
return await readdir(path)
} catch {
return []
}
}
function normalizeBinName(name: string) {
const slash = name.lastIndexOf("/")
if (slash >= 0) {
return name.slice(slash + 1)
}
return name
}
+39
View File
@@ -0,0 +1,39 @@
#!/usr/bin/env bun
import fs from "fs"
import path from "path"
/**
* Rewrite tree-sitter wasm references inside a JS file to absolute paths.
* argv: [node, script, file, mainWasm, ...wasmPaths]
*/
const [, , file, mainWasm, ...wasmPaths] = process.argv
if (!file || !mainWasm) {
console.error("usage: patch-wasm <file> <mainWasm> [wasmPaths...]")
process.exit(1)
}
const content = fs.readFileSync(file, "utf8")
const byName = new Map<string, string>()
for (const wasm of wasmPaths) {
const name = path.basename(wasm)
byName.set(name, wasm)
}
let next = content
for (const [name, wasmPath] of byName) {
next = next.replaceAll(name, wasmPath)
}
next = next.replaceAll("tree-sitter.wasm", mainWasm).replaceAll("web-tree-sitter/tree-sitter.wasm", mainWasm)
// Collapse any relative prefixes before absolute store paths (e.g., "../../../..//nix/store/...")
next = next.replace(/(\.\/)+/g, "./")
next = next.replace(/(\.\.\/)+\/?(\/nix\/store[^"']+)/g, "/$2")
next = next.replace(/(["'])\/{2,}(\/nix\/store[^"']+)(["'])/g, "$1/$2$3")
next = next.replace(/(["'])\/\/(nix\/store[^"']+)(["'])/g, "$1/$2$3")
if (next !== content) fs.writeFileSync(file, next)
+112
View File
@@ -0,0 +1,112 @@
#!/usr/bin/env bash
set -euo pipefail
DUMMY="sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
SYSTEM=${SYSTEM:-x86_64-linux}
DEFAULT_HASH_FILE=${MODULES_HASH_FILE:-nix/hashes.json}
HASH_FILE=${HASH_FILE:-$DEFAULT_HASH_FILE}
if [ ! -f "$HASH_FILE" ]; then
cat >"$HASH_FILE" <<EOF
{
"nodeModules": "$DUMMY"
}
EOF
fi
if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
if ! git ls-files --error-unmatch "$HASH_FILE" >/dev/null 2>&1; then
git add -N "$HASH_FILE" >/dev/null 2>&1 || true
fi
fi
export DUMMY
export NIX_KEEP_OUTPUTS=1
export NIX_KEEP_DERIVATIONS=1
cleanup() {
rm -f "${JSON_OUTPUT:-}" "${BUILD_LOG:-}" "${TMP_EXPR:-}"
}
trap cleanup EXIT
write_node_modules_hash() {
local value="$1"
local temp
temp=$(mktemp)
jq --arg value "$value" '.nodeModules = $value' "$HASH_FILE" >"$temp"
mv "$temp" "$HASH_FILE"
}
TARGET="packages.${SYSTEM}.default"
MODULES_ATTR=".#packages.${SYSTEM}.default.node_modules"
CORRECT_HASH=""
DRV_PATH="$(nix eval --raw "${MODULES_ATTR}.drvPath")"
echo "Setting dummy node_modules outputHash for ${SYSTEM}..."
write_node_modules_hash "$DUMMY"
BUILD_LOG=$(mktemp)
JSON_OUTPUT=$(mktemp)
echo "Building node_modules for ${SYSTEM} to discover correct outputHash..."
echo "Attempting to realize derivation: ${DRV_PATH}"
REALISE_OUT=$(nix-store --realise "$DRV_PATH" --keep-failed 2>&1 | tee "$BUILD_LOG" || true)
BUILD_PATH=$(echo "$REALISE_OUT" | grep "^/nix/store/" | head -n1 || true)
if [ -n "$BUILD_PATH" ] && [ -d "$BUILD_PATH" ]; then
echo "Realized node_modules output: $BUILD_PATH"
CORRECT_HASH=$(nix hash path --sri "$BUILD_PATH" 2>/dev/null || true)
fi
if [ -z "$CORRECT_HASH" ]; then
CORRECT_HASH="$(grep -E 'got:\s+sha256-[A-Za-z0-9+/=]+' "$BUILD_LOG" | awk '{print $2}' | head -n1 || true)"
if [ -z "$CORRECT_HASH" ]; then
CORRECT_HASH="$(grep -A2 'hash mismatch' "$BUILD_LOG" | grep 'got:' | awk '{print $2}' | sed 's/sha256:/sha256-/' || true)"
fi
if [ -z "$CORRECT_HASH" ]; then
echo "Searching for kept failed build directory..."
KEPT_DIR=$(grep -oE "build directory.*'[^']+'" "$BUILD_LOG" | grep -oE "'/[^']+'" | tr -d "'" | head -n1)
if [ -z "$KEPT_DIR" ]; then
KEPT_DIR=$(grep -oE '/nix/var/nix/builds/[^ ]+' "$BUILD_LOG" | head -n1)
fi
if [ -n "$KEPT_DIR" ] && [ -d "$KEPT_DIR" ]; then
echo "Found kept build directory: $KEPT_DIR"
if [ -d "$KEPT_DIR/build" ]; then
HASH_PATH="$KEPT_DIR/build"
else
HASH_PATH="$KEPT_DIR"
fi
echo "Attempting to hash: $HASH_PATH"
ls -la "$HASH_PATH" || true
if [ -d "$HASH_PATH/node_modules" ]; then
CORRECT_HASH=$(nix hash path --sri "$HASH_PATH" 2>/dev/null || true)
echo "Computed hash from kept build: $CORRECT_HASH"
fi
fi
fi
fi
if [ -z "$CORRECT_HASH" ]; then
echo "Failed to determine correct node_modules hash for ${SYSTEM}."
echo "Build log:"
cat "$BUILD_LOG"
exit 1
fi
write_node_modules_hash "$CORRECT_HASH"
jq -e --arg hash "$CORRECT_HASH" '.nodeModules == $hash' "$HASH_FILE" >/dev/null
echo "node_modules hash updated for ${SYSTEM}: $CORRECT_HASH"
rm -f "$BUILD_LOG"
unset BUILD_LOG
+21 -14
View File
@@ -4,12 +4,13 @@
"description": "AI-powered development tool",
"private": true,
"type": "module",
"packageManager": "bun@1.3.2",
"packageManager": "bun@1.3.3",
"scripts": {
"dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts",
"typecheck": "bun turbo typecheck",
"prepare": "husky",
"random": "echo 'Random script'"
"random": "echo 'Random script'",
"hello": "echo 'Hello World!'"
},
"workspaces": {
"packages": [
@@ -19,33 +20,37 @@
"packages/slack"
],
"catalog": {
"@types/bun": "1.3.0",
"@types/bun": "1.3.3",
"@hono/zod-validator": "0.4.2",
"ulid": "3.0.1",
"@kobalte/core": "0.13.11",
"@types/luxon": "3.7.1",
"@types/node": "22.13.9",
"@tsconfig/node22": "22.0.2",
"@tsconfig/bun": "1.0.9",
"@cloudflare/workers-types": "4.20251008.0",
"@openauthjs/openauth": "0.0.0-20250322224806",
"@pierre/precision-diffs": "0.4.4",
"@solidjs/meta": "0.29.4",
"@pierre/precision-diffs": "0.6.0-beta.10",
"@tailwindcss/vite": "4.1.11",
"diff": "8.0.2",
"ai": "5.0.8",
"hono": "4.7.10",
"ai": "5.0.97",
"hono": "4.10.7",
"hono-openapi": "1.1.2",
"fuzzysort": "3.1.0",
"luxon": "3.6.1",
"typescript": "5.8.2",
"@typescript/native-preview": "7.0.0-dev.20251014.1",
"@typescript/native-preview": "7.0.0-dev.20251207.1",
"zod": "4.1.8",
"remeda": "2.26.0",
"solid-js": "1.9.9",
"solid-list": "0.3.0",
"tailwindcss": "4.1.11",
"virtua": "0.42.3",
"vite": "7.1.4",
"vite-plugin-solid": "2.11.8"
"@solidjs/meta": "0.29.4",
"@solidjs/router": "0.15.4",
"@solidjs/start": "https://pkg.pr.new/@solidjs/start@dfb2020",
"solid-js": "1.9.10",
"vite-plugin-solid": "2.11.10"
}
},
"devDependencies": {
@@ -56,8 +61,10 @@
"turbo": "2.5.6"
},
"dependencies": {
"@aws-sdk/client-s3": "3.933.0",
"@opencode-ai/script": "workspace:*",
"@opencode-ai/sdk": "workspace:*"
"@opencode-ai/sdk": "workspace:*",
"typescript": "catalog:"
},
"repository": {
"type": "git",
@@ -76,11 +83,11 @@
"tree-sitter-bash",
"web-tree-sitter"
],
"patchedDependencies": {
"@solidjs/start@1.1.7": "patches/@solidjs%2Fstart@1.1.7.patch"
},
"overrides": {
"@types/bun": "catalog:",
"@types/node": "catalog:"
},
"patchedDependencies": {
"ghostty-web@0.3.0": "patches/ghostty-web@0.3.0.patch"
}
}
-1
View File
@@ -3,7 +3,6 @@ dist
.output
.vercel
.netlify
.vinxi
app.config.timestamp_*.js
# Environment
-23
View File
@@ -1,23 +0,0 @@
import { defineConfig } from "@solidjs/start/config"
export default defineConfig({
middleware: "./src/middleware.ts",
vite: {
server: {
allowedHosts: true,
},
build: {
rollupOptions: {
external: ["cloudflare:workers"],
},
minify: false,
},
},
server: {
compatibilityDate: "2024-09-19",
preset: "cloudflare_module",
cloudflare: {
nodeCompat: true,
},
},
})
+17 -12
View File
@@ -1,32 +1,37 @@
{
"name": "@opencode-ai/console-app",
"version": "1.0.143",
"type": "module",
"scripts": {
"typecheck": "tsgo --noEmit",
"dev": "vinxi dev --host 0.0.0.0",
"dev": "vite dev --host 0.0.0.0",
"dev:remote": "VITE_AUTH_URL=https://auth.dev.opencode.ai bun sst shell --stage=dev bun dev",
"build": "./script/generate-sitemap.ts && vinxi build && ../../opencode/script/schema.ts ./.output/public/config.json",
"start": "vinxi start",
"version": "1.0.62"
"build": "./script/generate-sitemap.ts && vite build && ../../opencode/script/schema.ts ./.output/public/config.json",
"start": "vite start"
},
"dependencies": {
"@cloudflare/vite-plugin": "1.15.2",
"@ibm/plex": "6.4.1",
"@jsx-email/render": "1.1.1",
"@kobalte/core": "catalog:",
"@openauthjs/openauth": "catalog:",
"@opencode-ai/console-core": "workspace:*",
"@opencode-ai/console-mail": "workspace:*",
"@openauthjs/openauth": "catalog:",
"@kobalte/core": "catalog:",
"@jsx-email/render": "1.1.1",
"@opencode-ai/console-resource": "workspace:*",
"@solidjs/meta": "^0.29.4",
"@solidjs/router": "^0.15.0",
"@solidjs/start": "^1.1.0",
"@opencode-ai/ui": "workspace:*",
"@solidjs/meta": "catalog:",
"@solidjs/router": "catalog:",
"@solidjs/start": "catalog:",
"chart.js": "4.5.1",
"nitro": "3.0.1-alpha.1",
"solid-js": "catalog:",
"vinxi": "^0.5.7",
"vite": "catalog:",
"zod": "catalog:"
},
"devDependencies": {
"@typescript/native-preview": "catalog:",
"typescript": "catalog:",
"@typescript/native-preview": "catalog:"
"wrangler": "4.50.0"
},
"engines": {
"node": ">=22"
+1
View File
@@ -0,0 +1 @@
../../../ui/src/assets/favicon/apple-touch-icon.png
+1
View File
@@ -0,0 +1 @@
../../../ui/src/assets/favicon/favicon-96x96.png
@@ -1,23 +0,0 @@
<svg width="400" height="400" viewBox="0 0 400 400" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="400" height="400" fill="#FDFCFC"/>
<path d="M96 122.001V70.001H148V122.001H96Z" fill="#17181C"/>
<path d="M148.004 122.001V70.001H200.004V122.001H148.004Z" fill="#17181C"/>
<path d="M200.008 122.001V70.001H252.008V122.001H200.008Z" fill="#17181C"/>
<path d="M251.996 122.001V70.001H303.996V122.001H251.996Z" fill="#17181C"/>
<path d="M251.996 173.988V121.988H303.996V173.988H251.996Z" fill="#17181C"/>
<path d="M96 225.998V173.998H148V225.998H96Z" fill="#CFCECD"/>
<rect width="52" height="52" transform="translate(148.004 173.998)" fill="#17181C"/>
<path d="M148.004 225.998V173.998H200.004V225.998H148.004Z" fill="#17181C" fill-opacity="0.1"/>
<path d="M200.008 225.998V173.998H252.008V225.998H200.008Z" fill="#17181C"/>
<path d="M252.016 225.998V173.998H304.016V225.998H252.016Z" fill="#CFCECD"/>
<rect width="52" height="52" transform="translate(96 226.002)" fill="#17181C"/>
<path d="M96 278.002V226.002H148V278.002H96Z" fill="#17181C" fill-opacity="0.1"/>
<rect width="52" height="52" transform="translate(148.004 226.002)" fill="white"/>
<path d="M148.004 278.002V226.002H200.004V278.002H148.004Z" fill="#CFCECD"/>
<path d="M200.008 278.002V226.002H252.008V278.002H200.008Z" fill="#CFCECD"/>
<path d="M252.016 278.002V226.002H304.016V278.002H252.016Z" fill="#CFCECD"/>
<path d="M96 330.012V278.012H148V330.012H96Z" fill="#17181C"/>
<path d="M148.004 330.012V278.012H200.004V330.012H148.004Z" fill="#17181C"/>
<path d="M200.008 329.99V277.99H252.008V329.99H200.008Z" fill="#17181C"/>
<path d="M251.996 330.012V278.012H303.996V330.012H251.996Z" fill="#17181C"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

+1
View File
@@ -0,0 +1 @@
../../../ui/src/assets/favicon/favicon.ico
-4
View File
@@ -1,4 +0,0 @@
<svg width="400" height="400" viewBox="0 0 400 400" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="400" height="400" fill="#0E0E0E"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M312 340H88V60H312V340ZM256 116H144V284H256V116Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 269 B

After

Width:  |  Height:  |  Size: 42 B

+1
View File
@@ -0,0 +1 @@
../../../ui/src/assets/favicon/favicon.svg

Before

Width:  |  Height:  |  Size: 269 B

After

Width:  |  Height:  |  Size: 42 B

+2 -1
View File
@@ -2,4 +2,5 @@ User-agent: *
Allow: /
# Disallow shared content pages
Disallow: /s/
Disallow: /s/
Disallow: /share/
+1
View File
@@ -0,0 +1 @@
../../../ui/src/assets/favicon/site.webmanifest
Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 50 B

+1
View File
@@ -0,0 +1 @@
../../../ui/src/assets/images/social-share-zen.png

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 50 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 46 B

+1
View File
@@ -0,0 +1 @@
../../../ui/src/assets/images/social-share.png

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 46 B

@@ -0,0 +1 @@
../../../ui/src/assets/favicon/web-app-manifest-192x192.png
@@ -0,0 +1 @@
../../../ui/src/assets/favicon/web-app-manifest-512x512.png
+3 -1
View File
@@ -1,7 +1,8 @@
import { MetaProvider, Title, Meta } from "@solidjs/meta"
import { Router } from "@solidjs/router"
import { FileRoutes } from "@solidjs/start/router"
import { ErrorBoundary, Suspense } from "solid-js"
import { Suspense } from "solid-js"
import { Favicon } from "@opencode-ai/ui/favicon"
import "@ibm/plex/css/ibm-plex.css"
import "./app.css"
@@ -13,6 +14,7 @@ export default function App() {
<MetaProvider>
<Title>opencode</Title>
<Meta name="description" content="OpenCode - The AI coding agent built for the terminal." />
<Favicon />
<Suspense>{props.children}</Suspense>
</MetaProvider>
)}
@@ -202,6 +202,14 @@ export function IconZai(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
)
}
export function IconGemini(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} viewBox="0 0 50 50" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path d="M49.04,24.001l-1.082-0.043h-0.001C36.134,23.492,26.508,13.866,26.042,2.043L25.999,0.96C25.978,0.424,25.537,0,25,0 s-0.978,0.424-0.999,0.96l-0.043,1.083C23.492,13.866,13.866,23.492,2.042,23.958L0.96,24.001C0.424,24.022,0,24.463,0,25 c0,0.537,0.424,0.978,0.961,0.999l1.082,0.042c11.823,0.467,21.449,10.093,21.915,21.916l0.043,1.083C24.022,49.576,24.463,50,25,50 s0.978-0.424,0.999-0.96l0.043-1.083c0.466-11.823,10.092-21.449,21.915-21.916l1.082-0.042C49.576,25.978,50,25.537,50,25 C50,24.463,49.576,24.022,49.04,24.001z"></path>
</svg>
)
}
export function IconStealth(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 18" fill="none">
@@ -212,3 +220,30 @@ export function IconStealth(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
</svg>
)
}
export function IconChevronLeft(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} viewBox="0 0 20 20" fill="none">
<path d="M12 15L7 10L12 5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" />
</svg>
)
}
export function IconChevronRight(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} viewBox="0 0 20 20" fill="none">
<path d="M8 5L13 10L8 15" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" />
</svg>
)
}
export function IconBreakdown(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} width="16" height="16" viewBox="0 0 16 16" fill="none">
<path d="M2 12L2 8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
<path d="M6 12L6 4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
<path d="M10 12L10 6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
<path d="M14 12L14 9" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
</svg>
)
}
+5 -5
View File
@@ -9,8 +9,8 @@ export const config = {
github: {
repoUrl: "https://github.com/sst/opencode",
starsFormatted: {
compact: "30K",
full: "30,000",
compact: "35K",
full: "35,000",
},
},
@@ -22,8 +22,8 @@ export const config = {
// Static stats (used on landing page)
stats: {
contributors: "250",
commits: "3,500",
monthlyUsers: "300,000",
contributors: "350",
commits: "5,000",
monthlyUsers: "400,000",
},
} as const
@@ -1,4 +1,4 @@
import { useSession } from "vinxi/http"
import { useSession } from "@solidjs/start/http"
export interface AuthSession {
account?: Record<
@@ -9,7 +9,6 @@ export default createHandler(
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="/favicon.svg" />
<meta property="og:image" content="/social-share.png" />
<meta property="twitter:image" content="/social-share.png" />
{assets}
+4
View File
@@ -1 +1,5 @@
/// <reference types="@solidjs/start/env" />
export declare module "@solidjs/start/server" {
export type APIEvent = { request: Request }
}
+2 -2
View File
@@ -1,5 +1,5 @@
import { defineMiddleware } from "vinxi/http"
import { createMiddleware } from "@solidjs/start/middleware"
export default defineMiddleware({
export default createMiddleware({
onBeforeResponse() {},
})
@@ -36,6 +36,7 @@ ${body.email}`.trim()
to: "contact@anoma.ly",
subject: `Enterprise Inquiry from ${body.name}`,
body: emailContent,
replyTo: body.email,
})
return Response.json({ success: true, message: "Form submitted successfully" }, { status: 200 })
@@ -19,6 +19,7 @@ export async function GET(input: APIEvent) {
return {
...value,
account: {
...value.account,
[id]: {
id,
email: decoded.subject.properties.email,
@@ -0,0 +1,17 @@
import { redirect } from "@solidjs/router"
import { APIEvent } from "@solidjs/start"
import { useAuthSession } from "~/context/auth.session"
export async function GET(event: APIEvent) {
const auth = await useAuthSession()
const current = auth.data.current
if (current)
await auth.update((val) => {
delete val.account?.[current]
const first = Object.keys(val.account ?? {})[0]
val.current = first
event!.locals.actor = undefined
return val
})
return redirect("/zen")
}
@@ -0,0 +1,7 @@
import { APIEvent } from "@solidjs/start"
import { useAuthSession } from "~/context/auth.session"
export async function GET(input: APIEvent) {
const session = await useAuthSession()
return Response.json(session.data)
}
+32 -3
View File
@@ -338,6 +338,11 @@ body {
}
}
[data-slot="installation-instructions"] {
color: var(--color-text-strong);
margin-bottom: 8px;
}
[data-slot="installation"] {
width: 100%;
max-width: 100%;
@@ -348,6 +353,11 @@ body {
}
}
[data-slot="installation-options"] {
font-size: 13px;
margin-top: 12px;
}
[data-component="tabs"] {
[data-slot="tablist"] {
display: flex;
@@ -480,10 +490,10 @@ body {
}
h1 {
font-size: 28px;
font-size: 38px;
color: var(--color-text-strong);
font-weight: 500;
margin-bottom: 16px;
margin-bottom: 8px;
@media (max-width: 60rem) {
font-size: 22px;
@@ -492,7 +502,7 @@ body {
p {
color: var(--color-text);
margin-bottom: 24px;
margin-bottom: 40px;
max-width: 82%;
@media (max-width: 50rem) {
@@ -607,6 +617,25 @@ body {
padding: var(--vertical-padding) var(--padding);
color: var(--color-text);
a {
background: var(--color-background-strong);
padding: 8px 12px 8px 20px;
color: var(--color-text-inverted);
border: none;
border-radius: 4px;
font-weight: 500;
cursor: pointer;
margin-top: 40px;
display: flex;
width: fit-content;
gap: 12px;
text-decoration: none;
}
a:hover {
background: var(--color-background-strong-hover);
}
ul {
padding: 0;
li {
+23 -18
View File
@@ -1,6 +1,6 @@
import "./index.css"
import { Title, Meta, Link } from "@solidjs/meta"
import { HttpHeader } from "@solidjs/start"
// import { HttpHeader } from "@solidjs/start"
import video from "../asset/lander/opencode-min.mp4"
import videoPoster from "../asset/lander/opencode-poster.png"
import { IconCopy, IconCheck } from "../component/icon"
@@ -42,10 +42,9 @@ export default function Home() {
return (
<main data-page="opencode">
<HttpHeader name="Cache-Control" value="public, max-age=1, s-maxage=3600, stale-while-revalidate=86400" />
<Title>OpenCode | The AI coding agent built for the terminal</Title>
{/*<HttpHeader name="Cache-Control" value="public, max-age=1, s-maxage=3600, stale-while-revalidate=86400" />*/}
<Title>OpenCode | The open source AI coding agent</Title>
<Link rel="canonical" href={config.baseUrl} />
<Link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<Meta property="og:image" content="/social-share.png" />
<Meta name="twitter:image" content="/social-share.png" />
<div data-component="container">
@@ -57,23 +56,13 @@ export default function Home() {
<a data-slot="releases" href={release()?.url ?? `${config.github.repoUrl}/releases`} target="_blank">
Whats new in {release()?.name ?? "the latest release"}
</a>
<h1>The AI coding agent built for the terminal</h1>
<h1>The open source coding agent</h1>
<p>
OpenCode is fully open source, giving you control and freedom to use any provider, any model, and any
editor.
OpenCode includes free models or connect from any provider to <br />
use other models, including Claude, GPT, Gemini and more.
</p>
<a href="/docs">
<span>Read docs </span>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M6.5 12L17 12M13 16.5L17.5 12L13 7.5"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="square"
/>
</svg>
</a>
</div>
<p data-slot="installation-instructions">Install and use. No account, no email, and no credit card.</p>
<div data-slot="installation">
<Tabs
as="section"
@@ -152,6 +141,11 @@ export default function Home() {
</div>
</Tabs>
</div>
<p data-slot="installation-options">
Available in terminal, web, and desktop (coming soon).
<br />
Extensions for VS Code, Cursor, Windsurf, and more.
</p>
</section>
<section data-component="video">
@@ -209,6 +203,17 @@ export default function Home() {
</div>
</li>
</ul>
<a href="/docs">
<span>Read docs </span>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M6.5 12L17 12M13 16.5L17.5 12L13 7.5"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="square"
/>
</svg>
</a>
</section>
<section data-component="growth">
@@ -0,0 +1,7 @@
export async function GET() {
const response = await fetch(
"https://raw.githubusercontent.com/sst/opencode/refs/heads/dev/packages/sdk/openapi.json",
)
const json = await response.json()
return json
}
@@ -12,6 +12,7 @@
[data-slot="item"] {
color: var(--color-danger);
text-decoration: none;
}
}
}
@@ -1,4 +1,4 @@
import { action, redirect } from "@solidjs/router"
import { action } from "@solidjs/router"
import { getRequestEvent } from "solid-js/web"
import { useAuthSession } from "~/context/auth.session"
import { Dropdown } from "~/component/dropdown"
@@ -17,18 +17,15 @@ const logout = action(async () => {
event!.locals.actor = undefined
return val
})
throw redirect("/zen")
})
}, "auth.logout")
export function UserMenu(props: { email: string | null | undefined }) {
return (
<div data-component="user-menu">
<Dropdown trigger={props.email ?? ""} align="right">
<form action={logout} method="post">
<button type="submit" formaction={logout} data-slot="item">
Logout
</button>
</form>
<a href="/auth/logout" data-slot="item">
Logout
</a>
</Dropdown>
</div>
)
@@ -14,7 +14,7 @@ import "./workspace-picker.css"
const getWorkspaces = query(async () => {
"use server"
return withActor(async () => {
return Database.transaction((tx) =>
return Database.use((tx) =>
tx
.select({
id: WorkspaceTable.id,
@@ -6,7 +6,6 @@ import { UserMenu } from "./user-menu"
import { withActor } from "~/context/auth.withActor"
import { User } from "@opencode-ai/console-core/user.js"
import { Actor } from "@opencode-ai/console-core/actor.js"
import { Link } from "@solidjs/meta"
const getUserEmail = query(async (workspaceID: string) => {
"use server"
@@ -22,7 +21,6 @@ export default function WorkspaceLayout(props: RouteSectionProps) {
const userEmail = createAsync(() => getUserEmail(params.id!))
return (
<main data-page="workspace">
<Link rel="icon" type="image/svg+xml" href="/favicon-zen.svg" />
<header data-component="workspace-header">
<div data-slot="header-brand">
<A href="/" data-component="site-title">
@@ -0,0 +1,145 @@
.root {
[data-component="empty-state"] {
padding: var(--space-20) var(--space-6);
text-align: center;
border: 1px dashed var(--color-border);
border-radius: var(--border-radius-sm);
height: 400px;
display: flex;
align-items: center;
justify-content: center;
p {
font-size: var(--font-size-sm);
color: var(--color-text-muted);
}
}
[data-slot="filter-container"] {
margin-bottom: 0;
display: flex;
align-items: center;
gap: var(--space-3);
[data-component="dropdown"] {
[data-slot="trigger"] {
border: 1px solid var(--color-border);
background-color: var(--color-bg);
padding: var(--space-2) var(--space-3);
border-radius: var(--border-radius-sm);
color: var(--color-text);
font-size: var(--font-size-sm);
line-height: 1.5;
&:hover {
border-color: var(--color-accent);
}
&:focus {
outline: none;
border-color: var(--color-accent);
box-shadow: 0 0 0 3px var(--color-accent-alpha);
}
}
[data-slot="chevron"] {
opacity: 0.6;
}
[data-slot="dropdown"] {
min-width: 200px;
max-height: 300px;
overflow-y: auto;
padding: var(--space-1);
}
}
}
[data-slot="month-picker"] {
display: flex;
align-items: center;
background-color: var(--color-bg);
border: 1px solid var(--color-border);
border-radius: var(--border-radius-sm);
padding: 0;
}
[data-slot="month-button"] {
display: flex;
align-items: center;
justify-content: center;
background: none;
border: none !important;
color: var(--color-text);
cursor: pointer;
padding: var(--space-2) var(--space-3);
border-radius: var(--border-radius-xs);
transition: background-color 0.2s;
line-height: 1;
&:hover {
background-color: var(--color-bg-hover);
}
svg {
display: block;
width: 16px;
height: 16px;
stroke-width: 2;
}
}
[data-slot="month-label"] {
font-size: var(--font-size-sm);
font-weight: 500;
color: var(--color-text);
line-height: 1.5;
min-width: 140px;
text-align: center;
white-space: nowrap;
}
[data-slot="model-item"] {
display: flex;
align-items: center;
gap: var(--space-2);
padding: var(--space-2) var(--space-3);
cursor: pointer;
transition: background-color 0.2s;
font-size: var(--font-size-sm);
color: var(--color-text);
border: none !important;
background: none;
width: 100%;
text-align: left;
white-space: nowrap;
&:hover {
background: var(--color-bg-hover);
}
span {
flex: 1;
user-select: none;
}
}
[data-slot="chart-container"] {
padding: var(--space-6);
background: var(--color-bg-secondary);
border: 1px solid var(--color-border);
border-radius: var(--border-radius-sm);
height: 400px;
}
@media (max-width: 40rem) {
[data-slot="chart-container"] {
height: 300px;
padding: var(--space-4);
}
[data-component="empty-state"] {
height: 300px;
}
}
}
@@ -0,0 +1,440 @@
import { and, Database, eq, gte, inArray, isNull, lte, or, sql, sum } from "@opencode-ai/console-core/drizzle/index.js"
import { UsageTable } from "@opencode-ai/console-core/schema/billing.sql.js"
import { KeyTable } from "@opencode-ai/console-core/schema/key.sql.js"
import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
import { AuthTable } from "@opencode-ai/console-core/schema/auth.sql.js"
import { useParams } from "@solidjs/router"
import { createEffect, createMemo, onCleanup, Show, For } from "solid-js"
import { createStore } from "solid-js/store"
import { withActor } from "~/context/auth.withActor"
import { Dropdown } from "~/component/dropdown"
import { IconChevronLeft, IconChevronRight } from "~/component/icon"
import styles from "./graph-section.module.css"
import {
Chart,
BarController,
BarElement,
CategoryScale,
LinearScale,
Tooltip,
Legend,
type ChartConfiguration,
} from "chart.js"
Chart.register(BarController, BarElement, CategoryScale, LinearScale, Tooltip, Legend)
async function getCosts(workspaceID: string, year: number, month: number) {
"use server"
return withActor(async () => {
const startDate = new Date(year, month, 1)
const endDate = new Date(year, month + 1, 0)
// First query: get usage data without joining keys
const usageData = await Database.use((tx) =>
tx
.select({
date: sql<string>`DATE(${UsageTable.timeCreated})`,
model: UsageTable.model,
totalCost: sum(UsageTable.cost),
keyId: UsageTable.keyID,
})
.from(UsageTable)
.where(
and(
eq(UsageTable.workspaceID, workspaceID),
gte(UsageTable.timeCreated, startDate),
lte(UsageTable.timeCreated, endDate),
),
)
.groupBy(sql`DATE(${UsageTable.timeCreated})`, UsageTable.model, UsageTable.keyID)
.then((x) =>
x.map((r) => ({
...r,
totalCost: r.totalCost ? parseInt(r.totalCost) : 0,
})),
),
)
// Get unique key IDs from usage
const usageKeyIds = new Set(usageData.map((r) => r.keyId).filter((id) => id !== null))
// Second query: get all existing keys plus any keys from usage
const keysData = await Database.use((tx) =>
tx
.select({
keyId: KeyTable.id,
keyName: KeyTable.name,
userEmail: AuthTable.subject,
timeDeleted: KeyTable.timeDeleted,
})
.from(KeyTable)
.innerJoin(UserTable, and(eq(KeyTable.userID, UserTable.id), eq(KeyTable.workspaceID, UserTable.workspaceID)))
.innerJoin(AuthTable, and(eq(UserTable.accountID, AuthTable.accountID), eq(AuthTable.provider, "email")))
.where(
and(
eq(KeyTable.workspaceID, workspaceID),
usageKeyIds.size > 0
? or(inArray(KeyTable.id, Array.from(usageKeyIds)), isNull(KeyTable.timeDeleted))
: isNull(KeyTable.timeDeleted),
),
)
.orderBy(AuthTable.subject, KeyTable.name),
)
return {
usage: usageData,
keys: keysData.map((key) => ({
id: key.keyId,
displayName:
key.timeDeleted !== null
? `${key.userEmail} - ${key.keyName} (deleted)`
: `${key.userEmail} - ${key.keyName}`,
})),
}
}, workspaceID)
}
const MODEL_COLORS: Record<string, string> = {
"claude-sonnet-4-5": "#D4745C",
"claude-sonnet-4": "#E8B4A4",
"claude-opus-4": "#C8A098",
"claude-haiku-4-5": "#F0D8D0",
"claude-3-5-haiku": "#F8E8E0",
"gpt-5.1": "#4A90E2",
"gpt-5.1-codex": "#6BA8F0",
"gpt-5": "#7DB8F8",
"gpt-5-codex": "#9FCAFF",
"gpt-5-nano": "#B8D8FF",
"grok-code": "#8B5CF6",
"big-pickle": "#10B981",
"kimi-k2": "#F59E0B",
"qwen3-coder": "#EC4899",
"glm-4.6": "#14B8A6",
}
function getModelColor(model: string): string {
if (MODEL_COLORS[model]) return MODEL_COLORS[model]
const hash = model.split("").reduce((acc, char) => char.charCodeAt(0) + ((acc << 5) - acc), 0)
const hue = Math.abs(hash) % 360
return `hsl(${hue}, 50%, 65%)`
}
function formatDateLabel(dateStr: string): string {
const date = new Date()
const [y, m, d] = dateStr.split("-").map(Number)
date.setFullYear(y)
date.setMonth(m - 1)
date.setDate(d)
date.setHours(0, 0, 0, 0)
const month = date.toLocaleDateString("en-US", { month: "short" })
const day = date.getUTCDate().toString().padStart(2, "0")
return `${month} ${day}`
}
function addOpacityToColor(color: string, opacity: number): string {
if (color.startsWith("#")) {
const r = parseInt(color.slice(1, 3), 16)
const g = parseInt(color.slice(3, 5), 16)
const b = parseInt(color.slice(5, 7), 16)
return `rgba(${r}, ${g}, ${b}, ${opacity})`
}
if (color.startsWith("hsl")) return color.replace(")", `, ${opacity})`).replace("hsl", "hsla")
return color
}
export function GraphSection() {
let canvasRef: HTMLCanvasElement | undefined
let chartInstance: Chart | undefined
const params = useParams()
const now = new Date()
const [store, setStore] = createStore({
data: null as Awaited<ReturnType<typeof getCosts>> | null,
year: now.getFullYear(),
month: now.getMonth(),
key: null as string | null,
model: null as string | null,
modelDropdownOpen: false,
keyDropdownOpen: false,
colorScheme: "light" as "light" | "dark",
})
const onPreviousMonth = async () => {
const month = store.month === 0 ? 11 : store.month - 1
const year = store.month === 0 ? store.year - 1 : store.year
setStore({ month, year })
}
const onNextMonth = async () => {
const month = store.month === 11 ? 0 : store.month + 1
const year = store.month === 11 ? store.year + 1 : store.year
setStore({ month, year })
}
const onSelectModel = (model: string | null) => setStore({ model, modelDropdownOpen: false })
const onSelectKey = (keyID: string | null) => setStore({ key: keyID, keyDropdownOpen: false })
const getModels = createMemo(() => {
if (!store.data?.usage) return []
return Array.from(new Set(store.data.usage.map((row) => row.model))).sort()
})
const getDates = createMemo(() => {
const daysInMonth = new Date(store.year, store.month + 1, 0).getDate()
return Array.from({ length: daysInMonth }, (_, i) => {
const date = new Date(store.year, store.month, i + 1)
return date.toISOString().split("T")[0]
})
})
const getKeyName = (keyID: string | null): string => {
if (!keyID || !store.data?.keys) return "All Keys"
const found = store.data.keys.find((k) => k.id === keyID)
return found?.displayName ?? "All Keys"
}
const formatMonthYear = () =>
new Date(store.year, store.month, 1).toLocaleDateString("en-US", { month: "long", year: "numeric" })
const isCurrentMonth = () => store.year === now.getFullYear() && store.month === now.getMonth()
const chartConfig = createMemo((): ChartConfiguration | null => {
const data = store.data
const dates = getDates()
if (!data?.usage?.length) return null
store.colorScheme
const styles = getComputedStyle(document.documentElement)
const colorTextMuted = styles.getPropertyValue("--color-text-muted").trim()
const colorBorderMuted = styles.getPropertyValue("--color-border-muted").trim()
const colorBgElevated = styles.getPropertyValue("--color-bg-elevated").trim()
const colorText = styles.getPropertyValue("--color-text").trim()
const colorTextSecondary = styles.getPropertyValue("--color-text-secondary").trim()
const colorBorder = styles.getPropertyValue("--color-border").trim()
const dailyData = new Map<string, Map<string, number>>()
for (const dateKey of dates) dailyData.set(dateKey, new Map())
data.usage
.filter((row) => (store.key ? row.keyId === store.key : true))
.forEach((row) => {
const dayMap = dailyData.get(row.date)
if (!dayMap) return
dayMap.set(row.model, (dayMap.get(row.model) ?? 0) + row.totalCost)
})
const filteredModels = store.model === null ? getModels() : [store.model]
const datasets = filteredModels.map((model) => {
const color = getModelColor(model)
return {
label: model,
data: dates.map((date) => (dailyData.get(date)?.get(model) || 0) / 100_000_000),
backgroundColor: color,
hoverBackgroundColor: color,
borderWidth: 0,
}
})
return {
type: "bar",
data: {
labels: dates.map(formatDateLabel),
datasets,
},
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
x: {
stacked: true,
grid: {
display: false,
},
ticks: {
maxRotation: 0,
autoSkipPadding: 20,
color: colorTextMuted,
font: {
family: "monospace",
size: 11,
},
},
},
y: {
stacked: true,
beginAtZero: true,
grid: {
color: colorBorderMuted,
},
ticks: {
color: colorTextMuted,
font: {
family: "monospace",
size: 11,
},
callback: (value) => {
const num = Number(value)
return num >= 1000 ? `$${(num / 1000).toFixed(1)}k` : `$${num.toFixed(0)}`
},
},
},
},
plugins: {
tooltip: {
mode: "index",
intersect: false,
backgroundColor: colorBgElevated,
titleColor: colorText,
bodyColor: colorTextSecondary,
borderColor: colorBorder,
borderWidth: 1,
padding: 12,
displayColors: true,
callbacks: {
label: (context) => {
const value = context.parsed.y
if (!value || value === 0) return
return `${context.dataset.label}: $${value.toFixed(2)}`
},
},
},
legend: {
display: true,
position: "bottom",
labels: {
color: colorTextSecondary,
font: {
size: 12,
},
padding: 16,
boxWidth: 16,
boxHeight: 16,
usePointStyle: false,
},
onHover: (event, legendItem, legend) => {
const chart = legend.chart
chart.data.datasets?.forEach((dataset, i) => {
const meta = chart.getDatasetMeta(i)
const baseColor = getModelColor(dataset.label || "")
const color = i === legendItem.datasetIndex ? baseColor : addOpacityToColor(baseColor, 0.3)
meta.data.forEach((bar: any) => {
bar.options.backgroundColor = color
})
})
chart.update("none")
},
onLeave: (event, legendItem, legend) => {
const chart = legend.chart
chart.data.datasets?.forEach((dataset, i) => {
const meta = chart.getDatasetMeta(i)
const baseColor = getModelColor(dataset.label || "")
meta.data.forEach((bar: any) => {
bar.options.backgroundColor = baseColor
})
})
chart.update("none")
},
},
},
},
}
})
createEffect(async () => {
const data = await getCosts(params.id!, store.year, store.month)
setStore({ data })
})
createEffect(() => {
const config = chartConfig()
if (!config || !canvasRef) return
if (chartInstance) chartInstance.destroy()
chartInstance = new Chart(canvasRef, config)
onCleanup(() => chartInstance?.destroy())
})
createEffect(() => {
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)")
setStore({ colorScheme: mediaQuery.matches ? "dark" : "light" })
const handleColorSchemeChange = (e: MediaQueryListEvent) => {
setStore({ colorScheme: e.matches ? "dark" : "light" })
}
mediaQuery.addEventListener("change", handleColorSchemeChange)
onCleanup(() => mediaQuery.removeEventListener("change", handleColorSchemeChange))
})
return (
<section class={styles.root}>
<div data-slot="section-title">
<h2>Cost</h2>
<p>Usage costs broken down by model.</p>
</div>
<div data-slot="filter-container">
<div data-slot="month-picker">
<button data-slot="month-button" onClick={onPreviousMonth}>
<IconChevronLeft />
</button>
<span data-slot="month-label">{formatMonthYear()}</span>
<button data-slot="month-button" onClick={onNextMonth} disabled={isCurrentMonth()}>
<IconChevronRight />
</button>
</div>
<Dropdown
trigger={store.model === null ? "All Models" : store.model}
open={store.modelDropdownOpen}
onOpenChange={(open) => setStore({ modelDropdownOpen: open })}
>
<>
<button data-slot="model-item" onClick={() => onSelectModel(null)}>
<span>All Models</span>
</button>
<For each={getModels()}>
{(model) => (
<button data-slot="model-item" onClick={() => onSelectModel(model)}>
<span>{model}</span>
</button>
)}
</For>
</>
</Dropdown>
<Dropdown
trigger={getKeyName(store.key)}
open={store.keyDropdownOpen}
onOpenChange={(open) => setStore({ keyDropdownOpen: open })}
>
<>
<button data-slot="model-item" onClick={() => onSelectKey(null)}>
<span>All Keys</span>
</button>
<For each={store.data?.keys || []}>
{(key) => (
<button data-slot="model-item" onClick={() => onSelectKey(key.id)}>
<span>{key.displayName}</span>
</button>
)}
</For>
</>
</Dropdown>
</div>
<Show
when={chartConfig()}
fallback={
<div data-component="empty-state">
<p>No usage data available for the selected period.</p>
</div>
}
>
<div data-slot="chart-container">
<canvas ref={canvasRef} />
</div>
</Show>
</section>
)
}
@@ -5,6 +5,7 @@ import { NewUserSection } from "./new-user-section"
import { UsageSection } from "./usage-section"
import { ModelSection } from "./model-section"
import { ProviderSection } from "./provider-section"
import { GraphSection } from "./graph-section"
import { IconLogo } from "~/component/icon"
import { querySessionInfo, queryBillingInfo, createCheckoutUrl, formatBalance } from "../common"
@@ -66,6 +67,9 @@ export default function () {
<div data-slot="sections">
<NewUserSection />
<Show when={userInfo()?.isAdmin}>
<GraphSection />
</Show>
<ModelSection />
<Show when={userInfo()?.isAdmin}>
<ProviderSection />
@@ -5,11 +5,21 @@ import { withActor } from "~/context/auth.withActor"
import { ZenData } from "@opencode-ai/console-core/model.js"
import styles from "./model-section.module.css"
import { querySessionInfo } from "../common"
import { IconAlibaba, IconAnthropic, IconMoonshotAI, IconOpenAI, IconStealth, IconXai, IconZai } from "~/component/icon"
import {
IconAlibaba,
IconAnthropic,
IconGemini,
IconMoonshotAI,
IconOpenAI,
IconStealth,
IconXai,
IconZai,
} from "~/component/icon"
const getModelLab = (modelId: string) => {
if (modelId.startsWith("claude")) return "Anthropic"
if (modelId.startsWith("gpt")) return "OpenAI"
if (modelId.startsWith("gemini")) return "Google"
if (modelId.startsWith("kimi")) return "Moonshot AI"
if (modelId.startsWith("glm")) return "Z.ai"
if (modelId.startsWith("qwen")) return "Alibaba"
@@ -22,9 +32,19 @@ const getModelsInfo = query(async (workspaceID: string) => {
return withActor(async () => {
return {
all: Object.entries(ZenData.list().models)
.filter(([id, _model]) => !["claude-3-5-haiku", "minimax-m2"].includes(id))
.filter(([id, _model]) => !id.startsWith("an-"))
.sort(([_idA, modelA], [_idB, modelB]) => modelA.name.localeCompare(modelB.name))
.filter(([id, _model]) => !["claude-3-5-haiku"].includes(id))
.filter(([id, _model]) => !id.startsWith("alpha-"))
.sort(([idA, modelA], [idB, modelB]) => {
const priority = ["big-pickle", "grok", "claude", "gpt", "gemini"]
const getPriority = (id: string) => {
const index = priority.findIndex((p) => id.startsWith(p))
return index === -1 ? Infinity : index
}
const pA = getPriority(idA)
const pB = getPriority(idB)
if (pA !== pB) return pA - pB
return modelA.name.localeCompare(modelB.name)
})
.map(([id, model]) => ({ id, name: model.name })),
disabled: await Model.listDisabled(),
}
@@ -96,6 +116,8 @@ export function ModelSection() {
return <IconOpenAI width={16} height={16} />
case "Anthropic":
return <IconAnthropic width={16} height={16} />
case "Google":
return <IconGemini width={16} height={16} />
case "Moonshot AI":
return <IconMoonshotAI width={16} height={16} />
case "Z.ai":
@@ -8,6 +8,7 @@ import styles from "./provider-section.module.css"
const PROVIDERS = [
{ name: "OpenAI", key: "openai", prefix: "sk-" },
{ name: "Anthropic", key: "anthropic", prefix: "sk-ant-" },
{ name: "Google Gemini", key: "google", prefix: "AI" },
] as const
type Provider = (typeof PROVIDERS)[number]
@@ -1,24 +1,23 @@
.root {
/* Empty state */
[data-component="empty-state"] {
padding: var(--space-20) var(--space-6);
text-align: center;
border: 1px dashed var(--color-border);
border-radius: var(--border-radius-sm);
display: flex;
flex-direction: column;
gap: var(--space-2);
p {
line-height: 1.5;
font-size: var(--font-size-sm);
color: var(--color-text-muted);
}
}
/* Table container */
[data-slot="usage-table"] {
overflow-x: auto;
}
/* Table element */
[data-slot="usage-table-element"] {
width: 100%;
border-collapse: collapse;
@@ -48,7 +47,6 @@
&[data-slot="usage-model"] {
font-family: var(--font-sans);
font-weight: 400;
color: var(--color-text-secondary);
max-width: 200px;
word-break: break-word;
@@ -56,33 +54,133 @@
&[data-slot="usage-cost"] {
color: var(--color-text);
font-weight: 500;
}
[data-slot="tokens-with-breakdown"] {
position: relative;
display: flex;
align-items: center;
gap: var(--space-2);
}
[data-slot="breakdown-button"] {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0;
background: transparent;
border: none;
color: var(--color-text-muted);
cursor: pointer;
transition: color 0.15s ease;
&:hover {
color: var(--color-text);
}
svg {
width: 16px;
height: 16px;
}
}
[data-slot="breakdown-popup"] {
position: absolute;
left: 0;
top: 100%;
margin-top: var(--space-2);
background: var(--color-bg);
border: 1px solid var(--color-border);
border-radius: var(--border-radius-sm);
padding: var(--space-2);
z-index: 10;
min-width: 180px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
font-size: var(--font-size-xs);
@media (prefers-color-scheme: dark) {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
}
}
}
tbody tr {
&:last-child td {
border-bottom: none;
tbody tr:last-child td {
border-bottom: none;
}
}
/* Pagination */
[data-slot="pagination"] {
display: flex;
justify-content: flex-end;
gap: var(--space-2);
padding: var(--space-4) 0;
border-top: 1px solid var(--color-border-muted);
margin-top: var(--space-2);
button {
padding: var(--space-2) var(--space-4);
background: var(--color-bg-secondary);
border: 1px solid var(--color-border);
border-radius: var(--border-radius-sm);
color: var(--color-text);
font-size: var(--font-size-sm);
cursor: pointer;
transition: all 0.15s ease;
svg {
width: 16px;
height: 16px;
stroke-width: 2;
}
&:hover:not(:disabled) {
background: var(--color-bg-tertiary);
border-color: var(--color-border-hover);
}
&:disabled {
opacity: 0.5;
cursor: not-allowed;
}
}
}
@media (max-width: 40rem) {
/* Mobile responsive */
@media (max-width: 40rem) {
[data-slot="usage-table-element"] {
th,
td {
padding: var(--space-2) var(--space-3);
font-size: var(--font-size-xs);
}
th {
&:nth-child(2) /* Model */ {
display: none;
}
}
td {
&:nth-child(2) /* Model */ {
display: none;
}
/* Hide Model column on mobile */
th:nth-child(2),
td:nth-child(2) {
display: none;
}
}
}
/* Breakdown popup content */
[data-slot="breakdown-row"] {
display: flex;
justify-content: space-between;
align-items: center;
gap: var(--space-4);
padding: var(--space-1) 0;
}
[data-slot="breakdown-label"] {
color: var(--color-text-muted);
font-size: var(--font-size-xs);
}
[data-slot="breakdown-value"] {
color: var(--color-text);
font-weight: 500;
font-size: var(--font-size-xs);
}
}
@@ -1,81 +1,73 @@
import { Billing } from "@opencode-ai/console-core/billing.js"
import { query, useParams, createAsync } from "@solidjs/router"
import { createMemo, For, Show } from "solid-js"
import { createAsync, query, useParams } from "@solidjs/router"
import { createMemo, For, Show, createEffect, createSignal } from "solid-js"
import { formatDateUTC, formatDateForTable } from "../common"
import { withActor } from "~/context/auth.withActor"
import { IconChevronLeft, IconChevronRight, IconBreakdown } from "~/component/icon"
import styles from "./usage-section.module.css"
import { createStore } from "solid-js/store"
const getUsageInfo = query(async (workspaceID: string) => {
const PAGE_SIZE = 50
async function getUsageInfo(workspaceID: string, page: number) {
"use server"
return withActor(async () => {
return await Billing.usages()
return await Billing.usages(page, PAGE_SIZE)
}, workspaceID)
}, "usage.list")
}
const queryUsageInfo = query(getUsageInfo, "usage.list")
export function UsageSection() {
const params = useParams()
// ORIGINAL CODE - COMMENTED OUT FOR TESTING
const usage = createAsync(() => getUsageInfo(params.id!))
const usage = createAsync(() => queryUsageInfo(params.id!, 0))
const [store, setStore] = createStore({ page: 0, usage: [] as Awaited<ReturnType<typeof getUsageInfo>> })
const [openBreakdownId, setOpenBreakdownId] = createSignal<string | null>(null)
// DUMMY DATA FOR TESTING
// const usage = () => [
// {
// timeCreated: new Date(Date.now() - 86400000 * 0).toISOString(), // Today
// model: "claude-3-5-sonnet-20241022",
// inputTokens: 1247,
// outputTokens: 423,
// cost: 125400000, // $1.254
// },
// {
// timeCreated: new Date(Date.now() - 86400000 * 0.5).toISOString(), // 12 hours ago
// model: "claude-3-haiku-20240307",
// inputTokens: 892,
// outputTokens: 156,
// cost: 23500000, // $0.235
// },
// {
// timeCreated: new Date(Date.now() - 86400000 * 1).toISOString(), // Yesterday
// model: "claude-3-5-sonnet-20241022",
// inputTokens: 2134,
// outputTokens: 687,
// cost: 234700000, // $2.347
// },
// {
// timeCreated: new Date(Date.now() - 86400000 * 1.3).toISOString(), // 1.3 days ago
// model: "gpt-4o-mini",
// inputTokens: 567,
// outputTokens: 234,
// cost: 8900000, // $0.089
// },
// {
// timeCreated: new Date(Date.now() - 86400000 * 2).toISOString(), // 2 days ago
// model: "claude-3-opus-20240229",
// inputTokens: 1893,
// outputTokens: 945,
// cost: 445600000, // $4.456
// },
// {
// timeCreated: new Date(Date.now() - 86400000 * 2.7).toISOString(), // 2.7 days ago
// model: "gpt-4o",
// inputTokens: 1456,
// outputTokens: 532,
// cost: 156800000, // $1.568
// },
// {
// timeCreated: new Date(Date.now() - 86400000 * 3).toISOString(), // 3 days ago
// model: "claude-3-haiku-20240307",
// inputTokens: 634,
// outputTokens: 89,
// cost: 12300000, // $0.123
// },
// {
// timeCreated: new Date(Date.now() - 86400000 * 4).toISOString(), // 4 days ago
// model: "claude-3-5-sonnet-20241022",
// inputTokens: 3245,
// outputTokens: 1123,
// cost: 387200000, // $3.872
// },
// ]
createEffect(() => {
setStore({ usage: usage() })
}, [usage])
createEffect(() => {
if (!openBreakdownId()) return
const handleClickOutside = (e: MouseEvent) => {
const target = e.target as HTMLElement
if (!target.closest('[data-slot="tokens-with-breakdown"]')) {
setOpenBreakdownId(null)
}
}
document.addEventListener("click", handleClickOutside)
return () => document.removeEventListener("click", handleClickOutside)
})
const hasResults = createMemo(() => store.usage && store.usage.length > 0)
const canGoPrev = createMemo(() => store.page > 0)
const canGoNext = createMemo(() => store.usage && store.usage.length === PAGE_SIZE)
const calculateTotalInputTokens = (u: Awaited<ReturnType<typeof getUsageInfo>>[0]) => {
return u.inputTokens + (u.cacheReadTokens ?? 0) + (u.cacheWrite5mTokens ?? 0) + (u.cacheWrite1hTokens ?? 0)
}
const calculateTotalOutputTokens = (u: Awaited<ReturnType<typeof getUsageInfo>>[0]) => {
return u.outputTokens + (u.reasoningTokens ?? 0)
}
const goPrev = async () => {
const usage = await getUsageInfo(params.id!, store.page - 1)
setStore({
page: store.page - 1,
usage,
})
}
const goNext = async () => {
const usage = await getUsageInfo(params.id!, store.page + 1)
setStore({
page: store.page + 1,
usage,
})
}
return (
<section class={styles.root}>
@@ -85,7 +77,7 @@ export function UsageSection() {
</div>
<div data-slot="usage-table">
<Show
when={usage() && usage()!.length > 0}
when={hasResults()}
fallback={
<div data-component="empty-state">
<p>Make your first API call to get started.</p>
@@ -103,17 +95,80 @@ export function UsageSection() {
</tr>
</thead>
<tbody>
<For each={usage()!}>
{(usage) => {
<For each={store.usage}>
{(usage, index) => {
const date = createMemo(() => new Date(usage.timeCreated))
const totalInputTokens = createMemo(() => calculateTotalInputTokens(usage))
const totalOutputTokens = createMemo(() => calculateTotalOutputTokens(usage))
const inputBreakdownId = `input-breakdown-${index()}`
const outputBreakdownId = `output-breakdown-${index()}`
const isInputOpen = createMemo(() => openBreakdownId() === inputBreakdownId)
const isOutputOpen = createMemo(() => openBreakdownId() === outputBreakdownId)
const isClaude = usage.model.toLowerCase().includes("claude")
return (
<tr>
<td data-slot="usage-date" title={formatDateUTC(date())}>
{formatDateForTable(date())}
</td>
<td data-slot="usage-model">{usage.model}</td>
<td data-slot="usage-tokens">{usage.inputTokens}</td>
<td data-slot="usage-tokens">{usage.outputTokens}</td>
<td data-slot="usage-tokens">
<div data-slot="tokens-with-breakdown" onClick={(e) => e.stopPropagation()}>
<button
data-slot="breakdown-button"
onClick={(e) => {
e.stopPropagation()
setOpenBreakdownId(isInputOpen() ? null : inputBreakdownId)
}}
>
<IconBreakdown />
</button>
<span onClick={() => setOpenBreakdownId(null)}>{totalInputTokens()}</span>
<Show when={isInputOpen()}>
<div data-slot="breakdown-popup" onClick={(e) => e.stopPropagation()}>
<div data-slot="breakdown-row">
<span data-slot="breakdown-label">Input</span>
<span data-slot="breakdown-value">{usage.inputTokens}</span>
</div>
<div data-slot="breakdown-row">
<span data-slot="breakdown-label">Cache Read</span>
<span data-slot="breakdown-value">{usage.cacheReadTokens ?? 0}</span>
</div>
<Show when={isClaude}>
<div data-slot="breakdown-row">
<span data-slot="breakdown-label">Cache Write</span>
<span data-slot="breakdown-value">{usage.cacheWrite5mTokens ?? 0}</span>
</div>
</Show>
</div>
</Show>
</div>
</td>
<td data-slot="usage-tokens">
<div data-slot="tokens-with-breakdown" onClick={(e) => e.stopPropagation()}>
<button
data-slot="breakdown-button"
onClick={(e) => {
e.stopPropagation()
setOpenBreakdownId(isOutputOpen() ? null : outputBreakdownId)
}}
>
<IconBreakdown />
</button>
<span onClick={() => setOpenBreakdownId(null)}>{totalOutputTokens()}</span>
<Show when={isOutputOpen()}>
<div data-slot="breakdown-popup" onClick={(e) => e.stopPropagation()}>
<div data-slot="breakdown-row">
<span data-slot="breakdown-label">Output</span>
<span data-slot="breakdown-value">{usage.outputTokens}</span>
</div>
<div data-slot="breakdown-row">
<span data-slot="breakdown-label">Reasoning</span>
<span data-slot="breakdown-value">{usage.reasoningTokens ?? 0}</span>
</div>
</div>
</Show>
</div>
</td>
<td data-slot="usage-cost">${((usage.cost ?? 0) / 100000000).toFixed(4)}</td>
</tr>
)
@@ -121,6 +176,16 @@ export function UsageSection() {
</For>
</tbody>
</table>
<Show when={canGoPrev() || canGoNext()}>
<div data-slot="pagination">
<button disabled={!canGoPrev()} onClick={goPrev}>
<IconChevronLeft />
</button>
<button disabled={!canGoNext()} onClick={goNext}>
<IconChevronRight />
</button>
</div>
</Show>
</Show>
</div>
</section>
+12 -5
View File
@@ -1,7 +1,7 @@
import "./index.css"
import { createAsync, query, redirect } from "@solidjs/router"
import { Title, Meta, Link } from "@solidjs/meta"
import { HttpHeader } from "@solidjs/start"
// import { HttpHeader } from "@solidjs/start"
import zenLogoLight from "../../asset/zen-ornate-light.svg"
import { config } from "~/config"
import zenLogoDark from "../../asset/zen-ornate-dark.svg"
@@ -18,23 +18,24 @@ import { Legal } from "~/component/legal"
import { Footer } from "~/component/footer"
import { Header } from "~/component/header"
import { getLastSeenWorkspaceID } from "../workspace/common"
import { IconGemini, IconZai } from "~/component/icon"
const checkLoggedIn = query(async () => {
"use server"
const workspaceID = await getLastSeenWorkspaceID()
const workspaceID = await getLastSeenWorkspaceID().catch(() => {})
if (workspaceID) throw redirect(`/workspace/${workspaceID}`)
}, "checkLoggedIn.get")
export default function Home() {
createAsync(() => checkLoggedIn())
const loggedin = createAsync(() => checkLoggedIn())
return (
<main data-page="zen">
<HttpHeader name="Cache-Control" value="public, max-age=1, s-maxage=3600, stale-while-revalidate=86400" />
{/*<HttpHeader name="Cache-Control" value="public, max-age=1, s-maxage=3600, stale-while-revalidate=86400" />*/}
<Title>OpenCode Zen | A curated set of reliable optimized models for coding agents</Title>
<Link rel="canonical" href={`${config.baseUrl}/zen`} />
<Link rel="icon" type="image/svg+xml" href="/favicon-zen.svg" />
<Meta property="og:image" content="/social-share-zen.png" />
<Meta name="twitter:image" content="/social-share-zen.png" />
<Meta name="opencode:auth" content={loggedin() ? "true" : "false"} />
<div data-component="container">
<Header zen />
@@ -81,6 +82,9 @@ export default function Home() {
/>
</svg>
</div>
<div>
<IconGemini width="24" height="24" />
</div>
<div>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
@@ -111,6 +115,9 @@ export default function Home() {
/>
</svg>
</div>
<div>
<IconZai width="24" height="24" />
</div>
</div>
<a href="/auth">
<span>Get started with Zen </span>
@@ -0,0 +1,38 @@
import { Resource, waitUntil } from "@opencode-ai/console-resource"
export function createDataDumper(sessionId: string, requestId: string, projectId: string) {
if (Resource.App.stage !== "production") return
if (sessionId === "") return
let data: Record<string, any> = { sessionId, requestId, projectId }
let metadata: Record<string, any> = { sessionId, requestId, projectId }
return {
provideModel: (model?: string) => {
data.modelName = model
metadata.modelName = model
},
provideRequest: (request: string) => (data.request = request),
provideResponse: (response: string) => (data.response = response),
provideStream: (chunk: string) => (data.response = (data.response ?? "") + chunk),
flush: () => {
if (!data.modelName) return
const timestamp = new Date().toISOString().replace(/[^0-9]/g, "")
waitUntil(
Resource.ZenData.put(
`data/${data.modelName}/${sessionId}/${requestId}.json`,
JSON.stringify({ timestamp, ...data }),
),
)
waitUntil(
Resource.ZenData.put(
`meta/${data.modelName}/${timestamp}/${requestId}.json`,
JSON.stringify({ timestamp, ...metadata }),
),
)
},
}
}

Some files were not shown because too many files have changed in this diff Show More