From cb65e46ef5ebd1e9215be4058b2a670378249355 Mon Sep 17 00:00:00 2001 From: Enno Gelhaus Date: Sun, 27 Jul 2025 02:31:52 +0200 Subject: [PATCH] feat/sentry --- .env.example | 14 + Dockerfile.dev | 11 +- apps/backend/package.json | 2 +- .../backend/src/api/routes/auth.controller.ts | 11 +- apps/backend/src/main.ts | 8 + .../backend/src/services/auth/auth.service.ts | 39 +- apps/cron/package.json | 2 +- apps/cron/src/main.ts | 4 + apps/frontend/instrumentation.ts | 34 + apps/frontend/src/app/(app)/layout.tsx | 41 +- .../frontend/src/components/auth/register.tsx | 8 +- .../sentry/sentry-error-boundary.tsx | 92 ++ apps/frontend/src/lib/sentry-tracking.ts | 243 +++ apps/frontend/src/lib/sentry.ts | 48 + apps/frontend/src/lib/tracked-fetch.ts | 50 + apps/workers/package.json | 2 +- apps/workers/src/main.ts | 4 + docker-compose.dev.yaml | 4 +- docker-compose.yml | 68 + libraries/helpers/src/sentry/browser.ts | 6 + libraries/helpers/src/sentry/index.ts | 9 + libraries/helpers/src/sentry/sentry.client.ts | 171 +++ libraries/helpers/src/sentry/sentry.config.ts | 60 + libraries/helpers/src/sentry/sentry.nestjs.ts | 159 ++ libraries/helpers/src/sentry/sentry.nextjs.ts | 190 +++ libraries/helpers/src/sentry/sentry.react.ts | 170 +++ .../src/database/prisma/database.module.ts | 4 + .../database/prisma/posts/posts.service.ts | 66 +- .../src/services/sentry.exception.filter.ts | 119 ++ .../src/services/sentry.interceptor.ts | 118 ++ .../services/sentry.notification.service.ts | 337 ++++ .../src/services/sentry.worker.service.ts | 42 + .../react-shared-libraries/src/form/input.tsx | 13 +- package.json | 8 + pnpm-lock.yaml | 1354 ++++++++++++++++- var/docker/supervisord/backend.conf | 9 + var/docker/supervisord/caddy.conf | 1 + var/docker/supervisord/cron.conf | 9 + var/docker/supervisord/frontend.conf | 9 + var/docker/supervisord/migrate.conf | 10 + var/docker/supervisord/workers.conf | 9 + 41 files changed, 3448 insertions(+), 110 deletions(-) create mode 100644 apps/frontend/instrumentation.ts create mode 100644 apps/frontend/src/components/sentry/sentry-error-boundary.tsx create mode 100644 apps/frontend/src/lib/sentry-tracking.ts create mode 100644 apps/frontend/src/lib/sentry.ts create mode 100644 apps/frontend/src/lib/tracked-fetch.ts create mode 100644 docker-compose.yml create mode 100644 libraries/helpers/src/sentry/browser.ts create mode 100644 libraries/helpers/src/sentry/index.ts create mode 100644 libraries/helpers/src/sentry/sentry.client.ts create mode 100644 libraries/helpers/src/sentry/sentry.config.ts create mode 100644 libraries/helpers/src/sentry/sentry.nestjs.ts create mode 100644 libraries/helpers/src/sentry/sentry.nextjs.ts create mode 100644 libraries/helpers/src/sentry/sentry.react.ts create mode 100644 libraries/nestjs-libraries/src/services/sentry.exception.filter.ts create mode 100644 libraries/nestjs-libraries/src/services/sentry.interceptor.ts create mode 100644 libraries/nestjs-libraries/src/services/sentry.notification.service.ts create mode 100644 libraries/nestjs-libraries/src/services/sentry.worker.service.ts create mode 100644 var/docker/supervisord/backend.conf create mode 100644 var/docker/supervisord/cron.conf create mode 100644 var/docker/supervisord/frontend.conf create mode 100644 var/docker/supervisord/migrate.conf create mode 100644 var/docker/supervisord/workers.conf diff --git a/.env.example b/.env.example index 9a017b3a..1ebb0891 100644 --- a/.env.example +++ b/.env.example @@ -79,6 +79,20 @@ NEXT_PUBLIC_POLOTNO="" # NOT_SECURED=false API_LIMIT=30 # The limit of the public API hour limit +# Sentry Settings (Error Monitoring & Performance) +SENTRY_DSN="" # Sentry DSN for error tracking +SENTRY_ENVIRONMENT="development" # Environment: development, staging, production +SENTRY_TRACES_SAMPLE_RATE="0.1" # Performance monitoring sample rate (0.0 to 1.0) +SENTRY_PROFILES_SAMPLE_RATE="0.1" # Profiling sample rate (0.0 to 1.0) +SENTRY_REPLAYS_SESSION_SAMPLE_RATE="0.1" # Session Replay sample rate for normal sessions +SENTRY_REPLAYS_ON_ERROR_SAMPLE_RATE="1.0" # Session Replay sample rate for error sessions +SENTRY_DEBUG="false" # Enable debug mode for Sentry +SENTRY_ENABLED="true" # Enable/disable Sentry completely +# Additional Sentry configuration +SENTRY_ORG="" # Sentry organization slug +SENTRY_PROJECT="" # Sentry project slug +SENTRY_AUTH_TOKEN="" # Auth token for Sentry CLI (for source maps upload) + # Payment settings FEE_AMOUNT=0.05 STRIPE_PUBLISHABLE_KEY="" diff --git a/Dockerfile.dev b/Dockerfile.dev index 55fe8690..03845c69 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -9,13 +9,16 @@ WORKDIR /app COPY . /app COPY var/docker/supervisord.conf /etc/supervisord.conf COPY var/docker/Caddyfile /app/Caddyfile -COPY var/docker/entrypoint.sh /app/entrypoint.sh COPY var/docker/supervisord/caddy.conf /etc/supervisor.d/caddy.conf -RUN chmod +x /app/entrypoint.sh +COPY var/docker/supervisord/backend.conf /etc/supervisor.d/backend.conf +COPY var/docker/supervisord/frontend.conf /etc/supervisor.d/frontend.conf +COPY var/docker/supervisord/workers.conf /etc/supervisor.d/workers.conf +COPY var/docker/supervisord/cron.conf /etc/supervisor.d/cron.conf +COPY var/docker/supervisord/migrate.conf /etc/supervisor.d/migrate.conf RUN pnpm install RUN pnpm run build -EXPOSE 4200 +EXPOSE 5000 -CMD ["pnpm", "run", "pm2"] +CMD ["supervisord", "-c", "/etc/supervisord.conf"] diff --git a/apps/backend/package.json b/apps/backend/package.json index df85cfc8..3552b6f6 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -4,7 +4,7 @@ "description": "", "scripts": { "dev": "dotenv -e ../../.env -- nest start --watch --entryFile=./apps/backend/src/main", - "build": "NODE_ENV=production nest build", + "build": "cross-env NODE_ENV=production nest build", "start": "dotenv -e ../../.env -- node ./dist/apps/backend/src/main.js", "pm2": "pm2 start pnpm --name backend -- start" }, diff --git a/apps/backend/src/api/routes/auth.controller.ts b/apps/backend/src/api/routes/auth.controller.ts index d75697ea..a3afaf60 100644 --- a/apps/backend/src/api/routes/auth.controller.ts +++ b/apps/backend/src/api/routes/auth.controller.ts @@ -106,7 +106,16 @@ export class AuthController { register: true, }); } catch (e: any) { - response.status(400).send(e.message); + // Provide specific error handling based on the error message + if (e.message === 'User already exists') { + response.status(409).send('User already exists'); // 409 Conflict for duplicate resource + } else if (e.message === 'Registration is disabled') { + response.status(403).send('Registration is disabled'); // 403 Forbidden + } else { + // Log the actual error for debugging + console.error('Registration error:', e); + response.status(400).send(e.message || 'Registration failed'); + } } } diff --git a/apps/backend/src/main.ts b/apps/backend/src/main.ts index 84417f07..658dd4c5 100644 --- a/apps/backend/src/main.ts +++ b/apps/backend/src/main.ts @@ -1,3 +1,7 @@ +// Initialize Sentry as early as possible +import { SentryNestJSService } from '@gitroom/helpers/sentry'; +SentryNestJSService.init('backend'); + import { loadSwagger } from '@gitroom/helpers/swagger/load.swagger'; process.env.TZ = 'UTC'; @@ -8,6 +12,8 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { SubscriptionExceptionFilter } from '@gitroom/backend/services/auth/permissions/subscription.exception'; import { HttpExceptionFilter } from '@gitroom/nestjs-libraries/services/exception.filter'; +import { SentryExceptionFilter } from '@gitroom/nestjs-libraries/services/sentry.exception.filter'; +import { SentryInterceptor } from '@gitroom/nestjs-libraries/services/sentry.interceptor'; import { ConfigurationChecker } from '@gitroom/helpers/configuration/configuration.checker'; async function bootstrap() { @@ -35,6 +41,8 @@ async function bootstrap() { ); app.use(cookieParser()); + app.useGlobalInterceptors(new SentryInterceptor()); + app.useGlobalFilters(new SentryExceptionFilter()); app.useGlobalFilters(new SubscriptionExceptionFilter()); app.useGlobalFilters(new HttpExceptionFilter()); diff --git a/apps/backend/src/services/auth/auth.service.ts b/apps/backend/src/services/auth/auth.service.ts index 8dea316e..8987ec8c 100644 --- a/apps/backend/src/services/auth/auth.service.ts +++ b/apps/backend/src/services/auth/auth.service.ts @@ -9,6 +9,7 @@ import { ProvidersFactory } from '@gitroom/backend/services/auth/providers/provi import dayjs from 'dayjs'; import { NewsletterService } from '@gitroom/nestjs-libraries/services/newsletter.service'; import { NotificationService } from '@gitroom/nestjs-libraries/database/prisma/notifications/notification.service'; +import { SentryNotificationService } from '@gitroom/nestjs-libraries/services/sentry.notification.service'; import { ForgotReturnPasswordDto } from '@gitroom/nestjs-libraries/dtos/auth/forgot-return.password.dto'; import { EmailService } from '@gitroom/nestjs-libraries/services/email.service'; @@ -18,7 +19,8 @@ export class AuthService { private _userService: UsersService, private _organizationService: OrganizationService, private _notificationService: NotificationService, - private _emailService: EmailService + private _emailService: EmailService, + private _sentryNotificationService: SentryNotificationService ) {} async canRegister(provider: string) { if (!process.env.DISABLE_REGISTRATION || provider === Provider.GENERIC) { @@ -63,6 +65,16 @@ export class AuthService { : false; const obj = { addedOrg, jwt: await this.jwt(create.users[0].user) }; + + // Track user registration + this._sentryNotificationService.trackAuthEvent('registration', { + userId: create.users[0].user.id, + email: body.email, + provider: 'local', + ip, + userAgent, + }); + await this._emailService.sendEmail( body.email, 'Activate your account', @@ -72,13 +84,38 @@ export class AuthService { } if (!user || !AuthChecker.comparePassword(body.password, user.password)) { + // Track failed login attempt + this._sentryNotificationService.trackAuthEvent('failed_login', { + email: body.email, + provider: 'local', + ip, + userAgent, + }); throw new Error('Invalid user name or password'); } if (!user.activated) { + // Track failed login attempt for unactivated user + this._sentryNotificationService.trackAuthEvent('failed_login', { + userId: user.id, + email: user.email, + provider: 'local', + error: new Error('User not activated'), + ip, + userAgent, + }); throw new Error('User is not activated'); } + // Track successful login + this._sentryNotificationService.trackAuthEvent('login', { + userId: user.id, + email: user.email, + provider: 'local', + ip, + userAgent, + }); + return { addedOrg: false, jwt: await this.jwt(user) }; } diff --git a/apps/cron/package.json b/apps/cron/package.json index 3f47cd31..4226a686 100644 --- a/apps/cron/package.json +++ b/apps/cron/package.json @@ -4,7 +4,7 @@ "description": "", "scripts": { "dev": "dotenv -e ../../.env -- nest start --watch --entryFile=./apps/cron/src/main", - "build": "NODE_ENV=production nest build", + "build": "cross-env NODE_ENV=production nest build", "start": "dotenv -e ../../.env -- node ./dist/apps/cron/src/main.js", "pm2": "pm2 start pnpm --name cron -- start" }, diff --git a/apps/cron/src/main.ts b/apps/cron/src/main.ts index 393dab61..174aa27d 100644 --- a/apps/cron/src/main.ts +++ b/apps/cron/src/main.ts @@ -1,3 +1,7 @@ +// Initialize Sentry as early as possible +import { SentryNestJSService } from '@gitroom/helpers/sentry'; +SentryNestJSService.init('cron'); + import { NestFactory } from '@nestjs/core'; import { CronModule } from './cron.module'; diff --git a/apps/frontend/instrumentation.ts b/apps/frontend/instrumentation.ts new file mode 100644 index 00000000..0b996892 --- /dev/null +++ b/apps/frontend/instrumentation.ts @@ -0,0 +1,34 @@ +// Initialize Sentry as early as possible for Next.js +import * as Sentry from '@sentry/nextjs'; + +export function register() { + if (process.env.NEXT_RUNTIME === 'nodejs') { + // Server-side Sentry initialization + Sentry.init({ + dsn: process.env.NEXT_PUBLIC_SENTRY_DSN, + environment: process.env.NODE_ENV || 'development', + debug: process.env.NEXT_PUBLIC_SENTRY_DEBUG === 'true', + release: process.env.NEXT_PUBLIC_APP_VERSION || '1.0.0', + + // Performance Monitoring + tracesSampleRate: parseFloat(process.env.NEXT_PUBLIC_SENTRY_TRACES_SAMPLE_RATE || '0.1'), + + beforeSend(event, hint) { + // Only enable if explicitly enabled + if (process.env.NEXT_PUBLIC_SENTRY_ENABLED !== 'true') { + return null; + } + + return event; + }, + + // Set user context + initialScope: { + tags: { + service: 'frontend-server', + version: process.env.NEXT_PUBLIC_APP_VERSION || '1.0.0', + }, + }, + }); + } +} diff --git a/apps/frontend/src/app/(app)/layout.tsx b/apps/frontend/src/app/(app)/layout.tsx index ebcc5700..5d1a1ca3 100644 --- a/apps/frontend/src/app/(app)/layout.tsx +++ b/apps/frontend/src/app/(app)/layout.tsx @@ -3,7 +3,9 @@ export const dynamic = 'force-dynamic'; import '../global.scss'; import 'react-tooltip/dist/react-tooltip.css'; import '@copilotkit/react-ui/styles.css'; +import { SentryClientService } from '../../lib/sentry'; // Initialize Sentry import LayoutContext from '@gitroom/frontend/components/layout/layout.context'; +import { SentryErrorBoundary } from '@gitroom/frontend/components/sentry/sentry-error-boundary'; import { ReactNode } from 'react'; import { Chakra_Petch } from 'next/font/google'; import PlausibleProvider from 'next-plausible'; @@ -24,9 +26,22 @@ const chakra = Chakra_Petch({ }); export default async function AppLayout({ children }: { children: ReactNode }) { const allHeaders = headers(); - const Plausible = !!process.env.STRIPE_PUBLISHABLE_KEY - ? PlausibleProvider - : Fragment; + const hasStripe = !!process.env.STRIPE_PUBLISHABLE_KEY; + + const content = ( + + + + + {children} + + + + ); + return ( @@ -67,19 +82,15 @@ export default async function AppLayout({ children }: { children: ReactNode }) { > - - - - - {children} - - - + {content} + + ) : ( + content + )} diff --git a/apps/frontend/src/components/auth/register.tsx b/apps/frontend/src/components/auth/register.tsx index be69c898..df0f0ca2 100644 --- a/apps/frontend/src/components/auth/register.tsx +++ b/apps/frontend/src/components/auth/register.tsx @@ -74,10 +74,16 @@ export function Register() { } function getHelpfulReasonForRegistrationFailure(httpCode: number) { switch (httpCode) { - case 400: + case 409: return 'Email already exists'; + case 403: + return 'Registration is disabled'; case 404: return 'Your browser got a 404 when trying to contact the API, the most likely reasons for this are the NEXT_PUBLIC_BACKEND_URL is set incorrectly, or the backend is not running.'; + case 400: + return 'Invalid registration data. Please check your input.'; + case 500: + return 'Server error. Please try again later.'; } return 'Unhandled error: ' + httpCode; } diff --git a/apps/frontend/src/components/sentry/sentry-error-boundary.tsx b/apps/frontend/src/components/sentry/sentry-error-boundary.tsx new file mode 100644 index 00000000..ea897382 --- /dev/null +++ b/apps/frontend/src/components/sentry/sentry-error-boundary.tsx @@ -0,0 +1,92 @@ +'use client'; + +import React, { Component, ReactNode } from 'react'; +import { SentryClientService } from '../../lib/sentry'; + +interface Props { + children: ReactNode; + fallback?: ReactNode; + onError?: (error: Error, errorInfo: React.ErrorInfo) => void; +} + +interface State { + hasError: boolean; + error: Error | null; +} + +export class SentryErrorBoundary extends Component { + constructor(props: Props) { + super(props); + this.state = { hasError: false, error: null }; + } + + static getDerivedStateFromError(error: Error): State { + return { hasError: true, error }; + } + + componentDidCatch(error: Error, errorInfo: React.ErrorInfo) { + console.error('React Error Boundary caught an error:', error, errorInfo); + + // Report to Sentry with additional context + SentryClientService.captureException(error, { + contexts: { + react: { + componentStack: errorInfo.componentStack, + }, + }, + extra: { + errorInfo, + }, + tags: { + errorBoundary: true, + }, + }); + + // Call optional onError callback + if (this.props.onError) { + this.props.onError(error, errorInfo); + } + } + + render() { + if (this.state.hasError) { + // Custom fallback UI + if (this.props.fallback) { + return this.props.fallback; + } + + // Default fallback UI + return ( +
+
+

