From 08149de4d95e9535b0a910f3a1b0b86dd7076fa5 Mon Sep 17 00:00:00 2001 From: marcusquinn <6428977+marcusquinn@users.noreply.github.com> Date: Fri, 6 Mar 2026 03:19:00 +0000 Subject: [PATCH] feat(lsp): add OPENCODE_DISABLE_LSP env var to skip all LSP servers Headless `opencode run` sessions don't benefit from LSP diagnostics, but each session spawns its own LSP servers. On shell-heavy projects, bash-language-server's hardcoded --external-sources flag causes exponential ShellCheck memory growth (3-5 GB per process). This adds OPENCODE_DISABLE_LSP=true to skip all LSP initialization, complementing the existing OPENCODE_DISABLE_LSP_DOWNLOAD flag and the per-server config.lsp disable option. Closes #16269 --- packages/opencode/src/flag/flag.ts | 1 + packages/opencode/src/lsp/index.ts | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/packages/opencode/src/flag/flag.ts b/packages/opencode/src/flag/flag.ts index 22eba6320e9..5b676849642 100644 --- a/packages/opencode/src/flag/flag.ts +++ b/packages/opencode/src/flag/flag.ts @@ -20,6 +20,7 @@ export namespace Flag { export const OPENCODE_DISABLE_TERMINAL_TITLE = truthy("OPENCODE_DISABLE_TERMINAL_TITLE") export const OPENCODE_PERMISSION = process.env["OPENCODE_PERMISSION"] export const OPENCODE_DISABLE_DEFAULT_PLUGINS = truthy("OPENCODE_DISABLE_DEFAULT_PLUGINS") + export const OPENCODE_DISABLE_LSP = truthy("OPENCODE_DISABLE_LSP") export const OPENCODE_DISABLE_LSP_DOWNLOAD = truthy("OPENCODE_DISABLE_LSP_DOWNLOAD") export const OPENCODE_ENABLE_EXPERIMENTAL_MODELS = truthy("OPENCODE_ENABLE_EXPERIMENTAL_MODELS") export const OPENCODE_DISABLE_AUTOCOMPACT = truthy("OPENCODE_DISABLE_AUTOCOMPACT") diff --git a/packages/opencode/src/lsp/index.ts b/packages/opencode/src/lsp/index.ts index 9d7d30632ab..6e570d5f3a5 100644 --- a/packages/opencode/src/lsp/index.ts +++ b/packages/opencode/src/lsp/index.ts @@ -80,6 +80,17 @@ export namespace LSP { async () => { const clients: LSPClient.Info[] = [] const servers: Record = {} + + if (Flag.OPENCODE_DISABLE_LSP) { + log.info("all LSPs are disabled via OPENCODE_DISABLE_LSP") + return { + broken: new Set(), + servers, + clients, + spawning: new Map>(), + } + } + const cfg = await Config.get() if (cfg.lsp === false) {