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