From 76b318e9903d759e25128f9d680c82a0b8302f04 Mon Sep 17 00:00:00 2001 From: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Date: Wed, 5 Aug 2026 15:15:26 +0800 Subject: [PATCH] refactor(app): gate unsupported v2 capabilities (#40381) --- .../session-timeline-context-resize.spec.ts | 8 +- .../src/components/dialog-custom-provider.tsx | 2 +- .../components/dialog-select-directory-v2.tsx | 7 +- .../components/dialog-select-directory.tsx | 7 +- packages/app/src/components/edit-project.ts | 8 +- .../app/src/components/settings-general.tsx | 25 ++- .../app/src/components/settings-providers.tsx | 4 +- .../src/components/settings-v2/general.tsx | 25 ++- .../src/components/settings-v2/providers.tsx | 4 +- .../src/components/status-popover-body.tsx | 16 +- packages/app/src/context/directory-sync.ts | 3 +- .../src/context/global-sync/bootstrap.test.ts | 38 +--- .../app/src/context/global-sync/bootstrap.ts | 96 +++------- .../src/context/global-sync/child-store.ts | 5 +- .../src/context/global-sync/session-load.ts | 11 -- packages/app/src/context/layout.tsx | 2 +- packages/app/src/context/permission.tsx | 3 - packages/app/src/context/server-sdk.tsx | 17 +- packages/app/src/context/server-session.ts | 16 +- packages/app/src/context/server-sync.tsx | 56 +++--- .../pages/home/home-projects-controller.tsx | 1 + .../app/src/pages/home/home-projects-view.tsx | 9 +- packages/app/src/pages/home/home-projects.tsx | 1 + .../pages/home/home-sessions-controller.tsx | 16 +- .../app/src/pages/home/home-sessions-view.tsx | 7 +- packages/app/src/pages/home/home-sessions.tsx | 1 + packages/app/src/pages/layout.tsx | 64 +++---- .../app/src/pages/layout/sidebar-items.tsx | 3 +- .../app/src/pages/layout/sidebar-project.tsx | 11 +- .../src/pages/layout/sidebar-workspace.tsx | 19 +- packages/app/src/pages/session.tsx | 24 ++- .../session/timeline/message-timeline.tsx | 29 +-- .../pages/session/use-session-commands.tsx | 7 +- packages/app/src/utils/server-compat.test.ts | 22 ++- packages/app/src/utils/server-compat.ts | 174 ++++++++++++++---- 35 files changed, 402 insertions(+), 339 deletions(-) diff --git a/packages/app/e2e/regression/session-timeline-context-resize.spec.ts b/packages/app/e2e/regression/session-timeline-context-resize.spec.ts index 053999e5e20..a9a4738da92 100644 --- a/packages/app/e2e/regression/session-timeline-context-resize.spec.ts +++ b/packages/app/e2e/regression/session-timeline-context-resize.spec.ts @@ -14,8 +14,8 @@ const projectID = "proj_context_resize_regression" const sessionID = "ses_context_resize_regression" const title = "Context resize regression" const model = { providerID: "opencode", modelID: "claude-opus-4-6", variant: "max" } -const contextIDs = ["ctx_0100_read", "ctx_0101_glob", "ctx_0102_grep", "ctx_0103_list"] -const followingTextID = `${id("msg_assistant", 10)}:text:0` +const contextIDs = ["prt_0100_read", "prt_0101_glob", "prt_0102_grep", "prt_0103_list"] +const followingTextID = "prt_0104_text" type Message = { info: Record & { id: string; role: "user" | "assistant" } @@ -263,7 +263,7 @@ function turn(index: number, target: boolean, status: "running" | "completed" = ), contextTool(contextIDs[3]!, assistantID, "list", { path: "src" }, status), { - id: "prt_0104_text", + id: followingTextID, sessionID, messageID: assistantID, type: "text", @@ -295,7 +295,7 @@ function contextTool( sessionID, messageID, type: "tool", - callID: partID, + callID: `call_${partID}`, tool, state: { status, diff --git a/packages/app/src/components/dialog-custom-provider.tsx b/packages/app/src/components/dialog-custom-provider.tsx index 5db684a2da2..af476f38b79 100644 --- a/packages/app/src/components/dialog-custom-provider.tsx +++ b/packages/app/src/components/dialog-custom-provider.tsx @@ -136,7 +136,7 @@ export function CustomProviderForm(props: { autofocus?: boolean } = {}) { const nextDisabled = disabledProviders.filter((id) => id !== result.providerID) if (result.key) { - await serverSDK().client.auth.set({ + await serverSDK().legacy.auth.set({ providerID: result.providerID, auth: { type: "api", diff --git a/packages/app/src/components/dialog-select-directory-v2.tsx b/packages/app/src/components/dialog-select-directory-v2.tsx index e799f638d8d..ada42b7d83e 100644 --- a/packages/app/src/components/dialog-select-directory-v2.tsx +++ b/packages/app/src/components/dialog-select-directory-v2.tsx @@ -71,11 +71,8 @@ export function DialogSelectDirectoryV2(props: DialogSelectDirectoryV2Props) { () => (missingBase() ? true : undefined), async (): Promise => { if ((await sdk.protocol) === "v1") - return sdk.client.path - .get() - .then((result) => result.data) - .catch(() => undefined) - return sdk.currentApi.location + return sdk.legacy.path.get().catch(() => undefined) + return sdk.api.location .get() .then((location) => ({ state: "", diff --git a/packages/app/src/components/dialog-select-directory.tsx b/packages/app/src/components/dialog-select-directory.tsx index dfce1571ed9..a6b1894a839 100644 --- a/packages/app/src/components/dialog-select-directory.tsx +++ b/packages/app/src/components/dialog-select-directory.tsx @@ -62,11 +62,8 @@ export function DialogSelectDirectory(props: DialogSelectDirectoryProps) { () => (missingBase() ? true : undefined), async (): Promise => { if ((await sdk.protocol) === "v1") - return sdk.client.path - .get() - .then((result) => result.data) - .catch(() => undefined) - return sdk.currentApi.location + return sdk.legacy.path.get().catch(() => undefined) + return sdk.api.location .get() .then((location) => ({ state: "", diff --git a/packages/app/src/components/edit-project.ts b/packages/app/src/components/edit-project.ts index 0c5d576e934..efbf80840d4 100644 --- a/packages/app/src/components/edit-project.ts +++ b/packages/app/src/components/edit-project.ts @@ -73,7 +73,7 @@ export function createEditProjectModel(props: { project: LocalProject; server: S if (props.project.id && props.project.id !== "global") { if ((await serverCtx().sdk.protocol) !== "v1") return const project = await serverCtx() - .sdk.client.project.update({ + .sdk.legacy.project.update({ projectID: props.project.id, directory: props.project.worktree, name, @@ -82,12 +82,6 @@ export function createEditProjectModel(props: { project: LocalProject; server: S }) .then((result) => result.data) if (!project) return - // const project = await serverCtx().sdk.api.project.update({ - // projectID: props.project.id, - // name, - // icon: { color: store.color || "", override: store.iconOverride || "" }, - // commands: { start }, - // }) serverCtx().sync.set("project", (items) => items.map((item) => (item.id === project.id ? normalizeProjectInfo(project) : item)), ) diff --git a/packages/app/src/components/settings-general.tsx b/packages/app/src/components/settings-general.tsx index a20e66de3ee..18a2945c963 100644 --- a/packages/app/src/components/settings-general.tsx +++ b/packages/app/src/components/settings-general.tsx @@ -13,7 +13,7 @@ import { useLanguage } from "@/context/language" import { usePermission } from "@/context/permission" import { usePlatform, type DisplayBackend } from "@/context/platform" import { useServerSync } from "@/context/server-sync" -import { useServerSDK } from "@/context/server-sdk" +import { useServerProtocol, useServerSDK } from "@/context/server-sdk" import { useUpdaterAction } from "./updater-action" import { monoDefault, @@ -125,16 +125,11 @@ export const SettingsGeneral: Component = () => { const serverSync = useServerSync() const serverSdk = useServerSDK() + const protocol = useServerProtocol() const [shells] = createResource( - async () => { - const sdk = serverSdk() - if ((await sdk.protocol) === "v1") { - return (await sdk.client.pty.shells()).data ?? [] - } - // return (await sdk.api.pty.shells()).data - return [] as ShellOption[] - }, + () => (protocol() === "v1" ? serverSdk() : undefined), + (sdk) => sdk.legacy.pty.shells().catch(() => [] as ShellOption[]), { initialValue: [] as ShellOption[] }, ) @@ -325,10 +320,11 @@ export const SettingsGeneral: Component = () => { - + +