diff --git a/.env.example b/.env.example index ee1246cb99..8b5f9897ca 100644 --- a/.env.example +++ b/.env.example @@ -217,6 +217,18 @@ BRAND_AFFILIATE_URL="https://example.com/affiliates" # "Add to Claude" button — it defaults to empty on purpose so a deployment # that forgets to set it cannot offer the upstream listing by accident. BRAND_CLAUDE_DIRECTORY_URL="" +# Only needed if you run your own Postiz Canva app: its origin from the Canva +# Developer Portal (Security -> Credentials), allowed by CORS on the backend. +#CANVA_APP_ORIGIN="https://app-xxxxxxxxxxx.canva-apps.com" + +# Sign in with Apple (login provider) +# APPLE_BUNDLE_ID: iOS app bundle id (native mobile sign-in) +# APPLE_SERVICE_ID / TEAM_ID / KEY_ID / PRIVATE_KEY: web sign-in (Services ID + .p8 key) +APPLE_BUNDLE_ID="" +APPLE_SERVICE_ID="" +APPLE_TEAM_ID="" +APPLE_KEY_ID="" +APPLE_PRIVATE_KEY="" # ============================================================================== # 8. Single Sign-On (Generic OAuth 2.0 / DOS ID via PKCE Bridge) @@ -383,6 +395,30 @@ DRIBBBLE_CLIENT_SECRET="sample_dribbble_client_secret" # --- Tumblr --- TUMBLR_CLIENT_ID="sample_tumblr_client_id" TUMBLR_CLIENT_SECRET="sample_tumblr_client_secret" +# Misc Settings +OPENAI_API_KEY="" +# OAuth client configured for the ChatGPT app. Only this client can receive +# verified user email claims for ChatGPT Enterprise domain restrictions. +OPENAI_OAUTH_CLIENT_ID="" +# MCP OAuth Dynamic Client Registration (RFC 7591) redirect-domain allowlist. +# When set (comma separated), POST /oauth/register only accepts redirect_uris +# whose host matches a listed domain or one of its subdomains; unset or empty +# means any client can self-register. Only https callbacks are checked: +# loopback (http://localhost:8787/callback - Grok, Claude Code) and +# private-use scheme callbacks (cursor://...) stay on the user's machine +# and are always accepted. Example locks web callbacks to the claude.ai +# connector; add cursor.com for Cursor. +# DCR_VERIFIED_DOMAINS="claude.ai,claude.com" +# Postiz Cloud only: lets people connect a self-hosted Postiz on the MCP +# consent screen ("Use self-hosted"). The MCP tool calls of that connection +# are relayed to the instance with its API key. Leave unset on self-hosted +# installs; set it on both the API and the MCP backend. +# MCP_SELF_HOSTED_RELAY=true +# EVOLINK_API_KEY="" # EvoLink API key for Seedance AI video generation (https://evolink.ai) +NEXT_PUBLIC_DISCORD_SUPPORT="" +NEXT_PUBLIC_POLOTNO="" +# NOT_SECURED=false +API_LIMIT=30 # The limit of the public API hour limit # --- VK (VKontakte) --- VK_ID="12345678" diff --git a/CLAUDE.md b/CLAUDE.md index 087fbf9a9a..ee5b8ee247 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -88,3 +88,10 @@ The backend app is mostly used to write controllers and import from the librarie - Linting of the project can run only from the root. - Use only pnpm. - Branding guard (`scripts/branding-guard.ts`, enforced in CI) blocks reintroducing upstream endpoints or branding; use `branding-guard-allow:` comments only for deliberate references. +- Workflows files can never be changed if they are already in origin/main, because changing a workflow will fail all its activities, instead create a new workflow with the version, and everywhere the workflow being called, change it to the new workflow version. +- Workflows activities parameters cannot be changed, as it will break the workflow, if we need to change the parameters, if we need to change the parameters, we need to create a new activity with the new parameters, and then create a new workflow that uses the new activity. +- Code must always be generic, there can't be a way that a specific logic, let's say facebook or instagram, appear in a file that use a generic logic, instead, we need to edit the interface of the provider, add another function, and then generically call it from the generic code, and then implement the specific logic in the provider implementation. we can't have something like if(facebookProvider) {} inside a non facebook provider file. +- Before adding a field to a shared repository/service `select` or changing a shared method's return shape, grep for all its consumers (frontend, public API, MCP/agent tools, orchestrator, webhooks) and confirm the change is intended for each. +- Exposing a stored field to a new external surface (public API, MCP, webhooks) is a data-exposure decision — ask first, and check what existing production rows hold for that column before shipping it. +- Never silently change the meaning or format of a value persisted in an existing DB column; that affects every reader and all historical rows, so ask first. +- Never return a raw Prisma row from a model that holds credentials (`Integration`, `User` and similar) in a controller response. Repository writes on those models must use a `select` with only the fields the caller needs (like `setTimes` with `select: { id: true }`), or the controller returns nothing. This applies even where nearby code looks different. diff --git a/README.md b/README.md index 7bfdd3fe11..da851d4f54 100644 --- a/README.md +++ b/README.md @@ -108,8 +108,8 @@ | [Hostinger](https://www.hostinger.com/vps/docker/postiz?ref=postiz) | Hostinger | Hostinger is on a mission to make online success possible for anyone – from developers to aspiring bloggers and business owners | | [Virlo](https://dev.virlo.ai/?ref=postiz) | Virlo | Virlo is the #1 social media trend spotting and all-in-one GTM tool for teams leveraging short-form video | | [ChatbotX](https://chatbotx.io/?ref=postiz) | ChatbotX | The ManyChat alternative that you can self-host, white-label, and resell to your clients. Bring your own OpenClaw, Hermes, or Claude agents! | +| [RapidProxy](https://www.rapidproxy.io/?ref=postiz) | WP-PROXY-THUMBNAIL-41 | RapidProxy provides 90M+ residential IPs for social media, browser automation, and AI workflows, with smart rotation and stable sessions. From $0.55/GB; use RAPID10 for 10% off. -![Bronze Tier](https://opencollective.com/postiz/tiers/main-repository-bronze-tier.svg?avatarHeight=36&width=600&button=false) # Intro diff --git a/apps/backend/src/api/routes/enterprise.controller.ts b/apps/backend/src/api/routes/enterprise.controller.ts index eebc630054..c14eebdb52 100644 --- a/apps/backend/src/api/routes/enterprise.controller.ts +++ b/apps/backend/src/api/routes/enterprise.controller.ts @@ -20,8 +20,7 @@ export class EnterpriseController { private verifyEnterpriseToken(params: string): T { const payload = AuthService.verifyJWT(params) as any; if ( - !payload || - typeof payload !== 'object' || + !payload || typeof payload !== 'object' || 'providerName' in payload || // login token (full User row) 'orgId' in payload || // team invite token 'expires' in payload // password reset token diff --git a/apps/backend/src/api/routes/integrations.controller.ts b/apps/backend/src/api/routes/integrations.controller.ts index 3b719f2a62..46acab6c4b 100644 --- a/apps/backend/src/api/routes/integrations.controller.ts +++ b/apps/backend/src/api/routes/integrations.controller.ts @@ -20,6 +20,7 @@ import { ApiTags } from '@nestjs/swagger'; import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request'; import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service'; import { IntegrationTimeDto } from '@gitroom/nestjs-libraries/dtos/integrations/integration.time.dto'; +import { CustomerNameDto } from '@gitroom/nestjs-libraries/dtos/integrations/customer.name.dto'; import { PlugDto } from '@gitroom/nestjs-libraries/dtos/plugs/plug.dto'; import { Disconnect, @@ -66,6 +67,15 @@ export class IntegrationsController { return this._integrationService.customers(org.id); } + @Put('/customers/:id') + async updateCustomerName( + @GetOrgFromRequest() org: Organization, + @Param('id') id: string, + @Body() body: CustomerNameDto + ) { + return this._integrationService.updateCustomerName(org.id, id, body.name); + } + @Put('/:id/group') async updateIntegrationGroup( @GetOrgFromRequest() org: Organization, diff --git a/apps/backend/src/api/routes/oauth.controller.ts b/apps/backend/src/api/routes/oauth.controller.ts index 822e8bf1c5..c9d705d1df 100644 --- a/apps/backend/src/api/routes/oauth.controller.ts +++ b/apps/backend/src/api/routes/oauth.controller.ts @@ -11,12 +11,14 @@ import { Req, Res, ServiceUnavailableException, + UseGuards, } from '@nestjs/common'; import { Request, Response } from 'express'; import { BootstrapService } from '@gitroom/backend/ecosystem/bootstrap.service'; import { AuthService as AuthChecker } from '@gitroom/helpers/auth/auth.service'; import { getCookieUrlFromDomain } from '@gitroom/helpers/subdomain/subdomain.management'; import { ApiTags } from '@nestjs/swagger'; +import { Throttle } from '@nestjs/throttler'; import { OAuthService } from '@gitroom/nestjs-libraries/database/prisma/oauth/oauth.service'; import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request'; import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; @@ -24,16 +26,22 @@ import { User, Organization } from '@prisma/client'; import { AuthorizeOAuthQueryDto, ApproveOAuthDto, + AuthorizeSelfHostedDto, } from '@gitroom/nestjs-libraries/dtos/oauth/authorize-oauth.dto'; import { TokenExchangeDto } from '@gitroom/nestjs-libraries/dtos/oauth/token-exchange.dto'; import { RegisterClientDto } from '@gitroom/nestjs-libraries/dtos/oauth/register-client.dto'; import { RevokeTokenDto } from '@gitroom/nestjs-libraries/dtos/oauth/revoke-token.dto'; import { extractBasicCredentials } from '@gitroom/nestjs-libraries/chat/oauth-types'; +import { McpRelayService } from '@gitroom/nestjs-libraries/chat/mcp.relay.service'; +import { ThrottlerRealIpGuard } from '@gitroom/nestjs-libraries/throttler/throttler.provider'; @ApiTags('OAuth') @Controller('/oauth') export class OAuthController { - constructor(private _oauthService: OAuthService) {} + constructor( + private _oauthService: OAuthService, + private _mcpRelayService: McpRelayService + ) {} // Dynamic Client Registration (RFC 7591), used by MCP clients like Claude @Post('/register') @@ -53,6 +61,11 @@ export class OAuthController { } ); + const selfHosted = this._oauthService.allowsSelfHosted( + app, + query.resource + ); + return { app: { name: app.name, @@ -62,10 +75,64 @@ export class OAuthController { redirectUrl: app.redirectUrl, }, state: query.state, + selfHosted, + selfHostedEmail: + selfHosted && this._oauthService.selfHostedRequiresEmail(app), }; } + // Public (the person may have no account here) and capped per client, + // since every attempt sends requests to the instance + @UseGuards(ThrottlerRealIpGuard) + @Throttle({ default: { limit: 30, ttl: 3600000 } }) + @Post('/authorize/self-hosted') + async authorizeSelfHosted(@Body() body: AuthorizeSelfHostedDto) { + const app = await this._oauthService.validateAuthorizationRequest( + body.client_id, + { + redirectUri: body.redirect_uri, + codeChallenge: body.code_challenge, + codeChallengeMethod: body.code_challenge_method, + } + ); + + const email = body.email?.trim(); + this._oauthService.validateSelfHostedRequest(app, { + resource: body.resource, + email, + }); + + const instance = await this._mcpRelayService.connect( + body.instance_url, + body.api_key + ); + + const code = await this._oauthService.createSelfHostedAuthorizationCode( + app.id, + { ...instance, email }, + app.dynamic + ? { + codeChallenge: body.code_challenge, + codeChallengeMethod: body.code_challenge_method, + redirectUri: body.redirect_uri, + } + : undefined + ); + + // Same redirect as an approved cloud authorization + const redirectUrl = new URL( + app.dynamic ? body.redirect_uri! : app.redirectUrl + ); + redirectUrl.searchParams.set('code', code); + if (body.state) { + redirectUrl.searchParams.set('state', body.state); + } + return { redirect: redirectUrl.toString() }; + } + @Post('/token') + // RFC 6749 §5.1: successful token responses are 200; strict clients (Canva) reject Nest's default 201 + @HttpCode(200) async token( @Body() body: TokenExchangeDto, @Headers('authorization') authorization?: string diff --git a/apps/backend/src/main.ts b/apps/backend/src/main.ts index a35569b1a9..d43cce04e2 100644 --- a/apps/backend/src/main.ts +++ b/apps/backend/src/main.ts @@ -48,6 +48,15 @@ async function start() { process.env.FRONTEND_URL, 'http://localhost:6274', ...(process.env.MAIN_URL ? [process.env.MAIN_URL] : []), + // Optional: the Canva app calls the public API from its iframe origin + // (browsers send it lowercase, e.g. https://app-aabbcc.canva-apps.com) + ...(process.env.CANVA_APP_ORIGIN + ? [ + process.env.CANVA_APP_ORIGIN.trim() + .replace(/\/+$/, '') + .toLowerCase(), + ] + : []), ], }, }); diff --git a/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts b/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts index 6a64c0752e..99ac591814 100644 --- a/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts +++ b/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts @@ -17,6 +17,7 @@ import { streamUploadOptions } from '@gitroom/nestjs-libraries/upload/multer.str import { ApiTags } from '@nestjs/swagger'; import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; import { GetIncludeDeletedFromRequest } from '@gitroom/nestjs-libraries/user/include.deleted.from.request'; +import { GetOAuthUserIdFromRequest } from '@gitroom/nestjs-libraries/user/oauth.user.id.from.request'; import { Organization } from '@prisma/client'; import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/integrations/integration.service'; import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability'; @@ -229,6 +230,24 @@ export class PublicIntegrationsController { return { connected: true }; } + // `user` is only known for OAuth app tokens; an API key belongs to the + // whole organization + @Get('/me') + async getMe( + @GetOrgFromRequest() org: Organization, + @GetOAuthUserIdFromRequest() userId?: string + ) { + Sentry.metrics.count('public_api-request', 1); + const user = userId ? await this._usersService.getPersonal(userId) : null; + + return { + organization: { id: org.id, name: org.name }, + user: user + ? { id: user.id, name: user.name, picture: user.picture?.path || null } + : null, + }; + } + @Get('/groups') async listGroups(@GetOrgFromRequest() org: Organization) { Sentry.metrics.count('public_api-request', 1); diff --git a/apps/backend/src/services/auth/public.auth.middleware.ts b/apps/backend/src/services/auth/public.auth.middleware.ts index 7cbcee3868..526757b684 100644 --- a/apps/backend/src/services/auth/public.auth.middleware.ts +++ b/apps/backend/src/services/auth/public.auth.middleware.ts @@ -44,6 +44,9 @@ export class PublicAuthMiddleware implements NestMiddleware { } org = authorization.organization; + // The user who approved the OAuth app, so /me can show who is connected + // @ts-ignore + req.oauthUserId = authorization.userId; } else { org = await this._organizationService.getOrgByApiKey(auth); if (!org) { diff --git a/apps/frontend/AGENTS.md b/apps/frontend/AGENTS.md new file mode 100644 index 0000000000..643577dfae --- /dev/null +++ b/apps/frontend/AGENTS.md @@ -0,0 +1,9 @@ + + +# This is NOT the Next.js you know + +This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices. + +This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean. + + diff --git a/apps/frontend/CLAUDE.md b/apps/frontend/CLAUDE.md new file mode 100644 index 0000000000..43c994c2d3 --- /dev/null +++ b/apps/frontend/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/apps/frontend/src/app/(app)/api/uploads/[[...path]]/route.ts b/apps/frontend/src/app/(app)/api/uploads/[[...path]]/route.ts index 7dc3d678e5..a4b093e81f 100644 --- a/apps/frontend/src/app/(app)/api/uploads/[[...path]]/route.ts +++ b/apps/frontend/src/app/(app)/api/uploads/[[...path]]/route.ts @@ -36,20 +36,43 @@ export const GET = async ( if (filePath !== base && !filePath.startsWith(base + sep)) { return new NextResponse('Not found', { status: 404 }); } - const response = createReadStream(filePath); const fileStats = statSync(filePath); const contentType = mime.getType(filePath) || 'application/octet-stream'; + + // Honor ranged requests: providers that push video in chunks (TikTok, + // YouTube, LinkedIn, X) fetch byte windows with a Range header and reject + // anything but a 206, so ignoring Range breaks their uploads. + const range = /^bytes=(\d+)-(\d*)$/.exec(request.headers.get('range') || ''); + const start = range ? Number(range[1]) : 0; + const end = + range && range[2] + ? Math.min(Number(range[2]), fileStats.size - 1) + : fileStats.size - 1; + + if (range && (start >= fileStats.size || start > end)) { + return new NextResponse(null, { + status: 416, + headers: { 'Content-Range': `bytes */${fileStats.size}` }, + }); + } + + const response = createReadStream(filePath, range ? { start, end } : {}); const iterator = nodeStreamToIterator(response); const webStream = iteratorToStream(iterator); return new Response(webStream, { + status: range ? 206 : 200, headers: { 'Content-Type': contentType, // Set the appropriate content-type header - 'Content-Length': fileStats.size.toString(), + 'Content-Length': (end - start + 1).toString(), // Set the content-length header 'Last-Modified': fileStats.mtime.toUTCString(), // Set the last-modified header 'Cache-Control': 'public, max-age=31536000, immutable', // Example cache-control header + 'Accept-Ranges': 'bytes', + ...(range + ? { 'Content-Range': `bytes ${start}-${end}/${fileStats.size}` } + : {}), }, }); }; diff --git a/apps/frontend/src/app/global-error.tsx b/apps/frontend/src/app/global-error.tsx index db4f81ebc0..720d750d16 100644 --- a/apps/frontend/src/app/global-error.tsx +++ b/apps/frontend/src/app/global-error.tsx @@ -2,31 +2,17 @@ import * as Sentry from '@sentry/nextjs'; import NextError from 'next/error'; import { useEffect } from 'react'; -import { useVariables } from '@gitroom/react/helpers/variable.context'; export default function GlobalError({ error, }: { error: Error & { digest?: string }; }) { - const { sentryDsn } = useVariables(); - useEffect(() => { - if (!sentryDsn) { - return; - } - const eventId = Sentry.captureException(error); - Sentry.showReportDialog({ - eventId, - title: 'Something broke!', - subtitle: 'Please help us fix the issue by providing some details.', - labelComments: 'What happened?', - labelName: 'Your name', - labelEmail: 'Your email', - labelSubmit: 'Send Report', - lang: 'en', - }); - + // The variables context is not mounted here (this replaces the root + // layout), so don't gate on its DSN. Without a client this is a no-op, and + // beforeSend already opens the report dialog for captured exceptions + Sentry.captureException(error); }, [error]); return ( diff --git a/apps/frontend/src/components/agents/agent.tsx b/apps/frontend/src/components/agents/agent.tsx index af6d3af634..f304109525 100644 --- a/apps/frontend/src/components/agents/agent.tsx +++ b/apps/frontend/src/components/agents/agent.tsx @@ -107,12 +107,12 @@ export const AgentList: FC<{ onChange: (arr: any[]) => void }> = ({ return (
-
-
+
+

{t('select_channels', 'Select Channels')}

