From 50cb18d7708a7549e51a2eb4608da478a9fca007 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Sat, 11 Jul 2026 14:37:10 +0000 Subject: [PATCH] fix(tui): use v2 vcs diff endpoint --- .../feature-plugins/system/diff-viewer.tsx | 16 +++-- .../tui/test/cli/tui/diff-viewer.test.tsx | 59 +++++++++++++------ 2 files changed, 52 insertions(+), 23 deletions(-) diff --git a/packages/tui/src/feature-plugins/system/diff-viewer.tsx b/packages/tui/src/feature-plugins/system/diff-viewer.tsx index 1bee45dedc4c..2750e4df6d79 100644 --- a/packages/tui/src/feature-plugins/system/diff-viewer.tsx +++ b/packages/tui/src/feature-plugins/system/diff-viewer.tsx @@ -1,6 +1,7 @@ /** @jsxImportSource @opentui/solid */ +import type { FileDiffInfo } from "@opencode-ai/client/promise" import type { TuiPlugin, TuiPluginApi, TuiRouteCurrent } from "@opencode-ai/plugin/tui" -import type { FileDiffInfo, SnapshotFileDiff, VcsFileDiff } from "@opencode-ai/sdk/v2" +import type { SnapshotFileDiff, VcsFileDiff } from "@opencode-ai/sdk/v2" import { TextAttributes, type BorderSides, @@ -18,6 +19,7 @@ import { DiffViewerFileTree } from "./diff-viewer-file-tree" import { Panel, PanelGroup, Separator } from "./diff-viewer-ui" import { DialogSelect } from "../../ui/dialog-select" import { getScrollAcceleration } from "../../util/scroll" +import { useSDK } from "../../context/sdk" import { allExpandedFileTreeDirectories, buildFileTree, @@ -89,6 +91,7 @@ function diffSourceLabel(mode: DiffMode) { } function DiffViewer(props: { api: TuiPluginApi }) { + const sdk = useSDK() const dimensions = useTerminalDimensions() const themeState = useTheme() const theme = () => props.api.theme.current @@ -122,11 +125,12 @@ function DiffViewer(props: { api: TuiPluginApi }) { return normalizeDiffs(result.data ?? []) } - const result = await props.api.client.vcs.diff( - { directory: input.directory, mode: input.mode, context: VCS_DIFF_CONTEXT_LINES }, - { throwOnError: true }, - ) - return normalizeDiffs(result.data ?? []) + const result = await sdk.api.vcs.diff({ + location: { directory: input.directory }, + mode: input.mode === "git" ? "working" : input.mode, + context: VCS_DIFF_CONTEXT_LINES, + }) + return normalizeDiffs(result.data) }) const files = createMemo(() => diff() ?? []) const [focus, setFocus] = createSignal("patches") diff --git a/packages/tui/test/cli/tui/diff-viewer.test.tsx b/packages/tui/test/cli/tui/diff-viewer.test.tsx index f7fc9c0a5159..824fd4e9403b 100644 --- a/packages/tui/test/cli/tui/diff-viewer.test.tsx +++ b/packages/tui/test/cli/tui/diff-viewer.test.tsx @@ -3,9 +3,11 @@ import { expect, test } from "bun:test" import { createDefaultOpenTuiKeymap } from "@opentui/keymap/opentui" import { DiffRenderable, type Renderable, ScrollBoxRenderable } from "@opentui/core" import { testRender, useRenderer } from "@opentui/solid" +import type { OpenCodeClient } from "@opencode-ai/client/promise" import type { TuiPluginApi, TuiPluginMeta, TuiRouteCurrent, TuiRouteDefinition } from "@opencode-ai/plugin/tui" import type { Session } from "@opencode-ai/sdk/v2" import { KVProvider } from "../../../src/context/kv" +import { SDKProvider } from "../../../src/context/sdk" import { ThemeProvider } from "../../../src/context/theme" import { TuiConfigProvider } from "../../../src/config" import { TuiKeybind } from "../../../src/config/keybind" @@ -22,7 +24,11 @@ test("closing the diff viewer returns to the route it opened from", async () => name: "diff", params: { mode: "git", sessionID: "session-1", returnRoute: startRoute }, }) - expect(viewer.vcsDiffInput()).toEqual({ directory: "/repo/session", mode: "git", context: 12 }) + expect(viewer.vcsDiffInput()).toEqual({ + location: { directory: "/repo/session" }, + mode: "working", + context: 12, + }) expect(viewer.commands.has("diff.close")).toBe(true) viewer.commands.get("diff.close")!.run?.({} as never) @@ -119,12 +125,6 @@ async function renderDiffViewer(vcsDiff: unknown[], height = 20, initialRoute?: const base = createTuiPluginApi({ keymap, client: { - vcs: { - diff: async (input: unknown) => { - vcsDiffInput = input - return { data: vcsDiff } - }, - }, session: { diff: async (input: unknown) => { sessionDiffInput = input @@ -138,6 +138,25 @@ async function renderDiffViewer(vcsDiff: unknown[], height = 20, initialRoute?: }, }, }) + const next = { + vcs: { + diff: async (input: unknown) => { + vcsDiffInput = input + return { + location: { directory: "/repo/session", project: { id: "project-1", directory: "/repo/session" } }, + data: vcsDiff, + } + }, + }, + event: { + subscribe() { + return (async function* () { + yield { type: "server.connected" } + await new Promise(() => {}) + })() + }, + }, + } as unknown as OpenCodeClient const api = { ...base, route: { @@ -159,15 +178,17 @@ async function renderDiffViewer(vcsDiff: unknown[], height = 20, initialRoute?: return ( - - - - - {renderDiff?.({ params: "params" in current ? current.params : undefined })} - - - - + + + + + + {renderDiff?.({ params: "params" in current ? current.params : undefined })} + + + + + ) } @@ -218,7 +239,11 @@ test("branch diff source requests branch VCS diff", async () => { name: "diff", params: { mode: "branch", sessionID: "session-1", returnRoute: startRoute }, }) - expect(viewer.vcsDiffInput()).toEqual({ directory: "/repo/session", mode: "branch", context: 12 }) + expect(viewer.vcsDiffInput()).toEqual({ + location: { directory: "/repo/session" }, + mode: "branch", + context: 12, + }) expect(viewer.sessionDiffInput()).toBeUndefined() } finally { viewer.app.renderer.destroy()