diff --git a/desktop/src/components/workspace/WorkspacePanel.tsx b/desktop/src/components/workspace/WorkspacePanel.tsx index 4bf57ff0..35ca9bbc 100644 --- a/desktop/src/components/workspace/WorkspacePanel.tsx +++ b/desktop/src/components/workspace/WorkspacePanel.tsx @@ -31,6 +31,9 @@ import { import { WorkspaceFileOpenWith } from './WorkspaceFileOpenWith' import { WorkspaceEditor, saveWorkspaceBuffer } from './WorkspaceEditor' import { UnsavedChangesModal } from './UnsavedChangesModal' +import { LspStatusIndicator } from './LspStatusIndicator' +import { errorCountFromDiagnostics, toLegacyLspState } from '../../lib/lspStateMap' +import { sessionsApi } from '../../api/sessions' type WorkspacePanelProps = { sessionId: string @@ -981,6 +984,7 @@ export function WorkspacePanel({ sessionId, embedded = false }: WorkspacePanelPr const closePreviewTabs = useWorkspacePanelStore((state) => state.closePreviewTabs) const initBuffer = useWorkspacePanelStore((state) => state.initBuffer) const syncLsp = useWorkspacePanelStore((state) => state.syncLsp) + const loadLspState = useWorkspacePanelStore((state) => state.loadLspState) const bufferStateByTabId = useWorkspacePanelStore((state) => state.bufferStateByTabId) const closePanel = useWorkspacePanelStore((state) => state.closePanel) const addWorkspaceReference = useWorkspaceChatContextStore((state) => state.addReference) @@ -1354,17 +1358,26 @@ export function WorkspacePanel({ sessionId, embedded = false }: WorkspacePanelPr ))}
{activePreviewTab.kind === 'file' && ( - - {t('workspace.lspState', { state: lspState?.state ?? 'idle' })} · {t('workspace.lspDiagnostics', { count: activeLspDiagnostics?.diagnosticsTotal ?? 0 })} - + { + // Server-side LspManager keeps `unavailable` workspaces + // sticky until an explicit restart, so this round-trips + // through /lsp/restart and then re-reads state. + void sessionsApi + .restartWorkspaceLsp(sessionId, { path: activePreviewTab.path }) + .catch(() => undefined) + .then(() => loadLspState(sessionId, activePreviewTab.path)) + }} + onDiagnosticOpen={(diagnostic) => { + void openPreview(sessionId, diagnostic.path, 'file') + }} + /> )}