diff --git a/server/src/__tests__/health.test.ts b/server/src/__tests__/health.test.ts index 5583955f..1511b95e 100644 --- a/server/src/__tests__/health.test.ts +++ b/server/src/__tests__/health.test.ts @@ -2,6 +2,7 @@ import { describe, it, expect } from "vitest"; import express from "express"; import request from "supertest"; import { healthRoutes } from "../routes/health.js"; +import { serverVersion } from "../version.js"; describe("GET /health", () => { const app = express(); @@ -10,6 +11,6 @@ describe("GET /health", () => { it("returns 200 with status ok", async () => { const res = await request(app).get("/health"); expect(res.status).toBe(200); - expect(res.body).toEqual({ status: "ok" }); + expect(res.body).toEqual({ status: "ok", version: serverVersion }); }); }); diff --git a/server/src/routes/health.ts b/server/src/routes/health.ts index ddc7c441..59897a89 100644 --- a/server/src/routes/health.ts +++ b/server/src/routes/health.ts @@ -3,6 +3,7 @@ import type { Db } from "@paperclipai/db"; import { and, count, eq, gt, isNull, sql } from "drizzle-orm"; import { instanceUserRoles, invites } from "@paperclipai/db"; import type { DeploymentExposure, DeploymentMode } from "@paperclipai/shared"; +import { serverVersion } from "../version.js"; export function healthRoutes( db?: Db, @@ -22,7 +23,7 @@ export function healthRoutes( router.get("/", async (_req, res) => { if (!db) { - res.json({ status: "ok" }); + res.json({ status: "ok", version: serverVersion }); return; } @@ -56,6 +57,7 @@ export function healthRoutes( res.json({ status: "ok", + version: serverVersion, deploymentMode: opts.deploymentMode, deploymentExposure: opts.deploymentExposure, authReady: opts.authReady, diff --git a/server/src/version.ts b/server/src/version.ts new file mode 100644 index 00000000..39a16a4c --- /dev/null +++ b/server/src/version.ts @@ -0,0 +1,10 @@ +import { createRequire } from "node:module"; + +type PackageJson = { + version?: string; +}; + +const require = createRequire(import.meta.url); +const pkg = require("../package.json") as PackageJson; + +export const serverVersion = pkg.version ?? "0.0.0"; diff --git a/ui/src/api/health.ts b/ui/src/api/health.ts index cb1b1374..b1573805 100644 --- a/ui/src/api/health.ts +++ b/ui/src/api/health.ts @@ -1,5 +1,6 @@ export type HealthStatus = { status: "ok"; + version?: string; deploymentMode?: "local_trusted" | "authenticated"; deploymentExposure?: "private" | "public"; authReady?: boolean; diff --git a/ui/src/components/Layout.tsx b/ui/src/components/Layout.tsx index e6aaf22a..66e61bd8 100644 --- a/ui/src/components/Layout.tsx +++ b/ui/src/components/Layout.tsx @@ -313,6 +313,9 @@ export function Layout() { Documentation + {health?.version && ( + v{health.version} + )}