From 2125dc11c7620d5b78aa2f5a5579732736e82d49 Mon Sep 17 00:00:00 2001 From: Dax Date: Thu, 29 Jan 2026 16:19:50 -0500 Subject: [PATCH 01/61] fix: show all provider models when no providers connected (#11198) --- packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx index bcbbe69287..4ad92eeb83 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx @@ -158,7 +158,7 @@ export function DialogModel(props: { providerID?: string }) { (item) => item.providerID === value.providerID && item.modelID === value.modelID, ) if (inFavorites) return false - const inRecents = recentList.some( + const inRecents = recents.some( (item) => item.providerID === value.providerID && item.modelID === value.modelID, ) if (inRecents) return false From 6cc739701b00b3edfa3334488d13082ea668b3f3 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 29 Jan 2026 16:28:54 -0500 Subject: [PATCH 02/61] zen: kimi k2.5 free (#11199) --- packages/web/src/content/docs/zen.mdx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/web/src/content/docs/zen.mdx b/packages/web/src/content/docs/zen.mdx index ae7a982964..ddaabbef09 100644 --- a/packages/web/src/content/docs/zen.mdx +++ b/packages/web/src/content/docs/zen.mdx @@ -87,6 +87,7 @@ You can also access our models through the following API endpoints. | GLM 4.7 Free | glm-4.7-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | | GLM 4.6 | glm-4.6 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | | Kimi K2.5 | kimi-k2.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | +| Kimi K2.5 Free | kimi-k2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | | Kimi K2 Thinking | kimi-k2-thinking | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | | Kimi K2 | kimi-k2 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | | Qwen3 Coder 480B | qwen3-coder | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | @@ -120,7 +121,8 @@ We support a pay-as-you-go model. Below are the prices **per 1M tokens**. | GLM 4.7 Free | Free | Free | Free | - | | GLM 4.7 | $0.60 | $2.20 | $0.10 | - | | GLM 4.6 | $0.60 | $2.20 | $0.10 | - | -| Kimi K2.5 | $0.60 | $3.00 | $0.10 | - | +| Kimi K2.5 Free | Free | Free | Free | - | +| Kimi K2.5 | $0.60 | $3.00 | $0.08 | - | | Kimi K2 Thinking | $0.40 | $2.50 | - | - | | Kimi K2 | $0.40 | $2.50 | - | - | | Qwen3 Coder 480B | $0.45 | $1.50 | - | - | @@ -153,8 +155,9 @@ Credit card fees are passed along at cost (4.4% + $0.30 per transaction); we don The free models: -- GLM 4.7 is currently free on OpenCode for a limited time. The team is using this time to collect feedback and improve the model. -- MiniMax M2.1 is currently free on OpenCode for a limited time. The team is using this time to collect feedback and improve the model. +- GLM 4.7 Free is available on OpenCode for a limited time. The team is using this time to collect feedback and improve the model. +- Kimi M2.5 Free is available on OpenCode for a limited time. The team is using this time to collect feedback and improve the model. +- MiniMax M2.1 Free is available on OpenCode for a limited time. The team is using this time to collect feedback and improve the model. - Big Pickle is a stealth model that's free on OpenCode for a limited time. The team is using this time to collect feedback and improve the model. Contact us if you have any questions. @@ -184,9 +187,10 @@ charging you more than $20 if your balance goes below $5. All our models are hosted in the US. Our providers follow a zero-retention policy and do not use your data for model training, with the following exceptions: -- GLM 4.7: During its free period, collected data may be used to improve the model. -- MiniMax M2.1: During its free period, collected data may be used to improve the model. - Big Pickle: During its free period, collected data may be used to improve the model. +- GLM 4.7 Free: During its free period, collected data may be used to improve the model. +- Kimi K2.5 Free: During its free period, collected data may be used to improve the model. +- MiniMax M2.1 Free: During its free period, collected data may be used to improve the model. - OpenAI APIs: Requests are retained for 30 days in accordance with [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). - Anthropic APIs: Requests are retained for 30 days in accordance with [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). From 75166a1961f1963927b838c729bcd17f8acd0858 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Thu, 29 Jan 2026 16:00:12 -0600 Subject: [PATCH 03/61] fix: use ?? to prevent args being undefined for mcp server in some cases (#11203) --- packages/opencode/src/mcp/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opencode/src/mcp/index.ts b/packages/opencode/src/mcp/index.ts index 045c58ef03..29e958fe35 100644 --- a/packages/opencode/src/mcp/index.ts +++ b/packages/opencode/src/mcp/index.ts @@ -135,7 +135,7 @@ export namespace MCP { return client.callTool( { name: mcpTool.name, - arguments: args as Record, + arguments: (args || {}) as Record, }, CallToolResultSchema, { From b5ffa997dad94f87e68d557631de174ea09f6b77 Mon Sep 17 00:00:00 2001 From: Mikhail Levchenko Date: Thu, 29 Jan 2026 23:56:25 +0100 Subject: [PATCH 04/61] feat(config): add managed settings support for enterprise deployments (#6441) Co-authored-by: Dax --- packages/opencode/src/config/config.ts | 27 ++- packages/opencode/test/config/config.test.ts | 207 +++++++++++++------ packages/opencode/test/preload.ts | 4 + 3 files changed, 172 insertions(+), 66 deletions(-) diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index adf733e322..2f1cba8a05 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -32,6 +32,21 @@ import { Event } from "../server/event" export namespace Config { const log = Log.create({ service: "config" }) + // Managed settings directory for enterprise deployments (highest priority, admin-controlled) + // These settings override all user and project settings + function getManagedConfigDir(): string { + switch (process.platform) { + case "darwin": + return "/Library/Application Support/opencode" + case "win32": + return path.join(process.env.ProgramData || "C:\\ProgramData", "opencode") + default: + return "/etc/opencode" + } + } + + const managedConfigDir = process.env.OPENCODE_TEST_MANAGED_CONFIG_DIR || getManagedConfigDir() + // Custom merge function that concatenates array fields instead of replacing them function mergeConfigConcatArrays(target: Info, source: Info): Info { const merged = mergeDeep(target, source) @@ -148,8 +163,18 @@ export namespace Config { result.plugin.push(...(await loadPlugin(dir))) } + // Load managed config files last (highest priority) - enterprise admin-controlled + // Kept separate from directories array to avoid write operations when installing plugins + // which would fail on system directories requiring elevated permissions + // This way it only loads config file and not skills/plugins/commands + if (existsSync(managedConfigDir)) { + for (const file of ["opencode.jsonc", "opencode.json"]) { + result = mergeConfigConcatArrays(result, await loadFile(path.join(managedConfigDir, file))) + } + } + // Migrate deprecated mode field to agent field - for (const [name, mode] of Object.entries(result.mode)) { + for (const [name, mode] of Object.entries(result.mode ?? {})) { result.agent = mergeDeep(result.agent ?? {}, { [name]: { ...mode, diff --git a/packages/opencode/test/config/config.test.ts b/packages/opencode/test/config/config.test.ts index decd18446c..1752e22e01 100644 --- a/packages/opencode/test/config/config.test.ts +++ b/packages/opencode/test/config/config.test.ts @@ -1,4 +1,4 @@ -import { test, expect, describe, mock } from "bun:test" +import { test, expect, describe, mock, afterEach } from "bun:test" import { Config } from "../../src/config/config" import { Instance } from "../../src/project/instance" import { Auth } from "../../src/auth" @@ -6,6 +6,23 @@ import { tmpdir } from "../fixture/fixture" import path from "path" import fs from "fs/promises" import { pathToFileURL } from "url" +import { Global } from "../../src/global" + +// Get managed config directory from environment (set in preload.ts) +const managedConfigDir = process.env.OPENCODE_TEST_MANAGED_CONFIG_DIR! + +afterEach(async () => { + await fs.rm(managedConfigDir, { force: true, recursive: true }).catch(() => {}) +}) + +async function writeManagedSettings(settings: object, filename = "opencode.json") { + await fs.mkdir(managedConfigDir, { recursive: true }) + await Bun.write(path.join(managedConfigDir, filename), JSON.stringify(settings)) +} + +async function writeConfig(dir: string, config: object, name = "opencode.json") { + await Bun.write(path.join(dir, name), JSON.stringify(config)) +} test("loads config with defaults when no files exist", async () => { await using tmp = await tmpdir() @@ -21,14 +38,11 @@ test("loads config with defaults when no files exist", async () => { test("loads JSON config file", async () => { await using tmp = await tmpdir({ init: async (dir) => { - await Bun.write( - path.join(dir, "opencode.json"), - JSON.stringify({ - $schema: "https://opencode.ai/config.json", - model: "test/model", - username: "testuser", - }), - ) + await writeConfig(dir, { + $schema: "https://opencode.ai/config.json", + model: "test/model", + username: "testuser", + }) }, }) await Instance.provide({ @@ -68,21 +82,19 @@ test("loads JSONC config file", async () => { test("merges multiple config files with correct precedence", async () => { await using tmp = await tmpdir({ init: async (dir) => { - await Bun.write( - path.join(dir, "opencode.jsonc"), - JSON.stringify({ + await writeConfig( + dir, + { $schema: "https://opencode.ai/config.json", model: "base", username: "base", - }), - ) - await Bun.write( - path.join(dir, "opencode.json"), - JSON.stringify({ - $schema: "https://opencode.ai/config.json", - model: "override", - }), + }, + "opencode.jsonc", ) + await writeConfig(dir, { + $schema: "https://opencode.ai/config.json", + model: "override", + }) }, }) await Instance.provide({ @@ -102,13 +114,10 @@ test("handles environment variable substitution", async () => { try { await using tmp = await tmpdir({ init: async (dir) => { - await Bun.write( - path.join(dir, "opencode.json"), - JSON.stringify({ - $schema: "https://opencode.ai/config.json", - theme: "{env:TEST_VAR}", - }), - ) + await writeConfig(dir, { + $schema: "https://opencode.ai/config.json", + theme: "{env:TEST_VAR}", + }) }, }) await Instance.provide({ @@ -169,13 +178,10 @@ test("handles file inclusion substitution", async () => { await using tmp = await tmpdir({ init: async (dir) => { await Bun.write(path.join(dir, "included.txt"), "test_theme") - await Bun.write( - path.join(dir, "opencode.json"), - JSON.stringify({ - $schema: "https://opencode.ai/config.json", - theme: "{file:included.txt}", - }), - ) + await writeConfig(dir, { + $schema: "https://opencode.ai/config.json", + theme: "{file:included.txt}", + }) }, }) await Instance.provide({ @@ -190,13 +196,10 @@ test("handles file inclusion substitution", async () => { test("validates config schema and throws on invalid fields", async () => { await using tmp = await tmpdir({ init: async (dir) => { - await Bun.write( - path.join(dir, "opencode.json"), - JSON.stringify({ - $schema: "https://opencode.ai/config.json", - invalid_field: "should cause error", - }), - ) + await writeConfig(dir, { + $schema: "https://opencode.ai/config.json", + invalid_field: "should cause error", + }) }, }) await Instance.provide({ @@ -225,19 +228,16 @@ test("throws error for invalid JSON", async () => { test("handles agent configuration", async () => { await using tmp = await tmpdir({ init: async (dir) => { - await Bun.write( - path.join(dir, "opencode.json"), - JSON.stringify({ - $schema: "https://opencode.ai/config.json", - agent: { - test_agent: { - model: "test/model", - temperature: 0.7, - description: "test agent", - }, + await writeConfig(dir, { + $schema: "https://opencode.ai/config.json", + agent: { + test_agent: { + model: "test/model", + temperature: 0.7, + description: "test agent", }, - }), - ) + }, + }) }, }) await Instance.provide({ @@ -258,19 +258,16 @@ test("handles agent configuration", async () => { test("handles command configuration", async () => { await using tmp = await tmpdir({ init: async (dir) => { - await Bun.write( - path.join(dir, "opencode.json"), - JSON.stringify({ - $schema: "https://opencode.ai/config.json", - command: { - test_command: { - template: "test template", - description: "test command", - agent: "test_agent", - }, + await writeConfig(dir, { + $schema: "https://opencode.ai/config.json", + command: { + test_command: { + template: "test template", + description: "test command", + agent: "test_agent", }, - }), - ) + }, + }) }, }) await Instance.provide({ @@ -894,6 +891,86 @@ test("migrates legacy write tool to edit permission", async () => { }) }) +// Managed settings tests +// Note: preload.ts sets OPENCODE_TEST_MANAGED_CONFIG which Global.Path.managedConfig uses + +test("managed settings override user settings", async () => { + await using tmp = await tmpdir({ + init: async (dir) => { + await writeConfig(dir, { + $schema: "https://opencode.ai/config.json", + model: "user/model", + share: "auto", + username: "testuser", + }) + }, + }) + + await writeManagedSettings({ + $schema: "https://opencode.ai/config.json", + model: "managed/model", + share: "disabled", + }) + + await Instance.provide({ + directory: tmp.path, + fn: async () => { + const config = await Config.get() + expect(config.model).toBe("managed/model") + expect(config.share).toBe("disabled") + expect(config.username).toBe("testuser") + }, + }) +}) + +test("managed settings override project settings", async () => { + await using tmp = await tmpdir({ + init: async (dir) => { + await writeConfig(dir, { + $schema: "https://opencode.ai/config.json", + autoupdate: true, + disabled_providers: [], + theme: "dark", + }) + }, + }) + + await writeManagedSettings({ + $schema: "https://opencode.ai/config.json", + autoupdate: false, + disabled_providers: ["openai"], + }) + + await Instance.provide({ + directory: tmp.path, + fn: async () => { + const config = await Config.get() + expect(config.autoupdate).toBe(false) + expect(config.disabled_providers).toEqual(["openai"]) + expect(config.theme).toBe("dark") + }, + }) +}) + +test("missing managed settings file is not an error", async () => { + await using tmp = await tmpdir({ + init: async (dir) => { + await writeConfig(dir, { + $schema: "https://opencode.ai/config.json", + model: "user/model", + }) + }, + }) + + await Instance.provide({ + directory: tmp.path, + fn: async () => { + const config = await Config.get() + expect(config.model).toBe("user/model") + }, + }) +}) + test("migrates legacy edit tool to edit permission", async () => { await using tmp = await tmpdir({ init: async (dir) => { diff --git a/packages/opencode/test/preload.ts b/packages/opencode/test/preload.ts index 1cb7778623..c1b03ea821 100644 --- a/packages/opencode/test/preload.ts +++ b/packages/opencode/test/preload.ts @@ -17,6 +17,10 @@ const testHome = path.join(dir, "home") await fs.mkdir(testHome, { recursive: true }) process.env["OPENCODE_TEST_HOME"] = testHome +// Set test managed config directory to isolate tests from system managed settings +const testManagedConfigDir = path.join(dir, "managed") +process.env["OPENCODE_TEST_MANAGED_CONFIG_DIR"] = testManagedConfigDir + process.env["XDG_DATA_HOME"] = path.join(dir, "share") process.env["XDG_CACHE_HOME"] = path.join(dir, "cache") process.env["XDG_CONFIG_HOME"] = path.join(dir, "config") From 8ce19f8ccad74a9126d7fe4cd24c778d2411a860 Mon Sep 17 00:00:00 2001 From: Github Action Date: Thu, 29 Jan 2026 23:19:19 +0000 Subject: [PATCH 05/61] chore: update nix node_modules hashes --- nix/hashes.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nix/hashes.json b/nix/hashes.json index 8e95135aa2..f50c7a23df 100644 --- a/nix/hashes.json +++ b/nix/hashes.json @@ -1,8 +1,8 @@ { "nodeModules": { - "x86_64-linux": "sha256-yAtZlh6YR78RwPt0LK/7Pk0qUm0/97+s6ghhZzuoE/0=", - "aarch64-linux": "sha256-6j81rdjQ7Wps9bvfw+mmdwW5p01qUOwX40UZltCTe3Y=", - "aarch64-darwin": "sha256-pDM8M/QMWR6Go5pz3XXsJqcJDHAlHrx2Faijjkzcngo=", - "x86_64-darwin": "sha256-eOAPtMd1n5xYupBOevCLhY1eFy3wzGqFk/EsZocl9Y8=" + "x86_64-linux": "sha256-gUWzUsk81miIrjg0fZQmsIQG4pZYmEHgzN6BaXI+lfc=", + "aarch64-linux": "sha256-gwEG75ha/ojTO2iAObTmLTtEkXIXJ7BThzfI5CqlJh8=", + "aarch64-darwin": "sha256-20RGG2GkUItCzD67gDdoSLfexttM8abS//FKO9bfjoM=", + "x86_64-darwin": "sha256-i2VawFuR1UbjPVYoybU6aJDJfFo0tcvtl1aM31Y2mTQ=" } } From b35265823c2cc0dd45deddc837d1e4c8fccb01fd Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 29 Jan 2026 18:59:15 -0500 Subject: [PATCH 06/61] ci --- .github/workflows/publish.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index caa9aca310..623ca74ae5 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -36,8 +36,6 @@ jobs: if: github.repository == 'anomalyco/opencode' steps: - uses: actions/checkout@v3 - with: - fetch-depth: 1 - uses: ./.github/actions/setup-bun - id: version run: | @@ -58,7 +56,6 @@ jobs: steps: - uses: actions/checkout@v3 with: - fetch-depth: 1 fetch-tags: true - uses: ./.github/actions/setup-bun @@ -103,7 +100,6 @@ jobs: steps: - uses: actions/checkout@v3 with: - fetch-depth: 1 fetch-tags: true - uses: apple-actions/import-codesign-certs@v2 @@ -196,8 +192,8 @@ jobs: runs-on: blacksmith-4vcpu-ubuntu-2404 steps: - uses: actions/checkout@v3 - with: - fetch-depth: 1 + + - uses: ./.github/actions/setup-bun - name: Install OpenCode if: inputs.bump || inputs.version @@ -227,8 +223,6 @@ jobs: git config --global user.name "opencode" git remote set-url origin https://x-access-token:${{ secrets.SST_GITHUB_TOKEN }}@github.com/${{ github.repository }} - - uses: ./.github/actions/setup-bun - - uses: actions/download-artifact@v4 with: name: opencode-cli From 4c82ad6280d632142d82bde8814c922502fa9716 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 29 Jan 2026 19:00:52 -0500 Subject: [PATCH 07/61] ci --- .github/workflows/publish.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 623ca74ae5..8329892e12 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -187,8 +187,6 @@ jobs: publish: needs: - version - - build-cli - - build-tauri runs-on: blacksmith-4vcpu-ubuntu-2404 steps: - uses: actions/checkout@v3 From 4f4694d9e3e1ce240f7a5b7a576dc44408e82f7a Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 29 Jan 2026 19:03:07 -0500 Subject: [PATCH 08/61] ci --- .github/workflows/publish.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8329892e12..a169d90af6 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -187,6 +187,8 @@ jobs: publish: needs: - version + - build-cli + # - build-tauri runs-on: blacksmith-4vcpu-ubuntu-2404 steps: - uses: actions/checkout@v3 From a5c01a81ff940887eff298ac2dc2eab47a9d554c Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 29 Jan 2026 19:08:48 -0500 Subject: [PATCH 09/61] ci --- .github/workflows/publish.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a169d90af6..25879c3769 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -192,6 +192,8 @@ jobs: runs-on: blacksmith-4vcpu-ubuntu-2404 steps: - uses: actions/checkout@v3 + with: + fetch-depth: 0 - uses: ./.github/actions/setup-bun From bbc7bdb3fd5078d0add23273e0fdae436b9b47e4 Mon Sep 17 00:00:00 2001 From: opencode Date: Fri, 30 Jan 2026 00:31:06 +0000 Subject: [PATCH 10/61] release: v1.1.43 --- bun.lock | 30 +++++++++++++------------- packages/app/package.json | 2 +- packages/console/app/package.json | 2 +- packages/console/core/package.json | 2 +- packages/console/function/package.json | 2 +- packages/console/mail/package.json | 2 +- packages/desktop/package.json | 2 +- packages/enterprise/package.json | 2 +- packages/extensions/zed/extension.toml | 12 +++++------ packages/function/package.json | 2 +- packages/opencode/package.json | 2 +- packages/plugin/package.json | 2 +- packages/sdk/js/package.json | 2 +- packages/slack/package.json | 2 +- packages/ui/package.json | 2 +- packages/util/package.json | 2 +- packages/web/package.json | 2 +- sdks/vscode/package.json | 2 +- 18 files changed, 37 insertions(+), 37 deletions(-) diff --git a/bun.lock b/bun.lock index fa4d84e4ec..14d9565b28 100644 --- a/bun.lock +++ b/bun.lock @@ -23,7 +23,7 @@ }, "packages/app": { "name": "@opencode-ai/app", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "dependencies": { "@kobalte/core": "catalog:", "@opencode-ai/sdk": "workspace:*", @@ -73,7 +73,7 @@ }, "packages/console/app": { "name": "@opencode-ai/console-app", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "dependencies": { "@cloudflare/vite-plugin": "1.15.2", "@ibm/plex": "6.4.1", @@ -107,7 +107,7 @@ }, "packages/console/core": { "name": "@opencode-ai/console-core", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "dependencies": { "@aws-sdk/client-sts": "3.782.0", "@jsx-email/render": "1.1.1", @@ -134,7 +134,7 @@ }, "packages/console/function": { "name": "@opencode-ai/console-function", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "dependencies": { "@ai-sdk/anthropic": "2.0.0", "@ai-sdk/openai": "2.0.2", @@ -158,7 +158,7 @@ }, "packages/console/mail": { "name": "@opencode-ai/console-mail", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "dependencies": { "@jsx-email/all": "2.2.3", "@jsx-email/cli": "1.4.3", @@ -182,7 +182,7 @@ }, "packages/desktop": { "name": "@opencode-ai/desktop", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "dependencies": { "@opencode-ai/app": "workspace:*", "@opencode-ai/ui": "workspace:*", @@ -213,7 +213,7 @@ }, "packages/enterprise": { "name": "@opencode-ai/enterprise", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "dependencies": { "@opencode-ai/ui": "workspace:*", "@opencode-ai/util": "workspace:*", @@ -242,7 +242,7 @@ }, "packages/function": { "name": "@opencode-ai/function", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "dependencies": { "@octokit/auth-app": "8.0.1", "@octokit/rest": "catalog:", @@ -258,7 +258,7 @@ }, "packages/opencode": { "name": "opencode", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "bin": { "opencode": "./bin/opencode", }, @@ -362,7 +362,7 @@ }, "packages/plugin": { "name": "@opencode-ai/plugin", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "dependencies": { "@opencode-ai/sdk": "workspace:*", "zod": "catalog:", @@ -382,7 +382,7 @@ }, "packages/sdk/js": { "name": "@opencode-ai/sdk", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "devDependencies": { "@hey-api/openapi-ts": "0.90.10", "@tsconfig/node22": "catalog:", @@ -393,7 +393,7 @@ }, "packages/slack": { "name": "@opencode-ai/slack", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "dependencies": { "@opencode-ai/sdk": "workspace:*", "@slack/bolt": "^3.17.1", @@ -406,7 +406,7 @@ }, "packages/ui": { "name": "@opencode-ai/ui", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "dependencies": { "@kobalte/core": "catalog:", "@opencode-ai/sdk": "workspace:*", @@ -448,7 +448,7 @@ }, "packages/util": { "name": "@opencode-ai/util", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "dependencies": { "zod": "catalog:", }, @@ -459,7 +459,7 @@ }, "packages/web": { "name": "@opencode-ai/web", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "dependencies": { "@astrojs/cloudflare": "12.6.3", "@astrojs/markdown-remark": "6.3.1", diff --git a/packages/app/package.json b/packages/app/package.json index 61e7edcd16..87ca7931c5 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/app", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "description": "", "type": "module", "exports": { diff --git a/packages/console/app/package.json b/packages/console/app/package.json index a3d88a6baa..b10593a8fa 100644 --- a/packages/console/app/package.json +++ b/packages/console/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-app", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/console/core/package.json b/packages/console/core/package.json index 90e6f90bf3..111390efbe 100644 --- a/packages/console/core/package.json +++ b/packages/console/core/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/console-core", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "private": true, "type": "module", "license": "MIT", diff --git a/packages/console/function/package.json b/packages/console/function/package.json index 1a64b46971..c26b4584de 100644 --- a/packages/console/function/package.json +++ b/packages/console/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-function", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/console/mail/package.json b/packages/console/mail/package.json index eca9a1d311..564a7140cc 100644 --- a/packages/console/mail/package.json +++ b/packages/console/mail/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-mail", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "dependencies": { "@jsx-email/all": "2.2.3", "@jsx-email/cli": "1.4.3", diff --git a/packages/desktop/package.json b/packages/desktop/package.json index 3ff4bff46a..c1f330ce93 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@opencode-ai/desktop", "private": true, - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/enterprise/package.json b/packages/enterprise/package.json index 996e7ed943..03016c1c58 100644 --- a/packages/enterprise/package.json +++ b/packages/enterprise/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/enterprise", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "private": true, "type": "module", "license": "MIT", diff --git a/packages/extensions/zed/extension.toml b/packages/extensions/zed/extension.toml index 4e0db0d712..eaa882b65b 100644 --- a/packages/extensions/zed/extension.toml +++ b/packages/extensions/zed/extension.toml @@ -1,7 +1,7 @@ id = "opencode" name = "OpenCode" description = "The open source coding agent." -version = "0.0.0-ci-202601291718" +version = "1.1.43" schema_version = 1 authors = ["Anomaly"] repository = "https://github.com/anomalyco/opencode" @@ -11,26 +11,26 @@ name = "OpenCode" icon = "./icons/opencode.svg" [agent_servers.opencode.targets.darwin-aarch64] -archive = "https://github.com/anomalyco/opencode/releases/download/v0.0.0-ci-202601291718/opencode-darwin-arm64.zip" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.43/opencode-darwin-arm64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.darwin-x86_64] -archive = "https://github.com/anomalyco/opencode/releases/download/v0.0.0-ci-202601291718/opencode-darwin-x64.zip" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.43/opencode-darwin-x64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-aarch64] -archive = "https://github.com/anomalyco/opencode/releases/download/v0.0.0-ci-202601291718/opencode-linux-arm64.tar.gz" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.43/opencode-linux-arm64.tar.gz" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-x86_64] -archive = "https://github.com/anomalyco/opencode/releases/download/v0.0.0-ci-202601291718/opencode-linux-x64.tar.gz" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.43/opencode-linux-x64.tar.gz" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.windows-x86_64] -archive = "https://github.com/anomalyco/opencode/releases/download/v0.0.0-ci-202601291718/opencode-windows-x64.zip" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.43/opencode-windows-x64.zip" cmd = "./opencode.exe" args = ["acp"] diff --git a/packages/function/package.json b/packages/function/package.json index a0d333a349..4a9e82def5 100644 --- a/packages/function/package.json +++ b/packages/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/function", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/opencode/package.json b/packages/opencode/package.json index 25193c0c00..bd77afa2e8 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "name": "opencode", "type": "module", "license": "MIT", diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 36816fe1c9..19077d786d 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/plugin", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index ccd0b6a945..e929d62894 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/sdk", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/slack/package.json b/packages/slack/package.json index dff46642af..decfd834a7 100644 --- a/packages/slack/package.json +++ b/packages/slack/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/slack", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/ui/package.json b/packages/ui/package.json index be261a318a..2e7a2cfefd 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/ui", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "type": "module", "license": "MIT", "exports": { diff --git a/packages/util/package.json b/packages/util/package.json index 40a6080cbf..f76106701b 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/util", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "private": true, "type": "module", "license": "MIT", diff --git a/packages/web/package.json b/packages/web/package.json index 666654a2ef..0f601ba248 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -2,7 +2,7 @@ "name": "@opencode-ai/web", "type": "module", "license": "MIT", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "scripts": { "dev": "astro dev", "dev:remote": "VITE_API_URL=https://api.opencode.ai astro dev", diff --git a/sdks/vscode/package.json b/sdks/vscode/package.json index 3de79e99ed..1ffe553c2c 100644 --- a/sdks/vscode/package.json +++ b/sdks/vscode/package.json @@ -2,7 +2,7 @@ "name": "opencode", "displayName": "opencode", "description": "opencode for VS Code", - "version": "0.0.0-ci-202601291718", + "version": "1.1.43", "publisher": "sst-dev", "repository": { "type": "git", From 1f3bf566409c373f26d12b136bfaa6f38ed6efac Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 29 Jan 2026 19:18:41 -0500 Subject: [PATCH 11/61] ci: upgrade bun cache to stickydisk for faster ci builds --- .github/actions/setup-bun/action.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index cba04facce..02f215ff1d 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -8,14 +8,11 @@ runs: with: bun-version-file: package.json - - name: Cache ~/.bun - id: cache-bun - uses: actions/cache@v4 + - name: Mount Bun Cache + uses: useblacksmith/stickydisk@v1 with: + key: ${{ github.repository }}-bun-cache path: ~/.bun - key: ${{ runner.os }}-bun-${{ hashFiles('package.json') }}-${{ hashFiles('bun.lockb', 'bun.lock') }} - restore-keys: | - ${{ runner.os }}-bun-${{ hashFiles('package.json') }}- - name: Install dependencies run: bun install From 7ed6f690e916223566dfd481b741b610b29572dc Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 29 Jan 2026 19:34:12 -0500 Subject: [PATCH 12/61] ci --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 25879c3769..9060eeb329 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -188,7 +188,7 @@ jobs: needs: - version - build-cli - # - build-tauri + - build-tauri runs-on: blacksmith-4vcpu-ubuntu-2404 steps: - uses: actions/checkout@v3 From 81326377f21c92f276ae35f89e8c978da066b7b1 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 29 Jan 2026 19:35:05 -0500 Subject: [PATCH 13/61] ci: trigger publish workflow automatically after beta builds complete --- .github/workflows/beta.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml index d92133ea6a..6e27c6eb9d 100644 --- a/.github/workflows/beta.yml +++ b/.github/workflows/beta.yml @@ -32,3 +32,8 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: bun script/beta.ts + + - name: Trigger publish workflow + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: gh workflow run publish.yml --ref beta From 03803621dbb20d15553635eb810d466dc1255fdc Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 29 Jan 2026 19:35:52 -0500 Subject: [PATCH 14/61] ci --- .github/actions/setup-bun/action.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index 02f215ff1d..7584334a7b 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -3,17 +3,17 @@ description: "Setup Bun with caching and install dependencies" runs: using: "composite" steps: - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - with: - bun-version-file: package.json - - name: Mount Bun Cache uses: useblacksmith/stickydisk@v1 with: key: ${{ github.repository }}-bun-cache path: ~/.bun + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version-file: package.json + - name: Install dependencies run: bun install shell: bash From b43a35b737087e3464308b02232b1459f0f8df60 Mon Sep 17 00:00:00 2001 From: Filip <34747899+neriousy@users.noreply.github.com> Date: Fri, 30 Jan 2026 02:05:31 +0100 Subject: [PATCH 15/61] test(app): test for toggling model variant (#11221) --- packages/app/e2e/thinking-level.spec.ts | 25 ++++++++++++++++++++ packages/app/e2e/utils.ts | 1 + packages/app/src/components/prompt-input.tsx | 1 + 3 files changed, 27 insertions(+) create mode 100644 packages/app/e2e/thinking-level.spec.ts diff --git a/packages/app/e2e/thinking-level.spec.ts b/packages/app/e2e/thinking-level.spec.ts new file mode 100644 index 0000000000..564ef3c1f3 --- /dev/null +++ b/packages/app/e2e/thinking-level.spec.ts @@ -0,0 +1,25 @@ +import { test, expect } from "./fixtures" +import { modelVariantCycleSelector } from "./utils" + +test("smoke model variant cycle updates label", async ({ page, gotoSession }) => { + await gotoSession() + + await page.addStyleTag({ + content: `${modelVariantCycleSelector} { display: inline-block !important; }`, + }) + + const button = page.locator(modelVariantCycleSelector) + const exists = (await button.count()) > 0 + test.skip(!exists, "current model has no variants") + if (!exists) return + + await expect(button).toBeVisible() + + const before = (await button.innerText()).trim() + await button.click() + await expect(button).not.toHaveText(before) + + const after = (await button.innerText()).trim() + await button.click() + await expect(button).not.toHaveText(after) +}) diff --git a/packages/app/e2e/utils.ts b/packages/app/e2e/utils.ts index eb0395950a..3de488bd9c 100644 --- a/packages/app/e2e/utils.ts +++ b/packages/app/e2e/utils.ts @@ -12,6 +12,7 @@ export const terminalToggleKey = "Control+Backquote" export const promptSelector = '[data-component="prompt-input"]' export const terminalSelector = '[data-component="terminal"]' +export const modelVariantCycleSelector = '[data-action="model-variant-cycle"]' export function createSdk(directory?: string) { return createOpencodeClient({ baseUrl: serverUrl, directory, throwOnError: true }) diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index 4d227f44b6..5c1d417eb0 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -1953,6 +1953,7 @@ export const PromptInput: Component = (props) => { keybind={command.keybind("model.variant.cycle")} >