From df989dcc45505a1c8846e05a01228556ded85707 Mon Sep 17 00:00:00 2001 From: Fran Boon Date: Mon, 29 Dec 2025 12:39:49 +0000 Subject: [PATCH] Add opencode-manager version to health endpoint --- backend/src/routes/health.ts | 18 +++++++++++++++++- .../settings/OpenCodeConfigManager.tsx | 7 ++++++- frontend/src/hooks/useServerHealth.ts | 5 ++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/backend/src/routes/health.ts b/backend/src/routes/health.ts index 01f48d6..9a33693 100644 --- a/backend/src/routes/health.ts +++ b/backend/src/routes/health.ts @@ -1,12 +1,25 @@ import { Hono } from 'hono' import type { Database } from 'bun:sqlite' +import { readFile } from 'fs/promises' import { opencodeServerManager } from '../services/opencode-single-server' +const opencodeManagerVersionPromise = (async (): Promise => { + try { + const packageUrl = new URL('../../../package.json', import.meta.url) + const packageJsonRaw = await readFile(packageUrl, 'utf-8') + const packageJson = JSON.parse(packageJsonRaw) as { version?: unknown } + return typeof packageJson.version === 'string' ? packageJson.version : null + } catch { + return null + } +})() + export function createHealthRoutes(db: Database) { const app = new Hono() app.get('/', async (c) => { try { + const opencodeManagerVersion = await opencodeManagerVersionPromise const dbCheck = db.prepare('SELECT 1').get() const opencodeHealthy = await opencodeServerManager.checkHealth() const startupError = opencodeServerManager.getLastStartupError() @@ -23,7 +36,8 @@ export function createHealthRoutes(db: Database) { opencodePort: opencodeServerManager.getPort(), opencodeVersion: opencodeServerManager.getVersion(), opencodeMinVersion: opencodeServerManager.getMinVersion(), - opencodeVersionSupported: opencodeServerManager.isVersionSupported() + opencodeVersionSupported: opencodeServerManager.isVersionSupported(), + opencodeManagerVersion, } if (startupError && !opencodeHealthy) { @@ -32,9 +46,11 @@ export function createHealthRoutes(db: Database) { return c.json(response) } catch (error) { + const opencodeManagerVersion = await opencodeManagerVersionPromise return c.json({ status: 'unhealthy', timestamp: new Date().toISOString(), + opencodeManagerVersion, error: error instanceof Error ? error.message : 'Unknown error' }, 503) } diff --git a/frontend/src/components/settings/OpenCodeConfigManager.tsx b/frontend/src/components/settings/OpenCodeConfigManager.tsx index a22c9f2..08b615a 100644 --- a/frontend/src/components/settings/OpenCodeConfigManager.tsx +++ b/frontend/src/components/settings/OpenCodeConfigManager.tsx @@ -305,7 +305,12 @@ export function OpenCodeConfigManager() { )} {health.opencodeVersion && (

- v{health.opencodeVersion} + OpenCode v{health.opencodeVersion} +

+ )} + {health.opencodeManagerVersion && ( +

+ Manager v{health.opencodeManagerVersion}

)} diff --git a/frontend/src/hooks/useServerHealth.ts b/frontend/src/hooks/useServerHealth.ts index 6c88863..9572d19 100644 --- a/frontend/src/hooks/useServerHealth.ts +++ b/frontend/src/hooks/useServerHealth.ts @@ -1,6 +1,7 @@ import { useQuery } from '@tanstack/react-query' import { toast } from 'sonner' import { settingsApi } from '@/api/settings' +import { API_BASE_URL } from '@/config' import { useMutation } from '@tanstack/react-query' import { useQueryClient } from '@tanstack/react-query' @@ -13,11 +14,13 @@ interface HealthResponse { opencodeVersion: string | null opencodeMinVersion: string opencodeVersionSupported: boolean + opencodeManagerVersion: string | null error?: string } async function fetchHealth(): Promise { - const response = await fetch('/api/health') + const apiBaseUrl = API_BASE_URL.replace(/\/$/, '') + const response = await fetch(`${apiBaseUrl}/api/health`) if (!response.ok) { throw new Error('Health check failed') }