From b0b7fd143b8d44b673f6b0a6dc4c6faaae6afe5b Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Tue, 11 Nov 2025 12:15:33 -0500 Subject: [PATCH] tui: show LSP diagnostics inline when viewing files so users can see type errors and compilation issues without leaving the interface --- .../src/cli/cmd/tui/routes/session/index.tsx | 29 +++++++++++++++++++ packages/opencode/src/lsp/index.ts | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index 7b91aa3f..746015c8 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -58,6 +58,7 @@ import { Editor } from "../../util/editor" import { Global } from "@/global" import fs from "fs/promises" import stripAnsi from "strip-ansi" +import { LSP } from "@/lsp/index.ts" addDefaultParsers(parsers.parsers) @@ -1201,6 +1202,8 @@ ToolRegistry.register({ .map((x) => x.toString().padStart(pad, " ")) }) + const diagnostics = createMemo(() => props.metadata.diagnostics?.[props.input.filePath ?? ""] ?? []) + return ( <> @@ -1214,6 +1217,15 @@ ToolRegistry.register({ + + + {(diagnostic) => ( + + Error [{diagnostic.range.start.line}:{diagnostic.range.start.character}]: {diagnostic.message} + + )} + + ) }, @@ -1391,6 +1403,12 @@ ToolRegistry.register({ const ft = createMemo(() => filetype(props.input.filePath)) + createEffect(() => console.log(props.metadata.diagnostics)) + const diagnostics = createMemo(() => { + const arr = props.metadata.diagnostics?.[props.input.filePath ?? ""] ?? [] + return arr.filter((x) => x.severity === 1).slice(0, 3) + }) + return ( <> @@ -1419,6 +1437,17 @@ ToolRegistry.register({ + + + + {(diagnostic) => ( + + Error [{diagnostic.range.start.line + 1}:{diagnostic.range.start.character + 1}] {diagnostic.message} + + )} + + + ) }, diff --git a/packages/opencode/src/lsp/index.ts b/packages/opencode/src/lsp/index.ts index 8640489b..44cf263f 100644 --- a/packages/opencode/src/lsp/index.ts +++ b/packages/opencode/src/lsp/index.ts @@ -193,10 +193,10 @@ export namespace LSP { } export async function touchFile(input: string, waitForDiagnostics?: boolean) { + log.info("touching file", { file: input }) const clients = await getClients(input) await run(async (client) => { if (!clients.includes(client)) return - const wait = waitForDiagnostics ? client.waitForDiagnostics({ path: input }) : Promise.resolve() await client.notify.open({ path: input }) return wait