From 6e9833acce1bf0346ba0abc2fe1dbce7ab703176 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Fri, 12 Dec 2025 14:43:35 -0700 Subject: [PATCH 001/643] Shell: No -l in fallback, for max compatibility (#5452) --- packages/opencode/src/session/prompt.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 7f1b03c94..2c36bc6d5 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -1284,8 +1284,9 @@ export namespace SessionPrompt { args: ["-NoProfile", "-Command", input.command], }, // Fallback: any shell that doesn't match those above + // - No -l, for max compatibility "": { - args: ["-c", "-l", `${input.command}`], + args: ["-c", `${input.command}`], }, } From ce37e11bfea70d02793c960da06f856fc5221c9b Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 12 Dec 2025 21:44:09 +0000 Subject: [PATCH 002/643] chore: format code --- packages/plugin/package.json | 2 +- packages/sdk/js/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 918ca59a4..9cf977234 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -24,4 +24,4 @@ "typescript": "catalog:", "@typescript/native-preview": "catalog:" } -} \ No newline at end of file +} diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index 083e148a8..fb57b6520 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -29,4 +29,4 @@ "publishConfig": { "directory": "dist" } -} \ No newline at end of file +} From 43202f2820d64f55b710c9257b73888c3954cf4e Mon Sep 17 00:00:00 2001 From: Sebastian Herrlinger Date: Fri, 12 Dec 2025 22:43:43 +0100 Subject: [PATCH 003/643] only exit app when prompt is empty, otherwise fallthrough, fix #5457 --- .../opencode/src/cli/cmd/tui/component/prompt/index.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx index 669ed1897..1ea701c83 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx @@ -732,8 +732,12 @@ export function Prompt(props: PromptProps) { return } if (keybind.match("app_exit", e)) { - await exit() - return + if (store.prompt.input === "") { + await exit() + // Don't preventDefault - let textarea potentially handle the event + e.preventDefault() + return + } } if (e.name === "!" && input.visualCursor.offset === 0) { setStore("mode", "shell") From af45444496ed8188bdd51feaeef8ca9d3abdfbc6 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 12 Dec 2025 16:47:43 -0500 Subject: [PATCH 004/643] desktop: fix build on Linux and Windows by making macOS title bar styling conditional --- packages/tauri/src-tauri/src/lib.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/tauri/src-tauri/src/lib.rs b/packages/tauri/src-tauri/src/lib.rs index fea3addb5..a275fab78 100644 --- a/packages/tauri/src-tauri/src/lib.rs +++ b/packages/tauri/src-tauri/src/lib.rs @@ -4,9 +4,9 @@ use std::{ sync::{Arc, Mutex}, time::{Duration, Instant}, }; -use tauri::{ - AppHandle, LogicalSize, Manager, Monitor, RunEvent, TitleBarStyle, WebviewUrl, WebviewWindow, -}; +use tauri::{AppHandle, LogicalSize, Manager, Monitor, RunEvent, WebviewUrl, WebviewWindow}; +#[cfg(target_os = "macos")] +use tauri::TitleBarStyle; use tauri_plugin_dialog::{DialogExt, MessageDialogButtons, MessageDialogResult}; use tauri_plugin_shell::process::{CommandChild, CommandEvent}; use tauri_plugin_shell::ShellExt; @@ -183,7 +183,6 @@ pub fn run() { .inner_size(size.width as f64, size.height as f64) .decorations(true) .zoom_hotkeys_enabled(true) - .title_bar_style(TitleBarStyle::Overlay) .initialization_script(format!( r#" window.__OPENCODE__ ??= {{}}; @@ -194,7 +193,9 @@ pub fn run() { #[cfg(target_os = "macos")] { - window_builder = window_builder.hidden_title(true); + window_builder = window_builder + .title_bar_style(TitleBarStyle::Overlay) + .hidden_title(true); } window_builder.build().expect("Failed to create window"); From bc3286de4650914fea570be40293a013932ec663 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 12 Dec 2025 16:03:01 -0600 Subject: [PATCH 005/643] fix: archive button --- packages/desktop/src/pages/layout.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/desktop/src/pages/layout.tsx b/packages/desktop/src/pages/layout.tsx index 7da920c5f..873b3b4e8 100644 --- a/packages/desktop/src/pages/layout.tsx +++ b/packages/desktop/src/pages/layout.tsx @@ -318,10 +318,7 @@ export default function Layout(props: ParentProps) { ) } return ( - +
- + {session.title} - +
@@ -373,7 +373,7 @@ export default function Layout(props: ParentProps) {
- +
) }} From 91ab9669214752f7b374c7cb41abd09baa3ee19b Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 12 Dec 2025 16:10:13 -0600 Subject: [PATCH 006/643] fix: max height on bash tool --- packages/ui/src/components/message-part.css | 16 ++++++++++++++++ packages/ui/src/components/message-part.tsx | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/components/message-part.css b/packages/ui/src/components/message-part.css index d5906050b..9d4214bae 100644 --- a/packages/ui/src/components/message-part.css +++ b/packages/ui/src/components/message-part.css @@ -84,6 +84,22 @@ margin: 0; padding: 0; } + + &[data-scrollable] { + height: auto; + max-height: 240px; + overflow-y: auto; + scrollbar-width: none; + -ms-overflow-style: none; + + &::-webkit-scrollbar { + display: none; + } + + [data-component="markdown"] { + overflow: visible; + } + } } [data-component="edit-trigger"], diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx index 1e00a9312..a596b811e 100644 --- a/packages/ui/src/components/message-part.tsx +++ b/packages/ui/src/components/message-part.tsx @@ -328,7 +328,7 @@ ToolRegistry.register({ subtitle: props.input.description, }} > -
+
From 15caecdb459804facae05090b8caf64b85aba4bd Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Fri, 12 Dec 2025 14:11:07 -0800 Subject: [PATCH 007/643] shell tweaks, better handling for windows (#5455) Co-authored-by: GitHub Action --- packages/opencode/src/flag/flag.ts | 1 + packages/opencode/src/pty/index.ts | 4 +- packages/opencode/src/session/prompt.ts | 45 +++++++++++++++-- packages/opencode/src/shell/shell.ts | 67 +++++++++++++++++++++++++ packages/opencode/src/tool/bash.ts | 66 +++--------------------- packages/util/src/shell.ts | 13 ----- 6 files changed, 116 insertions(+), 80 deletions(-) create mode 100644 packages/opencode/src/shell/shell.ts delete mode 100644 packages/util/src/shell.ts diff --git a/packages/opencode/src/flag/flag.ts b/packages/opencode/src/flag/flag.ts index 2dcf112ae..c4a03e831 100644 --- a/packages/opencode/src/flag/flag.ts +++ b/packages/opencode/src/flag/flag.ts @@ -1,5 +1,6 @@ export namespace Flag { export const OPENCODE_AUTO_SHARE = truthy("OPENCODE_AUTO_SHARE") + export const OPENCODE_GIT_BASH_PATH = process.env["OPENCODE_GIT_BASH_PATH"] export const OPENCODE_CONFIG = process.env["OPENCODE_CONFIG"] export const OPENCODE_CONFIG_DIR = process.env["OPENCODE_CONFIG_DIR"] export const OPENCODE_CONFIG_CONTENT = process.env["OPENCODE_CONFIG_CONTENT"] diff --git a/packages/opencode/src/pty/index.ts b/packages/opencode/src/pty/index.ts index 34323371b..d192eaf1f 100644 --- a/packages/opencode/src/pty/index.ts +++ b/packages/opencode/src/pty/index.ts @@ -6,10 +6,10 @@ import { Identifier } from "../id/id" import { Log } from "../util/log" import type { WSContext } from "hono/ws" import { Instance } from "../project/instance" -import { shell } from "@opencode-ai/util/shell" import { lazy } from "@opencode-ai/util/lazy" import {} from "process" import { Installation } from "@/installation" +import { Shell } from "@/shell/shell" export namespace Pty { const log = Log.create({ service: "pty" }) @@ -112,7 +112,7 @@ export namespace Pty { export async function create(input: CreateInput) { const id = Identifier.create("pty", false) - const command = input.command || shell() + const command = input.command || Shell.preferred() const args = input.args || [] const cwd = input.cwd || Instance.directory const env = { ...process.env, ...input.env } as Record diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 2c36bc6d5..c9e24f8ca 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -50,6 +50,7 @@ import { fn } from "@/util/fn" import { SessionProcessor } from "./processor" import { TaskTool } from "@/tool/task" import { SessionStatus } from "./status" +import { Shell } from "@/shell/shell" // @ts-ignore globalThis.AI_SDK_LOG_WARNINGS = false @@ -1172,6 +1173,12 @@ export namespace SessionPrompt { }) export type ShellInput = z.infer export async function shell(input: ShellInput) { + const abort = start(input.sessionID) + if (!abort) { + throw new Session.BusyError(input.sessionID) + } + using _ = defer(() => cancel(input.sessionID)) + const session = await Session.get(input.sessionID) if (session.revert) { SessionRevert.cleanup(session) @@ -1244,8 +1251,10 @@ export namespace SessionPrompt { }, } await Session.updatePart(part) - const shell = process.env["SHELL"] ?? (process.platform === "win32" ? process.env["COMSPEC"] || "cmd.exe" : "bash") - const shellName = path.basename(shell).toLowerCase() + const shell = Shell.preferred() + const shellName = ( + process.platform === "win32" ? path.win32.basename(shell, ".exe") : path.basename(shell) + ).toLowerCase() const invocations: Record = { nu: { @@ -1275,12 +1284,15 @@ export namespace SessionPrompt { `, ], }, - // Windows cmd.exe - "cmd.exe": { + // Windows cmd + cmd: { args: ["/c", input.command], }, // Windows PowerShell - "powershell.exe": { + powershell: { + args: ["-NoProfile", "-Command", input.command], + }, + pwsh: { args: ["-NoProfile", "-Command", input.command], }, // Fallback: any shell that doesn't match those above @@ -1327,11 +1339,34 @@ export namespace SessionPrompt { } }) + let aborted = false + let exited = false + + const kill = () => Shell.killTree(proc, { exited: () => exited }) + + if (abort.aborted) { + aborted = true + await kill() + } + + const abortHandler = () => { + aborted = true + void kill() + } + + abort.addEventListener("abort", abortHandler, { once: true }) + await new Promise((resolve) => { proc.on("close", () => { + exited = true + abort.removeEventListener("abort", abortHandler) resolve() }) }) + + if (aborted) { + output += "\n\n" + ["", "User aborted the command", ""].join("\n") + } msg.time.completed = Date.now() await Session.updateMessage(msg) if (part.state.status === "running") { diff --git a/packages/opencode/src/shell/shell.ts b/packages/opencode/src/shell/shell.ts new file mode 100644 index 000000000..2e8d48bfd --- /dev/null +++ b/packages/opencode/src/shell/shell.ts @@ -0,0 +1,67 @@ +import { Flag } from "@/flag/flag" +import { lazy } from "@/util/lazy" +import path from "path" +import { spawn, type ChildProcess } from "child_process" + +const SIGKILL_TIMEOUT_MS = 200 + +export namespace Shell { + export async function killTree(proc: ChildProcess, opts?: { exited?: () => boolean }): Promise { + const pid = proc.pid + if (!pid || opts?.exited?.()) return + + if (process.platform === "win32") { + await new Promise((resolve) => { + const killer = spawn("taskkill", ["/pid", String(pid), "/f", "/t"], { stdio: "ignore" }) + killer.once("exit", () => resolve()) + killer.once("error", () => resolve()) + }) + return + } + + try { + process.kill(-pid, "SIGTERM") + await Bun.sleep(SIGKILL_TIMEOUT_MS) + if (!opts?.exited?.()) { + process.kill(-pid, "SIGKILL") + } + } catch (_e) { + proc.kill("SIGTERM") + await Bun.sleep(SIGKILL_TIMEOUT_MS) + if (!opts?.exited?.()) { + proc.kill("SIGKILL") + } + } + } + const BLACKLIST = new Set(["fish", "nu"]) + + function fallback() { + if (process.platform === "win32") { + if (Flag.OPENCODE_GIT_BASH_PATH) return Flag.OPENCODE_GIT_BASH_PATH + const git = Bun.which("git") + if (git) { + // git.exe is typically at: C:\Program Files\Git\cmd\git.exe + // bash.exe is at: C:\Program Files\Git\bin\bash.exe + const bash = path.join(git, "..", "..", "bin", "bash.exe") + if (Bun.file(bash).size) return bash + } + return process.env.COMSPEC || "cmd.exe" + } + if (process.platform === "darwin") return "/bin/zsh" + const bash = Bun.which("bash") + if (bash) return bash + return "/bin/sh" + } + + export const preferred = lazy(() => { + const s = process.env.SHELL + if (s) return s + return fallback() + }) + + export const acceptable = lazy(() => { + const s = process.env.SHELL + if (s && !BLACKLIST.has(process.platform === "win32" ? path.win32.basename(s) : path.basename(s))) return s + return fallback() + }) +} diff --git a/packages/opencode/src/tool/bash.ts b/packages/opencode/src/tool/bash.ts index 0c099fe80..6b84d1bff 100644 --- a/packages/opencode/src/tool/bash.ts +++ b/packages/opencode/src/tool/bash.ts @@ -14,11 +14,10 @@ import { Permission } from "@/permission" import { fileURLToPath } from "url" import { Flag } from "@/flag/flag.ts" import path from "path" -import { iife } from "@/util/iife" +import { Shell } from "@/shell/shell" const MAX_OUTPUT_LENGTH = Flag.OPENCODE_EXPERIMENTAL_BASH_MAX_OUTPUT_LENGTH || 30_000 const DEFAULT_TIMEOUT = Flag.OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS || 2 * 60 * 1000 -const SIGKILL_TIMEOUT_MS = 200 export const log = Log.create({ service: "bash-tool" }) @@ -53,32 +52,7 @@ const parser = lazy(async () => { // TODO: we may wanna rename this tool so it works better on other shells export const BashTool = Tool.define("bash", async () => { - const shell = iife(() => { - const s = process.env.SHELL - if (s) { - const basename = path.basename(s) - if (!new Set(["fish", "nu"]).has(basename)) { - return s - } - } - - if (process.platform === "darwin") { - return "/bin/zsh" - } - - if (process.platform === "win32") { - // Let Bun / Node pick COMSPEC (usually cmd.exe) - // or explicitly: - return process.env.COMSPEC || true - } - - const bash = Bun.which("bash") - if (bash) { - return bash - } - - return true - }) + const shell = Shell.acceptable() log.info("bash tool using shell", { shell }) return { @@ -261,51 +235,23 @@ export const BashTool = Tool.define("bash", async () => { let aborted = false let exited = false - const killTree = async () => { - const pid = proc.pid - if (!pid || exited) { - return - } - - if (process.platform === "win32") { - await new Promise((resolve) => { - const killer = spawn("taskkill", ["/pid", String(pid), "/f", "/t"], { stdio: "ignore" }) - killer.once("exit", resolve) - killer.once("error", resolve) - }) - return - } - - try { - process.kill(-pid, "SIGTERM") - await Bun.sleep(SIGKILL_TIMEOUT_MS) - if (!exited) { - process.kill(-pid, "SIGKILL") - } - } catch (_e) { - proc.kill("SIGTERM") - await Bun.sleep(SIGKILL_TIMEOUT_MS) - if (!exited) { - proc.kill("SIGKILL") - } - } - } + const kill = () => Shell.killTree(proc, { exited: () => exited }) if (ctx.abort.aborted) { aborted = true - await killTree() + await kill() } const abortHandler = () => { aborted = true - void killTree() + void kill() } ctx.abort.addEventListener("abort", abortHandler, { once: true }) const timeoutTimer = setTimeout(() => { timedOut = true - void killTree() + void kill() }, timeout + 100) await new Promise((resolve, reject) => { diff --git a/packages/util/src/shell.ts b/packages/util/src/shell.ts deleted file mode 100644 index e23ba0199..000000000 --- a/packages/util/src/shell.ts +++ /dev/null @@ -1,13 +0,0 @@ -export function shell() { - const s = process.env.SHELL - if (s) return s - if (process.platform === "darwin") { - return "/bin/zsh" - } - if (process.platform === "win32") { - return process.env.COMSPEC || "cmd.exe" - } - const bash = Bun.which("bash") - if (bash) return bash - return "bash" -} From 0554d03162e3655751581e004ba037e6319c8eb1 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 12 Dec 2025 16:16:52 -0600 Subject: [PATCH 008/643] Revert "fix: archive button" This reverts commit bc3286de4650914fea570be40293a013932ec663. --- packages/desktop/src/pages/layout.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/desktop/src/pages/layout.tsx b/packages/desktop/src/pages/layout.tsx index 873b3b4e8..7da920c5f 100644 --- a/packages/desktop/src/pages/layout.tsx +++ b/packages/desktop/src/pages/layout.tsx @@ -318,7 +318,10 @@ export default function Layout(props: ParentProps) { ) } return ( -
+
- + {session.title} - +
@@ -373,7 +373,7 @@ export default function Layout(props: ParentProps) {
-
+ ) }} From b84d513bd7e8c2e38e7a2e6ea1315a224e4b6429 Mon Sep 17 00:00:00 2001 From: opencode Date: Fri, 12 Dec 2025 22:29:21 +0000 Subject: [PATCH 009/643] release: v1.0.152 --- bun.lock | 30 +++++++++++++------------- 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 | 4 ++-- packages/sdk/js/package.json | 4 ++-- packages/slack/package.json | 2 +- packages/tauri/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, 39 insertions(+), 39 deletions(-) diff --git a/bun.lock b/bun.lock index 2e56041b6..5bc89cf56 100644 --- a/bun.lock +++ b/bun.lock @@ -20,7 +20,7 @@ }, "packages/console/app": { "name": "@opencode-ai/console-app", - "version": "1.0.151", + "version": "1.0.152", "dependencies": { "@cloudflare/vite-plugin": "1.15.2", "@ibm/plex": "6.4.1", @@ -48,7 +48,7 @@ }, "packages/console/core": { "name": "@opencode-ai/console-core", - "version": "1.0.151", + "version": "1.0.152", "dependencies": { "@aws-sdk/client-sts": "3.782.0", "@jsx-email/render": "1.1.1", @@ -75,7 +75,7 @@ }, "packages/console/function": { "name": "@opencode-ai/console-function", - "version": "1.0.151", + "version": "1.0.152", "dependencies": { "@ai-sdk/anthropic": "2.0.0", "@ai-sdk/openai": "2.0.2", @@ -99,7 +99,7 @@ }, "packages/console/mail": { "name": "@opencode-ai/console-mail", - "version": "1.0.151", + "version": "1.0.152", "dependencies": { "@jsx-email/all": "2.2.3", "@jsx-email/cli": "1.4.3", @@ -123,7 +123,7 @@ }, "packages/desktop": { "name": "@opencode-ai/desktop", - "version": "1.0.151", + "version": "1.0.152", "dependencies": { "@kobalte/core": "catalog:", "@opencode-ai/sdk": "workspace:*", @@ -169,7 +169,7 @@ }, "packages/enterprise": { "name": "@opencode-ai/enterprise", - "version": "1.0.151", + "version": "1.0.152", "dependencies": { "@opencode-ai/ui": "workspace:*", "@opencode-ai/util": "workspace:*", @@ -198,7 +198,7 @@ }, "packages/function": { "name": "@opencode-ai/function", - "version": "1.0.151", + "version": "1.0.152", "dependencies": { "@octokit/auth-app": "8.0.1", "@octokit/rest": "22.0.0", @@ -214,7 +214,7 @@ }, "packages/opencode": { "name": "opencode", - "version": "1.0.151", + "version": "1.0.152", "bin": { "opencode": "./bin/opencode", }, @@ -306,7 +306,7 @@ }, "packages/plugin": { "name": "@opencode-ai/plugin", - "version": "1.0.151", + "version": "1.0.152", "dependencies": { "@opencode-ai/sdk": "workspace:*", "zod": "catalog:", @@ -326,7 +326,7 @@ }, "packages/sdk/js": { "name": "@opencode-ai/sdk", - "version": "1.0.151", + "version": "1.0.152", "devDependencies": { "@hey-api/openapi-ts": "0.88.1", "@tsconfig/node22": "catalog:", @@ -337,7 +337,7 @@ }, "packages/slack": { "name": "@opencode-ai/slack", - "version": "1.0.151", + "version": "1.0.152", "dependencies": { "@opencode-ai/sdk": "workspace:*", "@slack/bolt": "^3.17.1", @@ -350,7 +350,7 @@ }, "packages/tauri": { "name": "@opencode-ai/tauri", - "version": "1.0.151", + "version": "1.0.152", "dependencies": { "@opencode-ai/desktop": "workspace:*", "@tauri-apps/api": "^2", @@ -375,7 +375,7 @@ }, "packages/ui": { "name": "@opencode-ai/ui", - "version": "1.0.151", + "version": "1.0.152", "dependencies": { "@kobalte/core": "catalog:", "@opencode-ai/sdk": "workspace:*", @@ -410,7 +410,7 @@ }, "packages/util": { "name": "@opencode-ai/util", - "version": "1.0.151", + "version": "1.0.152", "dependencies": { "zod": "catalog:", }, @@ -421,7 +421,7 @@ }, "packages/web": { "name": "@opencode-ai/web", - "version": "1.0.151", + "version": "1.0.152", "dependencies": { "@astrojs/cloudflare": "12.6.3", "@astrojs/markdown-remark": "6.3.1", diff --git a/packages/console/app/package.json b/packages/console/app/package.json index 957739169..96cd611f4 100644 --- a/packages/console/app/package.json +++ b/packages/console/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-app", - "version": "1.0.151", + "version": "1.0.152", "type": "module", "scripts": { "typecheck": "tsgo --noEmit", diff --git a/packages/console/core/package.json b/packages/console/core/package.json index 24082194b..6fd87c2f8 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": "1.0.151", + "version": "1.0.152", "private": true, "type": "module", "dependencies": { diff --git a/packages/console/function/package.json b/packages/console/function/package.json index 690349d49..22322aa24 100644 --- a/packages/console/function/package.json +++ b/packages/console/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-function", - "version": "1.0.151", + "version": "1.0.152", "$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 00f38283d..f26d54d35 100644 --- a/packages/console/mail/package.json +++ b/packages/console/mail/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-mail", - "version": "1.0.151", + "version": "1.0.152", "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 df0ed23ac..91e04af08 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/desktop", - "version": "1.0.151", + "version": "1.0.152", "description": "", "type": "module", "exports": { diff --git a/packages/enterprise/package.json b/packages/enterprise/package.json index a6dabf666..f265b3b27 100644 --- a/packages/enterprise/package.json +++ b/packages/enterprise/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/enterprise", - "version": "1.0.151", + "version": "1.0.152", "private": true, "type": "module", "scripts": { diff --git a/packages/extensions/zed/extension.toml b/packages/extensions/zed/extension.toml index 578f8ef3c..649233b99 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 = "1.0.151" +version = "1.0.152" schema_version = 1 authors = ["Anomaly"] repository = "https://github.com/sst/opencode" @@ -11,26 +11,26 @@ name = "OpenCode" icon = "./icons/opencode.svg" [agent_servers.opencode.targets.darwin-aarch64] -archive = "https://github.com/sst/opencode/releases/download/v1.0.151/opencode-darwin-arm64.zip" +archive = "https://github.com/sst/opencode/releases/download/v1.0.152/opencode-darwin-arm64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.darwin-x86_64] -archive = "https://github.com/sst/opencode/releases/download/v1.0.151/opencode-darwin-x64.zip" +archive = "https://github.com/sst/opencode/releases/download/v1.0.152/opencode-darwin-x64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-aarch64] -archive = "https://github.com/sst/opencode/releases/download/v1.0.151/opencode-linux-arm64.tar.gz" +archive = "https://github.com/sst/opencode/releases/download/v1.0.152/opencode-linux-arm64.tar.gz" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-x86_64] -archive = "https://github.com/sst/opencode/releases/download/v1.0.151/opencode-linux-x64.tar.gz" +archive = "https://github.com/sst/opencode/releases/download/v1.0.152/opencode-linux-x64.tar.gz" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.windows-x86_64] -archive = "https://github.com/sst/opencode/releases/download/v1.0.151/opencode-windows-x64.zip" +archive = "https://github.com/sst/opencode/releases/download/v1.0.152/opencode-windows-x64.zip" cmd = "./opencode.exe" args = ["acp"] diff --git a/packages/function/package.json b/packages/function/package.json index 5009f0d5b..42baa2787 100644 --- a/packages/function/package.json +++ b/packages/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/function", - "version": "1.0.151", + "version": "1.0.152", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/opencode/package.json b/packages/opencode/package.json index 663dd0d2a..362f5b1f2 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "1.0.151", + "version": "1.0.152", "name": "opencode", "type": "module", "private": true, diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 9cf977234..815bbd9e1 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": "1.0.151", + "version": "1.0.152", "type": "module", "scripts": { "typecheck": "tsgo --noEmit", @@ -24,4 +24,4 @@ "typescript": "catalog:", "@typescript/native-preview": "catalog:" } -} +} \ No newline at end of file diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index fb57b6520..7d1b3fc4d 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": "1.0.151", + "version": "1.0.152", "type": "module", "scripts": { "typecheck": "tsgo --noEmit", @@ -29,4 +29,4 @@ "publishConfig": { "directory": "dist" } -} +} \ No newline at end of file diff --git a/packages/slack/package.json b/packages/slack/package.json index 69390ad2e..925602f9a 100644 --- a/packages/slack/package.json +++ b/packages/slack/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/slack", - "version": "1.0.151", + "version": "1.0.152", "type": "module", "scripts": { "dev": "bun run src/index.ts", diff --git a/packages/tauri/package.json b/packages/tauri/package.json index 6d76cb76b..768791ddc 100644 --- a/packages/tauri/package.json +++ b/packages/tauri/package.json @@ -1,7 +1,7 @@ { "name": "@opencode-ai/tauri", "private": true, - "version": "1.0.151", + "version": "1.0.152", "type": "module", "scripts": { "typecheck": "tsgo -b", diff --git a/packages/ui/package.json b/packages/ui/package.json index cebcd0272..d3d230c49 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/ui", - "version": "1.0.151", + "version": "1.0.152", "type": "module", "exports": { "./*": "./src/components/*.tsx", diff --git a/packages/util/package.json b/packages/util/package.json index d6d9919d4..43a5f7bb3 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/util", - "version": "1.0.151", + "version": "1.0.152", "private": true, "type": "module", "exports": { diff --git a/packages/web/package.json b/packages/web/package.json index 46119d972..f79b7ac36 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,7 +1,7 @@ { "name": "@opencode-ai/web", "type": "module", - "version": "1.0.151", + "version": "1.0.152", "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 02be235a7..f674b07a3 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": "1.0.151", + "version": "1.0.152", "publisher": "sst-dev", "repository": { "type": "git", From b93614cb81c1a84c4ad4ccd68d6858f6cf6d21e1 Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Fri, 12 Dec 2025 16:47:50 -0600 Subject: [PATCH 010/643] docs: add env vars sections --- packages/opencode/src/flag/flag.ts | 1 - packages/web/src/content/docs/cli.mdx | 37 +++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/flag/flag.ts b/packages/opencode/src/flag/flag.ts index c4a03e831..ca1af6d84 100644 --- a/packages/opencode/src/flag/flag.ts +++ b/packages/opencode/src/flag/flag.ts @@ -18,7 +18,6 @@ export namespace Flag { export const OPENCODE_EXPERIMENTAL = truthy("OPENCODE_EXPERIMENTAL") export const OPENCODE_EXPERIMENTAL_ICON_DISCOVERY = OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_ICON_DISCOVERY") - export const OPENCODE_EXPERIMENTAL_WATCHER = OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_WATCHER") export const OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT = truthy("OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT") export const OPENCODE_ENABLE_EXA = truthy("OPENCODE_ENABLE_EXA") || OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_EXA") diff --git a/packages/web/src/content/docs/cli.mdx b/packages/web/src/content/docs/cli.mdx index 083db369b..64e11ff56 100644 --- a/packages/web/src/content/docs/cli.mdx +++ b/packages/web/src/content/docs/cli.mdx @@ -269,3 +269,40 @@ The opencode CLI takes the following global flags. | `--version` | `-v` | Print version number | | `--print-logs` | | Print logs to stderr | | `--log-level` | | Log level (DEBUG, INFO, WARN, ERROR) | + +--- + +## Environment variables + +OpenCode can be configured using environment variables. + +| Variable | Type | Description | +| ------------------------------------- | ------- | -------------------------------------- | +| `OPENCODE_AUTO_SHARE` | boolean | Automatically share sessions | +| `OPENCODE_GIT_BASH_PATH` | string | Path to Git Bash executable on Windows | +| `OPENCODE_CONFIG` | string | Path to config file | +| `OPENCODE_CONFIG_DIR` | string | Path to config directory | +| `OPENCODE_CONFIG_CONTENT` | string | Inline json config content | +| `OPENCODE_DISABLE_AUTOUPDATE` | boolean | Disable automatic update checks | +| `OPENCODE_DISABLE_PRUNE` | boolean | Disable pruning of old data | +| `OPENCODE_PERMISSION` | string | Inlined json permissions config | +| `OPENCODE_DISABLE_DEFAULT_PLUGINS` | boolean | Disable default plugins | +| `OPENCODE_DISABLE_LSP_DOWNLOAD` | boolean | Disable automatic LSP server downloads | +| `OPENCODE_ENABLE_EXPERIMENTAL_MODELS` | boolean | Enable experimental models | +| `OPENCODE_DISABLE_AUTOCOMPACT` | boolean | Disable automatic context compaction | +| `OPENCODE_CLIENT` | string | Client identifier (defaults to `cli`) | +| `OPENCODE_ENABLE_EXA` | boolean | Enable Exa web search tools | + +--- + +### Experimental + +These environment variables enable experimental features that may change or be removed. + +| Variable | Type | Description | +| ----------------------------------------------- | ------- | --------------------------------------- | +| `OPENCODE_EXPERIMENTAL` | boolean | Enable all experimental features | +| `OPENCODE_EXPERIMENTAL_ICON_DISCOVERY` | boolean | Enable icon discovery | +| `OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT` | boolean | Disable copy on select in TUI | +| `OPENCODE_EXPERIMENTAL_BASH_MAX_OUTPUT_LENGTH` | number | Max output length for bash commands | +| `OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS` | number | Default timeout for bash commands in ms | From 3c3a0f8afbc1325ab53985995826f5ccf6c80737 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 12 Dec 2025 22:48:43 +0000 Subject: [PATCH 011/643] chore: format code --- packages/plugin/package.json | 2 +- packages/sdk/js/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 815bbd9e1..8589fa250 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -24,4 +24,4 @@ "typescript": "catalog:", "@typescript/native-preview": "catalog:" } -} \ No newline at end of file +} diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index 7d1b3fc4d..e6e888b94 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -29,4 +29,4 @@ "publishConfig": { "directory": "dist" } -} \ No newline at end of file +} From c11ea3fd923957d8f6c94878e69babdbad194e31 Mon Sep 17 00:00:00 2001 From: David Hill Date: Fri, 12 Dec 2025 22:50:48 +0000 Subject: [PATCH 012/643] fix: mute the whole prompt area when leader key is active --- .../opencode/src/cli/cmd/tui/component/prompt/index.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx index 669ed1897..53ce04353 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx @@ -705,8 +705,8 @@ export function Prompt(props: PromptProps) { >