From 818ebc5d4eb0dfec8190df5869f55878608be174 Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 29 Jan 2026 23:16:41 +0100 Subject: [PATCH] fix(coding-agent/lsp): exposed LSP server startup errors in session display and logs - Added error field to LSP server status types throughout the mode context chain. - Updated /session command to display the actual error message when an LSP server fails to start. - Added logger.warn call during LSP warmup to log server startup failures to ~/.omp/logs/. --- packages/coding-agent/CHANGELOG.md | 3 +++ packages/coding-agent/src/lsp/index.ts | 1 + packages/coding-agent/src/main.ts | 2 +- .../src/modes/controllers/command-controller.ts | 4 +++- packages/coding-agent/src/modes/interactive-mode.ts | 9 ++++++--- packages/coding-agent/src/modes/types.ts | 2 +- packages/coding-agent/src/sdk.ts | 2 +- 7 files changed, 16 insertions(+), 7 deletions(-) diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index c74327c7f..f7aa07fef 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -11,6 +11,9 @@ - `View: system info` - Show environment details - `Clear: artifact cache` - Remove old session artifacts +### Fixed +- Fixed LSP server errors not being visible in `/session` output or logs when startup fails + ## [8.12.7] - 2026-01-29 ### Fixed diff --git a/packages/coding-agent/src/lsp/index.ts b/packages/coding-agent/src/lsp/index.ts index 4be7918e5..927251a71 100644 --- a/packages/coding-agent/src/lsp/index.ts +++ b/packages/coding-agent/src/lsp/index.ts @@ -118,6 +118,7 @@ export async function warmupLspServers(cwd: string, options?: LspWarmupOptions): }); } else { const errorMsg = result.reason?.message ?? String(result.reason); + logger.warn("LSP server failed to start", { server: name, error: errorMsg }); servers.push({ name, status: "error", diff --git a/packages/coding-agent/src/main.ts b/packages/coding-agent/src/main.ts index adce94ebb..cab7e6621 100644 --- a/packages/coding-agent/src/main.ts +++ b/packages/coding-agent/src/main.ts @@ -87,7 +87,7 @@ async function runInteractiveMode( versionCheckPromise: Promise, initialMessages: string[], setExtensionUIContext: (uiContext: ExtensionUIContext, hasUI: boolean) => void, - lspServers: Array<{ name: string; status: "ready" | "error"; fileTypes: string[] }> | undefined, + lspServers: Array<{ name: string; status: "ready" | "error"; fileTypes: string[]; error?: string }> | undefined, mcpManager: import("./mcp").MCPManager | undefined, initialMessage?: string, initialImages?: ImageContent[], diff --git a/packages/coding-agent/src/modes/controllers/command-controller.ts b/packages/coding-agent/src/modes/controllers/command-controller.ts index 1d76f4df0..d0e274e18 100644 --- a/packages/coding-agent/src/modes/controllers/command-controller.ts +++ b/packages/coding-agent/src/modes/controllers/command-controller.ts @@ -265,7 +265,9 @@ export class CommandController { info += `\n${theme.bold("LSP Servers")}\n`; for (const server of this.ctx.lspServers) { const statusColor = server.status === "ready" ? "success" : "error"; - info += `${theme.fg("dim", `${server.name}:`)} ${theme.fg(statusColor, server.status)} ${theme.fg("dim", `(${server.fileTypes.join(", ")})`)}\n`; + const statusText = + server.status === "error" && server.error ? `${server.status}: ${server.error}` : server.status; + info += `${theme.fg("dim", `${server.name}:`)} ${theme.fg(statusColor, statusText)} ${theme.fg("dim", `(${server.fileTypes.join(", ")})`)}\n`; } } diff --git a/packages/coding-agent/src/modes/interactive-mode.ts b/packages/coding-agent/src/modes/interactive-mode.ts index e25beeb5b..a1376a6fd 100644 --- a/packages/coding-agent/src/modes/interactive-mode.ts +++ b/packages/coding-agent/src/modes/interactive-mode.ts @@ -134,8 +134,9 @@ export class InteractiveMode implements InteractiveModeContext { private planModePreviousTools: string[] | undefined; private planModePreviousModel: Model | undefined; private planModeHasEntered = false; - public readonly lspServers: Array<{ name: string; status: "ready" | "error"; fileTypes: string[] }> | undefined = - undefined; + public readonly lspServers: + | Array<{ name: string; status: "ready" | "error"; fileTypes: string[]; error?: string }> + | undefined = undefined; public mcpManager?: import("../mcp").MCPManager; private readonly toolUiContextSetter: (uiContext: ExtensionUIContext, hasUI: boolean) => void; @@ -151,7 +152,9 @@ export class InteractiveMode implements InteractiveModeContext { version: string, changelogMarkdown: string | undefined = undefined, setToolUIContext: (uiContext: ExtensionUIContext, hasUI: boolean) => void = () => {}, - lspServers: Array<{ name: string; status: "ready" | "error"; fileTypes: string[] }> | undefined = undefined, + lspServers: + | Array<{ name: string; status: "ready" | "error"; fileTypes: string[]; error?: string }> + | undefined = undefined, mcpManager?: import("../mcp").MCPManager, ) { this.session = session; diff --git a/packages/coding-agent/src/modes/types.ts b/packages/coding-agent/src/modes/types.ts index 17be00935..195099b24 100644 --- a/packages/coding-agent/src/modes/types.ts +++ b/packages/coding-agent/src/modes/types.ts @@ -51,7 +51,7 @@ export interface InteractiveModeContext { agent: AgentSession["agent"]; historyStorage?: HistoryStorage; mcpManager?: MCPManager; - lspServers?: Array<{ name: string; status: "ready" | "error"; fileTypes: string[] }>; + lspServers?: Array<{ name: string; status: "ready" | "error"; fileTypes: string[]; error?: string }>; // State isInitialized: boolean; diff --git a/packages/coding-agent/src/sdk.ts b/packages/coding-agent/src/sdk.ts index 9cf75a24d..109c6fd3f 100644 --- a/packages/coding-agent/src/sdk.ts +++ b/packages/coding-agent/src/sdk.ts @@ -204,7 +204,7 @@ export interface CreateAgentSessionResult { /** Warning if session was restored with a different model than saved */ modelFallbackMessage?: string; /** LSP servers that were warmed up at startup */ - lspServers?: Array<{ name: string; status: "ready" | "error"; fileTypes: string[] }>; + lspServers?: Array<{ name: string; status: "ready" | "error"; fileTypes: string[]; error?: string }>; } // Re-exports