@@ -137,13 +137,17 @@ export const AgentList: FC<{ onChange: (arr: any[]) => void }> = ({
-
+
{sortedIntegrations.map((integration, index) => (
p.id === integration.id) && 'opacity-20' )} > @@ -182,7 +186,7 @@ export const AgentList: FC<{ onChange: (arr: any[]) => void }> = ({
@@ -203,7 +207,9 @@ export const Agent: FC<{ children: ReactNode }> = ({ children }) => { return ( -
{children}
+
+ {children} +
); @@ -225,11 +231,11 @@ const Threads: FC = () => {
-
-
+
+
{
-
+
{data?.threads?.map((p: any) => (
-
{feature}
+
{feature}
))}
@@ -640,8 +640,11 @@ export const MainBillingComponent: FC<{ ))}
{!!subscription?.id && showPortalAndCancel && ( -
-
-
+
{t('oauth_application', 'OAuth Application')} @@ -244,7 +244,7 @@ export const DeveloperComponent: FC = () => { )}
- -
+
-
+
{/* App details / edit */}
-
+
{t('oauth_application', 'OAuth Application')} @@ -407,7 +407,7 @@ export const DeveloperComponent: FC = () => { )}
-
+ {editing ? ( -
+
-
+
) : ( -
+
{app.picture?.path ? ( {
{t('redirect_url', 'Redirect URL')}
-
{app.redirectUrl}
+
{app.redirectUrl}
-
+
-
+
{t('client_id', 'Client ID')} @@ -561,7 +561,7 @@ export const DeveloperComponent: FC = () => {
{t('client_secret', 'Client Secret')}
-
+
{plaintextSecret ? ( {plaintextSecret} @@ -576,7 +576,7 @@ export const DeveloperComponent: FC = () => { )}
-
+
{plaintextSecret && ( { - const { url } = await ( - await fetch( - `/integrations/social/${identifier}${ - onboarding ? '?onboarding=true' : '' - }` - ) - ).json(); + const response = await fetch( + `/integrations/social/${identifier}${ + onboarding ? '?onboarding=true' : '' + }` + ); + if (response.status === 402) { + return; + } + const { url } = await response.json(); modals.closeAll(); gotoUrl( `/integrations/social/${identifier}?state=${url}&code=${Buffer.from( @@ -433,13 +435,15 @@ export const AddProviderComponent: FC<{ const { component: Web3Providers } = web3List.find( (item) => item.identifier === identifier )!; - const { url } = await ( - await fetch( - `/integrations/social/${identifier}${ - onboarding ? '?onboarding=true' : '' - }` - ) - ).json(); + const response = await fetch( + `/integrations/social/${identifier}${ + onboarding ? '?onboarding=true' : '' + }` + ); + if (response.status === 402) { + return; + } + const { url } = await response.json(); modal.openModal({ title: `Add ${capitalize(identifier)}`, withCloseButton: true, @@ -483,11 +487,13 @@ export const AddProviderComponent: FC<{ ] .filter(Boolean) .join('&'); - const { url, err } = await ( - await fetch( - `/integrations/social/${identifier}${params ? `?${params}` : ''}` - ) - ).json(); + const response = await fetch( + `/integrations/social/${identifier}${params ? `?${params}` : ''}` + ); + if (response.status === 402) { + return; + } + const { url, err } = await response.json(); if (err) { toaster.show( t( @@ -614,13 +620,15 @@ export const AddProviderComponent: FC<{ ); return; } - const { url } = await ( - await fetch( - `/integrations/social/${identifier}${ - onboarding ? '?onboarding=true' : '' - }` - ) - ).json(); + const response = await fetch( + `/integrations/social/${identifier}${ + onboarding ? '?onboarding=true' : '' + }` + ); + if (response.status === 402) { + return; + } + const { url } = await response.json(); modal.closeAll(); window.location.href = `/integrations/social/${identifier}?state=${url}&code=${Buffer.from( JSON.stringify(cookieResponse.cookies) @@ -685,7 +693,7 @@ export const AddProviderComponent: FC<{ className={clsx( isMobile && 'gap-[20px] flex flex-col', !isMobile && - 'grid grid-cols-5 gap-[10px] justify-items-center justify-center', + 'grid grid-cols-5 gap-[10px] justify-items-center justify-center mobile:!grid-cols-3', isMobile ? {} : onboarding ? 'grid-cols-9' : 'grid-cols-5' )} > @@ -722,7 +730,7 @@ export const AddProviderComponent: FC<{ className={clsx( isMobile ? 'flex-row h-[72px] p-[16px]' - : 'flex-col p-[10px] h-[100px] justify-center', + : 'flex-col p-[10px] h-[100px] justify-center mobile:text-[13px] mobile:leading-[1.2]', 'w-full text-[14px] rounded-[8px] bg-newTableHeader text-textColor relative items-center flex gap-[10px] cursor-pointer' )} > diff --git a/apps/frontend/src/components/launches/calendar.context.tsx b/apps/frontend/src/components/launches/calendar.context.tsx index fb5bea3621..df65ebb1f4 100644 --- a/apps/frontend/src/components/launches/calendar.context.tsx +++ b/apps/frontend/src/components/launches/calendar.context.tsx @@ -145,7 +145,14 @@ export const CalendarWeekProvider: FC<{ const [internalData, setInternalData] = useState([] as any[]); const [trendings] = useState([]); const searchParams = useSearchParams(); - const [displaySaved, setDisplaySaved] = useCookie('calendar-display', 'week'); + // A 7-column week doesn't fit a phone, so default small screens (tailwind `mobile`) to the day view + const [displaySaved, setDisplaySaved] = useCookie( + 'calendar-display', + typeof window !== 'undefined' && + window.matchMedia('(max-width: 1025px)').matches + ? 'day' + : 'week' + ); const display = searchParams.get('display') || displaySaved; // List view state diff --git a/apps/frontend/src/components/launches/calendar.tsx b/apps/frontend/src/components/launches/calendar.tsx index 11d82c57a0..0fd2a8dfff 100644 --- a/apps/frontend/src/components/launches/calendar.tsx +++ b/apps/frontend/src/components/launches/calendar.tsx @@ -309,7 +309,7 @@ export const DayView = () => {
{options.map((option) => ( -
+
{newDayjs() .utc() .startOf('day') @@ -319,7 +319,7 @@ export const DayView = () => {
{ return (
-
+
{localizedDays.map((day, index) => (
{ ))} {hours.map((hour) => ( -
+
{convertTimeFormatBasedOnLocality(hour)}
{localizedDays.map((day, indexDay) => ( @@ -465,7 +465,7 @@ export const MonthView = () => { return (
-
+
{localizedDays.map((day) => (
{integrations.map((selectedIntegrations) => (
{ }, [calendar]); return ( -
+
{!isListView && (
@@ -311,7 +311,7 @@ export const Filters = () => { />
-
+
{getDisplayText()}
@@ -350,7 +350,7 @@ export const Filters = () => {
)} {isListView && ( -
+
{ />
-
+
{t('page', 'Page')} {calendar.listPage + 1} {t('of', 'of')} {Math.max(1, calendar.listTotalPages)}
@@ -408,7 +408,7 @@ export const Filters = () => {
-
+
{listStateOptions.map((option) => (
{
{
{
@@ -48,7 +48,7 @@ export const DatePicker: FC<{ {open && (
e.stopPropagation()} - className="animate-fadeIn absolute bottom-[100%] mb-[16px] start-[50%] -translate-x-[50%] bg-sixth border border-tableBorder text-textColor rounded-[16px] z-[300] p-[16px] flex flex-col" + className="animate-fadeIn absolute bottom-[100%] mb-[16px] start-[50%] -translate-x-[50%] mobile:start-0 mobile:translate-x-0 bg-sixth border border-tableBorder text-textColor rounded-[16px] z-[300] p-[16px] flex flex-col" > { return ( @@ -111,6 +113,70 @@ export const OpenClose: FC<{ ); }; +const EditGroupNameModal: FC<{ + name: string; + id: string; + close: () => void; + resolve: (value: string) => void; +}> = (props) => { + const t = useT(); + const { close, name, id, resolve } = props; + const fetch = useFetch(); + const toaster = useToaster(); + const [groupName, setGroupName] = useState(name); + const save = useCallback(async () => { + const response = await fetch(`/integrations/customers/${id}`, { + method: 'PUT', + body: JSON.stringify({ name: groupName }), + }); + if (!response.ok) { + const { message } = await response.json().catch(() => ({} as any)); + toaster.show( + (Array.isArray(message) ? message[0] : message) || + t('could_not_save_group', 'Could not save the group.'), + 'warning' + ); + return; + } + resolve(groupName); + close(); + }, [groupName, id]); + return ( +
+ setGroupName(e.target.value)} + /> + +
+ ); +}; + +const EditPencil = () => { + return ( + + + + ); +}; + export const MenuGroupComponent: FC< MenuComponentInterface & { changeItemGroup: (id: string, group: string) => void; @@ -137,9 +203,37 @@ export const MenuGroupComponent: FC< changeItemGroup, collapsed, } = props; + const t = useT(); + const modals = useModals(); + const toaster = useToaster(); const [isOpen, setIsOpen] = useState( !!+(localStorage.getItem(group.name + '_isOpen') || '1') ); + const editGroupName = useCallback( + async (e: any) => { + e.stopPropagation(); + const val: string | undefined = await new Promise((resolve) => { + modals.openModal({ + title: t('edit_group_name', 'Edit group name'), + onClose: () => resolve(undefined), + children: (close) => ( + + ), + }); + }); + if (!val) { + return; + } + await mutate(); + toaster.show(t('group_updated', 'Group Updated'), 'success'); + }, + [group.name, group.id, mutate, modals, t] + ); const changeOpenClose = useCallback( (e: any) => { setIsOpen(!isOpen); @@ -177,7 +271,7 @@ export const MenuGroupComponent: FC< )} {!!group.name && (
@@ -194,6 +288,14 @@ export const MenuGroupComponent: FC< > {group.name}
+ {!collapsed && ( +
+ +
+ )}
)}
{ const modal = useModals(); const [reload, setReload] = useState(false); const [collapseMenu, setCollapseMenu] = useCookie('collapseMenu', '0'); + const [channelsOpen, setChannelsOpen] = useState(false); const [mode] = useCookie('mode', 'dark'); const { isLoading, data: integrations, mutate } = useIntegrationList(); @@ -524,26 +627,56 @@ export const LaunchesComponent = () => { + {channelsOpen && ( +
setChannelsOpen(false)} + /> + )}

{t('channels')}

+
setChannelsOpen(false)} + className="hidden mobile:flex text-btnText bg-btnSimple rounded-[6px] w-[28px] h-[28px] items-center justify-center cursor-pointer select-none" + > + + + +
setCollapseMenu(collapseMenu === '1' ? '0' : '1') } - className="group-[.sidebar]:rotate-[180deg] group-[.sidebar]:mx-auto text-btnText bg-btnSimple rounded-[6px] w-[24px] h-[24px] flex items-center justify-center cursor-pointer select-none" + className="group-[.sidebar]:rotate-[180deg] group-[.sidebar]:mx-auto mobile:hidden text-btnText bg-btnSimple rounded-[6px] w-[24px] h-[24px] flex items-center justify-center cursor-pointer select-none" > {
update(true)} /> -
+
{sortedIntegrations?.length > 0 && } {sortedIntegrations?.length > 0 && user?.tier?.ai && @@ -572,30 +705,31 @@ export const LaunchesComponent = () => {
- {sortedIntegrations.length === 0 && collapseMenu === '0' && ( -
-
- No channels -
- {t('no_channels', 'No channels yet')} -
-
- {t('connect_your_accounts')} + {sortedIntegrations.length === 0 && + (collapseMenu === '0' || channelsOpen) && ( +
+
+ No channels +
+ {t('no_channels', 'No channels yet')} +
+
+ {t('connect_your_accounts')} +
-
- )} + )} {menuIntegrations.map((menu) => ( { /> ))}
-
+
{billingEnabled && user?.isLifetime && (
{capitalize(user?.tier?.current || '')} tier
)} @@ -619,7 +753,40 @@ export const LaunchesComponent = () => {
-
+
+
+
setChannelsOpen(true)} + className="cursor-pointer h-[44px] px-[12px] bg-btnSimple text-btnText rounded-[8px] flex items-center gap-[8px] select-none" + > +
+ {sortedIntegrations.slice(0, 3).map((integration: any) => ( + + ))} +
+
+ {sortedIntegrations.length || t('channels')} +
+
+ {sortedIntegrations?.length > 0 ? ( + <> + + {user?.tier?.ai && billingEnabled && } + + ) : ( +
+ update(true)} /> +
+ )} +
diff --git a/apps/frontend/src/components/launches/menu/menu.tsx b/apps/frontend/src/components/launches/menu/menu.tsx index 053d276650..7859ce00f6 100644 --- a/apps/frontend/src/components/launches/menu/menu.tsx +++ b/apps/frontend/src/components/launches/menu/menu.tsx @@ -76,6 +76,7 @@ export const Menu: FC<{ if (show && menuRef.current) { const menuRect = menuRef.current.getBoundingClientRect(); const viewportHeight = window.innerHeight; + const viewportWidth = window.innerWidth; const padding = 10; // Check if menu overflows bottom of viewport @@ -89,6 +90,14 @@ export const Menu: FC<{ setShow((prev) => (prev ? { ...prev, y: newY } : false)); } } + + // Check if menu overflows right of viewport (small screens) + if (menuRect.right > viewportWidth - padding) { + const newX = Math.max(padding, viewportWidth - menuRect.width - padding); + if (Math.abs(show.x - newX) > 1) { + setShow((prev) => (prev ? { ...prev, x: newX } : false)); + } + } } }, [show]); const findIntegration: any = useMemo(() => { diff --git a/apps/frontend/src/components/layout/impersonate.tsx b/apps/frontend/src/components/layout/impersonate.tsx index c47c71b17b..29e7ab586a 100644 --- a/apps/frontend/src/components/layout/impersonate.tsx +++ b/apps/frontend/src/components/layout/impersonate.tsx @@ -1073,15 +1073,15 @@ export const Impersonate = () => { }, [data]); return (
-
+
{user?.impersonate ? ( -
+
{t('currently_impersonating', 'Currently Impersonating')}
@@ -1099,8 +1099,8 @@ export const Impersonate = () => {
) : ( -
-
+
+
({})) ).message, t('move_to_billing', 'Move to billing'), t('payment_required', 'Payment Required') diff --git a/apps/frontend/src/components/layout/new-modal.tsx b/apps/frontend/src/components/layout/new-modal.tsx index d59bf0ff79..53a210f3a4 100644 --- a/apps/frontend/src/components/layout/new-modal.tsx +++ b/apps/frontend/src/components/layout/new-modal.tsx @@ -136,22 +136,29 @@ export const Component: FC<{ className={clsx( !modal.fullScreen ? 'pb-[50px] min-w-full min-h-full' - : 'w-full h-full', + : 'w-full h-full mobile:block', 'fixed flex left-0 top-0 bg-popup transition-all animate-fadeIn overflow-y-auto text-newTextColor', !isLast && '!overflow-hidden' )} > -
+
@@ -183,11 +190,11 @@ export const Component: FC<{ : {} } className={clsx( - 'absolute min-w-full', + 'absolute min-w-full mobile:w-full', !modal.fullScreen ? modal.top ? '' - : 'min-h-full pt-[100px] pb-[100px]' + : 'min-h-full pt-[100px] pb-[100px] mobile:pt-[24px] mobile:pb-[24px] mobile:px-[8px]' : 'h-screen', modal.size && modal.height ? 'flex justify-center items-center' @@ -196,9 +203,10 @@ export const Component: FC<{ >
e.stopPropagation()} >
-
+
{modal.title}
{typeof modal.withCloseButton === 'undefined' || modal.withCloseButton ? (
)} @@ -167,7 +167,7 @@ export const OrganizationSelector: FC<{ asOpenSelect?: boolean }> = ({ )}
- {!asOpenSelect &&
} + {!asOpenSelect &&
} ); }; diff --git a/apps/frontend/src/components/layout/settings.component.tsx b/apps/frontend/src/components/layout/settings.component.tsx index 2b9b782bbe..da5f11f7d9 100644 --- a/apps/frontend/src/components/layout/settings.component.tsx +++ b/apps/frontend/src/components/layout/settings.component.tsx @@ -117,20 +117,20 @@ export const SettingsPopup: FC<{ return ( <> -
-
+
+
{list.map(({ tab: tabKey, label }) => (
setTab(tabKey)} >
@@ -142,13 +142,13 @@ export const SettingsPopup: FC<{
{showLogout && ( -
+
)}
-
+
{!!getRef && ( diff --git a/apps/frontend/src/components/layout/title.tsx b/apps/frontend/src/components/layout/title.tsx index 5fa3099a61..f071a40936 100644 --- a/apps/frontend/src/components/layout/title.tsx +++ b/apps/frontend/src/components/layout/title.tsx @@ -10,5 +10,5 @@ export const Title = () => { return menuItems.find((item) => path.indexOf(item.path) > -1)?.name; }, [path]); - return

{currentTitle}

; + return

{currentTitle}

; }; diff --git a/apps/frontend/src/components/media/media.component.tsx b/apps/frontend/src/components/media/media.component.tsx index 901e9e5400..4eadb0e84c 100644 --- a/apps/frontend/src/components/media/media.component.tsx +++ b/apps/frontend/src/components/media/media.component.tsx @@ -119,7 +119,7 @@ export const Pagination: FC<{ }, [current, totalPages]); return ( -
    +
    • setPage(current - 1)} > - {t('previous', 'Previous')} + {t('previous', 'Previous')}
    • {paginationItems.map((item, index) => ( @@ -162,7 +162,7 @@ export const Pagination: FC<{ aria-label="Go to next page" onClick={() => setPage(current + 1)} > - {t('next', 'Next')} + {t('next', 'Next')} @@ -420,14 +420,14 @@ export const MediaBox: FC<{
      -
      +
      (
      @@ -537,7 +537,7 @@ export const MediaBox: FC<{ .map((media: any) => (
      )} -
      {media.originalName}
      +
      + {media.originalName} +
      )}
      -
      +
      {!mediaNotAvailable && ( -
      +
      )} {!mediaNotAvailable && ( -
      +
      )} diff --git a/apps/frontend/src/components/media/new.uploader.tsx b/apps/frontend/src/components/media/new.uploader.tsx index 187f49e989..c678467a2c 100644 --- a/apps/frontend/src/components/media/new.uploader.tsx +++ b/apps/frontend/src/components/media/new.uploader.tsx @@ -222,6 +222,10 @@ export function useUppyUploader(props: { }); }); uppy2.on('error', (result) => { + // a single file failing leaves the batch running, 'complete' reports it with the rest + if (Object.keys(uppy2.getState().currentUploads).length) { + return; + } uppy2.cancelAll(); setLocked(false); props.onEnd(); @@ -232,10 +236,20 @@ export function useUppyUploader(props: { }); uppy2.on('complete', async (result) => { console.log(result); - for (const file of [...result.successful]) { + for (const file of [...result.successful, ...(result.failed || [])]) { uppy2.removeFile(file.id); } + if (result.failed?.length) { + toast.show( + t( + 'some_files_failed_to_upload', + 'Some files failed to upload, please try again' + ), + 'warning' + ); + } + props.onEnd(); // Sort results by original add order to maintain file sequence const sortedSuccessful = [...result.successful].sort((a, b) => { diff --git a/apps/frontend/src/components/new-launch/add.edit.modal.tsx b/apps/frontend/src/components/new-launch/add.edit.modal.tsx index 7de3d565d9..a7d016f475 100644 --- a/apps/frontend/src/components/new-launch/add.edit.modal.tsx +++ b/apps/frontend/src/components/new-launch/add.edit.modal.tsx @@ -9,6 +9,9 @@ import { Integrations } from '@gitroom/frontend/components/launches/calendar.con import { useShallow } from 'zustand/react/shallow'; import { useExistingData } from '@gitroom/frontend/components/launches/helpers/use.existing.data'; import { newDayjs } from '@gitroom/frontend/components/layout/set.timezone'; +import { useModals } from '@gitroom/frontend/components/layout/new-modal'; +import { useToaster } from '@gitroom/react/toaster/toaster'; +import { useT } from '@gitroom/react/translation/get.transation.service.client'; export interface AddEditModalProps { dummy?: boolean; @@ -68,6 +71,9 @@ export const AddEditModal: FC = (props) => { export const AddEditModalInner: FC = (props) => { const existingData = useExistingData(); + const modal = useModals(); + const toaster = useToaster(); + const t = useT(); const { addOrRemoveSelectedIntegration, selectedIntegrations, integrations } = useLaunchStore( useShallow((state) => ({ @@ -84,7 +90,9 @@ export const AddEditModalInner: FC = (props) => { const integration = integrations.find( (i) => i.id === post.integration.id ); - addOrRemoveSelectedIntegration(integration, post.settings); + if (integration) { + addOrRemoveSelectedIntegration(integration, post.settings); + } } } } @@ -93,6 +101,17 @@ export const AddEditModalInner: FC = (props) => { const integration = integrations.find( (i) => i.id === existingData.integration ); + if (!integration) { + toaster.show( + t( + 'we_are_experiencing_some_difficulty_try_to_refresh_the_page', + 'We are experiencing some difficulty, try to refresh the page' + ), + 'warning' + ); + modal.closeAll(); + return; + } addOrRemoveSelectedIntegration(integration, existingData.settings); } diff --git a/apps/frontend/src/components/new-launch/editor.tsx b/apps/frontend/src/components/new-launch/editor.tsx index 5c357b7c53..83214e2a07 100644 --- a/apps/frontend/src/components/new-launch/editor.tsx +++ b/apps/frontend/src/components/new-launch/editor.tsx @@ -360,7 +360,7 @@ export const EditorWrapper: FC<{ return (
      0) || (!comments && index > 0)) && 'hidden' )} > -
      -
      +
      +
      {index > 0 && (
      @@ -568,7 +568,6 @@ export const Editor: FC<{ const uppy = useUppyUploader({ onUploadSuccess: (result: any) => { appendImages(result); - uppy.clear(); }, allowedFileTypes: 'image/*,video/mp4', onStart: () => {}, @@ -695,7 +694,7 @@ export const Editor: FC<{ } return ( -
      +
      } toolBar={ -
      +
      {editorType !== 'none' && ( <> diff --git a/apps/frontend/src/components/new-launch/manage.modal.tsx b/apps/frontend/src/components/new-launch/manage.modal.tsx index 9053a912fa..9ef635dad6 100644 --- a/apps/frontend/src/components/new-launch/manage.modal.tsx +++ b/apps/frontend/src/components/new-launch/manage.modal.tsx @@ -43,6 +43,7 @@ import { useHasScroll } from '@gitroom/frontend/components/ui/is.scroll.hook'; import { useShortlinkPreference } from '@gitroom/frontend/components/settings/shortlink-preference.component'; import dayjs from 'dayjs'; import { Button } from '@gitroom/react/form/button'; +import { useClickOutside } from '@mantine/hooks'; export const ManageModal: FC = (props) => { const t = useT(); @@ -53,6 +54,11 @@ export const ManageModal: FC = (props) => { const toaster = useToaster(); const modal = useModals(); const [showSettings, setShowSettings] = useState(false); + const [mobileTab, setMobileTab] = useState<'edit' | 'preview'>('edit'); + const [showPostNow, setShowPostNow] = useState(false); + const postNowRef = useClickOutside(() => { + setShowPostNow(false); + }); const { data: shortlinkPreferenceData } = useShortlinkPreference(); const { addEditSets, mutate, customClose, dummy } = props; @@ -437,12 +443,28 @@ export const ManageModal: FC = (props) => { } if (!dummy) { - addEditSets - ? addEditSets(data) - : await fetch('/posts', { - method: 'POST', - body: JSON.stringify(data), - }); + if (addEditSets) { + addEditSets(data); + } else { + const response = await fetch('/posts', { + method: 'POST', + body: JSON.stringify(data), + }); + + if (!response.ok) { + if (response.status !== 402) { + const { message } = await response.json().catch(() => ({})); + toaster.show( + typeof message === 'string' + ? message + : t('post_save_failed', 'Could not save the post'), + 'warning' + ); + } + setLoading(false); + return; + } + } if (!addEditSets) { mutate(); @@ -467,24 +489,48 @@ export const ManageModal: FC = (props) => { ); return ( -
      -
      -
      -
      -
      +
      +
      +
      +
      +
      {t('create_post_title', 'Create Post')} +
      + +
      -
      +
      + {(['edit', 'preview'] as const).map((tab) => ( +
      setMobileTab(tab)} + className={clsx( + 'flex-1 pt-[6px] pb-[5px] cursor-pointer text-center rounded-[6px]', + mobileTab === tab && 'text-textItemFocused bg-boxFocused' + )} + > + {tab === 'edit' + ? t('edit', 'Edit') + : t('post_preview', 'Post Preview')} +
      + ))} +
      +
      @@ -517,7 +563,7 @@ export const ManageModal: FC = (props) => {
      = (props) => { 'text-[14px] text-textColor font-[500] relative' )} > -
      +
      = (props) => {
      -
      -
      +
      +
      {t('post_preview', 'Post Preview')}
      -
      +
      -
      -
      +
      +
      {!dummy && ( = (props) => { )}
      -
      +
      {existingData?.integration && ( )} {!addEditSets && ( -
      +
      @@ -679,7 +749,10 @@ export const ManageModal: FC = (props) => { disabled={ selectedIntegrations.length === 0 || loading || locked } - className="rounded-[8px] z-[300] disabled:cursor-not-allowed disabled:opacity-80 hidden group-hover:flex absolute bottom-[100%] -left-[12px] p-[12px] w-[206px] bg-newBgColorInner" + className={clsx( + 'rounded-[8px] z-[300] disabled:cursor-not-allowed disabled:opacity-80 absolute bottom-[100%] -left-[12px] mobile:left-0 p-[12px] mobile:px-0 w-[206px] mobile:w-full bg-newBgColorInner', + showPostNow ? 'flex' : 'hidden group-hover:flex' + )} >
      {t('post_now', 'Post Now')} @@ -692,6 +765,7 @@ export const ManageModal: FC = (props) => {
      {
      {postCurrentType !== 'story' && ( - + <> + + + )} {presetAvailable && ( diff --git a/apps/frontend/src/components/new-launch/providers/vk/vk.provider.tsx b/apps/frontend/src/components/new-launch/providers/vk/vk.provider.tsx index 36e4ce8b36..45b443142a 100644 --- a/apps/frontend/src/components/new-launch/providers/vk/vk.provider.tsx +++ b/apps/frontend/src/components/new-launch/providers/vk/vk.provider.tsx @@ -1,5 +1,4 @@ 'use client'; -'use client'; import { PostComment, diff --git a/apps/frontend/src/components/new-layout/layout.component.tsx b/apps/frontend/src/components/new-layout/layout.component.tsx index 6d47d15f41..091cd9fae3 100644 --- a/apps/frontend/src/components/new-layout/layout.component.tsx +++ b/apps/frontend/src/components/new-layout/layout.component.tsx @@ -1,6 +1,6 @@ 'use client'; -import React, { ReactNode, useCallback, useEffect } from 'react'; +import React, { ReactNode, useCallback, useEffect, useState } from 'react'; import { Logo } from '@gitroom/frontend/components/new-layout/logo'; import { Plus_Jakarta_Sans } from 'next/font/google'; const ModeComponent = dynamic( @@ -14,7 +14,7 @@ import clsx from 'clsx'; import dynamic from 'next/dynamic'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; import { useVariables } from '@gitroom/react/helpers/variable.context'; -import { useSearchParams } from 'next/navigation'; +import { usePathname, useSearchParams } from 'next/navigation'; import useSWR from 'swr'; import { CheckPayment } from '@gitroom/frontend/components/layout/check.payment'; import { ToolTip } from '@gitroom/frontend/components/layout/top.tip'; @@ -57,6 +57,11 @@ export const LayoutComponent = ({ children }: { children: ReactNode }) => { // Feedback icon component attaches Sentry feedback to a top-bar icon when DSN is present const searchParams = useSearchParams(); + const pathname = usePathname(); + const [menuOpen, setMenuOpen] = useState(false); + useEffect(() => { + setMenuOpen(false); + }, [pathname]); const load = useCallback(async (path: string) => { return await (await fetch(path)).json(); }, []); @@ -98,7 +103,7 @@ export const LayoutComponent = ({ children }: { children: ReactNode }) => {
      @@ -108,43 +113,81 @@ export const LayoutComponent = ({ children }: { children: ReactNode }) => { ) : ( <> -
      +
      -
      + {menuOpen && ( +
      setMenuOpen(false)} + /> + )} +
      setMenuOpen(false)} + >
      -
      +
      -
      -
      -
      +
      +
      + +
      </div> - <div className="flex gap-[20px] text-textItemBlur"> + <div className="flex gap-[20px] mobile:gap-[14px] mobile:items-center text-textItemBlur"> <StreakComponent /> - <div className="w-[1px] h-[20px] bg-blockSeparator" /> + <div className="w-[1px] h-[20px] bg-blockSeparator mobile:hidden" /> <OrganizationSelector /> <div className="hover:text-newTextColor"> <ModeComponent /> </div> - <div className="w-[1px] h-[20px] bg-blockSeparator" /> + <div className="w-[1px] h-[20px] bg-blockSeparator mobile:hidden" /> <LanguageComponent /> - <ChromeExtensionComponent /> - <div className="w-[1px] h-[20px] bg-blockSeparator" /> - <AttachToFeedbackIcon /> + <div className="contents mobile:hidden"> + <ChromeExtensionComponent /> + </div> + <div className="w-[1px] h-[20px] bg-blockSeparator mobile:hidden" /> + <div className="contents mobile:hidden"> + <AttachToFeedbackIcon /> + </div> <NotificationComponent /> </div> </div> - <div className="flex flex-1 gap-[1px]">{children}</div> + <div className="flex flex-1 min-w-0 gap-[1px] mobile:flex-col"> + {children} + </div> </div> </div> </> diff --git a/apps/frontend/src/components/notifications/notification.component.tsx b/apps/frontend/src/components/notifications/notification.component.tsx index 731b80f96b..95b51b0ebe 100644 --- a/apps/frontend/src/components/notifications/notification.component.tsx +++ b/apps/frontend/src/components/notifications/notification.component.tsx @@ -63,7 +63,7 @@ export const NotificationOpenComponent = () => { return ( <div id="notification-popup" - className="opacity-0 animate-normalFadeDown mt-[10px] absolute w-[420px] min-h-[200px] top-[100%] end-0 bg-third text-textColor rounded-[16px] flex flex-col border border-tableBorder z-[600]" + className="opacity-0 animate-normalFadeDown mt-[10px] absolute w-[420px] max-w-[calc(100vw-24px)] min-h-[200px] top-[100%] end-0 bg-third text-textColor rounded-[16px] flex flex-col border border-tableBorder z-[600]" > <div className={`p-[16px] border-b border-tableBorder font-bold`} diff --git a/apps/frontend/src/components/oauth/authorize.component.tsx b/apps/frontend/src/components/oauth/authorize.component.tsx new file mode 100644 index 0000000000..00556c4e01 --- /dev/null +++ b/apps/frontend/src/components/oauth/authorize.component.tsx @@ -0,0 +1,277 @@ +'use client'; + +import { FC, useCallback, useEffect, useState } from 'react'; +import { useSearchParams } from 'next/navigation'; +import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; +import { Logo } from '@gitroom/frontend/components/new-layout/logo'; +import { OAuthSelfHosted } from '@gitroom/frontend/components/oauth/self.hosted.component'; + +export const OAuthAuthorize: FC<{ logged: boolean }> = ({ logged }) => { + const searchParams = useSearchParams(); + const fetch = useFetch(); + const [appInfo, setAppInfo] = useState<any>(null); + const [error, setError] = useState(''); + const [loading, setLoading] = useState(true); + const [submitting, setSubmitting] = useState(false); + const [selfHosted, setSelfHosted] = useState(false); + + const clientId = searchParams.get('client_id'); + const responseType = searchParams.get('response_type'); + const state = searchParams.get('state'); + const redirectUri = searchParams.get('redirect_uri'); + const codeChallenge = searchParams.get('code_challenge'); + const codeChallengeMethod = searchParams.get('code_challenge_method'); + const resource = searchParams.get('resource'); + + useEffect(() => { + if (!clientId || !responseType) { + setError('Missing required parameters (client_id, response_type)'); + setLoading(false); + return; + } + if (responseType !== 'code') { + setError('Only response_type=code is supported'); + setLoading(false); + return; + } + + const params = new URLSearchParams({ + client_id: clientId, + response_type: responseType, + ...(state ? { state } : {}), + ...(redirectUri ? { redirect_uri: redirectUri } : {}), + ...(codeChallenge ? { code_challenge: codeChallenge } : {}), + ...(codeChallengeMethod + ? { code_challenge_method: codeChallengeMethod } + : {}), + ...(resource ? { resource } : {}), + }); + + fetch(`/oauth/authorize?${params}`) + .then((r) => r.json()) + .then((data) => { + if (data.statusCode && data.statusCode >= 400) { + setError(data.message || 'Invalid OAuth request'); + } else { + setAppInfo(data); + } + setLoading(false); + }) + .catch(() => { + setError('Failed to validate OAuth request'); + setLoading(false); + }); + }, [ + clientId, + responseType, + state, + redirectUri, + codeChallenge, + codeChallengeMethod, + resource, + ]); + + const handleAction = useCallback( + async (action: 'approve' | 'deny') => { + setSubmitting(true); + try { + const result = await ( + await fetch('/oauth/authorize', { + method: 'POST', + body: JSON.stringify({ + client_id: clientId, + state, + action, + ...(redirectUri ? { redirect_uri: redirectUri } : {}), + ...(codeChallenge ? { code_challenge: codeChallenge } : {}), + ...(codeChallengeMethod + ? { code_challenge_method: codeChallengeMethod } + : {}), + }), + }) + ).json(); + + if (result.redirect) { + window.location.href = result.redirect; + } + } catch { + setError('Failed to process authorization'); + setSubmitting(false); + } + }, + [clientId, state, redirectUri, codeChallenge, codeChallengeMethod] + ); + + // Sign in (or sign up) and land back on this same request + const signIn = useCallback(() => { + window.location.href = `/auth/login?returnUrl=${encodeURIComponent( + window.location.href + )}`; + }, []); + + if (loading) { + return ( + <div className="flex flex-1 items-center justify-center text-white relative overflow-hidden"> + <div className="absolute inset-0 opacity-30"> + <div className="absolute top-[20%] left-[10%] w-[300px] h-[300px] bg-[#612BD3] rounded-full blur-[120px]" /> + <div className="absolute bottom-[20%] right-[10%] w-[250px] h-[250px] bg-[#FC69FF] rounded-full blur-[120px]" /> + </div> + <div className="relative z-10 text-center"> + <div className="flex justify-center mb-[24px]"> + <Logo /> + </div> + <div className="text-[16px] text-gray-400"> + Please wait... + </div> + <div className="mt-[32px] flex justify-center"> + <div className="w-[48px] h-[48px] border-[3px] border-[#612BD3] border-t-transparent rounded-full animate-spin" /> + </div> + </div> + </div> + ); + } + + if (error) { + return ( + <div className="flex flex-1 items-center justify-center text-white relative overflow-hidden"> + <div className="absolute inset-0 opacity-30"> + <div className="absolute top-[20%] left-[10%] w-[300px] h-[300px] bg-[#612BD3] rounded-full blur-[120px]" /> + <div className="absolute bottom-[20%] right-[10%] w-[250px] h-[250px] bg-[#FC69FF] rounded-full blur-[120px]" /> + </div> + <div className="relative z-10 text-center"> + <div className="flex justify-center mb-[24px]"> + <Logo /> + </div> + <div className="w-[80px] h-[80px] mx-auto mb-[24px] rounded-full bg-red-500/20 flex items-center justify-center"> + <svg + className="w-[40px] h-[40px] text-red-500" + fill="currentColor" + viewBox="0 0 20 20" + > + <path + fillRule="evenodd" + d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" + clipRule="evenodd" + /> + </svg> + </div> + <div className="text-[28px] font-semibold mb-[12px]"> + Authorization Error + </div> + <div className="text-[16px] text-gray-400 max-w-[400px]"> + {error} + </div> + </div> + </div> + ); + } + + if (!appInfo) { + return null; + } + + return ( + <div className="flex flex-1 items-center justify-center text-white relative overflow-hidden"> + <div className="absolute inset-0 opacity-30"> + <div className="absolute top-[20%] left-[10%] w-[300px] h-[300px] bg-[#612BD3] rounded-full blur-[120px]" /> + <div className="absolute bottom-[20%] right-[10%] w-[250px] h-[250px] bg-[#FC69FF] rounded-full blur-[120px]" /> + </div> + + <div className="relative z-10 w-full max-w-[500px] mx-auto px-[20px]"> + <div className="flex justify-center mb-[32px]"> + <Logo /> + </div> + + <div className="bg-[#1A1919] rounded-[16px] p-[32px] flex flex-col gap-[24px]"> + <div className="flex flex-col items-center gap-[16px]"> + {appInfo.app.picture?.path ? ( + <img + src={appInfo.app.picture.path} + alt={appInfo.app.name} + className="w-[64px] h-[64px] rounded-full object-cover" + /> + ) : ( + <div className="w-[64px] h-[64px] rounded-full bg-[#2A2929] flex items-center justify-center text-[24px] text-gray-400"> + {appInfo.app.name?.[0]?.toUpperCase() || '?'} + </div> + )} + <h2 className="text-[24px] font-semibold text-center"> + {appInfo.app.name} + </h2> + {appInfo.app.description && ( + <div className="text-gray-400 text-center text-[14px]"> + {appInfo.app.description} + </div> + )} + </div> + + {selfHosted ? ( + <OAuthSelfHosted + appName={appInfo.app.name} + askEmail={!!appInfo.selfHostedEmail} + params={{ + client_id: clientId, + state, + redirect_uri: redirectUri, + code_challenge: codeChallenge, + code_challenge_method: codeChallengeMethod, + resource, + }} + onBack={() => setSelfHosted(false)} + /> + ) : ( + <> + <div className="border-t border-[#2A2929] pt-[16px]"> + <div className="text-[14px] text-gray-400 mb-[12px]"> + This application is requesting access to your Postiz + account. It will be able to: + </div> + <ul className="text-[14px] list-disc list-inside space-y-[4px]"> + <li>Access your integrations and channels</li> + <li>Create and schedule posts on your behalf</li> + <li>Read your post analytics</li> + </ul> + </div> + + {logged ? ( + <div className="flex gap-[12px]"> + <button + onClick={() => handleAction('approve')} + disabled={submitting} + className="flex-1 bg-[#612BD3] hover:bg-[#7B3FF2] disabled:opacity-50 text-white rounded-[8px] py-[10px] px-[16px] text-[14px] font-semibold transition-colors" + > + Authorize + </button> + <button + onClick={() => handleAction('deny')} + disabled={submitting} + className="flex-1 bg-[#2A2929] hover:bg-[#3A3939] disabled:opacity-50 text-white rounded-[8px] py-[10px] px-[16px] text-[14px] font-semibold transition-colors" + > + Deny + </button> + </div> + ) : ( + <button + onClick={signIn} + className="bg-[#612BD3] hover:bg-[#7B3FF2] text-white rounded-[8px] py-[10px] px-[16px] text-[14px] font-semibold transition-colors" + > + Sign in to Postiz + </button> + )} + + {!!appInfo.selfHosted && ( + <button + onClick={() => setSelfHosted(true)} + disabled={submitting} + className="text-[14px] text-gray-400 hover:text-white disabled:opacity-50 transition-colors" + > + Use self-hosted + </button> + )} + </> + )} + </div> + </div> + </div> + ); +}; diff --git a/apps/frontend/src/components/oauth/self.hosted.component.tsx b/apps/frontend/src/components/oauth/self.hosted.component.tsx new file mode 100644 index 0000000000..97c0f92ecb --- /dev/null +++ b/apps/frontend/src/components/oauth/self.hosted.component.tsx @@ -0,0 +1,166 @@ +'use client'; + +import { FC, FormEvent, useCallback, useState } from 'react'; +import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; +import { Input } from '@gitroom/react/form/input'; + +export const OAuthSelfHosted: FC<{ + appName: string; + // clients that read the email from userinfo (ChatGPT) need one + askEmail: boolean; + params: { + client_id: string | null; + state: string | null; + redirect_uri: string | null; + code_challenge: string | null; + code_challenge_method: string | null; + resource: string | null; + }; + onBack: () => void; +}> = ({ appName, askEmail, params, onBack }) => { + const fetch = useFetch(); + const [instanceUrl, setInstanceUrl] = useState(''); + const [apiKey, setApiKey] = useState(''); + const [email, setEmail] = useState(''); + const [error, setError] = useState(''); + const [submitting, setSubmitting] = useState(false); + + const connect = useCallback( + async (e: FormEvent) => { + e.preventDefault(); + setSubmitting(true); + setError(''); + try { + const response = await fetch('/oauth/authorize/self-hosted', { + method: 'POST', + body: JSON.stringify({ + client_id: params.client_id, + state: params.state, + ...(params.redirect_uri + ? { redirect_uri: params.redirect_uri } + : {}), + ...(params.code_challenge + ? { code_challenge: params.code_challenge } + : {}), + ...(params.code_challenge_method + ? { code_challenge_method: params.code_challenge_method } + : {}), + ...(params.resource ? { resource: params.resource } : {}), + instance_url: instanceUrl.trim(), + ...(apiKey.trim() ? { api_key: apiKey.trim() } : {}), + ...(askEmail && email.trim() ? { email: email.trim() } : {}), + }), + }); + const data = await response.json(); + if (data.redirect) { + window.location.href = data.redirect; + return; + } + + setError( + response.status === 429 + ? 'Too many attempts, try again later' + : (Array.isArray(data.message) ? data.message[0] : data.message) || + 'Could not connect to your instance' + ); + } catch { + setError('Could not connect to your instance'); + } + setSubmitting(false); + }, + [params, instanceUrl, apiKey, email, askEmail] + ); + + return ( + <form + onSubmit={connect} + className="border-t border-[#2A2929] pt-[16px] flex flex-col gap-[16px]" + > + <div className="flex flex-col gap-[4px]"> + <div className="text-[16px] font-semibold">Use self-hosted</div> + <div className="text-[14px] text-gray-400"> + {appName} will work with your own Postiz instance. Postiz Cloud + relays its requests, and your API key is stored encrypted. + </div> + </div> + + {/* plain text fields: a password field makes browsers autofill the + saved Postiz login (email + password) into this form */} + <Input + name="instance_url" + label="Instance URL" + disableForm={true} + removeError={true} + value={instanceUrl} + onChange={(e) => setInstanceUrl(e.target.value)} + placeholder="https://postiz.example.com" + inputMode="url" + autoComplete="off" + spellCheck={false} + /> + + <div className="flex flex-col gap-[6px]"> + <Input + name="api_key" + label="API key" + disableForm={true} + removeError={true} + value={apiKey} + onChange={(e) => setApiKey(e.target.value)} + placeholder="Settings > Developers on your instance" + autoComplete="off" + spellCheck={false} + /> + <div className="text-[12px] text-gray-400"> + You can also paste the MCP URL from Settings > Developers in the + Instance URL, it includes the key. + </div> + </div> + + {askEmail && ( + <div className="flex flex-col gap-[6px]"> + <Input + name="email" + label="Email" + type="email" + disableForm={true} + removeError={true} + value={email} + onChange={(e) => setEmail(e.target.value)} + placeholder="you@example.com" + autoComplete="email" + /> + <div className="text-[12px] text-gray-400"> + {appName} uses it to identify your account. + </div> + </div> + )} + + {!!error && <div className="text-[14px] text-red-400">{error}</div>} + + <div className="flex gap-[12px]"> + <button + type="submit" + disabled={ + submitting || !instanceUrl.trim() || (askEmail && !email.trim()) + } + className="flex-1 bg-[#612BD3] hover:bg-[#7B3FF2] disabled:opacity-50 text-white rounded-[8px] py-[10px] px-[16px] text-[14px] font-semibold transition-colors" + > + {submitting ? 'Connecting...' : 'Connect'} + </button> + <button + type="button" + onClick={onBack} + disabled={submitting} + className="flex-1 bg-[#2A2929] hover:bg-[#3A3939] disabled:opacity-50 text-white rounded-[8px] py-[10px] px-[16px] text-[14px] font-semibold transition-colors" + > + Back + </button> + </div> + + <div className="text-[12px] text-gray-400 text-center"> + Your instance has to be reachable from the internet over https. + </div> + </form> + ); +}; diff --git a/apps/frontend/src/components/platform-analytics/platform.analytics.tsx b/apps/frontend/src/components/platform-analytics/platform.analytics.tsx index 67761ac53a..4234c9f639 100644 --- a/apps/frontend/src/components/platform-analytics/platform.analytics.tsx +++ b/apps/frontend/src/components/platform-analytics/platform.analytics.tsx @@ -177,12 +177,12 @@ export const PlatformAnalytics = () => { <> <div className={clsx( - 'bg-newBgColorInner p-[20px] flex flex-col gap-[15px] transition-all', + 'bg-newBgColorInner p-[20px] mobile:p-[12px] flex flex-col gap-[15px] transition-all mobile:w-full', collapseMenu === '1' ? 'group sidebar w-[100px]' : 'w-[260px]' )} > <div className="flex gap-[12px] flex-col"> - <div className="flex items-center"> + <div className="flex items-center mobile:hidden"> <h2 className="group-[.sidebar]:hidden flex-1 text-[20px] font-[500]"> {t('channels')} </h2> @@ -207,75 +207,78 @@ export const PlatformAnalytics = () => { </svg> </div> </div> - {sortedIntegrations.map((integration, index) => ( - <div - key={integration.id} - onClick={() => { - if (integration.refreshNeeded) { - toaster.show( - 'Please refresh the integration from the calendar', - 'warning' - ); - return; - } - setRefresh(true); - setTimeout(() => { - setRefresh(false); - }, 10); - setCurrent(index); - }} - className={clsx( - 'flex gap-[12px] items-center group/profile justify-center hover:bg-boxHover rounded-e-[8px]', - currentIntegration.id !== integration.id && - 'opacity-20 hover:opacity-100 cursor-pointer' - )} - > + <div className="flex gap-[15px] mobile:gap-[12px] flex-col mobile:flex-row mobile:overflow-x-auto mobile:ps-[12px] mobile:pt-[6px] mobile:pb-[6px] scrollbar scrollbar-thumb-fifth scrollbar-track-newBgColor"> + {sortedIntegrations.map((integration, index) => ( <div + key={integration.id} + onClick={() => { + if (integration.refreshNeeded) { + toaster.show( + 'Please refresh the integration from the calendar', + 'warning' + ); + return; + } + setRefresh(true); + setTimeout(() => { + setRefresh(false); + }, 10); + setCurrent(index); + }} className={clsx( - 'relative rounded-full flex justify-center items-center gap-[6px]', - integration.disabled && 'opacity-50' + 'flex gap-[12px] items-center group/profile justify-center hover:bg-boxHover rounded-e-[8px] mobile:shrink-0', + currentIntegration.id !== integration.id && + 'opacity-20 hover:opacity-100 cursor-pointer' )} > - {(integration.inBetweenSteps || integration.refreshNeeded) && ( - <div className="absolute start-0 top-0 w-[39px] h-[46px] cursor-pointer"> - <div className="bg-red-500 w-[15px] h-[15px] rounded-full start-0 -top-[5px] absolute z-[200] text-[10px] flex justify-center items-center"> - ! + <div + className={clsx( + 'relative rounded-full flex justify-center items-center gap-[6px]', + integration.disabled && 'opacity-50' + )} + > + {(integration.inBetweenSteps || + integration.refreshNeeded) && ( + <div className="absolute start-0 top-0 w-[39px] h-[46px] cursor-pointer"> + <div className="bg-red-500 w-[15px] h-[15px] rounded-full start-0 -top-[5px] absolute z-[200] text-[10px] flex justify-center items-center"> + ! + </div> + <div className="bg-primary/60 w-[39px] h-[46px] start-0 top-0 absolute rounded-full z-[199]" /> </div> - <div className="bg-primary/60 w-[39px] h-[46px] start-0 top-0 absolute rounded-full z-[199]" /> + )} + <div className="h-full w-[4px] -ms-[12px] rounded-s-[3px] opacity-0 group-hover/profile:opacity-100 transition-opacity"> + <SVGLine /> </div> - )} - <div className="h-full w-[4px] -ms-[12px] rounded-s-[3px] opacity-0 group-hover/profile:opacity-100 transition-opacity"> - <SVGLine /> + <ImageWithFallback + fallbackSrc={`/icons/platforms/${integration.identifier}.png`} + src={integration.picture} + className="rounded-[8px]" + alt={integration.identifier} + width={36} + height={36} + /> + <SafeImage + src={`/icons/platforms/${integration.identifier}.png`} + className="rounded-[8px] absolute z-10 bottom-[5px] -end-[5px] border border-fifth" + alt={integration.identifier} + width={18.41} + height={18.41} + /> + </div> + <div + className={clsx( + 'flex-1 whitespace-nowrap text-ellipsis overflow-hidden group-[.sidebar]:hidden mobile:hidden', + integration.disabled && 'opacity-50' + )} + > + {integration.name} </div> - <ImageWithFallback - fallbackSrc={`/icons/platforms/${integration.identifier}.png`} - src={integration.picture} - className="rounded-[8px]" - alt={integration.identifier} - width={36} - height={36} - /> - <SafeImage - src={`/icons/platforms/${integration.identifier}.png`} - className="rounded-[8px] absolute z-10 bottom-[5px] -end-[5px] border border-fifth" - alt={integration.identifier} - width={18.41} - height={18.41} - /> - </div> - <div - className={clsx( - 'flex-1 whitespace-nowrap text-ellipsis overflow-hidden group-[.sidebar]:hidden', - integration.disabled && 'opacity-50' - )} - > - {integration.name} </div> - </div> - ))} + ))} + </div> </div> </div> - <div className="bg-newBgColorInner flex-1 flex-col flex p-[20px] gap-[12px]"> + <div className="bg-newBgColorInner flex-1 flex-col flex p-[20px] mobile:p-[12px] gap-[12px]"> {!!options.length && ( <div className="flex-1 flex flex-col gap-[14px]"> <div className="max-w-[200px]"> diff --git a/apps/frontend/src/components/plugs/plug.tsx b/apps/frontend/src/components/plugs/plug.tsx index de6978ec12..91da85c779 100644 --- a/apps/frontend/src/components/plugs/plug.tsx +++ b/apps/frontend/src/components/plugs/plug.tsx @@ -198,9 +198,9 @@ export const PlugItem: FC<{ <div onClick={() => addPlug(data)} key={plug.title} - className="w-full h-[300px] rounded-[8px] bg-newTableHeader hover:bg-newTableBorder" + className="w-full h-[300px] mobile:h-auto rounded-[8px] bg-newTableHeader hover:bg-newTableBorder" > - <div key={plug.title} className="p-[16px] h-full flex flex-col flex-1"> + <div key={plug.title} className="p-[16px] h-full flex flex-col flex-1 mobile:gap-[16px]"> <div className="flex"> <div className="text-[20px] mb-[8px] flex-1">{plug.title}</div> {!!data && ( @@ -263,7 +263,7 @@ export const Plug = () => { return null; } return ( - <div className="grid grid-cols-3 gap-[30px]"> + <div className="grid grid-cols-3 tablet:grid-cols-2 mobile:!grid-cols-1 gap-[30px] mobile:gap-[16px]"> {plug.plugs.map((p) => ( <PlugItem key={p.title + '-' + plug.providerId} diff --git a/apps/frontend/src/components/plugs/plugs.tsx b/apps/frontend/src/components/plugs/plugs.tsx index 6071981b9a..e27a57df7b 100644 --- a/apps/frontend/src/components/plugs/plugs.tsx +++ b/apps/frontend/src/components/plugs/plugs.tsx @@ -122,12 +122,12 @@ export const Plugs = () => { <> <div className={clsx( - 'bg-newBgColorInner p-[20px] flex flex-col gap-[15px] transition-all', + 'bg-newBgColorInner p-[20px] mobile:p-[12px] flex flex-col gap-[15px] transition-all mobile:w-full', collapseMenu === '1' ? 'group sidebar w-[100px]' : 'w-[260px]' )} > <div className="flex gap-[12px] flex-col"> - <div className="flex items-center"> + <div className="flex items-center mobile:hidden"> <h2 className="group-[.sidebar]:hidden flex-1 text-[20px] font-[500]"> {t('channels')} </h2> @@ -152,75 +152,78 @@ export const Plugs = () => { </svg> </div> </div> - {sortedIntegrations.map((integration, index) => ( - <div - key={integration.id} - onClick={() => { - if (integration.refreshNeeded) { - toaster.show( - 'Please refresh the integration from the calendar', - 'warning' - ); - return; - } - setRefresh(true); - setTimeout(() => { - setRefresh(false); - }, 10); - setCurrent(index); - }} - className={clsx( - 'flex gap-[8px] items-center justify-center group/profile hover:bg-boxHover rounded-e-[8px]', - currentIntegration.id !== integration.id && - 'opacity-20 hover:opacity-100 cursor-pointer' - )} - > + <div className="flex gap-[15px] mobile:gap-[12px] flex-col mobile:flex-row mobile:overflow-x-auto mobile:ps-[12px] mobile:pt-[6px] mobile:pb-[6px] scrollbar scrollbar-thumb-fifth scrollbar-track-newBgColor"> + {sortedIntegrations.map((integration, index) => ( <div + key={integration.id} + onClick={() => { + if (integration.refreshNeeded) { + toaster.show( + 'Please refresh the integration from the calendar', + 'warning' + ); + return; + } + setRefresh(true); + setTimeout(() => { + setRefresh(false); + }, 10); + setCurrent(index); + }} className={clsx( - 'relative rounded-full flex justify-center items-center gap-[8px]', - integration.disabled && 'opacity-50' + 'flex gap-[8px] items-center justify-center group/profile hover:bg-boxHover rounded-e-[8px] mobile:shrink-0', + currentIntegration.id !== integration.id && + 'opacity-20 hover:opacity-100 cursor-pointer' )} > - {(integration.inBetweenSteps || integration.refreshNeeded) && ( - <div className="absolute start-0 top-0 w-[39px] h-[46px] cursor-pointer"> - <div className="bg-red-500 w-[15px] h-[15px] rounded-full start-0 -top-[5px] absolute z-[200] text-[10px] flex justify-center items-center"> - ! + <div + className={clsx( + 'relative rounded-full flex justify-center items-center gap-[8px]', + integration.disabled && 'opacity-50' + )} + > + {(integration.inBetweenSteps || + integration.refreshNeeded) && ( + <div className="absolute start-0 top-0 w-[39px] h-[46px] cursor-pointer"> + <div className="bg-red-500 w-[15px] h-[15px] rounded-full start-0 -top-[5px] absolute z-[200] text-[10px] flex justify-center items-center"> + ! + </div> + <div className="bg-primary/60 w-[39px] h-[46px] start-0 top-0 absolute rounded-full z-[199]" /> </div> - <div className="bg-primary/60 w-[39px] h-[46px] start-0 top-0 absolute rounded-full z-[199]" /> + )} + <div className="h-full w-[4px] -ms-[12px] rounded-s-[3px] opacity-0 group-hover/profile:opacity-100 transition-opacity"> + <SVGLine /> </div> - )} - <div className="h-full w-[4px] -ms-[12px] rounded-s-[3px] opacity-0 group-hover/profile:opacity-100 transition-opacity"> - <SVGLine /> + <ImageWithFallback + fallbackSrc={`/icons/platforms/${integration.identifier}.png`} + src={integration.picture} + className="rounded-[8px]" + alt={integration.identifier} + width={36} + height={36} + /> + <SafeImage + src={`/icons/platforms/${integration.identifier}.png`} + className="rounded-[8px] absolute z-10 bottom-[5px] -end-[5px] border border-fifth" + alt={integration.identifier} + width={18.41} + height={18.41} + /> + </div> + <div + className={clsx( + 'flex-1 whitespace-nowrap text-ellipsis overflow-hidden group-[.sidebar]:hidden mobile:hidden', + integration.disabled && 'opacity-50' + )} + > + {integration.name} </div> - <ImageWithFallback - fallbackSrc={`/icons/platforms/${integration.identifier}.png`} - src={integration.picture} - className="rounded-[8px]" - alt={integration.identifier} - width={36} - height={36} - /> - <SafeImage - src={`/icons/platforms/${integration.identifier}.png`} - className="rounded-[8px] absolute z-10 bottom-[5px] -end-[5px] border border-fifth" - alt={integration.identifier} - width={18.41} - height={18.41} - /> - </div> - <div - className={clsx( - 'flex-1 whitespace-nowrap text-ellipsis overflow-hidden group-[.sidebar]:hidden', - integration.disabled && 'opacity-50' - )} - > - {integration.name} </div> - </div> - ))} + ))} + </div> </div> </div> - <div className="bg-newBgColorInner flex-1 flex-col flex p-[20px] gap-[12px]"> + <div className="bg-newBgColorInner flex-1 flex-col flex p-[20px] mobile:p-[12px] gap-[12px]"> <PlugsContext.Provider value={currentIntegrationPlug}> <Plug /> </PlugsContext.Provider> diff --git a/apps/frontend/src/components/third-parties/third-party.component.tsx b/apps/frontend/src/components/third-parties/third-party.component.tsx index 056c3780c3..503467a8a4 100644 --- a/apps/frontend/src/components/third-parties/third-party.component.tsx +++ b/apps/frontend/src/components/third-parties/third-party.component.tsx @@ -64,7 +64,7 @@ export const ThirdPartyMenuComponent: FC<{ {show && ( <div onClick={(e) => e.stopPropagation()} - className={`absolute top-[100%] start-0 p-[8px] px-[20px] bg-fifth flex flex-col gap-[16px] z-[100] rounded-[8px] border border-tableBorder text-nowrap`} + className={`absolute top-[100%] start-0 mobile:start-auto mobile:end-0 p-[8px] px-[20px] bg-fifth flex flex-col gap-[16px] z-[100] rounded-[8px] border border-tableBorder text-nowrap`} > <div className="flex gap-[12px] items-center" @@ -116,18 +116,18 @@ export const ThirdPartyComponent = () => { <> <div className={clsx( - 'bg-newBgColorInner p-[20px] flex flex-col gap-[15px] transition-all', + 'bg-newBgColorInner p-[20px] mobile:p-[12px] flex flex-col gap-[15px] transition-all mobile:w-full', collapseMenu === '1' ? 'group sidebar w-[100px]' : 'w-[260px]' )} > <div className="flex gap-[12px] flex-col"> <div className="flex items-center"> - <h2 className="group-[.sidebar]:hidden flex-1 text-[20px] font-[500]"> + <h2 className="group-[.sidebar]:hidden mobile:group-[.sidebar]:block flex-1 text-[20px] mobile:text-[18px] font-[500]"> {t('integrations')} </h2> <div onClick={() => setCollapseMenu(collapseMenu === '1' ? '0' : '1')} - className="group-[.sidebar]:rotate-[180deg] group-[.sidebar]:mx-auto text-btnText bg-btnSimple rounded-[6px] w-[24px] h-[24px] flex items-center justify-center cursor-pointer select-none" + className="group-[.sidebar]:rotate-[180deg] group-[.sidebar]:mx-auto mobile:hidden text-btnText bg-btnSimple rounded-[6px] w-[24px] h-[24px] flex items-center justify-center cursor-pointer select-none" > <svg xmlns="http://www.w3.org/2000/svg" @@ -184,7 +184,7 @@ export const ThirdPartyComponent = () => { // @ts-ignore role="Handle" className={clsx( - 'flex-1 whitespace-nowrap text-ellipsis overflow-hidden group-[.sidebar]:hidden' + 'flex-1 whitespace-nowrap text-ellipsis overflow-hidden group-[.sidebar]:hidden mobile:group-[.sidebar]:block' )} data-tooltip-id="tooltip" data-tooltip-content={p.title} @@ -200,7 +200,7 @@ export const ThirdPartyComponent = () => { </div> </div> </div> - <div className="bg-newBgColorInner flex-1 flex-col flex p-[20px] gap-[12px]"> + <div className="bg-newBgColorInner flex-1 flex-col flex p-[20px] mobile:p-[12px] gap-[12px]"> <ThirdPartyListComponent reload={mutate} /> </div> </> diff --git a/apps/frontend/src/components/third-parties/third-party.list.component.tsx b/apps/frontend/src/components/third-parties/third-party.list.component.tsx index 9dcaea7b25..f8d7a842c1 100644 --- a/apps/frontend/src/components/third-parties/third-party.list.component.tsx +++ b/apps/frontend/src/components/third-parties/third-party.list.component.tsx @@ -126,12 +126,12 @@ export const ThirdPartyListComponent: FC<{ reload: () => void }> = (props) => { ); return ( - <div className="grid grid-cols-4 gap-[10px] justify-items-center justify-center"> + <div className="grid grid-cols-4 tablet:grid-cols-3 mobile:!grid-cols-2 gap-[10px] justify-items-center justify-center"> {data?.map((p: any) => ( <div onClick={addApiKey(p.title, p.identifier)} key={p.identifier} - className="w-full h-full p-[20px] min-h-[100px] text-[14px] bg-newTableHeader hover:bg-newTableBorder rounded-[8px] transition-all text-textColor relative flex flex-col gap-[15px] cursor-pointer" + className="w-full h-full p-[20px] mobile:p-[14px] min-h-[100px] text-[14px] bg-newTableHeader hover:bg-newTableBorder rounded-[8px] transition-all text-textColor relative flex flex-col gap-[15px] cursor-pointer" > <div> <img diff --git a/apps/frontend/src/components/third-parties/third-party.media-library.tsx b/apps/frontend/src/components/third-parties/third-party.media-library.tsx index 9b02713f11..a0630acf5f 100644 --- a/apps/frontend/src/components/third-parties/third-party.media-library.tsx +++ b/apps/frontend/src/components/third-parties/third-party.media-library.tsx @@ -91,7 +91,7 @@ const ThirdPartyMediaLibraryBrowser: FC<{ <div className="flex-1 relative"> <div className="absolute left-0 top-0 w-full h-full overflow-x-hidden overflow-y-auto scrollbar scrollbar-thumb-newColColor scrollbar-track-newBgColorInner"> {isLoading && ( - <div className="grid grid-cols-4 gap-[8px]"> + <div className="grid grid-cols-4 mobile:grid-cols-3 gap-[8px]"> {[...new Array(8)].map((_, i) => ( <div key={i} @@ -106,7 +106,7 @@ const ThirdPartyMediaLibraryBrowser: FC<{ </div> )} {!isLoading && !!data?.results?.length && ( - <div className="grid grid-cols-4 gap-[8px]"> + <div className="grid grid-cols-4 mobile:grid-cols-3 gap-[8px]"> {data.results.map((item: any) => { const isSelected = !!selected.find((s) => s.id === item.id); return ( diff --git a/apps/frontend/src/components/third-parties/third-party.media.tsx b/apps/frontend/src/components/third-parties/third-party.media.tsx index 252409259e..c523bcdc5a 100644 --- a/apps/frontend/src/components/third-parties/third-party.media.tsx +++ b/apps/frontend/src/components/third-parties/third-party.media.tsx @@ -95,14 +95,14 @@ export const ThirdPartyPopup: FC<{ return ( <div className={clsx('flex flex-wrap flex-col gap-[10px] pt-[20px]')}> {!thirdParty && ( - <div className="grid grid-cols-4 gap-[10px] justify-items-center justify-center"> + <div className="grid grid-cols-4 mobile:grid-cols-2 gap-[10px] justify-items-center justify-center"> {thirdParties.map((p: any) => ( <div onClick={() => { setThirdParty(p); }} key={p.identifier} - className="w-full h-full p-[20px] min-h-[100px] text-[14px] bg-newTableHeader hover:bg-newTableBorder rounded-[8px] transition-all text-textColor relative flex flex-col gap-[15px] cursor-pointer" + className="w-full h-full p-[20px] mobile:p-[14px] min-h-[100px] text-[14px] bg-newTableHeader hover:bg-newTableBorder rounded-[8px] transition-all text-textColor relative flex flex-col gap-[15px] cursor-pointer" > <div> <img diff --git a/apps/frontend/src/proxy.ts b/apps/frontend/src/proxy.ts index d868f7df45..61812e972a 100644 --- a/apps/frontend/src/proxy.ts +++ b/apps/frontend/src/proxy.ts @@ -94,7 +94,10 @@ export async function proxy(request: NextRequest) { nextUrl.pathname.startsWith('/uploads/') || nextUrl.pathname.startsWith('/p/') || nextUrl.pathname.startsWith('/provider/') || - nextUrl.pathname.startsWith('/icons/') + nextUrl.pathname.startsWith('/icons/') || + // the consent screen of MCP / OAuth clients handles signed-out visitors + // itself (sign in and come back, or connect a self-hosted instance) + nextUrl.pathname.startsWith('/oauth/authorize') ) { return topResponse; } diff --git a/i18n.lock b/i18n.lock index 6f5597c7db..1f9a81b9d9 100644 --- a/i18n.lock +++ b/i18n.lock @@ -646,6 +646,10 @@ checksums: channel_id_copied: 58bf6a74adf570a5daf233ce496149de settings_updated: 260e10a61200b581616d766f3af5ae52 customer_updated: ab17bcd115b14b72bb2e89f2b48883a4 + edit_group_name: 64654e2647a83d0c51e357c9ba30a962 + group_name: 9368b5a047572b6051f334af5aa76819 + group_updated: db3365d95da2a925566eb65a1a416883 + could_not_save_group: 31c544cf61f16ce4f6930268a26e7192 custom_url: f1e4e1c6a386d212abe94b937cf5e812 picture: 14818ef364a0ecc8b738bdb23c46b3c3 upgrade_required: 460dbea5061a1aba2080ffdecdf9544c @@ -686,6 +690,7 @@ checksums: repeat_post_every_label: f3e3fd4d95a0eeaf1eab0219278ae812 add_new_tag: 911360b396ef6db7a24eb53134f0f7d2 tag_name: 9368b5a047572b6051f334af5aa76819 + post_save_failed: 164475f6751549f91a5b6e7f759fbca8 post_is_too_long: 7784c6ecca2c7e58665e83e219aff80b your_post_should_have_at_least_one_character_or_one_image: e7a0d63d2931ca540ceea25c6d4df7ec internal_edit: 04ed5d507cfed7c4f348df338c106809 @@ -725,6 +730,8 @@ checksums: chat_onboarding_description: 9da74037342cd6adb283e8205299b986 connector: 7abb5584501ce0e3cc51ba19f0561ca8 connector_onboarding_description: eb8027296b46bf58475f6b4925bd6351 + official_connector: cdaaab2f023cb2eaea40b666e9859442 + connector_self_hosted_description: c966620ed2df1d6ffeaa92969aaf30a6 mcp_onboarding_description: 5b33036d174222d86ac50039a3a31724 cli_onboarding_description: b4aba065e5a8410ee2c365ee4d7aa87c agent_settings_later: bbdd45a80cc5218809363348e0b03a32 @@ -790,3 +797,4 @@ checksums: preview_comment_detach_hint: 6fa385ae985c409b511cf7adea2f950a preview_comment_text_changed: 6a4298cc0304d150e0d150689fa049f4 preview_no_comments_yet: e9bda0977d617e8ee0079feba73b3c3a + some_files_failed_to_upload: 87c15cf17373c535da85470188df68c7 diff --git a/libraries/helpers/src/utils/read.or.fetch.ts b/libraries/helpers/src/utils/read.or.fetch.ts deleted file mode 100644 index 49c0ac9eef..0000000000 --- a/libraries/helpers/src/utils/read.or.fetch.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { readFileSync } from 'fs'; -import axios from 'axios'; - -export const readOrFetch = async (path: string) => { - if (path.indexOf('http') === 0) { - return ( - await axios({ - url: path, - method: 'GET', - responseType: 'arraybuffer', - }) - ).data; - } - - return readFileSync(path); -}; diff --git a/libraries/nestjs-libraries/src/chat/async.storage.ts b/libraries/nestjs-libraries/src/chat/async.storage.ts index fff383ff13..bffed1f97f 100644 --- a/libraries/nestjs-libraries/src/chat/async.storage.ts +++ b/libraries/nestjs-libraries/src/chat/async.storage.ts @@ -1,9 +1,12 @@ // context.ts import { AsyncLocalStorage } from 'node:async_hooks'; +import type { SelfHostedInstance } from '@gitroom/nestjs-libraries/chat/mcp.relay.service'; type Ctx = { requestId: string; auth: any; // replace with your org type if you have it, e.g. Organization + // a self-hosted connection: where its tool calls are relayed to + relay?: SelfHostedInstance & { id: string }; }; const als = new AsyncLocalStorage<Ctx>(); @@ -22,4 +25,8 @@ export function getAuth<T = any>(): T | undefined { export function getRequestId(): string | undefined { return als.getStore()?.requestId; +} + +export function getRelay(): Ctx['relay'] { + return als.getStore()?.relay; } \ No newline at end of file diff --git a/libraries/nestjs-libraries/src/chat/chat.module.ts b/libraries/nestjs-libraries/src/chat/chat.module.ts index ed5cc62da7..87f1b0ec10 100644 --- a/libraries/nestjs-libraries/src/chat/chat.module.ts +++ b/libraries/nestjs-libraries/src/chat/chat.module.ts @@ -2,10 +2,11 @@ import { Global, Module } from '@nestjs/common'; import { LoadToolsService } from '@gitroom/nestjs-libraries/chat/load.tools.service'; import { MastraService } from '@gitroom/nestjs-libraries/chat/mastra.service'; import { toolList } from '@gitroom/nestjs-libraries/chat/tools/tool.list'; +import { McpRelayService } from '@gitroom/nestjs-libraries/chat/mcp.relay.service'; @Global() @Module({ - providers: [MastraService, LoadToolsService, ...toolList], + providers: [MastraService, LoadToolsService, McpRelayService, ...toolList], get exports() { return this.providers; }, diff --git a/libraries/nestjs-libraries/src/chat/mcp.relay.service.ts b/libraries/nestjs-libraries/src/chat/mcp.relay.service.ts new file mode 100644 index 0000000000..7cb0bd0a92 --- /dev/null +++ b/libraries/nestjs-libraries/src/chat/mcp.relay.service.ts @@ -0,0 +1,358 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { createTool } from '@mastra/core/tools'; +import { Client } from '@modelcontextprotocol/sdk/client/index.js'; +import { + StreamableHTTPClientTransport, + StreamableHTTPError, +} from '@modelcontextprotocol/sdk/client/streamableHttp.js'; +import { + CallToolResult, + ErrorCode, + McpError, +} from '@modelcontextprotocol/sdk/types.js'; +import { getRelay } from '@gitroom/nestjs-libraries/chat/async.storage'; +import { ssrfSafeDispatcher } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher'; +import { isSafePublicHttpsUrl } from '@gitroom/nestjs-libraries/dtos/webhooks/webhook.url.validator'; +import { OAuthService } from '@gitroom/nestjs-libraries/database/prisma/oauth/oauth.service'; +import { LoadToolsService } from '@gitroom/nestjs-libraries/chat/load.tools.service'; + +export interface SelfHostedInstance { + mcpUrl: string; + apiKey: string; +} + +// Every Postiz MCP server since v2.19.0 (the first one with the API key /mcp +// route) has these; a server without them is not a Postiz instance +const requiredTools = ['integrationList', 'integrationSchedulePostTool']; + +// Tool results are small JSON, an instance never needs this server to hold +// more than this in memory +const maxResponseBytes = 10 * 1024 * 1024; + +// The address comes from a public endpoint: the pinned-DNS SSRF guard stays +// on whatever DISABLE_SSRF_PROTECTION says, no redirects and a cap on the body +const instanceFetch = async (url: string | URL, init?: RequestInit) => { + const response = await fetch(url, { + ...init, + redirect: 'error', + // @ts-ignore - undici option, not in lib.dom fetch types + dispatcher: ssrfSafeDispatcher, + }); + + if (Number(response.headers.get('content-length')) > maxResponseBytes) { + await response.body?.cancel(); + throw new Error('The response of the instance is too large'); + } + if (!response.body) { + return response; + } + + let received = 0; + const capped = response.body.pipeThrough( + new TransformStream<Uint8Array, Uint8Array>({ + transform(chunk, controller) { + received += chunk.byteLength; + if (received > maxResponseBytes) { + controller.error( + new Error('The response of the instance is too large') + ); + return; + } + controller.enqueue(chunk); + }, + }) + ); + + return new Response(capped, { + status: response.status, + statusText: response.statusText, + headers: response.headers, + }); +}; + +// Postiz Cloud relays the MCP connection of a self-hosted Postiz: the person +// brings the instance and its API key on the consent screen ("Use +// self-hosted"), and the tool calls of that connection run on the instance +@Injectable() +export class McpRelayService { + constructor( + private _oauthService: OAuthService, + private _loadToolsService: LoadToolsService + ) {} + + // Turns what the person typed on the consent screen into the MCP endpoint + // of their instance, and checks that the API key works there + async connect( + instanceUrl: string, + apiKey?: string + ): Promise<SelfHostedInstance> { + const value = instanceUrl.trim(); + let url: URL; + try { + url = new URL( + /^[a-z][a-z0-9+.-]*:\/\//i.test(value) ? value : `https://${value}` + ); + } catch { + throw new HttpException( + 'Enter the address of your Postiz instance, for example https://postiz.example.com', + HttpStatus.BAD_REQUEST + ); + } + + // An address with credentials (an email like me@company.com reads as + // user "me" on company.com) is never sent anywhere + if (url.username || url.password) { + throw new HttpException( + 'Enter the address of your Postiz instance, for example https://postiz.example.com', + HttpStatus.BAD_REQUEST + ); + } + + // The MCP URL from Settings > Developers carries the API key: + // <backend>/mcp/<key> + const fromSettings = url.pathname.match(/^(.*?)\/mcp\/([^/]+)\/?$/); + const key = + apiKey?.trim() || (fromSettings && decodeURIComponent(fromSettings[2])); + if (!key) { + throw new HttpException( + 'Enter the API key of your Postiz instance', + HttpStatus.BAD_REQUEST + ); + } + + if (!(await isSafePublicHttpsUrl(url.origin))) { + throw new HttpException( + 'Your Postiz instance must be reachable from the internet over https', + HttpStatus.BAD_REQUEST + ); + } + + // The docker image serves the backend under /api of the same domain, + // a backend on its own domain answers on /mcp + const path = (fromSettings ? fromSettings[1] : url.pathname) + .replace(/\/+$/, '') + .replace(/\/mcp$/, ''); + const candidates = path.endsWith('/api') + ? [`${url.origin}${path}/mcp`] + : [`${url.origin}${path}/api/mcp`, `${url.origin}${path}/mcp`]; + + for (const mcpUrl of candidates) { + let tools: string[]; + try { + tools = await this.withClient({ mcpUrl, apiKey: key }, async (client) => + (await client.listTools(undefined, { timeout: 10000 })).tools.map( + (tool) => tool.name + ) + ); + } catch (err) { + if (err instanceof StreamableHTTPError && err.code === 401) { + throw new HttpException( + 'Your Postiz instance rejected this API key', + HttpStatus.BAD_REQUEST + ); + } + if (err instanceof StreamableHTTPError && err.code === 403) { + throw new HttpException( + 'Your Postiz instance refused the connection (403), make sure nothing in front of it blocks requests from Postiz Cloud', + HttpStatus.BAD_REQUEST + ); + } + // nothing that speaks MCP at this address, try the next one + continue; + } + + if (!requiredTools.every((name) => tools.includes(name))) { + throw new HttpException( + `${url.origin} does not look like a Postiz instance, or it runs a version older than v2.19.0`, + HttpStatus.BAD_REQUEST + ); + } + + // Every tool this server lists has to run on the instance, an older one + // would answer some calls with errors + const missing = Object.keys(await this._loadToolsService.loadTools()).filter( + (name) => !tools.includes(name) + ); + if (missing.length) { + throw new HttpException( + `Your Postiz instance is missing tools this connection needs (${missing.join(', ')}). Update it to the latest Postiz version and connect again`, + HttpStatus.BAD_REQUEST + ); + } + + return { mcpUrl, apiKey: key }; + } + + throw new HttpException( + `Could not find a Postiz MCP server at ${url.origin}. Paste the MCP URL from Settings > Developers of your instance, and make sure it runs Postiz v2.19.0 or newer`, + HttpStatus.BAD_REQUEST + ); + } + + // The same definitions this server serves everyone (the listing stays the + // reviewed one, and nothing an instance returns ends up in a description), + // run by the instance. Pass tools without ui:// widgets - those upload to + // this server - and _meta (a tool's widget link) is dropped too + tools(source: Record<string, any>) { + return Object.fromEntries( + Object.entries(source).map(([name, tool]) => [ + name, + createTool({ + id: tool.id, + description: tool.description, + inputSchema: tool.inputSchema, + outputSchema: tool.outputSchema, + mcp: { annotations: tool.mcp?.annotations }, + execute: async (inputData: Record<string, unknown>, context: any) => { + const instance = getRelay(); + if (!instance) { + throw new Error( + 'This connection is not linked to a self-hosted instance' + ); + } + + const result = await this.callTool( + instance, + name, + inputData, + context?.mcp?.extra?.signal + ); + const text = this.text(result); + if (!tool.outputSchema) { + return text; + } + + // The structured result is what the outputSchema describes; + // instances whose tool had no outputSchema yet answer with JSON text + let output: unknown = result.structuredContent; + if (output === undefined) { + try { + output = JSON.parse(text); + } catch { + throw new Error( + text || + `${name} returned an unexpected answer from your Postiz instance` + ); + } + } + + // an instance on another Postiz version can answer in another shape + const check = await tool.outputSchema['~standard']?.validate(output); + if (check?.issues) { + throw new Error( + `Your Postiz instance answered ${name} in a format this connection does not know, update the instance to the latest Postiz version` + ); + } + + return output; + }, + }), + ]) + ); + } + + async callTool( + instance: SelfHostedInstance & { id?: string }, + name: string, + args: Record<string, unknown>, + signal?: AbortSignal + ) { + let result: CallToolResult; + try { + result = (await this.withClient(instance, (client) => + client.callTool({ name, arguments: args }, undefined, { + signal, + // under the 100 seconds Cloudflare gives a request to the MCP host + timeout: 90000, + }) + )) as CallToolResult; + } catch (err) { + // The key was rotated (or the instance reset): the connection can never + // work again, so it goes away and the client asks to connect again + if (err instanceof StreamableHTTPError && err.code === 401 && instance.id) { + await this._oauthService.deleteSelfHostedAuthorization(instance.id); + } + throw new Error(this.describeError(instance, name, err)); + } + + if (result.isError) { + const text = this.text(result); + // an instance older than this server doesn't have every tool yet + if (text.startsWith('Unknown tool:')) { + throw new Error( + `Your Postiz instance does not have ${name} yet, update it to the latest Postiz version to use it` + ); + } + // arguments this server validated but an older instance doesn't accept + if (text.startsWith('Tool validation failed')) { + throw new Error( + `Your Postiz instance runs an older version of ${name}, update it to the latest Postiz version to use it` + ); + } + throw new Error(text || `${name} failed on your Postiz instance`); + } + + return result; + } + + private async withClient<T>( + instance: SelfHostedInstance, + run: (client: Client) => Promise<T> + ) { + const transport = new StreamableHTTPClientTransport( + new URL(instance.mcpUrl), + { + requestInit: { + headers: { Authorization: `Bearer ${instance.apiKey}` }, + }, + fetch: instanceFetch, + } + ); + const client = new Client({ name: 'Postiz Cloud', version: '1.0.0' }); + + try { + await client.connect(transport, { timeout: 10000 }); + return await run(client); + } finally { + // instances older than v2.23.0 keep a session per connection, end it + // so relayed calls don't pile them up + if (transport.sessionId) { + await transport.terminateSession().catch(() => {}); + } + await client.close().catch(() => {}); + } + } + + private text(result: CallToolResult) { + return (result.content || []) + .filter((part) => part.type === 'text') + .map((part) => (part as { text: string }).text) + .join('\n') + .trim(); + } + + // What the model (and so the person) reads when the instance can't run a + // tool - it has to say what to do next + private describeError( + instance: SelfHostedInstance, + name: string, + err: unknown + ) { + const origin = new URL(instance.mcpUrl).origin; + if (err instanceof StreamableHTTPError && err.code === 401) { + return `Your Postiz instance (${origin}) rejected the saved API key, it was probably rotated, so this connection was removed. Connect Postiz again to keep using your instance`; + } + if (err instanceof StreamableHTTPError && err.code === 403) { + return `Your Postiz instance (${origin}) refused the request (403), make sure nothing in front of it blocks requests from Postiz Cloud`; + } + if (err instanceof McpError && err.code === ErrorCode.RequestTimeout) { + return `Your Postiz instance (${origin}) did not answer ${name} in time`; + } + if (err instanceof McpError) { + return `Your Postiz instance (${origin}) could not run ${name}: ${err.message}`; + } + return `Could not reach your Postiz instance (${origin}): ${ + err instanceof Error ? err.message : String(err) + }. Make sure it is online and reachable from the internet`; + } +} diff --git a/libraries/nestjs-libraries/src/chat/start.mcp.ts b/libraries/nestjs-libraries/src/chat/start.mcp.ts index c892baeb39..609b181f96 100644 --- a/libraries/nestjs-libraries/src/chat/start.mcp.ts +++ b/libraries/nestjs-libraries/src/chat/start.mcp.ts @@ -4,13 +4,17 @@ import { MastraService } from '@gitroom/nestjs-libraries/chat/mastra.service'; import { LoadToolsService } from '@gitroom/nestjs-libraries/chat/load.tools.service'; import { MCPServer } from '@mastra/mcp'; import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service'; -import { OAuthService } from '@gitroom/nestjs-libraries/database/prisma/oauth/oauth.service'; +import { + OAuthService, + selfHostedRelayEnabled, +} from '@gitroom/nestjs-libraries/database/prisma/oauth/oauth.service'; import { runWithContext } from './async.storage'; import { createOAuthMiddleware } from './oauth-middleware'; import { getBrandConfig } from '@gitroom/helpers/utils/brand.config'; import { UPLOAD_WIDGET_URI, uploadWidgetHtml } from '@gitroom/nestjs-libraries/chat/ui/upload.widget'; import { CLIPPING_WIDGET_URI, clippingWidgetHtml } from '@gitroom/nestjs-libraries/chat/ui/clipping.widget'; import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory'; +import { McpRelayService } from '@gitroom/nestjs-libraries/chat/mcp.relay.service'; const fixAcceptHeader = (req: Request) => { const value = 'application/json, text/event-stream'; req.headers.accept = value; @@ -35,6 +39,7 @@ export const startMcp = async (app: INestApplication) => { const organizationService = app.get(OrganizationService, { strict: false }); const oauthService = app.get(OAuthService, { strict: false }); const loadToolsService = app.get(LoadToolsService, { strict: false }); + const mcpRelayService = app.get(McpRelayService, { strict: false }); const resolveAuth = async (token: string) => { if (token.startsWith('pos_')) { @@ -45,10 +50,15 @@ export const startMcp = async (app: INestApplication) => { return organizationService.getOrgByApiKey(token); }; + // psh_ tokens: a self-hosted Postiz this server relays to (McpRelayService) + const resolveSelfHosted = (token: string) => + oauthService.getSelfHostedByAccessToken(token); + const mastra = await mastraService.mastra(); const agent = mastra.getAgent('postiz'); + const agentTools = await agent.listTools(); const tools = { - ...(await agent.listTools()), + ...agentTools, // tools that only make sense inside an MCP host (ui:// widgets) ...(await loadToolsService.loadTools(true)), }; @@ -76,9 +86,11 @@ export const startMcp = async (app: INestApplication) => { 'clippingStatusTool', 'clippingWidgetTicketTool', ]; - const claudeTools = Object.fromEntries( - Object.entries(tools).filter(([name]) => !claudeHiddenTools.includes(name)) - ) as typeof tools; + const withoutClaudeHidden = <T extends Record<string, unknown>>(source: T) => + Object.fromEntries( + Object.entries(source).filter(([name]) => !claudeHiddenTools.includes(name)) + ) as T; + const claudeTools = withoutClaudeHidden(tools); const backendUrl = process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL; // this runs before the backend listens: a bucket url that doesn't parse only @@ -158,6 +170,24 @@ export const startMcp = async (app: INestApplication) => { appResources: claudeAppResources, }); + // Self-hosted connections, built from the agent tools so the ui:// widgets + // (which upload to this server) are left out + let selfHostedServer: MCPServer | undefined; + let claudeSelfHostedServer: MCPServer | undefined; + if (selfHostedRelayEnabled()) { + const selfHostedTools = mcpRelayService.tools(agentTools); + selfHostedServer = new MCPServer({ + name: 'Crove MCP', + version: '1.0.0', + tools: selfHostedTools, + }); + claudeSelfHostedServer = new MCPServer({ + name: 'Crove MCP', + version: '1.0.0', + tools: withoutClaudeHidden(selfHostedTools), + }); + } + // Two RFC 8414 path-based issuers backed by the same endpoints and code. // /mcp-oauth-chatgpt is what the ChatGPT app submission points at: it does // not advertise a registration_endpoint, so the OpenAI builder defaults to @@ -205,7 +235,9 @@ export const startMcp = async (app: INestApplication) => { authorizationServers: [authorizationServers[authorizationServer].issuer], scopesSupported: oauthScopes, validateToken: async (token: string) => { - const org = await resolveAuth(token); + const org = token.startsWith('psh_') + ? await resolveSelfHosted(token) + : await resolveAuth(token); if (!org) { return { valid: false, error: 'invalid_token', errorDescription: 'Invalid API Key or OAuth token' }; } @@ -217,17 +249,21 @@ export const startMcp = async (app: INestApplication) => { const oauthResources: Record< string, - { middleware: ReturnType<typeof createOAuthMiddleware>; mcpServer: MCPServer } + { + middleware: ReturnType<typeof createOAuthMiddleware>; + mcpServer: MCPServer; + selfHostedServer?: MCPServer; + } > = { // ChatGPT app submission (pre-defined client credentials, no DCR) - '/mcp-oauth-chatgpt': { middleware: createResourceMiddleware('/mcp-oauth-chatgpt', '/mcp-oauth-chatgpt'), mcpServer: oauthServer }, + '/mcp-oauth-chatgpt': { middleware: createResourceMiddleware('/mcp-oauth-chatgpt', '/mcp-oauth-chatgpt'), mcpServer: oauthServer, selfHostedServer }, // Former ChatGPT path, kept for connectors that were created against it - '/mcp-oauth': { middleware: createResourceMiddleware('/mcp-oauth', '/mcp-oauth-dynamic'), mcpServer: oauthServer }, + '/mcp-oauth': { middleware: createResourceMiddleware('/mcp-oauth', '/mcp-oauth-dynamic'), mcpServer: oauthServer, selfHostedServer }, // Claude connector directory submission - '/mcp-oauth-claude': { middleware: createResourceMiddleware('/mcp-oauth-claude', '/mcp-oauth-dynamic'), mcpServer: claudeOauthServer }, + '/mcp-oauth-claude': { middleware: createResourceMiddleware('/mcp-oauth-claude', '/mcp-oauth-dynamic'), mcpServer: claudeOauthServer, selfHostedServer: claudeSelfHostedServer }, // Clients that register themselves through DCR (/oauth/register) - not // directory-reviewed, so they get the full toolset (media generation included) - '/mcp-oauth-dynamic': { middleware: createResourceMiddleware('/mcp-oauth-dynamic', '/mcp-oauth-dynamic'), mcpServer: oauthServer }, + '/mcp-oauth-dynamic': { middleware: createResourceMiddleware('/mcp-oauth-dynamic', '/mcp-oauth-dynamic'), mcpServer: oauthServer, selfHostedServer }, }; if (process.env.OPENAI_APP_CHALLANGE) { @@ -303,22 +339,25 @@ export const startMcp = async (app: INestApplication) => { } // baseUrl is the mount path that matched, e.g. /mcp-oauth-claude - const { middleware, mcpServer } = oauthResources[req.baseUrl]; + const { middleware, mcpServer, selfHostedServer } = oauthResources[req.baseUrl]; const url = new URL(req.baseUrl, process.env.NEXT_PUBLIC_BACKEND_URL); const result = await middleware(req, res, url); if (!result.proceed) return; const token = result.tokenValidation?.subject; - const auth = await resolveAuth(token!); - if (!auth) { + // a self-hosted connection has no organization here + const selfHosted = token!.startsWith('psh_'); + const relay = selfHosted ? await resolveSelfHosted(token!) : undefined; + const auth = selfHosted ? undefined : await resolveAuth(token!); + if (!auth && !(relay && selfHostedServer)) { res.status(401).json({ error: 'invalid_token', error_description: 'Could not resolve organization' }); return; } fixAcceptHeader(req); - await runWithContext({ requestId: token!, auth }, async () => { - await mcpServer.startHTTP({ + await runWithContext({ requestId: token!, auth, relay: relay || undefined }, async () => { + await (relay ? selfHostedServer! : mcpServer).startHTTP({ url: url, httpPath: url.pathname, options: { diff --git a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts index 37274a6f37..0a9f2b1fc1 100644 --- a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts @@ -539,6 +539,28 @@ export class IntegrationRepository { }); } + getCustomerByName(orgId: string, name: string) { + return this._customers.model.customer.findFirst({ + where: { + orgId, + name, + deletedAt: null, + }, + }); + } + + updateCustomerName(orgId: string, id: string, name: string) { + return this._customers.model.customer.update({ + where: { + id, + orgId, + }, + data: { + name, + }, + }); + } + customers(orgId: string) { return this._customers.model.customer.findMany({ where: { diff --git a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts index 8e4bf24c1f..c677c49be3 100644 --- a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts @@ -526,6 +526,20 @@ export class IntegrationService { return this._integrationRepository.customers(orgId); } + async updateCustomerName(orgId: string, id: string, name: string) { + const exists = await this._integrationRepository.getCustomerByName( + orgId, + name + ); + if (exists && exists.id !== id) { + throw new HttpException( + 'A group with this name already exists', + HttpStatus.BAD_REQUEST + ); + } + return this._integrationRepository.updateCustomerName(orgId, id, name); + } + getPlugsByIntegrationId(org: string, integrationId: string) { return this._integrationRepository.getPlugsByIntegrationId( org, diff --git a/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.repository.ts b/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.repository.ts index 123712aed0..8a6867c5e1 100644 --- a/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.repository.ts @@ -5,7 +5,8 @@ import { PrismaRepository } from '@gitroom/nestjs-libraries/database/prisma/pris export class OAuthRepository { constructor( private _oauthApp: PrismaRepository<'oAuthApp'>, - private _oauthAuth: PrismaRepository<'oAuthAuthorization'> + private _oauthAuth: PrismaRepository<'oAuthAuthorization'>, + private _oauthSelfHosted: PrismaRepository<'oAuthSelfHostedAuthorization'> ) {} getAppByOrgId(orgId: string) { @@ -133,6 +134,7 @@ export class OAuthRepository { dynamic: true, createdAt: { lt: olderThan }, authorizations: { none: {} }, + selfHostedAuthorizations: { none: {} }, }, }); } @@ -339,7 +341,17 @@ export class OAuthRepository { }); } - revokeAllForApp(oauthAppId: string) { + async revokeAllForApp(oauthAppId: string) { + await this._oauthSelfHosted.model.oAuthSelfHostedAuthorization.updateMany({ + where: { + oauthAppId, + revokedAt: null, + }, + data: { + revokedAt: new Date(), + }, + }); + return this._oauthAuth.model.oAuthAuthorization.updateMany({ where: { oauthAppId, @@ -350,4 +362,121 @@ export class OAuthRepository { }, }); } + + // holds the instance API key, so only the id comes back + createSelfHostedAuthorization(data: { + oauthAppId: string; + mcpUrl: string; + apiKey: string; + email?: string; + authorizationCode: string; + codeExpiresAt: Date; + codeChallenge?: string; + codeChallengeMethod?: string; + redirectUri?: string; + }) { + return this._oauthSelfHosted.model.oAuthSelfHostedAuthorization.create({ + select: { + id: true, + }, + data: { + oauthAppId: data.oauthAppId, + mcpUrl: data.mcpUrl, + apiKey: data.apiKey, + email: data.email || null, + authorizationCode: data.authorizationCode, + codeExpiresAt: data.codeExpiresAt, + codeChallenge: data.codeChallenge || null, + codeChallengeMethod: data.codeChallengeMethod || null, + redirectUri: data.redirectUri || null, + }, + }); + } + + // Abandoned consent flows leave rows (and API keys) that never got a token + deleteAbandonedSelfHostedAuthorizations(olderThan: Date) { + return this._oauthSelfHosted.model.oAuthSelfHostedAuthorization.deleteMany( + { + where: { + accessToken: null, + createdAt: { lt: olderThan }, + }, + } + ); + } + + findSelfHostedByCode(encryptedCode: string) { + return this._oauthSelfHosted.model.oAuthSelfHostedAuthorization.findFirst({ + where: { + authorizationCode: encryptedCode, + revokedAt: null, + }, + select: { + id: true, + oauthAppId: true, + codeExpiresAt: true, + codeChallenge: true, + redirectUri: true, + }, + }); + } + + exchangeSelfHostedCodeForToken(id: string, encryptedToken: string) { + return this._oauthSelfHosted.model.oAuthSelfHostedAuthorization.update({ + where: { id }, + select: { + id: true, + }, + data: { + accessToken: encryptedToken, + authorizationCode: null, + codeExpiresAt: null, + codeChallenge: null, + codeChallengeMethod: null, + redirectUri: null, + }, + }); + } + + findSelfHostedByAccessToken(encryptedToken: string) { + return this._oauthSelfHosted.model.oAuthSelfHostedAuthorization.findFirst({ + where: { + accessToken: encryptedToken, + revokedAt: null, + }, + select: { + id: true, + mcpUrl: true, + apiKey: true, + }, + }); + } + + findSelfHostedUserInfo(encryptedToken: string) { + return this._oauthSelfHosted.model.oAuthSelfHostedAuthorization.findFirst({ + where: { + accessToken: encryptedToken, + revokedAt: null, + }, + select: { + id: true, + email: true, + oauthApp: { + select: { + clientId: true, + dynamic: true, + redirectUris: true, + }, + }, + }, + }); + } + + deleteSelfHostedAuthorization(id: string) { + return this._oauthSelfHosted.model.oAuthSelfHostedAuthorization.deleteMany( + { + where: { id }, + } + ); + } } diff --git a/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.service.ts b/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.service.ts index 428d3ac303..035cd3578a 100644 --- a/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.service.ts @@ -8,12 +8,17 @@ import { AuthService } from '@gitroom/helpers/auth/auth.service'; import { extractBearerToken } from '@gitroom/nestjs-libraries/chat/oauth-types'; import { createHash } from 'crypto'; import { OAuthApp } from '@prisma/client'; +import type { SelfHostedInstance } from '@gitroom/nestjs-libraries/chat/mcp.relay.service'; const openAiOAuthClientId = () => process.env.OPENAI_OAUTH_CLIENT_ID?.trim(); const enableOidcEmailClaims = () => Boolean(openAiOAuthClientId()); +// Postiz Cloud only, a self-hosted install has nothing to relay to +export const selfHostedRelayEnabled = () => + process.env.MCP_SELF_HOSTED_RELAY === 'true'; + // Verified-domain match: exact host or a subdomain of it (spoof-safe, the // leading dot means evilclaude.ai and claude.ai.evil.com are both rejected) const isVerifiedHost = (host: string, verifiedDomains: string[]) => @@ -259,6 +264,54 @@ export class OAuthService { ].join(' '); } + // Only MCP connections can be relayed to an instance: dynamically registered + // clients (registration is only advertised to MCP clients), the ChatGPT app, + // or a client asking for one of the /mcp-oauth resources (RFC 8707). Apps + // that use Postiz OAuth for the public API never get the option, a relayed + // token doesn't work there + allowsSelfHosted( + app: Pick<OAuthApp, 'clientId' | 'dynamic'>, + resource?: string + ) { + if (!selfHostedRelayEnabled()) { + return false; + } + if (app.dynamic || app.clientId === openAiOAuthClientId()) { + return true; + } + try { + return !!resource && new URL(resource).pathname.startsWith('/mcp-oauth'); + } catch { + return false; + } + } + + // The ChatGPT app reads the email from userinfo; a self-hosted connection + // has no cloud user to take it from, so the consent screen asks for one + selfHostedRequiresEmail(app: Pick<OAuthApp, 'clientId'>) { + return enableOidcEmailClaims() && app.clientId === openAiOAuthClientId(); + } + + // On top of validateAuthorizationRequest, for a self-hosted connection + validateSelfHostedRequest( + app: Pick<OAuthApp, 'clientId' | 'dynamic'>, + options: { resource?: string; email?: string } + ) { + if (!this.allowsSelfHosted(app, options.resource)) { + throw new HttpException( + 'This application can not connect to a self-hosted instance', + HttpStatus.BAD_REQUEST + ); + } + + if (!options.email && this.selfHostedRequiresEmail(app)) { + throw new HttpException( + 'Enter your email address', + HttpStatus.BAD_REQUEST + ); + } + } + async validateAuthorizationRequest( clientId: string, options?: { @@ -328,6 +381,40 @@ export class OAuthService { return code; } + async createSelfHostedAuthorizationCode( + oauthAppId: string, + instance: SelfHostedInstance & { email?: string }, + pkce?: { + codeChallenge?: string; + codeChallengeMethod?: string; + redirectUri?: string; + } + ) { + this._oauthRepository + .deleteAbandonedSelfHostedAuthorizations( + new Date(Date.now() - 24 * 60 * 60 * 1000) + ) + .catch(() => {}); + + // The prefix sends the code to the self-hosted table at the token + // endpoint (regular codes use the same alphabet, without an underscore) + const code = 'psc_' + makeSecureId(32); + + await this._oauthRepository.createSelfHostedAuthorization({ + oauthAppId, + mcpUrl: instance.mcpUrl, + apiKey: AuthService.fixedEncryption(instance.apiKey), + email: instance.email, + authorizationCode: AuthService.fixedEncryption(code), + codeExpiresAt: new Date(Date.now() + 10 * 60 * 1000), + codeChallenge: pkce?.codeChallenge, + codeChallengeMethod: pkce?.codeChallengeMethod, + redirectUri: pkce?.redirectUri, + }); + + return code; + } + async exchangeCodeForToken( code: string, clientId: string, @@ -359,6 +446,15 @@ export class OAuthService { } } + if (code.startsWith('psc_')) { + return this.exchangeSelfHostedCodeForToken( + app, + code, + codeVerifier, + redirectUri + ); + } + const encryptedCode = AuthService.fixedEncryption(code); const auth = await this._oauthRepository.findByCode(encryptedCode); if (!auth || auth.oauthAppId !== app.id) { @@ -368,6 +464,38 @@ export class OAuthService { ); } + this.verifyCodeGrant(auth, codeVerifier, redirectUri); + + const token = 'pos_' + makeSecureId(40); + const encryptedToken = AuthService.fixedEncryption(token); + const { + organizationId, + organization: { paymentId }, + } = await this._oauthRepository.exchangeCodeForToken( + auth.id, + encryptedToken + ); + + return { + id: organizationId, + cus: paymentId, + access_token: token, + token_type: 'bearer', + scope: this.grantedScope(app), + }; + } + + // Expiry, PKCE and redirect_uri checks of an authorization code, shared by + // cloud and self-hosted authorizations + private verifyCodeGrant( + auth: { + codeExpiresAt: Date | null; + codeChallenge: string | null; + redirectUri: string | null; + }, + codeVerifier?: string, + redirectUri?: string + ) { if (!auth.codeExpiresAt || new Date() > auth.codeExpiresAt) { throw new HttpException( { error: 'invalid_grant', error_description: 'Code has expired' }, @@ -397,26 +525,66 @@ export class OAuthService { HttpStatus.BAD_REQUEST ); } + } - const token = 'pos_' + makeSecureId(40); - const encryptedToken = AuthService.fixedEncryption(token); - const { - organizationId, - organization: { paymentId }, - } = await this._oauthRepository.exchangeCodeForToken( + // A self-hosted connection has no organization (or payment) to return, + // only the token + private async exchangeSelfHostedCodeForToken( + app: OAuthApp, + code: string, + codeVerifier?: string, + redirectUri?: string + ) { + const auth = await this._oauthRepository.findSelfHostedByCode( + AuthService.fixedEncryption(code) + ); + if (!auth || auth.oauthAppId !== app.id) { + throw new HttpException( + { error: 'invalid_grant' }, + HttpStatus.BAD_REQUEST + ); + } + + this.verifyCodeGrant(auth, codeVerifier, redirectUri); + + const token = 'psh_' + makeSecureId(40); + await this._oauthRepository.exchangeSelfHostedCodeForToken( auth.id, - encryptedToken + AuthService.fixedEncryption(token) ); return { - id: organizationId, - cus: paymentId, access_token: token, token_type: 'bearer', scope: this.grantedScope(app), }; } + // null when the relay is off or the token is unknown or revoked + async getSelfHostedByAccessToken(token: string) { + if (!selfHostedRelayEnabled()) { + return null; + } + + const authorization = + await this._oauthRepository.findSelfHostedByAccessToken( + AuthService.fixedEncryption(token) + ); + if (!authorization) { + return null; + } + + return { + id: authorization.id, + mcpUrl: authorization.mcpUrl, + apiKey: AuthService.fixedDecryption(authorization.apiKey), + }; + } + + deleteSelfHostedAuthorization(id: string) { + return this._oauthRepository.deleteSelfHostedAuthorization(id); + } + async getOrgByOAuthToken(token: string) { const encrypted = AuthService.fixedEncryption(token); return this._oauthRepository.findByAccessToken(encrypted); @@ -441,6 +609,10 @@ export class OAuthService { ); } + if (token.startsWith('psh_')) { + return this.getSelfHostedUserInfo(token); + } + const authorizationRecord = await this.getOrgByOAuthToken(token); if (!authorizationRecord) { throw new HttpException( @@ -468,6 +640,40 @@ export class OAuthService { }; } + // A self-hosted connection has no cloud user: the subject is the connection + // and the email is the one typed on the consent screen, which nobody verified + private async getSelfHostedUserInfo(token: string) { + const selfHosted = selfHostedRelayEnabled() + ? await this._oauthRepository.findSelfHostedUserInfo( + AuthService.fixedEncryption(token) + ) + : null; + if (!selfHosted) { + throw new HttpException( + { error: 'invalid_token', error_description: 'Token is invalid or revoked' }, + HttpStatus.UNAUTHORIZED + ); + } + + if (!this.allowsEmailClaims(selfHosted.oauthApp)) { + throw new HttpException( + { + error: 'insufficient_scope', + error_description: + 'This OAuth client is not authorized to access email claims', + }, + HttpStatus.FORBIDDEN + ); + } + + return { + sub: selfHosted.id, + ...(selfHosted.email + ? { email: selfHosted.email, email_verified: false } + : {}), + }; + } + async getApprovedApps(userId: string) { return this._oauthRepository.getApprovedApps(userId); } diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts index 51056e57f0..2d24173e26 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts @@ -430,6 +430,24 @@ export class PostsRepository { }); } + updateResolvedRelease( + id: string, + orgId: string, + releaseId: string, + releaseURL: string + ) { + return this._post.model.post.update({ + where: { + id, + organizationId: orgId, + }, + data: { + releaseId, + releaseURL, + }, + }); + } + async changeState(id: string, state: State, err?: any, body?: any) { const update = await this._post.model.post.update({ where: { 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 31ecc48bf3..4c63d3d728 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -156,6 +156,37 @@ export class PostsService { return this._postRepository.updateReleaseId(postId, orgId, releaseId); } + async resolveRelease( + orgId: string, + post: { + id: string; + releaseId: string; + releaseURL: string; + integration: Integration; + } + ) { + const integrationProvider = this._integrationManager.getSocialIntegration( + post.integration.providerIdentifier + ); + + const resolved = await integrationProvider.resolveReleaseId?.( + post.integration.token, + post.releaseId, + post.integration + ); + if (!resolved || resolved.postId === post.releaseId) { + return { releaseId: post.releaseId, releaseURL: post.releaseURL }; + } + + await this._postRepository.updateResolvedRelease( + post.id, + orgId, + resolved.postId, + resolved.releaseURL + ); + return { releaseId: resolved.postId, releaseURL: resolved.releaseURL }; + } + async checkPostAnalytics( orgId: string, postId: string, @@ -214,10 +245,12 @@ export class PostsService { // } try { + const { releaseId } = await this.resolveRelease(orgId, post); + const loadAnalytics = await integrationProvider.postAnalytics( getIntegration.internalId, getIntegration.token, - post.releaseId, + releaseId, date ); await ioRedis.set( diff --git a/libraries/nestjs-libraries/src/database/prisma/schema.prisma b/libraries/nestjs-libraries/src/database/prisma/schema.prisma index 37f1803eb8..d1356a21c1 100644 --- a/libraries/nestjs-libraries/src/database/prisma/schema.prisma +++ b/libraries/nestjs-libraries/src/database/prisma/schema.prisma @@ -151,6 +151,7 @@ model UserOrganization { user User @relation(fields: [userId], references: [id]) @@unique([userId, organizationId]) + @@index([organizationId]) @@index([disabled]) } @@ -749,23 +750,24 @@ model Mentions { } model OAuthApp { - id String @id @default(uuid()) - organizationId String? - name String - description String? - pictureId String? - redirectUrl String - redirectUris String? - clientId String @unique - clientSecret String? - dynamic Boolean @default(false) - tokenEndpointAuthMethod String? - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - deletedAt DateTime? - organization Organization? @relation(fields: [organizationId], references: [id]) - picture Media? @relation(fields: [pictureId], references: [id]) - authorizations OAuthAuthorization[] + id String @id @default(uuid()) + organizationId String? + name String + description String? + pictureId String? + redirectUrl String + redirectUris String? + clientId String @unique + clientSecret String? + dynamic Boolean @default(false) + tokenEndpointAuthMethod String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime? + organization Organization? @relation(fields: [organizationId], references: [id]) + picture Media? @relation(fields: [pictureId], references: [id]) + authorizations OAuthAuthorization[] + selfHostedAuthorizations OAuthSelfHostedAuthorization[] @@unique([organizationId, deletedAt]) @@index([clientId]) @@ -801,6 +803,28 @@ model OAuthAuthorization { @@index([revokedAt]) } +model OAuthSelfHostedAuthorization { + id String @id @default(uuid()) + oauthAppId String + mcpUrl String + apiKey String + email String? + accessToken String? + authorizationCode String? + codeExpiresAt DateTime? + codeChallenge String? + codeChallengeMethod String? + redirectUri String? + revokedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + oauthApp OAuthApp @relation(fields: [oauthAppId], references: [id]) + + @@index([accessToken]) + @@index([authorizationCode]) + @@index([oauthAppId]) +} + enum OrderStatus { PENDING ACCEPTED diff --git a/libraries/nestjs-libraries/src/dtos/integrations/customer.name.dto.ts b/libraries/nestjs-libraries/src/dtos/integrations/customer.name.dto.ts new file mode 100644 index 0000000000..036f4127cf --- /dev/null +++ b/libraries/nestjs-libraries/src/dtos/integrations/customer.name.dto.ts @@ -0,0 +1,7 @@ +import { IsString, MinLength } from 'class-validator'; + +export class CustomerNameDto { + @IsString() + @MinLength(1) + name: string; +} diff --git a/libraries/nestjs-libraries/src/dtos/oauth/authorize-oauth.dto.ts b/libraries/nestjs-libraries/src/dtos/oauth/authorize-oauth.dto.ts index 87e3e64584..bb80847c6e 100644 --- a/libraries/nestjs-libraries/src/dtos/oauth/authorize-oauth.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/oauth/authorize-oauth.dto.ts @@ -1,4 +1,11 @@ -import { IsDefined, IsIn, IsOptional, IsString } from 'class-validator'; +import { + IsDefined, + IsEmail, + IsIn, + IsOptional, + IsString, + MaxLength, +} from 'class-validator'; export class AuthorizeOAuthQueryDto { @IsString() @@ -31,6 +38,12 @@ export class AuthorizeOAuthQueryDto { @IsString() @IsOptional() scope?: string; + + // RFC 8707 resource indicator sent by MCP clients, only used to tell if + // the connection can be relayed to a self-hosted instance + @IsString() + @IsOptional() + resource?: string; } export class ApproveOAuthDto { @@ -61,3 +74,49 @@ export class ApproveOAuthDto { @IsOptional() code_challenge_method?: string; } + +export class AuthorizeSelfHostedDto { + @IsString() + @IsDefined() + client_id: string; + + @IsString() + @IsOptional() + state?: string; + + @IsString() + @IsOptional() + redirect_uri?: string; + + @IsString() + @IsOptional() + code_challenge?: string; + + // Not validated with IsIn, same as ApproveOAuthDto + @IsString() + @IsOptional() + code_challenge_method?: string; + + @IsString() + @IsOptional() + resource?: string; + + // The instance as the person knows it: its address, its backend address or + // the MCP URL from Settings > Developers (resolved in McpRelayService) + @IsString() + @IsDefined() + @MaxLength(2048) + instance_url: string; + + // Optional because the MCP URL from Settings > Developers carries the key + @IsString() + @IsOptional() + @MaxLength(512) + api_key?: string; + + // Required (in the controller) for clients that read the email from + // userinfo, like ChatGPT + @IsEmail() + @IsOptional() + email?: string; +} diff --git a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/facebook.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/facebook.dto.ts index f913a95b04..0b9b606822 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/facebook.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/facebook.dto.ts @@ -1,4 +1,5 @@ import { IsIn, IsOptional, IsString, ValidateIf, IsUrl } from 'class-validator'; +import { JSONSchema } from 'class-validator-jsonschema'; // Maximum characters Facebook allows on a background ("text format") post. export const FACEBOOK_PRESET_MAX_CHARS = 130; @@ -108,4 +109,11 @@ export class FacebookDto { @IsOptional() @IsString() text_format_preset_id?: string; + + @IsOptional() + @IsString() + @JSONSchema({ + description: 'Title of the video, used only for video (non-story) posts', + }) + title?: string; } diff --git a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/moltbook.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/moltbook.dto.ts index 2d69779715..47ab88cc82 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/moltbook.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/moltbook.dto.ts @@ -1,8 +1,7 @@ -import { IsDefined, IsString, MinLength } from 'class-validator'; +import { IsOptional, IsString } from 'class-validator'; export class MoltbookDto { - @MinLength(1) - @IsDefined() + @IsOptional() @IsString() - submolt: string; + submolt?: string; } diff --git a/libraries/nestjs-libraries/src/integrations/refresh.integration.service.ts b/libraries/nestjs-libraries/src/integrations/refresh.integration.service.ts index 0689bdc603..bf59c32bb1 100644 --- a/libraries/nestjs-libraries/src/integrations/refresh.integration.service.ts +++ b/libraries/nestjs-libraries/src/integrations/refresh.integration.service.ts @@ -78,6 +78,10 @@ export class RefreshIntegrationService { .catch((err) => false); if (!refresh || !refresh.accessToken) { + // informAboutRefreshError (with the failure cause) already notifies + // the user, and refreshNeeded sets the same flag disconnectChannel + // would — calling disconnectChannel here sent a second, cause-less + // copy of the same email for every failed refresh. await this._integrationService.refreshNeeded( integration.organizationId, integration.id @@ -89,11 +93,6 @@ export class RefreshIntegrationService { cause ); - await this._integrationService.disconnectChannel( - integration.organizationId, - integration - ); - return false; } diff --git a/libraries/nestjs-libraries/src/integrations/social.abstract.ts b/libraries/nestjs-libraries/src/integrations/social.abstract.ts index 93c1ec2ce2..472e342d7d 100644 --- a/libraries/nestjs-libraries/src/integrations/social.abstract.ts +++ b/libraries/nestjs-libraries/src/integrations/social.abstract.ts @@ -5,16 +5,26 @@ import { PendingCheckResponse, } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; import { ApplicationFailure } from '@temporalio/activity'; -import { readOrFetch } from '@gitroom/helpers/utils/read.or.fetch'; import { setHeartbeatDetails } from '@gitroom/nestjs-libraries/temporal/temporal.heartbeat'; import { getSsrfSafeAxios, getSsrfSafeDispatcher, } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher'; import sharp from 'sharp'; -import { createReadStream, statSync } from 'fs'; +import { createReadStream, readFileSync, statSync } from 'fs'; import { Readable } from 'stream'; +// Media reads answer headers in well under a second and the chunk sizes the +// providers ask for finish in under two, with the slowest healthy read we +// measured at about eleven, so two minutes is only ever reached by a stalled +// transfer. +const MEDIA_READ_TIMEOUT = 120_000; + +// AbortSignal.timeout rejects with a TimeoutError, which undici may surface +// directly or wrap as the cause of the fetch rejection. +const isReadTimeout = (err: any) => + err?.name === 'TimeoutError' || err?.cause?.name === 'TimeoutError'; + export const stripQuery = (url: string) => { try { const parsed = new URL(url); @@ -231,11 +241,53 @@ export abstract class SocialAbstract { : path; setHeartbeatDetails(`read media ${stripQuery(url)}`); const { width = 0, height = 0 } = await sharp( - await readOrFetch(url) + await this.readOrFetch(url) ).metadata(); return { width, height }; } + // Reads the whole media into memory: used for images, which the providers + // hand straight to sharp. Lives here rather than in a helper so it can + // classify a stall like the ranged reads below do. + protected async readOrFetch(path: string, retried = false): Promise<Buffer> { + if (path.indexOf('http') !== 0) { + return readFileSync(path); + } + + try { + return ( + // the media path is user-influenced, so it goes through the same + // SSRF-safe client as every other outbound media read + await this.getSsrfSafeAxios()({ + url: path, + method: 'GET', + responseType: 'arraybuffer', + // Same stall as the ranged reads: headers arrive fast and the body + // then stops, and without a deadline the read never settles and + // holds the activity's worker slot. Images are a few MB and arrive + // in about a second. + signal: AbortSignal.timeout(MEDIA_READ_TIMEOUT), + }) + ).data; + } catch (err: any) { + // axios reports an aborted signal as a canceled request + if (err?.code !== 'ERR_CANCELED' && !isReadTimeout(err)) { + throw err; + } + + if (!retried) { + return this.readOrFetch(path, true); + } + + throw new BadBody( + '', + JSON.stringify({ timeoutMs: MEDIA_READ_TIMEOUT, path: stripQuery(path) }), + Buffer.from('{}'), + 'We could not read the media for this post, so it was not published' + ); + } + } + // Resolves the total byte size of the media without loading it into memory: // a HEAD request for remote URLs, statSync for local files. protected async mediaSize(path: string, identifier = ''): Promise<number> { @@ -274,31 +326,62 @@ export abstract class SocialAbstract { path: string, start: number, end: number, - identifier = '' + identifier = '', + retried = false ): Promise<Buffer> { if (path.indexOf('http') === 0) { setHeartbeatDetails( `media chunk ${start}-${end} ${stripQuery(path)}` ); - const response = await fetch(path, { - headers: { - Range: `bytes=${start}-${end}`, - 'accept-encoding': 'identity', - }, - dispatcher: getSsrfSafeDispatcher(), - } as any); - // Anything but 206 means the server ignored the Range header: buffering - // response.body here would silently load the whole file into memory and - // upload corrupted chunks. - if (response.status !== 206) { + try { + const response = await fetch(path, { + headers: { + Range: `bytes=${start}-${end}`, + 'accept-encoding': 'identity', + }, + dispatcher: getSsrfSafeDispatcher(), + // The store answers the headers in well under a second and then + // stops mid-body. Without a deadline that read never settles, and + // the activity keeps its worker slot until the process restarts: a + // startToCloseTimeout fails the activity on the server but does not + // stop the function, which nothing here subscribes to cancellation + // to notice. Healthy reads of these chunk sizes finish in under 2s. + signal: AbortSignal.timeout(MEDIA_READ_TIMEOUT), + } as any); + // Anything but 206 means the server ignored the Range header: buffering + // response.body here would silently load the whole file into memory and + // upload corrupted chunks. + if (response.status !== 206) { + throw new BadBody( + identifier, + '{}', + Buffer.from('{}'), + `Media server did not honor the range request (status ${response.status})` + ); + } + return Buffer.from(await response.arrayBuffer()); + } catch (err) { + if (!isReadTimeout(err)) { + throw err; + } + + // A stall is transient and nothing has been sent to the platform yet, + // so read the same range once more before giving up. + if (!retried) { + return this.mediaChunk(path, start, end, identifier, true); + } + + // BadBody rather than a retryable error: the read already retried + // itself, and repeating the publish would re-read the same media and + // re-upload everything already sent while holding the provider's + // queue slot. The message is what the user is shown. throw new BadBody( identifier, - '{}', + JSON.stringify({ timeoutMs: MEDIA_READ_TIMEOUT, start, end }), Buffer.from('{}'), - `Media server did not honor the range request (status ${response.status})` + 'We could not read the media for this post, so it was not published' ); } - return Buffer.from(await response.arrayBuffer()); } return new Promise((resolve, reject) => { diff --git a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts index c52c10b6e6..085ca9fc7b 100644 --- a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts @@ -26,7 +26,7 @@ import { Rules } from '@gitroom/nestjs-libraries/chat/rules.description.decorato export const META_GRAPH_API_VERSION = 'v25.0'; @Rules( - "Facebook posts can be text only, or include photos or a video. If it's a story, it must have at least one attachment (photo or video), and each media is published as a separate story." + "Facebook posts can be text only, or include photos or a video. If it's a story, it must have at least one attachment (photo or video), and each media is published as a separate story. Video posts (not stories) can carry an optional title." ) export class FacebookProvider extends SocialAbstract implements SocialProvider { identifier = 'facebook'; @@ -112,9 +112,11 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { }; } + // code 368 "Temporarily blocked for policies violations" (subcode + // 1390008): Meta documents it as temporary, "wait and retry the operation" if (body.indexOf('1390008') > -1) { return { - type: 'bad-body' as const, + type: 'retry' as const, value: 'You are posting too fast, please slow down', }; } @@ -845,6 +847,9 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { body: JSON.stringify({ file_url: firstPost?.media?.[0]?.path!, description: firstPost.message, + ...(firstPost?.settings?.title + ? { title: firstPost.settings.title } + : {}), published: true, }), }, diff --git a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts index 83e7bb532b..dbfea721e6 100644 --- a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts @@ -728,6 +728,10 @@ export class InstagramProvider ? firstPost?.media?.length === 1 ? isStory ? `video_url=${m.path}&media_type=STORIES` + : m?.thumbnail + ? `video_url=${m.path}&media_type=REELS&cover_url=${encodeURIComponent( + m.thumbnail + )}` : `video_url=${m.path}&media_type=REELS&thumb_offset=${ m?.thumbnailTimestamp || 0 }` diff --git a/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts b/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts index 0ec0b376a3..daaca54f81 100644 --- a/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts @@ -9,7 +9,6 @@ import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import { makeSecureId } from '@gitroom/nestjs-libraries/services/make.secure.id'; import sharp from 'sharp'; import { lookup } from 'mime-types'; -import { readOrFetch } from '@gitroom/helpers/utils/read.or.fetch'; import { hasExtension } from '@gitroom/helpers/utils/has.extension'; import { timer } from '@gitroom/helpers/utils/timer'; import { @@ -539,7 +538,7 @@ export class LinkedinProvider extends SocialAbstract implements SocialProvider { // Fetch all images and get their dimensions const images = await Promise.all( firstPost.media.map(async (media) => { - const raw = await readOrFetch(media.path); + const raw = await this.readOrFetch(media.path); const image = sharp(raw, { animated: false }).toFormat('jpeg'); const { width, height } = await image.metadata(); const buffer = await image.toBuffer(); @@ -662,7 +661,7 @@ export class LinkedinProvider extends SocialAbstract implements SocialProvider { if (isGif) { // Buffer.from keeps the return type a real Buffer regardless of what // readOrFetch yields - uploadPicture branches on Buffer.isBuffer. - return Buffer.from(await readOrFetch(mediaUrl)); + return Buffer.from(await this.readOrFetch(mediaUrl)); } const mime = lookup(mediaUrl); @@ -677,7 +676,7 @@ export class LinkedinProvider extends SocialAbstract implements SocialProvider { // DISABLE_IMAGE_COMPRESSION=true, where the frontend no longer shrinks // uploads and full-size images reach LinkedIn directly. Do not remove it on // the assumption that the frontend compression already caps dimensions. - const pipeline = sharp(await readOrFetch(mediaUrl), { animated: false }).resize({ + const pipeline = sharp(await this.readOrFetch(mediaUrl), { animated: false }).resize({ width: 6000, height: 6000, fit: 'inside', diff --git a/libraries/nestjs-libraries/src/integrations/social/moltbook.provider.ts b/libraries/nestjs-libraries/src/integrations/social/moltbook.provider.ts index b4c145ba6d..284d43ae15 100644 --- a/libraries/nestjs-libraries/src/integrations/social/moltbook.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/moltbook.provider.ts @@ -6,6 +6,7 @@ import { } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; import { makeSecureId } from '@gitroom/nestjs-libraries/services/make.secure.id'; import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; +import { MoltbookDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/moltbook.dto'; import dayjs from 'dayjs'; import { Integration } from '@prisma/client'; @@ -15,6 +16,7 @@ export class MoltbookProvider extends SocialAbstract implements SocialProvider { override maxConcurrentJob = 100; // Moltbook: 100 requests/minute identifier = 'moltbook'; name = 'Moltbook'; + dto = MoltbookDto; isBetweenSteps = false; scopes = [] as string[]; isWeb3 = true; diff --git a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts index 40251c71d2..2c52e1b827 100644 --- a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts @@ -144,6 +144,13 @@ export class PinterestProvider value: 'The specified board was not found. Please check the board ID.', }; } + if (body.indexOf('You are not permitted to access that resource') > -1) { + return { + type: 'bad-body' as const, + value: + 'The connected Pinterest account is not permitted to post to this board. Please check the board ID and that the account owns or can write to the board.', + }; + } if (body.indexOf('cover_image_url or cover_image_content_type') > -1) { return { type: 'bad-body' as const, diff --git a/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts b/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts index a8a29c6004..5b6a7a94a8 100644 --- a/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts +++ b/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts @@ -34,6 +34,11 @@ export interface IAuthenticator { postId: string, fromDate: number, ): Promise<AnalyticsData[]>; + resolveReleaseId?( + accessToken: string, + releaseId: string, + integration: Integration + ): Promise<{ postId: string; releaseURL: string } | undefined>; // Final id + URL to persist when the stored releaseId is still a publish id, undefined when nothing to resolve (yet) changeNickname?( id: string, accessToken: string, diff --git a/libraries/nestjs-libraries/src/integrations/social/telegram.provider.ts b/libraries/nestjs-libraries/src/integrations/social/telegram.provider.ts index 8aa0002002..fa5947cf0a 100644 --- a/libraries/nestjs-libraries/src/integrations/social/telegram.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/telegram.provider.ts @@ -217,7 +217,6 @@ export class TelegramProvider extends SocialAbstract implements SocialProvider { .replace(/<\/strong>/g, '</b>') .replace(/<p>(.*?)<\/p>/g, '$1\n'); - console.log(text); const processedMedia = this.processMedia(mediaFiles); // if there's no media, bot sends a text message only diff --git a/libraries/nestjs-libraries/src/integrations/social/tiktok.business.provider.ts b/libraries/nestjs-libraries/src/integrations/social/tiktok.business.provider.ts index 3fdaeb3f7c..f3c78fcedb 100644 --- a/libraries/nestjs-libraries/src/integrations/social/tiktok.business.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/tiktok.business.provider.ts @@ -425,9 +425,10 @@ export class TiktokBusinessProvider pendingData: { publishId: string }, integration: Integration ): Promise<PendingCheckResponse> { + let body: string; let post: any; try { - post = await ( + body = await ( await this.fetch( `${this.baseUrl}/business/publish/status/?business_id=${encodeURIComponent( integration.internalId @@ -442,7 +443,8 @@ export class TiktokBusinessProvider 0, true ) - ).json(); + ).text(); + post = JSON.parse(body); } catch (err) { if (err instanceof RefreshToken || err instanceof Disconnect) { throw err; @@ -469,7 +471,7 @@ export class TiktokBusinessProvider return { status: 'pending', pendingData }; } - const { status, post_ids, reason } = post?.data || {}; + const { status, reason } = post?.data || {}; if (status === 'SEND_TO_USER_INBOX') { return { @@ -482,15 +484,15 @@ export class TiktokBusinessProvider if (status === 'PUBLISH_COMPLETE') { // post_ids can lag up to 3 minutes behind PUBLISH_COMPLETE, and never // shows up at all for non-public posts - fall back to the profile URL - // and keep the share_id (postAnalytics resolves it later). - const publicPostId = post_ids?.[0]; + // and keep the share_id (resolveReleaseId fixes it later). + const publicPostId = this.publicPostId(body); return { status: 'completed', releaseURL: !publicPostId ? `https://www.tiktok.com/@${integration.profile}` : `https://www.tiktok.com/@${integration.profile}/video/${publicPostId}`, - postId: !publicPostId ? pendingData.publishId : String(publicPostId), + postId: !publicPostId ? pendingData.publishId : publicPostId, }; } @@ -929,6 +931,12 @@ export class TiktokBusinessProvider return videoListData?.data?.videos; } + // post_ids holds int64 ids that exceed Number.MAX_SAFE_INTEGER, so the id + // must be read from the raw body instead of the parsed JSON + private publicPostId(body: string) { + return body.match(/"post_ids"\s*:\s*\[\s*"?(\d+)"?/)?.[1]; + } + private throwIfTokenError(body: { code?: number }) { if (body?.code === 0) { return; @@ -1099,6 +1107,44 @@ export class TiktokBusinessProvider } } + // Posts saved before post_ids became available keep their share_id + // (v_pub_... / p_pub_...) as releaseId - resolve it to the public post id + async resolveReleaseId( + accessToken: string, + releaseId: string, + integration: Integration + ) { + if (releaseId.indexOf('_pub_') === -1) { + return undefined; + } + + const body = await ( + await this.fetch( + `${this.baseUrl}/business/publish/status/?business_id=${encodeURIComponent( + integration.internalId + )}&publish_id=${encodeURIComponent(releaseId)}`, + { + method: 'GET', + headers: { + 'Access-Token': accessToken, + }, + } + ) + ).text(); + + this.throwIfTokenError(JSON.parse(body)); + + const publicPostId = this.publicPostId(body); + if (!publicPostId) { + return undefined; + } + + return { + postId: publicPostId, + releaseURL: `https://www.tiktok.com/@${integration.profile}/video/${publicPostId}`, + }; + } + async postAnalytics( integrationId: string, accessToken: string, @@ -1107,33 +1153,6 @@ export class TiktokBusinessProvider ): Promise<AnalyticsData[]> { const today = dayjs().format('YYYY-MM-DD'); - // Posts saved before post_ids became available keep their share_id - // (v_pub_url~... / p_pub_url~...) as releaseId - resolve it to the public - // post id first. - if (postId.indexOf('_pub_url') > -1) { - const post = await ( - await this.fetch( - `${this.baseUrl}/business/publish/status/?business_id=${encodeURIComponent( - integrationId - )}&publish_id=${encodeURIComponent(postId)}`, - { - method: 'GET', - headers: { - 'Access-Token': accessToken, - }, - } - ) - ).json(); - - this.throwIfTokenError(post); - - if (!post?.data?.post_ids?.[0]) { - return []; - } - - postId = String(post.data.post_ids[0]); - } - try { const videoQueryData = await ( await this.fetch( diff --git a/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts index 63612dd2c3..7f2e453c57 100644 --- a/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts @@ -448,8 +448,9 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { integration: Integration ): Promise<PendingCheckResponse> { let post: any; + let publicPostId: string | undefined; try { - post = await ( + const raw = await ( await this.fetch( 'https://open.tiktokapis.com/v2/post/publish/status/fetch/', { @@ -466,7 +467,8 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { 0, true ) - ).json(); + ).text(); + ({ post, publicPostId } = this.parsePublishStatus(raw)); } catch (err) { if (err instanceof RefreshToken || err instanceof Disconnect) { throw err; @@ -478,7 +480,7 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { return { status: 'pending', pendingData }; } - const { status, publicaly_available_post_id } = post?.data || {}; + const { status } = post?.data || {}; if (status === 'SEND_TO_USER_INBOX') { return { @@ -489,16 +491,14 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { } if (status === 'PUBLISH_COMPLETE') { - // an empty array is truthy, so index it once and branch on the value - const publicPostId = publicaly_available_post_id?.[0]; - + // the id only shows up once moderation approves the post - fall back to + // the profile URL and keep the publish_id (resolveReleaseId fixes it later) return { status: 'completed', releaseURL: !publicPostId ? `https://www.tiktok.com/@${integration.profile}` : `https://www.tiktok.com/@${integration.profile}/video/${publicPostId}`, - // TikTok returns the id as a number, releaseId in the db is a string - postId: !publicPostId ? pendingData.publishId : String(publicPostId), + postId: !publicPostId ? pendingData.publishId : publicPostId, }; } @@ -515,6 +515,15 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { return { status: 'pending', pendingData }; } + // TikTok returns publicaly_available_post_id as an int64, which JSON.parse + // rounds past 2^53 - pull the digits out of the raw body before parsing. + private parsePublishStatus(raw: string) { + const [, publicPostId] = + raw.match(/"publicaly_available_post_id"\s*:\s*\[\s*"?(\d+)/) || []; + + return { post: JSON.parse(raw), publicPostId }; + } + // UPLOAD does not publish - it only drops the media into the user's TikTok // inbox - so only an explicit UPLOAD selects it. A missing value (drafts, or // any caller that skipped the setting) publishes instead of silently landing @@ -583,6 +592,12 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { auto_add_music: firstPost.settings.autoAddMusic === 'yes', } : {}), + ...(!isPhoto && firstPost?.media?.[0]?.thumbnailTimestamp != null + ? { + video_cover_timestamp_ms: + firstPost?.media?.[0]?.thumbnailTimestamp, + } + : {}), }, }; } @@ -1127,17 +1142,20 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { } } - async postAnalytics( - integrationId: string, + // Posts published before moderation finished keep their publish_id + // (v_pub_file~... / p_pub_url~...) as releaseId - resolve it to the post id + async resolveReleaseId( accessToken: string, - postId: string, - fromDate: number - ): Promise<AnalyticsData[]> { - const today = dayjs().format('YYYY-MM-DD'); + releaseId: string, + integration: Integration + ) { + if (releaseId.indexOf('_pub_') === -1) { + return undefined; + } - if (postId.indexOf('v_pub_url') > -1) { - const post = await ( - await fetch( + const { publicPostId } = this.parsePublishStatus( + await ( + await this.fetch( 'https://open.tiktokapis.com/v2/post/publish/status/fetch/', { method: 'POST', @@ -1146,19 +1164,31 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { Authorization: `Bearer ${accessToken}`, }, body: JSON.stringify({ - publish_id: postId, + publish_id: releaseId, }), } ) - ).json(); - - if (!post?.data?.publicaly_available_post_id?.[0]) { - return []; - } + ).text() + ); - postId = post.data.publicaly_available_post_id[0]; + if (!publicPostId) { + return undefined; } + return { + postId: publicPostId, + releaseURL: `https://www.tiktok.com/@${integration.profile}/video/${publicPostId}`, + }; + } + + async postAnalytics( + integrationId: string, + accessToken: string, + postId: string, + fromDate: number + ): Promise<AnalyticsData[]> { + const today = dayjs().format('YYYY-MM-DD'); + try { // Query video details using the video ID const response = await fetch( diff --git a/libraries/nestjs-libraries/src/integrations/social/wordpress.provider.ts b/libraries/nestjs-libraries/src/integrations/social/wordpress.provider.ts index 2f9b597847..8777a7c4b2 100644 --- a/libraries/nestjs-libraries/src/integrations/social/wordpress.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/wordpress.provider.ts @@ -15,6 +15,8 @@ import { Tool } from '@gitroom/nestjs-libraries/integrations/tool.decorator'; import { getSsrfSafeDispatcher } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher'; import { string } from 'yup'; +const WORDPRESS_USER_AGENT = 'Postiz/1.0 (+https://postiz.com)'; + export class WordpressProvider extends SocialAbstract implements SocialProvider @@ -114,6 +116,7 @@ export class WordpressProvider response = await fetch(`${domain}/wp-json/wp/v2/users/me`, { headers: { Authorization: `Basic ${auth}`, + 'User-Agent': WORDPRESS_USER_AGENT, }, // @ts-ignore - undici-only option; blocks SSRF to internal IPs dispatcher: getSsrfSafeDispatcher(), @@ -212,6 +215,7 @@ export class WordpressProvider const response = await fetch(`${body.domain}${path}`, { headers: { Authorization: `Basic ${auth}`, + 'User-Agent': WORDPRESS_USER_AGENT, }, // @ts-ignore - undici-only option; blocks SSRF to internal IPs dispatcher: getSsrfSafeDispatcher(), @@ -312,6 +316,7 @@ export class WordpressProvider .split('/') .pop()}"`, 'Content-Type': blob.type, + 'User-Agent': WORDPRESS_USER_AGENT, }, body: blob, }) @@ -334,6 +339,7 @@ export class WordpressProvider headers: { Authorization: `Basic ${auth}`, 'Content-Type': 'application/json', + 'User-Agent': WORDPRESS_USER_AGENT, }, method: 'POST', body: JSON.stringify({ diff --git a/libraries/nestjs-libraries/src/integrations/social/x.provider.ts b/libraries/nestjs-libraries/src/integrations/social/x.provider.ts index 969f70d23c..782e8d8729 100644 --- a/libraries/nestjs-libraries/src/integrations/social/x.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/x.provider.ts @@ -11,7 +11,6 @@ import { } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; import { lookup } from 'mime-types'; import sharp from 'sharp'; -import { readOrFetch } from '@gitroom/helpers/utils/read.or.fetch'; import { setHeartbeatDetails } from '@gitroom/nestjs-libraries/temporal/temporal.heartbeat'; import { BadBody, @@ -734,7 +733,7 @@ export class XProvider extends SocialAbstract implements SocialProvider { mediaId: await this.uploadWithRateLimitRetry(async () => asArticleImage ? client.v2.uploadMedia( - await sharp(await readOrFetch(m.path)) + await sharp(await this.readOrFetch(m.path)) .resize({ width: 1000, }) @@ -746,7 +745,7 @@ export class XProvider extends SocialAbstract implements SocialProvider { } ) : client.v2.uploadMedia( - await sharp(await readOrFetch(m.path), { + await sharp(await this.readOrFetch(m.path), { animated: lookup(m.path) === 'image/gif', }) .resize({ diff --git a/libraries/nestjs-libraries/src/user/oauth.user.id.from.request.ts b/libraries/nestjs-libraries/src/user/oauth.user.id.from.request.ts new file mode 100644 index 0000000000..5f578c4a90 --- /dev/null +++ b/libraries/nestjs-libraries/src/user/oauth.user.id.from.request.ts @@ -0,0 +1,8 @@ +import { createParamDecorator, ExecutionContext } from '@nestjs/common'; + +export const GetOAuthUserIdFromRequest = createParamDecorator( + (data: unknown, ctx: ExecutionContext) => { + const request = ctx.switchToHttp().getRequest(); + return request.oauthUserId as string | undefined; + } +); diff --git a/libraries/react-shared-libraries/src/helpers/uppy.upload.ts b/libraries/react-shared-libraries/src/helpers/uppy.upload.ts index acece4e7d7..07dd087894 100644 --- a/libraries/react-shared-libraries/src/helpers/uppy.upload.ts +++ b/libraries/react-shared-libraries/src/helpers/uppy.upload.ts @@ -119,6 +119,11 @@ const fetchUploadApiEndpoint = async ( 'Content-Type': 'application/json', }, }); + // customFetch does not throw on HTTP errors, and Uppy treats whatever this + // returns as a successful step + if (!res.ok) { + throw new Error(await res.text().catch(() => '')); + } return res.json(); }; diff --git a/libraries/react-shared-libraries/src/sentry/initialize.sentry.next.basic.ts b/libraries/react-shared-libraries/src/sentry/initialize.sentry.next.basic.ts index e2f6376d37..434aa72587 100644 --- a/libraries/react-shared-libraries/src/sentry/initialize.sentry.next.basic.ts +++ b/libraries/react-shared-libraries/src/sentry/initialize.sentry.next.basic.ts @@ -21,6 +21,7 @@ export const initializeSentryBasic = ( /^Failed to connect to MetaMask$/i, /^MetaMask extension not found$/i, /^undefined is not an object \(evaluating '\w+\.progress'\)$/i, + /^Cannot read properties of undefined \(reading 'progress'\)$/i, ]; // Browser wallet extensions (Phantom, MetaMask, etc.) reject with a plain diff --git a/libraries/react-shared-libraries/src/translation/locales/ar/translation.json b/libraries/react-shared-libraries/src/translation/locales/ar/translation.json index 34a1030e1f..b8a6dd6e2c 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ar/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ar/translation.json @@ -642,6 +642,10 @@ "channel_id_copied": "تم نسخ معرف القناة إلى الحافظة", "settings_updated": "تم تحديث الإعدادات", "customer_updated": "تم تحديث العميل", + "edit_group_name": "تعديل اسم المجموعة", + "group_name": "الاسم", + "group_updated": "تم تحديث المجموعة", + "could_not_save_group": "تعذّر حفظ المجموعة.", "custom_url": "رابط مخصص", "picture": "صورة", "upgrade_required": "تحتاج إلى الترقية لاستخدام هذه الميزة", @@ -682,6 +686,7 @@ "repeat_post_every_label": "تكرار النشر كل", "add_new_tag": "إضافة وسم جديد", "tag_name": "الاسم", + "post_save_failed": "تعذّر حفظ المنشور", "post_is_too_long": "المنشور طويل جدًا، يرجى تعديله", "your_post_should_have_at_least_one_character_or_one_image": "يجب أن يحتوي منشورك على حرف واحد على الأقل أو صورة واحدة.", "internal_edit": "تعديل داخلي", @@ -721,6 +726,8 @@ "chat_onboarding_description": "لا حاجة لإعدادات MCP أو CLI. الصق هذا في الدردشة، سيقوم الوكيل بتثبيت Postiz CLI ويطلب منك مفتاح API الخاص بك.", "connector": "موصل", "connector_onboarding_description": "الأسرع: أضف Postiz بنقرة واحدة، سيطلب منك تسجيل الدخول", + "official_connector": "الموصل الرسمي", + "connector_self_hosted_description": "يعمل الموصل الرسمي أيضًا مع Postiz المستضاف ذاتيًا. عند طلب تسجيل الدخول، اختر \"Use self-hosted\" وأدخل {{url}} مع مفتاح API الخاص بك.", "mcp_onboarding_description": "زود وكيلك بأدوات Postiz لإنشاء وجدولة وإدارة المنشورات", "cli_onboarding_description": "ثبّت Postiz CLI والمهارة التي تعلم وكيلك كيفية استخدامها", "agent_settings_later": "المزيد من الوكلاء والتعليمات الكاملة متوفرة في الإعدادات > المطورون", @@ -785,5 +792,6 @@ "preview_comment_failed": "تعذر نشر التعليق", "preview_comment_detach_hint": "التعليقات على النص المحدد تفقد تمييزها إذا تم تعديل النص لاحقًا.", "preview_comment_text_changed": "تم تغيير النص", - "preview_no_comments_yet": "لا توجد تعليقات بعد. حدد بعض النص في المنشور للتعليق عليه، أو أضف تعليقًا عامًا." + "preview_no_comments_yet": "لا توجد تعليقات بعد. حدد بعض النص في المنشور للتعليق عليه، أو أضف تعليقًا عامًا.", + "some_files_failed_to_upload": "فشل تحميل بعض الملفات، يرجى المحاولة مرة أخرى" } diff --git a/libraries/react-shared-libraries/src/translation/locales/bn/translation.json b/libraries/react-shared-libraries/src/translation/locales/bn/translation.json index d52209baa8..4f65a827ae 100644 --- a/libraries/react-shared-libraries/src/translation/locales/bn/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/bn/translation.json @@ -642,6 +642,10 @@ "channel_id_copied": "চ্যানেল আইডি ক্লিপবোর্ডে কপি হয়েছে", "settings_updated": "সেটিংস আপডেট হয়েছে", "customer_updated": "গ্রাহক আপডেট হয়েছে", + "edit_group_name": "গ্রুপের নাম সম্পাদনা করুন", + "group_name": "নাম", + "group_updated": "গ্রুপ আপডেট হয়েছে", + "could_not_save_group": "গ্রুপ সংরক্ষণ করা যায়নি।", "custom_url": "কাস্টম URL", "picture": "ছবি", "upgrade_required": "এই ফিচারটি ব্যবহার করতে আপনাকে আপগ্রেড করতে হবে", @@ -682,6 +686,7 @@ "repeat_post_every_label": "প্রতি কতদিন পর পোস্ট পুনরাবৃত্তি হবে", "add_new_tag": "নতুন ট্যাগ যোগ করুন", "tag_name": "নাম", + "post_save_failed": "পোস্ট সংরক্ষণ করা যায়নি", "post_is_too_long": "পোস্টটি খুব বড়, অনুগ্রহ করে ঠিক করুন", "your_post_should_have_at_least_one_character_or_one_image": "আপনার পোস্টে অন্তত একটি অক্ষর বা একটি ছবি থাকতে হবে।", "internal_edit": "অভ্যন্তরীণ সম্পাদনা", @@ -721,6 +726,8 @@ "chat_onboarding_description": "MCP বা CLI সেটিংসের প্রয়োজন নেই। এটি চ্যাটে পেস্ট করুন, এজেন্টটি Postiz CLI ইনস্টল করবে এবং আপনার API কী চাইবে।", "connector": "কনেক্টর", "connector_onboarding_description": "সবচেয়ে দ্রুত উপায়: এক ক্লিকে Postiz যোগ করুন, আপনাকে সাইন ইন করতে বলা হবে", + "official_connector": "অফিসিয়াল কানেক্টর", + "connector_self_hosted_description": "অফিসিয়াল কানেক্টর সেলফ-হোস্টেড Postiz-এর সাথেও কাজ করে। সাইন ইন করতে বলা হলে, \"Use self-hosted\" বেছে নিন এবং আপনার API কী সহ {{url}} লিখুন।", "mcp_onboarding_description": "আপনার এজেন্টকে Postiz টুল দিন যাতে সে পোস্ট তৈরি, নির্ধারণ এবং পরিচালনা করতে পারে", "cli_onboarding_description": "Postiz CLI এবং সেই স্কিল ইনস্টল করুন যা আপনার এজেন্টকে এটি ব্যবহার করতে শেখায়", "agent_settings_later": "আরও এজেন্ট এবং সম্পূর্ণ নির্দেশিকা সেটিংস > ডেভেলপারস-এ পাওয়া যাবে", @@ -785,5 +792,6 @@ "preview_comment_failed": "মন্তব্যটি পোস্ট করা যায়নি", "preview_comment_detach_hint": "নির্বাচিত টেক্সটে মন্তব্য করলে, টেক্সট সম্পাদনার পর হাইলাইট হারিয়ে যেতে পারে।", "preview_comment_text_changed": "টেক্সট পরিবর্তিত হয়েছে", - "preview_no_comments_yet": "এখনও কোনো মন্তব্য নেই। পোস্টে কিছু টেক্সট নির্বাচন করে অথবা সাধারণ মন্তব্য যোগ করে মন্তব্য করুন।" + "preview_no_comments_yet": "এখনও কোনো মন্তব্য নেই। পোস্টে কিছু টেক্সট নির্বাচন করে অথবা সাধারণ মন্তব্য যোগ করে মন্তব্য করুন।", + "some_files_failed_to_upload": "কিছু ফাইল আপলোড করতে ব্যর্থ হয়েছে, অনুগ্রহ করে আবার চেষ্টা করুন" } diff --git a/libraries/react-shared-libraries/src/translation/locales/de/translation.json b/libraries/react-shared-libraries/src/translation/locales/de/translation.json index c9de6e6b41..37a07c121e 100644 --- a/libraries/react-shared-libraries/src/translation/locales/de/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/de/translation.json @@ -642,6 +642,10 @@ "channel_id_copied": "Kanal-ID in die Zwischenablage kopiert", "settings_updated": "Einstellungen aktualisiert", "customer_updated": "Kunde aktualisiert", + "edit_group_name": "Gruppennamen bearbeiten", + "group_name": "Name", + "group_updated": "Gruppe aktualisiert", + "could_not_save_group": "Die Gruppe konnte nicht gespeichert werden.", "custom_url": "Benutzerdefinierte URL", "picture": "Bild", "upgrade_required": "Sie müssen ein Upgrade durchführen, um diese Funktion zu nutzen", @@ -682,6 +686,7 @@ "repeat_post_every_label": "Beitrag wiederholen alle", "add_new_tag": "Neues Schlagwort hinzufügen", "tag_name": "Name", + "post_save_failed": "Der Beitrag konnte nicht gespeichert werden", "post_is_too_long": "Beitrag ist zu lang, bitte korrigieren", "your_post_should_have_at_least_one_character_or_one_image": "Dein Beitrag sollte mindestens ein Zeichen oder ein Bild enthalten.", "internal_edit": "Interne Bearbeitung", @@ -721,6 +726,8 @@ "chat_onboarding_description": "Kein MCP oder CLI Setup nötig. Füge das in den Chat ein und der Agent installiert das Postiz CLI und fragt dich nach deinem API-Schlüssel.", "connector": "Konnektor", "connector_onboarding_description": "Am schnellsten: Füge Postiz mit einem Klick hinzu, du wirst zur Anmeldung aufgefordert.", + "official_connector": "Offizieller Connector", + "connector_self_hosted_description": "Der offizielle Connector funktioniert auch mit selbst gehostetem Postiz. Wenn du dich anmelden sollst, wähle \"Use self-hosted\" und gib {{url}} zusammen mit deinem API-Schlüssel ein.", "mcp_onboarding_description": "Gib deinem Agenten Postiz-Tools, um Beiträge zu erstellen, zu planen und zu verwalten.", "cli_onboarding_description": "Installiere das Postiz CLI und das Skill, das deinem Agenten beibringt, wie es zu nutzen ist.", "agent_settings_later": "Weitere Agenten und vollständige Anweisungen findest du unter Einstellungen > Entwickler.", @@ -785,5 +792,6 @@ "preview_comment_failed": "Kommentar konnte nicht veröffentlicht werden", "preview_comment_detach_hint": "Kommentare zu ausgewähltem Text verlieren ihre Markierung, wenn der Text später bearbeitet wird.", "preview_comment_text_changed": "Text geändert", - "preview_no_comments_yet": "Noch keine Kommentare. Wählen Sie einen Text im Beitrag aus, um ihn zu kommentieren, oder fügen Sie einen allgemeinen Kommentar hinzu." + "preview_no_comments_yet": "Noch keine Kommentare. Wählen Sie einen Text im Beitrag aus, um ihn zu kommentieren, oder fügen Sie einen allgemeinen Kommentar hinzu.", + "some_files_failed_to_upload": "Einige Dateien konnten nicht hochgeladen werden. Bitte versuchen Sie es erneut." } diff --git a/libraries/react-shared-libraries/src/translation/locales/en/translation.json b/libraries/react-shared-libraries/src/translation/locales/en/translation.json index 290bc15df7..8c860883bf 100644 --- a/libraries/react-shared-libraries/src/translation/locales/en/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/en/translation.json @@ -644,6 +644,10 @@ "channel_id_copied": "Channel ID copied to clipboard", "settings_updated": "Settings Updated", "customer_updated": "Customer Updated", + "edit_group_name": "Edit group name", + "group_name": "Name", + "group_updated": "Group Updated", + "could_not_save_group": "Could not save the group.", "custom_url": "Custom URL", "picture": "Picture", "upgrade_required": "You need to upgrade to use this feature", @@ -684,6 +688,7 @@ "repeat_post_every_label": "Repeat Post Every", "add_new_tag": "Add New Tag", "tag_name": "Name", + "post_save_failed": "Could not save the post", "post_is_too_long": "post is too long, please fix it", "your_post_should_have_at_least_one_character_or_one_image": "Your post should have at least one character or one image.", "internal_edit": "Internal Edit", @@ -723,6 +728,8 @@ "chat_onboarding_description": "No MCP or CLI settings needed. Paste this into the chat, the agent installs the Postiz CLI and asks you for your API key.", "connector": "Connector", "connector_onboarding_description": "The fastest way: add Postiz with one click, you will be asked to sign in", + "official_connector": "Official connector", + "connector_self_hosted_description": "The official connector works with self-hosted Postiz too. When asked to sign in, choose \"Use self-hosted\" and enter {{url}} with your API key.", "mcp_onboarding_description": "Give your agent Postiz tools to create, schedule and manage posts", "cli_onboarding_description": "Install the Postiz CLI and the skill that teaches your agent how to use it", "agent_settings_later": "More agents and full instructions are available under Settings > Developers", @@ -787,5 +794,6 @@ "preview_comment_failed": "Could not post the comment", "preview_comment_detach_hint": "Comments on selected text lose their highlight if the text is edited later.", "preview_comment_text_changed": "Text changed", - "preview_no_comments_yet": "No comments yet. Select some text in the post to comment on it, or add a general comment." + "preview_no_comments_yet": "No comments yet. Select some text in the post to comment on it, or add a general comment.", + "some_files_failed_to_upload": "Some files failed to upload, please try again" } diff --git a/libraries/react-shared-libraries/src/translation/locales/es/translation.json b/libraries/react-shared-libraries/src/translation/locales/es/translation.json index 8645878588..21f23c8148 100644 --- a/libraries/react-shared-libraries/src/translation/locales/es/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/es/translation.json @@ -642,6 +642,10 @@ "channel_id_copied": "ID del canal copiado al portapapeles", "settings_updated": "Configuración actualizada", "customer_updated": "Cliente actualizado", + "edit_group_name": "Editar nombre del grupo", + "group_name": "Nombre", + "group_updated": "Grupo actualizado", + "could_not_save_group": "No se pudo guardar el grupo.", "custom_url": "URL personalizada", "picture": "Imagen", "upgrade_required": "Necesitas actualizar para usar esta función", @@ -682,6 +686,7 @@ "repeat_post_every_label": "Repetir publicación cada", "add_new_tag": "Agregar nueva etiqueta", "tag_name": "Nombre", + "post_save_failed": "No se pudo guardar la publicación", "post_is_too_long": "la publicación es demasiado larga, por favor arréglala", "your_post_should_have_at_least_one_character_or_one_image": "Tu publicación debe tener al menos un carácter o una imagen.", "internal_edit": "Edición interna", @@ -721,6 +726,8 @@ "chat_onboarding_description": "No necesitas configuraciones de MCP ni de CLI. Pega esto en el chat, el agente instalará el CLI de Postiz y te pedirá tu clave API.", "connector": "Conector", "connector_onboarding_description": "La forma más rápida: agrega Postiz con un clic, se te pedirá iniciar sesión", + "official_connector": "Conector oficial", + "connector_self_hosted_description": "El conector oficial también funciona con Postiz autoalojado. Cuando te pida iniciar sesión, elige \"Use self-hosted\" e introduce {{url}} con tu clave de API.", "mcp_onboarding_description": "Dale a tu agente las herramientas de Postiz para crear, programar y gestionar publicaciones", "cli_onboarding_description": "Instala el CLI de Postiz y la habilidad que enseña a tu agente cómo utilizarlo", "agent_settings_later": "Más agentes y las instrucciones completas están disponibles en Configuración > Desarrolladores", @@ -785,5 +792,6 @@ "preview_comment_failed": "No se pudo publicar el comentario", "preview_comment_detach_hint": "Los comentarios sobre texto seleccionado pierden su resalte si el texto se edita más tarde.", "preview_comment_text_changed": "Texto modificado", - "preview_no_comments_yet": "Aún no hay comentarios. Selecciona texto en la publicación para comentarlo o agrega un comentario general." + "preview_no_comments_yet": "Aún no hay comentarios. Selecciona texto en la publicación para comentarlo o agrega un comentario general.", + "some_files_failed_to_upload": "Algunos archivos no se pudieron subir, por favor inténtalo de nuevo" } diff --git a/libraries/react-shared-libraries/src/translation/locales/fr/translation.json b/libraries/react-shared-libraries/src/translation/locales/fr/translation.json index 23d93eca05..330c69db2e 100644 --- a/libraries/react-shared-libraries/src/translation/locales/fr/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/fr/translation.json @@ -642,6 +642,10 @@ "channel_id_copied": "ID du canal copié dans le presse-papiers", "settings_updated": "Paramètres mis à jour", "customer_updated": "Client mis à jour", + "edit_group_name": "Modifier le nom du groupe", + "group_name": "Nom", + "group_updated": "Groupe mis à jour", + "could_not_save_group": "Impossible d'enregistrer le groupe.", "custom_url": "URL personnalisée", "picture": "Image", "upgrade_required": "Vous devez mettre à niveau pour utiliser cette fonctionnalité", @@ -682,6 +686,7 @@ "repeat_post_every_label": "Répéter la publication tous les", "add_new_tag": "Ajouter un nouveau tag", "tag_name": "Nom", + "post_save_failed": "Impossible d’enregistrer l’article", "post_is_too_long": "le message est trop long, veuillez le corriger", "your_post_should_have_at_least_one_character_or_one_image": "Votre publication doit contenir au moins un caractère ou une image.", "internal_edit": "Modification interne", @@ -721,6 +726,8 @@ "chat_onboarding_description": "Aucun paramétrage MCP ou CLI nécessaire. Collez ceci dans le chat, l’agent installe le CLI Postiz et vous demande votre clé API.", "connector": "Connecteur", "connector_onboarding_description": "La façon la plus rapide : ajoutez Postiz en un clic, vous serez invité à vous connecter", + "official_connector": "Connecteur officiel", + "connector_self_hosted_description": "Le connecteur officiel fonctionne aussi avec Postiz auto-hébergé. Lorsqu'on vous demande de vous connecter, choisissez \"Use self-hosted\" et saisissez {{url}} avec votre clé API.", "mcp_onboarding_description": "Donnez à votre agent des outils Postiz pour créer, programmer et gérer des publications", "cli_onboarding_description": "Installez le CLI Postiz et la compétence qui apprend à votre agent à l’utiliser", "agent_settings_later": "Plus d’agents et les instructions complètes sont disponibles dans Paramètres > Développeurs", @@ -785,5 +792,6 @@ "preview_comment_failed": "Impossible de publier le commentaire", "preview_comment_detach_hint": "Les commentaires sur le texte sélectionné perdent leur surlignement si le texte est modifié par la suite.", "preview_comment_text_changed": "Texte modifié", - "preview_no_comments_yet": "Aucun commentaire pour le moment. Sélectionnez du texte dans la publication pour le commenter, ou ajoutez un commentaire général." + "preview_no_comments_yet": "Aucun commentaire pour le moment. Sélectionnez du texte dans la publication pour le commenter, ou ajoutez un commentaire général.", + "some_files_failed_to_upload": "Échec du téléversement de certains fichiers, veuillez réessayer." } diff --git a/libraries/react-shared-libraries/src/translation/locales/he/translation.json b/libraries/react-shared-libraries/src/translation/locales/he/translation.json index 0ba46e14de..ae20db6ce2 100644 --- a/libraries/react-shared-libraries/src/translation/locales/he/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/he/translation.json @@ -642,6 +642,10 @@ "channel_id_copied": "מזהה הערוץ הועתק ללוח", "settings_updated": "ההגדרות עודכנו", "customer_updated": "הלקוח עודכן", + "edit_group_name": "ערוך שם קבוצה", + "group_name": "שם", + "group_updated": "הקבוצה עודכנה", + "could_not_save_group": "לא ניתן היה לשמור את הקבוצה.", "custom_url": "כתובת URL מותאמת אישית", "picture": "תמונה", "upgrade_required": "עליך לשדרג כדי להשתמש בתכונה זו", @@ -682,6 +686,7 @@ "repeat_post_every_label": "חזור על הפוסט כל", "add_new_tag": "הוסף תגית חדשה", "tag_name": "שם", + "post_save_failed": "לא ניתן היה לשמור את הפוסט", "post_is_too_long": "הפוסט ארוך מדי, אנא תקן אותו", "your_post_should_have_at_least_one_character_or_one_image": "הפוסט שלך צריך לכלול לפחות תו אחד או תמונה אחת.", "internal_edit": "עריכה פנימית", @@ -721,6 +726,8 @@ "chat_onboarding_description": "אין צורך ב-MCP או הגדרות CLI. העתיקו את זה לצ'אט, הסוכן יתקין את Postiz CLI וישאל אתכם את מפתח ה-API שלכם.", "connector": "מחבר", "connector_onboarding_description": "הדרך המהירה ביותר: הוסיפו את Postiz בלחיצה אחת, תתבקשו להתחבר", + "official_connector": "מחבר רשמי", + "connector_self_hosted_description": "המחבר הרשמי עובד גם עם Postiz באירוח עצמי. כשתתבקש להתחבר, בחר \"Use self-hosted\" והזן את {{url}} יחד עם מפתח ה-API שלך.", "mcp_onboarding_description": "העניקו לסוכן שלכם כלים של Postiz ליצירת, תזמון וניהול פוסטים", "cli_onboarding_description": "התקינו את Postiz CLI ואת המיומנות שמלמדת את הסוכן איך להשתמש בו", "agent_settings_later": "סוכנים נוספים והוראות מלאות זמינים תחת הגדרות > מפתחים", @@ -785,5 +792,6 @@ "preview_comment_failed": "לא ניתן היה לפרסם את התגובה", "preview_comment_detach_hint": "תגובות על טקסט נבחר מאבדות הדגשה אם הטקסט נערך מאוחר יותר.", "preview_comment_text_changed": "הטקסט השתנה", - "preview_no_comments_yet": "עדיין אין תגובות. בחר טקסט בפוסט כדי להגיב עליו, או הוסף תגובה כללית." + "preview_no_comments_yet": "עדיין אין תגובות. בחר טקסט בפוסט כדי להגיב עליו, או הוסף תגובה כללית.", + "some_files_failed_to_upload": "חלק מהקבצים לא הועלו, אנא נסה שוב" } diff --git a/libraries/react-shared-libraries/src/translation/locales/it/translation.json b/libraries/react-shared-libraries/src/translation/locales/it/translation.json index 63f6eaf463..5aa352e704 100644 --- a/libraries/react-shared-libraries/src/translation/locales/it/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/it/translation.json @@ -642,6 +642,10 @@ "channel_id_copied": "ID canale copiato negli appunti", "settings_updated": "Impostazioni aggiornate", "customer_updated": "Cliente aggiornato", + "edit_group_name": "Modifica nome del gruppo", + "group_name": "Nome", + "group_updated": "Gruppo aggiornato", + "could_not_save_group": "Impossibile salvare il gruppo.", "custom_url": "URL personalizzato", "picture": "Immagine", "upgrade_required": "Devi eseguire l'upgrade per utilizzare questa funzione", @@ -682,6 +686,7 @@ "repeat_post_every_label": "Ripeti post ogni", "add_new_tag": "Aggiungi nuovo tag", "tag_name": "Nome", + "post_save_failed": "Impossibile salvare il post", "post_is_too_long": "il post è troppo lungo, per favore correggilo", "your_post_should_have_at_least_one_character_or_one_image": "Il tuo post deve contenere almeno un carattere o un'immagine.", "internal_edit": "Modifica interna", @@ -721,6 +726,8 @@ "chat_onboarding_description": "Nessuna impostazione MCP o CLI necessaria. Incolla questo nella chat, l'agente installerà il Postiz CLI e ti chiederà la tua API key.", "connector": "Connettore", "connector_onboarding_description": "Il modo più veloce: aggiungi Postiz con un clic, ti verrà chiesto di accedere", + "official_connector": "Connettore ufficiale", + "connector_self_hosted_description": "Il connettore ufficiale funziona anche con Postiz self-hosted. Quando ti viene chiesto di accedere, scegli \"Use self-hosted\" e inserisci {{url}} con la tua chiave API.", "mcp_onboarding_description": "Dai al tuo agente gli strumenti Postiz per creare, programmare e gestire post", "cli_onboarding_description": "Installa il Postiz CLI e la skill che insegna al tuo agente come usarlo", "agent_settings_later": "Altri agenti e istruzioni complete sono disponibili in Impostazioni > Sviluppatori", @@ -785,5 +792,6 @@ "preview_comment_failed": "Impossibile pubblicare il commento", "preview_comment_detach_hint": "I commenti su testo selezionato perdono l'evidenziazione se il testo viene modificato successivamente.", "preview_comment_text_changed": "Testo modificato", - "preview_no_comments_yet": "Nessun commento ancora. Seleziona del testo nel post per commentarlo, oppure aggiungi un commento generale." + "preview_no_comments_yet": "Nessun commento ancora. Seleziona del testo nel post per commentarlo, oppure aggiungi un commento generale.", + "some_files_failed_to_upload": "Alcuni file non sono stati caricati, riprova" } diff --git a/libraries/react-shared-libraries/src/translation/locales/ja/translation.json b/libraries/react-shared-libraries/src/translation/locales/ja/translation.json index 870166c1c5..36c0534dc2 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ja/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ja/translation.json @@ -642,6 +642,10 @@ "channel_id_copied": "チャンネルIDがクリップボードにコピーされました", "settings_updated": "設定が更新されました", "customer_updated": "顧客情報が更新されました", + "edit_group_name": "グループ名を編集", + "group_name": "名前", + "group_updated": "グループが更新されました", + "could_not_save_group": "グループを保存できませんでした。", "custom_url": "カスタムURL", "picture": "画像", "upgrade_required": "この機能を利用するにはアップグレードが必要です", @@ -682,6 +686,7 @@ "repeat_post_every_label": "投稿を繰り返す間隔", "add_new_tag": "新しいタグを追加", "tag_name": "名前", + "post_save_failed": "投稿を保存できませんでした", "post_is_too_long": "投稿が長すぎます。修正してください", "your_post_should_have_at_least_one_character_or_one_image": "投稿には少なくとも1文字または1枚の画像が必要です。", "internal_edit": "内部編集", @@ -721,6 +726,8 @@ "chat_onboarding_description": "MCPやCLIの設定は不要です。これをチャットに貼り付けるだけで、エージェントがPostiz CLIをインストールし、APIキーを尋ねます。", "connector": "コネクタ", "connector_onboarding_description": "最速の方法: ワンクリックでPostizを追加、サインインが求められます。", + "official_connector": "公式コネクタ", + "connector_self_hosted_description": "公式コネクタはセルフホストの Postiz でも使えます。サインインを求められたら「Use self-hosted」を選び、{{url}} と API キーを入力してください。", "mcp_onboarding_description": "エージェントにPostizのツールを使わせて、投稿の作成やスケジュール管理をさせましょう。", "cli_onboarding_description": "Postiz CLIと、それを使い方をエージェントに教えるスキルをインストールします。", "agent_settings_later": "その他のエージェントや詳細な手順は、設定 > 開発者 から利用できます。", @@ -785,5 +792,6 @@ "preview_comment_failed": "コメントの投稿に失敗しました", "preview_comment_detach_hint": "選択テキストへのコメントは、テキストが後から編集されるとハイライトが失われます。", "preview_comment_text_changed": "テキストが変更されました", - "preview_no_comments_yet": "まだコメントはありません。投稿内のテキストを選択してコメントするか、一般的なコメントを追加してください。" + "preview_no_comments_yet": "まだコメントはありません。投稿内のテキストを選択してコメントするか、一般的なコメントを追加してください。", + "some_files_failed_to_upload": "いくつかのファイルのアップロードに失敗しました。もう一度お試しください。" } diff --git a/libraries/react-shared-libraries/src/translation/locales/ko/translation.json b/libraries/react-shared-libraries/src/translation/locales/ko/translation.json index e3469e4bce..c88a6eb3cd 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ko/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ko/translation.json @@ -642,6 +642,10 @@ "channel_id_copied": "채널 ID가 클립보드에 복사되었습니다", "settings_updated": "설정이 업데이트되었습니다", "customer_updated": "고객 정보가 업데이트되었습니다", + "edit_group_name": "그룹 이름 수정", + "group_name": "이름", + "group_updated": "그룹이 업데이트되었습니다", + "could_not_save_group": "그룹을 저장할 수 없습니다.", "custom_url": "맞춤 URL", "picture": "사진", "upgrade_required": "이 기능을 사용하려면 업그레이드가 필요합니다", @@ -682,6 +686,7 @@ "repeat_post_every_label": "게시 반복 주기", "add_new_tag": "새 태그 추가", "tag_name": "이름", + "post_save_failed": "게시물을 저장할 수 없습니다", "post_is_too_long": "게시글이 너무 깁니다. 수정해 주세요.", "your_post_should_have_at_least_one_character_or_one_image": "게시물에는 최소한 한 글자 또는 한 이미지를 포함해야 합니다.", "internal_edit": "내부 편집", @@ -721,6 +726,8 @@ "chat_onboarding_description": "MCP나 CLI 설정이 필요 없습니다. 채팅에 이 내용을 붙여넣으면 에이전트가 Postiz CLI를 설치하고 API 키를 입력받습니다.", "connector": "커넥터", "connector_onboarding_description": "가장 빠른 방법: 한 번의 클릭으로 Postiz를 추가하고, 로그인 요청을 받게 됩니다.", + "official_connector": "공식 커넥터", + "connector_self_hosted_description": "공식 커넥터는 자체 호스팅 Postiz에서도 작동합니다. 로그인하라는 메시지가 나타나면 \"Use self-hosted\"를 선택하고 {{url}}과 API 키를 입력하세요.", "mcp_onboarding_description": "에이전트에게 Postiz 도구를 제공해 게시물을 생성, 예약, 관리할 수 있습니다.", "cli_onboarding_description": "Postiz CLI와 에이전트에게 사용법을 알려주는 스킬을 설치하세요.", "agent_settings_later": "더 많은 에이전트와 전체 안내는 설정 > 개발자에서 볼 수 있습니다.", @@ -785,5 +792,6 @@ "preview_comment_failed": "댓글을 게시할 수 없습니다.", "preview_comment_detach_hint": "선택한 텍스트에 단 댓글은, 텍스트가 나중에 수정되면 강조가 사라집니다.", "preview_comment_text_changed": "텍스트가 변경됨", - "preview_no_comments_yet": "아직 댓글이 없습니다. 게시물에서 텍스트를 선택해 댓글을 남기거나, 일반 댓글을 추가하세요." + "preview_no_comments_yet": "아직 댓글이 없습니다. 게시물에서 텍스트를 선택해 댓글을 남기거나, 일반 댓글을 추가하세요.", + "some_files_failed_to_upload": "일부 파일을 업로드하지 못했습니다. 다시 시도해 주세요." } diff --git a/libraries/react-shared-libraries/src/translation/locales/pt/translation.json b/libraries/react-shared-libraries/src/translation/locales/pt/translation.json index 13e301c5ea..f259f7fa72 100644 --- a/libraries/react-shared-libraries/src/translation/locales/pt/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/pt/translation.json @@ -642,6 +642,10 @@ "channel_id_copied": "ID do canal copiado para a área de transferência", "settings_updated": "Configurações Atualizadas", "customer_updated": "Cliente Atualizado", + "edit_group_name": "Editar nome do grupo", + "group_name": "Nome", + "group_updated": "Grupo atualizado", + "could_not_save_group": "Não foi possível salvar o grupo.", "custom_url": "URL personalizada", "picture": "Imagem", "upgrade_required": "Você precisa fazer upgrade para usar este recurso", @@ -682,6 +686,7 @@ "repeat_post_every_label": "Repetir postagem a cada", "add_new_tag": "Adicionar nova tag", "tag_name": "Nome", + "post_save_failed": "Não foi possível salvar a publicação", "post_is_too_long": "a postagem está muito longa, por favor corrija", "your_post_should_have_at_least_one_character_or_one_image": "Sua postagem deve ter pelo menos um caractere ou uma imagem.", "internal_edit": "Edição interna", @@ -721,6 +726,8 @@ "chat_onboarding_description": "Não precisa de configurações MCP ou CLI. Cole isso no chat, o agente instala o Postiz CLI e pede sua chave de API.", "connector": "Conector", "connector_onboarding_description": "A forma mais rápida: adicione o Postiz com um clique, será solicitado que você faça login", + "official_connector": "Conector oficial", + "connector_self_hosted_description": "O conector oficial também funciona com o Postiz auto-hospedado. Quando for solicitado o login, escolha \"Use self-hosted\" e informe {{url}} com sua chave de API.", "mcp_onboarding_description": "Dê ao seu agente as ferramentas Postiz para criar, agendar e gerenciar posts", "cli_onboarding_description": "Instale o Postiz CLI e a skill que ensina seu agente como usá-lo", "agent_settings_later": "Mais agentes e instruções completas estão disponíveis em Configurações > Desenvolvedores", @@ -785,5 +792,6 @@ "preview_comment_failed": "Não foi possível publicar o comentário", "preview_comment_detach_hint": "Comentários em textos selecionados perdem o destaque se o texto for editado depois.", "preview_comment_text_changed": "Texto alterado", - "preview_no_comments_yet": "Ainda não há comentários. Selecione um trecho do post para comentar ou adicione um comentário geral." + "preview_no_comments_yet": "Ainda não há comentários. Selecione um trecho do post para comentar ou adicione um comentário geral.", + "some_files_failed_to_upload": "Alguns arquivos não foram carregados, tente novamente" } diff --git a/libraries/react-shared-libraries/src/translation/locales/ru/translation.json b/libraries/react-shared-libraries/src/translation/locales/ru/translation.json index c3cb03dd79..f041fdf4b4 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ru/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ru/translation.json @@ -642,6 +642,10 @@ "channel_id_copied": "ID канала скопирован в буфер обмена", "settings_updated": "Настройки обновлены", "customer_updated": "Клиент обновлён", + "edit_group_name": "Редактировать имя группы", + "group_name": "Имя", + "group_updated": "Группа обновлена", + "could_not_save_group": "Не удалось сохранить группу.", "custom_url": "Пользовательский URL", "picture": "Изображение", "upgrade_required": "Вам необходимо обновить тариф для использования этой функции", @@ -682,6 +686,7 @@ "repeat_post_every_label": "Повторять публикацию каждые", "add_new_tag": "Добавить новый тег", "tag_name": "Название", + "post_save_failed": "Не удалось сохранить публикацию", "post_is_too_long": "пост слишком длинный, пожалуйста, исправьте его", "your_post_should_have_at_least_one_character_or_one_image": "Ваша публикация должна содержать хотя бы один символ или одно изображение.", "internal_edit": "Внутреннее редактирование", @@ -721,6 +726,8 @@ "chat_onboarding_description": "Не нужны MCP или настройки CLI. Вставьте это в чат, агент установит Postiz CLI и спросит у вас API-ключ.", "connector": "Коннектор", "connector_onboarding_description": "Самый быстрый способ: добавьте Postiz одним кликом, вам предложат войти в систему", + "official_connector": "Официальный коннектор", + "connector_self_hosted_description": "Официальный коннектор работает и с Postiz на собственном сервере. Когда вас попросят войти, выберите \"Use self-hosted\" и введите {{url}} и ваш API-ключ.", "mcp_onboarding_description": "Дайте вашему агенту инструменты Postiz для создания, планирования и управления публикациями", "cli_onboarding_description": "Установите Postiz CLI и навык, который научит вашего агента им пользоваться", "agent_settings_later": "Больше агентов и полные инструкции доступны в разделе Настройки > Разработчики", @@ -785,5 +792,6 @@ "preview_comment_failed": "Не удалось опубликовать комментарий", "preview_comment_detach_hint": "Комментарии к выделенному тексту теряют выделение, если текст позже изменяется.", "preview_comment_text_changed": "Текст изменён", - "preview_no_comments_yet": "Пока нет ни одного комментария. Выделите текст в публикации, чтобы оставить к нему комментарий, или добавьте общий комментарий." + "preview_no_comments_yet": "Пока нет ни одного комментария. Выделите текст в публикации, чтобы оставить к нему комментарий, или добавьте общий комментарий.", + "some_files_failed_to_upload": "Не удалось загрузить некоторые файлы, пожалуйста, попробуйте еще раз" } diff --git a/libraries/react-shared-libraries/src/translation/locales/tr/translation.json b/libraries/react-shared-libraries/src/translation/locales/tr/translation.json index 2ec5eaffad..813cc3925f 100644 --- a/libraries/react-shared-libraries/src/translation/locales/tr/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/tr/translation.json @@ -642,6 +642,10 @@ "channel_id_copied": "Kanal kimliği panoya kopyalandı", "settings_updated": "Ayarlar Güncellendi", "customer_updated": "Müşteri Güncellendi", + "edit_group_name": "Grup adını düzenle", + "group_name": "Ad", + "group_updated": "Grup güncellendi", + "could_not_save_group": "Grup kaydedilemedi.", "custom_url": "Özel URL", "picture": "Resim", "upgrade_required": "Bu özelliği kullanmak için yükseltme yapmanız gerekiyor", @@ -682,6 +686,7 @@ "repeat_post_every_label": "Gönderiyi Her Tekrarla", "add_new_tag": "Yeni Etiket Ekle", "tag_name": "Adı", + "post_save_failed": "Gönderi kaydedilemedi", "post_is_too_long": "gönderi çok uzun, lütfen düzeltin", "your_post_should_have_at_least_one_character_or_one_image": "Gönderinizde en az bir karakter veya bir görsel olmalıdır.", "internal_edit": "Dahili Düzenleme", @@ -721,6 +726,8 @@ "chat_onboarding_description": "MCP veya CLI ayarlarına gerek yok. Bunu sohbete yapıştırın, ajan Postiz CLI'yı yükler ve sizden API anahtarınızı ister.", "connector": "Konnektör", "connector_onboarding_description": "En hızlı yol: Postiz'i tek tıkla ekleyin, giriş yapmanız istenecektir", + "official_connector": "Resmi bağlayıcı", + "connector_self_hosted_description": "Resmi bağlayıcı, kendi sunucunuzda barındırdığınız Postiz ile de çalışır. Giriş yapmanız istendiğinde \"Use self-hosted\" seçeneğini seçin ve API anahtarınızla birlikte {{url}} adresini girin.", "mcp_onboarding_description": "Ajanınıza gönderi oluşturma, zamanlama ve yönetme araçları verin", "cli_onboarding_description": "Postiz CLI ve ajanınıza bunun nasıl kullanılacağını öğreten beceriyi kurun", "agent_settings_later": "Daha fazla ajan ve tam talimatlar Ayarlar > Geliştiriciler bölümünde mevcuttur", @@ -785,5 +792,6 @@ "preview_comment_failed": "Yorum paylaşılırken bir hata oluştu", "preview_comment_detach_hint": "Seçili metindeki yorumlar, metin daha sonra değiştirilirse vurgusunu kaybeder.", "preview_comment_text_changed": "Metin değişti", - "preview_no_comments_yet": "Henüz yorum yok. Yorum yapmak için gönderide bir metin seçin veya genel bir yorum ekleyin." + "preview_no_comments_yet": "Henüz yorum yok. Yorum yapmak için gönderide bir metin seçin veya genel bir yorum ekleyin.", + "some_files_failed_to_upload": "Bazı dosyalar yüklenemedi, lütfen tekrar deneyin" } diff --git a/libraries/react-shared-libraries/src/translation/locales/vi/translation.json b/libraries/react-shared-libraries/src/translation/locales/vi/translation.json index 197691d3ad..21a367798c 100644 --- a/libraries/react-shared-libraries/src/translation/locales/vi/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/vi/translation.json @@ -642,6 +642,10 @@ "channel_id_copied": "Đã sao chép ID kênh vào bộ nhớ tạm", "settings_updated": "Đã cập nhật cài đặt", "customer_updated": "Đã cập nhật khách hàng", + "edit_group_name": "Chỉnh sửa tên nhóm", + "group_name": "Tên", + "group_updated": "Nhóm đã được cập nhật", + "could_not_save_group": "Không thể lưu nhóm.", "custom_url": "URL tùy chỉnh", "picture": "Hình ảnh", "upgrade_required": "Bạn cần nâng cấp để sử dụng tính năng này", @@ -682,6 +686,7 @@ "repeat_post_every_label": "Lặp lại bài đăng mỗi", "add_new_tag": "Thêm thẻ mới", "tag_name": "Tên", + "post_save_failed": "Không thể lưu bài viết", "post_is_too_long": "bài đăng quá dài, vui lòng chỉnh sửa", "your_post_should_have_at_least_one_character_or_one_image": "Bài đăng của bạn phải có ít nhất một ký tự hoặc một hình ảnh.", "internal_edit": "Chỉnh sửa nội bộ", @@ -721,6 +726,8 @@ "chat_onboarding_description": "Không cần cài đặt MCP hoặc CLI. Dán dòng này vào chat, Agent sẽ cài đặt Postiz CLI và yêu cầu API key của bạn.", "connector": "Connector", "connector_onboarding_description": "Nhanh nhất: thêm Postiz chỉ với một cú nhấp, bạn sẽ được yêu cầu đăng nhập", + "official_connector": "Trình kết nối chính thức", + "connector_self_hosted_description": "Trình kết nối chính thức cũng hoạt động với Postiz tự lưu trữ. Khi được yêu cầu đăng nhập, hãy chọn \"Use self-hosted\" và nhập {{url}} cùng khóa API của bạn.", "mcp_onboarding_description": "Cung cấp cho Agent của bạn các công cụ của Postiz để tạo, lên lịch và quản lý bài đăng", "cli_onboarding_description": "Cài đặt Postiz CLI và kỹ năng hướng dẫn Agent của bạn cách sử dụng nó", "agent_settings_later": "Thêm nhiều Agent và hướng dẫn đầy đủ có tại Cài đặt > Nhà phát triển", @@ -785,5 +792,6 @@ "preview_comment_failed": "Không thể đăng bình luận", "preview_comment_detach_hint": "Bình luận trên đoạn văn bản được chọn sẽ mất nổi bật nếu văn bản bị chỉnh sửa sau đó.", "preview_comment_text_changed": "Nội dung đã thay đổi", - "preview_no_comments_yet": "Chưa có bình luận nào. Chọn một đoạn văn bản trong bài viết để bình luận, hoặc thêm bình luận chung." + "preview_no_comments_yet": "Chưa có bình luận nào. Chọn một đoạn văn bản trong bài viết để bình luận, hoặc thêm bình luận chung.", + "some_files_failed_to_upload": "Một số tệp không tải lên được, vui lòng thử lại" } diff --git a/libraries/react-shared-libraries/src/translation/locales/zh/translation.json b/libraries/react-shared-libraries/src/translation/locales/zh/translation.json index c7a089b1ba..9b8d1b20d9 100644 --- a/libraries/react-shared-libraries/src/translation/locales/zh/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/zh/translation.json @@ -642,6 +642,10 @@ "channel_id_copied": "频道 ID 已复制到剪贴板", "settings_updated": "设置已更新", "customer_updated": "客户已更新", + "edit_group_name": "编辑群组名称", + "group_name": "名称", + "group_updated": "群组已更新", + "could_not_save_group": "无法保存群组。", "custom_url": "自定义 URL", "picture": "图片", "upgrade_required": "您需要升级才能使用此功能", @@ -682,6 +686,7 @@ "repeat_post_every_label": "每隔...重复发布", "add_new_tag": "添加新标签", "tag_name": "名称", + "post_save_failed": "无法保存帖子", "post_is_too_long": "帖子太长,请修改", "your_post_should_have_at_least_one_character_or_one_image": "您的帖子至少应包含一个字符或一张图片。", "internal_edit": "内部编辑", @@ -721,6 +726,8 @@ "chat_onboarding_description": "无需 MCP 或 CLI 设置。将此粘贴到聊天中,代理会安装 Postiz CLI 并向您索取 API 密钥。", "connector": "连接器", "connector_onboarding_description": "最快捷的方法:一键添加 Postiz,系统会要求您登录", + "official_connector": "官方连接器", + "connector_self_hosted_description": "官方连接器同样适用于自托管的 Postiz。在要求登录时,选择“Use self-hosted”,然后输入 {{url}} 和你的 API 密钥。", "mcp_onboarding_description": "为您的代理提供 Postiz 工具,以创建、安排和管理帖子", "cli_onboarding_description": "安装 Postiz CLI 以及教您的代理如何使用的技能", "agent_settings_later": "更多代理和完整说明可在 设置 > 开发者 下查看", @@ -785,5 +792,6 @@ "preview_comment_failed": "无法发布评论", "preview_comment_detach_hint": "如果后续编辑了所选文本,所选文本上的评论高亮将丢失。", "preview_comment_text_changed": "文本已更改", - "preview_no_comments_yet": "还没有评论。选中帖子中的某些文本以进行评论,或添加一个总体评论。" + "preview_no_comments_yet": "还没有评论。选中帖子中的某些文本以进行评论,或添加一个总体评论。", + "some_files_failed_to_upload": "部分文件上传失败,请重试" } diff --git a/package.json b/package.json index bda4ba0d0b..604dee7c73 100644 --- a/package.json +++ b/package.json @@ -87,10 +87,10 @@ "@pigment-css/react": "^0.0.30", "@postiz/wallets": "^0.0.1", "@prisma/client": "6.5.0", - "@sentry/nestjs": "^10.26.0", - "@sentry/nextjs": "^10.26.0", - "@sentry/profiling-node": "^10.25.0", - "@sentry/react": "^10.25.0", + "@sentry/nestjs": "10.56.0", + "@sentry/nextjs": "10.56.0", + "@sentry/profiling-node": "10.56.0", + "@sentry/react": "10.56.0", "@solana/wallet-adapter-react": "^0.15.35", "@solana/wallet-adapter-react-ui": "^0.9.35", "@stripe/react-stripe-js": "^5.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ffe89ab3b2..8bbb1d1af9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: dependencies: '@ag-ui/mastra': specifier: ^1.1.4 - version: 1.1.4(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@copilotkit/runtime@1.72.0(060090e105863d9983aa04d300df3d3a))(@mastra/client-js@0.15.2(openapi-types@12.1.3)(react@19.2.4)(zod@3.25.76))(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76)) + version: 1.1.4(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@copilotkit/runtime@1.72.0(d8db588a33556e4390c2c1ec6b88e6cc))(@mastra/client-js@0.15.2(openapi-types@12.1.3)(react@19.2.4)(zod@3.25.76))(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76)) '@ai-sdk/openai': specifier: ^2.0.52 version: 2.0.98(zod@3.25.76) @@ -49,7 +49,7 @@ importers: version: 1.72.0(@ag-ui/core@0.0.59)(@cfworker/json-schema@4.1.1)(@types/mdast@4.0.4)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(graphql@16.13.1)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) '@copilotkit/runtime': specifier: 1.72.0 - version: 1.72.0(060090e105863d9983aa04d300df3d3a) + version: 1.72.0(d8db588a33556e4390c2c1ec6b88e6cc) '@copilotkit/runtime-client-gql': specifier: 1.72.0 version: 1.72.0(@ag-ui/core@0.0.59)(graphql@16.13.1)(react@19.2.4) @@ -61,19 +61,19 @@ importers: version: 3.10.0(react-hook-form@7.71.2(react@19.2.4)) '@langchain/community': specifier: ^1.1.27 - version: 1.1.27(66046857593e81cf94589e5d63e1e984) + version: 1.1.27(cbe060cf4b5645a3ea17665610df96e8) '@langchain/core': specifier: ^1.1.39 - version: 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + version: 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) '@langchain/langgraph': specifier: ^1.2.8 - version: 1.2.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.2(zod@3.25.76))(zod@3.25.76) + version: 1.2.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.2(zod@3.25.76))(zod@3.25.76) '@langchain/openai': specifier: ^1.4.3 - version: 1.4.3(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + version: 1.4.3(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) '@langchain/tavily': specifier: ^1.2.0 - version: 1.2.0(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) + version: 1.2.0(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) '@mantine/core': specifier: ^5.10.5 version: 5.10.5(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.2.4))(@mantine/hooks@5.10.5(react@19.2.4))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -147,17 +147,17 @@ importers: specifier: 6.5.0 version: 6.5.0(prisma@6.5.0(typescript@5.5.4))(typescript@5.5.4) '@sentry/nestjs': - specifier: ^10.26.0 - version: 10.45.0(@nestjs/common@11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.21) + specifier: 10.56.0 + version: 10.56.0(@nestjs/common@11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.21)(@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0)) '@sentry/nextjs': - specifier: ^10.26.0 - version: 10.45.0(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(next@16.3.1(@babel/core@8.0.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react@19.2.4)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) + specifier: 10.56.0 + version: 10.56.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(next@16.3.1(@babel/core@8.0.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react@19.2.4)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) '@sentry/profiling-node': - specifier: ^10.25.0 - version: 10.45.0 + specifier: 10.56.0 + version: 10.56.0(@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0)) '@sentry/react': - specifier: ^10.25.0 - version: 10.45.0(react@19.2.4) + specifier: 10.56.0 + version: 10.56.0(react@19.2.4) '@solana/wallet-adapter-react': specifier: ^0.15.35 version: 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) @@ -445,7 +445,7 @@ importers: version: 4.17.23 lucide-react: specifier: ^1.31.0 - version: 1.47.0(react@19.2.4) + version: 1.50.0(@types/react@19.1.8)(react@19.2.4) mastra: specifier: ^1.30.0 version: 1.30.0(@hono/node-server@1.19.11(hono@4.12.10))(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.1.0)(rxjs@7.8.2)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -3040,8 +3040,8 @@ packages: resolution: {integrity: sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@eslint/js@9.39.5': @@ -3098,11 +3098,6 @@ packages: '@fastify/busboy@3.2.0': resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} - '@fastify/otel@0.17.1': - resolution: {integrity: sha512-K4wyxfUZx2ux5o+b6BtTqouYFVILohLZmSbA2tKUueJstNcBnoGPVhllCaOvbQ3ZrXdUxUC/fyrSWSCqHhdOPg==} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@floating-ui/core@1.7.5': resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} @@ -3251,8 +3246,8 @@ packages: resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead @@ -5296,26 +5291,22 @@ packages: resolution: {integrity: sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==} engines: {node: '>=8.0.0'} - '@opentelemetry/api-logs@0.207.0': - resolution: {integrity: sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ==} - engines: {node: '>=8.0.0'} - '@opentelemetry/api-logs@0.208.0': resolution: {integrity: sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==} engines: {node: '>=8.0.0'} - '@opentelemetry/api-logs@0.212.0': - resolution: {integrity: sha512-TEEVrLbNROUkYY51sBJGk7lO/OLjuepch8+hmpM6ffMJQ2z/KVCjdHuCFX6fJj8OkJP2zckPjrJzQtXU3IAsFg==} - engines: {node: '>=8.0.0'} - - '@opentelemetry/api-logs@0.213.0': - resolution: {integrity: sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw==} + '@opentelemetry/api-logs@0.214.0': + resolution: {integrity: sha512-40lSJeqYO8Uz2Yj7u94/SJWE/wONa7rmMKjI1ZcIjgf3MHNHv1OZUCrCETGuaRF62d5pQD1wKIW+L4lmSMTzZA==} engines: {node: '>=8.0.0'} '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} + '@opentelemetry/api@1.9.1': + resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} + engines: {node: '>=8.0.0'} + '@opentelemetry/auto-instrumentations-node@0.62.2': resolution: {integrity: sha512-Ipe6X7ddrCiRsuewyTU83IvKiSFT4piqmv9z8Ovg1E7v98pdTj1pUE6sDrHV50zl7/ypd+cONBgt+EYSZu4u9Q==} engines: {node: ^18.19.0 || >=20.6.0} @@ -5341,6 +5332,12 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@2.11.0': + resolution: {integrity: sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@2.2.0': resolution: {integrity: sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==} engines: {node: ^18.19.0 || >=20.6.0} @@ -5431,12 +5428,6 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-amqplib@0.60.0': - resolution: {integrity: sha512-q/B2IvoVXRm1M00MvhnzpMN6rKYOszPXVsALi6u0ss4AYHe+TidZEtLW9N1ZhrobI1dSriHnBqqtAOZVAv07sg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-aws-lambda@0.54.1': resolution: {integrity: sha512-qm8pGSAM1mXk7unbrGktWWGJc6IFI58ZsaHJ+i420Fp5VO3Vf7GglIgaXTS8CKBrVB4LHFj3NvzJg31PtsAQcA==} engines: {node: ^18.19.0 || >=20.6.0} @@ -5467,12 +5458,6 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-connect@0.56.0': - resolution: {integrity: sha512-PKp+sSZ7AfzMvGgO3VCyo1inwNu+q7A1k9X88WK4PQ+S6Hp7eFk8pie+sWHDTaARovmqq5V2osav3lQej2B0nw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-cucumber@0.19.0': resolution: {integrity: sha512-99ms8kQWRuPt5lkDqbJJzD+7Tq5TMUlBZki4SA2h6CgK4ncX+tyep9XFY1e+XTBLJIWmuFMGbWqBLJ4fSKIQNQ==} engines: {node: ^18.19.0 || >=20.6.0} @@ -5485,12 +5470,6 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-dataloader@0.30.0': - resolution: {integrity: sha512-MXHP2Q38cd2OhzEBKAIXUi9uBlPEYzF6BNJbyjUXBQ6kLaf93kRC41vNMIz0Nl5mnuwK7fDvKT+/lpx7BXRwdg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-dns@0.47.0': resolution: {integrity: sha512-775fOnewWkTF4iXMGKgwvOGqEmPrU1PZpXjjqvTrEErYBJe7Fz1WlEeUStHepyKOdld7Ghv7TOF/kE3QDctvrg==} engines: {node: ^18.19.0 || >=20.6.0} @@ -5503,12 +5482,6 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-express@0.61.0': - resolution: {integrity: sha512-Xdmqo9RZuZlL29Flg8QdwrrX7eW1CZ7wFQPKHyXljNymgKhN1MCsYuqQ/7uxavhSKwAl7WxkTzKhnqpUApLMvQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-fastify@0.48.0': resolution: {integrity: sha512-3zQlE/DoVfVH6/ycuTv7vtR/xib6WOa0aLFfslYcvE62z0htRu/ot8PV/zmMZfnzpTQj8S/4ULv36R6UIbpJIg==} engines: {node: ^18.19.0 || >=20.6.0} @@ -5521,36 +5494,18 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-fs@0.32.0': - resolution: {integrity: sha512-koR6apx0g0wX6RRiPpjA4AFQUQUbXrK16kq4/SZjVp7u5cffJhNkY4TnITxcGA4acGSPYAfx3NHRIv4Khn1axQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-generic-pool@0.47.0': resolution: {integrity: sha512-UfHqf3zYK+CwDwEtTjaD12uUqGGTswZ7ofLBEdQ4sEJp9GHSSJMQ2hT3pgBxyKADzUdoxQAv/7NqvL42ZI+Qbw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-generic-pool@0.56.0': - resolution: {integrity: sha512-fg+Jffs6fqrf0uQS0hom7qBFKsbtpBiBl8+Vkc63Gx8xh6pVh+FhagmiO6oM0m3vyb683t1lP7yGYq22SiDnqg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-graphql@0.51.0': resolution: {integrity: sha512-LchkOu9X5DrXAnPI1+Z06h/EH/zC7D6sA86hhPrk3evLlsJTz0grPrkL/yUJM9Ty0CL/y2HSvmWQCjbJEz/ADg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-graphql@0.61.0': - resolution: {integrity: sha512-pUiVASv6nh2XrerTvlbVHh7vKFzscpgwiQ/xvnZuAIzQ5lRjWVdRPUuXbvZJ/Yq79QsE81TZdJ7z9YsXiss1ew==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-grpc@0.203.0': resolution: {integrity: sha512-Qmjx2iwccHYRLoE4RFS46CvQE9JG9Pfeae4EPaNZjvIuJxb/pZa2R9VWzRlTehqQWpAvto/dGhtkw8Tv+o0LTg==} engines: {node: ^18.19.0 || >=20.6.0} @@ -5563,84 +5518,42 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-hapi@0.59.0': - resolution: {integrity: sha512-33wa4mEr+9+ztwdgLor1SeBu4Opz4IsmpcLETXAd3VmBrOjez8uQtrsOhPCa5Vhbm5gzDlMYTgFRLQzf8/YHFA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-http@0.203.0': resolution: {integrity: sha512-y3uQAcCOAwnO6vEuNVocmpVzG3PER6/YZqbPbbffDdJ9te5NkHEkfSMNzlC3+v7KlE+WinPGc3N7MR30G1HY2g==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-http@0.213.0': - resolution: {integrity: sha512-B978Xsm5XEPGhm1P07grDoaOFLHapJPkOG9h016cJsyWWxmiLnPu2M/4Nrm7UCkHSiLnkXgC+zVGUAIahy8EEA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-ioredis@0.51.0': resolution: {integrity: sha512-9IUws0XWCb80NovS+17eONXsw1ZJbHwYYMXiwsfR9TSurkLV5UNbRSKb9URHO+K+pIJILy9wCxvyiOneMr91Ig==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-ioredis@0.61.0': - resolution: {integrity: sha512-hsHDadUtAFbws1YSDc1XW0svGFKiUbqv2td1Cby+UAiwvojm1NyBo/taifH0t8CuFZ0x/2SDm0iuTwrM5pnVOg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-kafkajs@0.13.0': resolution: {integrity: sha512-FPQyJsREOaGH64hcxlzTsIEQC4DYANgTwHjiB7z9lldmvua1LRMVn3/FfBlzXoqF179B0VGYviz6rn75E9wsDw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-kafkajs@0.22.0': - resolution: {integrity: sha512-wJU4IBQMUikdJAcTChLFqK5lo+flo7pahqd8DSLv7uMxsdOdAHj6RzKYAm8pPfUS6ItKYutYyuicwKaFwQKsoA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-knex@0.48.0': resolution: {integrity: sha512-V5wuaBPv/lwGxuHjC6Na2JFRjtPgstw19jTFl1B1b6zvaX8zVDYUDaR5hL7glnQtUSCMktPttQsgK4dhXpddcA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-knex@0.57.0': - resolution: {integrity: sha512-vMCSh8kolEm5rRsc+FZeTZymWmIJwc40hjIKnXH4O0Dv/gAkJJIRXCsPX5cPbe0c0j/34+PsENd0HqKruwhVYw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-koa@0.51.0': resolution: {integrity: sha512-XNLWeMTMG1/EkQBbgPYzCeBD0cwOrfnn8ao4hWgLv0fNCFQu1kCsJYygz2cvKuCs340RlnG4i321hX7R8gj3Rg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-koa@0.61.0': - resolution: {integrity: sha512-lvrfWe9ShK/D2X4brmx8ZqqeWPfRl8xekU0FCn7C1dHm5k6+rTOOi36+4fnaHAP8lig9Ux6XQ1D4RNIpPCt1WQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/instrumentation-lru-memoizer@0.48.0': resolution: {integrity: sha512-KUW29wfMlTPX1wFz+NNrmE7IzN7NWZDrmFWHM/VJcmFEuQGnnBuTIdsP55CnBDxKgQ/qqYFp4udQFNtjeFosPw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-lru-memoizer@0.57.0': - resolution: {integrity: sha512-cEqpUocSKJfwDtLYTTJehRLWzkZ2eoePCxfVIgGkGkb83fMB71O+y4MvRHJPbeV2bdoWdOVrl8uO0+EynWhTEA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-memcached@0.47.0': resolution: {integrity: sha512-vXDs/l4hlWy1IepPG1S6aYiIZn+tZDI24kAzwKKJmR2QEJRL84PojmALAEJGazIOLl/VdcCPZdMb0U2K0VzojA==} engines: {node: ^18.19.0 || >=20.6.0} @@ -5653,60 +5566,30 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-mongodb@0.66.0': - resolution: {integrity: sha512-d7m9QnAY+4TCWI4q1QRkfrc6fo/92VwssaB1DzQfXNRvu51b78P+HJlWP7Qg6N6nkwdb9faMZNBCZJfftmszkw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-mongoose@0.50.0': resolution: {integrity: sha512-Am8pk1Ct951r4qCiqkBcGmPIgGhoDiFcRtqPSLbJrUZqEPUsigjtMjoWDRLG1Ki1NHgOF7D0H7d+suWz1AAizw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-mongoose@0.59.0': - resolution: {integrity: sha512-6/jWU+c1NgznkVLDU/2y0bXV2nJo3o9FWZ9mZ9nN6T/JBNRoMnVXZl2FdBmgH+a5MwaWLs5kmRJTP5oUVGIkPw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-mysql2@0.50.0': resolution: {integrity: sha512-PoOMpmq73rOIE3nlTNLf3B1SyNYGsp7QXHYKmeTZZnJ2Ou7/fdURuOhWOI0e6QZ5gSem18IR1sJi6GOULBQJ9g==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-mysql2@0.59.0': - resolution: {integrity: sha512-n9/xrVCRBfG9egVbffnlU1uhr+HX0vF4GgtAB/Bvm48wpFgRidqD8msBMiym1kRYzmpWvJqTxNT47u1MkgBEdw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-mysql@0.49.0': resolution: {integrity: sha512-QU9IUNqNsrlfE3dJkZnFHqLjlndiU39ll/YAAEvWE40sGOCi9AtOF6rmEGzJ1IswoZ3oyePV7q2MP8SrhJfVAA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-mysql@0.59.0': - resolution: {integrity: sha512-r+V/Fh0sm7Ga8/zk/TI5H5FQRAjwr0RrpfPf8kNIehlsKf12XnvIaZi8ViZkpX0gyPEpLXqzqWD6QHlgObgzZw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-nestjs-core@0.49.0': resolution: {integrity: sha512-1R/JFwdmZIk3T/cPOCkVvFQeKYzbbUvDxVH3ShXamUwBlGkdEu5QJitlRMyVNZaHkKZKWgYrBarGQsqcboYgaw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-nestjs-core@0.59.0': - resolution: {integrity: sha512-tt2cFTENV8XB3D3xjhOz0q4hLc1eqkMZS5UyT9nnHF5FfYH94S2vAGdssvsMv+pFtA6/PmhPUZd4onUN1O7STg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-net@0.47.0': resolution: {integrity: sha512-csoJ++Njpf7C09JH+0HNGenuNbDZBqO1rFhMRo6s0rAmJwNh9zY3M/urzptmKlqbKnf4eH0s+CKHy/+M8fbFsQ==} engines: {node: ^18.19.0 || >=20.6.0} @@ -5725,12 +5608,6 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-pg@0.65.0': - resolution: {integrity: sha512-W0zpHEIEuyZ8zvb3njaX9AAbHgPYOsSWVOoWmv1sjVRSF6ZpBqtlxBWbU+6hhq1TFWBeWJOXZ8nZS/PUFpLJYQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-pino@0.50.1': resolution: {integrity: sha512-pBbvuWiHA9iAumAuQ0SKYOXK7NRlbnVTf/qBV0nMdRnxBPrc/GZTbh0f7Y59gZfYsbCLhXLL1oRTEnS+PwS3CA==} engines: {node: ^18.19.0 || >=20.6.0} @@ -5743,12 +5620,6 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-redis@0.61.0': - resolution: {integrity: sha512-JnPexA034/0UJRsvH96B0erQoNOqKJZjE2ZRSw9hiTSC23LzE0nJE/u6D+xqOhgUhRnhhcPHq4MdYtmUdYTF+Q==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-restify@0.49.0': resolution: {integrity: sha512-tsGZZhS4mVZH7omYxw5jpsrD3LhWizqWc0PYtAnzpFUvL5ZINHE+cm57bssTQ2AK/GtZMxu9LktwCvIIf3dSmw==} engines: {node: ^18.19.0 || >=20.6.0} @@ -5779,24 +5650,12 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-tedious@0.32.0': - resolution: {integrity: sha512-BQS6gG8RJ1foEqfEZ+wxoqlwfCAzb1ZVG0ad8Gfe4x8T658HJCLGLd4E4NaoQd8EvPfLqOXgzGaE/2U4ytDSWA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-undici@0.14.0': resolution: {integrity: sha512-2HN+7ztxAReXuxzrtA3WboAKlfP5OsPA57KQn2AdYZbJ3zeRPcLXyW4uO/jpLE6PLm0QRtmeGCmfYpqRlwgSwg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.7.0 - '@opentelemetry/instrumentation-undici@0.23.0': - resolution: {integrity: sha512-LL0VySzKVR2cJSFVZaTYpZl1XTpBGnfzoQPe2W7McS2267ldsaEIqtQY6VXs2KCXN0poFjze5110PIpxHDaDGg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.7.0 - '@opentelemetry/instrumentation-winston@0.48.1': resolution: {integrity: sha512-XyOuVwdziirHHYlsw+BWrvdI/ymjwnexupKA787zQQ+D5upaE/tseZxjfQa7+t4+FdVLxHICaMTmkSD4yZHpzQ==} engines: {node: ^18.19.0 || >=20.6.0} @@ -5809,20 +5668,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation@0.207.0': - resolution: {integrity: sha512-y6eeli9+TLKnznrR8AZlQMSJT7wILpXH+6EYq5Vf/4Ao+huI7EedxQHwRgVUOMLFbe7VFDvHJrX9/f4lcwnJsA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation@0.212.0': - resolution: {integrity: sha512-IyXmpNnifNouMOe0I/gX7ENfv2ZCNdYTF0FpCsoBcpbIHzk81Ww9rQTYTnvghszCg7qGrIhNvWC8dhEifgX9Jg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation@0.213.0': - resolution: {integrity: sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w==} + '@opentelemetry/instrumentation@0.214.0': + resolution: {integrity: sha512-MHqEX5Dk59cqVah5LiARMACku7jXSVk9iVDWOea4x3cr7VfdByeDCURK6o1lntT1JS/Tsovw01UJrBhN3/uC5w==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -5909,6 +5756,12 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/resources@2.11.0': + resolution: {integrity: sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/resources@2.2.0': resolution: {integrity: sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==} engines: {node: ^18.19.0 || >=20.6.0} @@ -5963,6 +5816,12 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/sdk-trace-base@2.11.0': + resolution: {integrity: sha512-H19x/TX/LZdqiYOjM7fqtSxwlplC5pgelavqbQdHbhdq0q/AI/TGkM2dfGuuynTXmJPeF2HoZVoPDu+TGoW78A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/sdk-trace-base@2.2.0': resolution: {integrity: sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw==} engines: {node: ^18.19.0 || >=20.6.0} @@ -5987,6 +5846,12 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/sdk-trace@2.11.0': + resolution: {integrity: sha512-fFnTqGm8/G73GQVnxYi7LXa1ZVYEUvgL6XI1LpvV0bPC7WQ/ZGgKxCSl8FnlZBKto9JHHEFTO6s6CUpvvtwFrA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/semantic-conventions@1.40.0': resolution: {integrity: sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==} engines: {node: '>=14'} @@ -6211,11 +6076,6 @@ packages: '@prisma/get-platform@6.5.0': resolution: {integrity: sha512-xYcvyJwNMg2eDptBYFqFLUCfgi+wZLcj6HDMsj0Qw0irvauG4IKmkbywnqwok0B+k+W+p+jThM2DKTSmoPCkzw==} - '@prisma/instrumentation@7.4.2': - resolution: {integrity: sha512-r9JfchJF1Ae6yAxcaLu/V1TGqBhAuSDe3mRNOssBfx1rMzfZ4fdNvrgUBwyb/TNTGXFxlH9AZix5P257x07nrg==} - peerDependencies: - '@opentelemetry/api': ^1.8 - '@project-serum/sol-wallet-adapter@0.2.6': resolution: {integrity: sha512-cpIb13aWPW8y4KzkZAPDgw+Kb+DXjCC6rZoH74MGm3I/6e/zKyGnfAuW5olb2zxonFqsYgnv7ev8MQnvSgJ3/g==} engines: {node: '>=10'} @@ -7509,165 +7369,237 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} - '@sentry-internal/browser-utils@10.45.0': - resolution: {integrity: sha512-ZPZpeIarXKScvquGx2AfNKcYiVNDA4wegMmjyGVsTA2JPmP0TrJoO3UybJS6KGDeee8V3I3EfD/ruauMm7jOFQ==} + '@sentry-internal/browser-utils@10.56.0': + resolution: {integrity: sha512-I8tZWAFg8SZpD8BFUpglEtSTzhZjacmcThB5/Mlq/iFiiT8mBPG4ZWDWssSfmIBKvZywJZJ83uDA0+uiJU73Tw==} + engines: {node: '>=18'} + + '@sentry-internal/feedback@10.56.0': + resolution: {integrity: sha512-fkRR9JroESTIlErkht3OrH4DXKd/DbPozr2KLdX7boMo31hPu4cL9fuqzwOrwyDPRq9B4j+qEgIWB8JrTbgvmg==} engines: {node: '>=18'} - '@sentry-internal/feedback@10.45.0': - resolution: {integrity: sha512-vCSurazFVq7RUeYiM5X326jA5gOVrWYD6lYX2fbjBOMcyCEhDnveNxMT62zKkZDyNT/jyD194nz/cjntBUkyWA==} + '@sentry-internal/node-cpu-profiler@2.4.1': + resolution: {integrity: sha512-Wnkik+RLvRUZEB8Zx5ofgPdcC8bCSoiUUiyH6TorrLK6PBPerbjK48c2GsJf6l5Hc5GAhA3fitueVLATB0XhWQ==} engines: {node: '>=18'} - '@sentry-internal/node-cpu-profiler@2.2.0': - resolution: {integrity: sha512-oLHVYurqZfADPh5hvmQYS5qx8t0UZzT2u6+/68VXsFruQEOnYJTODKgU3BVLmemRs3WE6kCJjPeFdHVYOQGSzQ==} + '@sentry-internal/replay-canvas@10.56.0': + resolution: {integrity: sha512-SDg2K0CAZT/TnhrixQGwXoi6ZsWUB+DQy3UUk0bSQm6c/5k5zFBpGOiughQN+DYsDilKREfPKmUEEnqvUjm1HQ==} engines: {node: '>=18'} - '@sentry-internal/replay-canvas@10.45.0': - resolution: {integrity: sha512-nvq/AocdZTuD7y0KSiWi3gVaY0s5HOFy86mC/v1kDZmT/jsBAzN5LDkk/f1FvsWma1peqQmpUqxvhC+YIW294Q==} + '@sentry-internal/replay@10.56.0': + resolution: {integrity: sha512-DjF09hpy3TF7Km/kOZc73YJmBqcbPCxuZ5rtRs+KtVHu3Vq48xeW83qKUcFEZv20ur9UD99OAJ/gaEt//1Qbwg==} engines: {node: '>=18'} - '@sentry-internal/replay@10.45.0': - resolution: {integrity: sha512-vjosRoGA1bzhVAEO1oce+CsRdd70quzBeo7WvYqpcUnoLe/Rv8qpOMqWX3j26z7XfFHMExWQNQeLxmtYOArvlw==} + '@sentry-internal/server-utils@10.56.0': + resolution: {integrity: sha512-6kuZI/vAjyVKMm1cTzc2pdUmVR4Px4etMG6wnCPyFnwEaGbUKQnTynUBFpTuo/q6Js6QBQvhLNoAnO4YsOfW4w==} engines: {node: '>=18'} - '@sentry/babel-plugin-component-annotate@5.1.1': - resolution: {integrity: sha512-x2wEpBHwsTyTF2rWsLKJlzrRF1TTIGOfX+ngdE+Yd5DBkoS58HwQv824QOviPGQRla4/ypISqAXzjdDPL/zalg==} + '@sentry/babel-plugin-component-annotate@5.3.0': + resolution: {integrity: sha512-p4q8gn8wcFqZGP/s2MnJCAAd8fTikaU6A0mM97RDHQgStcrYiaS0Sc5zUNfb1V+UOLPuvdEdL6MwyxfzjYJQTA==} engines: {node: '>= 18'} - '@sentry/browser@10.45.0': - resolution: {integrity: sha512-e/a8UMiQhqqv706McSIcG6XK+AoQf9INthi2pD+giZfNRTzXTdqHzUT5OIO5hg8Am6eF63nDJc+vrYNPhzs51Q==} + '@sentry/browser@10.56.0': + resolution: {integrity: sha512-80X3NmsGB6tLmfzXYdjzWWdVAdL5CRukGKLcRWIcNhgGjtskOmnzaGb93egEZGI5bUTbtONJ0oyscQ3Z9yoAtQ==} engines: {node: '>=18'} - '@sentry/bundler-plugin-core@5.1.1': - resolution: {integrity: sha512-F+itpwR9DyQR7gEkrXd2tigREPTvtF5lC8qu6e4anxXYRTui1+dVR0fXNwjpyAZMhIesLfXRN7WY7ggdj7hi0Q==} + '@sentry/bundler-plugin-core@5.3.0': + resolution: {integrity: sha512-L5T60sWdAI3qWwdg3Ptwek/0TY59PERrxyqp4XMUkroayQvGd9r5dIW9Q1kSeXX9iJ442nXbFZKAOyCKV4Z13Q==} engines: {node: '>= 18'} + '@sentry/bundler-plugins@10.75.0': + resolution: {integrity: sha512-kpMO7NhvfqsobpShyW/YnNJmJpw7mPEAQorJnEzf0ZRqNvEGFjKKN19SZWbbBNdcQDvHPlRIVOC00zdXuw3y/w==} + engines: {node: '>= 18'} + peerDependencies: + rollup: '>=3.2.0' + webpack: '>=5.0.0' + peerDependenciesMeta: + rollup: + optional: true + webpack: + optional: true + '@sentry/cli-darwin@2.58.5': resolution: {integrity: sha512-lYrNzenZFJftfwSya7gwrHGxtE+Kob/e1sr9lmHMFOd4utDlmq0XFDllmdZAMf21fxcPRI1GL28ejZ3bId01fQ==} engines: {node: '>=10'} os: [darwin] + '@sentry/cli-darwin@2.58.6': + resolution: {integrity: sha512-udAVvcyfNa0R+95GvPz/+43/N3TC0TYKdkQ7D7jhPSzbcMc7l2fxRNN5yB3UpCA5fWFnW4toeaqwDBhb/Wh3LA==} + engines: {node: '>=10'} + os: [darwin] + '@sentry/cli-linux-arm64@2.58.5': resolution: {integrity: sha512-/4gywFeBqRB6tR/iGMRAJ3HRqY6Z7Yp4l8ZCbl0TDLAfHNxu7schEw4tSnm2/Hh9eNMiOVy4z58uzAWlZXAYBQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux, freebsd, android] + '@sentry/cli-linux-arm64@2.58.6': + resolution: {integrity: sha512-q8mEcNNmeXMy5i+jWT30TVpH7LcP4HD21CD5XRSPAd/a912HF6EpK0ybf/1USO14WOhoXbAGi9txwaWabSe33g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux, freebsd, android] + '@sentry/cli-linux-arm@2.58.5': resolution: {integrity: sha512-KtHweSIomYL4WVDrBrYSYJricKAAzxUgX86kc6OnlikbyOhoK6Fy8Vs6vwd52P6dvWPjgrMpUYjW2M5pYXQDUw==} engines: {node: '>=10'} cpu: [arm] os: [linux, freebsd, android] + '@sentry/cli-linux-arm@2.58.6': + resolution: {integrity: sha512-pD0LAt5PcUzAinBwvDqc66x9+2CabHEv486yP0gRjWO7SakbaxmfVq/EXd8VLq/Tzi39LAu422UYK1lpW3MILw==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux, freebsd, android] + '@sentry/cli-linux-i686@2.58.5': resolution: {integrity: sha512-G7261dkmyxqlMdyvyP06b+RTIVzp1gZNgglj5UksxSouSUqRd/46W/2pQeOMPhloDYo9yLtCN2YFb3Mw4aUsWw==} engines: {node: '>=10'} cpu: [x86, ia32] os: [linux, freebsd, android] + '@sentry/cli-linux-i686@2.58.6': + resolution: {integrity: sha512-q8vNJi1eOV/4vxAFWBsEwLHoSYapaZHIf4j76KJGJXFKTkEbsjCOOsKbwUIBTQQhRgV4DFWh3ryfsPS/que4Kg==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [linux, freebsd, android] + '@sentry/cli-linux-x64@2.58.5': resolution: {integrity: sha512-rP04494RSmt86xChkQ+ecBNRYSPbyXc4u0IA7R7N1pSLCyO74e5w5Al+LnAq35cMfVbZgz5Sm0iGLjyiUu4I1g==} engines: {node: '>=10'} cpu: [x64] os: [linux, freebsd, android] + '@sentry/cli-linux-x64@2.58.6': + resolution: {integrity: sha512-DZu956Mhi3ZRjTBe1WdbGV46ldVbA8d2rgp/fh51GsI25zjBHah4wZnPTSzpc+YqxU6pJpg579B/r3jrIK530Q==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux, freebsd, android] + '@sentry/cli-win32-arm64@2.58.5': resolution: {integrity: sha512-AOJ2nCXlQL1KBaCzv38m3i2VmSHNurUpm7xVKd6yAHX+ZoVBI8VT0EgvwmtJR2TY2N2hNCC7UrgRmdUsQ152bA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] + '@sentry/cli-win32-arm64@2.58.6': + resolution: {integrity: sha512-nj0Ff/kmAB73EPDhR8B4O9r+NUHK5GkPCkGWC+kXVemqAJWL5jcJ5KdxG0l/S0z6RoEoltID8/43/B+TaMlT7A==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + '@sentry/cli-win32-i686@2.58.5': resolution: {integrity: sha512-EsuboLSOnlrN7MMPJ1eFvfMDm+BnzOaSWl8eYhNo8W/BIrmNgpRUdBwnWn9Q2UOjJj5ZopukmsiMYtU/D7ml9g==} engines: {node: '>=10'} cpu: [x86, ia32] os: [win32] + '@sentry/cli-win32-i686@2.58.6': + resolution: {integrity: sha512-WNZiDzPbgsEMQWq4avsQ391v/xWKJDIWWWo9GYl+N/w5qcYKkoDW7wQG7T9FasI6ENn68phChTOAPXXxbfAdOg==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [win32] + '@sentry/cli-win32-x64@2.58.5': resolution: {integrity: sha512-IZf+XIMiQwj+5NzqbOQfywlOitmCV424Vtf9c+ep61AaVScUFD1TSrQbOcJJv5xGxhlxNOMNgMeZhdexdzrKZg==} engines: {node: '>=10'} cpu: [x64] os: [win32] + '@sentry/cli-win32-x64@2.58.6': + resolution: {integrity: sha512-R35WJ17oF4D2eqI1DR2sQQqr0fjRTt5xoP16WrTu91XM2lndRMFsnjh+/GttbxapLCBNlrjzia99MJ0PZHZpgA==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + '@sentry/cli@2.58.5': resolution: {integrity: sha512-tavJ7yGUZV+z3Ct2/ZB6mg339i08sAk6HDkgqmSRuQEu2iLS5sl9HIvuXfM6xjv8fwlgFOSy++WNABNAcGHUbg==} engines: {node: '>= 10'} hasBin: true - '@sentry/core@10.45.0': - resolution: {integrity: sha512-s69UXxvefeQxuZ5nY7/THtTrIEvJxNVCp3ns4kwoCw1qMpgpvn/296WCKVmM7MiwnaAdzEKnAvLAwaxZc2nM7Q==} + '@sentry/cli@2.58.6': + resolution: {integrity: sha512-baBcNPLLfUi9WuL+Tpri9BFaAdvugZIKelC5X0tt0Zdy+K0K+PCVSrnNmwMWU/HyaF/SEv6b6UHnXIdqanBlcg==} + engines: {node: '>= 10'} + hasBin: true + + '@sentry/conventions@0.16.0': + resolution: {integrity: sha512-fO9PLmHdVURcSPUpWCItWAtgKiMwGdJHbovoSEyLplX5sxs2ugvI4CBPTrkkgqhObnZOD0CnWBKDzSVQYBKEyQ==} + engines: {node: '>=14'} + + '@sentry/core@10.56.0': + resolution: {integrity: sha512-L+u1dIz5SANrmST5jhIwETtt4apILgKrylv12X4hKJU0PvZl+NorjeV/ty3MwzpKQPg6b6q6qMOSLc1rLpy3iQ==} engines: {node: '>=18'} - '@sentry/nestjs@10.45.0': - resolution: {integrity: sha512-Puk5JNRdUMmOgN9MOcZeQ4jRR25C8R1AuujZXizBPA7iOmdesgpq3Pa6BZ5Hj4e/YZMd64D11MHEcUMINGMnRw==} + '@sentry/core@10.75.0': + resolution: {integrity: sha512-5wDQpQqjJ6RHdPR+z6Q+47XlwoxRKBv0yyB0LKHqL/1azPOQbR+nllyLmmQDcoJpaksuLSmLA1q6hFX7gjDT2w==} + engines: {node: '>=18'} + + '@sentry/nestjs@10.56.0': + resolution: {integrity: sha512-tlZ52SpfWe38nNi3o51kAmLV7V1PqEH7IomsxmFQAV1cpekpEG+55MILMoSvhRonBsPQUE9jI0q/cFTtP9Au4Q==} engines: {node: '>=18'} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 - '@sentry/nextjs@10.45.0': - resolution: {integrity: sha512-4LE+UvnfdOYyG8YEb/9TWaJQzMPuGLlph/iqowvsMdxaW6la+mvADiuzNTXly4QfsjeD3KIb7dKlGTqiVV0Ttw==} + '@sentry/nextjs@10.56.0': + resolution: {integrity: sha512-63zg6UawJwW4pE+rpVj+pqy08TsaQUEfYXLITNGBmPdk4ZO7mrosYeMZ+efI1LlCmaEu0/78M/kvzPIdk33SYA==} engines: {node: '>=18'} peerDependencies: next: 16.3.1 - '@sentry/node-core@10.45.0': - resolution: {integrity: sha512-KQZEvLKM344+EqXiA9HIzWbW5hzq6/9nnFUQ8niaBPoOgR9AiJhrccfIscfgb8vjkriiEtzE03OW/4h1CTgZ3Q==} + '@sentry/node-core@10.56.0': + resolution: {integrity: sha512-61lD2Wjtv5Lw2F3lJarcD0ORjR4GlVxrEd6w6Of/uF3DH73dD6K3n/3wXEeCIRfV/kgiCFIrCIq76nz0LVgE5g==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 '@opentelemetry/core': ^1.30.1 || ^2.1.0 + '@opentelemetry/exporter-trace-otlp-http': '>=0.57.0 <1' '@opentelemetry/instrumentation': '>=0.57.1 <1' - '@opentelemetry/resources': ^1.30.1 || ^2.1.0 '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 '@opentelemetry/semantic-conventions': ^1.39.0 peerDependenciesMeta: '@opentelemetry/api': optional: true - '@opentelemetry/context-async-hooks': - optional: true '@opentelemetry/core': optional: true - '@opentelemetry/instrumentation': + '@opentelemetry/exporter-trace-otlp-http': optional: true - '@opentelemetry/resources': + '@opentelemetry/instrumentation': optional: true '@opentelemetry/sdk-trace-base': optional: true '@opentelemetry/semantic-conventions': optional: true - '@sentry/node@10.45.0': - resolution: {integrity: sha512-Kpiq9lRGnJc1ex8SwxOBl+FLQNl4Y137BydVooP7AFiAYZ6ftwHsIEF1bcYXaipHMT1YHS2bdhC2UQaaB2jkuQ==} + '@sentry/node@10.56.0': + resolution: {integrity: sha512-qvgtXHkcR4CH3fh0VEVyw4Ysc6MMiAnm727NdTTm0yU5e53erCeo2521+yfJkqmRTGiOSgwA7B5Bs+ot9j0vFQ==} engines: {node: '>=18'} - '@sentry/opentelemetry@10.45.0': - resolution: {integrity: sha512-PmuGO+p/gC3ZQ8ddOeJ5P9ApnTTm35i12Bpuyb13AckCbNSJFvG2ggZda35JQOmiFU0kKYiwkoFAa8Mvj9od3Q==} + '@sentry/opentelemetry@10.56.0': + resolution: {integrity: sha512-PtMudApHMHvttjos3b7JZ2gJ+nstHAOYE3vKPYB5o0WQO95ldiaYnpLKMCRIGZWF3Dk7ynrqqnBpn8LZLt+Mrg==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 '@opentelemetry/core': ^1.30.1 || ^2.1.0 '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 '@opentelemetry/semantic-conventions': ^1.39.0 - '@sentry/profiling-node@10.45.0': - resolution: {integrity: sha512-O1wgw4NuVRZ1c3kbjwZyZoT+iylgWsldgDZA8jhFBNRRJv7XbzJ3NVji5Ksw3W2uRNUrTfFJNC9UV3brqWom8g==} + '@sentry/profiling-node@10.56.0': + resolution: {integrity: sha512-AmcUrvqJcvl39fNzoXBCPp8iGStRSmpBYqQCPz1mlDUw/n/iWpLq5+8iHecXyT5oOST4xHjNIyb7AA/fj0Pxzw==} engines: {node: '>=18'} hasBin: true - '@sentry/react@10.45.0': - resolution: {integrity: sha512-jLezuxi4BUIU3raKyAPR5xMbQG/nhwnWmKo5p11NCbLmWzkS+lxoyDTUB4B8TAKZLfdtdkKLOn1S0tFc8vbUHw==} + '@sentry/react@10.56.0': + resolution: {integrity: sha512-HfPLyvnrydfyjRXw9Q0GMzj7w2YtEwuC9z5RrPUfarA2qpA0/J8cfGLzyFX2v0jBmA/kkj6J1uBUoSVhCTxFHg==} engines: {node: '>=18'} peerDependencies: react: 19.2.4 - '@sentry/vercel-edge@10.45.0': - resolution: {integrity: sha512-sSF+Ex5NwT60gMinLcP/JNZb3cDaIv0mL1cRjfvN6zN2ZNEw0C9rhdgxa0EdD4G6PCHQ0XnCuAMDsfJ6gnRmfA==} + '@sentry/vercel-edge@10.56.0': + resolution: {integrity: sha512-2e5rtVjLpIVYKssFcTuKsNWYJeLAnNsQCcq7Mscw1rQal5UdBgxwclw7K2SN+QHDZlKradRBdhwOU0svENOnQw==} engines: {node: '>=18'} - '@sentry/webpack-plugin@5.1.1': - resolution: {integrity: sha512-XgQg+t2aVrlQDfIiAEizqR/bsy6GtBygwgR+Kw11P/cYczj4W9PZ2IYqQEStBzHqnRTh5DbpyMcUNW2CujdA9A==} + '@sentry/webpack-plugin@5.4.0': + resolution: {integrity: sha512-J3a0BvUZ75Qxy+v/Ap3Hx4ZEcSjlPHZ/jDtxdRhXQCyNeEb8xq0uUBTI9VLtGk2eNeNucOxOEJ5ngqdNjnEH/A==} engines: {node: '>= 18'} peerDependencies: webpack: '>=5.0.0' @@ -9301,9 +9233,6 @@ packages: '@types/pg-pool@2.0.6': resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} - '@types/pg-pool@2.0.7': - resolution: {integrity: sha512-U4CwmGVQcbEuqpyju8/ptOKg6gEC+Tqsvj2xS9o1g71bUh8twxnC6ZL5rZKCsGN0iyH0CwgUyc9VR5owNQF9Ng==} - '@types/pg@8.15.5': resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} @@ -11946,6 +11875,10 @@ packages: resolution: {integrity: sha512-kCKF62fwtzwYm0IGBNjRUjtJgMfGapII+FslMHIjMR5KTnwEmBmWLDRSnc3XSNP8bNy34tekgQyDT0hr7pERRQ==} engines: {node: '>=12'} + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + draggabilly@3.0.0: resolution: {integrity: sha512-aEs+B6prbMZQMxc9lgTpCBfyCUhRur/VFucHhIOvlvvdARTj7TcDmX/cdOUtqbjJJUh7+agyJXR5Z6IFe1MxwQ==} @@ -12306,8 +12239,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true @@ -13527,9 +13460,6 @@ packages: import-in-the-middle@1.15.0: resolution: {integrity: sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==} - import-in-the-middle@2.0.6: - resolution: {integrity: sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==} - import-in-the-middle@3.0.0: resolution: {integrity: sha512-OnGy+eYT7wVejH2XWgLRgbmzujhhVIATQH0ztIeRilwHBjTeG3pD+XnH3PKX0r9gJ0BuJmJ68q/oh9qgXnNDQg==} engines: {node: '>=18'} @@ -14175,9 +14105,10 @@ packages: jsc-safe-url@0.2.4: resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} - jschardet@3.1.4: - resolution: {integrity: sha512-/kmVISmrwVwtyYU40iQUOp3SUPk2dhNCMsZBQX0R1/jZ8maaXJ/oZIzUOiyOqcgtLnETFKYChbJ5iDC/eWmFHg==} - engines: {node: '>=0.1.90'} + jschardet@4.0.0: + resolution: {integrity: sha512-EsNiLV+xzeMBtkGL/HeWoUivNkGIr8JmaC5A5j7DBlKnhp4CcBTWKEOtNg6vlmf+mkn9yQ9Wals47u7+LoTr7w==} + engines: {node: '>=20'} + hasBin: true jsdom@20.0.3: resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} @@ -14768,10 +14699,14 @@ packages: peerDependencies: react: 19.2.4 - lucide-react@1.47.0: - resolution: {integrity: sha512-o8C23aXpNQypRY73W7fW02EyvWJinEMXgKeGjFoKym0zj3Q73hD97A1IQps1g8C14HTGsOpZL0Am+xjfgFZAbg==} + lucide-react@1.50.0: + resolution: {integrity: sha512-RqHPQtKX6S9IE1xOL4oTHHsVQbcwJWTnmlxI6AdI9IpOwKiy7q+COPCQyMepI/Qu1x3h7sunpyEMvqtgFbgNiQ==} peerDependencies: + '@types/react': 19.1.8 react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true lucide@0.525.0: resolution: {integrity: sha512-sfehWlaE/7NVkcEQ4T9JD3eID8RNMIGJBBUq9wF3UFiJIrcMKRbU3g1KGfDk4svcW7yw8BtDLXaXo02scDtUYQ==} @@ -16084,9 +16019,6 @@ packages: peerDependencies: pg: '>=8.0' - pg-protocol@1.13.0: - resolution: {integrity: sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==} - pg-protocol@1.16.0: resolution: {integrity: sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==} @@ -18520,10 +18452,6 @@ packages: resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} engines: {node: '>=20.18.1'} - undici@7.29.0: - resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} - engines: {node: '>=20.18.1'} - unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -19464,6 +19392,9 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.6.5: resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} @@ -19562,14 +19493,14 @@ snapshots: '@ag-ui/core': 0.0.59 '@ag-ui/proto': 0.0.59 - '@ag-ui/langgraph@0.0.43(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + '@ag-ui/langgraph@0.0.43(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': dependencies: '@ag-ui/a2ui-toolkit': 0.0.4 '@ag-ui/client': 0.0.59 '@ag-ui/core': 0.0.59 - '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - '@langchain/langgraph-sdk': 1.8.8(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - langchain: 1.5.11(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/langgraph-sdk': 1.8.8(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + langchain: 1.5.11(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) partial-json: 0.1.7 rxjs: 7.8.1 transitivePeerDependencies: @@ -19583,13 +19514,13 @@ snapshots: - vue - ws - '@ag-ui/mastra@1.1.4(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@copilotkit/runtime@1.72.0(060090e105863d9983aa04d300df3d3a))(@mastra/client-js@0.15.2(openapi-types@12.1.3)(react@19.2.4)(zod@3.25.76))(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76))': + '@ag-ui/mastra@1.1.4(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@copilotkit/runtime@1.72.0(d8db588a33556e4390c2c1ec6b88e6cc))(@mastra/client-js@0.15.2(openapi-types@12.1.3)(react@19.2.4)(zod@3.25.76))(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: '@ag-ui/a2ui-toolkit': 0.0.4 '@ag-ui/client': 0.0.59 '@ag-ui/core': 0.0.59 '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) - '@copilotkit/runtime': 1.72.0(060090e105863d9983aa04d300df3d3a) + '@copilotkit/runtime': 1.72.0(d8db588a33556e4390c2c1ec6b88e6cc) '@mastra/client-js': 0.15.2(openapi-types@12.1.3)(react@19.2.4)(zod@3.25.76) '@mastra/core': 1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76) fast-json-patch: 3.1.1 @@ -19894,7 +19825,7 @@ snapshots: dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 - js-yaml: 4.3.2 + js-yaml: 4.1.1 '@asamuzakjp/css-color@5.1.11': dependencies: @@ -22018,13 +21949,13 @@ snapshots: - encoding - graphql - '@copilotkit/runtime@1.72.0(060090e105863d9983aa04d300df3d3a)': + '@copilotkit/runtime@1.72.0(d8db588a33556e4390c2c1ec6b88e6cc)': dependencies: '@ag-ui/a2ui-middleware': 0.0.10(@ag-ui/client@0.0.59)(rxjs@7.8.1) '@ag-ui/client': 0.0.59 '@ag-ui/core': 0.0.59 '@ag-ui/encoder': 0.0.59 - '@ag-ui/langgraph': 0.0.43(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@ag-ui/langgraph': 0.0.43(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) '@ag-ui/mcp-apps-middleware': 0.1.1(@ag-ui/client@0.0.59)(@cfworker/json-schema@4.1.1)(rxjs@7.8.1)(zod@3.25.76) '@ag-ui/mcp-middleware': 0.0.2(@ag-ui/client@0.0.59)(@cfworker/json-schema@4.1.1)(rxjs@7.8.1)(zod@3.25.76) '@ai-sdk/anthropic': 3.0.118(zod@3.25.76) @@ -22039,7 +21970,7 @@ snapshots: '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) '@graphql-yoga/plugin-defer-stream': 3.18.0(graphql-yoga@5.18.0(graphql@16.13.1))(graphql@16.13.1) '@hono/node-server': 1.19.11(hono@4.12.10) - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) '@remix-run/node-fetch-server': 0.13.3 '@scarf/scarf': 1.4.0 @@ -22068,13 +21999,13 @@ snapshots: zod: 3.25.76 optionalDependencies: '@anthropic-ai/sdk': 0.57.0 - '@langchain/aws': 0.1.15(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) - '@langchain/community': 1.1.27(66046857593e81cf94589e5d63e1e984) - '@langchain/google-gauth': 0.1.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(zod@3.25.76) - '@langchain/langgraph-sdk': 1.11.0(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@langchain/openai': 1.4.3(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/aws': 0.1.15(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) + '@langchain/community': 1.1.27(cbe060cf4b5645a3ea17665610df96e8) + '@langchain/google-gauth': 0.1.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(zod@3.25.76) + '@langchain/langgraph-sdk': 1.11.0(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@langchain/openai': 1.4.3(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) groq-sdk: 0.5.0 - langchain: 1.5.11(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + langchain: 1.5.11(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) openai: 6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) transitivePeerDependencies: - '@microsoft/agents-activity' @@ -22576,9 +22507,9 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.9.1(eslint@8.57.0)': dependencies: - eslint: 8.57.1 + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 '@eslint-community/eslint-utils@4.9.1(eslint@9.39.5(jiti@2.6.1))': @@ -22612,7 +22543,7 @@ snapshots: globals: 13.24.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.3.2 + js-yaml: 4.1.1 minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -22632,7 +22563,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} + '@eslint/js@8.57.0': {} '@eslint/js@9.39.5': {} @@ -22698,16 +22629,6 @@ snapshots: '@fastify/busboy@3.2.0': {} - '@fastify/otel@0.17.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - minimatch: 10.2.4 - transitivePeerDependencies: - - supports-color - '@floating-ui/core@1.7.5': dependencies: '@floating-ui/utils': 0.2.11 @@ -22890,7 +22811,7 @@ snapshots: '@humanfs/types@0.15.0': {} - '@humanwhocodes/config-array@0.13.0': + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.4.3(supports-color@5.5.0) @@ -23684,22 +23605,22 @@ snapshots: '@kurkle/color@0.3.4': {} - '@langchain/aws@0.1.15(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': + '@langchain/aws@0.1.15(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': dependencies: '@aws-sdk/client-bedrock-agent-runtime': 3.1003.0 '@aws-sdk/client-bedrock-runtime': 3.1003.0 '@aws-sdk/client-kendra': 3.1003.0 '@aws-sdk/credential-provider-node': 3.972.17 - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) transitivePeerDependencies: - aws-crt optional: true - '@langchain/classic@1.0.27(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(cheerio@1.2.0)(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + '@langchain/classic@1.0.27(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(cheerio@1.2.0)(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': dependencies: - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - '@langchain/openai': 1.4.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - '@langchain/textsplitters': 1.0.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/openai': 1.4.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/textsplitters': 1.0.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) handlebars: 4.7.9 js-yaml: 4.1.1 jsonpointer: 5.0.1 @@ -23709,7 +23630,7 @@ snapshots: zod: 3.25.76 optionalDependencies: cheerio: 1.2.0 - langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/exporter-trace-otlp-proto' @@ -23717,18 +23638,18 @@ snapshots: - openai - ws - '@langchain/community@1.1.27(66046857593e81cf94589e5d63e1e984)': + '@langchain/community@1.1.27(cbe060cf4b5645a3ea17665610df96e8)': dependencies: '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.58.2)(bufferutil@4.1.0)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(utf-8-validate@5.0.10)(zod@3.25.76) '@ibm-cloud/watsonx-ai': 1.7.9 - '@langchain/classic': 1.0.27(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(cheerio@1.2.0)(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - '@langchain/openai': 1.4.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/classic': 1.0.27(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(cheerio@1.2.0)(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/openai': 1.4.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) binary-extensions: 2.3.0 flat: 5.0.2 ibm-cloud-sdk-core: 5.4.8 js-yaml: 4.1.1 - langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) math-expression-evaluator: 2.0.7 openai: 6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) uuid: 10.0.0 @@ -23765,7 +23686,7 @@ snapshots: - '@opentelemetry/sdk-trace-base' - peggy - '@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + '@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': dependencies: '@cfworker/json-schema': 4.1.1 '@standard-schema/spec': 1.1.0 @@ -23773,7 +23694,7 @@ snapshots: camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.21 - langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) mustache: 4.2.0 p-queue: 6.6.2 uuid: 11.1.0 @@ -23785,12 +23706,12 @@ snapshots: - openai - ws - '@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + '@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': dependencies: '@cfworker/json-schema': 4.1.1 '@standard-schema/spec': 1.1.0 js-tiktoken: 1.0.21 - langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) mustache: 4.2.0 p-queue: 6.6.2 zod: 3.25.76 @@ -23801,19 +23722,19 @@ snapshots: - openai - ws - '@langchain/google-common@0.1.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(zod@3.25.76)': + '@langchain/google-common@0.1.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(zod@3.25.76)': dependencies: - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) uuid: 10.0.0 zod-to-json-schema: 3.25.2(zod@3.25.76) transitivePeerDependencies: - zod optional: true - '@langchain/google-gauth@0.1.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(zod@3.25.76)': + '@langchain/google-gauth@0.1.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(zod@3.25.76)': dependencies: - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - '@langchain/google-common': 0.1.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(zod@3.25.76) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/google-common': 0.1.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(zod@3.25.76) google-auth-library: 8.9.0 transitivePeerDependencies: - encoding @@ -23821,23 +23742,23 @@ snapshots: - zod optional: true - '@langchain/langgraph-checkpoint@1.0.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': + '@langchain/langgraph-checkpoint@1.0.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': dependencies: - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) uuid: 10.0.0 - '@langchain/langgraph-checkpoint@1.1.5(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': + '@langchain/langgraph-checkpoint@1.1.5(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': dependencies: - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) optional: true - '@langchain/langgraph-checkpoint@1.1.5(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': + '@langchain/langgraph-checkpoint@1.1.5(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': dependencies: - '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - '@langchain/langgraph-sdk@1.11.0(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@langchain/langgraph-sdk@1.11.0(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) '@langchain/protocol': 0.0.19 '@types/json-schema': 7.0.15 p-queue: 9.1.2 @@ -23847,9 +23768,9 @@ snapshots: react-dom: 19.2.4(react@19.2.4) optional: true - '@langchain/langgraph-sdk@1.11.0(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@langchain/langgraph-sdk@1.11.0(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) '@langchain/protocol': 0.0.19 '@types/json-schema': 7.0.15 p-queue: 9.1.2 @@ -23858,33 +23779,33 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@langchain/langgraph-sdk@1.8.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@langchain/langgraph-sdk@1.8.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@types/json-schema': 7.0.15 p-queue: 9.1.2 p-retry: 7.1.1 uuid: 13.0.0 optionalDependencies: - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@langchain/langgraph-sdk@1.8.8(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@langchain/langgraph-sdk@1.8.8(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@types/json-schema': 7.0.15 p-queue: 9.1.2 p-retry: 7.1.1 uuid: 13.0.0 optionalDependencies: - '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@langchain/langgraph@1.2.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.2(zod@3.25.76))(zod@3.25.76)': + '@langchain/langgraph@1.2.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.2(zod@3.25.76))(zod@3.25.76)': dependencies: - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - '@langchain/langgraph-checkpoint': 1.0.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) - '@langchain/langgraph-sdk': 1.8.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/langgraph-checkpoint': 1.0.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) + '@langchain/langgraph-sdk': 1.8.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@standard-schema/spec': 1.1.0 uuid: 10.0.0 zod: 3.25.76 @@ -23896,11 +23817,11 @@ snapshots: - svelte - vue - '@langchain/langgraph@1.4.15(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': + '@langchain/langgraph@1.4.15(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': dependencies: - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - '@langchain/langgraph-checkpoint': 1.1.5(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) - '@langchain/langgraph-sdk': 1.11.0(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/langgraph-checkpoint': 1.1.5(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) + '@langchain/langgraph-sdk': 1.11.0(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@langchain/protocol': 0.0.19 '@standard-schema/spec': 1.1.0 zod: 3.25.76 @@ -23909,11 +23830,11 @@ snapshots: - react-dom optional: true - '@langchain/langgraph@1.4.15(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': + '@langchain/langgraph@1.4.15(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': dependencies: - '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - '@langchain/langgraph-checkpoint': 1.1.5(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))) - '@langchain/langgraph-sdk': 1.11.0(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/langgraph-checkpoint': 1.1.5(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))) + '@langchain/langgraph-sdk': 1.11.0(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@langchain/protocol': 0.0.19 '@standard-schema/spec': 1.1.0 zod: 3.25.76 @@ -23921,18 +23842,18 @@ snapshots: - react - react-dom - '@langchain/openai@1.4.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + '@langchain/openai@1.4.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': dependencies: - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) js-tiktoken: 1.0.21 openai: 6.34.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - ws - '@langchain/openai@1.4.3(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + '@langchain/openai@1.4.3(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': dependencies: - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) js-tiktoken: 1.0.21 openai: 6.34.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) zod: 3.25.76 @@ -23941,14 +23862,14 @@ snapshots: '@langchain/protocol@0.0.19': {} - '@langchain/tavily@1.2.0(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': + '@langchain/tavily@1.2.0(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': dependencies: - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) zod: 3.25.76 - '@langchain/textsplitters@1.0.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': + '@langchain/textsplitters@1.0.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': dependencies: - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) js-tiktoken: 1.0.21 '@ledgerhq/devices@8.10.0': @@ -24091,18 +24012,18 @@ snapshots: '@isaacs/ttlcache': 1.4.1 '@mastra/schema-compat': 0.11.4(ai@4.3.19(react@19.2.4)(zod@3.25.76))(zod@3.25.76) '@openrouter/ai-sdk-provider-v5': '@openrouter/ai-sdk-provider@1.2.0(ai@4.3.19(react@19.2.4)(zod@3.25.76))(zod@3.25.76)' - '@opentelemetry/api': 1.9.0 - '@opentelemetry/auto-instrumentations-node': 0.62.2(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0)) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/auto-instrumentations-node': 0.62.2(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.0)) + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-http': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.6.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-node': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-node': 2.6.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 '@sindresorhus/slugify': 2.2.1 ai: 4.3.19(react@19.2.4)(zod@3.25.76) @@ -24313,8 +24234,8 @@ snapshots: '@microsoft/eslint-formatter-sarif@3.1.0': dependencies: - eslint: 8.57.1 - jschardet: 3.1.4 + eslint: 8.57.0 + jschardet: 4.0.0 lodash: 4.18.1 utf8: 3.0.0 transitivePeerDependencies: @@ -24330,11 +24251,11 @@ snapshots: eventsource-parser: 3.0.6 jose: 6.2.0 pkce-challenge: 5.0.1 - zod: 4.6.5 + zod: 4.3.6 '@modelcontextprotocol/core@2.0.0': dependencies: - zod: 4.6.5 + zod: 4.3.6 '@modelcontextprotocol/ext-apps@1.7.5(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': dependencies: @@ -24408,14 +24329,14 @@ snapshots: express-rate-limit: 8.3.0(express@5.2.1) pkce-challenge: 5.0.1 raw-body: 3.0.2 - zod: 4.6.5 + zod: 4.3.6 optionalDependencies: express: 5.2.1 '@modelcontextprotocol/server@2.0.0': dependencies: '@modelcontextprotocol/core': 2.0.0 - zod: 4.6.5 + zod: 4.3.6 '@mole-inc/bin-wrapper@8.0.1': dependencies: @@ -25013,94 +24934,99 @@ snapshots: '@opentelemetry/api-logs@0.203.0': dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/api-logs@0.207.0': - dependencies: - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 '@opentelemetry/api-logs@0.208.0': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs@0.212.0': + '@opentelemetry/api-logs@0.214.0': dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/api-logs@0.213.0': - dependencies: - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 '@opentelemetry/api@1.9.0': {} - '@opentelemetry/auto-instrumentations-node@0.62.2(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-amqplib': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-aws-lambda': 0.54.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-aws-sdk': 0.58.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-bunyan': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-cassandra-driver': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-connect': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-cucumber': 0.19.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dataloader': 0.21.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dns': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-express': 0.52.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fastify': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fs': 0.23.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-generic-pool': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-graphql': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-grpc': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-hapi': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-ioredis': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-kafkajs': 0.13.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-knex': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-koa': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-lru-memoizer': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-memcached': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongodb': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongoose': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql2': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-nestjs-core': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-net': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-oracledb': 0.29.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pg': 0.56.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pino': 0.50.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-redis': 0.52.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-restify': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-router': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-runtime-node': 0.17.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-socket.io': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-tedious': 0.22.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-undici': 0.14.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-winston': 0.48.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-alibaba-cloud': 0.31.11(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-aws': 2.13.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-azure': 0.10.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-container': 0.7.11(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-gcp': 0.37.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api@1.9.1': {} + + '@opentelemetry/auto-instrumentations-node@0.62.2(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.0))': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-amqplib': 0.50.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-aws-lambda': 0.54.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-aws-sdk': 0.58.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-bunyan': 0.49.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-cassandra-driver': 0.49.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-connect': 0.47.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-cucumber': 0.19.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-dataloader': 0.21.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-dns': 0.47.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-express': 0.52.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-fastify': 0.48.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-fs': 0.23.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-generic-pool': 0.47.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-graphql': 0.51.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-grpc': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-hapi': 0.50.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-http': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-ioredis': 0.51.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-kafkajs': 0.13.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-knex': 0.48.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-koa': 0.51.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-lru-memoizer': 0.48.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-memcached': 0.47.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-mongodb': 0.56.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-mongoose': 0.50.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-mysql': 0.49.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-mysql2': 0.50.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-nestjs-core': 0.49.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-net': 0.47.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-oracledb': 0.29.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-pg': 0.56.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-pino': 0.50.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-redis': 0.52.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-restify': 0.49.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-router': 0.48.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-runtime-node': 0.17.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-socket.io': 0.50.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-tedious': 0.22.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-undici': 0.14.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-winston': 0.48.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resource-detector-alibaba-cloud': 0.31.11(@opentelemetry/api@1.9.1) + '@opentelemetry/resource-detector-aws': 2.13.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resource-detector-azure': 0.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resource-detector-container': 0.7.11(@opentelemetry/api@1.9.1) + '@opentelemetry/resource-detector-gcp': 0.37.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-node': 0.203.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - encoding - supports-color - '@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 - '@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 '@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.40.0 + optional: true + + '@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.40.0 + + '@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0)': dependencies: @@ -25112,24 +25038,29 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/exporter-logs-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.40.0 + + '@opentelemetry/exporter-logs-otlp-grpc@0.203.0(@opentelemetry/api@1.9.1)': dependencies: '@grpc/grpc-js': 1.14.3 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-logs-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-logs-otlp-http@0.203.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/exporter-logs-otlp-http@0.208.0(@opentelemetry/api@1.9.0)': dependencies: @@ -25140,65 +25071,65 @@ snapshots: '@opentelemetry/otlp-transformer': 0.208.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-logs': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-logs-otlp-proto@0.203.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-metrics-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-metrics-otlp-grpc@0.203.0(@opentelemetry/api@1.9.1)': dependencies: '@grpc/grpc-js': 1.14.3 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-metrics-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-metrics-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-prometheus@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-trace-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-metrics-otlp-http@0.203.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-metrics-otlp-proto@0.203.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-prometheus@0.203.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-trace-otlp-grpc@0.203.0(@opentelemetry/api@1.9.1)': dependencies: '@grpc/grpc-js': 1.14.3 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.1) '@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -25208,6 +25139,16 @@ snapshots: '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + optional: true + + '@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.1) '@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -25217,585 +25158,378 @@ snapshots: '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + optional: true - '@opentelemetry/exporter-zipkin@2.0.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-amqplib@0.50.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-zipkin@2.0.1(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-amqplib@0.60.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-amqplib@0.50.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-aws-lambda@0.54.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-aws-lambda@0.54.1(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 '@types/aws-lambda': 8.10.152 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-aws-sdk@0.58.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-aws-sdk@0.58.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-bunyan@0.49.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-bunyan@0.49.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@types/bunyan': 1.8.11 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-cassandra-driver@0.49.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-connect@0.47.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-cassandra-driver@0.49.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 - '@types/connect': 3.4.38 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-connect@0.56.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-connect@0.47.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 '@types/connect': 3.4.38 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-cucumber@0.19.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-cucumber@0.19.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-dataloader@0.21.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-dataloader@0.21.1(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-dataloader@0.30.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-dns@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-express@0.52.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-dns@0.47.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-express@0.61.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-express@0.52.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-fastify@0.48.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-fastify@0.48.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-fs@0.23.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-fs@0.32.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-generic-pool@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-generic-pool@0.56.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-fs@0.23.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-graphql@0.51.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-generic-pool@0.47.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-graphql@0.61.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-graphql@0.51.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-grpc@0.203.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-grpc@0.203.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-hapi@0.50.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-hapi@0.50.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-hapi@0.59.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-http@0.203.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-http@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 forwarded-parse: 2.1.2 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-http@0.213.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-ioredis@0.51.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - forwarded-parse: 2.1.2 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-ioredis@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/redis-common': 0.38.2 '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-ioredis@0.61.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-kafkajs@0.13.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-kafkajs@0.13.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-kafkajs@0.22.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-knex@0.48.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-knex@0.48.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-koa@0.51.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-knex@0.57.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-lru-memoizer@0.48.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-koa@0.51.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-memcached@0.47.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-koa@0.61.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-lru-memoizer@0.48.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-lru-memoizer@0.57.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-memcached@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 '@types/memcached': 2.2.10 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mongodb@0.56.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mongodb@0.66.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mongoose@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mongoose@0.59.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mysql2@0.50.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-mongodb@0.56.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mysql2@0.59.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-mongoose@0.50.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mysql@0.49.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-mysql2@0.50.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 - '@types/mysql': 2.15.27 + '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mysql@0.59.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-mysql@0.49.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 '@types/mysql': 2.15.27 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-nestjs-core@0.49.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-nestjs-core@0.49.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-nestjs-core@0.59.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-net@0.47.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-net@0.47.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-oracledb@0.29.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-oracledb@0.29.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 '@types/oracledb': 6.5.2 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-pg@0.56.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-pg@0.56.1(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) + '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.1) '@types/pg': 8.15.5 '@types/pg-pool': 2.0.6 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-pg@0.65.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-pino@0.50.1(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) - '@types/pg': 8.15.6 - '@types/pg-pool': 2.0.7 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-pino@0.50.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-redis@0.52.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-redis@0.52.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-redis@0.61.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/redis-common': 0.38.2 '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-restify@0.49.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-restify@0.49.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-router@0.48.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-router@0.48.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-runtime-node@0.17.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-runtime-node@0.17.1(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-socket.io@0.50.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-socket.io@0.50.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-tedious@0.22.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-tedious@0.22.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 '@types/tedious': 4.0.14 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-tedious@0.32.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-undici@0.14.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@types/tedious': 4.0.14 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-undici@0.14.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-winston@0.48.1(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-undici@0.23.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-winston@0.48.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 '@opentelemetry/api-logs': 0.203.0 import-in-the-middle: 1.15.0 require-in-the-middle: 7.5.2 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.207.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.207.0 - import-in-the-middle: 2.0.6 - require-in-the-middle: 8.0.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation@0.212.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.212.0 - import-in-the-middle: 2.0.6 - require-in-the-middle: 8.0.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation@0.213.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.213.0 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.214.0 import-in-the-middle: 3.0.0 require-in-the-middle: 8.0.1 transitivePeerDependencies: @@ -25806,6 +25540,13 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + optional: true + + '@opentelemetry/otlp-exporter-base@0.203.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/otlp-exporter-base@0.208.0(@opentelemetry/api@1.9.0)': dependencies: @@ -25813,13 +25554,13 @@ snapshots: '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-transformer': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base@0.203.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/otlp-grpc-exporter-base@0.203.0(@opentelemetry/api@1.9.1)': dependencies: '@grpc/grpc-js': 1.14.3 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.1) '@opentelemetry/otlp-transformer@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -25831,6 +25572,18 @@ snapshots: '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) protobufjs: 7.5.4 + optional: true + + '@opentelemetry/otlp-transformer@0.203.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.1) + protobufjs: 7.5.4 '@opentelemetry/otlp-transformer@0.208.0(@opentelemetry/api@1.9.0)': dependencies: @@ -25843,49 +25596,49 @@ snapshots: '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) protobufjs: 7.5.4 - '@opentelemetry/propagator-b3@2.0.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/propagator-b3@2.0.1(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/propagator-jaeger@2.0.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/propagator-jaeger@2.0.1(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) '@opentelemetry/redis-common@0.38.2': {} - '@opentelemetry/resource-detector-alibaba-cloud@0.31.11(@opentelemetry/api@1.9.0)': + '@opentelemetry/resource-detector-alibaba-cloud@0.31.11(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resource-detector-aws@2.13.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/resource-detector-aws@2.13.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/resource-detector-azure@0.10.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/resource-detector-azure@0.10.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/resource-detector-container@0.7.11(@opentelemetry/api@1.9.0)': + '@opentelemetry/resource-detector-container@0.7.11(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resource-detector-gcp@0.37.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/resource-detector-gcp@0.37.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 gcp-metadata: 6.1.1 transitivePeerDependencies: @@ -25897,6 +25650,19 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 + optional: true + + '@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 + + '@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0)': dependencies: @@ -25910,12 +25676,26 @@ snapshots: '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.203.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + optional: true + + '@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0)': dependencies: @@ -25929,6 +25709,13 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + optional: true + + '@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0)': dependencies: @@ -25936,36 +25723,36 @@ snapshots: '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics@2.6.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-metrics@2.6.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-node@0.203.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-node@0.203.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-prometheus': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-zipkin': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-b3': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-jaeger': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-logs-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-logs-otlp-http': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-logs-otlp-proto': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-proto': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-prometheus': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-http': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-proto': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-zipkin': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/propagator-b3': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/propagator-jaeger': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -25976,6 +25763,22 @@ snapshots: '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 + optional: true + + '@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 + + '@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0)': dependencies: @@ -25984,33 +25787,40 @@ snapshots: '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/context-async-hooks': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace-node@2.6.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-trace-node@2.6.0(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/sdk-trace@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/semantic-conventions@1.40.0': {} - '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) '@optimize-lodash/rollup-plugin@5.1.0(rollup@4.63.3)': dependencies: @@ -26261,8 +26071,8 @@ snapshots: '@prisma/config@6.5.0': dependencies: - esbuild: 0.28.2 - esbuild-register: 3.6.0(esbuild@0.28.2) + esbuild: 0.27.3 + esbuild-register: 3.6.0(esbuild@0.27.3) transitivePeerDependencies: - supports-color @@ -26287,13 +26097,6 @@ snapshots: dependencies: '@prisma/debug': 6.5.0 - '@prisma/instrumentation@7.4.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.207.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - '@project-serum/sol-wallet-adapter@0.2.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) @@ -27366,9 +27169,9 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} - '@rollup/plugin-commonjs@28.0.1(rollup@4.59.0)': + '@rollup/plugin-commonjs@28.0.1(rollup@4.63.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@rollup/pluginutils': 5.3.0(rollup@4.63.3) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.5) @@ -27376,7 +27179,7 @@ snapshots: magic-string: 0.30.21 picomatch: 4.0.5 optionalDependencies: - rollup: 4.59.0 + rollup: 4.63.3 '@rollup/plugin-commonjs@29.0.2(rollup@4.63.3)': dependencies: @@ -27417,14 +27220,6 @@ snapshots: optionalDependencies: rollup: 4.63.3 - '@rollup/pluginutils@5.3.0(rollup@4.59.0)': - dependencies: - '@types/estree': 1.0.9 - estree-walker: 2.0.2 - picomatch: 4.0.5 - optionalDependencies: - rollup: 4.59.0 - '@rollup/pluginutils@5.3.0(rollup@4.63.3)': dependencies: '@types/estree': 1.0.9 @@ -27667,43 +27462,47 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 - '@sentry-internal/browser-utils@10.45.0': + '@sentry-internal/browser-utils@10.56.0': dependencies: - '@sentry/core': 10.45.0 + '@sentry/core': 10.56.0 - '@sentry-internal/feedback@10.45.0': + '@sentry-internal/feedback@10.56.0': dependencies: - '@sentry/core': 10.45.0 + '@sentry/core': 10.56.0 - '@sentry-internal/node-cpu-profiler@2.2.0': + '@sentry-internal/node-cpu-profiler@2.4.1': dependencies: detect-libc: 2.1.2 node-abi: 3.87.0 - '@sentry-internal/replay-canvas@10.45.0': + '@sentry-internal/replay-canvas@10.56.0': dependencies: - '@sentry-internal/replay': 10.45.0 - '@sentry/core': 10.45.0 + '@sentry-internal/replay': 10.56.0 + '@sentry/core': 10.56.0 - '@sentry-internal/replay@10.45.0': + '@sentry-internal/replay@10.56.0': dependencies: - '@sentry-internal/browser-utils': 10.45.0 - '@sentry/core': 10.45.0 + '@sentry-internal/browser-utils': 10.56.0 + '@sentry/core': 10.56.0 - '@sentry/babel-plugin-component-annotate@5.1.1': {} + '@sentry-internal/server-utils@10.56.0': + dependencies: + '@sentry/core': 10.56.0 + + '@sentry/babel-plugin-component-annotate@5.3.0': {} - '@sentry/browser@10.45.0': + '@sentry/browser@10.56.0': dependencies: - '@sentry-internal/browser-utils': 10.45.0 - '@sentry-internal/feedback': 10.45.0 - '@sentry-internal/replay': 10.45.0 - '@sentry-internal/replay-canvas': 10.45.0 - '@sentry/core': 10.45.0 + '@sentry-internal/browser-utils': 10.56.0 + '@sentry-internal/feedback': 10.56.0 + '@sentry-internal/replay': 10.56.0 + '@sentry-internal/replay-canvas': 10.56.0 + '@sentry/core': 10.56.0 - '@sentry/bundler-plugin-core@5.1.1': + '@sentry/bundler-plugin-core@5.3.0': dependencies: '@babel/core': 7.29.0 - '@sentry/babel-plugin-component-annotate': 5.1.1 + '@sentry/babel-plugin-component-annotate': 5.3.0 '@sentry/cli': 2.58.5 dotenv: 16.6.1 find-up: 5.0.0 @@ -27713,30 +27512,70 @@ snapshots: - encoding - supports-color + '@sentry/bundler-plugins@10.75.0(rollup@4.63.3)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2))': + dependencies: + '@babel/core': 7.29.0 + '@sentry/cli': 2.58.6 + '@sentry/core': 10.75.0 + dotenv: 17.4.2 + find-up: 5.0.0 + glob: 13.0.6 + magic-string: 0.30.21 + optionalDependencies: + rollup: 4.63.3 + webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) + transitivePeerDependencies: + - encoding + - supports-color + '@sentry/cli-darwin@2.58.5': optional: true + '@sentry/cli-darwin@2.58.6': + optional: true + '@sentry/cli-linux-arm64@2.58.5': optional: true + '@sentry/cli-linux-arm64@2.58.6': + optional: true + '@sentry/cli-linux-arm@2.58.5': optional: true + '@sentry/cli-linux-arm@2.58.6': + optional: true + '@sentry/cli-linux-i686@2.58.5': optional: true + '@sentry/cli-linux-i686@2.58.6': + optional: true + '@sentry/cli-linux-x64@2.58.5': optional: true + '@sentry/cli-linux-x64@2.58.6': + optional: true + '@sentry/cli-win32-arm64@2.58.5': optional: true + '@sentry/cli-win32-arm64@2.58.6': + optional: true + '@sentry/cli-win32-i686@2.58.5': optional: true + '@sentry/cli-win32-i686@2.58.6': + optional: true + '@sentry/cli-win32-x64@2.58.5': optional: true + '@sentry/cli-win32-x64@2.58.6': + optional: true + '@sentry/cli@2.58.5': dependencies: https-proxy-agent: 5.0.1 @@ -27757,137 +27596,137 @@ snapshots: - encoding - supports-color - '@sentry/core@10.45.0': {} + '@sentry/cli@2.58.6': + 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.58.6 + '@sentry/cli-linux-arm': 2.58.6 + '@sentry/cli-linux-arm64': 2.58.6 + '@sentry/cli-linux-i686': 2.58.6 + '@sentry/cli-linux-x64': 2.58.6 + '@sentry/cli-win32-arm64': 2.58.6 + '@sentry/cli-win32-i686': 2.58.6 + '@sentry/cli-win32-x64': 2.58.6 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/conventions@0.16.0': {} + + '@sentry/core@10.56.0': {} + + '@sentry/core@10.75.0': + dependencies: + '@sentry/conventions': 0.16.0 - '@sentry/nestjs@10.45.0(@nestjs/common@11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.21)': + '@sentry/nestjs@10.56.0(@nestjs/common@11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.21)(@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0))': dependencies: '@nestjs/common': 11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.21(@nestjs/common@11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/microservices@11.1.21)(@nestjs/platform-express@11.1.21)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-nestjs-core': 0.59.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 - '@sentry/core': 10.45.0 - '@sentry/node': 10.45.0 + '@sentry/core': 10.56.0 + '@sentry/node': 10.56.0(@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0)) transitivePeerDependencies: + - '@opentelemetry/exporter-trace-otlp-http' - supports-color - '@sentry/nextjs@10.45.0(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(next@16.3.1(@babel/core@8.0.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react@19.2.4)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2))': + '@sentry/nextjs@10.56.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(next@16.3.1(@babel/core@8.0.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react@19.2.4)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2))': dependencies: - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 '@opentelemetry/semantic-conventions': 1.40.0 - '@rollup/plugin-commonjs': 28.0.1(rollup@4.59.0) - '@sentry-internal/browser-utils': 10.45.0 - '@sentry/bundler-plugin-core': 5.1.1 - '@sentry/core': 10.45.0 - '@sentry/node': 10.45.0 - '@sentry/opentelemetry': 10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) - '@sentry/react': 10.45.0(react@19.2.4) - '@sentry/vercel-edge': 10.45.0 - '@sentry/webpack-plugin': 5.1.1(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) + '@rollup/plugin-commonjs': 28.0.1(rollup@4.63.3) + '@sentry-internal/browser-utils': 10.56.0 + '@sentry/bundler-plugin-core': 5.3.0 + '@sentry/core': 10.56.0 + '@sentry/node': 10.56.0(@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0)) + '@sentry/opentelemetry': 10.56.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/react': 10.56.0(react@19.2.4) + '@sentry/vercel-edge': 10.56.0 + '@sentry/webpack-plugin': 5.4.0(rollup@4.63.3)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) next: 16.3.1(@babel/core@8.0.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) - rollup: 4.59.0 + rollup: 4.63.3 stacktrace-parser: 0.1.11 transitivePeerDependencies: - - '@opentelemetry/context-async-hooks' - '@opentelemetry/core' + - '@opentelemetry/exporter-trace-otlp-http' - '@opentelemetry/sdk-trace-base' - encoding - react - supports-color - webpack - '@sentry/node-core@10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.213.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': + '@sentry/node-core@10.56.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0)': dependencies: - '@sentry/core': 10.45.0 - '@sentry/opentelemetry': 10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/core': 10.56.0 + '@sentry/opentelemetry': 10.56.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0) import-in-the-middle: 3.0.0 optionalDependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 - '@sentry/node@10.45.0': + '@sentry/node@10.56.0(@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0))': dependencies: - '@fastify/otel': 0.17.1(@opentelemetry/api@1.9.0) - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-amqplib': 0.60.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-connect': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dataloader': 0.30.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-express': 0.61.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fs': 0.32.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-generic-pool': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-graphql': 0.61.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-hapi': 0.59.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-http': 0.213.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-ioredis': 0.61.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-kafkajs': 0.22.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-knex': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-koa': 0.61.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-lru-memoizer': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongodb': 0.66.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongoose': 0.59.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql': 0.59.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql2': 0.59.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pg': 0.65.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-redis': 0.61.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-tedious': 0.32.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-undici': 0.23.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 - '@prisma/instrumentation': 7.4.2(@opentelemetry/api@1.9.0) - '@sentry/core': 10.45.0 - '@sentry/node-core': 10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.213.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) - '@sentry/opentelemetry': 10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry-internal/server-utils': 10.56.0 + '@sentry/core': 10.56.0 + '@sentry/node-core': 10.56.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/opentelemetry': 10.56.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0) import-in-the-middle: 3.0.0 transitivePeerDependencies: + - '@opentelemetry/exporter-trace-otlp-http' - supports-color - '@sentry/opentelemetry@10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': + '@sentry/opentelemetry@10.56.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 - '@sentry/core': 10.45.0 + '@sentry/core': 10.56.0 - '@sentry/profiling-node@10.45.0': + '@sentry/profiling-node@10.56.0(@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0))': dependencies: - '@sentry-internal/node-cpu-profiler': 2.2.0 - '@sentry/core': 10.45.0 - '@sentry/node': 10.45.0 + '@sentry-internal/node-cpu-profiler': 2.4.1 + '@sentry/core': 10.56.0 + '@sentry/node': 10.56.0(@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0)) transitivePeerDependencies: + - '@opentelemetry/exporter-trace-otlp-http' - supports-color - '@sentry/react@10.45.0(react@19.2.4)': + '@sentry/react@10.56.0(react@19.2.4)': dependencies: - '@sentry/browser': 10.45.0 - '@sentry/core': 10.45.0 + '@sentry/browser': 10.56.0 + '@sentry/core': 10.56.0 react: 19.2.4 - '@sentry/vercel-edge@10.45.0': + '@sentry/vercel-edge@10.56.0': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@sentry/core': 10.45.0 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@sentry/core': 10.56.0 - '@sentry/webpack-plugin@5.1.1(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2))': + '@sentry/webpack-plugin@5.4.0(rollup@4.63.3)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2))': dependencies: - '@sentry/bundler-plugin-core': 5.1.1 - uuid: 9.0.1 + '@sentry/bundler-plugins': 10.75.0(rollup@4.63.3)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) transitivePeerDependencies: - encoding + - rollup - supports-color '@shikijs/core@3.23.0': @@ -30026,10 +29865,6 @@ snapshots: dependencies: '@types/pg': 8.15.6 - '@types/pg-pool@2.0.7': - dependencies: - '@types/pg': 8.15.6 - '@types/pg@8.15.5': dependencies: '@types/node': 18.16.9 @@ -30039,7 +29874,7 @@ snapshots: '@types/pg@8.15.6': dependencies: '@types/node': 18.16.9 - pg-protocol: 1.13.0 + pg-protocol: 1.16.0 pg-types: 2.2.0 '@types/prismjs@1.26.6': {} @@ -30632,7 +30467,7 @@ snapshots: '@uppy/utils@6.2.2': dependencies: - lodash: 4.17.23 + lodash: 4.18.1 preact: 10.28.4 '@uppy/webcam@4.3.2(@uppy/core@4.5.3)': @@ -32467,7 +32302,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.29.0 + undici: 7.25.0 whatwg-mimetype: 4.0.0 optional: true @@ -33503,6 +33338,8 @@ snapshots: dotenv@17.4.0: {} + dotenv@17.4.2: {} + draggabilly@3.0.0: dependencies: get-size: 3.0.0 @@ -33763,10 +33600,10 @@ snapshots: dependencies: es6-promise: 4.2.8 - esbuild-register@3.6.0(esbuild@0.28.2): + esbuild-register@3.6.0(esbuild@0.27.3): dependencies: debug: 4.4.3(supports-color@5.5.0) - esbuild: 0.28.2 + esbuild: 0.27.3 transitivePeerDependencies: - supports-color @@ -34105,13 +33942,13 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@8.57.1: + eslint@8.57.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.0) '@eslint-community/regexpp': 4.12.2 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.3.0 @@ -34136,7 +33973,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-yaml: 4.3.2 + js-yaml: 4.1.1 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 @@ -35754,13 +35591,6 @@ snapshots: cjs-module-lexer: 1.4.3 module-details-from-path: 1.0.4 - import-in-the-middle@2.0.6: - dependencies: - acorn: 8.16.0 - acorn-import-attributes: 1.9.5(acorn@8.16.0) - cjs-module-lexer: 2.2.0 - module-details-from-path: 1.0.4 - import-in-the-middle@3.0.0: dependencies: acorn: 8.16.0 @@ -36582,7 +36412,7 @@ snapshots: jsc-safe-url@0.2.4: {} - jschardet@3.1.4: {} + jschardet@4.0.0: {} jsdom@20.0.3(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10): dependencies: @@ -36819,12 +36649,12 @@ snapshots: konva@10.2.0: {} - langchain@1.5.11(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + langchain@1.5.11(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: - '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - '@langchain/langgraph': 1.4.15(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) - '@langchain/langgraph-checkpoint': 1.1.5(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) - langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/langgraph': 1.4.15(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) + '@langchain/langgraph-checkpoint': 1.1.5(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) + langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) zod: 3.25.76 transitivePeerDependencies: - '@opentelemetry/api' @@ -36836,12 +36666,12 @@ snapshots: - ws optional: true - langchain@1.5.11(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + langchain@1.5.11(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: - '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - '@langchain/langgraph': 1.4.15(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) - '@langchain/langgraph-checkpoint': 1.1.5(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))) - langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/langgraph': 1.4.15(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) + '@langchain/langgraph-checkpoint': 1.1.5(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))) + langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) zod: 3.25.76 transitivePeerDependencies: - '@opentelemetry/api' @@ -36852,25 +36682,25 @@ snapshots: - react-dom - ws - langsmith@0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + langsmith@0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: p-queue: 6.6.2 uuid: 10.0.0 optionalDependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/exporter-trace-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) openai: 6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - langsmith@0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + langsmith@0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: p-queue: 6.6.2 uuid: 10.0.0 optionalDependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/exporter-trace-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) openai: 6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -37207,9 +37037,11 @@ snapshots: dependencies: react: 19.2.4 - lucide-react@1.47.0(react@19.2.4): + lucide-react@1.50.0(@types/react@19.1.8)(react@19.2.4): dependencies: react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 lucide@0.525.0: {} @@ -38419,7 +38251,7 @@ snapshots: node-emoji@1.11.0: dependencies: - lodash: 4.17.23 + lodash: 4.18.1 node-exports-info@1.6.0: dependencies: @@ -39022,8 +38854,6 @@ snapshots: dependencies: pg: 8.23.0 - pg-protocol@1.13.0: {} - pg-protocol@1.16.0: {} pg-types@2.2.0: @@ -40596,7 +40426,7 @@ snapshots: depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 - path-to-regexp: 8.4.2 + path-to-regexp: 8.3.0 transitivePeerDependencies: - supports-color @@ -40608,7 +40438,7 @@ snapshots: buffer: 6.0.3 eventemitter3: 5.0.4 uuid: 11.1.0 - ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: bufferutil: 4.1.0 utf-8-validate: 6.0.6 @@ -41423,7 +41253,7 @@ snapshots: lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.7 - tinyglobby: 0.2.17 + tinyglobby: 0.2.15 ts-interface-checker: 0.1.13 superstruct@2.0.2: {} @@ -42078,9 +41908,6 @@ snapshots: undici@7.25.0: {} - undici@7.29.0: - optional: true - unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: @@ -42544,7 +42371,7 @@ snapshots: picomatch: 4.0.5 postcss: 8.5.26 rollup: 4.59.0 - tinyglobby: 0.2.17 + tinyglobby: 0.2.15 optionalDependencies: '@types/node': 18.16.9 fsevents: 2.3.3 @@ -42889,15 +42716,15 @@ snapshots: bufferutil: 4.1.0 utf-8-validate: 5.0.10 - ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): + ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): optionalDependencies: bufferutil: 4.1.0 - utf-8-validate: 5.0.10 + utf-8-validate: 6.0.6 - ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6): + ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.1.0 - utf-8-validate: 6.0.6 + utf-8-validate: 5.0.10 xml-name-validator@4.0.0: {} @@ -43024,6 +42851,8 @@ snapshots: zod@3.25.76: {} + zod@4.3.6: {} + zod@4.6.5: {} zustand@5.0.11(@types/react@19.1.8)(immer@9.0.21)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)):