Compare commits

...

891 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
2105 changed files with 53596 additions and 47225 deletions
-57
View File
@@ -1,57 +0,0 @@
#
# This file is intentionally in the wrong dir, will move and add later....
#
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:
auto-label:
runs-on: ubuntu-latest
runs-on: blacksmith-4vcpu-ubuntu-2404
permissions:
contents: read
issues: write
+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 }}
+5 -2
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,7 +21,7 @@ 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: |
{
@@ -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 }}
+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:
+116 -15
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,12 +54,9 @@ 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:
@@ -68,9 +64,87 @@ jobs:
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 }}
@@ -79,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
- fix-snapshot-2
- 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 -7
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
@@ -28,9 +28,3 @@ jobs:
bun turbo test
env:
CI: true
- name: Check SDK is up to date
run: |
bun ./packages/sdk/js/script/build.ts
git diff --exit-code packages/sdk/js/src/gen packages/sdk/js/dist
continue-on-error: false
+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
+20 -2
View File
@@ -18,7 +18,8 @@ on:
jobs:
update:
runs-on: ubuntu-latest
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
@@ -28,6 +29,8 @@ jobs:
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
@@ -40,12 +43,16 @@ jobs:
- 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:
@@ -53,6 +60,8 @@ jobs:
run: |
set -euo pipefail
echo "🔍 Checking for changes in tracked Nix files..."
summarize() {
local status="$1"
{
@@ -70,15 +79,24 @@ jobs:
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"
echo "No changes to tracked Nix files. Hashes are already up to date."
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)"
+2 -1
View File
@@ -6,10 +6,10 @@ node_modules
.idea
.vscode
*~
openapi.json
playground
tmp
dist
ts-dist
.turbo
**/.serena
.serena/
@@ -18,3 +18,4 @@ 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 -2
View File
@@ -1,6 +1,6 @@
---
description: Git commit and push
subtask: true
description: git commit and push
model: opencode/glm-4.6
---
commit and push
@@ -22,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
+1 -1
View File
@@ -1,5 +1,5 @@
---
description: "Find issue(s) on github"
description: "find issue(s) on github"
model: opencode/claude-haiku-4-5
---
+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.
+15 -3
View File
@@ -2,12 +2,24 @@
"$schema": "https://opencode.ai/config.json",
"plugin": ["opencode-openai-codex-auth"],
// "enterprise": {
// "url": "http://localhost:3000",
// "url": "https://enterprise.dev.opencode.ai",
// },
"instructions": ["STYLE_GUIDE.md"],
"provider": {
"opencode": {
"options": {
// "baseURL": "http://localhost:8080",
"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
-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`
+2
View File
@@ -42,6 +42,8 @@ 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.
+1 -1
View File
@@ -30,7 +30,7 @@ scoop bucket add extras; scoop install extras/opencode # Windows
choco install opencode # Windows
brew install opencode # macOS and Linux
paru -S opencode-bin # Arch Linux
mise use --pin -g ubi:sst/opencode # Any OS
mise use -g ubi:sst/opencode # Any OS
nix run nixpkgs#opencode # or github:sst/opencode for latest dev branch
```
+166 -147
View File
@@ -1,149 +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) |
| 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) |
| 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()
+664 -547
View File
File diff suppressed because it is too large Load Diff
Generated
+3 -3
View File
@@ -2,11 +2,11 @@
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1763618868,
"narHash": "sha256-v5afmLjn/uyD9EQuPBn7nZuaZVV9r+JerayK/4wvdWA=",
"lastModified": 1765270179,
"narHash": "sha256-g2a4MhRKu4ymR4xwo+I+auTknXt/+j37Lnf0Mvfl1rE=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "a8d610af3f1a5fb71e23e08434d8d61a466fc942",
"rev": "677fbe97984e7af3175b6c121f3c39ee5c8d62c9",
"type": "github"
},
"original": {
+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 {}
+3
View File
@@ -116,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")
@@ -132,6 +134,7 @@ new sst.cloudflare.x.SolidStart("Console", {
domain,
path: "packages/console/app",
link: [
bucket,
database,
AUTH_API_URL,
STRIPE_WEBHOOK_SECRET,
+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"),
}
+65 -26
View File
@@ -4,50 +4,89 @@ APP=opencode
MUTED='\033[0;2m'
RED='\033[0;31m'
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
if [ "$os" = "linux" ]; then
filename="$APP-$os-$arch.tar.gz"
else
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}"
@@ -314,10 +353,10 @@ echo -e "${MUTED}█░░█ █░░█ █▀▀▀ █░░█ ${NC}█░
echo -e "${MUTED}▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀ ▀ ${NC}▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀"
echo -e ""
echo -e ""
echo -e "${MUTED}To get started, navigate to a project and run:${NC}"
echo -e "opencode ${MUTED}Use free models${NC}"
echo -e "opencode auth login ${MUTED}Add paid provider API keys${NC}"
echo -e "opencode help ${MUTED}List commands and options${NC}"
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 ""
+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))
+1 -1
View File
@@ -1,3 +1,3 @@
{
"nodeModules": "sha256-HILcNy8B0k++ObGwUrD9dM0n9MvASR4AiyxmKSv3LV8="
"nodeModules": "sha256-JT8J+Nd2kk0x46BcyotmBbM39tuKOW7VzXfOV3R3sqQ="
}
+62 -35
View File
@@ -1,4 +1,4 @@
{ lib, stdenv, stdenvNoCC, bun, fzf, ripgrep, makeBinaryWrapper }:
{ lib, stdenvNoCC, bun, ripgrep, makeBinaryWrapper }:
args:
let
scripts = args.scripts;
@@ -28,66 +28,93 @@ stdenvNoCC.mkDerivation (finalAttrs: {
makeBinaryWrapper
];
configurePhase = ''
runHook preConfigure
cp -R ${finalAttrs.node_modules}/. .
runHook postConfigure
'';
env.MODELS_DEV_API_JSON = args.modelsDev;
env.OPENCODE_VERSION = args.version;
env.OPENCODE_CHANNEL = "stable";
dontConfigure = true;
buildPhase = ''
runHook preBuild
cp ${scripts + "/bun-build.ts"} bun-build.ts
cp -r ${finalAttrs.node_modules}/node_modules .
cp -r ${finalAttrs.node_modules}/packages .
substituteInPlace bun-build.ts \
--replace '@VERSION@' "${finalAttrs.version}"
(
cd packages/opencode
export BUN_COMPILE_TARGET=${args.target}
bun --bun bun-build.ts
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
'';
dontStrip = true;
installPhase = ''
runHook preInstall
cd packages/opencode
if [ ! -f opencode ]; then
echo "ERROR: opencode binary not found in $(pwd)"
ls -la
exit 1
fi
if [ ! -f opencode-worker.js ]; then
echo "ERROR: opencode worker bundle not found in $(pwd)"
ls -la
if [ ! -d dist ]; then
echo "ERROR: dist directory missing after bundle step"
exit 1
fi
install -Dm755 opencode $out/bin/opencode
install -Dm644 opencode-worker.js $out/bin/opencode-worker.js
if [ -f opencode-assets.manifest ]; then
while IFS= read -r asset; do
[ -z "$asset" ] && continue
if [ ! -f "$asset" ]; then
echo "ERROR: referenced asset \"$asset\" missing"
exit 1
fi
install -Dm644 "$asset" "$out/bin/$(basename "$asset")"
done < opencode-assets.manifest
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
'';
postFixup = ''
wrapProgram "$out/bin/opencode" --prefix PATH : ${lib.makeBinPath [ fzf ripgrep ]}
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 = ''
+24 -7
View File
@@ -24,15 +24,13 @@ for (const entry of directories) {
if (!info.isDirectory()) {
continue
}
const marker = entry.lastIndexOf("@")
if (marker <= 0) {
const parsed = parseEntry(entry)
if (!parsed) {
continue
}
const slug = entry.slice(0, marker).replace(/\+/g, "/")
const version = entry.slice(marker + 1)
const list = versions.get(slug) ?? []
list.push({ dir: full, version, label: entry })
versions.set(slug, list)
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
@@ -79,6 +77,12 @@ for (const [slug, entry] of Array.from(selections.entries()).sort((a, b) => a[0]
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 })
@@ -94,3 +98,16 @@ for (const line of rewrites.slice(0, 20)) {
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 }
}
+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)
+10 -9
View File
@@ -30,16 +30,16 @@
"@tsconfig/bun": "1.0.9",
"@cloudflare/workers-types": "4.20251008.0",
"@openauthjs/openauth": "0.0.0-20250322224806",
"@pierre/precision-diffs": "0.5.4",
"@pierre/precision-diffs": "0.6.0-beta.10",
"@tailwindcss/vite": "4.1.11",
"diff": "8.0.2",
"ai": "5.0.97",
"hono": "4.7.10",
"hono-openapi": "1.1.1",
"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-list": "0.3.0",
@@ -48,7 +48,7 @@
"vite": "7.1.4",
"@solidjs/meta": "0.29.4",
"@solidjs/router": "0.15.4",
"@solidjs/start": "1.2.0",
"@solidjs/start": "https://pkg.pr.new/@solidjs/start@dfb2020",
"solid-js": "1.9.10",
"vite-plugin-solid": "2.11.10"
}
@@ -63,7 +63,8 @@
"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",
@@ -82,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,
},
},
})
+10 -6
View File
@@ -1,15 +1,16 @@
{
"name": "@opencode-ai/console-app",
"version": "1.0.97",
"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"
"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:",
@@ -17,17 +18,20 @@
"@opencode-ai/console-core": "workspace:*",
"@opencode-ai/console-mail": "workspace:*",
"@opencode-ai/console-resource": "workspace:*",
"@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>
)}
+1 -1
View File
@@ -202,7 +202,7 @@ export function IconZai(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
)
}
export function IconGoogle(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>
+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: "300",
commits: "4,000",
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">
@@ -3,7 +3,7 @@ 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 { createAsync, query, useParams } from "@solidjs/router"
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"
@@ -94,8 +94,6 @@ async function getCosts(workspaceID: string, year: number, month: number) {
}, workspaceID)
}
const queryCosts = query(getCosts, "costs.get")
const MODEL_COLORS: Record<string, string> = {
"claude-sonnet-4-5": "#D4745C",
"claude-sonnet-4": "#E8B4A4",
@@ -158,32 +156,27 @@ export function GraphSection() {
model: null as string | null,
modelDropdownOpen: false,
keyDropdownOpen: false,
colorScheme: "light" as "light" | "dark",
})
const initialData = createAsync(() => queryCosts(params.id!, store.year, store.month))
const onPreviousMonth = async () => {
const month = store.month === 0 ? 11 : store.month - 1
const year = store.month === 0 ? store.year - 1 : store.year
const data = await getCosts(params.id!, year, month)
setStore({ month, year, data })
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, data: await getCosts(params.id!, year, month) })
setStore({ month, year })
}
const onSelectModel = (model: string | null) => setStore({ model, modelDropdownOpen: false })
const onSelectKey = (keyID: string | null) => setStore({ key: keyID, keyDropdownOpen: false })
const getData = createMemo(() => store.data ?? initialData())
const getModels = createMemo(() => {
const data = getData()
if (!data?.usage) return []
return Array.from(new Set(data.usage.map((row) => row.model))).sort()
if (!store.data?.usage) return []
return Array.from(new Set(store.data.usage.map((row) => row.model))).sort()
})
const getDates = createMemo(() => {
@@ -206,10 +199,19 @@ export function GraphSection() {
const isCurrentMonth = () => store.year === now.getFullYear() && store.month === now.getMonth()
const chartConfig = createMemo((): ChartConfiguration | null => {
const data = getData()
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())
@@ -252,7 +254,7 @@ export function GraphSection() {
ticks: {
maxRotation: 0,
autoSkipPadding: 20,
color: "rgba(255, 255, 255, 0.5)",
color: colorTextMuted,
font: {
family: "monospace",
size: 11,
@@ -263,10 +265,10 @@ export function GraphSection() {
stacked: true,
beginAtZero: true,
grid: {
color: "rgba(255, 255, 255, 0.1)",
color: colorBorderMuted,
},
ticks: {
color: "rgba(255, 255, 255, 0.5)",
color: colorTextMuted,
font: {
family: "monospace",
size: 11,
@@ -282,10 +284,10 @@ export function GraphSection() {
tooltip: {
mode: "index",
intersect: false,
backgroundColor: "rgba(0, 0, 0, 0.9)",
titleColor: "rgba(255, 255, 255, 0.9)",
bodyColor: "rgba(255, 255, 255, 0.8)",
borderColor: "rgba(255, 255, 255, 0.1)",
backgroundColor: colorBgElevated,
titleColor: colorText,
bodyColor: colorTextSecondary,
borderColor: colorBorder,
borderWidth: 1,
padding: 12,
displayColors: true,
@@ -301,7 +303,7 @@ export function GraphSection() {
display: true,
position: "bottom",
labels: {
color: "rgba(255, 255, 255, 0.7)",
color: colorTextSecondary,
font: {
size: 12,
},
@@ -339,15 +341,32 @@ export function GraphSection() {
}
})
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())
})
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}>
@@ -356,55 +375,53 @@ export function GraphSection() {
<p>Usage costs broken down by model.</p>
</div>
<Show when={getData()}>
<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={getData()?.keys || []}>
{(key) => (
<button data-slot="model-item" onClick={() => onSelectKey(key.id)}>
<span>{key.displayName}</span>
</button>
)}
</For>
</>
</Dropdown>
<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>
</Show>
<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()}
@@ -8,7 +8,7 @@ import { querySessionInfo } from "../common"
import {
IconAlibaba,
IconAnthropic,
IconGoogle,
IconGemini,
IconMoonshotAI,
IconOpenAI,
IconStealth,
@@ -117,7 +117,7 @@ export function ModelSection() {
case "Anthropic":
return <IconAnthropic width={16} height={16} />
case "Google":
return <IconGoogle width={16} height={16} />
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]
@@ -50,6 +50,10 @@ export function UsageSection() {
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({
@@ -95,8 +99,11 @@ export function UsageSection() {
{(usage, index) => {
const date = createMemo(() => new Date(usage.timeCreated))
const totalInputTokens = createMemo(() => calculateTotalInputTokens(usage))
const breakdownId = `breakdown-${index()}`
const isOpen = createMemo(() => openBreakdownId() === breakdownId)
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>
@@ -110,13 +117,13 @@ export function UsageSection() {
data-slot="breakdown-button"
onClick={(e) => {
e.stopPropagation()
setOpenBreakdownId(isOpen() ? null : breakdownId)
setOpenBreakdownId(isInputOpen() ? null : inputBreakdownId)
}}
>
<IconBreakdown />
</button>
<span onClick={() => setOpenBreakdownId(null)}>{totalInputTokens()}</span>
<Show when={isOpen()}>
<Show when={isInputOpen()}>
<div data-slot="breakdown-popup" onClick={(e) => e.stopPropagation()}>
<div data-slot="breakdown-row">
<span data-slot="breakdown-label">Input</span>
@@ -136,7 +143,32 @@ export function UsageSection() {
</Show>
</div>
</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(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>
)
+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 }),
),
)
},
}
}
@@ -13,12 +13,15 @@ import { ModelTable } from "@opencode-ai/console-core/schema/model.sql.js"
import { ProviderTable } from "@opencode-ai/console-core/schema/provider.sql.js"
import { logger } from "./logger"
import { AuthError, CreditsError, MonthlyLimitError, UserLimitError, ModelError, RateLimitError } from "./error"
import { createBodyConverter, createStreamPartConverter, createResponseConverter } from "./provider/provider"
import { createBodyConverter, createStreamPartConverter, createResponseConverter, UsageInfo } from "./provider/provider"
import { anthropicHelper } from "./provider/anthropic"
import { googleHelper } from "./provider/google"
import { openaiHelper } from "./provider/openai"
import { oaCompatHelper } from "./provider/openai-compatible"
import { createRateLimiter } from "./rateLimiter"
import { createDataDumper } from "./dataDumper"
import { createTrialLimiter } from "./trialLimiter"
import { createStickyTracker } from "./stickyProviderTracker"
type ZenData = Awaited<ReturnType<typeof ZenData.list>>
type RetryOptions = {
@@ -48,22 +51,38 @@ export async function handler(
try {
const url = input.request.url
const body = await input.request.json()
const ip = input.request.headers.get("x-real-ip") ?? ""
const model = opts.parseModel(url, body)
const isStream = opts.parseIsStream(url, body)
const ip = input.request.headers.get("x-real-ip") ?? ""
const sessionId = input.request.headers.get("x-opencode-session") ?? ""
const requestId = input.request.headers.get("x-opencode-request") ?? ""
const projectId = input.request.headers.get("x-opencode-project") ?? ""
logger.metric({
is_tream: isStream,
session: input.request.headers.get("x-opencode-session"),
request: input.request.headers.get("x-opencode-request"),
session: sessionId,
request: requestId,
})
const zenData = ZenData.list()
const modelInfo = validateModel(zenData, model)
const dataDumper = createDataDumper(sessionId, requestId, projectId)
const trialLimiter = createTrialLimiter(modelInfo.trial?.limit, ip)
const isTrial = await trialLimiter?.isTrial()
const rateLimiter = createRateLimiter(modelInfo.id, modelInfo.rateLimit, ip)
await rateLimiter?.check()
const stickyTracker = createStickyTracker(modelInfo.stickyProvider ?? false, sessionId)
const stickyProvider = await stickyTracker?.get()
const retriableRequest = async (retry: RetryOptions = { excludeProviders: [], retryCount: 0 }) => {
const providerInfo = selectProvider(zenData, modelInfo, ip, retry)
const authInfo = await authenticate(modelInfo, providerInfo)
const authInfo = await authenticate(modelInfo)
const providerInfo = selectProvider(
zenData,
authInfo,
modelInfo,
sessionId,
isTrial ?? false,
retry,
stickyProvider,
)
validateBilling(authInfo, modelInfo)
validateModelSettings(authInfo)
updateProviderKey(authInfo, providerInfo)
@@ -104,10 +123,17 @@ export async function handler(
})
}
return { providerInfo, authInfo, res, startTimestamp }
return { providerInfo, authInfo, reqBody, res, startTimestamp }
}
const { providerInfo, authInfo, res, startTimestamp } = await retriableRequest()
const { providerInfo, authInfo, reqBody, res, startTimestamp } = await retriableRequest()
// Store model request
dataDumper?.provideModel(providerInfo.storeModel)
dataDumper?.provideRequest(reqBody)
// Store sticky provider
await stickyTracker?.set(providerInfo.id)
// Scrub response headers
const resHeaders = new Headers()
@@ -126,8 +152,12 @@ export async function handler(
const body = JSON.stringify(responseConverter(json))
logger.metric({ response_length: body.length })
logger.debug("RESPONSE: " + body)
dataDumper?.provideResponse(body)
dataDumper?.flush()
const tokensInfo = providerInfo.normalizeUsage(json.usage)
await trialLimiter?.track(tokensInfo)
await rateLimiter?.track()
await trackUsage(authInfo, modelInfo, providerInfo, json.usage)
await trackUsage(authInfo, modelInfo, providerInfo, tokensInfo)
await reload(authInfo)
return new Response(body, {
status: res.status,
@@ -155,10 +185,13 @@ export async function handler(
response_length: responseLength,
"timestamp.last_byte": Date.now(),
})
dataDumper?.flush()
await rateLimiter?.track()
const usage = usageParser.retrieve()
if (usage) {
await trackUsage(authInfo, modelInfo, providerInfo, usage)
const tokensInfo = providerInfo.normalizeUsage(usage)
await trialLimiter?.track(tokensInfo)
await trackUsage(authInfo, modelInfo, providerInfo, tokensInfo)
await reload(authInfo)
}
c.close()
@@ -174,6 +207,7 @@ export async function handler(
}
responseLength += value.length
buffer += decoder.decode(value, { stream: true })
dataDumper?.provideStream(buffer)
const parts = buffer.split(providerInfo.streamSeparator)
buffer = parts.pop() ?? ""
@@ -263,8 +297,29 @@ export async function handler(
return { id: modelId, ...modelData }
}
function selectProvider(zenData: ZenData, modelInfo: ModelInfo, ip: string, retry: RetryOptions) {
function selectProvider(
zenData: ZenData,
authInfo: AuthInfo,
modelInfo: ModelInfo,
sessionId: string,
isTrial: boolean,
retry: RetryOptions,
stickyProvider: string | undefined,
) {
const provider = (() => {
if (authInfo?.provider?.credentials) {
return modelInfo.providers.find((provider) => provider.id === modelInfo.byokProvider)
}
if (isTrial) {
return modelInfo.providers.find((provider) => provider.id === modelInfo.trial!.provider)
}
if (stickyProvider) {
const provider = modelInfo.providers.find((provider) => provider.id === stickyProvider)
if (provider) return provider
}
if (retry.retryCount === MAX_RETRIES) {
return modelInfo.providers.find((provider) => provider.id === modelInfo.fallbackProvider)
}
@@ -274,9 +329,13 @@ export async function handler(
.filter((provider) => !retry.excludeProviders.includes(provider.id))
.flatMap((provider) => Array<typeof provider>(provider.weight ?? 1).fill(provider))
// Use the last 2 characters of IP address to select a provider
const lastChars = ip.slice(-2)
const index = parseInt(lastChars, 16) % providers.length
// Use the last 4 characters of session ID to select a provider
let h = 0
const l = sessionId.length
for (let i = l - 4; i < l; i++) {
h = (h * 31 + sessionId.charCodeAt(i)) | 0 // 32-bit int
}
const index = (h >>> 0) % providers.length // make unsigned + range 0..length-1
return providers[index || 0]
})()
@@ -296,7 +355,7 @@ export async function handler(
}
}
async function authenticate(modelInfo: ModelInfo, providerInfo: ProviderInfo) {
async function authenticate(modelInfo: ModelInfo) {
const apiKey = opts.parseApiKey(input.request.headers)
if (!apiKey || apiKey === "public") {
if (modelInfo.allowAnonymous) return
@@ -334,7 +393,12 @@ export async function handler(
.leftJoin(ModelTable, and(eq(ModelTable.workspaceID, KeyTable.workspaceID), eq(ModelTable.model, modelInfo.id)))
.leftJoin(
ProviderTable,
and(eq(ProviderTable.workspaceID, KeyTable.workspaceID), eq(ProviderTable.provider, providerInfo.id)),
modelInfo.byokProvider
? and(
eq(ProviderTable.workspaceID, KeyTable.workspaceID),
eq(ProviderTable.provider, modelInfo.byokProvider),
)
: sql`false`,
)
.where(and(eq(KeyTable.key, apiKey), isNull(KeyTable.timeDeleted)))
.then((rows) => rows[0]),
@@ -411,14 +475,18 @@ export async function handler(
}
function updateProviderKey(authInfo: AuthInfo, providerInfo: ProviderInfo) {
if (!authInfo) return
if (!authInfo.provider?.credentials) return
if (!authInfo?.provider?.credentials) return
providerInfo.apiKey = authInfo.provider.credentials
}
async function trackUsage(authInfo: AuthInfo, modelInfo: ModelInfo, providerInfo: ProviderInfo, usage: any) {
async function trackUsage(
authInfo: AuthInfo,
modelInfo: ModelInfo,
providerInfo: ProviderInfo,
usageInfo: UsageInfo,
) {
const { inputTokens, outputTokens, reasoningTokens, cacheReadTokens, cacheWrite5mTokens, cacheWrite1hTokens } =
providerInfo.normalizeUsage(usage)
usageInfo
const modelCost =
modelInfo.cost200K &&
@@ -520,7 +588,7 @@ export async function handler(
tx
.update(KeyTable)
.set({ timeUsed: sql`now()` })
.where(eq(KeyTable.id, authInfo.apiKeyId)),
.where(and(eq(KeyTable.workspaceID, authInfo.workspaceID), eq(KeyTable.id, authInfo.apiKeyId))),
)
}
@@ -24,6 +24,15 @@ import {
toOaCompatibleResponse,
} from "./openai-compatible"
export type UsageInfo = {
inputTokens: number
outputTokens: number
reasoningTokens?: number
cacheReadTokens?: number
cacheWrite5mTokens?: number
cacheWrite1hTokens?: number
}
export type ProviderHelper = {
format: ZenData.Format
modifyUrl: (providerApi: string, model?: string, isStream?: boolean) => string
@@ -34,14 +43,7 @@ export type ProviderHelper = {
parse: (chunk: string) => void
retrieve: () => any
}
normalizeUsage: (usage: any) => {
inputTokens: number
outputTokens: number
reasoningTokens?: number
cacheReadTokens?: number
cacheWrite5mTokens?: number
cacheWrite1hTokens?: number
}
normalizeUsage: (usage: any) => UsageInfo
}
export interface CommonMessage {
@@ -0,0 +1,16 @@
import { Resource } from "@opencode-ai/console-resource"
export function createStickyTracker(stickyProvider: boolean, session: string) {
if (!stickyProvider) return
if (!session) return
const key = `sticky:${session}`
return {
get: async () => {
return await Resource.GatewayKv.get(key)
},
set: async (providerId: string) => {
await Resource.GatewayKv.put(key, providerId, { expirationTtl: 86400 })
},
}
}
@@ -0,0 +1,43 @@
import { Database, eq, sql } from "@opencode-ai/console-core/drizzle/index.js"
import { IpTable } from "@opencode-ai/console-core/schema/ip.sql.js"
import { UsageInfo } from "./provider/provider"
export function createTrialLimiter(limit: number | undefined, ip: string) {
if (!limit) return
if (!ip) return
let trial: boolean
return {
isTrial: async () => {
const data = await Database.use((tx) =>
tx
.select({
usage: IpTable.usage,
})
.from(IpTable)
.where(eq(IpTable.ip, ip))
.then((rows) => rows[0]),
)
trial = (data?.usage ?? 0) < limit
return trial
},
track: async (usageInfo: UsageInfo) => {
if (!trial) return
const usage =
usageInfo.inputTokens +
usageInfo.outputTokens +
(usageInfo.reasoningTokens ?? 0) +
(usageInfo.cacheReadTokens ?? 0) +
(usageInfo.cacheWrite5mTokens ?? 0) +
(usageInfo.cacheWrite1hTokens ?? 0)
await Database.use((tx) =>
tx
.insert(IpTable)
.values({ ip, usage })
.onDuplicateKeyUpdate({ set: { usage: sql`${IpTable.usage} + ${usage}` } }),
)
},
}
}
+1 -1
View File
@@ -6,4 +6,4 @@
/// <reference path="../../../sst-env.d.ts" />
import "sst"
export {}
export {}
+1 -1
View File
@@ -12,7 +12,7 @@
"allowJs": true,
"strict": true,
"noEmit": true,
"types": ["vinxi/types/client"],
"types": ["vite/client"],
"isolatedModules": true,
"paths": {
"~/*": ["./src/*"]
+25
View File
@@ -0,0 +1,25 @@
import { defineConfig, PluginOption } from "vite"
import { solidStart } from "@solidjs/start/config"
import { nitro } from "nitro/vite"
export default defineConfig({
plugins: [
solidStart() as PluginOption,
nitro({
compatibilityDate: "2024-09-19",
preset: "cloudflare_module",
cloudflare: {
nodeCompat: true,
},
}),
],
server: {
allowedHosts: true,
},
build: {
rollupOptions: {
external: ["cloudflare:workers"],
},
minify: false,
},
})
@@ -0,0 +1,8 @@
CREATE TABLE `ip` (
`ip` varchar(45) NOT NULL,
`time_created` timestamp(3) NOT NULL DEFAULT (now()),
`time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
`time_deleted` timestamp(3),
`usage` int,
CONSTRAINT `ip_ip_pk` PRIMARY KEY(`ip`)
);
@@ -0,0 +1,981 @@
{
"version": "5",
"dialect": "mysql",
"id": "9d5d9885-7ec5-45f6-ac53-45a8e25dede7",
"prevId": "8b7fa839-a088-408e-84a4-1a07325c0290",
"tables": {
"account": {
"name": "account",
"columns": {
"id": {
"name": "id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"time_created": {
"name": "time_created",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "(now())"
},
"time_updated": {
"name": "time_updated",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)"
},
"time_deleted": {
"name": "time_deleted",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {
"account_id_pk": {
"name": "account_id_pk",
"columns": ["id"]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"auth": {
"name": "auth",
"columns": {
"id": {
"name": "id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"time_created": {
"name": "time_created",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "(now())"
},
"time_updated": {
"name": "time_updated",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)"
},
"time_deleted": {
"name": "time_deleted",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"provider": {
"name": "provider",
"type": "enum('email','github','google')",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"subject": {
"name": "subject",
"type": "varchar(255)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"account_id": {
"name": "account_id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"provider": {
"name": "provider",
"columns": ["provider", "subject"],
"isUnique": true
},
"account_id": {
"name": "account_id",
"columns": ["account_id"],
"isUnique": false
}
},
"foreignKeys": {},
"compositePrimaryKeys": {
"auth_id_pk": {
"name": "auth_id_pk",
"columns": ["id"]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"billing": {
"name": "billing",
"columns": {
"id": {
"name": "id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"workspace_id": {
"name": "workspace_id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"time_created": {
"name": "time_created",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "(now())"
},
"time_updated": {
"name": "time_updated",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)"
},
"time_deleted": {
"name": "time_deleted",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"customer_id": {
"name": "customer_id",
"type": "varchar(255)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"payment_method_id": {
"name": "payment_method_id",
"type": "varchar(255)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"payment_method_type": {
"name": "payment_method_type",
"type": "varchar(32)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"payment_method_last4": {
"name": "payment_method_last4",
"type": "varchar(4)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"balance": {
"name": "balance",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"monthly_limit": {
"name": "monthly_limit",
"type": "int",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"monthly_usage": {
"name": "monthly_usage",
"type": "bigint",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"time_monthly_usage_updated": {
"name": "time_monthly_usage_updated",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"reload": {
"name": "reload",
"type": "boolean",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"reload_trigger": {
"name": "reload_trigger",
"type": "int",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"reload_amount": {
"name": "reload_amount",
"type": "int",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"reload_error": {
"name": "reload_error",
"type": "varchar(255)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"time_reload_error": {
"name": "time_reload_error",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"time_reload_locked_till": {
"name": "time_reload_locked_till",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {
"global_customer_id": {
"name": "global_customer_id",
"columns": ["customer_id"],
"isUnique": true
}
},
"foreignKeys": {},
"compositePrimaryKeys": {
"billing_workspace_id_id_pk": {
"name": "billing_workspace_id_id_pk",
"columns": ["workspace_id", "id"]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"payment": {
"name": "payment",
"columns": {
"id": {
"name": "id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"workspace_id": {
"name": "workspace_id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"time_created": {
"name": "time_created",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "(now())"
},
"time_updated": {
"name": "time_updated",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)"
},
"time_deleted": {
"name": "time_deleted",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"customer_id": {
"name": "customer_id",
"type": "varchar(255)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"invoice_id": {
"name": "invoice_id",
"type": "varchar(255)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"payment_id": {
"name": "payment_id",
"type": "varchar(255)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"amount": {
"name": "amount",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"time_refunded": {
"name": "time_refunded",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {
"payment_workspace_id_id_pk": {
"name": "payment_workspace_id_id_pk",
"columns": ["workspace_id", "id"]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"usage": {
"name": "usage",
"columns": {
"id": {
"name": "id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"workspace_id": {
"name": "workspace_id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"time_created": {
"name": "time_created",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "(now())"
},
"time_updated": {
"name": "time_updated",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)"
},
"time_deleted": {
"name": "time_deleted",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"model": {
"name": "model",
"type": "varchar(255)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"provider": {
"name": "provider",
"type": "varchar(255)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"input_tokens": {
"name": "input_tokens",
"type": "int",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"output_tokens": {
"name": "output_tokens",
"type": "int",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"reasoning_tokens": {
"name": "reasoning_tokens",
"type": "int",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"cache_read_tokens": {
"name": "cache_read_tokens",
"type": "int",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"cache_write_5m_tokens": {
"name": "cache_write_5m_tokens",
"type": "int",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"cache_write_1h_tokens": {
"name": "cache_write_1h_tokens",
"type": "int",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"cost": {
"name": "cost",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"key_id": {
"name": "key_id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {
"usage_workspace_id_id_pk": {
"name": "usage_workspace_id_id_pk",
"columns": ["workspace_id", "id"]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"ip": {
"name": "ip",
"columns": {
"ip": {
"name": "ip",
"type": "varchar(45)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"time_created": {
"name": "time_created",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "(now())"
},
"time_updated": {
"name": "time_updated",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)"
},
"time_deleted": {
"name": "time_deleted",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"usage": {
"name": "usage",
"type": "int",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {
"ip_ip_pk": {
"name": "ip_ip_pk",
"columns": ["ip"]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"key": {
"name": "key",
"columns": {
"id": {
"name": "id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"workspace_id": {
"name": "workspace_id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"time_created": {
"name": "time_created",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "(now())"
},
"time_updated": {
"name": "time_updated",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)"
},
"time_deleted": {
"name": "time_deleted",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"name": {
"name": "name",
"type": "varchar(255)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"key": {
"name": "key",
"type": "varchar(255)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"user_id": {
"name": "user_id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"time_used": {
"name": "time_used",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {
"global_key": {
"name": "global_key",
"columns": ["key"],
"isUnique": true
}
},
"foreignKeys": {},
"compositePrimaryKeys": {
"key_workspace_id_id_pk": {
"name": "key_workspace_id_id_pk",
"columns": ["workspace_id", "id"]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"model": {
"name": "model",
"columns": {
"id": {
"name": "id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"workspace_id": {
"name": "workspace_id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"time_created": {
"name": "time_created",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "(now())"
},
"time_updated": {
"name": "time_updated",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)"
},
"time_deleted": {
"name": "time_deleted",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"model": {
"name": "model",
"type": "varchar(64)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"model_workspace_model": {
"name": "model_workspace_model",
"columns": ["workspace_id", "model"],
"isUnique": true
}
},
"foreignKeys": {},
"compositePrimaryKeys": {
"model_workspace_id_id_pk": {
"name": "model_workspace_id_id_pk",
"columns": ["workspace_id", "id"]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"provider": {
"name": "provider",
"columns": {
"id": {
"name": "id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"workspace_id": {
"name": "workspace_id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"time_created": {
"name": "time_created",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "(now())"
},
"time_updated": {
"name": "time_updated",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)"
},
"time_deleted": {
"name": "time_deleted",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"provider": {
"name": "provider",
"type": "varchar(64)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"credentials": {
"name": "credentials",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"workspace_provider": {
"name": "workspace_provider",
"columns": ["workspace_id", "provider"],
"isUnique": true
}
},
"foreignKeys": {},
"compositePrimaryKeys": {
"provider_workspace_id_id_pk": {
"name": "provider_workspace_id_id_pk",
"columns": ["workspace_id", "id"]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"user": {
"name": "user",
"columns": {
"id": {
"name": "id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"workspace_id": {
"name": "workspace_id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"time_created": {
"name": "time_created",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "(now())"
},
"time_updated": {
"name": "time_updated",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)"
},
"time_deleted": {
"name": "time_deleted",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"account_id": {
"name": "account_id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"email": {
"name": "email",
"type": "varchar(255)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"name": {
"name": "name",
"type": "varchar(255)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"time_seen": {
"name": "time_seen",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"color": {
"name": "color",
"type": "int",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"role": {
"name": "role",
"type": "enum('admin','member')",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"monthly_limit": {
"name": "monthly_limit",
"type": "int",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"monthly_usage": {
"name": "monthly_usage",
"type": "bigint",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"time_monthly_usage_updated": {
"name": "time_monthly_usage_updated",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {
"user_account_id": {
"name": "user_account_id",
"columns": ["workspace_id", "account_id"],
"isUnique": true
},
"user_email": {
"name": "user_email",
"columns": ["workspace_id", "email"],
"isUnique": true
},
"global_account_id": {
"name": "global_account_id",
"columns": ["account_id"],
"isUnique": false
},
"global_email": {
"name": "global_email",
"columns": ["email"],
"isUnique": false
}
},
"foreignKeys": {},
"compositePrimaryKeys": {
"user_workspace_id_id_pk": {
"name": "user_workspace_id_id_pk",
"columns": ["workspace_id", "id"]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"workspace": {
"name": "workspace",
"columns": {
"id": {
"name": "id",
"type": "varchar(30)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"slug": {
"name": "slug",
"type": "varchar(255)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"name": {
"name": "name",
"type": "varchar(255)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"time_created": {
"name": "time_created",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "(now())"
},
"time_updated": {
"name": "time_updated",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)"
},
"time_deleted": {
"name": "time_deleted",
"type": "timestamp(3)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {
"slug": {
"name": "slug",
"columns": ["slug"],
"isUnique": true
}
},
"foreignKeys": {},
"compositePrimaryKeys": {
"workspace_id": {
"name": "workspace_id",
"columns": ["id"]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
}
},
"views": {},
"_meta": {
"schemas": {},
"tables": {},
"columns": {}
},
"internal": {
"tables": {},
"indexes": {}
}
}
@@ -267,6 +267,13 @@
"when": 1761928273807,
"tag": "0037_messy_jackal",
"breakpoints": true
},
{
"idx": 38,
"version": "5",
"when": 1764110043942,
"tag": "0038_famous_magik",
"breakpoints": true
}
]
}
+2 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/console-core",
"version": "1.0.97",
"version": "1.0.143",
"private": true,
"type": "module",
"dependencies": {
@@ -30,6 +30,7 @@
"update-models": "script/update-models.ts",
"promote-models-to-dev": "script/promote-models.ts dev",
"promote-models-to-prod": "script/promote-models.ts production",
"pull-models-from-dev": "script/pull-models.ts dev",
"typecheck": "tsgo --noEmit"
},
"devDependencies": {

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