Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion backend/src/routes/health.ts
Original file line number Diff line number Diff line change
@@ -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<string | null> => {
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()
Expand All @@ -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) {
Expand All @@ -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)
}
Expand Down
7 changes: 6 additions & 1 deletion frontend/src/components/settings/OpenCodeConfigManager.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,12 @@ export function OpenCodeConfigManager() {
)}
{health.opencodeVersion && (
<p className="text-xs text-muted-foreground">
v{health.opencodeVersion}
OpenCode v{health.opencodeVersion}
</p>
)}
{health.opencodeManagerVersion && (
<p className="text-xs text-muted-foreground">
Manager v{health.opencodeManagerVersion}
</p>
)}
</div>
Expand Down
5 changes: 4 additions & 1 deletion frontend/src/hooks/useServerHealth.ts
Original file line number Diff line number Diff line change
@@ -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'

Expand All @@ -13,11 +14,13 @@ interface HealthResponse {
opencodeVersion: string | null
opencodeMinVersion: string
opencodeVersionSupported: boolean
opencodeManagerVersion: string | null
error?: string
}

async function fetchHealth(): Promise<HealthResponse> {
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')
}
Expand Down