From 86cef169404cd52a57c2ce0cec344b0aca5401c3 Mon Sep 17 00:00:00 2001 From: James Long Date: Mon, 9 Mar 2026 16:14:19 -0400 Subject: [PATCH] fix(core): put workspace routing behind OPENCODE_EXPERIMENTAL_WORKSPACES flag (#16775) --- packages/opencode/src/cli/cmd/tui/app.tsx | 2 +- .../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 ++-- .../control-plane/session-proxy-middleware.test.ts | 10 ++++++++++ 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index e939b831d..d5aef34f6 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 49b2d6109..f64dbe533 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 b48f2fd2b..463a95ef2 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 7c48e99f4..2488e7675 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"] 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 369b9152a..c674d95ec 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 }>