+ Something went wrong +

+

+ We're sorry, but something unexpected happened. This error has been + reported to our team. +

+ + {process.env.NODE_ENV === 'development' && this.state.error && ( +
+ + Error Details (Development) + +
+                  {this.state.error.stack}
+                
+
+ )} +
+
+ ); + } + + return this.props.children; + } +} diff --git a/apps/frontend/src/lib/sentry-tracking.ts b/apps/frontend/src/lib/sentry-tracking.ts new file mode 100644 index 00000000..4cb73744 --- /dev/null +++ b/apps/frontend/src/lib/sentry-tracking.ts @@ -0,0 +1,243 @@ +'use client'; + +import { useEffect } from 'react'; +import { SentryClientService } from './sentry'; + +interface User { + id?: string; + email?: string; + username?: string; + organizationId?: string; +} + +export function useSentryUserTracking(user?: User) { + useEffect(() => { + if (user?.id) { + SentryClientService.setUser({ + id: user.id, + email: user.email, + username: user.username, + organizationId: user.organizationId, + }); + } + }, [user]); +} + +export function useSentryPageTracking(pageName: string, pageData?: any) { + useEffect(() => { + SentryClientService.addBreadcrumb( + `Navigated to ${pageName}`, + 'navigation', + pageData + ); + }, [pageName, pageData]); +} + +export function trackUserAction(action: string, data?: any) { + SentryClientService.addBreadcrumb( + `User action: ${action}`, + 'user.action', + data + ); +} + +export function trackUIError(error: Error, component: string, props?: any) { + SentryClientService.captureException(error, { + extra: { + component, + props, + }, + tags: { + errorType: 'ui_error', + component, + }, + level: 'error', + }); +} + +export function trackPerformanceIssue(operation: string, duration: number, threshold = 1000) { + if (duration > threshold) { + SentryClientService.captureMessage( + `Slow UI operation: ${operation}`, + 'warning', + { + extra: { + operation, + duration, + threshold, + }, + tags: { + errorType: 'performance_issue', + operation, + }, + } + ); + } +} + +export function trackAPICall(method: string, url: string, status: number, duration: number, error?: any) { + const baseData = { + method, + url, + status, + duration, + }; + + // Only capture actual errors and warnings, not successful requests + if (error || status >= 400) { + SentryClientService.captureException(error || new Error(`API Error: ${status}`), { + extra: baseData, + tags: { + errorType: 'api_error', + method, + status: status.toString(), + }, + level: status >= 500 ? 'error' : 'warning', + }); + } else { + // Just add breadcrumb for successful requests - no event creation + SentryClientService.addBreadcrumb( + `API call: ${method} ${url}`, + 'api.call', + baseData + ); + } + + // Track slow API calls as warnings (these are performance issues) + if (duration > 5000) { + SentryClientService.captureMessage( + `Slow API call: ${method} ${url}`, + 'warning', + { + extra: baseData, + tags: { + errorType: 'slow_api_call', + method, + }, + } + ); + } +} + +export function trackPostPublishing( + action: 'attempt' | 'success' | 'failed', + data: { + postId?: string; + provider?: string; + error?: any; + metadata?: any; + } +) { + const baseData = { + postId: data.postId, + provider: data.provider, + metadata: data.metadata, + }; + + switch (action) { + case 'attempt': + // Just breadcrumb - attempting to post is not an error + SentryClientService.addBreadcrumb( + `Post publishing attempt: ${data.provider}`, + 'post.attempt', + baseData + ); + break; + + case 'success': + // Just breadcrumb - successful posts are not errors + SentryClientService.addBreadcrumb( + `Post published successfully: ${data.provider}`, + 'post.success', + baseData + ); + break; + + case 'failed': + // This is an actual error - capture it + SentryClientService.captureException(data.error || new Error('Post publishing failed'), { + extra: baseData, + tags: { + errorType: 'post_publishing_failed', + provider: data.provider || 'unknown', + }, + level: 'error', + }); + break; + } +} + +export function trackFormError(formName: string, field: string, error: string, formData?: any) { + SentryClientService.captureMessage( + `Form validation error in ${formName}: ${field}`, + 'warning', + { + extra: { + formName, + field, + error, + formData, + }, + tags: { + errorType: 'form_validation_error', + form: formName, + field, + }, + } + ); +} + +export function trackIntegrationEvent( + action: 'connect_attempt' | 'connected' | 'disconnected' | 'error', + data: { + provider: string; + error?: any; + metadata?: any; + } +) { + const baseData = { + provider: data.provider, + metadata: data.metadata, + }; + + switch (action) { + case 'connect_attempt': + // Just breadcrumb - attempting to connect is not an error + SentryClientService.addBreadcrumb( + `Integration connection attempt: ${data.provider}`, + 'integration.attempt', + baseData + ); + break; + + case 'connected': + // Just breadcrumb - successful connections are not errors + SentryClientService.addBreadcrumb( + `Integration connected: ${data.provider}`, + 'integration.connected', + baseData + ); + break; + + case 'disconnected': + // Just breadcrumb - disconnections might be intentional + SentryClientService.addBreadcrumb( + `Integration disconnected: ${data.provider}`, + 'integration.disconnected', + baseData + ); + break; + + case 'error': + // This is an actual error - capture it + SentryClientService.captureException(data.error || new Error('Integration error'), { + extra: baseData, + tags: { + errorType: 'integration_error', + provider: data.provider, + }, + level: 'error', + }); + break; + } +} diff --git a/apps/frontend/src/lib/sentry.ts b/apps/frontend/src/lib/sentry.ts new file mode 100644 index 00000000..7d1a6c1d --- /dev/null +++ b/apps/frontend/src/lib/sentry.ts @@ -0,0 +1,48 @@ +import { SentryReactService } from '@gitroom/helpers/sentry/sentry.react'; +import { enableFetchTracking } from './tracked-fetch'; + +// Initialize Sentry for client-side +if (typeof window !== 'undefined') { + SentryReactService.init(); + + // Enable automatic fetch tracking + // enableFetchTracking(); // Temporarily disabled +} + +// Create service wrapper for compatibility +export const SentryClientService = { + captureException: (error: any, context?: any) => { + if (typeof window === 'undefined') return; + return SentryReactService.captureException(error, context); + }, + + captureMessage: (message: string, level: 'info' | 'warning' | 'error' = 'info', context?: any) => { + if (typeof window === 'undefined') return; + return SentryReactService.captureMessage(message, level, context); + }, + + setUser: (user: { id?: string; email?: string; username?: string; organizationId?: string }) => { + if (typeof window === 'undefined') return; + SentryReactService.setUser(user); + }, + + addBreadcrumb: (message: string, category?: string, data?: any) => { + if (typeof window === 'undefined') return; + SentryReactService.addBreadcrumb(message, category, data); + }, + + setTag: (key: string, value: string) => { + if (typeof window === 'undefined') return; + SentryReactService.setTag(key, value); + }, + + setContext: (key: string, context: any) => { + if (typeof window === 'undefined') return; + SentryReactService.setContext(key, context); + }, + + showReportDialog: (eventId?: string) => { + if (typeof window === 'undefined') return; + SentryReactService.showReportDialog(eventId); + }, +}; diff --git a/apps/frontend/src/lib/tracked-fetch.ts b/apps/frontend/src/lib/tracked-fetch.ts new file mode 100644 index 00000000..1aea9daf --- /dev/null +++ b/apps/frontend/src/lib/tracked-fetch.ts @@ -0,0 +1,50 @@ +'use client'; + +import { trackAPICall } from './sentry-tracking'; + +// Wrapper around fetch to automatically track API calls in Sentry +export async function trackedFetch( + input: RequestInfo | URL, + init?: RequestInit +): Promise { + const startTime = Date.now(); + const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url; + const method = init?.method || 'GET'; + + try { + const response = await fetch(input, init); + const duration = Date.now() - startTime; + + // Track the API call + trackAPICall(method, url, response.status, duration); + + return response; + } catch (error) { + const duration = Date.now() - startTime; + + // Track the failed API call + trackAPICall(method, url, 0, duration, error); + + throw error; + } +} + +// Helper function to replace the global fetch with our tracked version +export function enableFetchTracking() { + if (typeof window !== 'undefined') { + const originalFetch = window.fetch; + + window.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { + // Only track API calls to our backend and not third-party services + const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url; + + // Track only calls to our backend API + if (url.includes('/api/') || url.includes(process.env.NEXT_PUBLIC_BACKEND_URL || '')) { + return trackedFetch(input, init); + } + + // Use original fetch for other requests + return originalFetch(input, init); + }; + } +} diff --git a/apps/workers/package.json b/apps/workers/package.json index 6516473c..ef65918f 100644 --- a/apps/workers/package.json +++ b/apps/workers/package.json @@ -4,7 +4,7 @@ "description": "", "scripts": { "dev": "dotenv -e ../../.env -- nest start --watch --entryFile=./apps/workers/src/main", - "build": "NODE_ENV=production nest build", + "build": "cross-env NODE_ENV=production nest build", "start": "dotenv -e ../../.env -- node ./dist/apps/workers/src/main.js", "pm2": "pm2 start pnpm --name workers -- start" }, diff --git a/apps/workers/src/main.ts b/apps/workers/src/main.ts index f93b7e4e..4466a25b 100644 --- a/apps/workers/src/main.ts +++ b/apps/workers/src/main.ts @@ -1,3 +1,7 @@ +// Initialize Sentry as early as possible +import { SentryNestJSService } from '@gitroom/helpers/sentry'; +SentryNestJSService.init('workers'); + import { NestFactory } from '@nestjs/core'; import { AppModule } from './app/app.module'; diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml index e0f06084..8c61ca28 100644 --- a/docker-compose.dev.yaml +++ b/docker-compose.dev.yaml @@ -13,7 +13,7 @@ services: POSTGRES_USER: postiz-local POSTGRES_DB: postiz-db-local volumes: - - postgres-volume:/var/lib/postgresql/data + - pos-postgres-volume:/var/lib/postgresql/data ports: - 5432:5432 networks: @@ -55,7 +55,7 @@ services: volumes: redisinsight: - postgres-volume: + pos-postgres-volume: external: false networks: diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..d542f367 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,68 @@ +services: + postiz: + image: docker.io/library/postiz-dev:1 + container_name: postiz + restart: always + env_file: + - .env + volumes: + - postiz-config:/config/ + - postiz-uploads:/uploads/ + ports: + - 5000:5000 # Caddy proxy + networks: + - postiz-network + depends_on: + postiz-postgres: + condition: service_healthy + postiz-redis: + condition: service_healthy + + postiz-postgres: + image: postgres:17-alpine + container_name: postiz-postgres + restart: always + environment: + POSTGRES_PASSWORD: postiz-password + POSTGRES_USER: postiz-user + POSTGRES_DB: postiz-db-local + volumes: + - postgres-volume:/var/lib/postgresql/data + networks: + - postiz-network + healthcheck: + test: pg_isready -U postiz-user -d postiz-db-local + interval: 10s + timeout: 3s + retries: 3 + postiz-redis: + image: redis:7.2 + container_name: postiz-redis + restart: always + healthcheck: + test: redis-cli ping + interval: 10s + timeout: 3s + retries: 3 + volumes: + - postiz-redis-data:/data + networks: + - postiz-network + + +volumes: + postgres-volume: + external: false + + postiz-redis-data: + external: false + + postiz-config: + external: false + + postiz-uploads: + external: false + +networks: + postiz-network: + external: false \ No newline at end of file diff --git a/libraries/helpers/src/sentry/browser.ts b/libraries/helpers/src/sentry/browser.ts new file mode 100644 index 00000000..16564bf8 --- /dev/null +++ b/libraries/helpers/src/sentry/browser.ts @@ -0,0 +1,6 @@ +// Export only browser-compatible Sentry +import { SentryNextService } from './sentry.nextjs'; + +// Export with aliases for compatibility +export { SentryNextService }; +export const SentryClientService = SentryNextService; diff --git a/libraries/helpers/src/sentry/index.ts b/libraries/helpers/src/sentry/index.ts new file mode 100644 index 00000000..a5fdcb7b --- /dev/null +++ b/libraries/helpers/src/sentry/index.ts @@ -0,0 +1,9 @@ +export { SentryConfigService } from './sentry.config'; +export { SentryNestJSService } from './sentry.nestjs'; +export { SentryReactService } from './sentry.react'; +export { SentryClientService } from './sentry.client'; + +// Re-export commonly used Sentry functions for convenience +export * as Sentry from '@sentry/nestjs'; +export * as SentryReact from '@sentry/react'; +export * as SentryBrowser from '@sentry/browser'; diff --git a/libraries/helpers/src/sentry/sentry.client.ts b/libraries/helpers/src/sentry/sentry.client.ts new file mode 100644 index 00000000..c348d992 --- /dev/null +++ b/libraries/helpers/src/sentry/sentry.client.ts @@ -0,0 +1,171 @@ +import * as Sentry from '@sentry/react'; + +export class SentryClientService { + static init() { + // Only run on client side + if (typeof window === 'undefined') return; + + const config = { + enabled: process.env.NEXT_PUBLIC_SENTRY_ENABLED === 'true', + dsn: process.env.NEXT_PUBLIC_SENTRY_DSN, + environment: process.env.NODE_ENV || 'development', + debug: process.env.NEXT_PUBLIC_SENTRY_DEBUG === 'true', + release: process.env.NEXT_PUBLIC_APP_VERSION || '1.0.0', + tracesSampleRate: parseFloat(process.env.NEXT_PUBLIC_SENTRY_TRACES_SAMPLE_RATE || '0.1'), + replaysSessionSampleRate: parseFloat(process.env.NEXT_PUBLIC_SENTRY_REPLAYS_SESSION_SAMPLE_RATE || '0.1'), + replaysOnErrorSampleRate: parseFloat(process.env.NEXT_PUBLIC_SENTRY_REPLAYS_ON_ERROR_SAMPLE_RATE || '1.0'), + }; + + if (!config.enabled || !config.dsn) { + console.log('[Frontend] Sentry is disabled'); + return; + } + + console.log(`[Frontend] Initializing Sentry with environment: ${config.environment}`); + + Sentry.init({ + dsn: config.dsn, + environment: config.environment, + debug: config.debug, + release: config.release, + + // Performance Monitoring + tracesSampleRate: config.tracesSampleRate, + + // Session Replay + replaysSessionSampleRate: config.replaysSessionSampleRate, + replaysOnErrorSampleRate: config.replaysOnErrorSampleRate, + + integrations: [ + // Browser tracing for performance monitoring + Sentry.browserTracingIntegration(), + + // Session replay integration + Sentry.replayIntegration({ + // Mask all text content, inputs, etc. + maskAllText: false, + blockAllMedia: false, + }), + + // Breadcrumbs for user interactions + Sentry.breadcrumbsIntegration({ + console: false, // Don't capture console logs as breadcrumbs + dom: true, // Capture DOM interactions + fetch: true, // Capture fetch requests + history: true, // Capture navigation + sentry: true, // Capture Sentry events + xhr: true, // Capture XHR requests + }), + ], + + beforeSend(event, hint) { + // Filter out known non-critical errors + if (event.exception) { + const error = hint.originalException; + + // Skip network errors that are likely user-related + if (error && error instanceof TypeError) { + const message = error.message || ''; + if (message.includes('NetworkError') || + message.includes('Failed to fetch') || + message.includes('Load failed')) { + return null; + } + } + + // Skip ResizeObserver errors (common browser quirk) + if (error && typeof error === 'object' && 'message' in error && + typeof error.message === 'string' && error.message.includes('ResizeObserver')) { + return null; + } + + // Skip AbortError (user navigation) + if (error && typeof error === 'object' && 'name' in error && error.name === 'AbortError') { + return null; + } + } + + return event; + }, + + // Set user context + initialScope: { + tags: { + service: 'frontend', + version: config.release, + }, + }, + }); + + // Set up global error handlers + window.addEventListener('error', (event) => { + console.error('[Frontend] Global Error:', event.error); + }); + + window.addEventListener('unhandledrejection', (event) => { + console.error('[Frontend] Unhandled Promise Rejection:', event.reason); + }); + } + + static captureException(error: any, context?: any) { + if (typeof window === 'undefined') return; + + return Sentry.withScope((scope) => { + if (context) { + scope.setContext('additional_context', context); + } + return Sentry.captureException(error); + }); + } + + static captureMessage(message: string, level: Sentry.SeverityLevel = 'info', context?: any) { + if (typeof window === 'undefined') return; + + return Sentry.withScope((scope) => { + if (context) { + scope.setContext('additional_context', context); + } + return Sentry.captureMessage(message, level); + }); + } + + static setUser(user: { id?: string; email?: string; username?: string; organizationId?: string }) { + if (typeof window === 'undefined') return; + + Sentry.setUser(user); + } + + static addBreadcrumb(message: string, category?: string, data?: any) { + if (typeof window === 'undefined') return; + + Sentry.addBreadcrumb({ + message, + category: category || 'custom', + data, + timestamp: Date.now() / 1000, + }); + } + + static setTag(key: string, value: string) { + if (typeof window === 'undefined') return; + + Sentry.setTag(key, value); + } + + static setContext(key: string, context: any) { + if (typeof window === 'undefined') return; + + Sentry.setContext(key, context); + } + + static showReportDialog(eventId?: string) { + if (typeof window === 'undefined') return; + + Sentry.showReportDialog({ + eventId, + title: 'Report a Bug', + subtitle: 'Help us improve Postiz by reporting this error.', + subtitle2: 'We\'ll get back to you if we need more information.', + }); + } +} diff --git a/libraries/helpers/src/sentry/sentry.config.ts b/libraries/helpers/src/sentry/sentry.config.ts new file mode 100644 index 00000000..24c7fcf7 --- /dev/null +++ b/libraries/helpers/src/sentry/sentry.config.ts @@ -0,0 +1,60 @@ +export interface SentryConfig { + dsn: string; + environment: string; + tracesSampleRate: number; + profilesSampleRate: number; + replaysSessionSampleRate: number; + replaysOnErrorSampleRate: number; + debug: boolean; + enabled: boolean; + release?: string; + serverName?: string; + beforeSend?: (event: any, hint: any) => any; + integrations?: any[]; +} + +export class SentryConfigService { + static getConfig(): SentryConfig { + const enabled = process.env.SENTRY_ENABLED !== 'false'; + const dsn = process.env.SENTRY_DSN || ''; + + // If Sentry is disabled or no DSN, return disabled config + if (!enabled || !dsn) { + return { + dsn: '', + environment: 'development', + tracesSampleRate: 0, + profilesSampleRate: 0, + replaysSessionSampleRate: 0, + replaysOnErrorSampleRate: 0, + debug: false, + enabled: false, + }; + } + + return { + dsn, + environment: process.env.SENTRY_ENVIRONMENT || 'development', + tracesSampleRate: parseFloat(process.env.SENTRY_TRACES_SAMPLE_RATE || '0.1'), + profilesSampleRate: parseFloat(process.env.SENTRY_PROFILES_SAMPLE_RATE || '0.1'), + replaysSessionSampleRate: parseFloat(process.env.SENTRY_REPLAYS_SESSION_SAMPLE_RATE || '0.1'), + replaysOnErrorSampleRate: parseFloat(process.env.SENTRY_REPLAYS_ON_ERROR_SAMPLE_RATE || '1.0'), + debug: process.env.SENTRY_DEBUG === 'true', + enabled: true, + release: process.env.npm_package_version || 'unknown', + serverName: process.env.HOSTNAME || 'unknown', + }; + } + + static isEnabled(): boolean { + return this.getConfig().enabled; + } + + static getEnvironment(): string { + return this.getConfig().environment; + } + + static getDsn(): string { + return this.getConfig().dsn; + } +} diff --git a/libraries/helpers/src/sentry/sentry.nestjs.ts b/libraries/helpers/src/sentry/sentry.nestjs.ts new file mode 100644 index 00000000..ba6ec2a8 --- /dev/null +++ b/libraries/helpers/src/sentry/sentry.nestjs.ts @@ -0,0 +1,159 @@ +import * as Sentry from '@sentry/nestjs'; +import { nodeProfilingIntegration } from '@sentry/profiling-node'; +import { SentryConfigService } from './sentry.config'; + +export class SentryNestJSService { + static init(serviceName: string, additionalIntegrations: any[] = []) { + const config = SentryConfigService.getConfig(); + + if (!config.enabled) { + console.log(`[${serviceName}] Sentry is disabled`); + return; + } + + console.log(`[${serviceName}] Initializing Sentry with environment: ${config.environment}`); + + Sentry.init({ + dsn: config.dsn, + environment: config.environment, + debug: config.debug, + release: config.release, + serverName: `${serviceName}-${config.serverName}`, + + // Performance Monitoring + tracesSampleRate: config.tracesSampleRate, + profilesSampleRate: config.profilesSampleRate, + + integrations: [ + // Node.js profiling + nodeProfilingIntegration(), + + // Http integration for tracing HTTP requests + Sentry.httpIntegration({ + ignoreIncomingRequests: (url) => { + // Ignore health checks and monitoring endpoints + return url.includes('/health') || + url.includes('/monitor') || + url.includes('/favicon.ico') || + url.includes('/_next/'); + }, + }), + + // Express integration for Express.js apps + Sentry.expressIntegration(), + + // Additional integrations passed in + ...additionalIntegrations, + ], + + beforeSend(event, hint) { + // Filter out known non-critical errors + if (event.exception) { + const error = hint.originalException; + + // Skip common connection errors + if (error && typeof error === 'object' && 'code' in error) { + const code = (error as any).code; + if (['ECONNRESET', 'ECONNREFUSED', 'ETIMEDOUT', 'ENOTFOUND'].includes(code)) { + return null; + } + } + + // Skip Redis connection errors in development + if (config.environment === 'development' && + event.exception?.values?.[0]?.value?.includes('Redis')) { + return null; + } + } + + return event; + }, + + // Set user context + initialScope: { + tags: { + service: serviceName, + version: config.release, + }, + }, + }); + + // Set up global error handlers + process.on('uncaughtException', (error) => { + console.error(`[${serviceName}] Uncaught Exception:`, error); + Sentry.captureException(error); + }); + + process.on('unhandledRejection', (reason, promise) => { + console.error(`[${serviceName}] Unhandled Rejection at:`, promise, 'reason:', reason); + Sentry.captureException(reason); + }); + } + + static captureException(error: any, context?: any) { + if (!SentryConfigService.isEnabled()) return; + + return Sentry.withScope((scope) => { + if (context) { + scope.setContext('additional_context', context); + } + return Sentry.captureException(error); + }); + } + + static captureMessage(message: string, level: Sentry.SeverityLevel = 'info', context?: any) { + if (!SentryConfigService.isEnabled()) return; + + return Sentry.withScope((scope) => { + if (context) { + scope.setContext('additional_context', context); + } + return Sentry.captureMessage(message, level); + }); + } + + static setUser(user: { id?: string; email?: string; username?: string; organizationId?: string }) { + if (!SentryConfigService.isEnabled()) return; + + Sentry.setUser(user); + } + + static addBreadcrumb(message: string, category?: string, data?: any) { + if (!SentryConfigService.isEnabled()) return; + + Sentry.addBreadcrumb({ + message, + category: category || 'custom', + data, + timestamp: Date.now() / 1000, + }); + } + + static setTag(key: string, value: string) { + if (!SentryConfigService.isEnabled()) return; + + Sentry.setTag(key, value); + } + + static setContext(key: string, context: any) { + if (!SentryConfigService.isEnabled()) return; + + Sentry.setContext(key, context); + } + + static startTransaction(name: string, op?: string) { + if (!SentryConfigService.isEnabled()) return null; + + // Use startSpan instead of deprecated startTransaction + return Sentry.startSpan({ + name, + op: op || 'custom', + }, (span) => span); + } + + static close(timeout?: number) { + if (!SentryConfigService.isEnabled()) return Promise.resolve(true); + + return Sentry.close(timeout); + } +} diff --git a/libraries/helpers/src/sentry/sentry.nextjs.ts b/libraries/helpers/src/sentry/sentry.nextjs.ts new file mode 100644 index 00000000..ea96dfa8 --- /dev/null +++ b/libraries/helpers/src/sentry/sentry.nextjs.ts @@ -0,0 +1,190 @@ +// Next.js-specific Sentry configuration +import * as Sentry from '@sentry/nextjs'; + +interface SentryConfig { + enabled: boolean; + dsn: string; + environment: string; + debug: boolean; + release: string; + tracesSampleRate: number; + replaysSessionSampleRate: number; + replaysOnErrorSampleRate: number; +} + +function getConfig(): SentryConfig { + return { + enabled: process.env.NEXT_PUBLIC_SENTRY_ENABLED === 'true', + dsn: process.env.NEXT_PUBLIC_SENTRY_DSN || '', + environment: process.env.NODE_ENV || 'development', + debug: process.env.NEXT_PUBLIC_SENTRY_DEBUG === 'true', + release: process.env.NEXT_PUBLIC_APP_VERSION || '1.0.0', + tracesSampleRate: parseFloat(process.env.NEXT_PUBLIC_SENTRY_TRACES_SAMPLE_RATE || '0.1'), + replaysSessionSampleRate: parseFloat(process.env.NEXT_PUBLIC_SENTRY_REPLAYS_SESSION_SAMPLE_RATE || '0.1'), + replaysOnErrorSampleRate: parseFloat(process.env.NEXT_PUBLIC_SENTRY_REPLAYS_ON_ERROR_SAMPLE_RATE || '1.0'), + }; +} + +export class SentryNextService { + private static initialized = false; + + static init() { + // Only run on client side and only once + if (typeof window === 'undefined' || this.initialized) return; + + const config = getConfig(); + + if (!config.enabled || !config.dsn) { + console.log('[Frontend] Sentry is disabled'); + return; + } + + console.log(`[Frontend] Initializing Sentry with environment: ${config.environment}`); + + Sentry.init({ + dsn: config.dsn, + environment: config.environment, + debug: config.debug, + release: config.release, + + // Performance Monitoring + tracesSampleRate: config.tracesSampleRate, + + // Session Replay + replaysSessionSampleRate: config.replaysSessionSampleRate, + replaysOnErrorSampleRate: config.replaysOnErrorSampleRate, + + integrations: [ + // Browser tracing for performance monitoring + Sentry.browserTracingIntegration(), + + // Session replay integration + Sentry.replayIntegration({ + maskAllText: false, + blockAllMedia: false, + }), + + // Breadcrumbs for user interactions + Sentry.breadcrumbsIntegration({ + console: false, + dom: true, + fetch: true, + history: true, + sentry: true, + xhr: true, + }), + ], + + beforeSend(event, hint) { + // Filter out known non-critical errors + if (event.exception) { + const error = hint.originalException; + + // Skip network errors that are likely user-related + if (error && error instanceof TypeError) { + const message = error.message || ''; + if (message.includes('NetworkError') || + message.includes('Failed to fetch') || + message.includes('Load failed')) { + return null; + } + } + + // Skip ResizeObserver errors (common browser quirk) + if (error && typeof error === 'object' && 'message' in error && + typeof error.message === 'string' && error.message.includes('ResizeObserver')) { + return null; + } + + // Skip AbortError (user navigation) + if (error && typeof error === 'object' && 'name' in error && error.name === 'AbortError') { + return null; + } + } + + return event; + }, + + // Set user context + initialScope: { + tags: { + service: 'frontend', + version: config.release, + }, + }, + }); + + this.initialized = true; + + // Set up global error handlers + window.addEventListener('error', (event) => { + console.error('[Frontend] Global Error:', event.error); + }); + + window.addEventListener('unhandledrejection', (event) => { + console.error('[Frontend] Unhandled Promise Rejection:', event.reason); + }); + } + + static captureException(error: any, context?: any) { + if (typeof window === 'undefined') return; + + return Sentry.withScope((scope) => { + if (context) { + scope.setContext('additional_context', context); + } + return Sentry.captureException(error); + }); + } + + static captureMessage(message: string, level: Sentry.SeverityLevel = 'info', context?: any) { + if (typeof window === 'undefined') return; + + return Sentry.withScope((scope) => { + if (context) { + scope.setContext('additional_context', context); + } + return Sentry.captureMessage(message, level); + }); + } + + static setUser(user: { id?: string; email?: string; username?: string; organizationId?: string }) { + if (typeof window === 'undefined') return; + + Sentry.setUser(user); + } + + static addBreadcrumb(message: string, category?: string, data?: any) { + if (typeof window === 'undefined') return; + + Sentry.addBreadcrumb({ + message, + category: category || 'custom', + data, + timestamp: Date.now() / 1000, + }); + } + + static setTag(key: string, value: string) { + if (typeof window === 'undefined') return; + + Sentry.setTag(key, value); + } + + static setContext(key: string, context: any) { + if (typeof window === 'undefined') return; + + Sentry.setContext(key, context); + } + + static showReportDialog(eventId?: string) { + if (typeof window === 'undefined') return; + + Sentry.showReportDialog({ + eventId, + title: 'Report a Bug', + subtitle: 'Help us improve Postiz by reporting this error.', + subtitle2: 'We\'ll get back to you if we need more information.', + }); + } +} diff --git a/libraries/helpers/src/sentry/sentry.react.ts b/libraries/helpers/src/sentry/sentry.react.ts new file mode 100644 index 00000000..3da61a11 --- /dev/null +++ b/libraries/helpers/src/sentry/sentry.react.ts @@ -0,0 +1,170 @@ +import * as Sentry from '@sentry/react'; +import { SentryConfigService } from './sentry.config'; + +export class SentryReactService { + static init() { + const config = SentryConfigService.getConfig(); + + if (!config.enabled) { + console.log('[Frontend] Sentry is disabled'); + return; + } + + console.log(`[Frontend] Initializing Sentry with environment: ${config.environment}`); + + Sentry.init({ + dsn: config.dsn, + environment: config.environment, + debug: config.debug, + release: config.release, + + // Performance Monitoring + tracesSampleRate: config.tracesSampleRate, + + // Session Replay + replaysSessionSampleRate: config.replaysSessionSampleRate, + replaysOnErrorSampleRate: config.replaysOnErrorSampleRate, + + integrations: [ + // Browser tracing for performance monitoring + Sentry.browserTracingIntegration(), + + // Session replay integration + Sentry.replayIntegration({ + // Mask all text content, inputs, etc. + maskAllText: false, + blockAllMedia: false, + }), + + // Breadcrumbs for user interactions + Sentry.breadcrumbsIntegration({ + console: false, // Don't capture console logs as breadcrumbs + dom: true, // Capture DOM interactions + fetch: true, // Capture fetch requests + history: true, // Capture navigation + sentry: true, // Capture Sentry events + xhr: true, // Capture XHR requests + }), + ], + + beforeSend(event, hint) { + // Filter out known non-critical errors + if (event.exception) { + const error = hint.originalException; + + // Skip network errors that are likely user-related + if (error && error instanceof TypeError) { + const message = error.message || ''; + if (message.includes('NetworkError') || + message.includes('Failed to fetch') || + message.includes('Load failed')) { + return null; + } + } + + // Skip ResizeObserver errors (common browser quirk) + if (error && typeof error === 'object' && 'message' in error && + typeof error.message === 'string' && error.message.includes('ResizeObserver')) { + return null; + } + + // Skip AbortError (user navigation) + if (error && typeof error === 'object' && 'name' in error && error.name === 'AbortError') { + return null; + } + } + + return event; + }, + + // Set user context + initialScope: { + tags: { + service: 'frontend', + version: config.release, + }, + }, + }); + + // Set up global error handlers + window.addEventListener('error', (event) => { + console.error('[Frontend] Global Error:', event.error); + }); + + window.addEventListener('unhandledrejection', (event) => { + console.error('[Frontend] Unhandled Promise Rejection:', event.reason); + }); + } + + static captureException(error: any, context?: any) { + if (!SentryConfigService.isEnabled()) return; + + return Sentry.withScope((scope) => { + if (context) { + scope.setContext('additional_context', context); + } + return Sentry.captureException(error); + }); + } + + static captureMessage(message: string, level: Sentry.SeverityLevel = 'info', context?: any) { + if (!SentryConfigService.isEnabled()) return; + + return Sentry.withScope((scope) => { + if (context) { + scope.setContext('additional_context', context); + } + return Sentry.captureMessage(message, level); + }); + } + + static setUser(user: { id?: string; email?: string; username?: string; organizationId?: string }) { + if (!SentryConfigService.isEnabled()) return; + + Sentry.setUser(user); + } + + static addBreadcrumb(message: string, category?: string, data?: any) { + if (!SentryConfigService.isEnabled()) return; + + Sentry.addBreadcrumb({ + message, + category: category || 'custom', + data, + timestamp: Date.now() / 1000, + }); + } + + static setTag(key: string, value: string) { + if (!SentryConfigService.isEnabled()) return; + + Sentry.setTag(key, value); + } + + static setContext(key: string, context: any) { + if (!SentryConfigService.isEnabled()) return; + + Sentry.setContext(key, context); + } + + static startTransaction(name: string, op?: string) { + if (!SentryConfigService.isEnabled()) return null; + + // Use startSpan instead of deprecated startTransaction + return Sentry.startSpan({ + name, + op: op || 'custom', + }, (span) => span); + } + + static showReportDialog(eventId?: string) { + if (!SentryConfigService.isEnabled()) return; + + Sentry.showReportDialog({ + eventId, + title: 'Report a Bug', + subtitle: 'Help us improve Postiz by reporting this error.', + subtitle2: 'We\'ll get back to you if we need more information.', + }); + } +} diff --git a/libraries/nestjs-libraries/src/database/prisma/database.module.ts b/libraries/nestjs-libraries/src/database/prisma/database.module.ts index 17198f05..7e89fcb1 100644 --- a/libraries/nestjs-libraries/src/database/prisma/database.module.ts +++ b/libraries/nestjs-libraries/src/database/prisma/database.module.ts @@ -39,6 +39,8 @@ import { SetsService } from '@gitroom/nestjs-libraries/database/prisma/sets/sets import { SetsRepository } from '@gitroom/nestjs-libraries/database/prisma/sets/sets.repository'; import { ThirdPartyRepository } from '@gitroom/nestjs-libraries/database/prisma/third-party/third-party.repository'; import { ThirdPartyService } from '@gitroom/nestjs-libraries/database/prisma/third-party/third-party.service'; +import { SentryNotificationService } from '@gitroom/nestjs-libraries/services/sentry.notification.service'; +import { SentryWorkerService } from '@gitroom/nestjs-libraries/services/sentry.worker.service'; import { VideoManager } from '@gitroom/nestjs-libraries/videos/video.manager'; import { FalService } from '@gitroom/nestjs-libraries/openai/fal.service'; @@ -90,6 +92,8 @@ import { FalService } from '@gitroom/nestjs-libraries/openai/fal.service'; SetsRepository, ThirdPartyRepository, ThirdPartyService, + SentryNotificationService, + SentryWorkerService, VideoManager, ], get exports() { diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts index 7bb42cb8..3cab518f 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -34,6 +34,7 @@ import sharp from 'sharp'; import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory'; import { Readable } from 'stream'; import { OpenaiService } from '@gitroom/nestjs-libraries/openai/openai.service'; +import { SentryNotificationService } from '@gitroom/nestjs-libraries/services/sentry.notification.service'; import { plainToInstance } from 'class-transformer'; import { validate } from 'class-validator'; import { stripHtmlValidation } from '@gitroom/helpers/utils/strip.html.validation'; @@ -58,7 +59,8 @@ export class PostsService { private _mediaService: MediaService, private _shortLinkService: ShortLinkService, private _webhookService: WebhooksService, - private openaiService: OpenaiService + private openaiService: OpenaiService, + private _sentryNotificationService: SentryNotificationService ) {} async getStatistics(orgId: string, id: string) { @@ -289,7 +291,24 @@ export class PostsService { return; } + // Track post publishing attempt + this._sentryNotificationService.trackPostEvent('attempt', { + postId: firstPost.id, + organizationId: firstPost.organizationId, + provider: firstPost.integration?.providerIdentifier || 'unknown', + metadata: { + postCount: allPosts.length, + scheduledDate: firstPost.publishDate, + }, + }); + if (firstPost.integration?.refreshNeeded) { + this._sentryNotificationService.trackIntegrationEvent('refresh_needed', { + integrationId: firstPost.integration.id, + organizationId: firstPost.organizationId, + provider: firstPost.integration.providerIdentifier, + }); + await this._notificationService.inAppNotification( firstPost.organizationId, `We couldn't post to ${firstPost.integration?.providerIdentifier} for ${firstPost?.integration?.name}`, @@ -300,6 +319,12 @@ export class PostsService { } if (firstPost.integration?.disabled) { + this._sentryNotificationService.trackIntegrationEvent('disconnected', { + integrationId: firstPost.integration.id, + organizationId: firstPost.organizationId, + provider: firstPost.integration.providerIdentifier, + }); + await this._notificationService.inAppNotification( firstPost.organizationId, `We couldn't post to ${firstPost.integration?.providerIdentifier} for ${firstPost?.integration?.name}`, @@ -329,6 +354,19 @@ export class PostsService { if (!finalPost?.postId || !finalPost?.releaseURL) { await this._postRepository.changeState(firstPost.id, 'ERROR'); + + // Track post failure + this._sentryNotificationService.trackPostEvent('failed', { + postId: firstPost.id, + organizationId: firstPost.organizationId, + provider: firstPost.integration?.providerIdentifier || 'unknown', + error: new Error('Post publishing failed - no postId or releaseURL returned'), + metadata: { + postCount: allPosts.length, + finalPost, + }, + }); + await this._notificationService.inAppNotification( firstPost.organizationId, `Error posting on ${firstPost.integration?.providerIdentifier} for ${firstPost?.integration?.name}`, @@ -338,6 +376,18 @@ export class PostsService { return; } + + // Track successful post + this._sentryNotificationService.trackPostEvent('success', { + postId: firstPost.id, + organizationId: firstPost.organizationId, + provider: firstPost.integration?.providerIdentifier || 'unknown', + metadata: { + postCount: allPosts.length, + postUrl: finalPost.releaseURL, + externalPostId: finalPost.postId, + }, + }); } catch (err: any) { await this._postRepository.changeState( firstPost.id, @@ -345,6 +395,20 @@ export class PostsService { err, allPosts ); + + // Track post failure with error details + this._sentryNotificationService.trackPostEvent('failed', { + postId: firstPost.id, + organizationId: firstPost.organizationId, + provider: firstPost.integration?.providerIdentifier || 'unknown', + error: err, + metadata: { + postCount: allPosts.length, + isBadBody: err instanceof BadBody, + isRefreshToken: err instanceof RefreshToken, + }, + }); + if (err instanceof BadBody) { await this._notificationService.inAppNotification( firstPost.organizationId, diff --git a/libraries/nestjs-libraries/src/services/sentry.exception.filter.ts b/libraries/nestjs-libraries/src/services/sentry.exception.filter.ts new file mode 100644 index 00000000..13f124eb --- /dev/null +++ b/libraries/nestjs-libraries/src/services/sentry.exception.filter.ts @@ -0,0 +1,119 @@ +import { ExceptionFilter, Catch, ArgumentsHost, HttpException, Logger } from '@nestjs/common'; +import { Request, Response } from 'express'; +import { SentryNestJSService } from '@gitroom/helpers/sentry'; + +@Catch() +export class SentryExceptionFilter implements ExceptionFilter { + private readonly logger = new Logger(SentryExceptionFilter.name); + + catch(exception: unknown, host: ArgumentsHost) { + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + const request = ctx.getRequest(); + + let status = 500; + let message = 'Internal server error'; + + // Determine if it's an HTTP exception + if (exception instanceof HttpException) { + status = exception.getStatus(); + const exceptionResponse = exception.getResponse(); + message = typeof exceptionResponse === 'string' ? exceptionResponse : + (exceptionResponse as any)?.message || message; + } + + // Log the error + this.logger.error(`${request.method} ${request.url}`, exception); + + // Send to Sentry (only for server errors or critical issues) + if (status >= 500 || (status >= 400 && this.shouldReportError(exception, request))) { + SentryNestJSService.captureException(exception, { + extra: { + url: request.url, + method: request.method, + headers: this.sanitizeHeaders(request.headers), + body: this.sanitizeBody(request.body), + query: request.query, + params: request.params, + userAgent: request.get('User-Agent'), + ip: request.ip, + status, + }, + tags: { + endpoint: `${request.method} ${request.route?.path || request.url}`, + statusCode: status.toString(), + }, + }); + } + + // Send error response to client + response.status(status).json({ + statusCode: status, + timestamp: new Date().toISOString(), + path: request.url, + message, + ...(process.env.NODE_ENV === 'development' && { + stack: exception instanceof Error ? exception.stack : undefined + }), + }); + } + + private shouldReportError(exception: unknown, request: Request): boolean { + // Don't report validation errors (400) unless they seem suspicious + if (exception instanceof HttpException) { + const status = exception.getStatus(); + + // Report authentication/authorization errors + if (status === 401 || status === 403) { + return true; + } + + // Report not found errors only if they seem like potential attacks + if (status === 404) { + const suspiciousPatterns = ['.php', '.asp', '.jsp', 'wp-admin', 'admin.php', 'config.']; + return suspiciousPatterns.some(pattern => request.url.includes(pattern)); + } + + // Report rate limiting + if (status === 429) { + return true; + } + } + + return false; + } + + private sanitizeHeaders(headers: any): any { + const sanitized = { ...headers }; + + // Remove sensitive headers + delete sanitized.authorization; + delete sanitized.cookie; + delete sanitized['x-api-key']; + delete sanitized['x-auth-token']; + + return sanitized; + } + + private sanitizeBody(body: any): any { + if (!body || typeof body !== 'object') { + return body; + } + + const sanitized = { ...body }; + + // Remove sensitive fields + const sensitiveFields = [ + 'password', 'token', 'secret', 'key', 'auth', 'credential', + 'accessToken', 'refreshToken', 'apiKey', 'privateKey' + ]; + + sensitiveFields.forEach(field => { + if (sanitized[field]) { + sanitized[field] = '[REDACTED]'; + } + }); + + return sanitized; + } +} diff --git a/libraries/nestjs-libraries/src/services/sentry.interceptor.ts b/libraries/nestjs-libraries/src/services/sentry.interceptor.ts new file mode 100644 index 00000000..3735bd0f --- /dev/null +++ b/libraries/nestjs-libraries/src/services/sentry.interceptor.ts @@ -0,0 +1,118 @@ +import { + Injectable, + NestInterceptor, + ExecutionContext, + CallHandler, +} from '@nestjs/common'; +import { Observable } from 'rxjs'; +import { tap, catchError } from 'rxjs/operators'; +import { SentryNestJSService } from '@gitroom/helpers/sentry'; +import { Request } from 'express'; + +@Injectable() +export class SentryInterceptor implements NestInterceptor { + intercept(context: ExecutionContext, next: CallHandler): Observable { + const request = context.switchToHttp().getRequest(); + const startTime = Date.now(); + + // Set request context + const endpoint = `${request.method} ${request.route?.path || request.url}`; + SentryNestJSService.setTag('endpoint', endpoint); + SentryNestJSService.setContext('request', { + url: request.url, + method: request.method, + headers: this.sanitizeHeaders(request.headers), + query: request.query, + params: request.params, + userAgent: request.get('User-Agent'), + ip: request.ip, + }); + + // Set user context if available + if ((request as any).user) { + SentryNestJSService.setUser({ + id: (request as any).user.id, + email: (request as any).user.email, + username: (request as any).user.username, + organizationId: (request as any).user.organizationId, + }); + } + + // Start performance transaction + const transaction = SentryNestJSService.startTransaction(endpoint, 'http.server'); + + return next.handle().pipe( + tap((response) => { + const duration = Date.now() - startTime; + + // Add breadcrumb for successful request (just for context, not an event) + SentryNestJSService.addBreadcrumb( + `${endpoint} completed successfully`, + 'http.request', + { + duration, + statusCode: context.switchToHttp().getResponse().statusCode, + } + ); + + // Track slow requests as warnings (performance issues) + if (duration > 5000) { // 5 seconds threshold + SentryNestJSService.captureMessage( + `Slow request: ${endpoint}`, + 'warning', + { + extra: { + duration, + url: request.url, + method: request.method, + }, + tags: { + event: 'slow_request', + endpoint, + }, + } + ); + } + + // Finish transaction + if (transaction) { + transaction.setStatus({ code: 1 }); // OK status + transaction.end(); + } + }), + catchError((error) => { + const duration = Date.now() - startTime; + + // Add breadcrumb for failed request + SentryNestJSService.addBreadcrumb( + `${endpoint} failed`, + 'http.request', + { + duration, + error: error.message, + } + ); + + // Finish transaction with error + if (transaction) { + transaction.setStatus({ code: 2 }); // ERROR status + transaction.end(); + } + + throw error; + }) + ); + } + + private sanitizeHeaders(headers: any): any { + const sanitized = { ...headers }; + + // Remove sensitive headers + delete sanitized.authorization; + delete sanitized.cookie; + delete sanitized['x-api-key']; + delete sanitized['x-auth-token']; + + return sanitized; + } +} diff --git a/libraries/nestjs-libraries/src/services/sentry.notification.service.ts b/libraries/nestjs-libraries/src/services/sentry.notification.service.ts new file mode 100644 index 00000000..7dde4fa7 --- /dev/null +++ b/libraries/nestjs-libraries/src/services/sentry.notification.service.ts @@ -0,0 +1,337 @@ +import { Injectable } from '@nestjs/common'; +import { SentryNestJSService } from '@gitroom/helpers/sentry'; + +@Injectable() +export class SentryNotificationService { + + /** + * Track post publishing attempts and failures + */ + trackPostEvent(event: 'attempt' | 'success' | 'failed', data: { + postId: string; + organizationId: string; + userId?: string; + provider: string; + error?: any; + metadata?: any; + }) { + const baseContext = { + postId: data.postId, + organizationId: data.organizationId, + provider: data.provider, + userId: data.userId, + }; + + switch (event) { + case 'attempt': + // Only track as breadcrumb, not as event + SentryNestJSService.addBreadcrumb( + `Post publishing attempt for ${data.provider}`, + 'post.attempt', + baseContext + ); + break; + + case 'success': + // Only track as breadcrumb, not as event - we don't need to alert on success + SentryNestJSService.addBreadcrumb( + `Post published successfully to ${data.provider}`, + 'post.success', + baseContext + ); + break; + + case 'failed': + // This is an actual error - capture it + SentryNestJSService.captureException(data.error || new Error('Post publishing failed'), { + extra: { + ...baseContext, + metadata: data.metadata, + }, + tags: { + event: 'post_failed', + provider: data.provider, + }, + level: 'error', + }); + break; + } + } + + /** + * Track integration connection issues + */ + trackIntegrationEvent(event: 'connected' | 'disconnected' | 'failed' | 'refresh_needed', data: { + integrationId: string; + organizationId: string; + userId?: string; + provider: string; + error?: any; + }) { + const baseContext = { + integrationId: data.integrationId, + organizationId: data.organizationId, + provider: data.provider, + userId: data.userId, + }; + + switch (event) { + case 'connected': + // Only track as breadcrumb - successful connections are not errors + SentryNestJSService.addBreadcrumb( + `Integration connected: ${data.provider}`, + 'integration.connected', + baseContext + ); + break; + + case 'disconnected': + // Only track as breadcrumb unless it's unexpected + SentryNestJSService.addBreadcrumb( + `Integration disconnected: ${data.provider}`, + 'integration.disconnected', + baseContext + ); + break; + + case 'failed': + // This is an actual error - capture it + SentryNestJSService.captureException(data.error || new Error('Integration failed'), { + extra: baseContext, + tags: { + event: 'integration_failed', + provider: data.provider, + }, + level: 'error', + }); + break; + + case 'refresh_needed': + // This is a warning-level issue that needs attention + SentryNestJSService.captureMessage(`Integration needs refresh: ${data.provider}`, 'warning', { + extra: baseContext, + tags: { + event: 'integration_refresh_needed', + provider: data.provider, + }, + }); + break; + } + } + + /** + * Track user authentication events + */ + trackAuthEvent(event: 'login' | 'logout' | 'failed_login' | 'registration', data: { + userId?: string; + email?: string; + provider?: string; + error?: any; + ip?: string; + userAgent?: string; + }) { + const baseContext = { + userId: data.userId, + email: data.email, + provider: data.provider, + ip: data.ip, + userAgent: data.userAgent, + }; + + switch (event) { + case 'login': + // Set user context but don't create an event - successful logins are not errors + SentryNestJSService.setUser({ + id: data.userId, + email: data.email, + }); + SentryNestJSService.addBreadcrumb( + 'User logged in', + 'auth.login', + baseContext + ); + break; + + case 'logout': + // Just a breadcrumb - logouts are not errors + SentryNestJSService.addBreadcrumb( + 'User logged out', + 'auth.logout', + baseContext + ); + break; + + case 'failed_login': + // This is a security issue - capture it, but at warning level unless it's suspicious + SentryNestJSService.captureMessage('Failed login attempt', 'warning', { + extra: baseContext, + tags: { + event: 'failed_login', + provider: data.provider || 'local', + }, + }); + break; + + case 'registration': + // Just a breadcrumb - registrations are not errors + SentryNestJSService.addBreadcrumb( + 'User registered', + 'auth.registration', + baseContext + ); + break; + } + } + + /** + * Track API rate limiting events + */ + trackRateLimitEvent(data: { + endpoint: string; + userId?: string; + organizationId?: string; + ip?: string; + limit: number; + remaining: number; + }) { + SentryNestJSService.captureMessage('API rate limit exceeded', 'warning', { + extra: data, + tags: { + event: 'rate_limit_exceeded', + endpoint: data.endpoint, + }, + }); + } + + /** + * Track worker job failures + */ + trackWorkerJobEvent(event: 'started' | 'completed' | 'failed' | 'stalled', data: { + jobName: string; + jobId: string; + organizationId?: string; + error?: any; + duration?: number; + attemptNumber?: number; + }) { + const baseContext = { + jobName: data.jobName, + jobId: data.jobId, + organizationId: data.organizationId, + duration: data.duration, + attemptNumber: data.attemptNumber, + }; + + switch (event) { + case 'started': + // Just breadcrumb - job starting is not an error + SentryNestJSService.addBreadcrumb( + `Worker job started: ${data.jobName}`, + 'worker.started', + baseContext + ); + break; + + case 'completed': + // Just breadcrumb - successful completion is not an error + SentryNestJSService.addBreadcrumb( + `Worker job completed: ${data.jobName}`, + 'worker.completed', + baseContext + ); + break; + + case 'failed': + // This is an actual error - capture it + SentryNestJSService.captureException(data.error || new Error('Worker job failed'), { + extra: baseContext, + tags: { + event: 'worker_job_failed', + jobName: data.jobName, + }, + level: 'error', + }); + break; + + case 'stalled': + // This is a performance/reliability issue - capture as warning + SentryNestJSService.captureMessage(`Worker job stalled: ${data.jobName}`, 'warning', { + extra: baseContext, + tags: { + event: 'worker_job_stalled', + jobName: data.jobName, + }, + }); + break; + } + } + + /** + * Track database connection issues + */ + trackDatabaseEvent(event: 'connected' | 'disconnected' | 'error', data: { + database: string; + error?: any; + }) { + switch (event) { + case 'connected': + // Just breadcrumb - successful connections are not errors + SentryNestJSService.addBreadcrumb( + `Database connected: ${data.database}`, + 'database.connected', + { database: data.database } + ); + break; + + case 'disconnected': + // Just breadcrumb - disconnections might be planned + SentryNestJSService.addBreadcrumb( + `Database disconnected: ${data.database}`, + 'database.disconnected', + { database: data.database } + ); + break; + + case 'error': + // This is an actual error - capture it + SentryNestJSService.captureException(data.error || new Error('Database error'), { + extra: { database: data.database }, + tags: { + event: 'database_error', + database: data.database, + }, + level: 'error', + }); + break; + } + } + + /** + * Track performance issues + */ + trackPerformanceIssue(data: { + operation: string; + duration: number; + threshold: number; + metadata?: any; + }) { + if (data.duration > data.threshold) { + SentryNestJSService.captureMessage( + `Slow operation detected: ${data.operation}`, + 'warning', + { + extra: { + operation: data.operation, + duration: data.duration, + threshold: data.threshold, + metadata: data.metadata, + }, + tags: { + event: 'slow_operation', + operation: data.operation, + }, + } + ); + } + } +} diff --git a/libraries/nestjs-libraries/src/services/sentry.worker.service.ts b/libraries/nestjs-libraries/src/services/sentry.worker.service.ts new file mode 100644 index 00000000..88229202 --- /dev/null +++ b/libraries/nestjs-libraries/src/services/sentry.worker.service.ts @@ -0,0 +1,42 @@ +import { Injectable } from '@nestjs/common'; +import { SentryNotificationService } from '@gitroom/nestjs-libraries/services/sentry.notification.service'; + +@Injectable() +export class SentryWorkerService { + constructor(private _sentryNotificationService: SentryNotificationService) {} + + trackJobStart(jobName: string, jobId: string, organizationId?: string) { + this._sentryNotificationService.trackWorkerJobEvent('started', { + jobName, + jobId, + organizationId, + }); + } + + trackJobComplete(jobName: string, jobId: string, duration: number, organizationId?: string) { + this._sentryNotificationService.trackWorkerJobEvent('completed', { + jobName, + jobId, + organizationId, + duration, + }); + } + + trackJobFailed(jobName: string, jobId: string, error: any, attemptNumber: number, organizationId?: string) { + this._sentryNotificationService.trackWorkerJobEvent('failed', { + jobName, + jobId, + organizationId, + error, + attemptNumber, + }); + } + + trackJobStalled(jobName: string, jobId: string, organizationId?: string) { + this._sentryNotificationService.trackWorkerJobEvent('stalled', { + jobName, + jobId, + organizationId, + }); + } +} diff --git a/libraries/react-shared-libraries/src/form/input.tsx b/libraries/react-shared-libraries/src/form/input.tsx index 18e0cfc7..a02a0e4b 100644 --- a/libraries/react-shared-libraries/src/form/input.tsx +++ b/libraries/react-shared-libraries/src/form/input.tsx @@ -2,7 +2,7 @@ import { DetailedHTMLProps, - FC, + forwardRef, InputHTMLAttributes, ReactNode, useEffect, @@ -13,7 +13,8 @@ import { useFormContext, useWatch } from 'react-hook-form'; import interClass from '../helpers/inter.font'; import { TranslatedLabel } from '../translation/translated-label'; -export const Input: FC< +export const Input = forwardRef< + HTMLInputElement, DetailedHTMLProps, HTMLInputElement> & { removeError?: boolean; error?: any; @@ -25,7 +26,7 @@ export const Input: FC< translationKey?: string; translationParams?: Record; } -> = (props) => { +>((props, ref) => { const { label, icon, @@ -69,11 +70,11 @@ export const Input: FC< > {icon &&
{icon}
} @@ -82,4 +83,6 @@ export const Input: FC< )} ); -}; +}); + +Input.displayName = 'Input'; diff --git a/package.json b/package.json index eac61e35..d1926c4e 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,13 @@ "@neynar/react": "^0.9.7", "@postiz/wallets": "^0.0.1", "@prisma/client": "^6.5.0", + "@sentry/browser": "^8.47.0", + "@sentry/integrations": "^7.119.2", + "@sentry/nestjs": "^8.47.0", + "@sentry/nextjs": "^8.47.0", + "@sentry/profiling-node": "^8.47.0", + "@sentry/react": "^8.47.0", + "@sentry/tracing": "^7.119.2", "@solana/wallet-adapter-react": "^0.15.35", "@solana/wallet-adapter-react-ui": "^0.9.35", "@swc/helpers": "0.5.13", @@ -251,6 +258,7 @@ "@vitest/ui": "1.6.0", "autoprefixer": "^10.4.17", "babel-jest": "29.7.0", + "cross-env": "^7.0.3", "eslint": "8.57.0", "eslint-config-next": "15.2.1", "eslint-config-prettier": "^9.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f86f6a35..49fa3c92 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,22 +32,22 @@ importers: version: 1.9.1(@types/react@18.3.1)(graphql@16.11.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@copilotkit/runtime': specifier: ^1.8.9 - version: 1.9.1(c5471b8398984d771289b2ff58637182) + version: 1.9.1(37fc48f1a3a9b56579a0b848d01daf77) '@hookform/resolvers': specifier: ^3.3.4 version: 3.10.0(react-hook-form@7.60.0(react@18.3.1)) '@langchain/community': specifier: ^0.3.40 - version: 0.3.48(d048894cc6ae3aa1ff34a323f4ef4bd6) + version: 0.3.48(6ff87b346628c7927e0a2cdb4815edfe) '@langchain/core': specifier: ^0.3.44 - version: 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + version: 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) '@langchain/langgraph': specifier: ^0.2.63 - version: 0.2.74(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1)(zod-to-json-schema@3.24.6(zod@3.25.74)) + version: 0.2.74(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1)(zod-to-json-schema@3.24.6(zod@3.25.74)) '@langchain/openai': specifier: ^0.5.5 - version: 0.5.18(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.5.18(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@mantine/core': specifier: ^5.10.5 version: 5.10.5(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@mantine/hooks@5.10.5(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -95,10 +95,31 @@ importers: version: 0.9.7(@babel/core@7.28.0)(@opentelemetry/api@1.9.0)(@pigment-css/react@0.0.9(@types/react@18.3.1)(react@18.3.1)(typescript@5.5.4))(@playwright/test@1.53.2)(@storybook/addons@7.6.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(babel-plugin-macros@3.1.0)(hls.js@1.6.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.89.2)(swr@2.3.4(react@18.3.1)) '@postiz/wallets': specifier: ^0.0.1 - version: 0.0.1(@babel/runtime@7.27.6)(@react-native-async-storage/async-storage@1.24.0(react-native@0.80.1(@babel/core@7.28.0)(@types/react@18.3.1)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@18.3.1)(bs58@6.0.0)(bufferutil@4.0.9)(ioredis@5.6.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.74) + version: 0.0.1(@babel/runtime@7.27.6)(@react-native-async-storage/async-storage@1.24.0(react-native@0.80.1(@babel/core@7.28.0)(@types/react@18.3.1)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)))(@sentry/types@7.120.3)(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@18.3.1)(bs58@6.0.0)(bufferutil@4.0.9)(ioredis@5.6.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.74) '@prisma/client': specifier: ^6.5.0 version: 6.11.1(prisma@6.11.1(typescript@5.5.4))(typescript@5.5.4) + '@sentry/browser': + specifier: ^8.47.0 + version: 8.55.0 + '@sentry/integrations': + specifier: ^7.119.2 + version: 7.120.3 + '@sentry/nestjs': + specifier: ^8.47.0 + version: 8.55.0(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19) + '@sentry/nextjs': + specifier: ^8.47.0 + version: 8.55.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@14.2.30(@babel/core@7.28.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.89.2))(react@18.3.1)(webpack@5.87.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.25.5)) + '@sentry/profiling-node': + specifier: ^8.47.0 + version: 8.55.0 + '@sentry/react': + specifier: ^8.47.0 + version: 8.55.0(react@18.3.1) + '@sentry/tracing': + specifier: ^7.119.2 + version: 7.120.3 '@solana/wallet-adapter-react': specifier: ^0.15.35 version: 0.15.39(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.80.1(@babel/core@7.28.0)(@types/react@18.3.1)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) @@ -625,6 +646,9 @@ importers: babel-jest: specifier: 29.7.0 version: 29.7.0(@babel/core@7.28.0) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 eslint: specifier: 8.57.0 version: 8.57.0 @@ -3648,10 +3672,230 @@ packages: engines: {node: '>=16'} hasBin: true + '@opentelemetry/api-logs@0.53.0': + resolution: {integrity: sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==} + engines: {node: '>=14'} + + '@opentelemetry/api-logs@0.57.1': + resolution: {integrity: sha512-I4PHczeujhQAQv6ZBzqHYEUiggZL4IdSMixtVD3EYqbdrjujE7kRfI5QohjlPoJm8BvenoW5YaTMWRrbpot6tg==} + engines: {node: '>=14'} + + '@opentelemetry/api-logs@0.57.2': + resolution: {integrity: sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==} + engines: {node: '>=14'} + '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} + '@opentelemetry/context-async-hooks@1.30.1': + resolution: {integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@1.30.1': + resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/instrumentation-amqplib@0.46.1': + resolution: {integrity: sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-connect@0.43.0': + resolution: {integrity: sha512-Q57JGpH6T4dkYHo9tKXONgLtxzsh1ZEW5M9A/OwKrZFyEpLqWgjhcZ3hIuVvDlhb426iDF1f9FPToV/mi5rpeA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-dataloader@0.16.0': + resolution: {integrity: sha512-88+qCHZC02up8PwKHk0UQKLLqGGURzS3hFQBZC7PnGwReuoKjHXS1o29H58S+QkXJpkTr2GACbx8j6mUoGjNPA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-express@0.47.0': + resolution: {integrity: sha512-XFWVx6k0XlU8lu6cBlCa29ONtVt6ADEjmxtyAyeF2+rifk8uBJbk1La0yIVfI0DoKURGbaEDTNelaXG9l/lNNQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fastify@0.44.1': + resolution: {integrity: sha512-RoVeMGKcNttNfXMSl6W4fsYoCAYP1vi6ZAWIGhBY+o7R9Y0afA7f9JJL0j8LHbyb0P0QhSYk+6O56OwI2k4iRQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fs@0.19.0': + resolution: {integrity: sha512-JGwmHhBkRT2G/BYNV1aGI+bBjJu4fJUD/5/Jat0EWZa2ftrLV3YE8z84Fiij/wK32oMZ88eS8DI4ecLGZhpqsQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-generic-pool@0.43.0': + resolution: {integrity: sha512-at8GceTtNxD1NfFKGAuwtqM41ot/TpcLh+YsGe4dhf7gvv1HW/ZWdq6nfRtS6UjIvZJOokViqLPJ3GVtZItAnQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-graphql@0.47.0': + resolution: {integrity: sha512-Cc8SMf+nLqp0fi8oAnooNEfwZWFnzMiBHCGmDFYqmgjPylyLmi83b+NiTns/rKGwlErpW0AGPt0sMpkbNlzn8w==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-hapi@0.45.1': + resolution: {integrity: sha512-VH6mU3YqAKTePPfUPwfq4/xr049774qWtfTuJqVHoVspCLiT3bW+fCQ1toZxt6cxRPYASoYaBsMA3CWo8B8rcw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.57.1': + resolution: {integrity: sha512-ThLmzAQDs7b/tdKI3BV2+yawuF09jF111OFsovqT1Qj3D8vjwKBwhi/rDE5xethwn4tSXtZcJ9hBsVAlWFQZ7g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-ioredis@0.47.0': + resolution: {integrity: sha512-4HqP9IBC8e7pW9p90P3q4ox0XlbLGme65YTrA3UTLvqvo4Z6b0puqZQP203YFu8m9rE/luLfaG7/xrwwqMUpJw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-kafkajs@0.7.0': + resolution: {integrity: sha512-LB+3xiNzc034zHfCtgs4ITWhq6Xvdo8bsq7amR058jZlf2aXXDrN9SV4si4z2ya9QX4tz6r4eZJwDkXOp14/AQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-knex@0.44.0': + resolution: {integrity: sha512-SlT0+bLA0Lg3VthGje+bSZatlGHw/vwgQywx0R/5u9QC59FddTQSPJeWNw29M6f8ScORMeUOOTwihlQAn4GkJQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-koa@0.47.0': + resolution: {integrity: sha512-HFdvqf2+w8sWOuwtEXayGzdZ2vWpCKEQv5F7+2DSA74Te/Cv4rvb2E5So5/lh+ok4/RAIPuvCbCb/SHQFzMmbw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-lru-memoizer@0.44.0': + resolution: {integrity: sha512-Tn7emHAlvYDFik3vGU0mdwvWJDwtITtkJ+5eT2cUquct6nIs+H8M47sqMJkCpyPe5QIBJoTOHxmc6mj9lz6zDw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongodb@0.51.0': + resolution: {integrity: sha512-cMKASxCX4aFxesoj3WK8uoQ0YUrRvnfxaO72QWI2xLu5ZtgX/QvdGBlU3Ehdond5eb74c2s1cqRQUIptBnKz1g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongoose@0.46.0': + resolution: {integrity: sha512-mtVv6UeaaSaWTeZtLo4cx4P5/ING2obSqfWGItIFSunQBrYROfhuVe7wdIrFUs2RH1tn2YYpAJyMaRe/bnTTIQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql2@0.45.0': + resolution: {integrity: sha512-qLslv/EPuLj0IXFvcE3b0EqhWI8LKmrgRPIa4gUd8DllbBpqJAvLNJSv3cC6vWwovpbSI3bagNO/3Q2SuXv2xA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql@0.45.0': + resolution: {integrity: sha512-tWWyymgwYcTwZ4t8/rLDfPYbOTF3oYB8SxnYMtIQ1zEf5uDm90Ku3i6U/vhaMyfHNlIHvDhvJh+qx5Nc4Z3Acg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-nestjs-core@0.44.0': + resolution: {integrity: sha512-t16pQ7A4WYu1yyQJZhRKIfUNvl5PAaF2pEteLvgJb/BWdd1oNuU1rOYt4S825kMy+0q4ngiX281Ss9qiwHfxFQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pg@0.50.0': + resolution: {integrity: sha512-TtLxDdYZmBhFswm8UIsrDjh/HFBeDXd4BLmE8h2MxirNHewLJ0VS9UUddKKEverb5Sm2qFVjqRjcU+8Iw4FJ3w==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-redis-4@0.46.0': + resolution: {integrity: sha512-aTUWbzbFMFeRODn3720TZO0tsh/49T8H3h8vVnVKJ+yE36AeW38Uj/8zykQ/9nO8Vrtjr5yKuX3uMiG/W8FKNw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-tedious@0.18.0': + resolution: {integrity: sha512-9zhjDpUDOtD+coeADnYEJQ0IeLVCj7w/hqzIutdp5NqS1VqTAanaEfsEcSypyvYv5DX3YOsTUoF+nr2wDXPETA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-undici@0.10.0': + resolution: {integrity: sha512-vm+V255NGw9gaSsPD6CP0oGo8L55BffBc8KnxqsMuc6XiAD1L8SFNzsW0RHhxJFqy9CJaJh+YiJ5EHXuZ5rZBw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.7.0 + + '@opentelemetry/instrumentation@0.53.0': + resolution: {integrity: sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.57.1': + resolution: {integrity: sha512-SgHEKXoVxOjc20ZYusPG3Fh+RLIZTSa4x8QtD3NfgAUDyqdFFS9W1F2ZVbZkqDCdyMcQG02Ok4duUGLHJXHgbA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.57.2': + resolution: {integrity: sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/redis-common@0.36.2': + resolution: {integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==} + engines: {node: '>=14'} + + '@opentelemetry/resources@1.30.1': + resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@1.30.1': + resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.27.0': + resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.28.0': + resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.36.0': + resolution: {integrity: sha512-TtxJSRD8Ohxp6bKkhrm27JRHAxPczQA7idtcTOMYI+wQRRrfgqxHv1cFbCApcSnNjtXkmzFozn6jQtFrOmbjPQ==} + engines: {node: '>=14'} + + '@opentelemetry/sql-common@0.40.1': + resolution: {integrity: sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} @@ -3834,6 +4078,9 @@ packages: '@prisma/get-platform@6.11.1': resolution: {integrity: sha512-b2Z8oV2gwvdCkFemBTFd0x4lsL4O2jLSx8lB7D+XqoFALOQZPa7eAPE1NU0Mj1V8gPHRxIsHnyUNtw2i92psUw==} + '@prisma/instrumentation@5.22.0': + resolution: {integrity: sha512-LxccF392NN37ISGxIurUljZSh1YWnphO34V5a0+T7FVQG2u9bhAXRTJpgmQ3483woVhkraQZFF7cbRrpbw/F4Q==} + '@project-serum/sol-wallet-adapter@0.2.6': resolution: {integrity: sha512-cpIb13aWPW8y4KzkZAPDgw+Kb+DXjCC6rZoH74MGm3I/6e/zKyGnfAuW5olb2zxonFqsYgnv7ev8MQnvSgJ3/g==} engines: {node: '>=10'} @@ -4347,10 +4594,28 @@ packages: '@rolldown/pluginutils@1.0.0-beta.19': resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} + '@rollup/plugin-commonjs@28.0.1': + resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/pluginutils@4.2.1': resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.44.2': resolution: {integrity: sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==} cpu: [arm] @@ -4506,6 +4771,157 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + '@sentry-internal/browser-utils@8.55.0': + resolution: {integrity: sha512-ROgqtQfpH/82AQIpESPqPQe0UyWywKJsmVIqi3c5Fh+zkds5LUxnssTj3yNd1x+kxaPDVB023jAP+3ibNgeNDw==} + engines: {node: '>=14.18'} + + '@sentry-internal/feedback@8.55.0': + resolution: {integrity: sha512-cP3BD/Q6pquVQ+YL+rwCnorKuTXiS9KXW8HNKu4nmmBAyf7urjs+F6Hr1k9MXP5yQ8W3yK7jRWd09Yu6DHWOiw==} + engines: {node: '>=14.18'} + + '@sentry-internal/replay-canvas@8.55.0': + resolution: {integrity: sha512-nIkfgRWk1091zHdu4NbocQsxZF1rv1f7bbp3tTIlZYbrH62XVZosx5iHAuZG0Zc48AETLE7K4AX9VGjvQj8i9w==} + engines: {node: '>=14.18'} + + '@sentry-internal/replay@8.55.0': + resolution: {integrity: sha512-roCDEGkORwolxBn8xAKedybY+Jlefq3xYmgN2fr3BTnsXjSYOPC7D1/mYqINBat99nDtvgFvNfRcZPiwwZ1hSw==} + engines: {node: '>=14.18'} + + '@sentry-internal/tracing@7.120.3': + resolution: {integrity: sha512-Ausx+Jw1pAMbIBHStoQ6ZqDZR60PsCByvHdw/jdH9AqPrNE9xlBSf9EwcycvmrzwyKspSLaB52grlje2cRIUMg==} + engines: {node: '>=8'} + + '@sentry/babel-plugin-component-annotate@2.22.7': + resolution: {integrity: sha512-aa7XKgZMVl6l04NY+3X7BP7yvQ/s8scn8KzQfTLrGRarziTlMGrsCOBQtCNWXOPEbtxAIHpZ9dsrAn5EJSivOQ==} + engines: {node: '>= 14'} + + '@sentry/browser@8.55.0': + resolution: {integrity: sha512-1A31mCEWCjaMxJt6qGUK+aDnLDcK6AwLAZnqpSchNysGni1pSn1RWSmk9TBF8qyTds5FH8B31H480uxMPUJ7Cw==} + engines: {node: '>=14.18'} + + '@sentry/bundler-plugin-core@2.22.7': + resolution: {integrity: sha512-ouQh5sqcB8vsJ8yTTe0rf+iaUkwmeUlGNFi35IkCFUQlWJ22qS6OfvNjOqFI19e6eGUXks0c/2ieFC4+9wJ+1g==} + engines: {node: '>= 14'} + + '@sentry/cli-darwin@2.39.1': + resolution: {integrity: sha512-kiNGNSAkg46LNGatfNH5tfsmI/kCAaPA62KQuFZloZiemTNzhy9/6NJP8HZ/GxGs8GDMxic6wNrV9CkVEgFLJQ==} + engines: {node: '>=10'} + os: [darwin] + + '@sentry/cli-linux-arm64@2.39.1': + resolution: {integrity: sha512-5VbVJDatolDrWOgaffsEM7znjs0cR8bHt9Bq0mStM3tBolgAeSDHE89NgHggfZR+DJ2VWOy4vgCwkObrUD6NQw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux, freebsd] + + '@sentry/cli-linux-arm@2.39.1': + resolution: {integrity: sha512-DkENbxyRxUrfLnJLXTA4s5UL/GoctU5Cm4ER1eB7XN7p9WsamFJd/yf2KpltkjEyiTuplv0yAbdjl1KX3vKmEQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux, freebsd] + + '@sentry/cli-linux-i686@2.39.1': + resolution: {integrity: sha512-pXWVoKXCRrY7N8vc9H7mETiV9ZCz+zSnX65JQCzZxgYrayQPJTc+NPRnZTdYdk5RlAupXaFicBI2GwOCRqVRkg==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [linux, freebsd] + + '@sentry/cli-linux-x64@2.39.1': + resolution: {integrity: sha512-IwayNZy+it7FWG4M9LayyUmG1a/8kT9+/IEm67sT5+7dkMIMcpmHDqL8rWcPojOXuTKaOBBjkVdNMBTXy0mXlA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux, freebsd] + + '@sentry/cli-win32-i686@2.39.1': + resolution: {integrity: sha512-NglnNoqHSmE+Dz/wHeIVRnV2bLMx7tIn3IQ8vXGO5HWA2f8zYJGktbkLq1Lg23PaQmeZLPGlja3gBQfZYSG10Q==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [win32] + + '@sentry/cli-win32-x64@2.39.1': + resolution: {integrity: sha512-xv0R2CMf/X1Fte3cMWie1NXuHmUyQPDBfCyIt6k6RPFPxAYUgcqgMPznYwVMwWEA1W43PaOkSn3d8ZylsDaETw==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@sentry/cli@2.39.1': + resolution: {integrity: sha512-JIb3e9vh0+OmQ0KxmexMXg9oZsR/G7HMwxt5BUIKAXZ9m17Xll4ETXTRnRUBT3sf7EpNGAmlQk1xEmVN9pYZYQ==} + engines: {node: '>= 10'} + hasBin: true + + '@sentry/core@7.120.3': + resolution: {integrity: sha512-vyy11fCGpkGK3qI5DSXOjgIboBZTriw0YDx/0KyX5CjIjDDNgp5AGgpgFkfZyiYiaU2Ww3iFuKo4wHmBusz1uA==} + engines: {node: '>=8'} + + '@sentry/core@8.55.0': + resolution: {integrity: sha512-6g7jpbefjHYs821Z+EBJ8r4Z7LT5h80YSWRJaylGS4nW5W5Z2KXzpdnyFarv37O7QjauzVC2E+PABmpkw5/JGA==} + engines: {node: '>=14.18'} + + '@sentry/integrations@7.120.3': + resolution: {integrity: sha512-6i/lYp0BubHPDTg91/uxHvNui427df9r17SsIEXa2eKDwQ9gW2qRx5IWgvnxs2GV/GfSbwcx4swUB3RfEWrXrQ==} + engines: {node: '>=8'} + + '@sentry/nestjs@8.55.0': + resolution: {integrity: sha512-mhedJKgsEW9xQiBWt1qvVRkJdo7Raw6VBivgBT3zxfeVWv4n/KzEIzdV7MWyZzxVd4CeM8OZGkk1S0E/nJiRdQ==} + engines: {node: '>=16'} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 + + '@sentry/nextjs@8.55.0': + resolution: {integrity: sha512-poUjt8KF/6RKn0AwBYgtFu764nduziCYpuLgfDNTs7qAMWBMq3tTnDiXxjwJCDnaPeZRAK2pfoAEZxWSXf+22w==} + engines: {node: '>=14.18'} + peerDependencies: + next: ^13.2.0 || ^14.0 || ^15.0.0-rc.0 + + '@sentry/node@8.55.0': + resolution: {integrity: sha512-h10LJLDTRAzYgay60Oy7moMookqqSZSviCWkkmHZyaDn+4WURnPp5SKhhfrzPRQcXKrweiOwDSHBgn1tweDssg==} + engines: {node: '>=14.18'} + + '@sentry/opentelemetry@8.55.0': + resolution: {integrity: sha512-UvatdmSr3Xf+4PLBzJNLZ2JjG1yAPWGe/VrJlJAqyTJ2gKeTzgXJJw8rp4pbvNZO8NaTGEYhhO+scLUj0UtLAQ==} + engines: {node: '>=14.18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/context-async-hooks': ^1.30.1 + '@opentelemetry/core': ^1.30.1 + '@opentelemetry/instrumentation': ^0.57.1 + '@opentelemetry/sdk-trace-base': ^1.30.1 + '@opentelemetry/semantic-conventions': ^1.28.0 + + '@sentry/profiling-node@8.55.0': + resolution: {integrity: sha512-rYrlxbMlfQLHhkBUEC7bviuja1rojCb4+TtXi4NGnB4PppZeveGeuVTdJDWt3Ed6IBd20EEYoXv4+0aETbEnpw==} + engines: {node: '>=14.18'} + hasBin: true + + '@sentry/react@8.55.0': + resolution: {integrity: sha512-/qNBvFLpvSa/Rmia0jpKfJdy16d4YZaAnH/TuKLAtm0BWlsPQzbXCU4h8C5Hsst0Do0zG613MEtEmWpWrVOqWA==} + engines: {node: '>=14.18'} + peerDependencies: + react: ^16.14.0 || 17.x || 18.x || 19.x + + '@sentry/tracing@7.120.3': + resolution: {integrity: sha512-B7bqyYFgHuab1Pn7w5KXsZP/nfFo4VDBDdSXDSWYk5+TYJ3IDruO3eJFhOrircfsz4YwazWm9kbeZhkpsHDyHg==} + engines: {node: '>=8'} + + '@sentry/types@7.120.3': + resolution: {integrity: sha512-C4z+3kGWNFJ303FC+FxAd4KkHvxpNFYAFN8iMIgBwJdpIl25KZ8Q/VdGn0MLLUEHNLvjob0+wvwlcRBBNLXOow==} + engines: {node: '>=8'} + + '@sentry/utils@7.120.3': + resolution: {integrity: sha512-UDAOQJtJDxZHQ5Nm1olycBIsz2wdGX8SdzyGVHmD8EOQYAeDZQyIlQYohDe9nazdIOQLZCIc3fU0G9gqVLkaGQ==} + engines: {node: '>=8'} + + '@sentry/vercel-edge@8.55.0': + resolution: {integrity: sha512-uDoHz+iBjkXsyRStodZxHssMXj7WbOrDkFLy7ggCtvREBg2n4CRS4OcBu+kAwZOysOZblAtx/ZOdIMW1kJXswQ==} + engines: {node: '>=14.18'} + + '@sentry/webpack-plugin@2.22.7': + resolution: {integrity: sha512-j5h5LZHWDlm/FQCCmEghQ9FzYXwfZdlOf3FE/X6rK6lrtx0JCAkq+uhMSasoyP4XYKL4P4vRS6WFSos4jxf/UA==} + engines: {node: '>= 14'} + peerDependencies: + webpack: '>=4.40.0' + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -5727,6 +6143,9 @@ packages: '@types/connect-history-api-fallback@1.5.4': resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + '@types/connect@3.4.36': + resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -5870,6 +6289,9 @@ packages: '@types/multipipe@3.0.5': resolution: {integrity: sha512-mHBbV67bsmUtLtio0gj/GPzGsjv+Y6K1ff/48iR6YAfFfLkBtRIR0M5lZPbkMCyHGrCZM9p3VNnfY1QCws4t4w==} + '@types/mysql@2.15.26': + resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} + '@types/node-fetch@2.6.12': resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} @@ -5894,6 +6316,12 @@ packages: '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/pg-pool@2.0.6': + resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} + + '@types/pg@8.6.1': + resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} + '@types/prismjs@1.26.5': resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} @@ -5961,6 +6389,9 @@ packages: '@types/sha256@0.2.2': resolution: {integrity: sha512-uKMaDzyzfcDYGEwTgLh+hmgDMxXWyIVodY8T+qt7A+NYvikW0lmGLMGbQ7BipCB8dzXHa55C9g+Ii/3Lgt1KmA==} + '@types/shimmer@1.2.0': + resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} + '@types/sockjs@0.3.36': resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} @@ -5977,6 +6408,9 @@ packages: '@types/striptags@0.0.5': resolution: {integrity: sha512-mBUyVLvQJcRlqbCsO6ma/YblmFGSo8Jo8T0+ZzBate9Y8gTtLHemeiebzAFSBfF97EsycYQnXHCDkNeduiKPyA==} + '@types/tedious@4.0.14': + resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} + '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} @@ -6658,6 +7092,11 @@ packages: peerDependencies: acorn: ^8 + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -7284,6 +7723,10 @@ packages: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -7540,6 +7983,9 @@ packages: resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} engines: {node: '>= 6'} + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + compare-versions@4.1.4: resolution: {integrity: sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw==} @@ -7736,6 +8182,11 @@ packages: cron@3.2.1: resolution: {integrity: sha512-w2n5l49GMmmkBFEsH9FIDhjZ1n1QgTMOCMGuQtOXs5veNiosZmso6bQGuqOJSYAXXrG84WQFVneNk+Yt0Ua9iw==} + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + cross-fetch@3.2.0: resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} @@ -8897,6 +9348,9 @@ packages: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} + forwarded-parse@2.1.2: + resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -9497,6 +9951,9 @@ packages: image-to-pdf@3.0.2: resolution: {integrity: sha512-6/IQCt4f384zjQ1w8P7FHIN/tF0mau8RbAIydT/+wyfZ1RAb8E2fiKe9t/k0V880h0d3zRpw9Q1bM5AIgVL/4g==} + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + immer@9.0.21: resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} @@ -9511,6 +9968,9 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-in-the-middle@1.14.2: + resolution: {integrity: sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw==} + import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} @@ -9788,6 +10248,9 @@ packages: is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -10422,6 +10885,9 @@ packages: libphonenumber-js@1.12.9: resolution: {integrity: sha512-VWwAdNeJgN7jFOD+wN4qx83DTPMVPPAUyx9/TUkBXKLiNkuWWk6anV0439tgdtwaJDrEdqkvdN22iA6J4bUCZg==} + lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + lighthouse-logger@1.4.2: resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} @@ -10530,6 +10996,9 @@ packages: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} + localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -11238,6 +11707,9 @@ packages: mobx@6.13.7: resolution: {integrity: sha512-aChaVU/DO5aRPmk1GX8L+whocagUUpBQqoPtJk+cm7UOXUk87J4PeWCh6nNmTTIfEhiR9DI/+FnA8dln/hTK7g==} + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -11417,6 +11889,10 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-abi@3.75.0: + resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} + engines: {node: '>=10'} + node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} @@ -11926,6 +12402,17 @@ packages: performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-protocol@1.10.3: + resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -12089,6 +12576,22 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + posthog-js@1.256.2: resolution: {integrity: sha512-ypepnUHr33i5a1Uk39mozZXXTENRPC17HCG3WHKK6aRcpNwNs8uEqXaIKICGNM+qre+totKeTgl0WoaUFYmyoQ==} peerDependencies: @@ -12155,6 +12658,10 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + promise-queue@2.2.5: resolution: {integrity: sha512-p/iXrPSVfnqPft24ZdNNLECw/UrtLTpT3jpAAMzl/o5/rDsGCPo3/CQS2611flL6LkoEJ3oQZw7C8Q80ZISXRQ==} engines: {node: '>= 0.8.0'} @@ -12868,6 +13375,10 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-in-the-middle@7.5.2: + resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} + engines: {node: '>=8.6.0'} + require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} @@ -12909,6 +13420,10 @@ packages: engines: {node: '>= 0.4'} hasBin: true + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + resolve@2.0.0-next.5: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true @@ -12965,6 +13480,11 @@ packages: engines: {node: '>=10.0.0'} hasBin: true + rollup@3.29.5: + resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + rollup@4.44.2: resolution: {integrity: sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -13211,6 +13731,9 @@ packages: engines: {node: '>=4'} hasBin: true + shimmer@1.2.1: + resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -14257,6 +14780,9 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin@1.0.1: + resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} + unrs-resolver@1.10.1: resolution: {integrity: sha512-EFrL7Hw4kmhZdwWO3dwwFJo6hO3FXuQ6Bg8BK/faHZ9m1YxqBS31BNSTxklIQkxK/4LlV8zTYnPsIRLBzTzjCA==} @@ -14707,6 +15233,9 @@ packages: resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} engines: {node: '>=10.13.0'} + webpack-virtual-modules@0.5.0: + resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + webpack@5.87.0: resolution: {integrity: sha512-GOu1tNbQ7p1bDEoFRs2YPcfyGs8xq52yyPBZ3m2VGnXGtV9MxjrkABHm4V9Ia280OefsSLzvbVoXcfLxjKY/Iw==} engines: {node: '>=10.13.0'} @@ -15060,11 +15589,11 @@ snapshots: '@ag-ui/core': 0.0.28 '@ag-ui/proto': 0.0.28 - '@ag-ui/langgraph@0.0.3(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))(react@18.3.1)': + '@ag-ui/langgraph@0.0.3(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))(react@18.3.1)': dependencies: '@ag-ui/client': 0.0.28 - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) - '@langchain/langgraph-sdk': 0.0.78(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/langgraph-sdk': 0.0.78(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1) partial-json: 0.1.7 rxjs: 7.8.1 transitivePeerDependencies: @@ -16812,22 +17341,22 @@ snapshots: - encoding - graphql - '@copilotkit/runtime@1.9.1(c5471b8398984d771289b2ff58637182)': + '@copilotkit/runtime@1.9.1(37fc48f1a3a9b56579a0b848d01daf77)': dependencies: '@ag-ui/client': 0.0.28 '@ag-ui/core': 0.0.28 '@ag-ui/encoder': 0.0.28 - '@ag-ui/langgraph': 0.0.3(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))(react@18.3.1) + '@ag-ui/langgraph': 0.0.3(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))(react@18.3.1) '@ag-ui/proto': 0.0.28 '@anthropic-ai/sdk': 0.27.3 '@copilotkit/shared': 1.9.1 '@graphql-yoga/plugin-defer-stream': 3.14.0(graphql-yoga@5.14.0(graphql@16.11.0))(graphql@16.11.0) - '@langchain/aws': 0.1.11(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))) - '@langchain/community': 0.3.48(d048894cc6ae3aa1ff34a323f4ef4bd6) - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) - '@langchain/google-gauth': 0.1.8(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(zod@3.25.74) - '@langchain/langgraph-sdk': 0.0.70(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1) - '@langchain/openai': 0.4.9(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@langchain/aws': 0.1.11(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))) + '@langchain/community': 0.3.48(6ff87b346628c7927e0a2cdb4815edfe) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/google-gauth': 0.1.8(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(zod@3.25.74) + '@langchain/langgraph-sdk': 0.0.70(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1) + '@langchain/openai': 0.4.9(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) class-transformer: 0.5.1 class-validator: 0.14.2 express: 4.21.2 @@ -16835,7 +17364,7 @@ snapshots: graphql-scalars: 1.24.2(graphql@16.11.0) graphql-yoga: 5.14.0(graphql@16.11.0) groq-sdk: 0.5.0 - langchain: 0.3.29(@langchain/aws@0.1.11(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))))(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(@opentelemetry/api@1.9.0)(axios@1.10.0)(cheerio@1.1.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + langchain: 0.3.29(@langchain/aws@0.1.11(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))))(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(axios@1.10.0)(cheerio@1.1.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) openai: 4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74) partial-json: 0.1.7 pino: 9.7.0 @@ -17829,30 +18358,30 @@ snapshots: '@kurkle/color@0.3.4': {} - '@langchain/aws@0.1.11(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))': + '@langchain/aws@0.1.11(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))': dependencies: '@aws-sdk/client-bedrock-agent-runtime': 3.840.0 '@aws-sdk/client-bedrock-runtime': 3.842.0 '@aws-sdk/client-kendra': 3.840.0 '@aws-sdk/credential-provider-node': 3.840.0 - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) transitivePeerDependencies: - aws-crt - '@langchain/community@0.3.48(d048894cc6ae3aa1ff34a323f4ef4bd6)': + '@langchain/community@0.3.48(6ff87b346628c7927e0a2cdb4815edfe)': dependencies: '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.53.2)(bufferutil@4.0.9)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))(utf-8-validate@5.0.10)(zod@3.25.74) '@ibm-cloud/watsonx-ai': 1.6.8 - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) - '@langchain/openai': 0.5.18(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@langchain/weaviate': 0.2.1(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/openai': 0.5.18(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@langchain/weaviate': 0.2.1(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))) binary-extensions: 2.3.0 expr-eval: 2.0.2 flat: 5.0.2 ibm-cloud-sdk-core: 5.4.0 js-yaml: 4.1.0 - langchain: 0.3.29(@langchain/aws@0.1.11(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))))(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(@opentelemetry/api@1.9.0)(axios@1.10.0)(cheerio@1.1.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - langsmith: 0.3.39(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + langchain: 0.3.29(@langchain/aws@0.1.11(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))))(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(axios@1.10.0)(cheerio@1.1.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + langsmith: 0.3.39(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) openai: 4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74) uuid: 10.0.0 zod: 3.25.74 @@ -17901,14 +18430,14 @@ snapshots: - handlebars - peggy - '@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))': + '@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))': dependencies: '@cfworker/json-schema': 4.1.1 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.20 - langsmith: 0.3.39(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + langsmith: 0.3.39(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 @@ -17921,64 +18450,64 @@ snapshots: - '@opentelemetry/sdk-trace-base' - openai - '@langchain/google-common@0.1.8(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(zod@3.25.74)': + '@langchain/google-common@0.1.8(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(zod@3.25.74)': dependencies: - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) uuid: 10.0.0 zod-to-json-schema: 3.24.6(zod@3.25.74) transitivePeerDependencies: - zod - '@langchain/google-gauth@0.1.8(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(zod@3.25.74)': + '@langchain/google-gauth@0.1.8(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(zod@3.25.74)': dependencies: - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) - '@langchain/google-common': 0.1.8(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(zod@3.25.74) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/google-common': 0.1.8(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(zod@3.25.74) google-auth-library: 8.9.0 transitivePeerDependencies: - encoding - supports-color - zod - '@langchain/langgraph-checkpoint@0.0.18(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))': + '@langchain/langgraph-checkpoint@0.0.18(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))': dependencies: - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) uuid: 10.0.0 - '@langchain/langgraph-sdk@0.0.70(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1)': + '@langchain/langgraph-sdk@0.0.70(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1)': dependencies: '@types/json-schema': 7.0.15 p-queue: 6.6.2 p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) react: 18.3.1 - '@langchain/langgraph-sdk@0.0.78(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1)': + '@langchain/langgraph-sdk@0.0.78(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1)': dependencies: '@types/json-schema': 7.0.15 p-queue: 6.6.2 p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) react: 18.3.1 - '@langchain/langgraph-sdk@0.0.89(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1)': + '@langchain/langgraph-sdk@0.0.89(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1)': dependencies: '@types/json-schema': 7.0.15 p-queue: 6.6.2 p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) react: 18.3.1 - '@langchain/langgraph@0.2.74(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1)(zod-to-json-schema@3.24.6(zod@3.25.74))': + '@langchain/langgraph@0.2.74(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1)(zod-to-json-schema@3.24.6(zod@3.25.74))': dependencies: - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) - '@langchain/langgraph-checkpoint': 0.0.18(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))) - '@langchain/langgraph-sdk': 0.0.89(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/langgraph-checkpoint': 0.0.18(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))) + '@langchain/langgraph-sdk': 0.0.89(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(react@18.3.1) uuid: 10.0.0 zod: 3.25.74 optionalDependencies: @@ -17986,9 +18515,9 @@ snapshots: transitivePeerDependencies: - react - '@langchain/openai@0.4.9(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@langchain/openai@0.4.9(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) js-tiktoken: 1.0.20 openai: 4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74) zod: 3.25.74 @@ -17997,23 +18526,23 @@ snapshots: - encoding - ws - '@langchain/openai@0.5.18(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@langchain/openai@0.5.18(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) js-tiktoken: 1.0.20 openai: 5.8.2(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74) zod: 3.25.74 transitivePeerDependencies: - ws - '@langchain/textsplitters@0.1.0(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))': + '@langchain/textsplitters@0.1.0(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))': dependencies: - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) js-tiktoken: 1.0.20 - '@langchain/weaviate@0.2.1(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))': + '@langchain/weaviate@0.2.1(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))': dependencies: - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) uuid: 10.0.0 weaviate-client: 3.6.2 transitivePeerDependencies: @@ -18773,8 +19302,298 @@ snapshots: - encoding - supports-color - '@opentelemetry/api@1.9.0': - optional: true + '@opentelemetry/api-logs@0.53.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api-logs@0.57.1': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api-logs@0.57.2': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/instrumentation-amqplib@0.46.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-connect@0.43.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + '@types/connect': 3.4.36 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-dataloader@0.16.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-express@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fastify@0.44.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fs@0.19.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-generic-pool@0.43.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-graphql@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-hapi@0.45.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-http@0.57.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + forwarded-parse: 2.1.2 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-ioredis@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-kafkajs@0.7.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-knex@0.44.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-koa@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-lru-memoizer@0.44.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongodb@0.51.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongoose@0.46.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql2@0.45.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql@0.45.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + '@types/mysql': 2.15.26 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-nestjs-core@0.44.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-pg@0.50.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) + '@types/pg': 8.6.1 + '@types/pg-pool': 2.0.6 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-redis-4@0.46.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-tedious@0.18.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + '@types/tedious': 4.0.14 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-undici@0.10.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@types/shimmer': 1.2.0 + import-in-the-middle: 1.14.2 + require-in-the-middle: 7.5.2 + semver: 7.7.2 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.57.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.57.1 + '@types/shimmer': 1.2.0 + import-in-the-middle: 1.14.2 + require-in-the-middle: 7.5.2 + semver: 7.7.2 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.57.2 + '@types/shimmer': 1.2.0 + import-in-the-middle: 1.14.2 + require-in-the-middle: 7.5.2 + semver: 7.7.2 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/redis-common@0.36.2': {} + + '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/semantic-conventions@1.27.0': {} + + '@opentelemetry/semantic-conventions@1.28.0': {} + + '@opentelemetry/semantic-conventions@1.36.0': {} + + '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -18917,7 +19736,7 @@ snapshots: '@popperjs/core@2.11.8': {} - '@postiz/wallets@0.0.1(@babel/runtime@7.27.6)(@react-native-async-storage/async-storage@1.24.0(react-native@0.80.1(@babel/core@7.28.0)(@types/react@18.3.1)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@18.3.1)(bs58@6.0.0)(bufferutil@4.0.9)(ioredis@5.6.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.74)': + '@postiz/wallets@0.0.1(@babel/runtime@7.27.6)(@react-native-async-storage/async-storage@1.24.0(react-native@0.80.1(@babel/core@7.28.0)(@types/react@18.3.1)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)))(@sentry/types@7.120.3)(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@18.3.1)(bs58@6.0.0)(bufferutil@4.0.9)(ioredis@5.6.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.74)': dependencies: '@solana/wallet-adapter-alpha': 0.1.14(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-avana': 0.1.17(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)) @@ -18949,7 +19768,7 @@ snapshots: '@solana/wallet-adapter-spot': 0.1.19(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-tokenary': 0.1.16(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-tokenpocket': 0.4.23(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-torus': 0.11.32(@babel/runtime@7.27.6)(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-torus': 0.11.32(@babel/runtime@7.27.6)(@sentry/types@7.120.3)(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) '@solana/wallet-adapter-trust': 0.1.17(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-unsafe-burner': 0.1.11(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-walletconnect': 0.1.21(@react-native-async-storage/async-storage@1.24.0(react-native@0.80.1(@babel/core@7.28.0)(@types/react@18.3.1)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@18.3.1)(bufferutil@4.0.9)(ioredis@5.6.1)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.74) @@ -19017,6 +19836,14 @@ snapshots: dependencies: '@prisma/debug': 6.11.1 + '@prisma/instrumentation@5.22.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + '@project-serum/sol-wallet-adapter@0.2.6(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) @@ -19742,11 +20569,31 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.19': {} + '@rollup/plugin-commonjs@28.0.1(rollup@3.29.5)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@3.29.5) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.4.6(picomatch@4.0.2) + is-reference: 1.2.1 + magic-string: 0.30.17 + picomatch: 4.0.2 + optionalDependencies: + rollup: 3.29.5 + '@rollup/pluginutils@4.2.1': dependencies: estree-walker: 2.0.2 picomatch: 2.3.1 + '@rollup/pluginutils@5.2.0(rollup@3.29.5)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 3.29.5 + '@rollup/rollup-android-arm-eabi@4.44.2': optional: true @@ -19891,6 +20738,235 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 + '@sentry-internal/browser-utils@8.55.0': + dependencies: + '@sentry/core': 8.55.0 + + '@sentry-internal/feedback@8.55.0': + dependencies: + '@sentry/core': 8.55.0 + + '@sentry-internal/replay-canvas@8.55.0': + dependencies: + '@sentry-internal/replay': 8.55.0 + '@sentry/core': 8.55.0 + + '@sentry-internal/replay@8.55.0': + dependencies: + '@sentry-internal/browser-utils': 8.55.0 + '@sentry/core': 8.55.0 + + '@sentry-internal/tracing@7.120.3': + dependencies: + '@sentry/core': 7.120.3 + '@sentry/types': 7.120.3 + '@sentry/utils': 7.120.3 + + '@sentry/babel-plugin-component-annotate@2.22.7': {} + + '@sentry/browser@8.55.0': + dependencies: + '@sentry-internal/browser-utils': 8.55.0 + '@sentry-internal/feedback': 8.55.0 + '@sentry-internal/replay': 8.55.0 + '@sentry-internal/replay-canvas': 8.55.0 + '@sentry/core': 8.55.0 + + '@sentry/bundler-plugin-core@2.22.7': + dependencies: + '@babel/core': 7.28.0 + '@sentry/babel-plugin-component-annotate': 2.22.7 + '@sentry/cli': 2.39.1 + dotenv: 16.6.1 + find-up: 5.0.0 + glob: 9.3.5 + magic-string: 0.30.8 + unplugin: 1.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/cli-darwin@2.39.1': + optional: true + + '@sentry/cli-linux-arm64@2.39.1': + optional: true + + '@sentry/cli-linux-arm@2.39.1': + optional: true + + '@sentry/cli-linux-i686@2.39.1': + optional: true + + '@sentry/cli-linux-x64@2.39.1': + optional: true + + '@sentry/cli-win32-i686@2.39.1': + optional: true + + '@sentry/cli-win32-x64@2.39.1': + optional: true + + '@sentry/cli@2.39.1': + dependencies: + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + which: 2.0.2 + optionalDependencies: + '@sentry/cli-darwin': 2.39.1 + '@sentry/cli-linux-arm': 2.39.1 + '@sentry/cli-linux-arm64': 2.39.1 + '@sentry/cli-linux-i686': 2.39.1 + '@sentry/cli-linux-x64': 2.39.1 + '@sentry/cli-win32-i686': 2.39.1 + '@sentry/cli-win32-x64': 2.39.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/core@7.120.3': + dependencies: + '@sentry/types': 7.120.3 + '@sentry/utils': 7.120.3 + + '@sentry/core@8.55.0': {} + + '@sentry/integrations@7.120.3': + dependencies: + '@sentry/core': 7.120.3 + '@sentry/types': 7.120.3 + '@sentry/utils': 7.120.3 + localforage: 1.10.0 + + '@sentry/nestjs@8.55.0(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)': + dependencies: + '@nestjs/common': 10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@sentry/core': 8.55.0 + '@sentry/node': 8.55.0 + transitivePeerDependencies: + - supports-color + + '@sentry/nextjs@8.55.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@14.2.30(@babel/core@7.28.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.89.2))(react@18.3.1)(webpack@5.87.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.25.5))': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.36.0 + '@rollup/plugin-commonjs': 28.0.1(rollup@3.29.5) + '@sentry-internal/browser-utils': 8.55.0 + '@sentry/core': 8.55.0 + '@sentry/node': 8.55.0 + '@sentry/opentelemetry': 8.55.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0) + '@sentry/react': 8.55.0(react@18.3.1) + '@sentry/vercel-edge': 8.55.0 + '@sentry/webpack-plugin': 2.22.7(webpack@5.87.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.25.5)) + chalk: 3.0.0 + next: 14.2.30(@babel/core@7.28.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.89.2) + resolve: 1.22.8 + rollup: 3.29.5 + stacktrace-parser: 0.1.11 + transitivePeerDependencies: + - '@opentelemetry/context-async-hooks' + - '@opentelemetry/core' + - '@opentelemetry/instrumentation' + - '@opentelemetry/sdk-trace-base' + - encoding + - react + - supports-color + - webpack + + '@sentry/node@8.55.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-amqplib': 0.46.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-connect': 0.43.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dataloader': 0.16.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-express': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fastify': 0.44.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fs': 0.19.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-generic-pool': 0.43.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-graphql': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-hapi': 0.45.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-http': 0.57.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-ioredis': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-kafkajs': 0.7.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-knex': 0.44.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-koa': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-lru-memoizer': 0.44.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongodb': 0.51.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongoose': 0.46.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql': 0.45.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql2': 0.45.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-nestjs-core': 0.44.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pg': 0.50.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis-4': 0.46.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-tedious': 0.18.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-undici': 0.10.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + '@prisma/instrumentation': 5.22.0 + '@sentry/core': 8.55.0 + '@sentry/opentelemetry': 8.55.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0) + import-in-the-middle: 1.14.2 + transitivePeerDependencies: + - supports-color + + '@sentry/opentelemetry@8.55.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + '@sentry/core': 8.55.0 + + '@sentry/profiling-node@8.55.0': + dependencies: + '@sentry/core': 8.55.0 + '@sentry/node': 8.55.0 + detect-libc: 2.0.4 + node-abi: 3.75.0 + transitivePeerDependencies: + - supports-color + + '@sentry/react@8.55.0(react@18.3.1)': + dependencies: + '@sentry/browser': 8.55.0 + '@sentry/core': 8.55.0 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + + '@sentry/tracing@7.120.3': + dependencies: + '@sentry-internal/tracing': 7.120.3 + + '@sentry/types@7.120.3': {} + + '@sentry/utils@7.120.3': + dependencies: + '@sentry/types': 7.120.3 + + '@sentry/vercel-edge@8.55.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@sentry/core': 8.55.0 + + '@sentry/webpack-plugin@2.22.7(webpack@5.87.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.25.5))': + dependencies: + '@sentry/bundler-plugin-core': 2.22.7 + unplugin: 1.0.1 + uuid: 9.0.1 + webpack: 5.87.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.25.5) + transitivePeerDependencies: + - encoding + - supports-color + '@sinclair/typebox@0.27.8': {} '@sindresorhus/is@4.6.0': {} @@ -20530,11 +21606,11 @@ snapshots: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@solana/wallet-adapter-torus@0.11.32(@babel/runtime@7.27.6)(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)': + '@solana/wallet-adapter-torus@0.11.32(@babel/runtime@7.27.6)(@sentry/types@7.120.3)(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)': dependencies: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@toruslabs/solana-embed': 2.1.0(@babel/runtime@7.27.6)(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) + '@toruslabs/solana-embed': 2.1.0(@babel/runtime@7.27.6)(@sentry/types@7.120.3)(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) assert: 2.1.0 crypto-browserify: 3.12.1 process: 0.11.10 @@ -21375,12 +22451,12 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} - '@toruslabs/base-controllers@5.11.0(@babel/runtime@7.27.6)(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@toruslabs/base-controllers@5.11.0(@babel/runtime@7.27.6)(@sentry/types@7.120.3)(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.27.6 '@ethereumjs/util': 9.1.0 - '@toruslabs/broadcast-channel': 10.0.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@toruslabs/http-helpers': 6.1.1(@babel/runtime@7.27.6) + '@toruslabs/broadcast-channel': 10.0.2(@sentry/types@7.120.3)(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@toruslabs/http-helpers': 6.1.1(@babel/runtime@7.27.6)(@sentry/types@7.120.3) '@toruslabs/openlogin-jrpc': 8.3.0(@babel/runtime@7.27.6) '@toruslabs/openlogin-utils': 8.2.1(@babel/runtime@7.27.6) async-mutex: 0.5.0 @@ -21394,11 +22470,11 @@ snapshots: - supports-color - utf-8-validate - '@toruslabs/broadcast-channel@10.0.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@toruslabs/broadcast-channel@10.0.2(@sentry/types@7.120.3)(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.27.6 '@toruslabs/eccrypto': 4.0.0 - '@toruslabs/metadata-helpers': 5.1.0(@babel/runtime@7.27.6) + '@toruslabs/metadata-helpers': 5.1.0(@babel/runtime@7.27.6)(@sentry/types@7.120.3) loglevel: 1.9.2 oblivious-set: 1.4.0 socket.io-client: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -21417,17 +22493,19 @@ snapshots: dependencies: elliptic: 6.6.1 - '@toruslabs/http-helpers@6.1.1(@babel/runtime@7.27.6)': + '@toruslabs/http-helpers@6.1.1(@babel/runtime@7.27.6)(@sentry/types@7.120.3)': dependencies: '@babel/runtime': 7.27.6 lodash.merge: 4.6.2 loglevel: 1.9.2 + optionalDependencies: + '@sentry/types': 7.120.3 - '@toruslabs/metadata-helpers@5.1.0(@babel/runtime@7.27.6)': + '@toruslabs/metadata-helpers@5.1.0(@babel/runtime@7.27.6)(@sentry/types@7.120.3)': dependencies: '@babel/runtime': 7.27.6 '@toruslabs/eccrypto': 4.0.0 - '@toruslabs/http-helpers': 6.1.1(@babel/runtime@7.27.6) + '@toruslabs/http-helpers': 6.1.1(@babel/runtime@7.27.6)(@sentry/types@7.120.3) elliptic: 6.6.1 ethereum-cryptography: 2.2.1 json-stable-stringify: 1.3.0 @@ -21451,12 +22529,12 @@ snapshots: base64url: 3.0.1 color: 4.2.3 - '@toruslabs/solana-embed@2.1.0(@babel/runtime@7.27.6)(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)': + '@toruslabs/solana-embed@2.1.0(@babel/runtime@7.27.6)(@sentry/types@7.120.3)(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.27.6 '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@toruslabs/base-controllers': 5.11.0(@babel/runtime@7.27.6)(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@toruslabs/http-helpers': 6.1.1(@babel/runtime@7.27.6) + '@toruslabs/base-controllers': 5.11.0(@babel/runtime@7.27.6)(@sentry/types@7.120.3)(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@toruslabs/http-helpers': 6.1.1(@babel/runtime@7.27.6)(@sentry/types@7.120.3) '@toruslabs/openlogin-jrpc': 8.3.0(@babel/runtime@7.27.6) eth-rpc-errors: 4.0.3 fast-deep-equal: 3.1.3 @@ -21558,6 +22636,10 @@ snapshots: '@types/node': 18.16.9 optional: true + '@types/connect@3.4.36': + dependencies: + '@types/node': 18.16.9 + '@types/connect@3.4.38': dependencies: '@types/node': 18.16.9 @@ -21727,6 +22809,10 @@ snapshots: dependencies: '@types/node': 18.16.9 + '@types/mysql@2.15.26': + dependencies: + '@types/node': 18.16.9 + '@types/node-fetch@2.6.12': dependencies: '@types/node': 18.16.9 @@ -21756,6 +22842,16 @@ snapshots: '@types/parse-json@4.0.2': {} + '@types/pg-pool@2.0.6': + dependencies: + '@types/pg': 8.6.1 + + '@types/pg@8.6.1': + dependencies: + '@types/node': 18.16.9 + pg-protocol: 1.10.3 + pg-types: 2.2.0 + '@types/prismjs@1.26.5': {} '@types/prop-types@15.7.15': {} @@ -21832,6 +22928,8 @@ snapshots: dependencies: '@types/node': 18.16.9 + '@types/shimmer@1.2.0': {} + '@types/sockjs@0.3.36': dependencies: '@types/node': 18.16.9 @@ -21847,6 +22945,10 @@ snapshots: '@types/striptags@0.0.5': {} + '@types/tedious@4.0.14': + dependencies: + '@types/node': 18.16.9 + '@types/tough-cookie@4.0.5': {} '@types/trusted-types@2.0.7': {} @@ -23088,6 +24190,10 @@ snapshots: dependencies: acorn: 8.15.0 + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -23838,6 +24944,11 @@ snapshots: loupe: 3.1.4 pathval: 2.0.1 + chalk@3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -24109,6 +25220,8 @@ snapshots: has-own-prop: 2.0.0 repeat-string: 1.6.1 + commondir@1.0.1: {} + compare-versions@4.1.4: {} component-emitter@2.0.0: {} @@ -24350,6 +25463,10 @@ snapshots: '@types/luxon': 3.4.2 luxon: 3.5.0 + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + cross-fetch@3.2.0: dependencies: node-fetch: 2.7.0 @@ -25852,6 +26969,8 @@ snapshots: dependencies: fetch-blob: 3.2.0 + forwarded-parse@2.1.2: {} + forwarded@0.2.0: {} fraction.js@4.3.7: {} @@ -26718,6 +27837,8 @@ snapshots: dependencies: pdfkit: 0.15.2 + immediate@3.0.6: {} + immer@9.0.21: {} immutable@5.1.3: {} @@ -26732,6 +27853,13 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-in-the-middle@1.14.2: + dependencies: + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + cjs-module-lexer: 1.4.3 + module-details-from-path: 1.0.4 + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 @@ -27025,6 +28153,10 @@ snapshots: is-promise@4.0.0: {} + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.8 + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -27814,22 +28946,22 @@ snapshots: konva@9.3.20: {} - langchain@0.3.29(@langchain/aws@0.1.11(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))))(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(@opentelemetry/api@1.9.0)(axios@1.10.0)(cheerio@1.1.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + langchain@0.3.29(@langchain/aws@0.1.11(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))))(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(axios@1.10.0)(cheerio@1.1.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) - '@langchain/openai': 0.5.18(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))) + '@langchain/core': 0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + '@langchain/openai': 0.5.18(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))) js-tiktoken: 1.0.20 js-yaml: 4.1.0 jsonpointer: 5.0.1 - langsmith: 0.3.39(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) + langsmith: 0.3.39(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)) openapi-types: 12.1.3 p-retry: 4.6.2 uuid: 10.0.0 yaml: 2.8.0 zod: 3.25.74 optionalDependencies: - '@langchain/aws': 0.1.11(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))) + '@langchain/aws': 0.1.11(@langchain/core@0.3.62(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74))) axios: 1.10.0(debug@4.4.1) cheerio: 1.1.0 transitivePeerDependencies: @@ -27839,7 +28971,7 @@ snapshots: - openai - ws - langsmith@0.3.39(@opentelemetry/api@1.9.0)(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)): + langsmith@0.3.39(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 @@ -27850,6 +28982,7 @@ snapshots: uuid: 10.0.0 optionalDependencies: '@opentelemetry/api': 1.9.0 + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) openai: 4.104.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.74) language-subtag-registry@0.3.23: {} @@ -27894,6 +29027,10 @@ snapshots: libphonenumber-js@1.12.9: {} + lie@3.1.1: + dependencies: + immediate: 3.0.6 + lighthouse-logger@1.4.2: dependencies: debug: 2.6.9 @@ -27989,6 +29126,10 @@ snapshots: emojis-list: 3.0.0 json5: 2.2.3 + localforage@1.10.0: + dependencies: + lie: 3.1.1 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -29075,6 +30216,8 @@ snapshots: mobx@6.13.7: {} + module-details-from-path@1.0.4: {} + mri@1.2.0: {} mrmime@2.0.1: {} @@ -29282,6 +30425,10 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 + node-abi@3.75.0: + dependencies: + semver: 7.7.2 + node-abort-controller@3.1.1: {} node-addon-api@5.1.0: {} @@ -29857,6 +31004,18 @@ snapshots: performance-now@2.1.0: {} + pg-int8@1.0.1: {} + + pg-protocol@1.10.3: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -30054,6 +31213,16 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postgres-array@2.0.0: {} + + postgres-bytea@1.0.0: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + posthog-js@1.256.2: dependencies: core-js: 3.43.0 @@ -30100,6 +31269,8 @@ snapshots: process@0.11.10: {} + progress@2.0.3: {} + promise-queue@2.2.5: {} promise@8.3.0: @@ -31100,6 +32271,14 @@ snapshots: require-from-string@2.0.2: {} + require-in-the-middle@7.5.2: + dependencies: + debug: 4.4.1(supports-color@5.5.0) + module-details-from-path: 1.0.4 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + require-main-filename@2.0.0: {} requires-port@1.0.0: {} @@ -31133,6 +32312,12 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@1.22.8: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + resolve@2.0.0-next.5: dependencies: is-core-module: 2.16.1 @@ -31184,6 +32369,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + rollup@3.29.5: + optionalDependencies: + fsevents: 2.3.3 + rollup@4.44.2: dependencies: '@types/estree': 1.0.8 @@ -31545,6 +32734,8 @@ snapshots: interpret: 1.4.0 rechoir: 0.6.2 + shimmer@1.2.1: {} + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -32704,6 +33895,13 @@ snapshots: unpipe@1.0.0: {} + unplugin@1.0.1: + dependencies: + acorn: 8.15.0 + chokidar: 3.6.0 + webpack-sources: 3.3.3 + webpack-virtual-modules: 0.5.0 + unrs-resolver@1.10.1: dependencies: napi-postinstall: 0.3.0 @@ -33188,6 +34386,8 @@ snapshots: webpack-sources@3.3.3: {} + webpack-virtual-modules@0.5.0: {} + webpack@5.87.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.25.5): dependencies: '@types/eslint-scope': 3.7.7 diff --git a/var/docker/supervisord/backend.conf b/var/docker/supervisord/backend.conf new file mode 100644 index 00000000..f2c05659 --- /dev/null +++ b/var/docker/supervisord/backend.conf @@ -0,0 +1,9 @@ +[program:backend] +directory=/app/apps/backend +command=pnpm start +autostart=true +autorestart=true +redirect_stderr=true +stdout_logfile=/dev/fd/1 +stdout_logfile_maxbytes=0 +startsecs=10 diff --git a/var/docker/supervisord/caddy.conf b/var/docker/supervisord/caddy.conf index 826374ce..90d9be80 100644 --- a/var/docker/supervisord/caddy.conf +++ b/var/docker/supervisord/caddy.conf @@ -7,3 +7,4 @@ redirect_stderr=true stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 startsecs=3 +priority=100 diff --git a/var/docker/supervisord/cron.conf b/var/docker/supervisord/cron.conf new file mode 100644 index 00000000..bb5f2346 --- /dev/null +++ b/var/docker/supervisord/cron.conf @@ -0,0 +1,9 @@ +[program:cron] +directory=/app/apps/cron +command=pnpm start +autostart=true +autorestart=true +redirect_stderr=true +stdout_logfile=/dev/fd/1 +stdout_logfile_maxbytes=0 +startsecs=10 diff --git a/var/docker/supervisord/frontend.conf b/var/docker/supervisord/frontend.conf new file mode 100644 index 00000000..e6cd75f7 --- /dev/null +++ b/var/docker/supervisord/frontend.conf @@ -0,0 +1,9 @@ +[program:frontend] +directory=/app/apps/frontend +command=pnpm start +autostart=true +autorestart=true +redirect_stderr=true +stdout_logfile=/dev/fd/1 +stdout_logfile_maxbytes=0 +startsecs=10 diff --git a/var/docker/supervisord/migrate.conf b/var/docker/supervisord/migrate.conf new file mode 100644 index 00000000..f4f6eaaf --- /dev/null +++ b/var/docker/supervisord/migrate.conf @@ -0,0 +1,10 @@ +[program:migrate] +directory=/app +command=pnpm run prisma-db-push +autostart=true +autorestart=false +redirect_stderr=true +stdout_logfile=/dev/fd/1 +stdout_logfile_maxbytes=0 +startsecs=0 +priority=1 diff --git a/var/docker/supervisord/workers.conf b/var/docker/supervisord/workers.conf new file mode 100644 index 00000000..76a0a0c5 --- /dev/null +++ b/var/docker/supervisord/workers.conf @@ -0,0 +1,9 @@ +[program:workers] +directory=/app/apps/workers +command=pnpm start +autostart=true +autorestart=true +redirect_stderr=true +stdout_logfile=/dev/fd/1 +stdout_logfile_maxbytes=0 +startsecs=10