From f18c82671e2e030b88aa8520b346b14e9141dfde Mon Sep 17 00:00:00 2001 From: James Long Date: Mon, 9 Mar 2026 11:54:32 -0400 Subject: [PATCH 1/2] fix(core): put workspace routing behind OPENCODE_EXPERIMENTAL_WORKSPACES flag --- packages/opencode/src/cli/cmd/tui/app.tsx | 2 +- packages/opencode/src/cli/cmd/tui/routes/session/header.tsx | 4 ++-- .../src/control-plane/workspace-router-middleware.ts | 5 ++--- packages/opencode/src/flag/flag.ts | 4 ++-- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index e939b831d5a..d5aef34f6e3 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -372,7 +372,7 @@ function App() { dialog.replace(() => ) }, }, - ...(Flag.OPENCODE_EXPERIMENTAL_WORKSPACES_TUI + ...(Flag.OPENCODE_EXPERIMENTAL_WORKSPACES ? [ { title: "Manage workspaces", diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/header.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/header.tsx index 49b2d61091f..f64dbe533a7 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/header.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/header.tsx @@ -103,7 +103,7 @@ export function Header() { - {Flag.OPENCODE_EXPERIMENTAL_WORKSPACES_TUI ? ( + {Flag.OPENCODE_EXPERIMENTAL_WORKSPACES ? ( Subagent session @@ -154,7 +154,7 @@ export function Header() { - {Flag.OPENCODE_EXPERIMENTAL_WORKSPACES_TUI ? ( + {Flag.OPENCODE_EXPERIMENTAL_WORKSPACES ? ( <WorkspaceInfo workspace={workspace} /> diff --git a/packages/opencode/src/control-plane/workspace-router-middleware.ts b/packages/opencode/src/control-plane/workspace-router-middleware.ts index b48f2fd2b7d..463a95ef2b3 100644 --- a/packages/opencode/src/control-plane/workspace-router-middleware.ts +++ b/packages/opencode/src/control-plane/workspace-router-middleware.ts @@ -1,6 +1,5 @@ -import { Instance } from "@/project/instance" import type { MiddlewareHandler } from "hono" -import { Installation } from "../installation" +import { Flag } from "../flag/flag" import { getAdaptor } from "./adaptors" import { Workspace } from "./workspace" import { WorkspaceContext } from "./workspace-context" @@ -38,7 +37,7 @@ async function routeRequest(req: Request) { export const WorkspaceRouterMiddleware: MiddlewareHandler = async (c, next) => { // Only available in development for now - if (!Installation.isLocal()) { + if (!Flag.OPENCODE_EXPERIMENTAL_WORKSPACES) { return next() } diff --git a/packages/opencode/src/flag/flag.ts b/packages/opencode/src/flag/flag.ts index 7c48e99f47f..2488e76758a 100644 --- a/packages/opencode/src/flag/flag.ts +++ b/packages/opencode/src/flag/flag.ts @@ -57,8 +57,8 @@ export namespace Flag { export const OPENCODE_EXPERIMENTAL_LSP_TOOL = OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_LSP_TOOL") export const OPENCODE_DISABLE_FILETIME_CHECK = truthy("OPENCODE_DISABLE_FILETIME_CHECK") export const OPENCODE_EXPERIMENTAL_PLAN_MODE = OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_PLAN_MODE") - export const OPENCODE_EXPERIMENTAL_WORKSPACES_TUI = - OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_WORKSPACES_TUI") + export const OPENCODE_EXPERIMENTAL_WORKSPACES = + OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_WORKSPACES") export const OPENCODE_EXPERIMENTAL_MARKDOWN = !falsy("OPENCODE_EXPERIMENTAL_MARKDOWN") export const OPENCODE_MODELS_URL = process.env["OPENCODE_MODELS_URL"] export const OPENCODE_MODELS_PATH = process.env["OPENCODE_MODELS_PATH"] From a035abe962e14afeee4a023444c21633b09326d4 Mon Sep 17 00:00:00 2001 From: James Long <longster@gmail.com> Date: Mon, 9 Mar 2026 13:01:00 -0400 Subject: [PATCH 2/2] Fix test --- .../control-plane/session-proxy-middleware.test.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/opencode/test/control-plane/session-proxy-middleware.test.ts b/packages/opencode/test/control-plane/session-proxy-middleware.test.ts index 369b9152ae7..c674d95ec7d 100644 --- a/packages/opencode/test/control-plane/session-proxy-middleware.test.ts +++ b/packages/opencode/test/control-plane/session-proxy-middleware.test.ts @@ -10,12 +10,22 @@ import { Database } from "../../src/storage/db" import { resetDatabase } from "../fixture/db" import * as adaptors from "../../src/control-plane/adaptors" import type { Adaptor } from "../../src/control-plane/types" +import { Flag } from "../../src/flag/flag" afterEach(async () => { mock.restore() await resetDatabase() }) +const original = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES +// @ts-expect-error don't do this normally, but it works +Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true + +afterEach(() => { + // @ts-expect-error don't do this normally, but it works + Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = original +}) + type State = { workspace?: "first" | "second" calls: Array<{ method: string; url: string; body?: string }>