@spotlightjs/spotlight 4.7.1 → 4.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_sentry-release-injection-file.js +2 -2
- package/dist/node_modules/.pnpm/uri-js@4.4.1/node_modules/uri-js/dist/es5/uri.all.js +17 -17
- package/dist/node_modules/.pnpm/uri-js@4.4.1/node_modules/uri-js/dist/es5/uri.all.js.map +1 -1
- package/dist/run.js +3 -3
- package/dist/run.js.map +1 -1
- package/dist/sentry-config.js +2 -2
- package/dist/server/cli/run.js +2 -2
- package/dist/server/cli.js +2 -2
- package/dist/server/formatters/human/utils.js +9 -4
- package/dist/server/formatters/human/utils.js.map +1 -1
- package/dist/server/mcp/mcp.js +2 -2
- package/dist/ui/assets/index.js +64 -64
- package/dist/ui/assets/index.js.map +1 -1
- package/dist/ui/assets/instrumentation.js +2 -2
- package/dist/ui/assets/main.css +1 -1
- package/dist/ui/assets/main.js +1 -1
- package/dist/ui/assets/serverTimingMeta.js +11 -11
- package/dist/ui/assets/serverTimingMeta.js.map +1 -1
- package/package.json +6 -2
package/dist/server/cli/run.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
!function() {
|
|
3
3
|
try {
|
|
4
4
|
var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
|
|
5
|
-
n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "
|
|
5
|
+
n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "d80c232c-dfe0-4e60-8770-34fe04e96b35", e._sentryDebugIdIdentifier = "sentry-dbid-d80c232c-dfe0-4e60-8770-34fe04e96b35");
|
|
6
6
|
} catch (e2) {
|
|
7
7
|
}
|
|
8
8
|
}();
|
|
@@ -24,7 +24,7 @@ import "node:dns/promises";
|
|
|
24
24
|
import "node:net";
|
|
25
25
|
import "node:os";
|
|
26
26
|
import tail from "./tail.js";
|
|
27
|
-
const SPOTLIGHT_VERSION = "4.7.
|
|
27
|
+
const SPOTLIGHT_VERSION = "4.7.2";
|
|
28
28
|
const LOCALHOST_HOST = "localhost";
|
|
29
29
|
const DOCKER_HOST = "host.docker.internal";
|
|
30
30
|
function detectPackageJson() {
|
package/dist/server/cli.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
!function() {
|
|
3
3
|
try {
|
|
4
4
|
var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
|
|
5
|
-
n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "
|
|
5
|
+
n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "2fc3f6e8-14bb-49cb-b7d3-76d936f1e359", e._sentryDebugIdIdentifier = "sentry-dbid-2fc3f6e8-14bb-49cb-b7d3-76d936f1e359");
|
|
6
6
|
} catch (e2) {
|
|
7
7
|
}
|
|
8
8
|
}();
|
|
@@ -122,7 +122,7 @@ async function main({
|
|
|
122
122
|
if (debug || process.env.SPOTLIGHT_DEBUG) {
|
|
123
123
|
enableDebugLogging(true);
|
|
124
124
|
}
|
|
125
|
-
const spotlightVersion = "4.7.
|
|
125
|
+
const spotlightVersion = "4.7.2";
|
|
126
126
|
logger.info(`Spotlight by Sentry - v${spotlightVersion}`);
|
|
127
127
|
metrics.count("cli.invocation", 1, {
|
|
128
128
|
attributes: {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
!function() {
|
|
3
3
|
try {
|
|
4
4
|
var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
|
|
5
|
-
n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "
|
|
5
|
+
n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "96ff0e30-b12a-49d5-bf7e-38c6d90d3026", e._sentryDebugIdIdentifier = "sentry-dbid-96ff0e30-b12a-49d5-bf7e-38c6d90d3026");
|
|
6
6
|
} catch (e2) {
|
|
7
7
|
}
|
|
8
8
|
}();
|
|
@@ -11,10 +11,15 @@ import { parseBrowserFromUserAgent } from "../../routes/stream/userAgent.js";
|
|
|
11
11
|
import "../../../_virtual/_sentry-release-injection-file.js";
|
|
12
12
|
const SOURCE_TYPES = ["browser", "mobile", "server"];
|
|
13
13
|
const LOG_LEVELS = ["error", "warning", "log", "info", "trace", "debug"];
|
|
14
|
+
const SENTINEL = {
|
|
15
|
+
yellow: "#FDB81B",
|
|
16
|
+
blue: "#226DFC",
|
|
17
|
+
magenta: "#FF45A8"
|
|
18
|
+
};
|
|
14
19
|
const SOURCE_COLORS = {
|
|
15
|
-
browser: chalk.yellow,
|
|
16
|
-
mobile: chalk.blue,
|
|
17
|
-
server: chalk.magenta
|
|
20
|
+
browser: chalk.hex(SENTINEL.yellow),
|
|
21
|
+
mobile: chalk.hex(SENTINEL.blue),
|
|
22
|
+
server: chalk.hex(SENTINEL.magenta)
|
|
18
23
|
};
|
|
19
24
|
const LOG_LEVEL_COLORS = {
|
|
20
25
|
error: chalk.red.bold,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../src/server/formatters/human/utils.ts"],"sourcesContent":["import type { Envelope } from \"@sentry/core\";\nimport chalk from \"chalk\";\nimport { parseBrowserFromUserAgent } from \"../../routes/stream/userAgent.ts\";\n\nexport const SOURCE_TYPES = [\"browser\", \"mobile\", \"server\"] as const;\nexport type SourceType = (typeof SOURCE_TYPES)[number];\n\nexport const LOG_LEVELS = [\"error\", \"warning\", \"log\", \"info\", \"trace\", \"debug\"] as const;\nexport type LogLevel = (typeof LOG_LEVELS)[number];\n\nexport const SOURCE_COLORS: Record<SourceType, (text: string) => string> = {\n browser: chalk.yellow,\n mobile: chalk.blue,\n server: chalk.magenta,\n};\n\nexport const LOG_LEVEL_COLORS: Record<LogLevel, (text: string) => string> = {\n error: chalk.red.bold,\n warning: chalk.hex(\"#FFA500\"), // Orange\n log: chalk.white,\n info: chalk.cyan,\n trace: chalk.green,\n debug: chalk.dim,\n};\n\n/**\n * Helper to detect if a User-Agent string is from a browser\n */\nfunction isBrowserUserAgent(userAgent: string): boolean {\n const parsed = parseBrowserFromUserAgent(userAgent);\n return (\n parsed !== \"unknown\" &&\n (parsed.includes(\"Chrome\") || parsed.includes(\"Firefox\") || parsed.includes(\"Safari\") || parsed.includes(\"Edge\"))\n );\n}\n\n/**\n * Infer the source of an envelope as browser, mobile, or server using multiple signals\n * Priority order:\n * 1. Sender User-Agent (from HTTP request header)\n * 2. Platform & Runtime tags (from event payload)\n * 3. SDK name (fallback)\n *\n * Rules based on https://release-registry.services.sentry.io/sdks\n */\nexport function inferEnvelopeSource(envelopeHeader: Envelope[0], event?: any): SourceType {\n const sdkName = envelopeHeader?.sdk?.name || \"\";\n\n // 1. Mobile check (unchanged - already reliable from SDK name)\n // Mobile: Native mobile platforms and frameworks\n if (\n sdkName.includes(\"cocoa\") ||\n sdkName.includes(\"android\") ||\n sdkName.includes(\"react-native\") ||\n sdkName.includes(\"flutter\") ||\n sdkName.includes(\"capacitor\") ||\n sdkName.includes(\"cordova\") ||\n sdkName.includes(\"xamarin\") ||\n sdkName.includes(\"maui\") ||\n sdkName.includes(\"unity\") ||\n sdkName.includes(\"kotlin.kmp\")\n ) {\n return \"mobile\";\n }\n\n // 2. Sender User-Agent check\n const senderUserAgent = (envelopeHeader as any).__spotlight_sender_user_agent;\n if (senderUserAgent && typeof senderUserAgent === \"string\") {\n if (isBrowserUserAgent(senderUserAgent)) {\n return \"browser\";\n }\n // Server SDKs send server UAs like \"Node.js/*\", \"Python-urllib/*\", etc.\n // If we have a non-browser UA, we continue to further checks\n }\n\n // 3. Runtime tags check\n if (event?.tags?.runtime === \"browser\") {\n return \"browser\";\n }\n\n // 4. Platform & server-specific signals\n if (event?.contexts?.runtime?.name) {\n // Runtime context (node, CPython, etc.) indicates server\n return \"server\";\n }\n\n if (event?.server_name) {\n // server_name is a server-specific field\n return \"server\";\n }\n\n const platform = event?.platform;\n if (\n platform === \"node\" ||\n platform === \"python\" ||\n platform === \"ruby\" ||\n platform === \"php\" ||\n platform === \"java\" ||\n platform === \"go\" ||\n platform === \"rust\" ||\n platform === \"perl\" ||\n platform === \"elixir\" ||\n platform === \"csharp\" ||\n platform === \"dotnet\"\n ) {\n return \"server\";\n }\n\n // 5. SDK name check (existing logic as fallback)\n // Browser: JavaScript frameworks/libraries (excluding server/native runtimes and meta-frameworks)\n if (\n sdkName.startsWith(\"sentry.javascript.\") &&\n !sdkName.includes(\"node\") &&\n !sdkName.includes(\"bun\") &&\n !sdkName.includes(\"deno\") &&\n !sdkName.includes(\"electron\") &&\n !sdkName.includes(\"serverless\") &&\n !sdkName.includes(\"cloudflare\") &&\n !sdkName.includes(\"vercel-edge\") &&\n !sdkName.includes(\"wasm\") &&\n !sdkName.includes(\"opentelemetry\") &&\n !sdkName.includes(\"nextjs\") &&\n !sdkName.includes(\"remix\") &&\n !sdkName.includes(\"gatsby\") &&\n !sdkName.includes(\"astro\") &&\n !sdkName.includes(\"nuxt\") &&\n !sdkName.includes(\"sveltekit\") &&\n !sdkName.includes(\"solidstart\") &&\n !sdkName.includes(\"nestjs\") &&\n !sdkName.includes(\"tanstackstart\")\n ) {\n return \"browser\";\n }\n\n // Special case: Blazor WebAssembly runs in browser\n if (sdkName.includes(\"blazor.webassembly\")) {\n return \"browser\";\n }\n\n // Server: Everything else (node, python, ruby, go, php, java, dotnet, etc.)\n return \"server\";\n}\n\n/**\n * Format timestamp as local time HH:MM:SS\n */\nexport function formatLocalTime(timestamp?: number | string): string {\n let date: Date;\n\n if (!timestamp) {\n date = new Date();\n } else if (typeof timestamp === \"string\") {\n // Handle ISO string format (e.g., \"2023-11-22T16:23:50.406684Z\")\n date = new Date(timestamp);\n } else {\n // Handle Unix timestamp\n date = new Date(timestamp * 1000);\n }\n\n if (Number.isNaN(date.getTime())) {\n // placeholder with same width as valid timestamp for alignment in the logs\n return \"??:??:??\";\n }\n\n const hours = date.getHours().toString().padStart(2, \"0\");\n const minutes = date.getMinutes().toString().padStart(2, \"0\");\n const seconds = date.getSeconds().toString().padStart(2, \"0\");\n return `${hours}:${minutes}:${seconds}`;\n}\n\n/**\n * Padding helper for vertical alignment\n */\nexport function padLabel(label: string, width: number): string {\n return label.padEnd(width);\n}\n\n// Constants for consistent padding (adding brackets)\nexport const SOURCE_WIDTH = Math.max(...SOURCE_TYPES.map(s => `[${s.toUpperCase()}]`.length));\nexport const TYPE_WIDTH = Math.max(...LOG_LEVELS.map(l => `[${l.toUpperCase()}]`.length));\n\n/**\n * Colorize time with dim gray\n */\nexport function colorizeTime(time: string): string {\n return chalk.gray(time);\n}\n\n/**\n * Colorize source based on envelope source\n */\nexport function colorizeSource(source: string): string {\n const bracketed = `[${source}]`;\n const padded = padLabel(bracketed, SOURCE_WIDTH);\n const colorFn = SOURCE_COLORS[source as SourceType] || chalk.white;\n return colorFn(padded);\n}\n\n/**\n * Colorize event type\n */\nexport function colorizeType(type: string): string {\n const bracketed = `[${type.toUpperCase()}]`;\n const padded = padLabel(bracketed, TYPE_WIDTH);\n const colorFn = LOG_LEVEL_COLORS[type.toLowerCase() as LogLevel] || chalk.white;\n return colorFn(padded);\n}\n\n/**\n * Format a complete log line with proper alignment and colors\n */\nexport function formatLogLine(\n timestamp: number | string | undefined,\n source: SourceType,\n type: string,\n message: string,\n): string {\n const time = colorizeTime(formatLocalTime(timestamp));\n const coloredSource = colorizeSource(source);\n const coloredType = colorizeType(type);\n\n return `${time} ${coloredType} ${coloredSource} ${message}`;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/server/formatters/human/utils.ts"],"sourcesContent":["import type { Envelope } from \"@sentry/core\";\nimport chalk from \"chalk\";\nimport { parseBrowserFromUserAgent } from \"../../routes/stream/userAgent.ts\";\n\nexport const SOURCE_TYPES = [\"browser\", \"mobile\", \"server\"] as const;\nexport type SourceType = (typeof SOURCE_TYPES)[number];\n\nexport const LOG_LEVELS = [\"error\", \"warning\", \"log\", \"info\", \"trace\", \"debug\"] as const;\nexport type LogLevel = (typeof LOG_LEVELS)[number];\n\n/**\n * Sentinel theme terminal colors\n * Based on https://github.com/getsentry/sentinel\n */\nconst SENTINEL = {\n red: \"#fe4144\",\n green: \"#83da90\",\n yellow: \"#FDB81B\",\n blue: \"#226DFC\",\n magenta: \"#FF45A8\",\n white: \"#f9f8f9\",\n muted: \"#898294\",\n} as const;\n\nexport const SOURCE_COLORS: Record<SourceType, (text: string) => string> = {\n browser: chalk.hex(SENTINEL.yellow),\n mobile: chalk.hex(SENTINEL.blue),\n server: chalk.hex(SENTINEL.magenta),\n};\n\nexport const LOG_LEVEL_COLORS: Record<LogLevel, (text: string) => string> = {\n error: chalk.red.bold,\n warning: chalk.hex(\"#FFA500\"), // Orange\n log: chalk.white,\n info: chalk.cyan,\n trace: chalk.green,\n debug: chalk.dim,\n};\n\n/**\n * Helper to detect if a User-Agent string is from a browser\n */\nfunction isBrowserUserAgent(userAgent: string): boolean {\n const parsed = parseBrowserFromUserAgent(userAgent);\n return (\n parsed !== \"unknown\" &&\n (parsed.includes(\"Chrome\") || parsed.includes(\"Firefox\") || parsed.includes(\"Safari\") || parsed.includes(\"Edge\"))\n );\n}\n\n/**\n * Infer the source of an envelope as browser, mobile, or server using multiple signals\n * Priority order:\n * 1. Sender User-Agent (from HTTP request header)\n * 2. Platform & Runtime tags (from event payload)\n * 3. SDK name (fallback)\n *\n * Rules based on https://release-registry.services.sentry.io/sdks\n */\nexport function inferEnvelopeSource(envelopeHeader: Envelope[0], event?: any): SourceType {\n const sdkName = envelopeHeader?.sdk?.name || \"\";\n\n // 1. Mobile check (unchanged - already reliable from SDK name)\n // Mobile: Native mobile platforms and frameworks\n if (\n sdkName.includes(\"cocoa\") ||\n sdkName.includes(\"android\") ||\n sdkName.includes(\"react-native\") ||\n sdkName.includes(\"flutter\") ||\n sdkName.includes(\"capacitor\") ||\n sdkName.includes(\"cordova\") ||\n sdkName.includes(\"xamarin\") ||\n sdkName.includes(\"maui\") ||\n sdkName.includes(\"unity\") ||\n sdkName.includes(\"kotlin.kmp\")\n ) {\n return \"mobile\";\n }\n\n // 2. Sender User-Agent check\n const senderUserAgent = (envelopeHeader as any).__spotlight_sender_user_agent;\n if (senderUserAgent && typeof senderUserAgent === \"string\") {\n if (isBrowserUserAgent(senderUserAgent)) {\n return \"browser\";\n }\n // Server SDKs send server UAs like \"Node.js/*\", \"Python-urllib/*\", etc.\n // If we have a non-browser UA, we continue to further checks\n }\n\n // 3. Runtime tags check\n if (event?.tags?.runtime === \"browser\") {\n return \"browser\";\n }\n\n // 4. Platform & server-specific signals\n if (event?.contexts?.runtime?.name) {\n // Runtime context (node, CPython, etc.) indicates server\n return \"server\";\n }\n\n if (event?.server_name) {\n // server_name is a server-specific field\n return \"server\";\n }\n\n const platform = event?.platform;\n if (\n platform === \"node\" ||\n platform === \"python\" ||\n platform === \"ruby\" ||\n platform === \"php\" ||\n platform === \"java\" ||\n platform === \"go\" ||\n platform === \"rust\" ||\n platform === \"perl\" ||\n platform === \"elixir\" ||\n platform === \"csharp\" ||\n platform === \"dotnet\"\n ) {\n return \"server\";\n }\n\n // 5. SDK name check (existing logic as fallback)\n // Browser: JavaScript frameworks/libraries (excluding server/native runtimes and meta-frameworks)\n if (\n sdkName.startsWith(\"sentry.javascript.\") &&\n !sdkName.includes(\"node\") &&\n !sdkName.includes(\"bun\") &&\n !sdkName.includes(\"deno\") &&\n !sdkName.includes(\"electron\") &&\n !sdkName.includes(\"serverless\") &&\n !sdkName.includes(\"cloudflare\") &&\n !sdkName.includes(\"vercel-edge\") &&\n !sdkName.includes(\"wasm\") &&\n !sdkName.includes(\"opentelemetry\") &&\n !sdkName.includes(\"nextjs\") &&\n !sdkName.includes(\"remix\") &&\n !sdkName.includes(\"gatsby\") &&\n !sdkName.includes(\"astro\") &&\n !sdkName.includes(\"nuxt\") &&\n !sdkName.includes(\"sveltekit\") &&\n !sdkName.includes(\"solidstart\") &&\n !sdkName.includes(\"nestjs\") &&\n !sdkName.includes(\"tanstackstart\")\n ) {\n return \"browser\";\n }\n\n // Special case: Blazor WebAssembly runs in browser\n if (sdkName.includes(\"blazor.webassembly\")) {\n return \"browser\";\n }\n\n // Server: Everything else (node, python, ruby, go, php, java, dotnet, etc.)\n return \"server\";\n}\n\n/**\n * Format timestamp as local time HH:MM:SS\n */\nexport function formatLocalTime(timestamp?: number | string): string {\n let date: Date;\n\n if (!timestamp) {\n date = new Date();\n } else if (typeof timestamp === \"string\") {\n // Handle ISO string format (e.g., \"2023-11-22T16:23:50.406684Z\")\n date = new Date(timestamp);\n } else {\n // Handle Unix timestamp\n date = new Date(timestamp * 1000);\n }\n\n if (Number.isNaN(date.getTime())) {\n // placeholder with same width as valid timestamp for alignment in the logs\n return \"??:??:??\";\n }\n\n const hours = date.getHours().toString().padStart(2, \"0\");\n const minutes = date.getMinutes().toString().padStart(2, \"0\");\n const seconds = date.getSeconds().toString().padStart(2, \"0\");\n return `${hours}:${minutes}:${seconds}`;\n}\n\n/**\n * Padding helper for vertical alignment\n */\nexport function padLabel(label: string, width: number): string {\n return label.padEnd(width);\n}\n\n// Constants for consistent padding (adding brackets)\nexport const SOURCE_WIDTH = Math.max(...SOURCE_TYPES.map(s => `[${s.toUpperCase()}]`.length));\nexport const TYPE_WIDTH = Math.max(...LOG_LEVELS.map(l => `[${l.toUpperCase()}]`.length));\n\n/**\n * Colorize time with dim gray\n */\nexport function colorizeTime(time: string): string {\n return chalk.gray(time);\n}\n\n/**\n * Colorize source based on envelope source\n */\nexport function colorizeSource(source: string): string {\n const bracketed = `[${source}]`;\n const padded = padLabel(bracketed, SOURCE_WIDTH);\n const colorFn = SOURCE_COLORS[source as SourceType] || chalk.white;\n return colorFn(padded);\n}\n\n/**\n * Colorize event type\n */\nexport function colorizeType(type: string): string {\n const bracketed = `[${type.toUpperCase()}]`;\n const padded = padLabel(bracketed, TYPE_WIDTH);\n const colorFn = LOG_LEVEL_COLORS[type.toLowerCase() as LogLevel] || chalk.white;\n return colorFn(padded);\n}\n\n/**\n * Format a complete log line with proper alignment and colors\n */\nexport function formatLogLine(\n timestamp: number | string | undefined,\n source: SourceType,\n type: string,\n message: string,\n): string {\n const time = colorizeTime(formatLocalTime(timestamp));\n const coloredSource = colorizeSource(source);\n const coloredType = colorizeType(type);\n\n return `${time} ${coloredType} ${coloredSource} ${message}`;\n}\n"],"names":[],"mappings":"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"}
|
package/dist/server/mcp/mcp.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
!function() {
|
|
3
3
|
try {
|
|
4
4
|
var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
|
|
5
|
-
n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "
|
|
5
|
+
n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "cfc20e89-a00d-417d-82ac-ae68b723eab0", e._sentryDebugIdIdentifier = "sentry-dbid-cfc20e89-a00d-417d-82ac-ae68b723eab0");
|
|
6
6
|
} catch (e2) {
|
|
7
7
|
}
|
|
8
8
|
}();
|
|
@@ -58,7 +58,7 @@ function createMCPInstance() {
|
|
|
58
58
|
const mcp = wrapMcpServerWithSentry(
|
|
59
59
|
new McpServer({
|
|
60
60
|
name: "spotlight-mcp",
|
|
61
|
-
version: String("4.7.
|
|
61
|
+
version: String("4.7.2")
|
|
62
62
|
})
|
|
63
63
|
);
|
|
64
64
|
mcp.registerTool(
|