diff --git a/apps/backend/src/app/api/latest/internal/local-emulator/project/route.tsx b/apps/backend/src/app/api/latest/internal/local-emulator/project/route.tsx index 5e13731498..9834455aa7 100644 --- a/apps/backend/src/app/api/latest/internal/local-emulator/project/route.tsx +++ b/apps/backend/src/app/api/latest/internal/local-emulator/project/route.tsx @@ -12,7 +12,7 @@ import { import { DEFAULT_BRANCH_ID, getSoleTenancyFromProjectBranch } from "@/lib/tenancies"; import { getPrismaClientForTenancy, globalPrismaClient } from "@/prisma-client"; import { createSmartRouteHandler } from "@/route-handlers/smart-route-handler"; -import { clientOrHigherAuthTypeSchema, yupNumber, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields"; +import { clientOrHigherAuthTypeSchema, yupArray, yupNumber, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields"; import { generateSecureRandomString } from "@stackframe/stack-shared/dist/utils/crypto"; import { StackAssertionError, StatusError } from "@stackframe/stack-shared/dist/utils/errors"; import { generateUuid } from "@stackframe/stack-shared/dist/utils/uuids"; @@ -23,6 +23,14 @@ type LocalEmulatorProjectMappingRow = { projectId: string, }; +function deriveDisplayLabel(absoluteFilePath: string): string { + const base = path.basename(absoluteFilePath); + if (base.toLowerCase() === "stack.config.ts") { + return path.basename(path.dirname(absoluteFilePath)) || base; + } + return base; +} + async function assertLocalEmulatorOwnerTeamReadiness() { const internalTenancy = await getSoleTenancyFromProjectBranch("internal", DEFAULT_BRANCH_ID); const internalPrisma = await getPrismaClientForTenancy(internalTenancy); @@ -76,7 +84,7 @@ async function getOrCreateLocalEmulatorProjectId(absoluteFilePath: string): Prom update: {}, create: { id: projectId, - displayName: `Local Emulator: ${path.basename(absoluteFilePath) || "Project"}`, + displayName: `Local Emulator: ${deriveDisplayLabel(absoluteFilePath) || "Project"}`, description: `Local emulator project for ${absoluteFilePath}`, isProductionMode: false, ownerTeamId: LOCAL_EMULATOR_OWNER_TEAM_ID, @@ -211,14 +219,30 @@ export const POST = createSmartRouteHandler({ if (!isLocalEmulatorEnabled()) { throw new StatusError(StatusError.BadRequest, LOCAL_EMULATOR_ONLY_ENDPOINT_MESSAGE); } - if (!path.isAbsolute(req.body.absolute_file_path)) { - throw new StatusError(StatusError.BadRequest, "absolute_file_path must be an absolute path."); + if (!path.posix.isAbsolute(req.body.absolute_file_path)) { + const looksWindows = path.win32.isAbsolute(req.body.absolute_file_path); + throw new StatusError( + StatusError.BadRequest, + looksWindows + ? "absolute_file_path must be a POSIX absolute path. The local emulator runs in a Linux VM and does not accept Windows-style paths. Use the in-VM path or run the emulator from WSL." + : "absolute_file_path must be an absolute path.", + ); } - const absoluteFilePath = path.resolve(req.body.absolute_file_path); - const resolvedFilePath = resolveEmulatorPath(absoluteFilePath); + const inputPath = path.resolve(req.body.absolute_file_path); + let inputStat; + try { + inputStat = await fs.stat(resolveEmulatorPath(inputPath)); + } catch { + inputStat = undefined; + } + + const looksLikeConfigFile = /\.(ts|js|mjs)$/i.test(inputPath); + const absoluteFilePath = (inputStat?.isDirectory() || (!inputStat && !looksLikeConfigFile)) + ? path.join(inputPath, "stack.config.ts") + : inputPath; - // Validate file exists before creating a project + const resolvedFilePath = resolveEmulatorPath(absoluteFilePath); let fileExists: boolean; try { await fs.access(resolvedFilePath); @@ -227,13 +251,13 @@ export const POST = createSmartRouteHandler({ fileExists = false; } if (!fileExists) { - throw new StatusError(StatusError.BadRequest, `Config file not found: ${absoluteFilePath}`); - } - - // If the file is empty, write a default config - const fileContent = await fs.readFile(resolvedFilePath, "utf-8"); - if (fileContent.trim() === "") { await writeConfigToFile(absoluteFilePath, {}); + } else { + // If the file is empty, write a default config. + const fileContent = await fs.readFile(resolvedFilePath, "utf-8"); + if (fileContent.trim() === "") { + await writeConfigToFile(absoluteFilePath, {}); + } } await assertLocalEmulatorOwnerTeamReadiness(); @@ -255,3 +279,71 @@ export const POST = createSmartRouteHandler({ }; }, }); + +type LocalEmulatorProjectListRow = { + projectId: string, + absoluteFilePath: string, + updatedAt: Date, +}; + +export const GET = createSmartRouteHandler({ + metadata: { + hidden: true, + summary: "List recent local emulator projects", + description: "Returns previously opened local emulator project mappings, most-recent first.", + tags: ["Local Emulator"], + }, + request: yupObject({ + auth: yupObject({ + type: clientOrHigherAuthTypeSchema.defined(), + project: yupObject({ + id: yupString().oneOf(["internal"]).defined(), + }).defined(), + }).defined(), + method: yupString().oneOf(["GET"]).defined(), + }), + response: yupObject({ + statusCode: yupNumber().oneOf([200]).defined(), + bodyType: yupString().oneOf(["json"]).defined(), + body: yupObject({ + projects: yupArray(yupObject({ + project_id: yupString().defined(), + absolute_file_path: yupString().defined(), + display_name: yupString().defined(), + }).defined()).defined(), + }).defined(), + }), + handler: async () => { + if (!isLocalEmulatorEnabled()) { + throw new StatusError(StatusError.BadRequest, LOCAL_EMULATOR_ONLY_ENDPOINT_MESSAGE); + } + + const rows = await globalPrismaClient.$queryRaw(Prisma.sql` + SELECT "projectId", "absoluteFilePath", "updatedAt" + FROM "LocalEmulatorProject" + ORDER BY "updatedAt" DESC + LIMIT 20 + `); + + const projectIds = rows.map((r) => r.projectId); + const projects = projectIds.length > 0 + ? await globalPrismaClient.project.findMany({ + where: { id: { in: projectIds } }, + select: { id: true, displayName: true }, + }) + : []; + const displayNameById = new Map(projects.map((p) => [p.id, p.displayName])); + + return { + statusCode: 200 as const, + bodyType: "json" as const, + body: { + projects: rows.map((r) => ({ + project_id: r.projectId, + absolute_file_path: r.absoluteFilePath, + display_name: displayNameById.get(r.projectId) ?? deriveDisplayLabel(r.absoluteFilePath), + })), + }, + }; + }, +}); diff --git a/apps/dashboard/src/app/(main)/(protected)/(outside-dashboard)/projects/page-client.tsx b/apps/dashboard/src/app/(main)/(protected)/(outside-dashboard)/projects/page-client.tsx index b8e3cdbfa1..0fd61a6107 100644 --- a/apps/dashboard/src/app/(main)/(protected)/(outside-dashboard)/projects/page-client.tsx +++ b/apps/dashboard/src/app/(main)/(protected)/(outside-dashboard)/projects/page-client.tsx @@ -66,6 +66,8 @@ export default function PageClient() { const [openConfigFileDialog, setOpenConfigFileDialog] = useState(false); const [absoluteConfigFilePath, setAbsoluteConfigFilePath] = useState(""); const [openingConfigFile, setOpeningConfigFile] = useState(false); + const [recentConfigProjects, setRecentConfigProjects] = useState>([]); + const [recentConfigProjectsError, setRecentConfigProjectsError] = useState(false); const [projectStatuses, setProjectStatuses] = useState>(new Map()); const [loadingProjectStatuses, setLoadingProjectStatuses] = useState(true); const [projectDau, setProjectDau] = useState>(new Map()); @@ -157,17 +159,77 @@ export default function PageClient() { }; }, [appInternals, rawProjects.length]); + useEffect(() => { + if (!openConfigFileDialog || !isLocalEmulator) return; + let cancelled = false; + setRecentConfigProjectsError(false); + runAsynchronously(async () => { + try { + const response = await appInternals.sendRequest("/internal/local-emulator/project", { method: "GET" }, "client"); + if (!response.ok) { + if (!cancelled) { + setRecentConfigProjects([]); + setRecentConfigProjectsError(true); + } + return; + } + const body = await response.json() as { projects?: unknown }; + if (cancelled) return; + if (!Array.isArray(body.projects)) { + throw new Error("Invalid recent-projects payload"); + } + const parsed = body.projects.map((p: unknown): { project_id: string, absolute_file_path: string, display_name: string } => { + if ( + !p || typeof p !== "object" + || typeof (p as Record).project_id !== "string" + || typeof (p as Record).absolute_file_path !== "string" + || typeof (p as Record).display_name !== "string" + ) { + throw new Error("Invalid recent-projects payload"); + } + const r = p as Record; + return { project_id: r.project_id, absolute_file_path: r.absolute_file_path, display_name: r.display_name }; + }); + setRecentConfigProjects(parsed); + } catch { + if (!cancelled) { + setRecentConfigProjects([]); + setRecentConfigProjectsError(true); + } + } + }); + return () => { + cancelled = true; + }; + }, [openConfigFileDialog, isLocalEmulator, appInternals]); + + const pathCopyTip = useMemo(() => { + const p = typeof navigator !== "undefined" ? navigator.platform : ""; + if (/Mac|iPhone|iPad|iPod/i.test(p)) { + return "Tip: in Finder, right-click the file → hold ⌥ Option → Copy as Pathname, then paste here."; + } + if (/Win/i.test(p)) { + return "Note: the emulator runs in a Linux VM and needs a POSIX path. From WSL, run `wslpath -a stack.config.ts` (or `realpath stack.config.ts`) and paste that here."; + } + return "Tip: from your project folder, run `realpath stack.config.ts` in a terminal."; + }, []); + const handleOpenConfigFile = async () => { const trimmedPath = absoluteConfigFilePath.trim(); if (trimmedPath.length === 0) { - throw new Error("Please enter an absolute config file path."); + toast({ description: "Please enter a path to your project or stack.config.ts.", variant: "destructive" }); + return; } - const hasUnixAbsolutePath = trimmedPath.startsWith("/"); - const hasWindowsAbsolutePath = /^[a-zA-Z]:[\\/]/.test(trimmedPath); - const hasWindowsUncPath = trimmedPath.startsWith("\\\\"); - if (!hasUnixAbsolutePath && !hasWindowsAbsolutePath && !hasWindowsUncPath) { - throw new Error("Config file path must be absolute."); + if (!trimmedPath.startsWith("/")) { + const looksWindows = /^[a-zA-Z]:[\\/]/.test(trimmedPath) || trimmedPath.startsWith("\\\\"); + toast({ + description: looksWindows + ? "The local emulator runs in a Linux VM and only accepts POSIX paths (e.g. /Users/you/project). Windows paths aren't supported — use WSL or the in-VM path." + : "The path must be absolute (e.g. /Users/you/project or /Users/you/project/stack.config.ts).", + variant: "destructive", + }); + return; } setOpeningConfigFile(true); @@ -188,19 +250,20 @@ export default function PageClient() { const responseBody = await response.json(); if (!response.ok) { + let message = "Couldn't open that path. Make sure it points to your project folder or a valid stack.config.ts."; if (typeof responseBody === "string" && responseBody.length > 0) { - throw new Error(responseBody); - } - if ( + message = responseBody; + } else if ( responseBody != null && typeof responseBody === "object" && "error" in responseBody && typeof responseBody.error === "string" && responseBody.error.length > 0 ) { - throw new Error(responseBody.error); + message = responseBody.error; } - throw new Error("Failed to open config file project in local emulator."); + toast({ description: message, variant: "destructive" }); + return; } if ( @@ -209,7 +272,8 @@ export default function PageClient() { !("project_id" in responseBody) || typeof responseBody.project_id !== "string" ) { - throw new Error("Local emulator endpoint returned an invalid response."); + toast({ description: "Local emulator endpoint returned an invalid response.", variant: "destructive" }); + return; } setOpenConfigFileDialog(false); @@ -217,6 +281,11 @@ export default function PageClient() { await appInternals.refreshOwnedProjects(); router.push(`/projects/${encodeURIComponent(responseBody.project_id)}`); await wait(2000); + } catch (e) { + toast({ + description: e instanceof Error ? e.message : "Something went wrong opening that project.", + variant: "destructive", + }); } finally { setOpeningConfigFile(false); } @@ -287,7 +356,7 @@ export default function PageClient() { router.push("/new-project"); return await wait(2000); }} - >{isLocalEmulator ? "Open config file" : "Create Project"} + >{isLocalEmulator ? "Open a project" : "Create Project"} @@ -303,24 +372,57 @@ export default function PageClient() { > - Open config file + Open your Stack Auth project
- Enter the absolute path to your local Stack config file. The local emulator will create or reuse the mapped project and open it in the dashboard. + Point the local dashboard at the stack.config.ts in your project. If you just ran stack init, it was created at the root of that project. + + + Don't have one yet? Paste your project folder path instead and we'll create stack.config.ts for you. + {recentConfigProjects.length > 0 && ( +
+ Recent +
+ {recentConfigProjects.map((p) => ( + + ))} +
+
+ )} + {recentConfigProjectsError && recentConfigProjects.length === 0 && ( + + Couldn't load recent projects. Paste a path below to continue. + + )} setAbsoluteConfigFilePath(event.target.value)} /> + + {pathCopyTip} +
- diff --git a/packages/stack-cli/package.json b/packages/stack-cli/package.json index ab5aad5e77..70dbe9ff8c 100644 --- a/packages/stack-cli/package.json +++ b/packages/stack-cli/package.json @@ -29,6 +29,7 @@ "dependencies": { "@anthropic-ai/claude-agent-sdk": "^0.2.73", "@inquirer/prompts": "^7.0.0", + "@sentry/node": "^10.42.0", "@stackframe/js": "workspace:*", "@stackframe/stack-shared": "workspace:*", "commander": "^13.1.0", diff --git a/packages/stack-cli/src/commands/emulator.ts b/packages/stack-cli/src/commands/emulator.ts index 6109027f26..8923ba10fd 100644 --- a/packages/stack-cli/src/commands/emulator.ts +++ b/packages/stack-cli/src/commands/emulator.ts @@ -255,6 +255,38 @@ async function startEmulator(arch: "arm64" | "amd64"): Promise { await runEmulator("start", { EMULATOR_ARCH: arch, STACK_EMULATOR_CLI_WROTE_ISO: "1" }); } +function printEmulatorWelcome(): void { + const dashboardPort = envPort("EMULATOR_DASHBOARD_PORT", DEFAULT_EMULATOR_DASHBOARD_PORT); + const backendPort = envPort("EMULATOR_BACKEND_PORT", DEFAULT_EMULATOR_BACKEND_PORT); + const inbucketPort = envPort("EMULATOR_INBUCKET_PORT", DEFAULT_EMULATOR_INBUCKET_PORT); + + console.log("\nEmulator is up.\n"); + console.log("The Stack Auth emulator runs a full local Stack Auth stack (backend, dashboard,"); + console.log("Postgres, Redis, MinIO, and a test mail server) inside a VM on your machine."); + console.log("It gives you an offline, disposable Stack Auth you can develop against — no"); + console.log("cloud account needed, and you can reset it any time.\n"); + console.log("Services:"); + console.log(` • Local dashboard http://localhost:${dashboardPort}`); + console.log(` • Backend API http://localhost:${backendPort}`); + console.log(` • Test inbox http://localhost:${inbucketPort} (catches all outbound email)`); + console.log(""); + console.log("Common commands:"); + console.log(" stack emulator status Check service health"); + console.log(" stack emulator stop Stop the VM (keeps data)"); + console.log(" stack emulator reset Wipe all state and start fresh"); + console.log(" stack emulator run Start the emulator, run , stop on exit"); + console.log(""); +} + +export function isEmulatorImageInstalled(arch?: "arm64" | "amd64"): boolean { + try { + const resolvedArch = arch ?? resolveArch(); + return existsSync(join(emulatorImageDir(), `stack-emulator-${resolvedArch}.qcow2`)); + } catch { + return false; + } +} + export function resolveArch(raw?: string): "arm64" | "amd64" { const arch = raw ?? (process.arch === "arm64" ? "arm64" : process.arch === "x64" ? "amd64" : null); if (arch === "arm64" || arch === "amd64") return arch; @@ -687,16 +719,23 @@ export function registerEmulatorCommand(program: Command) { } } + let freshlyStarted = false; if (isEmulatorRunning()) { console.warn("Emulator already running, reusing existing instance."); } else { await startEmulator(arch); + freshlyStarted = true; } if (resolvedConfigFile) { const pck = await readInternalPck(); const creds = await fetchEmulatorCredentials(pck, emulatorBackendPort(), resolvedConfigFile); console.log(JSON.stringify(creds, null, 2)); + return; + } + + if (freshlyStarted) { + printEmulatorWelcome(); } }); diff --git a/packages/stack-cli/src/commands/init.ts b/packages/stack-cli/src/commands/init.ts index 9053308566..2c378d24a2 100644 --- a/packages/stack-cli/src/commands/init.ts +++ b/packages/stack-cli/src/commands/init.ts @@ -12,16 +12,21 @@ import { isNonInteractiveEnv } from "../lib/interactive.js"; import { createInitPrompt } from "../lib/init-prompt.js"; import { createProjectInteractively } from "../lib/create-project.js"; import { runClaudeAgent } from "../lib/claude-agent.js"; +import { isEmulatorImageInstalled } from "./emulator.js"; import { detectImportPackageFromDir, renderConfigFileContent } from "@stackframe/stack-shared/dist/config-rendering"; import { throwErr } from "@stackframe/stack-shared/dist/utils/errors"; +const VALID_INIT_MODES = ["create", "create-cloud", "link-config", "link-cloud"] as const; +type InitMode = typeof VALID_INIT_MODES[number]; + type InitOptions = { - mode?: "create" | "create-cloud" | "link-config" | "link-cloud", + mode?: InitMode, apps?: string, configFile?: string, selectProjectId?: string, outputDir?: string, agent?: boolean, + displayName?: string, }; export function registerInitCommand(program: Command) { @@ -34,8 +39,12 @@ export function registerInitCommand(program: Command) { .option("--select-project-id ", "Project ID to link (for link-cloud mode)") .option("--output-dir ", "Directory to write output files (defaults to cwd)") .option("--no-agent", "Skip Claude agent and print setup instructions instead") + .option("--display-name ", "Project display name (used by create-cloud mode)") .action(async (opts: InitOptions) => { - const hasFlags = opts.mode != null; + if (opts.mode != null && !VALID_INIT_MODES.includes(opts.mode)) { + throw new CliError(`Invalid --mode: ${opts.mode}. Expected one of: ${VALID_INIT_MODES.join(", ")}.`); + } + const hasFlags = opts.mode != null || opts.configFile != null || opts.selectProjectId != null; if (!hasFlags && isNonInteractiveEnv()) { throw new CliError("stack init requires an interactive terminal. Use --mode flag for non-interactive usage."); @@ -91,7 +100,7 @@ async function runInit(program: Command, opts: InitOptions) { console.log("Welcome to Stack Auth!\n"); - let mode: "create" | "create-cloud" | "link" | "link-config" | "link-cloud"; + let mode: string; if (opts.mode) { mode = opts.mode; } else if (opts.selectProjectId) { @@ -99,54 +108,45 @@ async function runInit(program: Command, opts: InitOptions) { } else if (opts.configFile) { mode = "link-config"; } else { - const action = await select({ - message: "Would you like to link to an existing project, or create a new one?", + console.log("Creating a new Stack Auth project.\n"); + const localLabel = isEmulatorImageInstalled() + ? "Local (emulator already installed)" + : "Local (requires local emulator installation, ~1.3gb storage required)"; + const location = await select({ + message: "Where would you like to create the project?", choices: [ - { name: "Create a new project", value: "create" as const }, - { name: "Link an existing project", value: "link" as const }, + { name: "Stack Auth Cloud", value: "hosted" as const }, + { name: localLabel, value: "local" as const }, ], }); - - if (action === "link") { - mode = "link"; - } else { - const location = await select({ - message: "Where would you like to create the project?", - choices: [ - { name: "Stack Auth Cloud", value: "hosted" as const }, - { name: "Local (requires local emulator installation, ~1.3gb storage required)", value: "local" as const }, - ], - }); - mode = location === "local" ? "create" : "create-cloud"; - } + mode = location === "local" ? "create" : "create-cloud"; } let configPath: string | undefined; - - switch (mode) { - case "link": - case "link-config": - case "link-cloud": { - const result = await handleLink(flags, opts, outputDir, mode); - configPath = result.configPath; - break; - } - case "create": { - const result = await handleCreate(opts, outputDir); - configPath = result.configPath; - break; - } - case "create-cloud": { - const result = await handleCreateCloud(flags, opts, outputDir); - configPath = result.configPath; - break; - } + let projectId: string | undefined; + + if (mode === "link-config" || mode === "link-cloud") { + const result = await handleLink(flags, opts, outputDir, mode); + configPath = result.configPath; + projectId = result.projectId; + } else if (mode === "create") { + const result = await handleCreate(opts, outputDir); + configPath = result.configPath; + } else if (mode === "create-cloud") { + const result = await handleCreateCloud(flags, opts, outputDir); + configPath = result.configPath; + projectId = result.projectId; + } else { + throw new CliError(`Unknown mode: ${mode}`); } const initPrompt = createInitPrompt(false, configPath); const useAgent = opts.agent !== false && !isNonInteractiveEnv(); if (useAgent) { + console.log("\nRunning your coding agent to wire up Stack Auth."); + console.log("This also registers the Stack Auth MCP server (https://mcp.stack-auth.com)"); + console.log("so your agent can read the docs and answer Stack-specific questions going forward.\n"); const success = await runClaudeAgent({ prompt: `Execute ALL of the following setup steps in my project now. Do not ask questions — just detect the framework and package manager from existing files and proceed.\n\n${initPrompt}`, cwd: outputDir, @@ -158,26 +158,31 @@ async function runInit(program: Command, opts: InitOptions) { } else { console.log("\n" + initPrompt); } -} -async function handleLink(flags: Record, opts: InitOptions, outputDir: string, resolvedMode: "link" | "link-config" | "link-cloud"): Promise<{ configPath?: string }> { - let source: "config-file" | "cloud"; + const { dashboardUrl } = resolveLoginConfig(flags as { projectId?: string }); + printNextSteps({ mode, projectId, dashboardUrl }); +} - if (resolvedMode === "link-config") { - source = "config-file"; - } else if (resolvedMode === "link-cloud") { - source = "cloud"; - } else { - source = await select({ - message: "How would you like to link your project?", - choices: [ - { name: "Link from config file", value: "config-file" as const }, - { name: "Link from app.stack-auth.com", value: "cloud" as const }, - ], - }); +function printNextSteps(args: { mode: string, projectId?: string, dashboardUrl: string }) { + console.log("\nYou're all set! What's next:\n"); + console.log(" • Start your dev server, then visit /handler/sign-up to create a test user"); + console.log(" (and /handler/sign-in to log in). Drop into a page to see the session."); + + if (args.mode === "create") { + console.log(" • You're wired up to the local emulator. Start it in another terminal:"); + console.log(" npx @stackframe/stack-cli emulator start"); + console.log(" Local dashboard: http://localhost:26700"); + } else if (args.projectId) { + console.log(" • Manage this project in the dashboard:"); + console.log(` ${args.dashboardUrl}/projects/${encodeURIComponent(args.projectId)}`); } - if (source === "config-file") { + console.log(" • Docs: https://docs.stack-auth.com"); + console.log(""); +} + +async function handleLink(flags: Record, opts: InitOptions, outputDir: string, resolvedMode: "link-config" | "link-cloud"): Promise<{ configPath?: string, projectId?: string }> { + if (resolvedMode === "link-config") { return await handleLinkFromConfigFile(opts); } return await handleLinkFromCloud(flags, opts, outputDir); @@ -223,6 +228,7 @@ async function ensureLoggedInSession(flags: Record) { async function writeProjectKeysToEnv( project: { id: string, app: { createInternalApiKey: (opts: { description: string, expiresAt: Date, hasPublishableClientKey: boolean, hasSecretServerKey: boolean, hasSuperSecretAdminKey: boolean }) => Promise<{ publishableClientKey?: string | null, secretServerKey?: string | null }> } }, outputDir: string, + variant: "cloud" | "local" = "cloud", ) { const apiKey = await project.app.createInternalApiKey({ description: "Created by CLI init script", @@ -235,8 +241,16 @@ async function writeProjectKeysToEnv( const publishableClientKey = apiKey.publishableClientKey ?? throwErr("createInternalApiKey returned no publishableClientKey despite hasPublishableClientKey=true"); const secretServerKey = apiKey.secretServerKey ?? throwErr("createInternalApiKey returned no secretServerKey despite hasSecretServerKey=true"); + const header = variant === "local" + ? [ + "# Stack Auth — local emulator keys", + "# These credentials point at your local Stack Auth emulator, not a cloud project.", + "# They are only valid while the emulator is running (`stack emulator start`).", + ] + : ["# Stack Auth"]; + const envLines = [ - "# Stack Auth", + ...header, `NEXT_PUBLIC_STACK_PROJECT_ID=${project.id}`, `NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY=${publishableClientKey}`, `STACK_SECRET_SERVER_KEY=${secretServerKey}`, @@ -271,28 +285,34 @@ async function writeProjectKeysToEnv( } } -async function handleCreateCloud(flags: Record, opts: InitOptions, outputDir: string): Promise<{ configPath?: string }> { +async function handleCreateCloud(flags: Record, opts: InitOptions, outputDir: string): Promise<{ configPath?: string, projectId?: string }> { const sessionAuth = await ensureLoggedInSession(flags); const user = await getInternalUser(sessionAuth); + const { dashboardUrl } = resolveLoginConfig(flags as { projectId?: string }); const newProject = await createProjectInteractively(user, { + displayName: opts.displayName, defaultDisplayName: path.basename(outputDir), + dashboardUrl, }); console.log(`\nCreated project: ${newProject.displayName} (${newProject.id})\n`); await writeProjectKeysToEnv(newProject, outputDir); - return {}; + return { projectId: newProject.id }; } -async function handleLinkFromCloud(flags: Record, opts: InitOptions, outputDir: string): Promise<{ configPath?: string }> { +async function handleLinkFromCloud(flags: Record, opts: InitOptions, outputDir: string): Promise<{ configPath?: string, projectId?: string }> { const sessionAuth = await ensureLoggedInSession(flags); const user = await getInternalUser(sessionAuth); let projects = await user.listOwnedProjects(); let autoCreatedProjectId: string | null = null; if (projects.length === 0) { + if (opts.selectProjectId) { + throw new CliError(`Project '${opts.selectProjectId}' not found among your owned projects. Check the ID or omit --select-project-id to create a new project interactively.`); + } if (isNonInteractiveEnv()) { - throw new CliError("No projects found. Run `stack project create --display-name ` first, or set --select-project-id."); + throw new CliError("No projects found. Run `stack project create --display-name ` first."); } const shouldCreate = await confirm({ @@ -301,11 +321,14 @@ async function handleLinkFromCloud(flags: Record, opts: InitOpt }); if (!shouldCreate) { - throw new CliError("You don't own any projects. Create one at app.stack-auth.com or re-run and choose to create one."); + const { dashboardUrl } = resolveLoginConfig(flags as { projectId?: string }); + throw new CliError(`You don't own any projects. Create one at ${dashboardUrl} or re-run and choose to create one.`); } + const { dashboardUrl } = resolveLoginConfig(flags as { projectId?: string }); const newProject = await createProjectInteractively(user, { defaultDisplayName: path.basename(outputDir), + dashboardUrl, }); console.log(`\nCreated project: ${newProject.displayName} (${newProject.id})\n`); projects = [newProject]; @@ -331,9 +354,10 @@ async function handleLinkFromCloud(flags: Record, opts: InitOpt }); } - const project = projects.find((p) => p.id === projectId)!; + const project = projects.find((p) => p.id === projectId) + ?? throwErr(`Project not found: ${projectId}`); await writeProjectKeysToEnv(project, outputDir); - return {}; + return { projectId }; } async function performLogin(flags: Record) { diff --git a/packages/stack-cli/src/commands/project.ts b/packages/stack-cli/src/commands/project.ts index 2b1f49ff16..1dcad88541 100644 --- a/packages/stack-cli/src/commands/project.ts +++ b/packages/stack-cli/src/commands/project.ts @@ -1,6 +1,6 @@ import { Command } from "commander"; -import { resolveSessionAuth } from "../lib/auth.js"; import { getInternalUser } from "../lib/app.js"; +import { resolveLoginConfig, resolveSessionAuth } from "../lib/auth.js"; import { createProjectInteractively } from "../lib/create-project.js"; export function registerProjectCommand(program: Command) { @@ -38,9 +38,11 @@ export function registerProjectCommand(program: Command) { const flags = program.opts(); const auth = resolveSessionAuth(flags); const user = await getInternalUser(auth); + const { dashboardUrl } = resolveLoginConfig(flags as { projectId?: string }); const newProject = await createProjectInteractively(user, { displayName: opts.displayName, + dashboardUrl, }); if (program.opts().json) { diff --git a/packages/stack-cli/src/index.ts b/packages/stack-cli/src/index.ts index 69f4ddc372..12a3688791 100644 --- a/packages/stack-cli/src/index.ts +++ b/packages/stack-cli/src/index.ts @@ -1,3 +1,8 @@ +import { initSentry } from "./lib/sentry.js"; +initSentry(); + +import * as Sentry from "@sentry/node"; +import { captureError } from "@stackframe/stack-shared/dist/utils/errors"; import { Command } from "commander"; import { readFileSync } from "fs"; import { fileURLToPath } from "url"; @@ -44,7 +49,10 @@ async function main() { console.error(`Error: ${err.message}`); process.exit(1); } - throw err; + captureError("stack-cli-fatal", err); + await Sentry.flush(2000); + console.error(err); + process.exit(1); } } diff --git a/packages/stack-cli/src/lib/create-project.ts b/packages/stack-cli/src/lib/create-project.ts index 686a2c96ba..05e610be24 100644 --- a/packages/stack-cli/src/lib/create-project.ts +++ b/packages/stack-cli/src/lib/create-project.ts @@ -1,36 +1,39 @@ import { input } from "@inquirer/prompts"; import type { CurrentInternalUser } from "@stackframe/js"; +import { DEFAULT_DASHBOARD_URL } from "./auth.js"; import { CliError } from "./errors.js"; import { isNonInteractiveEnv } from "./interactive.js"; type CreateProjectOptions = { displayName?: string, defaultDisplayName?: string, + dashboardUrl?: string, }; export async function createProjectInteractively( user: CurrentInternalUser, opts: CreateProjectOptions = {}, ) { - let displayName = opts.displayName; + let displayName = opts.displayName?.trim(); if (!displayName) { if (isNonInteractiveEnv()) { throw new CliError("--display-name is required in non-interactive environments (CI)."); } - displayName = await input({ + displayName = (await input({ message: "Project display name:", default: opts.defaultDisplayName, validate: (v) => v.trim().length > 0 || "Display name cannot be empty.", - }); + })).trim(); } const teams = await user.listTeams(); if (teams.length === 0) { - throw new CliError("No teams found on your account. Create a team at app.stack-auth.com first."); + const dashboardUrl = opts.dashboardUrl ?? DEFAULT_DASHBOARD_URL; + throw new CliError(`No teams found on your account. Create a team at ${dashboardUrl} first.`); } return await user.createProject({ - displayName: displayName.trim(), + displayName, teamId: teams[0].id, }); } diff --git a/packages/stack-cli/src/lib/sentry.ts b/packages/stack-cli/src/lib/sentry.ts new file mode 100644 index 0000000000..31f4ab96d6 --- /dev/null +++ b/packages/stack-cli/src/lib/sentry.ts @@ -0,0 +1,96 @@ +import * as Sentry from "@sentry/node"; +import { getEnvVariable, getNodeEnvironment } from "@stackframe/stack-shared/dist/utils/env"; +import { registerErrorSink } from "@stackframe/stack-shared/dist/utils/errors"; +import { ignoreUnhandledRejection } from "@stackframe/stack-shared/dist/utils/promises"; +import { sentryBaseConfig } from "@stackframe/stack-shared/dist/utils/sentry"; +import { nicify } from "@stackframe/stack-shared/dist/utils/strings"; +import { readFileSync } from "fs"; +import { homedir } from "os"; +import { dirname, join } from "path"; +import { fileURLToPath } from "url"; + +// Replaced at build time by tsdown `define`. Empty = not configured (dev/unbuilt). +declare const __STACK_CLI_SENTRY_DSN__: string; + +function readPackageVersion(): string | undefined { + try { + const here = dirname(fileURLToPath(import.meta.url)); + const pkg = JSON.parse(readFileSync(join(here, "..", "package.json"), "utf-8")) as { version?: string }; + return pkg.version; + } catch { + return undefined; + } +} + +function scrubString(input: string): string { + let out = input; + const home = homedir(); + if (home && home.length > 1) { + out = out.split(home).join("~"); + } + out = out.replace(/\b(sk_[A-Za-z0-9_-]+|pk_[A-Za-z0-9_-]+|pck_[A-Za-z0-9_-]+|stk_[A-Za-z0-9_-]+|ssk_[A-Za-z0-9_-]+|eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+)\b/g, "[redacted]"); + return out; +} + +function isSensitiveKey(key: string): boolean { + return /token|key|secret|password|dsn|authorization|cookie/i.test(key); +} + +function scrubValue(value: unknown, key?: string): unknown { + if (key && isSensitiveKey(key) && value != null) { + return "[redacted]"; + } + if (typeof value === "string") { + return scrubString(value); + } + if (Array.isArray(value)) { + return value.map((v) => scrubValue(v)); + } + if (value && typeof value === "object") { + const out: Record = {}; + for (const [k, v] of Object.entries(value)) { + out[k] = scrubValue(v, k); + } + return out; + } + return value; +} + +export function initSentry() { + const dsn = typeof __STACK_CLI_SENTRY_DSN__ === "string" ? __STACK_CLI_SENTRY_DSN__ : ""; + const version = readPackageVersion(); + + Sentry.init({ + ...sentryBaseConfig, + dsn, + enabled: !!dsn && getNodeEnvironment() !== "development" && !getEnvVariable("CI", ""), + release: version ? `stack-cli@${version}` : undefined, + environment: "production", + sendDefaultPii: false, + tracesSampleRate: 0, + includeLocalVariables: false, + beforeSend(event, hint) { + const error = hint.originalException; + let nicified; + try { + nicified = nicify(error, { maxDepth: 8 }); + } catch (e) { + nicified = `Error occurred during nicification: ${e}`; + } + if (error instanceof Error) { + event.extra = { + ...event.extra, + cause: error.cause, + errorProps: { ...error }, + nicifiedError: nicified, + }; + } + return scrubValue(event) as typeof event; + }, + }); + + registerErrorSink((location, error) => { + Sentry.captureException(error, { extra: { location } }); + ignoreUnhandledRejection(Sentry.flush(2000)); + }); +} diff --git a/packages/stack-cli/tsdown.config.ts b/packages/stack-cli/tsdown.config.ts index db4ec2a8da..c7c11003ea 100644 --- a/packages/stack-cli/tsdown.config.ts +++ b/packages/stack-cli/tsdown.config.ts @@ -7,6 +7,9 @@ const config: UserConfig = { dts: true, outDir: 'dist', external: ['@anthropic-ai/claude-agent-sdk'], + define: { + __STACK_CLI_SENTRY_DSN__: JSON.stringify(process.env.STACK_CLI_SENTRY_DSN_BUILD ?? ''), + }, format: { esm: { outExtensions: () => ({ js: '.js', dts: '.d.ts' }), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 482352d2f2..aac995bd37 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1020,7 +1020,7 @@ importers: devDependencies: mint: specifier: ^4.2.487 - version: 4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + version: 4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) examples/cjs-test: dependencies: @@ -1568,10 +1568,10 @@ importers: version: link:../../packages/stack '@supabase/ssr': specifier: latest - version: 0.10.0(@supabase/supabase-js@2.102.1) + version: 0.10.2(@supabase/supabase-js@2.103.3) '@supabase/supabase-js': specifier: latest - version: 2.102.1 + version: 2.103.3 jose: specifier: ^5.2.2 version: 5.6.3 @@ -2088,6 +2088,9 @@ importers: '@inquirer/prompts': specifier: ^7.0.0 version: 7.10.1(@types/node@20.17.6) + '@sentry/node': + specifier: ^10.42.0 + version: 10.45.0 '@stackframe/js': specifier: workspace:* version: link:../js @@ -9891,36 +9894,36 @@ packages: resolution: {integrity: sha512-SXuhqhuR5FXaYgKTXzZJeqtVA6JKb9IZWaGeEUxHHiOcFy2p51wccO72bYpXwoK4D5pzQOIYLTuAc7etxyMmwg==} engines: {node: '>=12.16'} - '@supabase/auth-js@2.102.1': - resolution: {integrity: sha512-2uH2WB0H98TOGDtaFWhxIcR42Dro/VB7VDZanz/4bVJsqioIue1m3TUqu3xciDm2W9r+1LXQvYNsYbQfWmD+uQ==} + '@supabase/auth-js@2.103.3': + resolution: {integrity: sha512-SMDJ4vg5jLXNEHdhN4J4ujSb203WangbDw1n3VaARH0ZqM51E6lJnoUAHlpQU9N7SzP0hfgghA9IvT8c7tGRfg==} engines: {node: '>=20.0.0'} - '@supabase/functions-js@2.102.1': - resolution: {integrity: sha512-UcrcKTPnAIo+Yp9Jjq9XXwFbsmgRYY637mwka9ZjmTIWcX/xr1pote4OVvaGQycVY1KTiQgjMvpC0Q0yJhRq3w==} + '@supabase/functions-js@2.103.3': + resolution: {integrity: sha512-A2ZHi95GIRRlN9LGOSa/zGEIPg9taR1giDI9Gkfkgrcz0YmKV8ShiAplIrKsHQFdkzKxtsO3maJF0efL+i31mg==} engines: {node: '>=20.0.0'} '@supabase/phoenix@0.4.0': resolution: {integrity: sha512-RHSx8bHS02xwfHdAbX5Lpbo6PXbgyf7lTaXTlwtFDPwOIw64NnVRwFAXGojHhjtVYI+PEPNSWwkL90f4agN3bw==} - '@supabase/postgrest-js@2.102.1': - resolution: {integrity: sha512-InLvXKAYf8BIqiv9jWOYudWB3rU8A9uMbcip5BQ5sLLNPrbO1Ekkr79OvlhZBgMNSppxVyC7wPPGzLxMcTZhlA==} + '@supabase/postgrest-js@2.103.3': + resolution: {integrity: sha512-S0k/9FJVXDeejNfQLCJwRlm4IH8Wet/HEEdBTBpX6/G2o1eU/6CjQop/hJPZIwlQkI6D/zbHH8KymuCsBgy6jA==} engines: {node: '>=20.0.0'} - '@supabase/realtime-js@2.102.1': - resolution: {integrity: sha512-h2fCumib/v6u7XMwSPgxnpfimjX4xCEayUHrxWLC7UurfQjUZJ0pmJDgm6yj80DnUerxuulRghwm5zXYysFG/Q==} + '@supabase/realtime-js@2.103.3': + resolution: {integrity: sha512-fUvKtSXMUk1BkApVwAurWtHF4Vzbb0UB9aC/fQXrRBek7Ta3Kaora+wHf/fGwFNQs7uRz+mvjIVpzLfpR32VXA==} engines: {node: '>=20.0.0'} - '@supabase/ssr@0.10.0': - resolution: {integrity: sha512-36jIu+DuKzg5EgA3fnH+zHvwASvpKcL4zPgmHoZaULroS5Q4mzeHcM69zJ0sXUHddO5IcHjQNZJ9Vyhl/DdbRw==} + '@supabase/ssr@0.10.2': + resolution: {integrity: sha512-JFbchN63CXLFHJRNT7udec4/RoD9PmXkSGko3QSO6vUuqGBtSzdmxR7FPfQNr7SuFd65I7Xv46q66ALjEN1cgQ==} peerDependencies: - '@supabase/supabase-js': ^2.100.1 + '@supabase/supabase-js': ^2.102.1 - '@supabase/storage-js@2.102.1': - resolution: {integrity: sha512-eCL9T4Xpe40nmKlkUJ7Zq/hk34db1xPiT0WL3Iv5MbJqHuCAe5TxhV8Rjqd6DNZrzjtfYObZtYl9jKJaHrivqw==} + '@supabase/storage-js@2.103.3': + resolution: {integrity: sha512-5bAIEubrw5keHcdKR2RTois0O1M2Ilx4UYuzOzc07G6mLGCPS/8t1nbC6Vq451pnxR3sK+rmtFHWb9CY/OPjAw==} engines: {node: '>=20.0.0'} - '@supabase/supabase-js@2.102.1': - resolution: {integrity: sha512-bChxPVeLDnYN9M2d/u4fXsvylwSQG5grAl+HN8f+ZD9a9PuVU+Ru+xGmEsk+b9Iz3rJC9ZQnQUJYQ28fApdWYA==} + '@supabase/supabase-js@2.103.3': + resolution: {integrity: sha512-DuPiAz5pIJsTAQCt7B6bDZrnLzlq9+/5bta/GWTsgpLn6AkuZQcmYsQHYplv4skQ8U2raKY5HASQOu4KtYq9Qw==} engines: {node: '>=20.0.0'} '@sveltejs/sv-utils@0.0.3': @@ -14227,9 +14230,6 @@ packages: import-in-the-middle@1.14.2: resolution: {integrity: sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw==} - import-in-the-middle@2.0.0: - resolution: {integrity: sha512-yNZhyQYqXpkT0AKq3F3KLasUSK4fHvebNH5hOsKQw2dhGSALvQ4U0BqUc5suziKvydO5u5hgN2hy1RJaho8U5A==} - import-in-the-middle@2.0.6: resolution: {integrity: sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==} @@ -22245,7 +22245,7 @@ snapshots: '@fastify/otel@0.17.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 minimatch: 10.2.4 @@ -22676,16 +22676,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/checkbox@4.3.2(@types/node@24.9.2)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.2) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/confirm@5.1.21(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -22693,13 +22683,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/confirm@5.1.21(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/core@10.3.2(@types/node@20.17.6)': dependencies: '@inquirer/ansi': 1.0.2 @@ -22713,19 +22696,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/core@10.3.2(@types/node@24.9.2)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.2) - cli-width: 4.1.0 - mute-stream: 2.0.0 - signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/editor@4.2.23(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -22734,14 +22704,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/editor@4.2.23(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/external-editor': 1.0.3(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/expand@4.0.23(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -22750,14 +22712,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/expand@4.0.23(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/external-editor@1.0.3(@types/node@20.17.6)': dependencies: chardet: 2.1.1 @@ -22765,13 +22719,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/external-editor@1.0.3(@types/node@24.9.2)': - dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.0 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/figures@1.0.15': {} '@inquirer/figures@1.0.3': {} @@ -22783,13 +22730,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/input@4.3.1(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/number@3.0.23(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -22797,13 +22737,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/number@3.0.23(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/password@4.0.23(@types/node@20.17.6)': dependencies: '@inquirer/ansi': 1.0.2 @@ -22812,14 +22745,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/password@4.0.23(@types/node@24.9.2)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/prompts@7.10.1(@types/node@20.17.6)': dependencies: '@inquirer/checkbox': 4.3.2(@types/node@20.17.6) @@ -22835,35 +22760,20 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/prompts@7.10.1(@types/node@24.9.2)': + '@inquirer/prompts@7.9.0(@types/node@20.17.6)': dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@24.9.2) - '@inquirer/confirm': 5.1.21(@types/node@24.9.2) - '@inquirer/editor': 4.2.23(@types/node@24.9.2) - '@inquirer/expand': 4.0.23(@types/node@24.9.2) - '@inquirer/input': 4.3.1(@types/node@24.9.2) - '@inquirer/number': 3.0.23(@types/node@24.9.2) - '@inquirer/password': 4.0.23(@types/node@24.9.2) - '@inquirer/rawlist': 4.1.11(@types/node@24.9.2) - '@inquirer/search': 3.2.2(@types/node@24.9.2) - '@inquirer/select': 4.4.2(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - - '@inquirer/prompts@7.9.0(@types/node@24.9.2)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@24.9.2) - '@inquirer/confirm': 5.1.21(@types/node@24.9.2) - '@inquirer/editor': 4.2.23(@types/node@24.9.2) - '@inquirer/expand': 4.0.23(@types/node@24.9.2) - '@inquirer/input': 4.3.1(@types/node@24.9.2) - '@inquirer/number': 3.0.23(@types/node@24.9.2) - '@inquirer/password': 4.0.23(@types/node@24.9.2) - '@inquirer/rawlist': 4.1.11(@types/node@24.9.2) - '@inquirer/search': 3.2.2(@types/node@24.9.2) - '@inquirer/select': 4.4.2(@types/node@24.9.2) + '@inquirer/checkbox': 4.3.2(@types/node@20.17.6) + '@inquirer/confirm': 5.1.21(@types/node@20.17.6) + '@inquirer/editor': 4.2.23(@types/node@20.17.6) + '@inquirer/expand': 4.0.23(@types/node@20.17.6) + '@inquirer/input': 4.3.1(@types/node@20.17.6) + '@inquirer/number': 3.0.23(@types/node@20.17.6) + '@inquirer/password': 4.0.23(@types/node@20.17.6) + '@inquirer/rawlist': 4.1.11(@types/node@20.17.6) + '@inquirer/search': 3.2.2(@types/node@20.17.6) + '@inquirer/select': 4.4.2(@types/node@20.17.6) optionalDependencies: - '@types/node': 24.9.2 + '@types/node': 20.17.6 '@inquirer/rawlist@4.1.11(@types/node@20.17.6)': dependencies: @@ -22873,14 +22783,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/rawlist@4.1.11(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/search@3.2.2(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -22890,15 +22792,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/search@3.2.2(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.2) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/select@4.4.2(@types/node@20.17.6)': dependencies: '@inquirer/ansi': 1.0.2 @@ -22909,24 +22802,10 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/select@4.4.2(@types/node@24.9.2)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.2) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/type@3.0.10(@types/node@20.17.6)': optionalDependencies: '@types/node': 20.17.6 - '@inquirer/type@3.0.10(@types/node@24.9.2)': - optionalDependencies: - '@types/node': 24.9.2 - '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -23064,9 +22943,9 @@ snapshots: dependencies: langium: 3.3.1 - '@mintlify/cli@4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': + '@mintlify/cli@4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': dependencies: - '@inquirer/prompts': 7.9.0(@types/node@24.9.2) + '@inquirer/prompts': 7.9.0(@types/node@20.17.6) '@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) '@mintlify/link-rot': 3.0.1010(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) '@mintlify/prebuild': 1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) @@ -23079,7 +22958,7 @@ snapshots: front-matter: 4.0.2 fs-extra: 11.2.0 ink: 6.3.0(@types/react@18.3.12)(react@19.2.3) - inquirer: 12.3.0(@types/node@24.9.2) + inquirer: 12.3.0(@types/node@20.17.6) js-yaml: 4.1.0 mdast-util-mdx-jsx: 3.2.0 open: 8.4.2 @@ -23995,7 +23874,7 @@ snapshots: '@opentelemetry/instrumentation-amqplib@0.50.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: @@ -24004,9 +23883,9 @@ snapshots: '@opentelemetry/instrumentation-amqplib@0.60.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -24014,7 +23893,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@types/aws-lambda': 8.10.159 transitivePeerDependencies: - supports-color @@ -24022,9 +23901,9 @@ snapshots: '@opentelemetry/instrumentation-aws-sdk@0.68.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -24041,14 +23920,14 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color '@opentelemetry/instrumentation-connect@0.47.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@types/connect': 3.4.38 @@ -24058,9 +23937,9 @@ snapshots: '@opentelemetry/instrumentation-connect@0.56.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@types/connect': 3.4.38 transitivePeerDependencies: - supports-color @@ -24069,7 +23948,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -24097,7 +23976,7 @@ snapshots: '@opentelemetry/instrumentation-express@0.52.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: @@ -24106,25 +23985,25 @@ snapshots: '@opentelemetry/instrumentation-express@0.61.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color '@opentelemetry/instrumentation-fastify@0.57.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color '@opentelemetry/instrumentation-fs@0.23.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -24132,7 +24011,7 @@ snapshots: '@opentelemetry/instrumentation-fs@0.32.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -24169,14 +24048,14 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color '@opentelemetry/instrumentation-hapi@0.50.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: @@ -24185,9 +24064,9 @@ snapshots: '@opentelemetry/instrumentation-hapi@0.59.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -24206,7 +24085,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 forwarded-parse: 2.1.2 transitivePeerDependencies: - supports-color @@ -24225,7 +24104,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -24241,7 +24120,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -24257,14 +24136,14 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color '@opentelemetry/instrumentation-koa@0.51.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: @@ -24273,9 +24152,9 @@ snapshots: '@opentelemetry/instrumentation-koa@0.61.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -24297,7 +24176,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@types/memcached': 2.2.10 transitivePeerDependencies: - supports-color @@ -24314,14 +24193,14 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color '@opentelemetry/instrumentation-mongoose@0.50.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: @@ -24330,9 +24209,9 @@ snapshots: '@opentelemetry/instrumentation-mongoose@0.59.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -24349,7 +24228,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -24367,7 +24246,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@types/mysql': 2.15.27 transitivePeerDependencies: - supports-color @@ -24376,7 +24255,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -24384,7 +24263,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -24393,7 +24272,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.213.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -24401,7 +24280,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@types/oracledb': 6.5.2 transitivePeerDependencies: - supports-color @@ -24409,7 +24288,7 @@ snapshots: '@opentelemetry/instrumentation-pg@0.55.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) @@ -24421,9 +24300,9 @@ snapshots: '@opentelemetry/instrumentation-pg@0.65.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) '@types/pg': 8.15.6 '@types/pg-pool': 2.0.7 @@ -24434,7 +24313,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.213.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -24453,16 +24332,16 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color '@opentelemetry/instrumentation-restify@0.58.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -24470,7 +24349,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -24501,7 +24380,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@types/tedious': 4.0.14 transitivePeerDependencies: - supports-color @@ -24509,7 +24388,7 @@ snapshots: '@opentelemetry/instrumentation-undici@0.14.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -24517,9 +24396,9 @@ snapshots: '@opentelemetry/instrumentation-undici@0.23.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -24553,7 +24432,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.207.0 - import-in-the-middle: 2.0.0 + import-in-the-middle: 2.0.6 require-in-the-middle: 8.0.1 transitivePeerDependencies: - supports-color @@ -24672,34 +24551,34 @@ snapshots: '@opentelemetry/resource-detector-alibaba-cloud@0.33.3(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/resource-detector-aws@2.13.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/resource-detector-azure@0.21.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/resource-detector-container@0.8.4(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/resource-detector-gcp@0.48.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.0) gcp-metadata: 8.1.2 transitivePeerDependencies: - supports-color @@ -24714,7 +24593,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0)': dependencies: @@ -24800,7 +24679,7 @@ snapshots: '@opentelemetry/sdk-metrics': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -24858,7 +24737,7 @@ snapshots: '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@orama/orama@3.1.16': {} @@ -28372,38 +28251,38 @@ snapshots: - supports-color - webpack - '@sentry/node-core@10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': + '@sentry/node-core@10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/context-async-hooks': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@sentry/core': 10.11.0 - '@sentry/opentelemetry': 10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/opentelemetry': 10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) import-in-the-middle: 1.14.2 - '@sentry/node-core@10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.213.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': + '@sentry/node-core@10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.213.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': dependencies: '@sentry/core': 10.45.0 - '@sentry/opentelemetry': 10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/opentelemetry': 10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) import-in-the-middle: 3.0.0 optionalDependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/context-async-hooks': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@sentry/node@10.11.0': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/context-async-hooks': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-amqplib': 0.50.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-connect': 0.47.0(@opentelemetry/api@1.9.0) @@ -28427,13 +28306,13 @@ snapshots: '@opentelemetry/instrumentation-redis': 0.51.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-tedious': 0.22.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-undici': 0.14.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@prisma/instrumentation': 6.14.0(@opentelemetry/api@1.9.0) '@sentry/core': 10.11.0 - '@sentry/node-core': 10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) - '@sentry/opentelemetry': 10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/node-core': 10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/opentelemetry': 10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) import-in-the-middle: 1.14.2 minimatch: 9.0.5 transitivePeerDependencies: @@ -28443,8 +28322,8 @@ snapshots: dependencies: '@fastify/otel': 0.17.1(@opentelemetry/api@1.9.0) '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/context-async-hooks': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-amqplib': 0.60.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-connect': 0.56.0(@opentelemetry/api@1.9.0) @@ -28468,33 +28347,33 @@ snapshots: '@opentelemetry/instrumentation-redis': 0.61.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-tedious': 0.32.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-undici': 0.23.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@prisma/instrumentation': 7.4.2(@opentelemetry/api@1.9.0) '@sentry/core': 10.45.0 - '@sentry/node-core': 10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.213.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) - '@sentry/opentelemetry': 10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/node-core': 10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.213.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/opentelemetry': 10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) import-in-the-middle: 3.0.0 transitivePeerDependencies: - supports-color - '@sentry/opentelemetry@10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': + '@sentry/opentelemetry@10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/context-async-hooks': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 '@sentry/core': 10.11.0 - '@sentry/opentelemetry@10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': + '@sentry/opentelemetry@10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.6.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@sentry/core': 10.11.0 '@sentry/opentelemetry@10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': @@ -28506,12 +28385,12 @@ snapshots: '@opentelemetry/semantic-conventions': 1.40.0 '@sentry/core': 10.45.0 - '@sentry/opentelemetry@10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': + '@sentry/opentelemetry@10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/context-async-hooks': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@sentry/core': 10.45.0 @@ -28538,13 +28417,13 @@ snapshots: '@sentry/vercel-edge@10.11.0': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.0) '@sentry/core': 10.11.0 '@sentry/vercel-edge@10.45.0': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.0) '@sentry/core': 10.45.0 '@sentry/webpack-plugin@4.3.0(encoding@0.1.13)(webpack@5.92.0(esbuild@0.24.2))': @@ -29473,21 +29352,21 @@ snapshots: '@stripe/stripe-js@7.7.0': {} - '@supabase/auth-js@2.102.1': + '@supabase/auth-js@2.103.3': dependencies: tslib: 2.8.1 - '@supabase/functions-js@2.102.1': + '@supabase/functions-js@2.103.3': dependencies: tslib: 2.8.1 '@supabase/phoenix@0.4.0': {} - '@supabase/postgrest-js@2.102.1': + '@supabase/postgrest-js@2.103.3': dependencies: tslib: 2.8.1 - '@supabase/realtime-js@2.102.1': + '@supabase/realtime-js@2.103.3': dependencies: '@supabase/phoenix': 0.4.0 '@types/ws': 8.18.1 @@ -29497,23 +29376,23 @@ snapshots: - bufferutil - utf-8-validate - '@supabase/ssr@0.10.0(@supabase/supabase-js@2.102.1)': + '@supabase/ssr@0.10.2(@supabase/supabase-js@2.103.3)': dependencies: - '@supabase/supabase-js': 2.102.1 + '@supabase/supabase-js': 2.103.3 cookie: 1.0.2 - '@supabase/storage-js@2.102.1': + '@supabase/storage-js@2.103.3': dependencies: iceberg-js: 0.8.1 tslib: 2.8.1 - '@supabase/supabase-js@2.102.1': + '@supabase/supabase-js@2.103.3': dependencies: - '@supabase/auth-js': 2.102.1 - '@supabase/functions-js': 2.102.1 - '@supabase/postgrest-js': 2.102.1 - '@supabase/realtime-js': 2.102.1 - '@supabase/storage-js': 2.102.1 + '@supabase/auth-js': 2.103.3 + '@supabase/functions-js': 2.103.3 + '@supabase/postgrest-js': 2.103.3 + '@supabase/realtime-js': 2.103.3 + '@supabase/storage-js': 2.103.3 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -30247,6 +30126,7 @@ snapshots: '@types/node@24.9.2': dependencies: undici-types: 7.16.0 + optional: true '@types/nodemailer@6.4.15': dependencies: @@ -35305,13 +35185,6 @@ snapshots: cjs-module-lexer: 1.4.0 module-details-from-path: 1.0.3 - import-in-the-middle@2.0.0: - dependencies: - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) - cjs-module-lexer: 1.4.0 - module-details-from-path: 1.0.3 - import-in-the-middle@2.0.6: dependencies: acorn: 8.15.0 @@ -35400,12 +35273,12 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - inquirer@12.3.0(@types/node@24.9.2): + inquirer@12.3.0(@types/node@20.17.6): dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/prompts': 7.10.1(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - '@types/node': 24.9.2 + '@inquirer/core': 10.3.2(@types/node@20.17.6) + '@inquirer/prompts': 7.10.1(@types/node@20.17.6) + '@inquirer/type': 3.0.10(@types/node@20.17.6) + '@types/node': 20.17.6 ansi-escapes: 4.3.2 mute-stream: 2.0.0 run-async: 3.0.0 @@ -36897,9 +36770,9 @@ snapshots: dependencies: minipass: 7.1.2 - mint@4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0): + mint@4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0): dependencies: - '@mintlify/cli': 4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/cli': 4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) transitivePeerDependencies: - '@radix-ui/react-popover' - '@types/node' @@ -39191,7 +39064,7 @@ snapshots: require-in-the-middle@8.0.1: dependencies: debug: 4.4.3 - module-details-from-path: 1.0.3 + module-details-from-path: 1.0.4 transitivePeerDependencies: - supports-color @@ -41062,7 +40935,8 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.16.0: {} + undici-types@7.16.0: + optional: true undici@6.19.8: {}