diff --git a/docs/contributing/adding-tools.md b/docs/contributing/adding-tools.md index 1200ff85f..bfce2fd22 100644 --- a/docs/contributing/adding-tools.md +++ b/docs/contributing/adding-tools.md @@ -164,9 +164,9 @@ async handler(params, context: ServerContext) { ); } - // 3. Set organization telemetry for streamed spans and error events - // Import from ../../telem/organization. - setOrganizationContext(params.organizationSlug); + // 3. Set telemetry context for streamed spans and error events + // Import from ../../telem/scope. + setTargetTagsAndAttributes(params); // 4. Call API const data = await api.yourMethod(params); diff --git a/docs/operations/monitoring.md b/docs/operations/monitoring.md index 260813885..00215d644 100644 --- a/docs/operations/monitoring.md +++ b/docs/operations/monitoring.md @@ -44,12 +44,25 @@ export async function createTracedToolHandler( } ``` -### Organization Context - -Call `setOrganizationContext(slug)` from `src/telem/organization.ts` after -resolving the organization, including from URLs. It sets `organization.slug` -as a scope attribute for streamed spans, logs, and metrics, and as a tag for -errors. SDK v11 no longer copies scope tags onto spans. +### Request Context + +Call `setTargetTagsAndAttributes()` from `src/telem/scope.ts` after +resolving the organization, including from URLs. It sets the Sentry +resources that the tool call targets as scope attributes for streamed spans, +logs, and metrics, and as tags for errors. It requires `organizationSlug`. +All other `Target` fields are optional, such as `projectSlug`, `teamSlug`, +`issueId`, or `traceId`, so a tool can pass its `params` directly when they +use these names. A numeric `projectSlugOrId` becomes `project.id`, any other +value `project.slug`. To send a new kind of resource, add a field to +`Target` and its key to `targetKeys`. + +For other searchable values that are not a target, such as `client.id` or +`doc.path`, put the keys in one object and pass it to both `setTags` and +`setAttributes` from `@sentry/core`. SDK v11 no longer copies scope tags +onto spans, so do not call `setTag` alone. + +For values set at startup, put the same keys in both `initialScope.tags` and +`initialScope.attributes` of `Sentry.init`. ### Span Management diff --git a/packages/mcp-cloudflare/src/server/sentry.config.ts b/packages/mcp-cloudflare/src/server/sentry.config.ts index 19e7417ff..e2ae97b8f 100644 --- a/packages/mcp-cloudflare/src/server/sentry.config.ts +++ b/packages/mcp-cloudflare/src/server/sentry.config.ts @@ -1,21 +1,24 @@ -import * as Sentry from "@sentry/cloudflare"; import type { CloudflareOptions } from "@sentry/cloudflare"; +import * as Sentry from "@sentry/cloudflare"; import { sentryBeforeSend } from "@sentry/mcp-core/telem/sentry"; import { LIB_VERSION } from "@sentry/mcp-core/version"; import type { Env } from "./types"; export default function getSentryConfig(env: Env): CloudflareOptions { const versionId = env.CF_VERSION_METADATA?.id; + const scopeContext = { + "app.server.version": LIB_VERSION, + "app.upstream.host": env.SENTRY_HOST, + }; return { dsn: env.SENTRY_DSN, tracesSampleRate: 0.3, beforeSend: sentryBeforeSend, initialScope: { - tags: { - "app.server.version": LIB_VERSION, - "app.upstream.host": env.SENTRY_HOST, - }, + tags: scopeContext, + // SDK v11 does not copy scope tags onto streamed spans. + attributes: scopeContext, }, ...(versionId ? { release: versionId } : {}), environment: @@ -39,6 +42,10 @@ getSentryConfig.partial = (config: Partial) => { ...((defaultConfig.initialScope ?? {}) as any).tags, ...((config.initialScope ?? {}) as any).tags, }, + attributes: { + ...((defaultConfig.initialScope ?? {}) as any).attributes, + ...((config.initialScope ?? {}) as any).attributes, + }, }, }; }; diff --git a/packages/mcp-core/src/server.test.ts b/packages/mcp-core/src/server.test.ts index 3370d3a23..57c0cb4de 100644 --- a/packages/mcp-core/src/server.test.ts +++ b/packages/mcp-core/src/server.test.ts @@ -28,7 +28,9 @@ import { LIB_VERSION } from "./version"; // Mock the Sentry core module vi.mock("@sentry/core", () => ({ setTag: vi.fn(), + setTags: vi.fn(), setAttribute: vi.fn(), + setAttributes: vi.fn(), setUser: vi.fn(), getActiveSpan: vi.fn(), startSpan: vi.fn(), diff --git a/packages/mcp-core/src/server.ts b/packages/mcp-core/src/server.ts index 055362bc4..56c1e1be1 100644 --- a/packages/mcp-core/src/server.ts +++ b/packages/mcp-core/src/server.ts @@ -24,8 +24,9 @@ import { McpServer as ModernMcpServer } from "@modelcontextprotocol/server"; import { getActiveSpan, type SpanAttributeValue, - setTag, setUser, + setAttributes, + setTags, } from "@sentry/core"; import { wrapMcpServerWithSentry } from "@sentry/core/server"; import { isApiAuthenticationErrorDeep } from "./api-client"; @@ -301,16 +302,16 @@ function configureServer({ }; setUser(user); } - if (context.clientId) { - setTag("client.id", context.clientId); - } - if (context.clientFamily) { - setTag("app.client.family", context.clientFamily); - } - if (context.transport) { - setTag("app.transport", context.transport); - } - setTag("app.server.mode.experimental", experimentalMode); + const requestContext = { + ...(context.clientId ? { "client.id": context.clientId } : {}), + ...(context.clientFamily + ? { "app.client.family": context.clientFamily } + : {}), + ...(context.transport ? { "app.transport": context.transport } : {}), + "app.server.mode.experimental": experimentalMode, + }; + setTags(requestContext); + setAttributes(requestContext); // Hoisted so both the handler path and the catch (onError) share one // narrowing instead of re-casting `params`. diff --git a/packages/mcp-core/src/telem/organization.test.ts b/packages/mcp-core/src/telem/organization.test.ts deleted file mode 100644 index a777a6558..000000000 --- a/packages/mcp-core/src/telem/organization.test.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { Client } from "@modelcontextprotocol/sdk/client/index.js"; -import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js"; -import { - captureException, - type ErrorEvent, - getCurrentScope, - getIsolationScope, - type StreamedSpanJSON, - setCurrentClient, -} from "@sentry/core"; -import { ServerRuntimeClient } from "@sentry/core/server"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { buildServer } from "../server"; -import { getServerContext } from "../test-setup"; -import findProjects from "../tools/catalog/find-projects"; - -const beforeSendSpan = vi.fn((span: StreamedSpanJSON) => span); -const beforeSend = vi.fn((event: ErrorEvent) => event); -let sentry: ServerRuntimeClient; - -beforeEach(() => { - vi.clearAllMocks(); - getIsolationScope().setAttribute("organization.slug", undefined); - getIsolationScope().setTag("organization.slug", undefined); - sentry = new ServerRuntimeClient({ - dsn: "https://public@example.com/1", - integrations: [], - stackParser: () => [], - tracesSampleRate: 1, - transport: () => ({ - send: async () => ({ statusCode: 200 }), - flush: async () => true, - }), - beforeSendSpan, - beforeSend, - }); - setCurrentClient(sentry); - sentry.init(); -}); - -afterEach(async () => { - await sentry.close(); - getCurrentScope().setClient(undefined); - getIsolationScope().setAttribute("organization.slug", undefined); - getIsolationScope().setTag("organization.slug", undefined); -}); - -describe("organization telemetry", () => { - it.each([ - { - description: "explicit organization arguments", - name: "find_projects", - args: { organizationSlug: "sentry-mcp-evals" }, - constraints: {}, - }, - { - description: "session constraints", - name: "find_projects", - args: {}, - constraints: { organizationSlug: "sentry-mcp-evals" }, - }, - { - description: "URL-derived organizations through catalog execution", - name: "execute_sentry_tool", - args: { - name: "get_issue_breadcrumbs", - arguments: { - issueUrl: - "https://sentry-mcp-evals.sentry.io/issues/CLOUDFLARE-MCP-41/", - }, - }, - constraints: {}, - }, - ])( - "includes $description on streamed root spans", - async ({ name, args, constraints }) => { - const server = buildServer({ - context: getServerContext({ - constraints, - grantedSkills: new Set(["inspect"]), - }), - }); - const client = new Client({ name: "telemetry-test", version: "1.0.0" }); - const [clientTransport, serverTransport] = - InMemoryTransport.createLinkedPair(); - try { - await server.connect(serverTransport); - await client.connect(clientTransport); - const result = await client.callTool({ name, arguments: args }); - expect(result.isError).not.toBe(true); - } finally { - await client.close(); - await server.close(); - } - await sentry.flush(); - expect(beforeSendSpan).toHaveBeenCalledWith( - expect.objectContaining({ - is_segment: true, - attributes: expect.objectContaining({ - "organization.slug": "sentry-mcp-evals", - }), - }), - ); - }, - ); - - it("preserves organization tags on error events", async () => { - await findProjects.handler( - { - organizationSlug: "sentry-mcp-evals", - regionUrl: null, - query: null, - cursor: null, - }, - getServerContext(), - ); - captureException(new Error("organization telemetry regression")); - await sentry.flush(); - expect(beforeSend).toHaveBeenCalledWith( - expect.objectContaining({ - tags: expect.objectContaining({ - "organization.slug": "sentry-mcp-evals", - }), - }), - expect.anything(), - ); - }); -}); diff --git a/packages/mcp-core/src/telem/organization.ts b/packages/mcp-core/src/telem/organization.ts deleted file mode 100644 index 2cde4b448..000000000 --- a/packages/mcp-core/src/telem/organization.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { setAttribute, setTag } from "@sentry/core"; - -export function setOrganizationContext(organizationSlug: string): void { - // Streamed spans use scope attributes; errors still use scope tags. - setAttribute("organization.slug", organizationSlug); - setTag("organization.slug", organizationSlug); -} diff --git a/packages/mcp-core/src/telem/scope.test.ts b/packages/mcp-core/src/telem/scope.test.ts new file mode 100644 index 000000000..a26796599 --- /dev/null +++ b/packages/mcp-core/src/telem/scope.test.ts @@ -0,0 +1,272 @@ +import { Client } from "@modelcontextprotocol/sdk/client/index.js"; +import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js"; +import { + captureException, + type ErrorEvent, + getCurrentScope, + getIsolationScope, + type StreamedSpanJSON, + setCurrentClient, +} from "@sentry/core"; +import { ServerRuntimeClient } from "@sentry/core/server"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { buildServer } from "../server"; +import { getServerContext } from "../test-setup"; +import findProjects from "../tools/catalog/find-projects"; +import type { ServerContext } from "../types"; +import { type Target, setTargetTagsAndAttributes } from "./scope"; + +const beforeSendSpan = vi.fn((span: StreamedSpanJSON) => span); +const beforeSend = vi.fn((event: ErrorEvent) => event); +let sentry: ServerRuntimeClient; + +// Tag and attribute keys that the tests in this file set on the isolation scope. +const SCOPE_CONTEXT_KEYS = new Set([ + "organization.slug", + "project.slug", + "project.id", + "team.slug", + "issue.id", + "trace.id", + "trace.span_id", + "monitor.slug", + "uptime.monitor_id", + "release.version", + "replay.id", + "profile.id", + "profiler.id", + "ai_conversation.id", + "client.id", +]); + +// Without an async context strategy, withIsolationScope does not fork the +// isolation scope, so values set by one test stay there for the next one. +function resetScopeContext(): void { + const scope = getIsolationScope(); + for (const key of SCOPE_CONTEXT_KEYS) { + scope.setAttribute(key, undefined); + scope.setTag(key, undefined); + } +} + +beforeEach(() => { + vi.clearAllMocks(); + resetScopeContext(); + sentry = new ServerRuntimeClient({ + dsn: "https://public@example.com/1", + integrations: [], + stackParser: () => [], + tracesSampleRate: 1, + transport: () => ({ + send: async () => ({ statusCode: 200 }), + flush: async () => true, + }), + beforeSendSpan, + beforeSend, + }); + setCurrentClient(sentry); + sentry.init(); +}); + +afterEach(async () => { + await sentry.close(); + getCurrentScope().setClient(undefined); + resetScopeContext(); +}); + +async function callTool( + context: ServerContext, + name: string, + args: Record, +): Promise { + const server = buildServer({ context }); + const client = new Client({ name: "telemetry-test", version: "1.0.0" }); + const [clientTransport, serverTransport] = + InMemoryTransport.createLinkedPair(); + try { + await server.connect(serverTransport); + await client.connect(clientTransport); + const result = await client.callTool({ name, arguments: args }); + expect(result.isError).not.toBe(true); + } finally { + await client.close(); + await server.close(); + } + await sentry.flush(); +} + +describe("organization telemetry", () => { + it.each([ + { + description: "explicit organization arguments", + name: "find_projects", + args: { organizationSlug: "sentry-mcp-evals" }, + constraints: {}, + }, + { + description: "session constraints", + name: "find_projects", + args: {}, + constraints: { organizationSlug: "sentry-mcp-evals" }, + }, + { + description: "URL-derived organizations through catalog execution", + name: "execute_sentry_tool", + args: { + name: "get_issue_breadcrumbs", + arguments: { + issueUrl: + "https://sentry-mcp-evals.sentry.io/issues/CLOUDFLARE-MCP-41/", + }, + }, + constraints: {}, + }, + ])( + "includes $description on streamed root spans", + async ({ name, args, constraints }) => { + await callTool( + getServerContext({ + constraints, + grantedSkills: new Set(["inspect"]), + }), + name, + args, + ); + expect(beforeSendSpan).toHaveBeenCalledWith( + expect.objectContaining({ + is_segment: true, + attributes: expect.objectContaining({ + "organization.slug": "sentry-mcp-evals", + }), + }), + ); + }, + ); + + it("preserves organization tags on error events", async () => { + await findProjects.handler( + { + organizationSlug: "sentry-mcp-evals", + regionUrl: null, + query: null, + cursor: null, + }, + getServerContext(), + ); + captureException(new Error("organization telemetry regression")); + await sentry.flush(); + expect(beforeSend).toHaveBeenCalledWith( + expect.objectContaining({ + tags: expect.objectContaining({ + "organization.slug": "sentry-mcp-evals", + }), + }), + expect.anything(), + ); + }); +}); + +describe("request and tool telemetry", () => { + it("includes request and tool context on streamed root spans", async () => { + await callTool( + getServerContext({ + clientId: "telemetry-test-client", + grantedSkills: new Set(["inspect"]), + }), + "execute_sentry_tool", + { + name: "get_issue_breadcrumbs", + arguments: { + issueUrl: + "https://sentry-mcp-evals.sentry.io/issues/CLOUDFLARE-MCP-41/", + }, + }, + ); + expect(beforeSendSpan).toHaveBeenCalledWith( + expect.objectContaining({ + is_segment: true, + attributes: expect.objectContaining({ + "client.id": "telemetry-test-client", + "issue.id": "CLOUDFLARE-MCP-41", + }), + }), + ); + }); +}); + +describe("setTargetTagsAndAttributes", () => { + function scopeValuesFor(target: Target) { + setTargetTagsAndAttributes(target); + const { tags, attributes } = getIsolationScope().getScopeData(); + return { tags, attributes }; + } + + it("sets every target field as a tag and an attribute", () => { + const { tags, attributes } = scopeValuesFor({ + organizationSlug: "sentry", + projectSlug: "javascript", + projectId: 42, + teamSlug: "sdk", + issueId: "JAVASCRIPT-1", + traceId: "a".repeat(32), + spanId: "b".repeat(16), + monitorSlug: "nightly", + uptimeMonitorId: "7", + releaseVersion: "1.0.0", + replayId: "c".repeat(32), + profileId: "d".repeat(32), + profilerId: "e".repeat(32), + aiConversationId: "conversation-1", + }); + const expected = { + "organization.slug": "sentry", + "project.slug": "javascript", + "project.id": "42", + "team.slug": "sdk", + "issue.id": "JAVASCRIPT-1", + "trace.id": "a".repeat(32), + "trace.span_id": "b".repeat(16), + "monitor.slug": "nightly", + "uptime.monitor_id": "7", + "release.version": "1.0.0", + "replay.id": "c".repeat(32), + "profile.id": "d".repeat(32), + "profiler.id": "e".repeat(32), + "ai_conversation.id": "conversation-1", + }; + expect(tags).toMatchObject(expected); + expect(attributes).toMatchObject(expected); + }); + + it.each([ + { projectSlugOrId: "42", key: "project.id", other: "project.slug" }, + { projectSlugOrId: "javascript", key: "project.slug", other: "project.id" }, + ])( + "maps projectSlugOrId $projectSlugOrId to $key", + ({ projectSlugOrId, key, other }) => { + const { tags, attributes } = scopeValuesFor({ + organizationSlug: "sentry", + projectSlugOrId, + }); + expect(tags[key]).toBe(projectSlugOrId); + expect(attributes[key]).toBe(projectSlugOrId); + expect(tags[other]).toBeUndefined(); + expect(attributes[other]).toBeUndefined(); + }, + ); + + it("skips empty project and team values", () => { + const { tags, attributes } = scopeValuesFor({ + organizationSlug: "sentry", + projectSlug: null, + projectId: undefined, + projectSlugOrId: "", + teamSlug: null, + }); + for (const key of ["project.slug", "project.id", "team.slug"]) { + expect(tags[key]).toBeUndefined(); + expect(attributes[key]).toBeUndefined(); + } + expect(attributes["organization.slug"]).toBe("sentry"); + }); +}); diff --git a/packages/mcp-core/src/telem/scope.ts b/packages/mcp-core/src/telem/scope.ts new file mode 100644 index 000000000..77bff4a64 --- /dev/null +++ b/packages/mcp-core/src/telem/scope.ts @@ -0,0 +1,81 @@ +import { setAttribute, setTag } from "@sentry/core"; +import { isNumericId } from "../utils/slug-validation"; + +/** + * The Sentry resources that a tool call targets. Each field with a value is + * sent as a tag and an attribute, for example `issueId` as `issue.id`. + * `targetKeys` holds the key for each field. + */ +export interface Target { + organizationSlug: string; + projectSlug?: string | null; + /** Numeric project ID. */ + projectId?: string | number | null; + /** + * Project reference as the user gave it: a numeric value is sent as + * `project.id`, any other value as `project.slug`. + */ + projectSlugOrId?: string | null; + teamSlug?: string | null; + issueId?: string | null; + traceId?: string | null; + /** Span ID inside `traceId`. */ + spanId?: string | null; + monitorSlug?: string | null; + uptimeMonitorId?: string | null; + releaseVersion?: string | null; + replayId?: string | null; + profileId?: string | null; + profilerId?: string | null; + /** ID of the AI agent conversation that the tool reads. */ + aiConversationId?: string | null; +} + +const targetKeys = { + teamSlug: "team.slug", + issueId: "issue.id", + traceId: "trace.id", + spanId: "trace.span_id", + monitorSlug: "monitor.slug", + uptimeMonitorId: "uptime.monitor_id", + releaseVersion: "release.version", + replayId: "replay.id", + profileId: "profile.id", + profilerId: "profiler.id", + aiConversationId: "ai_conversation.id", +} as const satisfies Partial>; + +/** + * Sets `key` on the isolation scope as a tag for error events and as an + * attribute for streamed spans, logs, and metrics. SDK v11 does not copy + * scope tags onto spans. + */ +function setTagAndAttribute(key: string, value: string): void { + setAttribute(key, value); + setTag(key, value); +} + +/** + * Sets each `Target` field that has a value as a tag and as an attribute: + * `organization.slug`, `project.slug`, `project.id`, and the keys in + * `targetKeys`. Accepts tool `params` directly when they use these field + * names. + */ +export function setTargetTagsAndAttributes(target: Target): void { + const { organizationSlug, projectSlugOrId } = target; + const isProjectId = projectSlugOrId ? isNumericId(projectSlugOrId) : false; + const projectSlug = + target.projectSlug ?? (isProjectId ? undefined : projectSlugOrId); + const projectId = + target.projectId ?? (isProjectId ? projectSlugOrId : undefined); + + setTagAndAttribute("organization.slug", organizationSlug); + if (projectSlug) setTagAndAttribute("project.slug", projectSlug); + if (projectId != null && projectId !== "") { + setTagAndAttribute("project.id", String(projectId)); + } + for (const [field, key] of Object.entries(targetKeys)) { + const value = target[field as keyof typeof targetKeys]; + if (value) setTagAndAttribute(key, value); + } +} diff --git a/packages/mcp-core/src/tools/catalog/add-issue-note.ts b/packages/mcp-core/src/tools/catalog/add-issue-note.ts index 814d32d17..1a0403c69 100644 --- a/packages/mcp-core/src/tools/catalog/add-issue-note.ts +++ b/packages/mcp-core/src/tools/catalog/add-issue-note.ts @@ -1,20 +1,19 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { IssueComment } from "../../api-client/types"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ensureIssueWithinProjectConstraint, parseIssueParams, } from "../../internal/tool-helpers/issue"; -import type { IssueComment } from "../../api-client/types"; -import type { ServerContext } from "../../types"; import { ParamIssueShortId, ParamIssueUrl, ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { formatActor, formatDate, @@ -86,8 +85,10 @@ export default defineTool({ const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? context.constraints.regionUrl ?? undefined, }); - setOrganizationContext(parsed.organizationSlug); - setTag("issue.id", parsed.issueId); + setTargetTagsAndAttributes({ + organizationSlug: parsed.organizationSlug, + issueId: parsed.issueId, + }); await ensureIssueWithinProjectConstraint({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/add-team-to-project.ts b/packages/mcp-core/src/tools/catalog/add-team-to-project.ts index ba5f2d852..accfeec91 100644 --- a/packages/mcp-core/src/tools/catalog/add-team-to-project.ts +++ b/packages/mcp-core/src/tools/catalog/add-team-to-project.ts @@ -1,17 +1,16 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { Team } from "../../api-client/index"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import type { Team } from "../../api-client/index"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, ParamProjectSlug, ParamRegionUrl, ParamTeamSlug, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; const assignedTeamSchema = z.object({ id: z.string(), @@ -72,9 +71,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); - setTag("team.slug", params.teamSlug); + setTargetTagsAndAttributes(params); const currentTeams = await apiService.listProjectTeams({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts b/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts index cfa625159..20da93674 100644 --- a/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts +++ b/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts @@ -1,34 +1,34 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import { ApiError, ApiServerError } from "../../api-client/index"; +import { retryWithBackoff } from "../../internal/fetch-utils"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { - parseIssueParams, assertIssueWithinProjectConstraint, + parseIssueParams, } from "../../internal/tool-helpers/issue"; import { - getStatusDisplayName, - isTerminalStatus, + getActiveAutofixTodo, getHumanInterventionGuidance, getOutputForAutofixRun, - wrapSeerContent, - getActiveAutofixTodo, getSeerUnsupportedIssueMessage, + getStatusDisplayName, isSeerSupportedIssue, + isTerminalStatus, + SEER_INITIAL_RETRY_DELAY, + SEER_MAX_RETRIES, SEER_POLLING_INTERVAL, SEER_TIMEOUT, - SEER_MAX_RETRIES, - SEER_INITIAL_RETRY_DELAY, + wrapSeerContent, } from "../../internal/tool-helpers/seer"; -import { retryWithBackoff } from "../../internal/fetch-utils"; -import type { ServerContext } from "../../types"; -import { ApiError, ApiServerError } from "../../api-client/index"; import { - ParamOrganizationSlug, - ParamRegionUrl, ParamIssueShortId, ParamIssueUrl, + ParamOrganizationSlug, + ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; export default defineTool({ name: "analyze_issue_with_seer", @@ -102,7 +102,7 @@ export default defineTool({ issueUrl: params.issueUrl, }); - setOrganizationContext(orgSlug); + setTargetTagsAndAttributes({ organizationSlug: orgSlug }); const issue = await apiService.getIssue({ organizationSlug: orgSlug, diff --git a/packages/mcp-core/src/tools/catalog/create-alert-rule.ts b/packages/mcp-core/src/tools/catalog/create-alert-rule.ts index a5ce3c373..1501ede5b 100644 --- a/packages/mcp-core/src/tools/catalog/create-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/create-alert-rule.ts @@ -8,9 +8,8 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; -import { resolveAlertRuleConnections } from "../support/alert-rule-connections"; import { alertRuleConfigFields, alertRuleSummarySchema, @@ -19,6 +18,7 @@ import { ParamNewAlertTriggers, toAlertRuleSummary, } from "../support/alert-rule-config"; +import { resolveAlertRuleConnections } from "../support/alert-rule-connections"; export default defineTool({ name: "create_alert_rule", @@ -76,7 +76,7 @@ export default defineTool({ const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); + setTargetTagsAndAttributes(params); const project = context.constraints.projectSlug ? await api.getProject({ organizationSlug: params.organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/create-dsn.ts b/packages/mcp-core/src/tools/catalog/create-dsn.ts index 66d2ffa00..8606e2439 100644 --- a/packages/mcp-core/src/tools/catalog/create-dsn.ts +++ b/packages/mcp-core/src/tools/catalog/create-dsn.ts @@ -1,15 +1,14 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, - ParamRegionUrl, ParamProjectSlug, + ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; export const createDsnOutputSchema = z.object({ dsn: z.object({ @@ -68,8 +67,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); + setTargetTagsAndAttributes(params); const clientKey = await apiService.createClientKey({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts b/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts index 8f49e9e69..c7748fc5a 100644 --- a/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts @@ -1,4 +1,3 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; import type { Detector } from "../../api-client/types"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; @@ -9,7 +8,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { metricMonitorCreateFields, @@ -60,8 +59,7 @@ export default defineTool({ const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); - setTag("project.slug", params.projectSlug); + setTargetTagsAndAttributes(params); const { timeWindowSeconds, ...query } = params.query; const body = { type: "metric_issue" as const, diff --git a/packages/mcp-core/src/tools/catalog/create-project.ts b/packages/mcp-core/src/tools/catalog/create-project.ts index 08e84390f..520b0d257 100644 --- a/packages/mcp-core/src/tools/catalog/create-project.ts +++ b/packages/mcp-core/src/tools/catalog/create-project.ts @@ -1,19 +1,18 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import type { ClientKey, SentryApiService } from "../../api-client/index"; import { UserInputError } from "../../errors"; -import { logWarn } from "../../telem/logging"; -import type { ServerContext } from "../../types"; +import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, + ParamPlatform, ParamProjectSlug, ParamRegionUrl, ParamTeamSlug, - ParamPlatform, } from "../../schema"; -import type { ClientKey, SentryApiService } from "../../api-client/index"; +import { logWarn } from "../../telem/logging"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; type RepositoryMatch = { name: string; @@ -174,8 +173,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("team.slug", params.teamSlug); + setTargetTagsAndAttributes(params); // Resolve repository intent before creating the project so bad or ambiguous // repo input cannot leave behind an otherwise unwanted project. diff --git a/packages/mcp-core/src/tools/catalog/create-team.ts b/packages/mcp-core/src/tools/catalog/create-team.ts index be1843151..17de91822 100644 --- a/packages/mcp-core/src/tools/catalog/create-team.ts +++ b/packages/mcp-core/src/tools/catalog/create-team.ts @@ -1,10 +1,10 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; export const createTeamOutputSchema = z.object({ team: z.object({ @@ -56,7 +56,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const team = await apiService.createTeam({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts b/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts index 2ea9d821b..9d1394f25 100644 --- a/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts @@ -1,6 +1,4 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; @@ -9,6 +7,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; import { @@ -102,8 +101,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); + setTargetTagsAndAttributes(params); assertProjectRefWithinConstraint({ resourceLabel: "Uptime monitor", diff --git a/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts b/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts index 5c8d863f3..bf38c714f 100644 --- a/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts @@ -7,7 +7,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { validateAlertRuleProjectScope } from "../support/alert-rule-connections"; @@ -48,7 +48,7 @@ export default defineTool({ const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); + setTargetTagsAndAttributes(params); await validateAlertRuleProjectScope(api, { organizationSlug: params.organizationSlug, ruleId: params.ruleId, diff --git a/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts b/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts index 347a69f3f..9b829c96e 100644 --- a/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts @@ -2,7 +2,7 @@ import { z } from "zod"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { getMetricMonitor, @@ -32,7 +32,7 @@ export default defineTool({ const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); + setTargetTagsAndAttributes(params); await getMetricMonitor(api, { ...params, scopedProjectSlug: context.constraints.projectSlug, diff --git a/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts b/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts index d07489feb..1892ccb77 100644 --- a/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts @@ -1,6 +1,4 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; @@ -9,6 +7,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; @@ -55,9 +54,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); - setTag("uptime.monitor_id", params.uptimeMonitorId); + setTargetTagsAndAttributes(params); assertProjectRefWithinConstraint({ resourceLabel: "Uptime monitor", diff --git a/packages/mcp-core/src/tools/catalog/find-alert-rules.ts b/packages/mcp-core/src/tools/catalog/find-alert-rules.ts index 451ca743a..7d4d17ef1 100644 --- a/packages/mcp-core/src/tools/catalog/find-alert-rules.ts +++ b/packages/mcp-core/src/tools/catalog/find-alert-rules.ts @@ -1,4 +1,3 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; import type { IssueAlertRule } from "../../api-client/types"; import { UserInputError } from "../../errors"; @@ -10,7 +9,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { getMetricMonitorReference, @@ -174,10 +173,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - if (projectSlug) { - setTag("project.slug", projectSlug); - } + setTargetTagsAndAttributes({ organizationSlug, projectSlug }); const includeIssue = params.kind !== "metric"; const includeMetric = params.kind !== "issue"; diff --git a/packages/mcp-core/src/tools/catalog/find-dashboards.ts b/packages/mcp-core/src/tools/catalog/find-dashboards.ts index cf1b09ff7..1952730df 100644 --- a/packages/mcp-core/src/tools/catalog/find-dashboards.ts +++ b/packages/mcp-core/src/tools/catalog/find-dashboards.ts @@ -1,13 +1,12 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; import type { DashboardListItem, SentryApiService } from "../../api-client"; import { UserInputError } from "../../errors"; -import { defineTool } from "../../internal/tool-helpers/define"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { filterDashboardsByProjectConstraint, resolveDashboardProjectConstraint, @@ -285,7 +284,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const scopedProject = await resolveDashboardProjectConstraint({ apiService, @@ -293,8 +292,11 @@ export default defineTool({ scopedProjectSlug: context.constraints.projectSlug, }); if (scopedProject) { - setTag("project.slug", scopedProject.slug); - setTag("project.id", String(scopedProject.id)); + setTargetTagsAndAttributes({ + organizationSlug, + projectSlug: scopedProject.slug, + projectId: scopedProject.id, + }); } let dashboards: DashboardListItem[]; diff --git a/packages/mcp-core/src/tools/catalog/find-dsns.ts b/packages/mcp-core/src/tools/catalog/find-dsns.ts index 0855613f1..f9886986a 100644 --- a/packages/mcp-core/src/tools/catalog/find-dsns.ts +++ b/packages/mcp-core/src/tools/catalog/find-dsns.ts @@ -1,6 +1,4 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; @@ -9,6 +7,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; export const findDsnsOutputSchema = z.object({ @@ -53,8 +52,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); + setTargetTagsAndAttributes(params); const clientKeys = await apiService.listClientKeys({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts b/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts index 71e883560..6df392174 100644 --- a/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts +++ b/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts @@ -1,4 +1,3 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; @@ -8,7 +7,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { listMetricMonitors, @@ -68,8 +67,10 @@ export default defineTool({ }); } const projectSlug = context.constraints.projectSlug ?? requestedProject; - setOrganizationContext(params.organizationSlug); - if (projectSlug) setTag("project.slug", projectSlug); + setTargetTagsAndAttributes({ + organizationSlug: params.organizationSlug, + projectSlug, + }); const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); diff --git a/packages/mcp-core/src/tools/catalog/find-monitors.ts b/packages/mcp-core/src/tools/catalog/find-monitors.ts index a8706b47c..fcc88c217 100644 --- a/packages/mcp-core/src/tools/catalog/find-monitors.ts +++ b/packages/mcp-core/src/tools/catalog/find-monitors.ts @@ -1,16 +1,15 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { Monitor } from "../../api-client/types"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import type { Monitor } from "../../api-client/types"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; const ENVIRONMENT_LIMIT = 5; @@ -197,7 +196,6 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); const requestedProjectSlug = params.projectSlug && params.projectSlug !== "all" ? params.projectSlug @@ -210,9 +208,7 @@ export default defineTool({ }); } const projectSlug = context.constraints.projectSlug ?? requestedProjectSlug; - if (projectSlug) { - setTag("project.slug", projectSlug); - } + setTargetTagsAndAttributes({ organizationSlug, projectSlug }); const monitors = await apiService.listMonitors({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/find-projects.ts b/packages/mcp-core/src/tools/catalog/find-projects.ts index 5077a5646..e0d7cdb2f 100644 --- a/packages/mcp-core/src/tools/catalog/find-projects.ts +++ b/packages/mcp-core/src/tools/catalog/find-projects.ts @@ -10,7 +10,7 @@ import { ParamSearchQuery, } from "../../schema"; import { ALL_SKILLS } from "../../skills"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; const RESULT_LIMIT = 25; @@ -63,7 +63,7 @@ export default defineTool({ ); } - setOrganizationContext(organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const { projects, nextCursor } = await apiService.listProjects( organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/find-releases.ts b/packages/mcp-core/src/tools/catalog/find-releases.ts index 17fe37585..2f5c40b86 100644 --- a/packages/mcp-core/src/tools/catalog/find-releases.ts +++ b/packages/mcp-core/src/tools/catalog/find-releases.ts @@ -1,14 +1,14 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, - ParamRegionUrl, ParamProjectSlugOrAll, + ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; const RESULT_LIMIT = 25; @@ -98,7 +98,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const releases = await apiService.listReleases({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/find-teams.ts b/packages/mcp-core/src/tools/catalog/find-teams.ts index a7529910a..55dcea1c0 100644 --- a/packages/mcp-core/src/tools/catalog/find-teams.ts +++ b/packages/mcp-core/src/tools/catalog/find-teams.ts @@ -9,7 +9,7 @@ import { ParamRegionUrl, ParamSearchQuery, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; const RESULT_LIMIT = 25; @@ -63,7 +63,7 @@ export default defineTool({ ); } - setOrganizationContext(organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const { teams, nextCursor } = await apiService.listTeams(organizationSlug, { query: params.query ?? undefined, diff --git a/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts b/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts index 2e56c7740..61405b4a7 100644 --- a/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts +++ b/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts @@ -1,6 +1,4 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; @@ -9,6 +7,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; import { @@ -85,8 +84,6 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - const requestedProjectSlug = params.projectSlug && params.projectSlug !== "all" ? params.projectSlug @@ -99,9 +96,7 @@ export default defineTool({ }); } const projectSlug = context.constraints.projectSlug ?? requestedProjectSlug; - if (projectSlug) { - setTag("project.slug", projectSlug); - } + setTargetTagsAndAttributes({ organizationSlug, projectSlug }); const monitors = await apiService.listUptimeMonitors({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts b/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts index fbea74eab..601ba33c9 100644 --- a/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts @@ -2,14 +2,13 @@ // transcript projection and keeps detail output chronological and debugger // oriented instead of mirroring every raw span attribute. import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { AIConversationSpan, SentryApiService } from "../../api-client"; +import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; -import { UserInputError } from "../../errors"; -import type { AIConversationSpan, SentryApiService } from "../../api-client"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; type ToolCall = { @@ -704,8 +703,10 @@ export default defineTool({ outputSchema: aiConversationDetailsOutputSchema, async handler(params, context: ServerContext) { - setOrganizationContext(params.organizationSlug); - setTag("ai_conversation.id", params.conversationId); + setTargetTagsAndAttributes({ + organizationSlug: params.organizationSlug, + aiConversationId: params.conversationId, + }); if ((params.start && !params.end) || (!params.start && params.end)) { throw new UserInputError("`start` and `end` must be provided together."); diff --git a/packages/mcp-core/src/tools/catalog/get-alert-options.ts b/packages/mcp-core/src/tools/catalog/get-alert-options.ts index 352359ca9..9550dffeb 100644 --- a/packages/mcp-core/src/tools/catalog/get-alert-options.ts +++ b/packages/mcp-core/src/tools/catalog/get-alert-options.ts @@ -12,7 +12,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; @@ -145,7 +145,7 @@ export default defineTool({ const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const pageParams = { organizationSlug, cursor: params.cursor ?? undefined, diff --git a/packages/mcp-core/src/tools/catalog/get-alert-rule.ts b/packages/mcp-core/src/tools/catalog/get-alert-rule.ts index 7ce7aa348..039527f68 100644 --- a/packages/mcp-core/src/tools/catalog/get-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/get-alert-rule.ts @@ -1,4 +1,3 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; import type { Detector, IssueAlertRule } from "../../api-client/types"; import { UserInputError } from "../../errors"; @@ -10,7 +9,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { getAlertRuleDetails } from "../support/alert-rule-details"; import { @@ -106,10 +105,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - if (projectSlug) { - setTag("project.slug", projectSlug); - } + setTargetTagsAndAttributes({ organizationSlug, projectSlug }); let match: AlertRuleMatch; if (params.kind === "issue") { diff --git a/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts b/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts index fd446df99..febb61981 100644 --- a/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts @@ -1,15 +1,14 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; -import type { ServerContext } from "../../types"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { assertDashboardWithinProjectConstraint, formatDashboardDetails, - resolveDashboardProjectConstraint, resolveDashboardId, + resolveDashboardProjectConstraint, } from "../support/dashboards"; export default defineTool({ @@ -55,7 +54,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const scopedProject = await resolveDashboardProjectConstraint({ apiService, @@ -63,8 +62,11 @@ export default defineTool({ scopedProjectSlug: context.constraints.projectSlug, }); if (scopedProject) { - setTag("project.slug", scopedProject.slug); - setTag("project.id", String(scopedProject.id)); + setTargetTagsAndAttributes({ + organizationSlug, + projectSlug: scopedProject.slug, + projectId: scopedProject.id, + }); } const dashboardId = await resolveDashboardId({ diff --git a/packages/mcp-core/src/tools/catalog/get-doc.ts b/packages/mcp-core/src/tools/catalog/get-doc.ts index 3ab42227e..1108f7716 100644 --- a/packages/mcp-core/src/tools/catalog/get-doc.ts +++ b/packages/mcp-core/src/tools/catalog/get-doc.ts @@ -1,9 +1,9 @@ +import { setAttributes, setTags } from "@sentry/core"; import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { fetchWithTimeout } from "../../internal/fetch-utils"; -import { UserInputError } from "../../errors"; import { ApiError } from "../../api-client/index"; +import { UserInputError } from "../../errors"; +import { fetchWithTimeout } from "../../internal/fetch-utils"; +import { defineTool } from "../../internal/tool-helpers/define"; import type { ServerContext } from "../../types"; import { USER_AGENT } from "../../version"; @@ -47,7 +47,9 @@ export default defineTool({ openWorldHint: true, }, async handler(params, context: ServerContext) { - setTag("doc.path", params.path); + const docContext = { "doc.path": params.path }; + setTags(docContext); + setAttributes(docContext); let output = `# Documentation Content\n\n`; output += `**Path**: ${params.path}\n\n`; diff --git a/packages/mcp-core/src/tools/catalog/get-event-attachment.ts b/packages/mcp-core/src/tools/catalog/get-event-attachment.ts index 54aa226d3..dd124610a 100644 --- a/packages/mcp-core/src/tools/catalog/get-event-attachment.ts +++ b/packages/mcp-core/src/tools/catalog/get-event-attachment.ts @@ -3,7 +3,6 @@ import type { ImageContent, TextContent, } from "@modelcontextprotocol/sdk/types.js"; -import { setOrganizationContext } from "../../telem/organization"; import { DEFAULT_MAX_INLINE_ATTACHMENT_BYTES } from "../../api-client"; import { bytesToBase64 } from "../../internal/blob-utils"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; @@ -16,6 +15,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; function formatMegabytes(bytes: number): string { @@ -131,7 +131,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); + setTargetTagsAndAttributes(params); // If attachmentId is provided, download the specific attachment if (params.attachmentId) { diff --git a/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts b/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts index 9b55c713e..3f8f400e2 100644 --- a/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts +++ b/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts @@ -1,6 +1,4 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { ApiNotFoundError } from "../../api-client"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; @@ -12,6 +10,7 @@ import { ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { fetchAndFormatEventStacktrace } from "../support/event-stacktrace"; @@ -61,8 +60,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); - setTag("issue.id", params.issueId); + setTargetTagsAndAttributes(params); try { await ensureIssueWithinProjectConstraint({ diff --git a/packages/mcp-core/src/tools/catalog/get-issue-activity.ts b/packages/mcp-core/src/tools/catalog/get-issue-activity.ts index f9e3bfb76..5bf5fa503 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-activity.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-activity.ts @@ -1,22 +1,21 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { IssueActivity, IssueComment } from "../../api-client/types"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ensureIssueWithinProjectConstraint, parseIssueParams, } from "../../internal/tool-helpers/issue"; -import type { IssueActivity, IssueComment } from "../../api-client/types"; -import { isPlainObject } from "../../internal/type-guards"; import { formatAvailableToolCallInstruction } from "../../internal/tool-helpers/tool-call-formatting"; -import type { ServerContext } from "../../types"; +import { isPlainObject } from "../../internal/type-guards"; import { ParamIssueShortId, ParamIssueUrl, ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { formatActor, formatDate, @@ -95,8 +94,10 @@ export default defineTool({ const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? context.constraints.regionUrl ?? undefined, }); - setOrganizationContext(parsed.organizationSlug); - setTag("issue.id", parsed.issueId); + setTargetTagsAndAttributes({ + organizationSlug: parsed.organizationSlug, + issueId: parsed.issueId, + }); await ensureIssueWithinProjectConstraint({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts b/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts index 74155cfac..351a80a29 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts @@ -1,5 +1,3 @@ -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; import { ApiNotFoundError } from "../../api-client"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { fetchAndFormatBreadcrumbs } from "../../internal/tool-helpers/breadcrumbs"; @@ -16,6 +14,7 @@ import { ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; export default defineTool({ @@ -61,8 +60,10 @@ export default defineTool({ regionUrl: params.regionUrl ?? context.constraints.regionUrl ?? undefined, }); - setOrganizationContext(parsed.organizationSlug); - setTag("issue.id", parsed.issueId); + setTargetTagsAndAttributes({ + organizationSlug: parsed.organizationSlug, + issueId: parsed.issueId, + }); try { await ensureIssueWithinProjectConstraint({ diff --git a/packages/mcp-core/src/tools/catalog/get-issue-details.ts b/packages/mcp-core/src/tools/catalog/get-issue-details.ts index c372b3cf4..76674722a 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-details.ts @@ -1,5 +1,4 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import type { SentryApiService } from "../../api-client"; import { ApiClientError, ApiNotFoundError } from "../../api-client"; import type { @@ -15,28 +14,28 @@ import type { } from "../../api-client/types"; import { ConfigurationError, UserInputError } from "../../errors"; import type { CodeLocation } from "../../internal/code-location"; -import type { AIConversationReference } from "../../internal/tool-helpers/ai-conversation-actions"; -import { apiServiceFromContext } from "../../internal/tool-helpers/api"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { enhanceNotFoundError } from "../../internal/tool-helpers/enhance-error"; -import { structuredResult } from "../../internal/tool-helpers/results"; import { dedupeReplayIds, getReplayIdFromEvent, - isPerformanceIssueType, getSeerActionabilityLabel, getSuspectCommit, + isPerformanceIssueType, usesSharedFormatterBody, } from "../../internal/formatting"; -import { - getAutofixArtifactSummaries, - getStatusDisplayName, -} from "../../internal/tool-helpers/seer"; +import type { AIConversationReference } from "../../internal/tool-helpers/ai-conversation-actions"; +import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; +import { enhanceNotFoundError } from "../../internal/tool-helpers/enhance-error"; import { assertIssueWithinProjectConstraint, formatIssueOutput, parseIssueParams, } from "../../internal/tool-helpers/issue"; +import { structuredResult } from "../../internal/tool-helpers/results"; +import { + getAutofixArtifactSummaries, + getStatusDisplayName, +} from "../../internal/tool-helpers/seer"; import { ParamEventId, ParamIssueShortId, @@ -45,6 +44,7 @@ import { ParamRegionUrl, } from "../../schema"; import { logError, logIssue } from "../../telem/logging"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { resolveCodeLocation } from "../support/code-location"; @@ -390,7 +390,7 @@ export default defineTool({ ); } - setOrganizationContext(orgSlug); + setTargetTagsAndAttributes({ organizationSlug: orgSlug }); // Use issueId directly if provided (e.g., from URL parsing), otherwise search by eventId let issue: Awaited>; if (params.issueId) { @@ -510,7 +510,7 @@ export default defineTool({ issueUrl: params.issueUrl, }); - setOrganizationContext(orgSlug); + setTargetTagsAndAttributes({ organizationSlug: orgSlug }); // For the main issue lookup, provide parameter context on 404 let issue: Awaited>; diff --git a/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts b/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts index 6ea41e9bc..d693eebcf 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts @@ -1,22 +1,22 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import { ApiNotFoundError } from "../../api-client"; +import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; -import { structuredResult } from "../../internal/tool-helpers/results"; +import { defineTool } from "../../internal/tool-helpers/define"; +import { enhanceNotFoundError } from "../../internal/tool-helpers/enhance-error"; import { ensureIssueWithinProjectConstraint, parseIssueParams, } from "../../internal/tool-helpers/issue"; -import { enhanceNotFoundError } from "../../internal/tool-helpers/enhance-error"; -import { ApiNotFoundError } from "../../api-client"; -import { UserInputError } from "../../errors"; -import type { ServerContext } from "../../types"; +import { structuredResult } from "../../internal/tool-helpers/results"; import { - ParamOrganizationSlug, - ParamRegionUrl, ParamIssueShortId, ParamIssueUrl, + ParamOrganizationSlug, + ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; export const getIssueTagValuesOutputSchema = z.object({ tag: z.object({ @@ -133,7 +133,7 @@ export default defineTool({ issueUrl: params.issueUrl, }); - setOrganizationContext(orgSlug); + setTargetTagsAndAttributes({ organizationSlug: orgSlug }); await ensureIssueWithinProjectConstraint({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts b/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts index 0921d08c9..82e9d1ef6 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts @@ -1,20 +1,19 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { UserReportList } from "../../api-client/types"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ensureIssueWithinProjectConstraint, parseIssueParams, } from "../../internal/tool-helpers/issue"; -import type { UserReportList } from "../../api-client/types"; -import type { ServerContext } from "../../types"; import { ParamIssueShortId, ParamIssueUrl, ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { formatDate } from "./support/api-formatting"; function getReporter(report: UserReportList[number]): string { @@ -98,8 +97,10 @@ export default defineTool({ const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? context.constraints.regionUrl ?? undefined, }); - setOrganizationContext(parsed.organizationSlug); - setTag("issue.id", parsed.issueId); + setTargetTagsAndAttributes({ + organizationSlug: parsed.organizationSlug, + issueId: parsed.issueId, + }); await ensureIssueWithinProjectConstraint({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts b/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts index 19b02d7db..4f6a5c669 100644 --- a/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts +++ b/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts @@ -1,10 +1,9 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; -import type { ServerContext } from "../../types"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { isNumericId } from "../../utils/slug-validation"; import { renderSnapshotImageTreeSection } from "../support/snapshots/formatting"; @@ -77,8 +76,6 @@ export default defineTool({ openWorldHint: true, }, async handler(params, context: ServerContext) { - setOrganizationContext(params.organizationSlug); - const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); @@ -86,8 +83,11 @@ export default defineTool({ const project = params.project ?? undefined; const projectId = project && isNumericId(project) ? project : undefined; const projectSlug = project && !isNumericId(project) ? project : undefined; - if (projectId) setTag("project.id", projectId); - if (projectSlug) setTag("project.slug", projectSlug); + setTargetTagsAndAttributes({ + organizationSlug: params.organizationSlug, + projectId, + projectSlug, + }); const data = (await apiService.getLatestBaseSnapshot({ organizationSlug: params.organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts b/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts index 2bf09f1ed..32a7886f7 100644 --- a/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts @@ -1,9 +1,8 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { getMetricMonitor, @@ -36,8 +35,10 @@ export default defineTool({ }, async handler(params, context: ServerContext) { const projectSlug = context.constraints.projectSlug ?? params.projectSlug; - setOrganizationContext(params.organizationSlug); - if (projectSlug) setTag("project.slug", projectSlug); + setTargetTagsAndAttributes({ + organizationSlug: params.organizationSlug, + projectSlug, + }); const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); diff --git a/packages/mcp-core/src/tools/catalog/get-monitor-details.ts b/packages/mcp-core/src/tools/catalog/get-monitor-details.ts index 486e4197b..c3b008acb 100644 --- a/packages/mcp-core/src/tools/catalog/get-monitor-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-monitor-details.ts @@ -1,20 +1,19 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { apiServiceFromContext } from "../../internal/tool-helpers/api"; -import { UserInputError } from "../../errors"; import type { Monitor, MonitorCheckIn, MonitorStat, } from "../../api-client/types"; -import type { ServerContext } from "../../types"; +import { UserInputError } from "../../errors"; +import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamPeriod, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { isNumericId, validateSlugOrId } from "../../utils/slug-validation"; import { compactLines, @@ -162,18 +161,14 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("monitor.slug", params.monitorSlug); const requestedProjectSlugOrId = params.projectSlugOrId ?? undefined; const projectSlugOrId = requestedProjectSlugOrId ?? context.constraints.projectSlug ?? null; - if (projectSlugOrId) { - if (isNumericId(projectSlugOrId)) { - setTag("project.id", projectSlugOrId); - } else { - setTag("project.slug", projectSlugOrId); - } - } + setTargetTagsAndAttributes({ + organizationSlug, + projectSlugOrId, + monitorSlug: params.monitorSlug, + }); if (requestedProjectSlugOrId && !isNumericId(requestedProjectSlugOrId)) { assertProjectRefWithinConstraint({ resourceLabel: "Monitor", diff --git a/packages/mcp-core/src/tools/catalog/get-profile-details.ts b/packages/mcp-core/src/tools/catalog/get-profile-details.ts index f5de2cf27..fc93060d5 100644 --- a/packages/mcp-core/src/tools/catalog/get-profile-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-profile-details.ts @@ -1,22 +1,21 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { resolveRegionUrlForOrganization } from "../../internal/tool-helpers/resolve-region-url"; -import { UserInputError } from "../../errors"; -import type { ServerContext } from "../../types"; +import { isProfileUrl, parseSentryUrl } from "../../internal/url-helpers"; +import { + resolveScopedOrganizationSlug, + resolveScopedProjectSlugOrId, +} from "../../internal/url-scope"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { isNumericId, validateResourceId, validateSlugOrId, } from "../../utils/slug-validation"; -import { parseSentryUrl, isProfileUrl } from "../../internal/url-helpers"; -import { - resolveScopedOrganizationSlug, - resolveScopedProjectSlugOrId, -} from "../../internal/url-scope"; import { formatProfileChunkAnalysis, formatTransactionProfileAnalysis, @@ -303,10 +302,13 @@ export default defineTool({ regionUrl: regionUrl ?? undefined, }); - setOrganizationContext(resolved.organizationSlug); + setTargetTagsAndAttributes({ organizationSlug: resolved.organizationSlug }); if (resolved.mode === "transaction") { - setTag("profile.id", resolved.profileId); + setTargetTagsAndAttributes({ + organizationSlug: resolved.organizationSlug, + profileId: resolved.profileId, + }); const isNumericProjectInput = typeof resolved.projectSlugOrId === "number" || isNumericId(String(resolved.projectSlugOrId)); @@ -337,7 +339,10 @@ export default defineTool({ }); } - setTag("project.slug", projectSlug); + setTargetTagsAndAttributes({ + organizationSlug: resolved.organizationSlug, + projectSlug, + }); const profileUrl = params.profileUrl ?? @@ -362,7 +367,10 @@ export default defineTool({ }); } - setTag("profiler.id", resolved.profilerId); + setTargetTagsAndAttributes({ + organizationSlug: resolved.organizationSlug, + profilerId: resolved.profilerId, + }); const { projectId, projectSlug } = await resolveProjectContext( apiService, @@ -371,8 +379,11 @@ export default defineTool({ { requireNumericId: true }, ); - setTag("project.slug", projectSlug); - setTag("project.id", String(projectId)); + setTargetTagsAndAttributes({ + organizationSlug: resolved.organizationSlug, + projectSlug, + projectId, + }); const chunk = await apiService.getProfileChunk({ organizationSlug: resolved.organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/get-profile.ts b/packages/mcp-core/src/tools/catalog/get-profile.ts index b287a33e8..1f17cb5c1 100644 --- a/packages/mcp-core/src/tools/catalog/get-profile.ts +++ b/packages/mcp-core/src/tools/catalog/get-profile.ts @@ -1,26 +1,26 @@ -import { setTag } from "@sentry/core"; +import { setAttributes, setTags } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { UserInputError } from "../../errors"; -import type { ServerContext } from "../../types"; +import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; +import { isProfileUrl, parseSentryUrl } from "../../internal/url-helpers"; +import { + resolveScopedOrganizationSlug, + resolveScopedProjectSlugOrId, +} from "../../internal/url-scope"; import { ParamOrganizationSlug, ParamPeriod, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { isNumericId, validateSlugOrId } from "../../utils/slug-validation"; +import { hasProfileData } from "../support/profile/analyzer"; import { formatFlamegraphAnalysis, formatFlamegraphComparison, } from "../support/profile/formatter"; -import { hasProfileData } from "../support/profile/analyzer"; -import { parseSentryUrl, isProfileUrl } from "../../internal/url-helpers"; -import { - resolveScopedOrganizationSlug, - resolveScopedProjectSlugOrId, -} from "../../internal/url-scope"; interface ResolvedProfileParams { organizationSlug: string; @@ -228,7 +228,6 @@ export default defineTool({ isNumericId(String(projectSlugOrId)) ) { projectId = projectSlugOrId; - setTag("project.id", String(projectSlugOrId)); } else { // It's a slug, resolve to ID const project = await apiService.getProject({ @@ -236,18 +235,27 @@ export default defineTool({ projectSlugOrId: String(projectSlugOrId), }); projectId = project.id; - setTag("project.slug", String(projectSlugOrId)); - setTag("project.id", String(project.id)); } - setOrganizationContext(organizationSlug); - setTag("transaction.name", transactionName); + setTargetTagsAndAttributes({ + organizationSlug, + projectSlugOrId: String(projectSlugOrId), + projectId, + }); + const profileContext = { + "transaction.name": transactionName, + ...(params.compareAgainstPeriod + ? { + "baseline.period": params.compareAgainstPeriod, + "current.period": params.period, + } + : {}), + }; + setTags(profileContext); + setAttributes(profileContext); // Comparison mode: compare two time periods if (params.compareAgainstPeriod) { - setTag("baseline.period", params.compareAgainstPeriod); - setTag("current.period", params.period); - // Fetch both flamegraphs in parallel const [baselineFlamegraph, currentFlamegraph] = await Promise.all([ apiService.getFlamegraph({ diff --git a/packages/mcp-core/src/tools/catalog/get-release-details.ts b/packages/mcp-core/src/tools/catalog/get-release-details.ts index 14aff487c..8b8c36d49 100644 --- a/packages/mcp-core/src/tools/catalog/get-release-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-release-details.ts @@ -1,13 +1,12 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { apiServiceFromContext } from "../../internal/tool-helpers/api"; -import { UserInputError } from "../../errors"; import type { Commit, Deploy, ReleaseDetails } from "../../api-client/types"; -import type { ServerContext } from "../../types"; +import { UserInputError } from "../../errors"; +import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; -import { validateSlugOrId, isNumericId } from "../../utils/slug-validation"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; +import { validateSlugOrId } from "../../utils/slug-validation"; import { compactLines, formatActor, @@ -141,19 +140,14 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("release.version", params.releaseVersion); const scopedProjectSlug = context.constraints.projectSlug ?? undefined; const requestedProjectSlugOrId = params.projectSlugOrId ?? undefined; const projectSlugOrId = scopedProjectSlug ?? requestedProjectSlugOrId; - - if (projectSlugOrId) { - if (isNumericId(projectSlugOrId)) { - setTag("project.id", projectSlugOrId); - } else { - setTag("project.slug", projectSlugOrId); - } - } + setTargetTagsAndAttributes({ + organizationSlug, + projectSlugOrId, + releaseVersion: params.releaseVersion, + }); if ( scopedProjectSlug && diff --git a/packages/mcp-core/src/tools/catalog/get-replay-details.ts b/packages/mcp-core/src/tools/catalog/get-replay-details.ts index 1df649abd..e1a29bbd2 100644 --- a/packages/mcp-core/src/tools/catalog/get-replay-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-replay-details.ts @@ -1,5 +1,3 @@ -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; import type { Issue, ReplayDetails, @@ -8,19 +6,20 @@ import type { SentryApiService, TraceMeta, } from "../../api-client"; -import { defineTool } from "../../internal/tool-helpers/define"; +import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { resolveRegionUrlForOrganization } from "../../internal/tool-helpers/resolve-region-url"; import { parseSentryUrl } from "../../internal/url-helpers"; import { resolveScopedOrganizationSlug } from "../../internal/url-scope"; -import { UserInputError } from "../../errors"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, - ParamReplayId, ParamRegionUrl, + ParamReplayId, ParamReplayUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; interface ResolvedReplayParams { organizationSlug: string; @@ -98,8 +97,10 @@ export default defineTool({ regionUrl: regionUrl ?? undefined, }); - setOrganizationContext(resolved.organizationSlug); - setTag("replay.id", resolved.replayId); + setTargetTagsAndAttributes({ + organizationSlug: resolved.organizationSlug, + replayId: resolved.replayId, + }); const replay = await apiService.getReplayDetails({ organizationSlug: resolved.organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts b/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts index de0c8344c..d7fdd2008 100644 --- a/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts +++ b/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts @@ -1,6 +1,5 @@ -import { getActiveSpan, setTag } from "@sentry/core"; +import { getActiveSpan, setAttributes, setTags } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import type { SentryApiService } from "../../api-client"; import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; @@ -15,6 +14,7 @@ import { resolveScopedProjectSlug, } from "../../internal/url-scope"; import { ParamOrganizationSlug } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { isNumericId } from "../../utils/slug-validation"; import getAIConversationDetails from "./get-agent-conversation-details"; @@ -528,11 +528,13 @@ export default defineTool({ projectSlug: context.constraints.projectSlug, }); - setTag("resource.type", resolved.type); - setOrganizationContext(resolved.organizationSlug); - if (resolved.spanId) { - setTag("trace.span_id", resolved.spanId); - } + const resourceContext = { "resource.type": resolved.type }; + setTags(resourceContext); + setAttributes(resourceContext); + setTargetTagsAndAttributes({ + organizationSlug: resolved.organizationSlug, + spanId: resolved.spanId, + }); getActiveSpan()?.setAttribute("app.resource.type", resolved.type); diff --git a/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts b/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts index f56995e99..56fcd0df4 100644 --- a/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts +++ b/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts @@ -1,9 +1,9 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { fetchSnapshotImage } from "../support/snapshots/handlers"; @@ -74,7 +74,7 @@ export default defineTool({ ); } - setOrganizationContext(params.organizationSlug); + setTargetTagsAndAttributes(params); const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, diff --git a/packages/mcp-core/src/tools/catalog/get-snapshot.ts b/packages/mcp-core/src/tools/catalog/get-snapshot.ts index 1978f609c..83aec7136 100644 --- a/packages/mcp-core/src/tools/catalog/get-snapshot.ts +++ b/packages/mcp-core/src/tools/catalog/get-snapshot.ts @@ -1,10 +1,10 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { formatToolCallInstruction } from "../../internal/tool-helpers/tool-call-formatting"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { fetchSnapshotSummary } from "../support/snapshots/handlers"; @@ -91,7 +91,7 @@ export default defineTool({ ); } - setOrganizationContext(params.organizationSlug); + setTargetTagsAndAttributes(params); const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, diff --git a/packages/mcp-core/src/tools/catalog/get-trace-details.ts b/packages/mcp-core/src/tools/catalog/get-trace-details.ts index c1debf7c1..ba2758b10 100644 --- a/packages/mcp-core/src/tools/catalog/get-trace-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-trace-details.ts @@ -1,5 +1,3 @@ -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; import type { SentryApiService, Trace, TraceSpan } from "../../api-client"; import { UserInputError } from "../../errors"; import { hasAgentProvider } from "../../internal/agents/provider-factory"; @@ -17,6 +15,7 @@ import { ParamSpanId, ParamTraceId, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { formatSemanticSpanDisplay } from "../support/traces/semantic-display.js"; @@ -131,15 +130,12 @@ export default defineTool({ regionUrl: regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); - setTag("trace.id", params.traceId); - if (params.spanId) { - setTag("trace.span_id", params.spanId); - } - - if (context.constraints.projectSlug) { - setTag("project.slug", context.constraints.projectSlug); - } + setTargetTagsAndAttributes({ + organizationSlug: params.organizationSlug, + projectSlug: context.constraints.projectSlug, + traceId: params.traceId, + spanId: params.spanId, + }); // Get trace metadata for overview const traceMeta = await apiService.getTraceMeta({ diff --git a/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts b/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts index fe32bdd62..d1a06cdea 100644 --- a/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts @@ -1,6 +1,4 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; @@ -10,6 +8,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { compactLines, formatDate } from "./support/api-formatting"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; @@ -122,9 +121,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); - setTag("uptime.monitor_id", params.uptimeMonitorId); + setTargetTagsAndAttributes(params); assertProjectRefWithinConstraint({ resourceLabel: "Uptime monitor", diff --git a/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts b/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts index bda63513a..c5c152868 100644 --- a/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts +++ b/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts @@ -1,8 +1,7 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { - AgenticOnboardingRunTokenSchema, AgenticOnboardingRunStatusUpdateSchema, + AgenticOnboardingRunTokenSchema, AgenticOnboardingStageSchema, AgenticOnboardingStageStatusUpdateSchema, AgenticOnboardingStatusUpdateSchema, @@ -11,6 +10,7 @@ import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; import { ALL_SKILLS } from "../../skills"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; const updateBaseSchema = z @@ -130,7 +130,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? context.constraints.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); + setTargetTagsAndAttributes(params); const update = AgenticOnboardingStatusUpdateSchema.parse({ schemaVersion: 1, diff --git a/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts b/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts index f9a895fb7..59fc94b39 100644 --- a/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts +++ b/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts @@ -1,18 +1,17 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { Team } from "../../api-client/index"; +import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import { UserInputError } from "../../errors"; -import type { Team } from "../../api-client/index"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, ParamProjectSlug, ParamRegionUrl, ParamTeamSlug, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; const assignedTeamSchema = z.object({ id: z.string(), @@ -74,9 +73,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); - setTag("team.slug", params.teamSlug); + setTargetTagsAndAttributes(params); const currentTeams = await apiService.listProjectTeams({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts b/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts index 67799199b..87994cfd7 100644 --- a/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts +++ b/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts @@ -2,20 +2,20 @@ // Sentry's conversation list endpoint and intentionally exposes backend default // ordering until alternate sorting is applied by the API. import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { AIConversationSummary, SentryApiService } from "../../api-client"; +import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; +import { structuredResult } from "../../internal/tool-helpers/results"; import { ParamOrganizationSlug, ParamPeriod, - ParamRegionUrl, ParamProjectSlug, + ParamRegionUrl, } from "../../schema"; -import { UserInputError } from "../../errors"; -import { structuredResult } from "../../internal/tool-helpers/results"; -import { isNumericId } from "../../utils/slug-validation"; -import type { AIConversationSummary, SentryApiService } from "../../api-client"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; +import { isNumericId } from "../../utils/slug-validation"; const PREVIEW_LENGTH = 240; const TRACE_ID_SAMPLE_SIZE = 3; @@ -270,7 +270,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const projectIds = await resolveProjectIds({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/search-issue-events.ts b/packages/mcp-core/src/tools/catalog/search-issue-events.ts index 5c997135a..1bba0b92e 100644 --- a/packages/mcp-core/src/tools/catalog/search-issue-events.ts +++ b/packages/mcp-core/src/tools/catalog/search-issue-events.ts @@ -1,21 +1,21 @@ +import { getActiveSpan } from "@sentry/core"; import { z } from "zod"; -import { getActiveSpan, setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import { UserInputError } from "../../errors"; +import { hasAgentProvider } from "../../internal/agents/provider-factory"; +import { withProviderFallback } from "../../internal/agents/provider-fallback"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ensureIssueWithinProjectConstraint } from "../../internal/tool-helpers/issue"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, ParamPeriod, - ParamRegionUrl, ParamProjectSlug, + ParamRegionUrl, } from "../../schema"; -import { hasAgentProvider } from "../../internal/agents/provider-factory"; -import { withProviderFallback } from "../../internal/agents/provider-fallback"; -import { UserInputError } from "../../errors"; -import { searchIssueEventsAgent } from "../support/search-issue-events/agent"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { formatErrorResults } from "../support/search-events/formatters"; +import { searchIssueEventsAgent } from "../support/search-issue-events/agent"; import { RECOMMENDED_FIELDS } from "../support/search-issue-events/config"; import { parseIssueParams } from "../support/search-issue-events/utils"; @@ -143,11 +143,11 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(organizationSlug); - setTag("issue.id", issueId); - if (params.projectSlug) { - setTag("project.slug", params.projectSlug); - } + setTargetTagsAndAttributes({ + organizationSlug, + projectSlug: params.projectSlug, + issueId, + }); await ensureIssueWithinProjectConstraint({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/search-issues.ts b/packages/mcp-core/src/tools/catalog/search-issues.ts index e158502f2..e89249ae2 100644 --- a/packages/mcp-core/src/tools/catalog/search-issues.ts +++ b/packages/mcp-core/src/tools/catalog/search-issues.ts @@ -1,18 +1,18 @@ -import { getActiveSpan, setTag } from "@sentry/core"; +import { getActiveSpan } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { SEARCH_ISSUES_PERIOD_VALUES } from "../../constants"; import { hasAgentProvider } from "../../internal/agents/provider-factory"; import { withProviderFallback } from "../../internal/agents/provider-fallback"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { isNumericId, validateSlugOrId } from "../../utils/slug-validation"; import { searchIssuesAgent } from "../support/search-issues/agent"; import { - formatIssueResults, formatExplanation, + formatIssueResults, } from "../support/search-issues/formatters"; const ProjectSlugOrIdSchema = z.string().trim().superRefine(validateSlugOrId); @@ -120,14 +120,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); - if (params.projectSlugOrId) { - if (isNumericId(params.projectSlugOrId)) { - setTag("project.id", params.projectSlugOrId); - } else { - setTag("project.slug", params.projectSlugOrId); - } - } + setTargetTagsAndAttributes(params); let query: string; let sort: "date" | "freq" | "new" | "user" | "recommended"; diff --git a/packages/mcp-core/src/tools/catalog/update-alert-rule.ts b/packages/mcp-core/src/tools/catalog/update-alert-rule.ts index a9cae11cc..0d1395ad5 100644 --- a/packages/mcp-core/src/tools/catalog/update-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/update-alert-rule.ts @@ -1,4 +1,3 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; import type { AlertRuleUpdate, IssueAlertRule } from "../../api-client/types"; import { UserInputError } from "../../errors"; @@ -6,25 +5,25 @@ import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; import { isPlainObject } from "../../internal/type-guards"; -import { setOrganizationContext } from "../../telem/organization"; import { ParamOrganizationSlug, ParamProjectSlug, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { - resolveAlertRuleConnections, - validateAlertRuleProjectScope, -} from "../support/alert-rule-connections"; -import { - alertRuleSummarySchema, alertRuleConfigFields, + alertRuleSummarySchema, assertResolvedAlertDestinations, ParamAlertActionFilters, ParamAlertTriggers, toAlertRuleSummary, } from "../support/alert-rule-config"; +import { + resolveAlertRuleConnections, + validateAlertRuleProjectScope, +} from "../support/alert-rule-connections"; import { findExactIssueAlertRuleMatches, isNumericAlertRuleId, @@ -173,8 +172,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - if (projectSlug) setTag("project.slug", projectSlug); + setTargetTagsAndAttributes({ organizationSlug, projectSlug }); let ruleId = params.ruleIdOrName; if (!isNumericAlertRuleId(ruleId)) { const matches = await findExactIssueAlertRuleMatches(apiService, { diff --git a/packages/mcp-core/src/tools/catalog/update-dsn.ts b/packages/mcp-core/src/tools/catalog/update-dsn.ts index 3a8bb63a0..f0cd77762 100644 --- a/packages/mcp-core/src/tools/catalog/update-dsn.ts +++ b/packages/mcp-core/src/tools/catalog/update-dsn.ts @@ -1,15 +1,14 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { UserInputError } from "../../errors"; -import type { ServerContext } from "../../types"; +import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, - ParamRegionUrl, ParamProjectSlug, + ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { validateResourceId } from "../../utils/slug-validation"; export default defineTool({ @@ -137,8 +136,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); + setTargetTagsAndAttributes(params); const hasUpdates = params.name !== undefined || diff --git a/packages/mcp-core/src/tools/catalog/update-issue.ts b/packages/mcp-core/src/tools/catalog/update-issue.ts index d4568891c..3298e2e79 100644 --- a/packages/mcp-core/src/tools/catalog/update-issue.ts +++ b/packages/mcp-core/src/tools/catalog/update-issue.ts @@ -1,30 +1,30 @@ -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { Issue } from "../../api-client/types"; +import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; +import { formatAssignedTo } from "../../internal/tool-helpers/formatting"; import { assertIssueWithinProjectConstraint, parseIssueParams, } from "../../internal/tool-helpers/issue"; -import { formatAssignedTo } from "../../internal/tool-helpers/formatting"; -import { logIssue } from "../../telem/logging"; -import { UserInputError } from "../../errors"; -import type { Issue } from "../../api-client/types"; -import type { ServerContext } from "../../types"; import { - ParamOrganizationSlug, - ParamRegionUrl, - ParamIssueShortId, - ParamIssueUrl, - ParamIssueStatus, - ParamIssueIgnoreMode, ParamAssignedTo, - ParamIgnoreDurationMinutes, ParamIgnoreCount, - ParamIgnoreWindowMinutes, + ParamIgnoreDurationMinutes, ParamIgnoreUserCount, ParamIgnoreUserWindowMinutes, + ParamIgnoreWindowMinutes, + ParamIssueIgnoreMode, + ParamIssueShortId, + ParamIssueStatus, + ParamIssueUrl, + ParamOrganizationSlug, ParamReason, + ParamRegionUrl, } from "../../schema"; +import { logIssue } from "../../telem/logging"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; type IgnoreMode = | "untilEscalating" @@ -710,7 +710,7 @@ export default defineTool({ issueUrl: params.issueUrl, }); - setOrganizationContext(orgSlug); + setTargetTagsAndAttributes({ organizationSlug: orgSlug }); // Get current issue details first const currentIssue = await apiService.getIssue({ diff --git a/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts b/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts index 83025eeb9..bb2402e52 100644 --- a/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts @@ -1,9 +1,8 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { metricMonitorConfigFields, @@ -52,8 +51,7 @@ export default defineTool({ ...changes } = params; const projectSlug = context.constraints.projectSlug ?? requestedProject; - setOrganizationContext(organizationSlug); - if (projectSlug) setTag("project.slug", projectSlug); + setTargetTagsAndAttributes({ organizationSlug, projectSlug }); const api = apiServiceFromContext(context, { regionUrl: regionUrl ?? undefined, }); diff --git a/packages/mcp-core/src/tools/catalog/update-project.ts b/packages/mcp-core/src/tools/catalog/update-project.ts index d20f78bba..30b31406b 100644 --- a/packages/mcp-core/src/tools/catalog/update-project.ts +++ b/packages/mcp-core/src/tools/catalog/update-project.ts @@ -1,20 +1,19 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { apiServiceFromContext } from "../../internal/tool-helpers/api"; -import { structuredResult } from "../../internal/tool-helpers/results"; -import { logIssue } from "../../telem/logging"; -import { UserInputError } from "../../errors"; import { ApiClientError } from "../../api-client"; -import type { ServerContext } from "../../types"; import type { Project } from "../../api-client/index"; +import { UserInputError } from "../../errors"; +import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; +import { structuredResult } from "../../internal/tool-helpers/results"; import { ParamOrganizationSlug, - ParamRegionUrl, - ParamProjectSlug, ParamPlatform, + ParamProjectSlug, + ParamRegionUrl, } from "../../schema"; +import { logIssue } from "../../telem/logging"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; +import type { ServerContext } from "../../types"; export const updateProjectOutputSchema = z.object({ project: z.object({ @@ -91,8 +90,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); + setTargetTagsAndAttributes(params); const hasProjectUpdates = params.name || params.slug || params.platform; if (!hasProjectUpdates) { diff --git a/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts b/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts index aa0916d43..9f3926476 100644 --- a/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts @@ -1,6 +1,4 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; @@ -10,6 +8,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; import { @@ -106,9 +105,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); - setTag("uptime.monitor_id", params.uptimeMonitorId); + setTargetTagsAndAttributes(params); assertProjectRefWithinConstraint({ resourceLabel: "Uptime monitor", diff --git a/packages/mcp-core/src/tools/support/issue-linking/tool.ts b/packages/mcp-core/src/tools/support/issue-linking/tool.ts index 8e29cefc9..b17746a2a 100644 --- a/packages/mcp-core/src/tools/support/issue-linking/tool.ts +++ b/packages/mcp-core/src/tools/support/issue-linking/tool.ts @@ -12,7 +12,7 @@ import { ParamOrganizationSlug, ParamRegionUrl, } from "../../../schema"; -import { setOrganizationContext } from "../../../telem/organization"; +import { setTargetTagsAndAttributes } from "../../../telem/scope"; import type { ServerContext } from "../../../types"; export const issueLinkInputSchema = { @@ -68,7 +68,7 @@ export async function resolveIssueLinkContext( const apiService = apiServiceFromContext(context, { regionUrl: context.constraints.regionUrl ?? params.regionUrl ?? undefined, }); - setOrganizationContext(organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const issue = await apiService.getIssue({ organizationSlug, issueId }); assertIssueWithinProjectConstraint({ issue, diff --git a/packages/mcp-core/src/tools/support/search-events/search.ts b/packages/mcp-core/src/tools/support/search-events/search.ts index a2147be85..3879ccf45 100644 --- a/packages/mcp-core/src/tools/support/search-events/search.ts +++ b/packages/mcp-core/src/tools/support/search-events/search.ts @@ -1,6 +1,6 @@ -import { getActiveSpan, setTag } from "@sentry/core"; +import { getActiveSpan } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../../telem/organization"; +import { setTargetTagsAndAttributes } from "../../../telem/scope"; import { UserInputError } from "../../../errors"; import { hasAgentProvider } from "../../../internal/agents/provider-factory"; import { withProviderFallback } from "../../../internal/agents/provider-fallback"; @@ -608,8 +608,7 @@ export async function runSearchEvents( }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - if (params.projectSlug) setTag("project.slug", params.projectSlug); + setTargetTagsAndAttributes(params); const inputDataset = params.dataset ?? "errors"; const hasStructuredQuery = looksLikeSentrySearchSyntax(params.query); diff --git a/packages/mcp-server/src/index.ts b/packages/mcp-server/src/index.ts index 2a771680b..d89e305b5 100644 --- a/packages/mcp-server/src/index.ts +++ b/packages/mcp-server/src/index.ts @@ -20,24 +20,24 @@ * ``` */ -import { buildServer } from "@sentry/mcp-core/server"; -import { startStdio } from "./transports/stdio"; -import * as Sentry from "@sentry/node"; -import { LIB_VERSION } from "@sentry/mcp-core/version"; -import { buildUsage } from "./cli/usage"; -import { printCliLine } from "./cli/output"; -import { parseArgv, parseEnv, merge } from "./cli/parse"; -import { finalize } from "./cli/resolve"; -import { resolveAccessToken } from "./auth/resolve-token"; -import { authCommand } from "./cli/commands/auth"; -import { sentryBeforeSend } from "@sentry/mcp-core/telem/sentry"; -import { SKILLS } from "@sentry/mcp-core/skills"; import { getAgentProvider, + getResolvedProviderType, setAgentProvider, setProviderBaseUrls, - getResolvedProviderType, } from "@sentry/mcp-core/internal/agents/provider-factory"; +import { buildServer } from "@sentry/mcp-core/server"; +import { SKILLS } from "@sentry/mcp-core/skills"; +import { sentryBeforeSend } from "@sentry/mcp-core/telem/sentry"; +import { LIB_VERSION } from "@sentry/mcp-core/version"; +import * as Sentry from "@sentry/node"; +import { resolveAccessToken } from "./auth/resolve-token"; +import { authCommand } from "./cli/commands/auth"; +import { printCliLine } from "./cli/output"; +import { merge, parseArgv, parseEnv } from "./cli/parse"; +import { finalize } from "./cli/resolve"; +import { buildUsage } from "./cli/usage"; +import { startStdio } from "./transports/stdio"; const packageName = "@sentry/mcp-server"; const allSkills = Object.keys(SKILLS) as ReadonlyArray< @@ -276,17 +276,26 @@ async function main() { console.warn(""); } + const scopeContext = { + "app.server.version": LIB_VERSION, + "app.transport": "stdio", + "app.upstream.host": cfg.sentryHost, + "app.url.full": cfg.mcpUrl, + }; + Sentry.init({ dsn: cfg.sentryDsn, tracesSampleRate: 1, beforeSend: sentryBeforeSend, initialScope: { tags: { - "app.server.version": LIB_VERSION, - "app.transport": "stdio", + ...scopeContext, "app.server.mode.experimental": cli.experimental ? "true" : "false", - "app.upstream.host": cfg.sentryHost, - "app.url.full": cfg.mcpUrl, + }, + // SDK v11 does not copy scope tags onto streamed spans. + attributes: { + ...scopeContext, + "app.server.mode.experimental": cli.experimental === true, }, }, release: process.env.SENTRY_RELEASE, diff --git a/packages/mcp-test-client/src/index.ts b/packages/mcp-test-client/src/index.ts index 9fcd8ba7e..282a6c4a5 100644 --- a/packages/mcp-test-client/src/index.ts +++ b/packages/mcp-test-client/src/index.ts @@ -1,25 +1,25 @@ #!/usr/bin/env node +import path from "node:path"; +import { stdin as input, stdout as output } from "node:process"; /** * CLI entry point for MCP QA: loads env, resolves transport/provider, then runs * either tool discovery or the test agent against a single MCP connection. */ import * as readline from "node:readline/promises"; -import { stdin as input, stdout as output } from "node:process"; -import { Command, Option } from "commander"; -import { config } from "dotenv"; -import path from "node:path"; import { fileURLToPath } from "node:url"; -import chalk from "chalk"; +import { sentryBeforeSend } from "@sentry/mcp-core/telem/sentry"; import * as Sentry from "@sentry/node"; -import { connectToMCPServer } from "./mcp-test-client.js"; -import { connectToRemoteMCPServer } from "./mcp-test-client-remote.js"; +import chalk from "chalk"; +import { Command, Option } from "commander"; +import { config } from "dotenv"; import { runAgent } from "./agent.js"; +import { resolveAgentProvider } from "./agent-provider.js"; import { logError, logInfo } from "./logger.js"; -import { sentryBeforeSend } from "@sentry/mcp-core/telem/sentry"; -import type { MCPConnection } from "./types.js"; +import { connectToMCPServer } from "./mcp-test-client.js"; +import { connectToRemoteMCPServer } from "./mcp-test-client-remote.js"; import { resolveTransportMode } from "./transport.js"; -import { resolveAgentProvider } from "./agent-provider.js"; +import type { MCPConnection } from "./types.js"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const rootDir = path.resolve(__dirname, "../../../"); @@ -70,15 +70,19 @@ program process.env.SENTRY_DSN || process.env.DEFAULT_SENTRY_DSN; + const scopeContext = { + "gen_ai.agent.name": "sentry-mcp-agent", + "gen_ai.provider.name": agentProvider ?? "unknown", + }; + Sentry.init({ dsn: sentryDsn, tracesSampleRate: 1, beforeSend: sentryBeforeSend, initialScope: { - tags: { - "gen_ai.agent.name": "sentry-mcp-agent", - "gen_ai.provider.name": agentProvider ?? "unknown", - }, + tags: scopeContext, + // SDK v11 does not copy scope tags onto streamed spans. + attributes: scopeContext, }, release: process.env.SENTRY_RELEASE, integrations: [ @@ -141,8 +145,9 @@ program }); } - // Set conversation ID as a global tag for all traces + // The tag reaches error events; setConversationId puts the ID on gen_ai spans. Sentry.setTag("gen_ai.conversation.id", connection.sessionId); + Sentry.setConversationId(connection.sessionId); const agentConfig = { model: options.model, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 579f3e6b4..c8c5e4f64 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,17 +43,17 @@ catalogs: specifier: ^1.2.3 version: 1.2.3 '@sentry/cloudflare': - specifier: 11.0.0-rc.0 - version: 11.0.0-rc.0 + specifier: 11.1.0 + version: 11.1.0 '@sentry/core': - specifier: 11.0.0-rc.0 - version: 11.0.0-rc.0 + specifier: 11.1.0 + version: 11.1.0 '@sentry/node': - specifier: 11.0.0-rc.0 - version: 11.0.0-rc.0 + specifier: 11.1.0 + version: 11.1.0 '@sentry/react': - specifier: 11.0.0-rc.0 - version: 11.0.0-rc.0 + specifier: 11.1.0 + version: 11.1.0 '@sentry/vite-plugin': specifier: ^4.6.1 version: 4.6.1 @@ -214,7 +214,7 @@ importers: version: 2.13.1 tsdown: specifier: 'catalog:' - version: 0.12.9(supports-color@8.1.1)(typescript@5.8.3) + version: 0.12.9(typescript@5.8.3) tsx: specifier: 'catalog:' version: 4.20.3 @@ -291,7 +291,7 @@ importers: version: 10.63.0(patch_hash=e663994979ff877a26ab6d4dea5968fbaee4ccdfdeb85623983535a572678940) '@sentry/node': specifier: 10.65.0 - version: 10.65.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(supports-color@8.1.1) + version: 10.65.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1)) '@sentry/node-core': specifier: 10.63.0 version: 10.63.0(patch_hash=0a5f08471bd72cb833a2b36220c96001d966e5c390d71aaf598fdef75b552640)(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1)) @@ -465,10 +465,10 @@ importers: version: 1.2.3(@types/react@19.1.8)(react@19.2.8) '@sentry/cloudflare': specifier: 'catalog:' - version: 11.0.0-rc.0(@cloudflare/workers-types@4.20260405.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)(@types/node@24.13.5)) + version: 11.1.0(@cloudflare/workers-types@4.20260405.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)(@types/node@24.13.5)) '@sentry/react': specifier: 'catalog:' - version: 11.0.0-rc.0(react-router@7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) + version: 11.1.0(react-router@7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) agents: specifier: 'catalog:' version: 0.20.1(@ai-sdk/react@3.0.232(react@19.2.8)(zod@4.4.3))(@babel/core@7.28.0)(@babel/runtime@7.28.4)(@cloudflare/workers-types@4.20260405.1)(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.4.3))(@modelcontextprotocol/server@2.0.0)(ai@6.0.64(zod@4.4.3))(chat@4.40.0(ai@6.0.64(zod@4.4.3))(zod@4.4.3))(react@19.2.8)(rolldown@1.0.0-beta.23)(vite@6.3.5(@types/node@24.13.5)(jiti@2.4.2)(lightningcss@1.32.0)(tsx@4.20.3)(yaml@2.8.3))(zod@4.4.3) @@ -607,7 +607,7 @@ importers: version: 2.0.0 '@sentry/core': specifier: 'catalog:' - version: 11.0.0-rc.0 + version: 11.1.0 ai: specifier: 'catalog:' version: 6.0.64(zod@4.4.3) @@ -653,10 +653,10 @@ importers: version: 1.30.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) '@sentry/core': specifier: 'catalog:' - version: 11.0.0-rc.0 + version: 11.1.0 '@sentry/node': specifier: 'catalog:' - version: 11.0.0-rc.0(rollup@4.62.4) + version: 11.1.0(@babel/core@7.28.0)(rollup@4.62.4) dotenv: specifier: 'catalog:' version: 16.6.1 @@ -678,7 +678,7 @@ importers: version: 22.16.0 tsdown: specifier: 'catalog:' - version: 0.12.9(supports-color@8.1.1)(typescript@5.8.3) + version: 0.12.9(typescript@5.8.3) tsx: specifier: 'catalog:' version: 4.20.3 @@ -762,13 +762,13 @@ importers: version: 1.30.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) '@sentry/core': specifier: 'catalog:' - version: 11.0.0-rc.0 + version: 11.1.0 '@sentry/mcp-core': specifier: workspace:* version: link:../mcp-core '@sentry/node': specifier: 'catalog:' - version: 11.0.0-rc.0(rollup@4.62.4) + version: 11.1.0(@babel/core@7.28.0)(rollup@4.62.4) ai: specifier: 'catalog:' version: 6.0.64(zod@4.4.3) @@ -790,7 +790,7 @@ importers: devDependencies: tsdown: specifier: 'catalog:' - version: 0.12.9(supports-color@8.1.1)(typescript@5.8.3) + version: 0.12.9(typescript@5.8.3) tsx: specifier: 'catalog:' version: 4.20.3 @@ -2813,10 +2813,135 @@ packages: '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + '@oxc-parser/binding-android-arm-eabi@0.143.0': + resolution: {integrity: sha512-n9uozULWflPqBtdmI8lAabLqGKNgLVNN0ZH8HfgCwpKGNtzRzauB76jTiW/3YLkcA7N1zskpi9GdVnZuu1SAvg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.143.0': + resolution: {integrity: sha512-9BbdjHETk6O3zH/DDid9IgBtF0GlpLabNKN231uraXpRDSfY+iiZxTP5bk1Z63GBownVdhdINFIeddmMz4MzpQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.143.0': + resolution: {integrity: sha512-gh+6ecoHUy4/sUcolBl/1qPXKBbYNxFY0Pk0ujgQvINTMSftJY7o4yb8gOkDJPeZeB8+a+u7xTe6umoP8N5HFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.143.0': + resolution: {integrity: sha512-qd1hl2d+lXgHv/VQ/M9qm8TrMC5T4RqDBwtOnl+1D0QMjwcz+8AaB4JSg8STgeag0GP6a6L74XEGAsrTSJWNzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.143.0': + resolution: {integrity: sha512-M5XXcNa7aOqLPKTR41msfghKu2yQ4xWvCm11/gwU0JzOzHNk5sgW//rVEjJ+LO48+VDAMzXTSzurUVxIDKwozw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.143.0': + resolution: {integrity: sha512-T/GXusuOkPNQhCQCSBbcU/N8j0rAypuDBl1IyFK+lyYT594XsVz80clPC/OtbSSpBGyJxj8uYEfctxVuxVYoww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.143.0': + resolution: {integrity: sha512-oKu4RcBlXSqo3OC62dp6YTnQaZIurNDpCX3BnAM3+bJxt7s8J2TJKMnC0UYer1qhlRaDCg6wkTaTw+2IlsZ12w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.143.0': + resolution: {integrity: sha512-WJBbD186AZmMGaSIhlktC+rPl8L3peCTXAh88Ih9uEvK0en2mPojGyCGYiL6mHtV1RPV3JyfJW5t6n5hh0lXhA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-arm64-musl@0.143.0': + resolution: {integrity: sha512-t1AcYOwEzgceadT4v5e+vaCCb0AncCA3v5AyzfBAz/tMq11qzVccXKzNHtkWdjBsgvTKwRkaUF3QvT4kot8vcQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-ppc64-gnu@0.143.0': + resolution: {integrity: sha512-RsnO/NoD8376LMJq8JS8TwI0ieNaFRTuNe2GVJntQg6gwZNMENZsEbknHdVwjpOmxdGLGodcwaGSbAeRr5Bgjw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-gnu@0.143.0': + resolution: {integrity: sha512-48fSVfR9TZi5CASZFyv0VC6z6BCoeihFsX031mAD/oSH7d9PYsPgIqza7d9mjP7Z2KTEpTFyH6SIu0Ui6R1vdg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-musl@0.143.0': + resolution: {integrity: sha512-T8CpdD+SfE01DnIOD4HpVxu0ZJOfMJ/VhCvikKfaXAxkZ+9veyLM/D2hpi7Y2hFUyPmVQO3FNZHmYzV/WlVR4g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-s390x-gnu@0.143.0': + resolution: {integrity: sha512-QLdeMsCcacenPEFsfxnBUDF1y6opyz5+fmOz9bfD5Y7fiGCMupUCuB3KTPQhNwshIG1P9fPqar9MHxuBDd4bwQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-gnu@0.143.0': + resolution: {integrity: sha512-659ujfqLy6k7cuH3sbzhd8b+ztSq+i6E2E9pG78Q0BmHjAExfGIdgc8cGgMdwAozDXeZFHkJ+LXYJdWsaGdgyw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-musl@0.143.0': + resolution: {integrity: sha512-/Mw/9j4TfZcnKphPrzOE6t4MMknXadcAAuVUlDRTF/ETWB5xOgQvOJV2Mh9We/bWxZdoxaGAdc+hy4GuYwQ2yQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-openharmony-arm64@0.143.0': + resolution: {integrity: sha512-8rIKWR2BFuifbIK/1XB9wTaSdtuJ25dlE7ZQYDnEwj/2xH2vHsxnvIjHT3ZjSVuLLwGGlSslIG/fbOJ8TV8rTw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-win32-arm64-msvc@0.143.0': + resolution: {integrity: sha512-5U9kQYMfRRI6Zq7KDxgbIP0RMnKrfn3gLepRMgJuRkPSUALTiRCk9d/uyhb4lGDjUdzwK7mBkKqhLgzBPCmLpQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.143.0': + resolution: {integrity: sha512-25P7AaHk4R88Yv2XH4gToDVmh0cOu+bEURQU10CRrmvgabfRArSGAP5osmwUKeSUHj0VS50upbpbRWWW/m7mHA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.143.0': + resolution: {integrity: sha512-ORMh3JE1s6V7ySicdRK7vgaDQnn5o+UHg9ct989PlWHbel8O9ARrmWXM6kZjrBMtNucxNayQ8g69G0VfWzhANw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@oxc-project/runtime@0.75.0': resolution: {integrity: sha512-gzRmVI/vorsPmbDXt7GD4Uh2lD3rCOku/1xWPB4Yx48k0EP4TZmzQudWapjN4+7Vv+rgXr0RqCHQadeaMvdBuw==} engines: {node: '>=6.9.0'} + '@oxc-project/types@0.143.0': + resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==} + '@oxc-project/types@0.150.0': resolution: {integrity: sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==} @@ -3402,16 +3527,16 @@ packages: resolution: {integrity: sha512-yZfdQ87RLat/7retF8zA6Z9zCAT12IyaPvIiu+bbi1E1V1OqDpS8MKNa/6LF69Ap7DVTORi9ITEgjlAqTXF0xQ==} engines: {node: '>=18'} - '@sentry/browser-utils@11.0.0-rc.0': - resolution: {integrity: sha512-Mxate9W4UEkx8Ez+78ygWdxB3KFMVjwXFSd5dwXjHl/Bv/+t375l8JCV1vW5IQ/V5qQBWi/ess/IA4Rq7pmQjQ==} + '@sentry/browser-utils@11.1.0': + resolution: {integrity: sha512-1Bcv2FOKQUXKCSfGmCUMTthQZbmyxoWkiePFQzF7hrchdLlwsgYKJic1t1QwxBMZCBCA+352C4/5tZ9/DWgOVw==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/browser@10.75.0': resolution: {integrity: sha512-CKGSJLWISQ6LgMaGnMpY+XvwWQ2iiHTayUs6SGLIvYeaGo2GTjS/Z4pnbCVHb2t1VxLZksyehgcC6ZYGJeQpzQ==} engines: {node: '>=18'} - '@sentry/browser@11.0.0-rc.0': - resolution: {integrity: sha512-S/PSQvvoI0vtwJZt1jUMUJau4cxMH1a+rN8Ul5KOvDHP5P8tGkB5fl7GtHVchlil8JPp5xd4bp7PyFHPkvAPPw==} + '@sentry/browser@11.1.0': + resolution: {integrity: sha512-9uXvMg5U8q6hcyzRUYywDJKdaQu1PqjVoqKJ7owwlLFSXjzYihYnfAUmUUalJUQ7Hibe8PydyOV/8r9aL6m72A==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/bundler-plugin-core@4.6.1': @@ -3430,13 +3555,16 @@ packages: webpack: optional: true - '@sentry/bundler-plugins@11.0.0-rc.0': - resolution: {integrity: sha512-mfRtTo7MNMgAghHsTzcRV5XwdpV+YqdqA4OGgOSRqLEY5H1jxfO8j+orEjUvLk8pCgR4Y1cORsXKqpVXI4nh3w==} + '@sentry/bundler-plugins@11.1.0': + resolution: {integrity: sha512-0p22SeSdyCnr7PaFkSHZnOzc8lpPlkiA+rsjye9JACR9Hd/n7e9Ssvanw19R7LdqS05foYQSViJIsrVbk45Y3w==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} peerDependencies: + '@babel/core': ^7.18.5 rollup: '>=3.2.0' - webpack: '>=5.0.0' + webpack: '>=5.1.0' peerDependenciesMeta: + '@babel/core': + optional: true rollup: optional: true webpack: @@ -3546,8 +3674,8 @@ packages: engines: {node: '>= 10'} hasBin: true - '@sentry/cloudflare@11.0.0-rc.0': - resolution: {integrity: sha512-mzhLWRvXn7HrNzTjK2FI9MoSse/MVDxGLQJvKIur/KXZS402fcOURX1n3nBqJfzkgL3rZ1oQAM4eKOF5BY3QkA==} + '@sentry/cloudflare@11.1.0': + resolution: {integrity: sha512-Y/1nNLES7IcHrtkecss381Qpr5NXwdbi6QCNYx2he5FShRRzrIKnpa+N1FByMqJO7joFAmdMj/PgCeG/nJyKEw==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} peerDependencies: '@cloudflare/workers-types': ^4.x || ^5.x @@ -3570,8 +3698,8 @@ packages: resolution: {integrity: sha512-fO9PLmHdVURcSPUpWCItWAtgKiMwGdJHbovoSEyLplX5sxs2ugvI4CBPTrkkgqhObnZOD0CnWBKDzSVQYBKEyQ==} engines: {node: '>=14'} - '@sentry/conventions@0.23.0': - resolution: {integrity: sha512-+Euyo7CNVecoOusgUnq27oV97oshifgceKfnGnuKfXrPUVWA/cisvii3E1rlvy2yBrKvl9K1gCEo1Jqog5zjEQ==} + '@sentry/conventions@0.24.0': + resolution: {integrity: sha512-pmmF2mLy7A23z8gnLRG87lYu4SSPIBColtfqu9cfkh1omn/0CI3w0/AqZ/uf/VGAtM/wJMN61J58Ks/IWBCHpQ==} engines: {node: '>=14'} '@sentry/core@10.63.0': @@ -3586,8 +3714,8 @@ packages: resolution: {integrity: sha512-5wDQpQqjJ6RHdPR+z6Q+47XlwoxRKBv0yyB0LKHqL/1azPOQbR+nllyLmmQDcoJpaksuLSmLA1q6hFX7gjDT2w==} engines: {node: '>=18'} - '@sentry/core@11.0.0-rc.0': - resolution: {integrity: sha512-6KXLKGq1YgysUIzeD0cYQH/8Tg62V+UJV1d9FVNvKb0HnRgbiO9VWCCm1wGyYSENdGPdSa9zOOnk5ZC7WxLaAw==} + '@sentry/core@11.1.0': + resolution: {integrity: sha512-ObM47oMWxRQiVxUdkV6bs2BeHxPVWim571hw1iT3suyAc8iRfJ27f+QdIdmDKZtvHFGJ0Vh/LpeTZP5Z8FXyEA==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/core@9.34.0': @@ -3598,8 +3726,8 @@ packages: resolution: {integrity: sha512-YLVAFQXELJAOg7ke4oLkd8t5l0fJUockLlTQJg/2Trh7SB5Q4mkSwlnAkEAqDQ618vnpFsG/tnYMwtfZeffHjA==} engines: {node: '>=18'} - '@sentry/feedback@11.0.0-rc.0': - resolution: {integrity: sha512-jb/xd0kxtYM8XVAZtsMxayv27Agv4aWHBumnVT0jxUSNj2eoX5Tfz0PsinV7lcqITZ8HaLeYkUQcll4ANqjX5w==} + '@sentry/feedback@11.1.0': + resolution: {integrity: sha512-ZHZwmJEWcvxJP/rvaJlrO6NFpGHkewsxVmvHLJHkbd1XSChtwgdUI8W/+Gu4jcGXRz0JJPFrpRFNuVTp1QWCjg==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/node-core@10.63.0': @@ -3673,8 +3801,8 @@ packages: resolution: {integrity: sha512-XdYW+SEiscQnuugh1hMldfnHurmleKSTSDqgfro6Y1yd7s0r2csnZ5/SEYxIeL4lSl1QXg1lIA1pBmAXjcdnKA==} engines: {node: '>=18'} - '@sentry/node@11.0.0-rc.0': - resolution: {integrity: sha512-hztnJEx8Fcyp0wNJgVbrgWIy9jgkefo7A3c7Y7r7wrCwCl5gKwzzo53XYOkY2lf/rjTLaJCG8b21VjHaFldOZw==} + '@sentry/node@11.1.0': + resolution: {integrity: sha512-8QPZILpVGkggpCe1Qt9VaPQ8UWy6EAVY/94HB2EWqSn6Xx9J7f3pMlncxOQfwv09S7iZDs1Lmfj/Zf7iftinZw==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/opentelemetry@10.63.0': @@ -3701,14 +3829,14 @@ packages: '@opentelemetry/core': ^1.30.1 || ^2.1.0 '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 - '@sentry/opentelemetry@11.0.0-rc.0': - resolution: {integrity: sha512-28Yy+Qoo84Ckxu40f2sB/NE+J2uacVkT+rD/GnK3+ExZfW/o2nV7eotIwKUprhoHM1w8EaMQusjZAMTzHc4geQ==} + '@sentry/opentelemetry@11.1.0': + resolution: {integrity: sha512-ZFRwYDSuTIzpS1yOFTMn6p568tQW8k7KIjwzlI8VMOYYAEDkXQK+D/ZUGedSA/iu9fbiZXX+/wFfKqk7AYIiGg==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} peerDependencies: '@opentelemetry/api': ^1.9.0 - '@sentry/react@11.0.0-rc.0': - resolution: {integrity: sha512-IsXgQ5E6DtIVBhoIxZqkZJqyDgFN8RJX/FrUUwDIDjSCXftK1SZnfPXxPWUE/vF9RBrF0UScqstvOKvJJkq1Mw==} + '@sentry/react@11.1.0': + resolution: {integrity: sha512-Xa+URJBG2r5jE9z5sYEvWA5KmYhtNNTKQXYMYysogGW4WRM8z5xipVo1WLDwDCtA4EqC/ybEVfM7N0Ta3331DQ==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} peerDependencies: react: 17.x || 18.x || 19.x @@ -3721,20 +3849,20 @@ packages: resolution: {integrity: sha512-LNokI5Ud22nZ/o2il/2SfbNIARupWrbS6Mh9jZroZTjD38FN0Oi9vIexj6h1HN81C6+lP2Tmpaj+fl3/wOizzA==} engines: {node: '>=18'} - '@sentry/replay-canvas@11.0.0-rc.0': - resolution: {integrity: sha512-7KSOyhmhRjlMg0NX4P+gNsgaT40uAWhJrI+3hsHxSU1dsvBdylhBzHM3/2Qie5QuFvrdBWqJefeQ5tFs7GCPoQ==} + '@sentry/replay-canvas@11.1.0': + resolution: {integrity: sha512-nHWrcN5B6tkxSNvFkI1xT9llNi3NJfUV5JUGhUTtt9urcL55dIMtT7GSflub2fBtrsE//FzeoL1T3Wt4r8+CMQ==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/replay@10.75.0': resolution: {integrity: sha512-p4xxEo/ayiMZG9tygr09YjqYAd52uq8Qi0EVoRRgUe70nQda0HVPVW519JLq0G+Th/5O5sKME9y1layLU3xlPg==} engines: {node: '>=18'} - '@sentry/replay@11.0.0-rc.0': - resolution: {integrity: sha512-7TIGKTFc0dfmC7uGj4HZ4sRyk25ZuUdvMO8yY4gcflIZfZAE18USE1S9fM+QTmCMlbrPEXgni7Iw2ij4zsxMYQ==} + '@sentry/replay@11.1.0': + resolution: {integrity: sha512-11J/iTBOHqYXQxu9b/KRPxUeHakFdLPnHmDz4hrJ198R4QQQeY245tnYxL8o/1yaQdSo0AMEWJ38lo9GtIWfhg==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} - '@sentry/server-runtime-injection@11.0.0-rc.0': - resolution: {integrity: sha512-x8XppxyzDZxweoHlfsW0l12ghquvp79o2UNXOcXETRb+40ud+RF+YdPtnv4yvsrByXScPkNzKVdJSjxevJCcrA==} + '@sentry/server-runtime-injection@11.1.0': + resolution: {integrity: sha512-tp5ihEibsCQG/qTqL7yqU3PXQLsXM9Nm+ELPMy6hptkyuiOCuDOXpAzthWcSDHVIdBYIC7iUPmpcZihfTXx6Mw==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/server-utils@10.65.0': @@ -3745,8 +3873,8 @@ packages: resolution: {integrity: sha512-7fIa9vFGNzB13hmxl8Sip3xImSkqpc4wETzuQ7CLzVOwPvwI6y/gVEm0pxRhtJSq8SzfOp26eJWl80u8v78Osg==} engines: {node: '>=18'} - '@sentry/server-utils@11.0.0-rc.0': - resolution: {integrity: sha512-0+nsGmRdz8U+U5Cbe52FVfsBztcSY8v7u37id3lsEOktZQi8uJRQShp7BgvD8+ReXEuoVK/L2w7LxzTdtmxQig==} + '@sentry/server-utils@11.1.0': + resolution: {integrity: sha512-5IQtU8SommZyTZgJxZFunQQHay8Vq78D8P0qP9ggQ1hTa6GU6kQKBDDN8eNayUA/Hl2qPei/LAmvmyiZNDIJ0Q==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/sqlish@1.0.1': @@ -6651,6 +6779,10 @@ packages: outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + oxc-parser@0.143.0: + resolution: {integrity: sha512-ov0NzaDCOInknS7mP1cwKdJERt3utPW8ldjtdUXQ8Ty0GEFD08wk422vCUN0d7pST6kqtV7dxoI9w1Zi0l/9TA==} + engines: {node: ^20.19.0 || >=22.12.0} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -8485,7 +8617,7 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 '@anthropic-ai/sdk@0.39.0': dependencies: @@ -8515,10 +8647,10 @@ snapshots: semifies: 1.0.0 source-map: 0.6.1 - '@apm-js-collab/tracing-hooks@0.10.1(supports-color@8.1.1)': + '@apm-js-collab/tracing-hooks@0.10.1': dependencies: '@apm-js-collab/code-transformer': 0.15.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 module-details-from-path: 1.0.4 transitivePeerDependencies: - supports-color @@ -8748,7 +8880,7 @@ snapshots: '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 @@ -8767,32 +8899,12 @@ snapshots: '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) '@babel/helpers': 7.27.6 - '@babel/parser': 7.28.0 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0(supports-color@8.1.1) - '@babel/types': 7.28.0 - convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/core@7.28.0(supports-color@8.1.1)': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/helpers': 7.27.6 - '@babel/parser': 7.28.0 + '@babel/parser': 7.29.8 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0(supports-color@8.1.1) - '@babel/types': 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.29.8 convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -8801,8 +8913,8 @@ snapshots: '@babel/generator@7.28.0': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@jridgewell/gen-mapping': 0.3.12 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 @@ -8848,28 +8960,19 @@ snapshots: '@babel/traverse': 8.0.4 '@babel/types': 8.0.4 - '@babel/helper-module-imports@7.27.1(supports-color@8.1.1)': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.28.0(supports-color@8.1.1) + '@babel/traverse': 7.28.0 '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0(supports-color@8.1.1))(supports-color@8.1.1)': - dependencies: - '@babel/core': 7.28.0(supports-color@8.1.1) - '@babel/helper-module-imports': 7.27.1(supports-color@8.1.1) - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1(supports-color@8.1.1) - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0(supports-color@8.1.1) + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color @@ -8912,7 +9015,7 @@ snapshots: '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.0 + '@babel/types': 7.29.8 '@babel/parser@7.28.0': dependencies: @@ -8961,8 +9064,8 @@ snapshots: '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@babel/template@8.0.0': dependencies: @@ -8970,15 +9073,15 @@ snapshots: '@babel/parser': 8.0.4 '@babel/types': 8.0.4 - '@babel/traverse@7.28.0(supports-color@8.1.1)': + '@babel/traverse@7.28.0': dependencies: '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.0 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/parser': 7.29.8 '@babel/template': 7.27.2 - '@babel/types': 7.28.0 - debug: 4.4.3(supports-color@8.1.1) + '@babel/types': 7.29.8 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -9339,7 +9442,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.27.1(supports-color@8.1.1) + '@babel/helper-module-imports': 7.27.1 '@babel/runtime': 7.28.4 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 @@ -10268,8 +10371,67 @@ snapshots: '@oslojs/encoding@1.1.0': {} + '@oxc-parser/binding-android-arm-eabi@0.143.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.143.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.143.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.143.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.143.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.143.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.143.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.143.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.143.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.143.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.143.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.143.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.143.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.143.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.143.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.143.0': + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.143.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.143.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.143.0': + optional: true + '@oxc-project/runtime@0.75.0': {} + '@oxc-project/types@0.143.0': {} + '@oxc-project/types@0.150.0': {} '@oxc-project/types@0.75.0': {} @@ -10663,10 +10825,10 @@ snapshots: '@sentry/conventions': 0.16.0 '@sentry/core': 10.75.0 - '@sentry/browser-utils@11.0.0-rc.0': + '@sentry/browser-utils@11.1.0': dependencies: - '@sentry/conventions': 0.23.0 - '@sentry/core': 11.0.0-rc.0 + '@sentry/conventions': 0.24.0 + '@sentry/core': 11.1.0 web-vitals: 6.2.1 '@sentry/browser@10.75.0': @@ -10678,14 +10840,14 @@ snapshots: '@sentry/replay': 10.75.0 '@sentry/replay-canvas': 10.75.0 - '@sentry/browser@11.0.0-rc.0': + '@sentry/browser@11.1.0': dependencies: - '@sentry/browser-utils': 11.0.0-rc.0 - '@sentry/conventions': 0.23.0 - '@sentry/core': 11.0.0-rc.0 - '@sentry/feedback': 11.0.0-rc.0 - '@sentry/replay': 11.0.0-rc.0 - '@sentry/replay-canvas': 11.0.0-rc.0 + '@sentry/browser-utils': 11.1.0 + '@sentry/conventions': 0.24.0 + '@sentry/core': 11.1.0 + '@sentry/feedback': 11.1.0 + '@sentry/replay': 11.1.0 + '@sentry/replay-canvas': 11.1.0 '@sentry/bundler-plugin-core@4.6.1': dependencies: @@ -10716,16 +10878,17 @@ snapshots: - encoding - supports-color - '@sentry/bundler-plugins@11.0.0-rc.0(rollup@4.62.4)': + '@sentry/bundler-plugins@11.1.0(@babel/core@7.28.0)(rollup@4.62.4)': dependencies: - '@babel/core': 7.28.0(supports-color@8.1.1) - '@sentry/core': 11.0.0-rc.0 + '@sentry/core': 11.1.0 dotenv: 17.4.2 glob: 13.0.6 magic-string: 0.30.21 + oxc-parser: 0.143.0 sentry: 0.44.1 supports-color: 8.1.1 optionalDependencies: + '@babel/core': 7.28.0 rollup: 4.62.4 '@sentry/cli-darwin@2.58.2': @@ -10816,13 +10979,13 @@ snapshots: - encoding - supports-color - '@sentry/cloudflare@11.0.0-rc.0(@cloudflare/workers-types@4.20260405.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)(@types/node@24.13.5))': + '@sentry/cloudflare@11.1.0(@cloudflare/workers-types@4.20260405.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)(@types/node@24.13.5))': dependencies: '@opentelemetry/api': 1.9.1 - '@sentry/conventions': 0.23.0 - '@sentry/core': 11.0.0-rc.0 - '@sentry/opentelemetry': 11.0.0-rc.0(@opentelemetry/api@1.9.1) - '@sentry/server-utils': 11.0.0-rc.0 + '@sentry/conventions': 0.24.0 + '@sentry/core': 11.1.0 + '@sentry/opentelemetry': 11.1.0(@opentelemetry/api@1.9.1) + '@sentry/server-utils': 11.1.0 magic-string: 0.30.21 optionalDependencies: '@cloudflare/workers-types': 4.20260405.1 @@ -10834,7 +10997,7 @@ snapshots: '@sentry/conventions@0.16.0': {} - '@sentry/conventions@0.23.0': {} + '@sentry/conventions@0.24.0': {} '@sentry/core@10.63.0(patch_hash=e663994979ff877a26ab6d4dea5968fbaee4ccdfdeb85623983535a572678940)': {} @@ -10846,9 +11009,9 @@ snapshots: dependencies: '@sentry/conventions': 0.16.0 - '@sentry/core@11.0.0-rc.0': + '@sentry/core@11.1.0': dependencies: - '@sentry/conventions': 0.23.0 + '@sentry/conventions': 0.24.0 '@sentry/core@9.34.0': {} @@ -10856,9 +11019,9 @@ snapshots: dependencies: '@sentry/core': 10.75.0 - '@sentry/feedback@11.0.0-rc.0': + '@sentry/feedback@11.1.0': dependencies: - '@sentry/core': 11.0.0-rc.0 + '@sentry/core': 11.1.0 '@sentry/node-core@10.63.0(patch_hash=0a5f08471bd72cb833a2b36220c96001d966e5c390d71aaf598fdef75b552640)(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))': dependencies: @@ -10896,7 +11059,7 @@ snapshots: '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) - '@sentry/node@10.65.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(supports-color@8.1.1)': + '@sentry/node@10.65.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1) @@ -10905,7 +11068,7 @@ snapshots: '@sentry/core': 10.65.0 '@sentry/node-core': 10.65.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1)) '@sentry/opentelemetry': 10.65.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1)) - '@sentry/server-utils': 10.65.0(supports-color@8.1.1) + '@sentry/server-utils': 10.65.0 import-in-the-middle: 3.5.1 transitivePeerDependencies: - '@opentelemetry/core' @@ -10928,16 +11091,17 @@ snapshots: - '@opentelemetry/exporter-trace-otlp-http' - supports-color - '@sentry/node@11.0.0-rc.0(rollup@4.62.4)': + '@sentry/node@11.1.0(@babel/core@7.28.0)(rollup@4.62.4)': dependencies: '@opentelemetry/api': 1.9.1 - '@sentry/bundler-plugins': 11.0.0-rc.0(rollup@4.62.4) - '@sentry/conventions': 0.23.0 - '@sentry/core': 11.0.0-rc.0 - '@sentry/opentelemetry': 11.0.0-rc.0(@opentelemetry/api@1.9.1) - '@sentry/server-runtime-injection': 11.0.0-rc.0 - '@sentry/server-utils': 11.0.0-rc.0 + '@sentry/bundler-plugins': 11.1.0(@babel/core@7.28.0)(rollup@4.62.4) + '@sentry/conventions': 0.24.0 + '@sentry/core': 11.1.0 + '@sentry/opentelemetry': 11.1.0(@opentelemetry/api@1.9.1) + '@sentry/server-runtime-injection': 11.1.0 + '@sentry/server-utils': 11.1.0 transitivePeerDependencies: + - '@babel/core' - rollup - webpack @@ -10965,17 +11129,17 @@ snapshots: '@sentry/conventions': 0.16.0 '@sentry/core': 10.75.0 - '@sentry/opentelemetry@11.0.0-rc.0(@opentelemetry/api@1.9.1)': + '@sentry/opentelemetry@11.1.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@sentry/conventions': 0.23.0 - '@sentry/core': 11.0.0-rc.0 + '@sentry/conventions': 0.24.0 + '@sentry/core': 11.1.0 - '@sentry/react@11.0.0-rc.0(react-router@7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)': + '@sentry/react@11.1.0(react-router@7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)': dependencies: - '@sentry/browser': 11.0.0-rc.0 - '@sentry/conventions': 0.23.0 - '@sentry/core': 11.0.0-rc.0 + '@sentry/browser': 11.1.0 + '@sentry/conventions': 0.24.0 + '@sentry/core': 11.1.0 react: 19.2.8 optionalDependencies: react-router: 7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -10985,31 +11149,31 @@ snapshots: '@sentry/core': 10.75.0 '@sentry/replay': 10.75.0 - '@sentry/replay-canvas@11.0.0-rc.0': + '@sentry/replay-canvas@11.1.0': dependencies: - '@sentry/core': 11.0.0-rc.0 - '@sentry/replay': 11.0.0-rc.0 + '@sentry/core': 11.1.0 + '@sentry/replay': 11.1.0 '@sentry/replay@10.75.0': dependencies: '@sentry/browser-utils': 10.75.0 '@sentry/core': 10.75.0 - '@sentry/replay@11.0.0-rc.0': + '@sentry/replay@11.1.0': dependencies: - '@sentry/browser-utils': 11.0.0-rc.0 - '@sentry/core': 11.0.0-rc.0 + '@sentry/browser-utils': 11.1.0 + '@sentry/core': 11.1.0 - '@sentry/server-runtime-injection@11.0.0-rc.0': + '@sentry/server-runtime-injection@11.1.0': dependencies: - '@sentry/core': 11.0.0-rc.0 - '@sentry/server-utils': 11.0.0-rc.0 + '@sentry/core': 11.1.0 + '@sentry/server-utils': 11.1.0 - '@sentry/server-utils@10.65.0(supports-color@8.1.1)': + '@sentry/server-utils@10.65.0': dependencies: '@apm-js-collab/code-transformer': 0.15.0 '@apm-js-collab/code-transformer-bundler-plugins': 0.5.0 - '@apm-js-collab/tracing-hooks': 0.10.1(supports-color@8.1.1) + '@apm-js-collab/tracing-hooks': 0.10.1 '@sentry/conventions': 0.15.1 '@sentry/core': 10.65.0 magic-string: 0.30.21 @@ -11021,11 +11185,11 @@ snapshots: '@sentry/conventions': 0.16.0 '@sentry/core': 10.75.0 - '@sentry/server-utils@11.0.0-rc.0': + '@sentry/server-utils@11.1.0': dependencies: '@opentelemetry/api': 1.9.1 - '@sentry/conventions': 0.23.0 - '@sentry/core': 11.0.0-rc.0 + '@sentry/conventions': 0.24.0 + '@sentry/core': 11.1.0 '@sentry/sqlish@1.0.1(react@19.2.8)': optionalDependencies: @@ -11166,7 +11330,7 @@ snapshots: '@jridgewell/trace-mapping': 0.3.29 '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.5) '@sentry/core': 10.63.0(patch_hash=e663994979ff877a26ab6d4dea5968fbaee4ccdfdeb85623983535a572678940) - '@sentry/node': 10.65.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(supports-color@8.1.1) + '@sentry/node': 10.65.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1)) anser: 2.3.5 chalk: 5.6.2 eventsource: 4.1.1 @@ -11578,7 +11742,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -11914,7 +12078,7 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 http-errors: 2.0.0 iconv-lite: 0.7.0 on-finished: 2.4.1 @@ -12252,11 +12416,9 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.3(supports-color@8.1.1): + debug@4.4.3: dependencies: ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 decode-named-character-reference@1.2.0: dependencies: @@ -12662,7 +12824,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 @@ -12774,7 +12936,7 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -13195,7 +13357,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -14158,7 +14320,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -14528,6 +14690,30 @@ snapshots: outvariant@1.4.3: {} + oxc-parser@0.143.0: + dependencies: + '@oxc-project/types': 0.143.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.143.0 + '@oxc-parser/binding-android-arm64': 0.143.0 + '@oxc-parser/binding-darwin-arm64': 0.143.0 + '@oxc-parser/binding-darwin-x64': 0.143.0 + '@oxc-parser/binding-freebsd-x64': 0.143.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.143.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.143.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.143.0 + '@oxc-parser/binding-linux-arm64-musl': 0.143.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.143.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.143.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.143.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.143.0 + '@oxc-parser/binding-linux-x64-gnu': 0.143.0 + '@oxc-parser/binding-linux-x64-musl': 0.143.0 + '@oxc-parser/binding-openharmony-arm64': 0.143.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.143.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.143.0 + '@oxc-parser/binding-win32-x64-msvc': 0.143.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -15040,7 +15226,7 @@ snapshots: require-in-the-middle@8.0.1: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 module-details-from-path: 1.0.4 transitivePeerDependencies: - supports-color @@ -15100,14 +15286,14 @@ snapshots: rfdc@1.4.1: {} - rolldown-plugin-dts@0.13.13(rolldown@1.0.0-beta.23)(supports-color@8.1.1)(typescript@5.8.3): + rolldown-plugin-dts@0.13.13(rolldown@1.0.0-beta.23)(typescript@5.8.3): dependencies: '@babel/generator': 7.28.0 '@babel/parser': 7.28.0 '@babel/types': 7.28.0 ast-kit: 2.1.1 birpc: 2.4.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 dts-resolver: 2.1.1 get-tsconfig: 4.10.1 rolldown: 1.0.0-beta.23 @@ -15124,7 +15310,7 @@ snapshots: '@babel/types': 7.28.0 ast-kit: 2.1.1 birpc: 2.4.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 dts-resolver: 2.1.1 get-tsconfig: 4.10.1 rolldown: 1.0.0-beta.23 @@ -15209,7 +15395,7 @@ snapshots: router@2.2.0: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -15282,7 +15468,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -15721,17 +15907,17 @@ snapshots: dependencies: typescript: 5.7.3 - tsdown@0.12.9(supports-color@8.1.1)(typescript@5.8.3): + tsdown@0.12.9(typescript@5.8.3): dependencies: ansis: 4.1.0 cac: 6.7.14 chokidar: 4.0.3 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 rolldown: 1.0.0-beta.23 - rolldown-plugin-dts: 0.13.13(rolldown@1.0.0-beta.23)(supports-color@8.1.1)(typescript@5.8.3) + rolldown-plugin-dts: 0.13.13(rolldown@1.0.0-beta.23)(typescript@5.8.3) semver: 7.7.4 tinyexec: 1.0.4 tinyglobby: 0.2.15 @@ -15749,7 +15935,7 @@ snapshots: ansis: 4.1.0 cac: 6.7.14 chokidar: 4.0.3 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c8af0b1f4..aec5e43f7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -47,10 +47,10 @@ catalog: "@modelcontextprotocol/server": 2.0.0 "@radix-ui/react-accordion": ^1.2.20 "@radix-ui/react-slot": ^1.2.3 - "@sentry/cloudflare": 11.0.0-rc.0 - "@sentry/core": 11.0.0-rc.0 - "@sentry/node": 11.0.0-rc.0 - "@sentry/react": 11.0.0-rc.0 + "@sentry/cloudflare": 11.1.0 + "@sentry/core": 11.1.0 + "@sentry/node": 11.1.0 + "@sentry/react": 11.1.0 "@sentry/vite-plugin": ^4.6.1 "@tailwindcss/typography": ^0.5.16 "@tailwindcss/vite": ^4.3.3 @@ -99,16 +99,16 @@ minimumReleaseAgeExclude: - '@ai-sdk/react@3.0.232' - ai@6.0.230 - agents@0.20.1 - - '@sentry/browser-utils@11.0.0-rc.0' - - '@sentry/browser@11.0.0-rc.0' - - '@sentry/bundler-plugins@11.0.0-rc.0' - - '@sentry/cloudflare@11.0.0-rc.0' - - '@sentry/core@11.0.0-rc.0' - - '@sentry/feedback@11.0.0-rc.0' - - '@sentry/node@11.0.0-rc.0' - - '@sentry/opentelemetry@11.0.0-rc.0' - - '@sentry/react@11.0.0-rc.0' - - '@sentry/replay-canvas@11.0.0-rc.0' - - '@sentry/replay@11.0.0-rc.0' - - '@sentry/server-runtime-injection@11.0.0-rc.0' - - '@sentry/server-utils@11.0.0-rc.0' + - '@sentry/browser-utils@11.1.0' + - '@sentry/browser@11.1.0' + - '@sentry/bundler-plugins@11.1.0' + - '@sentry/cloudflare@11.1.0' + - '@sentry/core@11.1.0' + - '@sentry/feedback@11.1.0' + - '@sentry/node@11.1.0' + - '@sentry/opentelemetry@11.1.0' + - '@sentry/react@11.1.0' + - '@sentry/replay-canvas@11.1.0' + - '@sentry/replay@11.1.0' + - '@sentry/server-runtime-injection@11.1.0' + - '@sentry/server-utils@11.1.0'