diff --git a/packages/app/src/app.tsx b/packages/app/src/app.tsx
index 25d2e3749ab..f47c432e420 100644
--- a/packages/app/src/app.tsx
+++ b/packages/app/src/app.tsx
@@ -237,6 +237,30 @@ function UiI18nBridge(props: ParentProps) {
return {props.children}
}
+function LayoutCompatibility(props: ParentProps) {
+ const global = useGlobal()
+ const navigate = useNavigate()
+ const server = useServer()
+ const settings = useSettings()
+
+ createEffect(() => {
+ if (settings.general.newLayoutDesigns()) return
+ const current = server.current
+ if (!current) return
+ const protocol = global.ensureServerCtx(current).sdk.protocolKind()
+ if (protocol !== "v2") return
+ const next = global.servers.list().find((s) => {
+ if (ServerConnection.key(s) === ServerConnection.key(current)) return false
+ return global.ensureServerCtx(s).sdk.protocolKind() !== "v2"
+ })
+ if (!next) return
+ navigate("/")
+ queueMicrotask(() => server.setActive(ServerConnection.key(next)))
+ })
+
+ return <>{props.children}>
+}
+
declare global {
interface Window {
__OPENCODE__?: {
diff --git a/packages/app/src/components/dialog-select-server.tsx b/packages/app/src/components/dialog-select-server.tsx
index 08769068909..aa16976228e 100644
--- a/packages/app/src/components/dialog-select-server.tsx
+++ b/packages/app/src/components/dialog-select-server.tsx
@@ -16,6 +16,7 @@ import { useGlobal } from "@/context/global"
import { useLanguage } from "@/context/language"
import { usePlatform } from "@/context/platform"
import { normalizeServerUrl, ServerConnection, useServer } from "@/context/server"
+import { detectServerProtocol } from "@/utils/server-protocol"
import { type ServerHealth, useCheckServerHealth } from "@/utils/server-health"
import { useSettings } from "@/context/settings"
import { useTabs } from "@/context/tabs"
@@ -263,6 +264,13 @@ export function useServerManagementController(options: { onSelect?: () => void;
setStore("addServer", { error: language.t("dialog.server.add.error") })
return
}
+ if (
+ !settings.general.newLayoutDesigns() &&
+ (await detectServerProtocol(conn.http, platform.fetch ?? globalThis.fetch)) === "v2"
+ ) {
+ setStore("addServer", { error: language.t("dialog.server.add.error") })
+ return
+ }
resetAdd()
if (options.navigateOnAdd === false) {
@@ -307,6 +315,13 @@ export function useServerManagementController(options: { onSelect?: () => void;
setStore("editServer", { error: language.t("dialog.server.add.error") })
return
}
+ if (
+ !settings.general.newLayoutDesigns() &&
+ (await detectServerProtocol(conn.http, platform.fetch ?? globalThis.fetch)) === "v2"
+ ) {
+ setStore("editServer", { error: language.t("dialog.server.add.error") })
+ return
+ }
if (normalized === input.original.http.url) {
server.add(conn)
} else {
@@ -344,7 +359,10 @@ export function useServerManagementController(options: { onSelect?: () => void;
)
const sortedItems = createMemo(() => {
- const list = items()
+ const raw = items()
+ const list = settings.general.newLayoutDesigns()
+ ? raw
+ : raw.filter((x) => global.ensureServerCtx(x).sdk.protocolKind() !== "v2")
if (!list.length) return list
const active = current()
const order = new Map(list.map((url, index) => [url, index] as const))
diff --git a/packages/app/src/components/status-popover-body.tsx b/packages/app/src/components/status-popover-body.tsx
index 68a3f6b2267..8046ec3e578 100644
--- a/packages/app/src/components/status-popover-body.tsx
+++ b/packages/app/src/components/status-popover-body.tsx
@@ -276,7 +276,12 @@ export function StatusPopoverBody(props: { shown: Accessor }) {
dialogDead = true
dialogRun += 1
})
- const sortedServers = createMemo(() => listServersByHealth(global.servers.list(), server.key, global.servers.health))
+ const sortedServers = createMemo(() => {
+ const list = settings.general.newLayoutDesigns()
+ ? global.servers.list()
+ : global.servers.list().filter((x) => global.ensureServerCtx(x).sdk.protocolKind() !== "v2")
+ return listServersByHealth(list, server.key, global.servers.health)
+ })
const toggleMcp = useMcpToggle()
const defaultServer = useDefaultServerKey(platform.getDefaultServer)
const mcpNames = createMemo(() => Object.keys(sync().data.mcp ?? {}).sort((a, b) => a.localeCompare(b)))
@@ -303,7 +308,7 @@ export function StatusPopoverBody(props: { shown: Accessor }) {
{!settings.general.newLayoutDesigns() && (
- {global.servers.list().length > 0 ? `${global.servers.list().length} ` : ""}
+ {sortedServers().length > 0 ? `${sortedServers().length} ` : ""}
{language.t("status.popover.tab.servers")}
)}
diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx
index c039b3d4827..d086582035a 100644
--- a/packages/app/src/context/layout.tsx
+++ b/packages/app/src/context/layout.tsx
@@ -127,7 +127,7 @@ const normalizeStoredSessionTabs = (key: string, tabs: SessionTabs) => {
}
}
-const currentRoute = (pathname: string, search: string): LayoutRoute => {
+export const currentRoute = (pathname: string, search: string): LayoutRoute => {
const parts = pathname.split("/").filter(Boolean)
if (parts.length === 0) return { type: "home" }