diff --git a/packages/junior/package.json b/packages/junior/package.json index bbc3aca7e..e55f60623 100644 --- a/packages/junior/package.json +++ b/packages/junior/package.json @@ -39,6 +39,10 @@ "./vercel": { "types": "./dist/vercel.d.ts", "default": "./dist/vercel.js" + }, + "./version": { + "types": "./dist/version.d.ts", + "default": "./dist/version.js" } }, "files": [ diff --git a/packages/junior/src/app.ts b/packages/junior/src/app.ts index 46307fb71..31e74c5fa 100644 --- a/packages/junior/src/app.ts +++ b/packages/junior/src/app.ts @@ -67,6 +67,7 @@ import { createAgentRunner } from "@/chat/runtime/agent-runner"; import type { WaitUntilFn } from "@/handlers/types"; export { defineJuniorPlugins } from "./plugins"; +export { JUNIOR_VERSION } from "./version"; export type { JuniorPluginInput, JuniorPluginSet, diff --git a/packages/junior/src/deployment.ts b/packages/junior/src/deployment.ts index 3660f259a..c7769be5b 100644 --- a/packages/junior/src/deployment.ts +++ b/packages/junior/src/deployment.ts @@ -1,3 +1,5 @@ +import { JUNIOR_VERSION } from "@/version"; + export const JUNIOR_HEARTBEAT_ROUTE = "/api/internal/heartbeat"; export const JUNIOR_HEARTBEAT_CRON_SCHEDULE = "* * * * *"; export const JUNIOR_RETENTION_ROUTE = "/api/internal/retention"; @@ -28,6 +30,7 @@ export function getDeploymentTelemetryAttributes(): Record { const attributes: Record = {}; const serviceVersion = getDeploymentServiceVersion(); const deploymentId = toOptionalTrimmed(process.env.VERCEL_DEPLOYMENT_ID); + attributes["app.junior.version"] = JUNIOR_VERSION; if (serviceVersion) { attributes["service.version"] = serviceVersion; } diff --git a/packages/junior/src/version.ts b/packages/junior/src/version.ts new file mode 100644 index 000000000..70f06f25e --- /dev/null +++ b/packages/junior/src/version.ts @@ -0,0 +1,7 @@ +import packageMetadata from "../package.json" with { type: "json" }; + +/** Installed Junior package version, or `unknown` when package metadata is unavailable. */ +export const JUNIOR_VERSION = + typeof packageMetadata.version === "string" && packageMetadata.version.trim() + ? packageMetadata.version + : "unknown"; diff --git a/packages/junior/tests/unit/instrumentation.test.ts b/packages/junior/tests/unit/instrumentation.test.ts index dab8df871..0d87ecb38 100644 --- a/packages/junior/tests/unit/instrumentation.test.ts +++ b/packages/junior/tests/unit/instrumentation.test.ts @@ -1,4 +1,5 @@ import { afterEach, describe, expect, it, vi } from "vitest"; +import { JUNIOR_VERSION } from "@/version"; import { runWithConversationPrivacy } from "@/chat/conversation-privacy"; const ORIGINAL_SENTRY_DSN = process.env.SENTRY_DSN; @@ -114,6 +115,7 @@ describe("initSentry", () => { expect(globalScope.setAttributes).toHaveBeenCalledWith( expect.objectContaining({ + "app.junior.version": JUNIOR_VERSION, "deployment.id": "dpl_123", "service.version": "git-sha", }), diff --git a/packages/junior/tests/unit/logging/deployment-attributes.test.ts b/packages/junior/tests/unit/logging/deployment-attributes.test.ts index 7002be868..091df526d 100644 --- a/packages/junior/tests/unit/logging/deployment-attributes.test.ts +++ b/packages/junior/tests/unit/logging/deployment-attributes.test.ts @@ -1,4 +1,5 @@ import { afterEach, describe, expect, it, vi } from "vitest"; +import { JUNIOR_VERSION } from "@/version"; import type { EmittedLogRecord } from "@/chat/logging"; const ORIGINAL_SENTRY_RELEASE = process.env.SENTRY_RELEASE; @@ -72,6 +73,7 @@ describe("deployment log attributes", () => { expect(records).toHaveLength(1); expect(records[0]?.attributes).toMatchObject({ + "app.junior.version": JUNIOR_VERSION, "deployment.id": "dpl_123", "service.version": "git-sha", }); diff --git a/packages/junior/tsconfig.build.json b/packages/junior/tsconfig.build.json index ca568009e..b94167f70 100644 --- a/packages/junior/tsconfig.build.json +++ b/packages/junior/tsconfig.build.json @@ -16,6 +16,7 @@ "src/nitro.ts", "src/reporting.ts", "src/vercel.ts", + "src/version.ts", "src/virtual-modules.d.ts" ] } diff --git a/packages/junior/tsup.config.ts b/packages/junior/tsup.config.ts index a1791cd3b..56630a8bf 100644 --- a/packages/junior/tsup.config.ts +++ b/packages/junior/tsup.config.ts @@ -17,6 +17,7 @@ export default defineConfig({ instrumentation: "src/instrumentation.ts", nitro: "src/nitro.ts", vercel: "src/vercel.ts", + version: "src/version.ts", }, format: "esm", tsconfig: "tsconfig.build.json",