From 8532426356d533831fd0d6436103fd2c59da6e31 Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 18:54:46 +0000 Subject: [PATCH 1/2] feat(telemetry): Report Junior package version Co-Authored-By: OpenAI o3 Co-Authored-By: immutable dcramer --- packages/junior/src/deployment.ts | 3 +++ packages/junior/tests/unit/instrumentation.test.ts | 2 ++ .../junior/tests/unit/logging/deployment-attributes.test.ts | 2 ++ 3 files changed, 7 insertions(+) diff --git a/packages/junior/src/deployment.ts b/packages/junior/src/deployment.ts index 3660f259a..d49719300 100644 --- a/packages/junior/src/deployment.ts +++ b/packages/junior/src/deployment.ts @@ -1,3 +1,5 @@ +import packageMetadata from "../package.json" with { type: "json" }; + 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"] = packageMetadata.version; if (serviceVersion) { attributes["service.version"] = serviceVersion; } diff --git a/packages/junior/tests/unit/instrumentation.test.ts b/packages/junior/tests/unit/instrumentation.test.ts index dab8df871..874a283a4 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 packageMetadata from "../../package.json" with { type: "json" }; 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": packageMetadata.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..b37d23851 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 packageMetadata from "../../../package.json" with { type: "json" }; 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": packageMetadata.version, "deployment.id": "dpl_123", "service.version": "git-sha", }); From 371706481809eebea4702211c6a0825471380abf Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 19:32:07 +0000 Subject: [PATCH 2/2] ref(telemetry): Export Junior version metadata Co-Authored-By: OpenAI o3 Co-Authored-By: immutable dcramer --- packages/junior/package.json | 4 ++++ packages/junior/src/app.ts | 1 + packages/junior/src/deployment.ts | 4 ++-- packages/junior/src/version.ts | 7 +++++++ packages/junior/tests/unit/instrumentation.test.ts | 4 ++-- .../tests/unit/logging/deployment-attributes.test.ts | 4 ++-- packages/junior/tsconfig.build.json | 1 + packages/junior/tsup.config.ts | 1 + 8 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 packages/junior/src/version.ts 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 d49719300..c7769be5b 100644 --- a/packages/junior/src/deployment.ts +++ b/packages/junior/src/deployment.ts @@ -1,4 +1,4 @@ -import packageMetadata from "../package.json" with { type: "json" }; +import { JUNIOR_VERSION } from "@/version"; export const JUNIOR_HEARTBEAT_ROUTE = "/api/internal/heartbeat"; export const JUNIOR_HEARTBEAT_CRON_SCHEDULE = "* * * * *"; @@ -30,7 +30,7 @@ export function getDeploymentTelemetryAttributes(): Record { const attributes: Record = {}; const serviceVersion = getDeploymentServiceVersion(); const deploymentId = toOptionalTrimmed(process.env.VERCEL_DEPLOYMENT_ID); - attributes["app.junior.version"] = packageMetadata.version; + 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 874a283a4..0d87ecb38 100644 --- a/packages/junior/tests/unit/instrumentation.test.ts +++ b/packages/junior/tests/unit/instrumentation.test.ts @@ -1,5 +1,5 @@ import { afterEach, describe, expect, it, vi } from "vitest"; -import packageMetadata from "../../package.json" with { type: "json" }; +import { JUNIOR_VERSION } from "@/version"; import { runWithConversationPrivacy } from "@/chat/conversation-privacy"; const ORIGINAL_SENTRY_DSN = process.env.SENTRY_DSN; @@ -115,7 +115,7 @@ describe("initSentry", () => { expect(globalScope.setAttributes).toHaveBeenCalledWith( expect.objectContaining({ - "app.junior.version": packageMetadata.version, + "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 b37d23851..091df526d 100644 --- a/packages/junior/tests/unit/logging/deployment-attributes.test.ts +++ b/packages/junior/tests/unit/logging/deployment-attributes.test.ts @@ -1,5 +1,5 @@ import { afterEach, describe, expect, it, vi } from "vitest"; -import packageMetadata from "../../../package.json" with { type: "json" }; +import { JUNIOR_VERSION } from "@/version"; import type { EmittedLogRecord } from "@/chat/logging"; const ORIGINAL_SENTRY_RELEASE = process.env.SENTRY_RELEASE; @@ -73,7 +73,7 @@ describe("deployment log attributes", () => { expect(records).toHaveLength(1); expect(records[0]?.attributes).toMatchObject({ - "app.junior.version": packageMetadata.version, + "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",