surface lsp status in instance info

This commit is contained in:
Shantur Rathore
2025-11-16 21:36:27 +00:00
parent eb279cf251
commit 742c2d2c29
6 changed files with 119 additions and 59 deletions

View File

@@ -1,6 +1,6 @@
import { createSignal } from "solid-js"
import type { Instance, LogEntry } from "../types/instance"
import type { Permission } from "@opencode-ai/sdk"
import type { LspStatus, Permission } from "@opencode-ai/sdk"
import type { ClientPart, Message } from "../types/message"
import { sdkManager } from "../lib/sdk-manager"
import { sseManager } from "../lib/sse-manager"
@@ -233,6 +233,26 @@ async function stopInstance(id: string) {
removeInstance(id)
}
async function fetchLspStatus(instanceId: string): Promise<LspStatus[] | undefined> {
const instance = instances().get(instanceId)
if (!instance) {
console.warn(`[LSP] Skipping fetch; instance ${instanceId} not found`)
return undefined
}
if (!instance.client) {
console.warn(`[LSP] Skipping fetch; instance ${instanceId} client not ready`)
return undefined
}
const lsp = instance.client.lsp
if (!lsp?.status) {
console.warn(`[LSP] Skipping fetch; lsp.status API unavailable for instance ${instanceId}`)
return undefined
}
console.log(`[HTTP] GET /lsp.status for instance ${instanceId}`)
const response = await lsp.status()
return response.data ?? []
}
function getActiveInstance(): Instance | null {
const id = activeInstanceId()
return id ? instances().get(id) || null : null
@@ -546,6 +566,29 @@ sseManager.onConnectionLost = (instanceId, reason) => {
})
}
sseManager.onLspUpdated = async (instanceId) => {
console.log(`[LSP] Received lsp.updated event for instance ${instanceId}`)
try {
const lspStatus = await fetchLspStatus(instanceId)
if (!lspStatus) {
return
}
const instance = instances().get(instanceId)
if (!instance) {
console.warn(`[LSP] Instance ${instanceId} disappeared before metadata update`)
return
}
updateInstance(instanceId, {
metadata: {
...(instance.metadata ?? {}),
lspStatus,
},
})
} catch (error) {
console.error("Failed to refresh LSP status:", error)
}
}
async function acknowledgeDisconnectedInstance(): Promise<void> {
const pending = disconnectedInstance()
if (!pending) {
@@ -593,4 +636,5 @@ export {
sendPermissionResponse,
disconnectedInstance,
acknowledgeDisconnectedInstance,
fetchLspStatus,
}