import { Component, Show, For, createSignal, createEffect, onCleanup } from "solid-js" import type { Instance, RawMcpStatus } from "../types/instance" import { updateInstance } from "../stores/instances" interface InstanceInfoProps { instance: Instance compact?: boolean } type ParsedMcpStatus = { name: string status: "running" | "stopped" | "error" error?: string } function parseMcpStatus(status: RawMcpStatus): ParsedMcpStatus[] { if (!status || typeof status !== "object") return [] const result: ParsedMcpStatus[] = [] for (const [name, value] of Object.entries(status)) { if (!value || typeof value !== "object") continue const rawStatus = (value as { status?: string }).status if (!rawStatus) continue let mappedStatus: ParsedMcpStatus["status"] if (rawStatus === "connected") { mappedStatus = "running" } else if (rawStatus === "failed") { mappedStatus = "error" } else { mappedStatus = "stopped" } result.push({ name, status: mappedStatus, error: typeof (value as { error?: unknown }).error === "string" ? (value as { error?: string }).error : undefined, }) } return result } const pendingMetadataRequests = new Set() const InstanceInfo: Component = (props) => { const [isLoadingMetadata, setIsLoadingMetadata] = createSignal(true) const metadata = () => props.instance.metadata const mcpServers = () => { const status = metadata()?.mcpStatus return status ? parseMcpStatus(status) : [] } createEffect(() => { const instance = props.instance const instanceId = instance.id const client = instance.client const hasMetadata = Boolean(instance.metadata) if (!client) { setIsLoadingMetadata(false) pendingMetadataRequests.delete(instanceId) return } if (hasMetadata) { setIsLoadingMetadata(false) pendingMetadataRequests.delete(instanceId) return } if (pendingMetadataRequests.has(instanceId)) { setIsLoadingMetadata(true) return } let cancelled = false pendingMetadataRequests.add(instanceId) setIsLoadingMetadata(true) void (async () => { try { const [projectResult, mcpResult] = await Promise.allSettled([ client.project.current(), client.mcp.status(), ]) if (cancelled) { return } const project = projectResult.status === "fulfilled" ? projectResult.value.data : undefined const mcpStatus = mcpResult.status === "fulfilled" ? (mcpResult.value.data as RawMcpStatus) : undefined const nextMetadata = { ...(instance.metadata ?? {}), ...(project ? { project } : {}), ...(mcpStatus ? { mcpStatus } : {}), } if (!nextMetadata.version) { nextMetadata.version = "0.15.8" } updateInstance(instanceId, { metadata: nextMetadata }) } catch (error) { if (!cancelled) { console.error("Failed to load instance metadata:", error) } } finally { pendingMetadataRequests.delete(instanceId) if (!cancelled) { setIsLoadingMetadata(false) } } })() onCleanup(() => { cancelled = true }) }) return (

Instance Information

Folder
{props.instance.folder}
{(project) => ( <>
Project
{project().id}
Version Control
{project().vcs}
)}
OpenCode Version
v{metadata()?.version}
Binary Path
{props.instance.binaryPath}
0}>
Environment Variables ({Object.keys(props.instance.environmentVariables!).length})
{([key, value]) => (
{key} {value}
)}
0}>
MCP Servers
{(server) => (
{server.name}
{ server.status === "running" ? "Connected" : server.status === "error" ? "Error" : "Disabled" }
{(error) => (
{error()}
)}
)}
Loading...
Server
Port: {props.instance.port}
PID: {props.instance.pid}
Status:
{props.instance.status}
) } export default InstanceInfo