diff --git a/.env.example b/.env.example index 5a036a4d42..0b5c3887b6 100644 --- a/.env.example +++ b/.env.example @@ -369,6 +369,25 @@ MEWE_HOST="https://mewe.com" MEWE_APP_ID="sample_mewe_app_id" MEWE_API_KEY="sample_mewe_api_key" +# DOS shared billing — Crove sells DOS Plus ($9) / Pro ($19), not Postiz Stripe packages. +# Keep STRIPE_PUBLISHABLE_KEY set so channel gating stays on. Checkout goes to DOS-Me. +# DOS_SHARED_BILLING=true +# DOS_ME_API_URL=https://api.dos.me +# DOS_ME_INTERNAL_API_KEY="" + +# Developer Settings +NX_ADD_PLUGINS=false +IS_GENERAL="true" # required for now +NEXT_PUBLIC_POSTIZ_OAUTH_DISPLAY_NAME="Authentik" +NEXT_PUBLIC_POSTIZ_OAUTH_LOGO_URL="https://raw.githubusercontent.com/walkxcode/dashboard-icons/master/png/authentik.png" +POSTIZ_GENERIC_OAUTH="false" +POSTIZ_OAUTH_URL="https://auth.example.com" +POSTIZ_OAUTH_AUTH_URL="https://auth.example.com/application/o/authorize" +POSTIZ_OAUTH_TOKEN_URL="https://auth.example.com/application/o/token" +POSTIZ_OAUTH_USERINFO_URL="https://authentik.example.com/application/o/userinfo" +POSTIZ_OAUTH_CLIENT_ID="" +POSTIZ_OAUTH_CLIENT_SECRET="" +# POSTIZ_OAUTH_SCOPE="openid profile email" # default values # --- Farcaster (Neynar API) --- NEYNAR_CLIENT_ID="sample_neynar_client_id" NEYNAR_SECRET_KEY="sample_neynar_secret_key" diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index b71b1ff6b5..8d2dad77eb 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -11,7 +11,6 @@ - `apps/backend`: NestJS REST API Gateway, Controllers, OAuth & Webhook endpoints. - `apps/frontend`: Next.js 16 (App Router) + React 19 + Tailwind CSS 3 UI. - `apps/orchestrator`: Temporal Worker for scheduled posting workflows and background activities. -- `apps/crove-sso`: Cloudflare Worker SSO bridge (optional edge fallback). - `libraries/nestjs-libraries`: Database layer (Prisma), 34+ Social Providers, Email, Notifications, Mastra MCP Server. - `libraries/helpers`: Runtime branding engine, Fetch wrappers, Subdomain management, Auth helper utilities. - `libraries/react-shared-libraries`: Reusable React components, translations, UI forms. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ada6989534..f499105d7b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -78,9 +78,6 @@ jobs: - name: Validate Beta deployment script and compose contract run: pnpm run validate:beta-deploy - - name: Test SSO Worker (vitest) - run: pnpm run test:sso - # The suites drive the real Prisma client, so the schema must exist in # the throwaway database first. --skip-generate because the postinstall # hook already generated the client. No --accept-data-loss: this is an diff --git a/.github/workflows/deploy-sso.yml b/.github/workflows/deploy-sso.yml deleted file mode 100644 index 14c35f35cd..0000000000 --- a/.github/workflows/deploy-sso.yml +++ /dev/null @@ -1,81 +0,0 @@ -name: Deploy Crove SSO Bridge - -on: - push: - branches: - - main - - dev - paths: - - 'apps/crove-sso/**' - - '.github/workflows/deploy-sso.yml' - workflow_dispatch: - inputs: - environment: - description: 'Target deployment environment' - required: true - default: 'beta' - type: choice - options: - - beta - - prod - -jobs: - test-and-deploy: - runs-on: ubuntu-latest - permissions: - contents: read - environment: ${{ github.event.inputs.environment == 'prod' && 'production' || github.ref_name == 'main' && 'production' || 'beta' }} - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Setup Node.js & PNPM - uses: actions/setup-node@v4 - with: - node-version: 22 - - - name: Setup PNPM - uses: pnpm/action-setup@v4 - with: - version: 10.6.1 - - - name: Install SSO Dependencies - working-directory: apps/crove-sso - run: pnpm install - - - name: Run Vitest Unit Tests - working-directory: apps/crove-sso - run: pnpm test - - - name: Determine Target Environment - id: env - run: | - if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - echo "target=${{ github.event.inputs.environment }}" >> "$GITHUB_OUTPUT" - elif [ "${{ github.ref_name }}" = "main" ]; then - echo "target=prod" >> "$GITHUB_OUTPUT" - else - echo "target=beta" >> "$GITHUB_OUTPUT" - fi - - - name: Deploy to Cloudflare Workers (Beta) - if: steps.env.outputs.target == 'beta' - uses: cloudflare/wrangler-action@v3 - with: - apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} - accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - workingDirectory: 'apps/crove-sso' - command: 'deploy -e beta' - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} - - - name: Deploy to Cloudflare Workers (Production) - if: steps.env.outputs.target == 'prod' - uses: cloudflare/wrangler-action@v3 - with: - apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} - accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - workingDirectory: 'apps/crove-sso' - command: 'deploy' - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} diff --git a/apps/backend/src/api/api.module.ts b/apps/backend/src/api/api.module.ts index 6a6f25f9c2..57791dea9c 100644 --- a/apps/backend/src/api/api.module.ts +++ b/apps/backend/src/api/api.module.ts @@ -16,6 +16,8 @@ import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integ import { SettingsController } from '@gitroom/backend/api/routes/settings.controller'; import { PostsController } from '@gitroom/backend/api/routes/posts.controller'; import { MediaController } from '@gitroom/backend/api/routes/media.controller'; +import { MediaWidgetController } from '@gitroom/backend/api/routes/media.widget.controller'; +import { UploadWidgetAuthMiddleware } from '@gitroom/backend/services/auth/upload.widget.auth.middleware'; import { UploadModule } from '@gitroom/nestjs-libraries/upload/upload.module'; import { BillingController } from '@gitroom/backend/api/routes/billing.controller'; import { NotificationsController } from '@gitroom/backend/api/routes/notifications.controller'; @@ -51,6 +53,8 @@ import { AppleProvider } from '@gitroom/backend/services/auth/providers/apple.pr import { FarcasterProvider } from '@gitroom/backend/services/auth/providers/farcaster.provider'; import { WalletProvider } from '@gitroom/backend/services/auth/providers/wallet.provider'; import { OauthProvider } from '@gitroom/backend/services/auth/providers/oauth.provider'; +import { DosMeBillingClient } from '@gitroom/nestjs-libraries/dos-billing/dos-me-billing.client'; +import { DosSharedBillingService } from '@gitroom/nestjs-libraries/dos-billing/dos-shared-billing.service'; import { StripeController } from '@gitroom/backend/api/routes/stripe.controller'; const authenticatedController = [ @@ -77,7 +81,7 @@ const authenticatedController = [ @Module({ imports: [UploadModule, EcosystemModule], controllers: process.env.MCP_ONLY - ? [RootController, OAuthController] + ? [RootController, OAuthController, MediaWidgetController] : [ RootController, PaymentController, @@ -88,6 +92,7 @@ const authenticatedController = [ EnterpriseController, NoAuthIntegrationsController, OAuthController, + MediaWidgetController, ...authenticatedController, ], providers: [ @@ -99,6 +104,7 @@ const authenticatedController = [ OpenaiService, ExtractContentService, AuthMiddleware, + UploadWidgetAuthMiddleware, PoliciesGuard, PermissionsService, CodesService, @@ -112,6 +118,8 @@ const authenticatedController = [ FarcasterProvider, WalletProvider, OauthProvider, + DosMeBillingClient, + DosSharedBillingService, ], get exports() { return [...this.imports, ...this.providers]; @@ -120,5 +128,6 @@ const authenticatedController = [ export class ApiModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer.apply(AuthMiddleware).forRoutes(...authenticatedController); + consumer.apply(UploadWidgetAuthMiddleware).forRoutes(MediaWidgetController); } } diff --git a/apps/backend/src/api/routes/auth.controller.ts b/apps/backend/src/api/routes/auth.controller.ts index 809e441b62..5d6adf74ae 100644 --- a/apps/backend/src/api/routes/auth.controller.ts +++ b/apps/backend/src/api/routes/auth.controller.ts @@ -7,7 +7,10 @@ import { Query, Req, Res, + UseGuards, } from '@nestjs/common'; +import { Throttle } from '@nestjs/throttler'; +import { ThrottlerRealIpGuard } from '@gitroom/nestjs-libraries/throttler/throttler.provider'; import { Response, Request } from 'express'; import { CreateOrgUserDto } from '@gitroom/nestjs-libraries/dtos/auth/create.org.user.dto'; @@ -24,6 +27,7 @@ import { UserAgent } from '@gitroom/nestjs-libraries/user/user.agent'; import { Provider } from '@prisma/client'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import * as Sentry from '@sentry/nestjs'; +import { FarcasterProvider } from '@gitroom/nestjs-libraries/integrations/social/farcaster.provider'; @ApiTags('Auth') @Controller('/auth') @@ -295,6 +299,30 @@ export class AuthController { } } + // public and creates a signer at Neynar per call, so cap it per client + @UseGuards(ThrottlerRealIpGuard) + @Throttle({ default: { limit: 30, ttl: 3600000 } }) + @Post('/farcaster/signer') + async farcasterSigner() { + try { + return await new FarcasterProvider().createSigner(); + } catch (err: any) { + return { error: err.message || 'Failed to create signer' }; + } + } + + // the modal polls every 2s for up to 10 minutes, so leave room for that + @UseGuards(ThrottlerRealIpGuard) + @Throttle({ default: { limit: 1000, ttl: 3600000 } }) + @Get('/farcaster/signer') + async farcasterSignerStatus(@Query('signerUuid') signerUuid: string) { + try { + return await new FarcasterProvider().signerStatus(signerUuid); + } catch (err: any) { + return { error: err.message || 'Failed to check signer' }; + } + } + @Post('/oauth/:provider/redirect') oauthRedirect( @Param('provider') provider: string, diff --git a/apps/backend/src/api/routes/billing.controller.ts b/apps/backend/src/api/routes/billing.controller.ts index 49fe1a3c92..595cd31a18 100644 --- a/apps/backend/src/api/routes/billing.controller.ts +++ b/apps/backend/src/api/routes/billing.controller.ts @@ -18,6 +18,7 @@ import { NotificationService } from '@gitroom/nestjs-libraries/database/prisma/n import { Request } from 'express'; import { AuthService } from '@gitroom/helpers/auth/auth.service'; import { UsersService } from '@gitroom/nestjs-libraries/database/prisma/users/users.service'; +import { DosSharedBillingService } from '@gitroom/nestjs-libraries/dos-billing/dos-shared-billing.service'; import { PaymentService } from '@gitroom/nestjs-libraries/services/payment/payment.service'; import { BillingSyncDto } from '@gitroom/nestjs-libraries/dtos/billing/billing.sync.dto'; @@ -28,6 +29,7 @@ export class BillingController { private _subscriptionService: SubscriptionService, private _notificationService: NotificationService, private _usersService: UsersService, + private _dosBilling: DosSharedBillingService, private _paymentService: PaymentService ) {} @@ -98,6 +100,10 @@ export class BillingController { return { blocked: true }; } + if (this._dosBilling.enabled()) { + return this.subscribeThroughDos(user, body.billing); + } + const uniqueId = req?.cookies?.track; return (await this.provider(org)).embedded( uniqueId, @@ -119,6 +125,10 @@ export class BillingController { return { blocked: true }; } + if (this._dosBilling.enabled()) { + return this.subscribeThroughDos(user, body.billing); + } + const uniqueId = req?.cookies?.track; return (await this.provider(org)).subscribe( uniqueId, @@ -151,7 +161,17 @@ export class BillingController { } @Get('/portal') - async modifyPayment(@GetOrgFromRequest() org: Organization) { + async modifyPayment( + @GetOrgFromRequest() org: Organization, + @GetUserFromRequest() user: User + ) { + if (this._dosBilling.enabled()) { + const { url } = await this._dosBilling.portal( + user, + process.env.FRONTEND_URL || 'https://post.crove.com' + ); + return { portal: url }; + } const { url } = await (await this.provider(org)).portalLink(org.id); return { portal: url, @@ -159,7 +179,16 @@ export class BillingController { } @Get('/') - getCurrentBilling(@GetOrgFromRequest() org: Organization) { + async getCurrentBilling( + @GetOrgFromRequest() org: Organization, + @GetUserFromRequest() user: User + ) { + if (this._dosBilling.enabled() && user && !user.isSuperAdmin) { + try { + await this._dosBilling.syncOrg(user, org.id); + } catch {} + return this._subscriptionService.getSubscriptionByOrganizationId(org.id); + } return this._paymentService.getSubscription(org.id); } @@ -176,17 +205,49 @@ export class BillingController { user.email ); + if (this._dosBilling.enabled()) { + await this._dosBilling.cancel(user); + try { + await this._dosBilling.syncOrg(user, org.id); + } catch {} + const sub = + await this._subscriptionService.getSubscriptionByOrganizationId(org.id); + return { cancel_at: sub?.cancelAt || null }; + } + return (await this.provider(org)).setToCancel(org.id); } @Post('/prorate') async prorate( @GetOrgFromRequest() org: Organization, + @GetUserFromRequest() user: User, @Body() body: BillingSubscribeDto ) { + if (this._dosBilling.enabled()) { + return { price: body.billing === 'PRO' ? 19 : 9 }; + } return (await this.provider(org)).prorate(org.id, body); } + private async subscribeThroughDos(user: User, billing: string) { + const result = await this._dosBilling.checkout( + user, + billing, + process.env.FRONTEND_URL || 'https://post.crove.com' + ); + if ('updated' in result && result.updated) { + return {}; + } + if ('url' in result && result.url) { + return { url: result.url }; + } + if ('portal_url' in result && result.portal_url) { + return { portal: result.portal_url }; + } + return result; + } + @Get('/charges') async getCharges( @GetUserFromRequest() user: User, diff --git a/apps/backend/src/api/routes/copilot.controller.ts b/apps/backend/src/api/routes/copilot.controller.ts index 61577bd07f..29c88ed234 100644 --- a/apps/backend/src/api/routes/copilot.controller.ts +++ b/apps/backend/src/api/routes/copilot.controller.ts @@ -8,12 +8,10 @@ import { Query, Param, } from '@nestjs/common'; -import OpenAI from 'openai'; import { CopilotRuntime, OpenAIAdapter, copilotRuntimeNodeHttpEndpoint, - copilotRuntimeNextJSAppRouterEndpoint, } from '@copilotkit/runtime'; import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; import { Organization } from '@prisma/client'; @@ -24,6 +22,7 @@ import { Request, Response } from 'express'; import { RequestContext } from '@mastra/core/di'; import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability'; import { AuthorizationActions, Sections } from '@gitroom/backend/services/auth/permissions/permission.exception.class'; +import OpenAI from 'openai'; export type ChannelsContext = { integrations: string; @@ -31,6 +30,16 @@ export type ChannelsContext = { ui: string; }; +// the copilot runtime writes its own CORS headers on the response, keep them aligned with main.ts +const copilotCors = () => ({ + origin: [ + process.env.FRONTEND_URL, + 'http://localhost:6274', + ...(process.env.MAIN_URL ? [process.env.MAIN_URL] : []), + ], + credentials: !process.env.NOT_SECURED, +}); + @Controller('/copilot') export class CopilotController { constructor( @@ -54,6 +63,7 @@ export class CopilotController { const copilotRuntimeHandler = copilotRuntimeNodeHttpEndpoint({ endpoint: '/copilot/chat', + cors: copilotCors(), runtime: new CopilotRuntime(), serviceAdapter: new OpenAIAdapter({ openai: openai as any, @@ -82,7 +92,7 @@ export class CopilotController { const requestContext = new RequestContext(); requestContext.set( 'integrations', - req?.body?.variables?.properties?.integrations || [] + req?.body?.body?.forwardedProps?.integrations || [] ); requestContext.set('organization', JSON.stringify(organization)); @@ -103,17 +113,17 @@ export class CopilotController { ...(process.env.OPENAI_BASE_URL ? { baseURL: process.env.OPENAI_BASE_URL } : {}), }); - const copilotRuntimeHandler = copilotRuntimeNextJSAppRouterEndpoint({ + const copilotRuntimeHandler = copilotRuntimeNodeHttpEndpoint({ endpoint: '/copilot/agent', + cors: copilotCors(), runtime, - // properties: req.body.variables.properties, serviceAdapter: new OpenAIAdapter({ openai: openai as any, model: process.env.OPENAI_MODEL_NAME || 'gpt-4.1', }), }); - return copilotRuntimeHandler.handleRequest(req, res); + return copilotRuntimeHandler(req, res); } @Get('/credits') diff --git a/apps/backend/src/api/routes/media.controller.ts b/apps/backend/src/api/routes/media.controller.ts index 6d5b557a1f..3c6902e881 100644 --- a/apps/backend/src/api/routes/media.controller.ts +++ b/apps/backend/src/api/routes/media.controller.ts @@ -1,4 +1,5 @@ import { + BadRequestException, Body, Controller, Delete, @@ -10,7 +11,6 @@ import { Res, UploadedFile, UseInterceptors, - UsePipes, } from '@nestjs/common'; import { Request, Response } from 'express'; import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; @@ -19,7 +19,7 @@ import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/me import { ApiTags } from '@nestjs/swagger'; import handleR2Upload from '@gitroom/nestjs-libraries/upload/r2.uploader'; import { FileInterceptor } from '@nestjs/platform-express'; -import { CustomFileValidationPipe } from '@gitroom/nestjs-libraries/upload/custom.upload.validation'; +import { streamUploadOptions } from '@gitroom/nestjs-libraries/upload/multer.stream.engine'; import { SubscriptionService } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/subscription.service'; import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory'; import { SaveMediaInformationDto } from '@gitroom/nestjs-libraries/dtos/media/save.media.information.dto'; @@ -85,19 +85,19 @@ export class MediaController { } @Post('/upload-server') - @UseInterceptors(FileInterceptor('file')) - @UsePipes(new CustomFileValidationPipe()) + @UseInterceptors(FileInterceptor('file', streamUploadOptions())) async uploadServer( @GetOrgFromRequest() org: Organization, @UploadedFile() file: Express.Multer.File ) { - const originalName = file?.originalname || ''; - const uploadedFile = await this.storage.uploadFile(file); + if (!file) { + throw new BadRequestException('No file provided'); + } return this._mediaService.saveFile( org.id, - uploadedFile.originalname, - uploadedFile.path, - originalName + file.filename, + file.path, + file.originalname ); } @@ -128,26 +128,25 @@ export class MediaController { } @Post('/upload-simple') - @UseInterceptors(FileInterceptor('file')) - @UsePipes(new CustomFileValidationPipe()) + @UseInterceptors(FileInterceptor('file', streamUploadOptions())) async uploadSimple( @GetOrgFromRequest() org: Organization, @UploadedFile('file') file: Express.Multer.File, @Body('preventSave') preventSave: string = 'false' ) { - const originalName = file.originalname; - const getFile = await this.storage.uploadFile(file); + if (!file) { + throw new BadRequestException('No file provided'); + } if (preventSave === 'true') { - const { path } = getFile; - return { path }; + return { path: file.path }; } return this._mediaService.saveFile( org.id, - getFile.originalname, - getFile.path, - originalName + file.filename, + file.path, + file.originalname ); } @@ -159,7 +158,8 @@ export class MediaController { @Param('endpoint') endpoint: string ) { const upload = await handleR2Upload(endpoint, req, res); - if (endpoint !== 'complete-multipart-upload') { + // a rejected or failed completion has already answered with its own status + if (endpoint !== 'complete-multipart-upload' || res.headersSent) { return upload; } @@ -167,7 +167,7 @@ export class MediaController { const name = upload.Location.split('/').pop(); const originalName = req.body?.file?.name; - const saveFile = await this._mediaService.saveFile( + const saveFile = await this._mediaService.saveUploadedFile( org.id, name, // @ts-ignore @@ -178,6 +178,14 @@ export class MediaController { res.status(200).json({ ...upload, saved: saveFile }); } + @Get('/:id/status') + getMediaStatus( + @GetOrgFromRequest() org: Organization, + @Param('id') id: string + ) { + return this._mediaService.getMediaStatus(org.id, id); + } + @Get('/') getMedia( @GetOrgFromRequest() org: Organization, diff --git a/apps/backend/src/api/routes/media.widget.controller.ts b/apps/backend/src/api/routes/media.widget.controller.ts new file mode 100644 index 0000000000..c194d4d172 --- /dev/null +++ b/apps/backend/src/api/routes/media.widget.controller.ts @@ -0,0 +1,48 @@ +import { + BadRequestException, + Controller, + Get, + Post, + Req, + UploadedFile, + UseInterceptors, +} from '@nestjs/common'; +import { Request } from 'express'; +import { ApiTags } from '@nestjs/swagger'; +import { Organization } from '@prisma/client'; +import { FileInterceptor } from '@nestjs/platform-express'; +import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; +import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; +import { streamUploadOptions } from '@gitroom/nestjs-libraries/upload/multer.stream.engine'; + +@ApiTags('Media') +@Controller('/media-widget') +export class MediaWidgetController { + constructor(private _mediaService: MediaService) {} + + @Post('/upload') + @UseInterceptors(FileInterceptor('file', streamUploadOptions())) + async upload( + @GetOrgFromRequest() org: Organization, + @Req() req: Request, + @UploadedFile() file: Express.Multer.File + ) { + if (!file) { + throw new BadRequestException('No file provided'); + } + return this._mediaService.saveUploadSessionFile( + org.id, + // @ts-ignore + req.uploadSession, + file.filename, + file.path, + file.originalname + ); + } + + @Get('/status') + status(@GetOrgFromRequest() org: Organization, @Req() req: Request) { + // @ts-ignore + return this._mediaService.getUploadSession(org.id, req.uploadSession); + } +} diff --git a/apps/backend/src/api/routes/no.auth.integrations.controller.ts b/apps/backend/src/api/routes/no.auth.integrations.controller.ts index f5260b9aae..7d8a6a5172 100644 --- a/apps/backend/src/api/routes/no.auth.integrations.controller.ts +++ b/apps/backend/src/api/routes/no.auth.integrations.controller.ts @@ -12,6 +12,7 @@ import { ConnectIntegrationDto } from '@gitroom/nestjs-libraries/dtos/integratio import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integration.manager'; import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/integrations/integration.service'; import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability'; +import { isCroveBillingGated } from '@gitroom/nestjs-libraries/dos-billing/crove-billing-gate'; import { ApiTags } from '@nestjs/swagger'; import { NotEnoughScopesFilter } from '@gitroom/nestjs-libraries/integrations/integration.missing.scopes'; import { AuthService } from '@gitroom/helpers/auth/auth.service'; @@ -194,7 +195,7 @@ export class NoAuthIntegrationsController { } if ( - process.env.STRIPE_PUBLISHABLE_KEY && + isCroveBillingGated() && org.isTrailing && (await this._integrationService.checkPreviousConnections( org.id, diff --git a/apps/backend/src/api/routes/oauth.controller.ts b/apps/backend/src/api/routes/oauth.controller.ts index cb179e1566..822e8bf1c5 100644 --- a/apps/backend/src/api/routes/oauth.controller.ts +++ b/apps/backend/src/api/routes/oauth.controller.ts @@ -28,6 +28,7 @@ import { 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'; @ApiTags('OAuth') @Controller('/oauth') @@ -65,7 +66,10 @@ export class OAuthController { } @Post('/token') - async token(@Body() body: TokenExchangeDto) { + async token( + @Body() body: TokenExchangeDto, + @Headers('authorization') authorization?: string + ) { if (body.grant_type !== 'authorization_code') { throw new HttpException( { error: 'unsupported_grant_type' }, @@ -73,10 +77,21 @@ export class OAuthController { ); } + // client_secret_basic puts the credentials in the Authorization header, + // client_secret_post and public clients put them in the body + const basic = extractBasicCredentials(authorization); + const clientId = basic?.clientId || body.client_id; + if (!clientId) { + throw new HttpException( + { error: 'invalid_client' }, + HttpStatus.UNAUTHORIZED + ); + } + return this._oauthService.exchangeCodeForToken( body.code, - body.client_id, - body.client_secret, + clientId, + basic?.clientSecret || body.client_secret, body.code_verifier, body.redirect_uri ); diff --git a/apps/backend/src/api/routes/users.controller.ts b/apps/backend/src/api/routes/users.controller.ts index 08e839260a..3ad250b294 100644 --- a/apps/backend/src/api/routes/users.controller.ts +++ b/apps/backend/src/api/routes/users.controller.ts @@ -32,6 +32,8 @@ import { UserAgent } from '@gitroom/nestjs-libraries/user/user.agent'; import { TrackEnum } from '@gitroom/nestjs-libraries/user/track.enum'; import { TrackService } from '@gitroom/nestjs-libraries/track/track.service'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; +import { DosSharedBillingService } from '@gitroom/nestjs-libraries/dos-billing/dos-shared-billing.service'; +import { isCroveBillingGated } from '@gitroom/nestjs-libraries/dos-billing/crove-billing-gate'; import { AuthorizationActions, Sections, @@ -46,7 +48,8 @@ export class UsersController { private _authService: AuthService, private _orgService: OrganizationService, private _userService: UsersService, - private _trackService: TrackService + private _trackService: TrackService, + private _dosBilling: DosSharedBillingService ) {} @Get('/chatbase-token') @@ -108,28 +111,45 @@ export class UsersController { } const impersonate = req.cookies.impersonate || req.headers.impersonate; + const billingGated = isCroveBillingGated(); + const sharedDosBilling = this._dosBilling.enabled(); + let totalChannels = !billingGated + ? 10000 + : // @ts-ignore + organization?.subscription?.totalChannels || pricing.FREE.channel; + let tier = + // @ts-ignore + organization?.subscription?.subscriptionTier || + (!billingGated ? 'ULTIMATE' : 'FREE'); + let dosPlan: 'free' | 'plus' | 'pro' | null = null; + + if (sharedDosBilling && !user.isSuperAdmin) { + try { + const mapped = await this._dosBilling.syncOrg(user, organization.id); + totalChannels = mapped.channels; + tier = mapped.tier; + dosPlan = mapped.dosPlan; + } catch { + // Fail closed to the last local subscription rather than unlock ULTIMATE. + } + } + // @ts-ignore return { ...user, orgId: organization.id, - totalChannels: !process.env.STRIPE_PUBLISHABLE_KEY - ? 10000 - : // @ts-ignore - organization?.subscription?.totalChannels || pricing.FREE.channel, - tier: - // @ts-ignore - organization?.subscription?.subscriptionTier || - (!process.env.STRIPE_PUBLISHABLE_KEY ? 'ULTIMATE' : 'FREE'), + totalChannels, + tier, + sharedDosBilling, + dosPlan, // @ts-ignore role: organization?.users[0]?.role, // @ts-ignore isLifetime: !!organization?.subscription?.isLifetime, admin: !!user.isSuperAdmin, impersonate: !!impersonate, - isTrailing: !process.env.STRIPE_PUBLISHABLE_KEY - ? false - : organization?.isTrailing, - allowTrial: organization?.allowTrial, + isTrailing: !billingGated ? false : organization?.isTrailing, + allowTrial: sharedDosBilling ? false : organization?.allowTrial, streakSince: organization?.streakSince || null, publicApi: // @ts-ignore diff --git a/apps/backend/src/main.ts b/apps/backend/src/main.ts index a7579e9bb7..a35569b1a9 100644 --- a/apps/backend/src/main.ts +++ b/apps/backend/src/main.ts @@ -33,6 +33,8 @@ async function start() { 'auth', 'showorg', 'impersonate', + 'x-postiz-org', + 'x-postiz-include-deleted', 'x-copilotkit-runtime-client-gql-version', ], exposedHeaders: [ 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 a2371240b2..0258beb2cf 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 @@ -1,4 +1,5 @@ import { + BadRequestException, Body, Controller, Delete, @@ -11,20 +12,16 @@ import { UploadedFile, UseGuards, UseInterceptors, - UsePipes, } from '@nestjs/common'; -import { - CustomFileValidationPipe, - getMaxSize, -} from '@gitroom/nestjs-libraries/upload/custom.upload.validation'; +import { streamUploadOptions } from '@gitroom/nestjs-libraries/upload/multer.stream.engine'; 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 { 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'; import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service'; import { FileInterceptor } from '@nestjs/platform-express'; -import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory'; import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; import { GetPostsDto } from '@gitroom/nestjs-libraries/dtos/posts/get.posts.dto'; import { ChangePostStatusDto } from '@gitroom/nestjs-libraries/dtos/posts/change.post.status.dto'; @@ -38,21 +35,6 @@ import { VideoFunctionDto } from '@gitroom/nestjs-libraries/dtos/videos/video.fu import { UploadDto } from '@gitroom/nestjs-libraries/dtos/media/upload.dto'; import { NotificationService } from '@gitroom/nestjs-libraries/database/prisma/notifications/notification.service'; import { GetNotificationsDto } from '@gitroom/nestjs-libraries/dtos/notifications/get.notifications.dto'; -import { Readable } from 'stream'; -import { ssrfSafeDispatcher } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher'; -// eslint-disable-next-line @typescript-eslint/no-var-requires -const { fileTypeFromBuffer } = require('file-type'); - -const PUBLIC_API_ALLOWED_MIME = new Set([ - 'image/jpeg', - 'image/png', - 'image/gif', - 'image/webp', - 'image/avif', - 'image/bmp', - 'image/tiff', - 'video/mp4', -]); import * as Sentry from '@sentry/nestjs'; import { socialIntegrationList, @@ -66,12 +48,14 @@ import { UsersService } from '@gitroom/nestjs-libraries/database/prisma/users/us import { SuperAdminGuard } from '@gitroom/backend/services/auth/super.admin.guard'; import { timer } from '@gitroom/helpers/utils/timer'; import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service'; +import { AdminStatsService } from '@gitroom/nestjs-libraries/database/prisma/admin-stats/admin-stats.service'; +import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service'; +import { GetOrgActivityDto } from '@gitroom/nestjs-libraries/dtos/analytics/get.org.activity.dto'; +import dayjs from 'dayjs'; @ApiTags('Public API') @Controller('/public/v1') export class PublicIntegrationsController { - private storage = UploadFactory.createStorage(); - constructor( private _integrationService: IntegrationService, private _postsService: PostsService, @@ -79,12 +63,13 @@ export class PublicIntegrationsController { private _notificationService: NotificationService, private _integrationManager: IntegrationManager, private _refreshIntegrationService: RefreshIntegrationService, - private _usersService: UsersService + private _usersService: UsersService, + private _adminStatsService: AdminStatsService, + private _organizationService: OrganizationService ) {} @Post('/upload') - @UseInterceptors(FileInterceptor('file')) - @UsePipes(new CustomFileValidationPipe()) + @UseInterceptors(FileInterceptor('file', streamUploadOptions())) async uploadSimple( @GetOrgFromRequest() org: Organization, @UploadedFile('file') file: Express.Multer.File @@ -94,12 +79,7 @@ export class PublicIntegrationsController { throw new HttpException({ msg: 'No file provided' }, 400); } - const getFile = await this.storage.uploadFile(file); - return this._mediaService.saveFile( - org.id, - getFile.originalname, - getFile.path - ); + return this._mediaService.saveFile(org.id, file.filename, file.path); } @Post('/upload-from-url') @@ -108,62 +88,15 @@ export class PublicIntegrationsController { @Body() body: UploadDto ) { Sentry.metrics.count('public_api-request', 1); - let response: globalThis.Response; try { - response = await fetch(body.url, { - // @ts-ignore — undici option, not in lib.dom fetch types - dispatcher: ssrfSafeDispatcher, - }); - } catch { - // Network-level failure (DNS, connection refused, SSRF block, etc.) — - // fetch rejects rather than returning a non-ok response. - throw new HttpException({ msg: 'Failed to fetch URL' }, 400); - } - if (!response.ok) { - throw new HttpException({ msg: 'Failed to fetch URL' }, 400); - } - - // Guard against OOM: bail out before buffering the whole body into memory. - // Content-Length may be absent or wrong, so we re-check the real size after - // download too. The type isn't known yet (sniffed below), so the pre-check - // uses the largest allowed cap (video). - const maxDownloadSize = getMaxSize('video/mp4'); - const declaredSize = Number(response.headers.get('content-length')); - if (declaredSize && declaredSize > maxDownloadSize) { - throw new HttpException({ msg: 'File is too large.' }, 400); - } - - const buffer = Buffer.from(await response.arrayBuffer()); - const detected = await fileTypeFromBuffer(buffer); - if (!detected || !PUBLIC_API_ALLOWED_MIME.has(detected.mime)) { - throw new HttpException({ msg: 'Unsupported file type.' }, 400); - } - - if (buffer.length > getMaxSize(detected.mime)) { - throw new HttpException({ msg: 'File is too large.' }, 400); + return await this._mediaService.uploadFromUrl(org.id, body.url); + } catch (err) { + // Validation failures keep this route's { msg } error shape + if (err instanceof BadRequestException) { + throw new HttpException({ msg: err.message }, 400); + } + throw err; } - - const mimetype = detected.mime; - const ext = detected.ext; - - const getFile = await this.storage.uploadFile({ - buffer, - mimetype, - size: buffer.length, - path: '', - fieldname: '', - destination: '', - stream: new Readable(), - filename: '', - originalname: `upload.${ext}`, - encoding: '', - }); - - return this._mediaService.saveFile( - org.id, - getFile.originalname, - getFile.path - ); } @Get('/find-slot/:id') @@ -388,7 +321,72 @@ export class PublicIntegrationsController { @Query('name') name: string ) { Sentry.metrics.count('public_api-request', 1); - return this._usersService.getImpersonateUser(name); + const term = name?.trim(); + + if (!term) { + throw new HttpException({ msg: 'A search term is required' }, 400); + } + + return this._usersService.getImpersonateUser(term); + } + + @Get('/debug/posts/:id') + @UseGuards(SuperAdminGuard) + async getPostTimeline( + @GetOrgFromRequest() org: Organization, + @Param('id') id: string + ) { + Sentry.metrics.count('public_api-request', 1); + const timeline = await this._postsService.getPostTimeline(id, org.id); + + if (!timeline) { + throw new HttpException({ msg: 'Post not found' }, 404); + } + + return timeline; + } + + @Get('/debug/account') + @UseGuards(SuperAdminGuard) + async getAccountOverview(@GetOrgFromRequest() org: Organization) { + Sentry.metrics.count('public_api-request', 1); + const account = await this._organizationService.getAccountOverview(org.id); + + if (!account) { + throw new HttpException({ msg: 'Organization not found' }, 404); + } + + return account; + } + + @Get('/debug/channels') + @UseGuards(SuperAdminGuard) + async getChannelHealth( + @GetOrgFromRequest() org: Organization, + @GetIncludeDeletedFromRequest() includeDeleted: boolean + ) { + Sentry.metrics.count('public_api-request', 1); + return this._integrationService.getChannelHealth(org.id, includeDeleted); + } + + @Get('/debug/activity') + @UseGuards(SuperAdminGuard) + async getOrgActivity( + @GetOrgFromRequest() org: Organization, + @GetIncludeDeletedFromRequest() includeDeleted: boolean, + @Query() query: GetOrgActivityDto + ) { + Sentry.metrics.count('public_api-request', 1); + + const from = query.from ? dayjs(query.from) : dayjs().subtract(30, 'day'); + const to = query.to ? dayjs(query.to) : dayjs(); + + return this._adminStatsService.getOrgActivity({ + organizationId: org.id, + from: from.startOf('day').toDate(), + to: to.endOf('day').toDate(), + includeDeleted, + }); } @Get('/notifications') diff --git a/apps/backend/src/services/auth/permissions/permissions.service.ts b/apps/backend/src/services/auth/permissions/permissions.service.ts index 75223fbbf1..c8bc18b16b 100644 --- a/apps/backend/src/services/auth/permissions/permissions.service.ts +++ b/apps/backend/src/services/auth/permissions/permissions.service.ts @@ -1,6 +1,7 @@ import { Ability, AbilityBuilder, AbilityClass } from '@casl/ability'; import { Injectable } from '@nestjs/common'; import { pricing } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/pricing'; +import { isCroveBillingGated } from '@gitroom/nestjs-libraries/dos-billing/crove-billing-gate'; import { SubscriptionService } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/subscription.service'; import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service'; import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/integrations/integration.service'; @@ -24,7 +25,7 @@ export class PermissionsService { const tier = subscription?.subscriptionTier || - (!process.env.STRIPE_PUBLISHABLE_KEY ? 'PRO' : 'FREE'); + (!isCroveBillingGated() ? 'PRO' : 'FREE'); const { channel, ...all } = pricing[tier]; return { @@ -49,7 +50,7 @@ export class PermissionsService { if ( requestedPermission.length === 0 || - !process.env.STRIPE_PUBLISHABLE_KEY + !isCroveBillingGated() ) { for (const [action, section] of requestedPermission) { can(action, section); diff --git a/apps/backend/src/services/auth/providers/farcaster.provider.ts b/apps/backend/src/services/auth/providers/farcaster.provider.ts index 8d66631680..d3c5675f03 100644 --- a/apps/backend/src/services/auth/providers/farcaster.provider.ts +++ b/apps/backend/src/services/auth/providers/farcaster.provider.ts @@ -10,8 +10,10 @@ const client = new NeynarAPIClient({ @AuthProvider({ provider: 'FARCASTER' }) export class FarcasterProvider extends AuthProviderAbstract { - generateLink() { - return ''; + // no OAuth redirect here, the frontend only needs the state nonce that + // pairs with the oauth_state cookie set by /auth/oauth/FARCASTER + generateLink(query?: { state?: string }) { + return query?.state || ''; } async getToken(code: string, _redirectUri?: string) { diff --git a/apps/backend/src/services/auth/public.auth.middleware.ts b/apps/backend/src/services/auth/public.auth.middleware.ts index 36353de88a..7cbcee3868 100644 --- a/apps/backend/src/services/auth/public.auth.middleware.ts +++ b/apps/backend/src/services/auth/public.auth.middleware.ts @@ -1,5 +1,6 @@ -import { HttpStatus, Injectable, NestMiddleware } from '@nestjs/common'; +import { HttpStatus, Injectable, Logger, NestMiddleware } from '@nestjs/common'; import { Request, Response, NextFunction } from 'express'; +import { Organization } from '@prisma/client'; import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service'; import { OAuthService } from '@gitroom/nestjs-libraries/database/prisma/oauth/oauth.service'; import { HttpForbiddenException } from '@gitroom/nestjs-libraries/services/exception.filter'; @@ -7,10 +8,18 @@ import { setSentryUserContext } from '@gitroom/nestjs-libraries/sentry/initializ @Injectable() export class PublicAuthMiddleware implements NestMiddleware { + private readonly _logger = new Logger(PublicAuthMiddleware.name); + constructor( private _organizationService: OrganizationService, private _oauthService: OAuthService ) {} + + private setOrg(req: Request, org: Organization) { + // @ts-ignore + req.org = { ...org, users: [{ users: { role: 'SUPERADMIN' } }] }; + } + async use(req: Request, res: Response, next: NextFunction) { const auth = (req.headers.authorization || req.headers.Authorization) as string; @@ -19,7 +28,13 @@ export class PublicAuthMiddleware implements NestMiddleware { return; } try { - if (auth.startsWith('pos_')) { + let org: Organization & { subscription?: unknown }; + const isOAuthApp = auth.startsWith('pos_'); + + // @ts-ignore + req.isOAuthApp = isOAuthApp; + + if (isOAuthApp) { const authorization = await this._oauthService.getOrgByOAuthToken(auth); if (!authorization) { res @@ -28,34 +43,60 @@ export class PublicAuthMiddleware implements NestMiddleware { return; } - const org = authorization.organization; - if (!!process.env.STRIPE_SECRET_KEY && !org.subscription) { - res - .status(HttpStatus.UNAUTHORIZED) - .json({ msg: 'No subscription found' }); - return; - } - - // @ts-ignore - req.org = { ...org, users: [{ users: { role: 'SUPERADMIN' } }] }; + org = authorization.organization; } else { - const org = await this._organizationService.getOrgByApiKey(auth); + org = await this._organizationService.getOrgByApiKey(auth); if (!org) { res .status(HttpStatus.UNAUTHORIZED) .json({ msg: 'Invalid API key' }); return; } + } - if (!!process.env.STRIPE_SECRET_KEY && !org.subscription) { + if (!!process.env.STRIPE_SECRET_KEY && !org.subscription) { + res + .status(HttpStatus.UNAUTHORIZED) + .json({ msg: 'No subscription found' }); + return; + } + + this.setOrg(req, org); + const includeDeleted = + (req.headers['x-postiz-include-deleted'] as string)?.trim() === 'true'; + // @ts-ignore + req.authOrgId = org.id; + // @ts-ignore + req.includeDeleted = includeDeleted; + + const overrideOrgId = (req.headers['x-postiz-org'] as string)?.trim(); + + if (overrideOrgId) { + if ( + isOAuthApp || + !(await this._organizationService.canUseSuperAdminApi(org.id)) + ) { + res.status(HttpStatus.FORBIDDEN).json({ msg: 'Unauthorized' }); + return; + } + + const overrideOrg = + await this._organizationService.getOrgByIdWithSubscription( + overrideOrgId + ); + + if (!overrideOrg || (overrideOrg.deletedAt && !includeDeleted)) { res - .status(HttpStatus.UNAUTHORIZED) - .json({ msg: 'No subscription found' }); + .status(HttpStatus.NOT_FOUND) + .json({ msg: 'Organization not found' }); return; } - // @ts-ignore - req.org = { ...org, users: [{ users: { role: 'SUPERADMIN' } }] }; + this.setOrg(req, overrideOrg); + + this._logger.log( + `Organization override performed by organization ${org.id}: acting as ${overrideOrg.id} on ${req.method} ${req.path}` + ); } } catch (err) { throw new HttpForbiddenException(); diff --git a/apps/backend/src/services/auth/super.admin.guard.ts b/apps/backend/src/services/auth/super.admin.guard.ts index 323d661e47..b52e5c44a2 100644 --- a/apps/backend/src/services/auth/super.admin.guard.ts +++ b/apps/backend/src/services/auth/super.admin.guard.ts @@ -16,11 +16,19 @@ export class SuperAdminGuard implements CanActivate { const request: Request = context.switchToHttp().getRequest(); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - const { org }: { org: Organization } = request; + const { + org, + isOAuthApp, + authOrgId, + }: { org: Organization; isOAuthApp?: boolean; authOrgId?: string } = + request; + + const orgId = authOrgId || org?.id; if ( - !org || - !(await this._organizationService.hasSuperAdminUser(org.id)) + !orgId || + isOAuthApp || + !(await this._organizationService.canUseSuperAdminApi(orgId)) ) { throw new HttpException({ msg: 'Unauthorized' }, 403); } diff --git a/apps/backend/src/services/auth/upload.widget.auth.middleware.ts b/apps/backend/src/services/auth/upload.widget.auth.middleware.ts new file mode 100644 index 0000000000..9529cd7290 --- /dev/null +++ b/apps/backend/src/services/auth/upload.widget.auth.middleware.ts @@ -0,0 +1,34 @@ +import { HttpStatus, Injectable, NestMiddleware } from '@nestjs/common'; +import { Request, Response, NextFunction } from 'express'; +import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; + +// The MCP upload widget runs in the host's sandboxed iframe (a foreign origin +// without our cookies), so it authenticates with a short-lived ticket. It is +// checked here, before the multipart interceptor streams anything to storage +@Injectable() +export class UploadWidgetAuthMiddleware implements NestMiddleware { + constructor(private _mediaService: MediaService) {} + async use(req: Request, res: Response, next: NextFunction) { + // Not part of the global cors() allowlist on purpose: that one allows + // credentials, and the sandbox origins are shared with every other connector. + // The global cors() answers every preflight itself, so the widget has to stay + // on "simple" requests (GET / multipart POST, no custom headers) + res.setHeader('Access-Control-Allow-Origin', '*'); + + const ticket = + typeof req.query.ticket === 'string' && + (await this._mediaService.getUploadTicket(req.query.ticket)); + if (!ticket) { + res + .status(HttpStatus.UNAUTHORIZED) + .json({ msg: 'Upload ticket not found or expired' }); + return; + } + + // @ts-ignore + req.org = { id: ticket.org }; + // @ts-ignore + req.uploadSession = ticket.sessionId; + next(); + } +} diff --git a/apps/crove-sso/package.json b/apps/crove-sso/package.json deleted file mode 100644 index 955b3dedcf..0000000000 --- a/apps/crove-sso/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "@crove/sso", - "private": true, - "type": "module", - "scripts": { - "dev": "wrangler dev", - "test": "vitest run", - "typecheck": "tsc --noEmit", - "cf-typegen": "wrangler types --include-runtime false", - "deploy": "wrangler deploy", - "deploy:beta": "wrangler deploy -e beta", - "deploy:prod": "wrangler deploy" - }, - "devDependencies": { - "@cloudflare/vitest-pool-workers": "0.21.3", - "@cloudflare/workers-types": "5.20260813.1", - "typescript": "5.5.4", - "vitest": "4.1.10", - "wrangler": "4.123.0" - } -} diff --git a/apps/crove-sso/src/env.ts b/apps/crove-sso/src/env.ts deleted file mode 100644 index eb7e6214ae..0000000000 --- a/apps/crove-sso/src/env.ts +++ /dev/null @@ -1,13 +0,0 @@ -export interface Env { - OAUTH_STATE: DurableObjectNamespace; - UPSTREAM_AUTHORIZE_URL: string; - UPSTREAM_TOKEN_URL: string; - UPSTREAM_USERINFO_URL: string; - UPSTREAM_REDIRECT_URI: string; - UPSTREAM_CLIENT_ID: string; - UPSTREAM_CLIENT_SECRET: string; - DOWNSTREAM_REDIRECT_URI: string; - DOWNSTREAM_CLIENT_ID: string; - DOWNSTREAM_CLIENT_SECRET: string; - ALLOWED_SCOPE: string; -} diff --git a/apps/crove-sso/src/index.ts b/apps/crove-sso/src/index.ts deleted file mode 100644 index 0099148e27..0000000000 --- a/apps/crove-sso/src/index.ts +++ /dev/null @@ -1,219 +0,0 @@ -import type { Env } from './env'; -import { - createPkce, - OAuthRequestError, - oauthError, - parseAuthorizeRequest, - parseTokenRequest, - randomToken, -} from './oauth'; -import { putState, takeState } from './state-store'; - -const AUTHORIZATION_TTL_SECONDS = 600; -const BRIDGE_CODE_TTL_SECONDS = 60; - -export interface AuthorizationTransaction { - redirectUri: string; - scope: string; - downstreamState?: string; - verifier: string; -} - -async function authorize(request: Request, env: Env): Promise { - const downstream = parseAuthorizeRequest(request, env); - const upstreamState = randomToken(); - const pkce = await createPkce(); - await putState( - env, - `authorize:${upstreamState}`, - { - redirectUri: downstream.redirectUri, - scope: downstream.scope, - downstreamState: downstream.state, - verifier: pkce.verifier, - }, - AUTHORIZATION_TTL_SECONDS, - ); - - const target = new URL(env.UPSTREAM_AUTHORIZE_URL); - target.search = new URLSearchParams({ - client_id: env.UPSTREAM_CLIENT_ID, - redirect_uri: env.UPSTREAM_REDIRECT_URI, - response_type: 'code', - scope: downstream.scope, - state: upstreamState, - code_challenge: pkce.challenge, - code_challenge_method: 'S256', - }).toString(); - - return new Response(null, { - status: 302, - headers: { - Location: target.toString(), - 'Referrer-Policy': 'no-referrer', - 'Cache-Control': 'no-store', - }, - }); -} - -async function callback(request: Request, env: Env): Promise { - const params = new URL(request.url).searchParams; - const code = params.get('code'); - const state = params.get('state'); - if (!code || !state) { - throw new OAuthRequestError('invalid_request'); - } - - const transaction = await takeState(env, `authorize:${state}`); - if (!transaction) { - throw new OAuthRequestError('invalid_request'); - } - - const upstreamResponse = await globalThis.fetch(env.UPSTREAM_TOKEN_URL, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/x-www-form-urlencoded', - }, - body: new URLSearchParams({ - grant_type: 'authorization_code', - client_id: env.UPSTREAM_CLIENT_ID, - client_secret: env.UPSTREAM_CLIENT_SECRET, - code, - redirect_uri: env.UPSTREAM_REDIRECT_URI, - code_verifier: transaction.verifier, - }), - }); - if (!upstreamResponse.ok) { - return oauthError('temporarily_unavailable', 'Identity provider unavailable', 502); - } - - let tokenResponse: Record; - try { - tokenResponse = await upstreamResponse.json>(); - } catch { - return oauthError('temporarily_unavailable', 'Identity provider unavailable', 502); - } - if (typeof tokenResponse.access_token !== 'string' || tokenResponse.access_token.length === 0) { - return oauthError('temporarily_unavailable', 'Identity provider unavailable', 502); - } - - const bridgeCode = randomToken(); - await putState(env, `code:${bridgeCode}`, tokenResponse, BRIDGE_CODE_TTL_SECONDS); - - const target = new URL(transaction.redirectUri); - target.searchParams.set('code', bridgeCode); - if (transaction.downstreamState) { - target.searchParams.set('state', transaction.downstreamState); - } - return new Response(null, { - status: 302, - headers: { - Location: target.toString(), - 'Referrer-Policy': 'no-referrer', - 'Cache-Control': 'no-store', - }, - }); -} - -async function token(request: Request, env: Env): Promise { - const tokenRequest = await parseTokenRequest(request, env); - const tokenResponse = await takeState>(env, `code:${tokenRequest.code}`); - if (!tokenResponse) { - throw new OAuthRequestError('invalid_grant'); - } - - return Response.json(tokenResponse, { - headers: { - 'Cache-Control': 'no-store', - Pragma: 'no-cache', - }, - }); -} - -async function userinfo(request: Request, env: Env): Promise { - const authorization = request.headers.get('authorization') || ''; - const bearer = /^Bearer ([^\s]+)$/.exec(authorization)?.[1]; - if (!bearer) { - return oauthError('invalid_token', 'Bearer token required', 401); - } - - const upstreamResponse = await globalThis.fetch(env.UPSTREAM_USERINFO_URL, { - headers: { - Accept: 'application/json', - Authorization: `Bearer ${bearer}`, - }, - }); - if (!upstreamResponse.ok) { - if (upstreamResponse.status === 401 || upstreamResponse.status === 403) { - return oauthError('invalid_token', 'Identity token rejected', 401); - } - return oauthError('temporarily_unavailable', 'Identity provider unavailable', 502); - } - - let claims: Record; - try { - claims = await upstreamResponse.json>(); - } catch { - return oauthError('temporarily_unavailable', 'Identity provider unavailable', 502); - } - if (typeof claims.sub !== 'string' || claims.sub.length === 0) { - return oauthError('invalid_token', 'Identity token rejected', 401); - } - - return Response.json(claims, { - headers: { - 'Cache-Control': 'no-store', - Pragma: 'no-cache', - }, - }); -} - -async function handleRequest(request: Request, env: Env): Promise { - const { pathname } = new URL(request.url); - try { - if (request.method === 'GET' && pathname === '/health') { - return Response.json({ status: 'ok', service: 'crove-sso' }); - } - if (request.method === 'GET' && pathname === '/authorize') { - return await authorize(request, env); - } - if (request.method === 'GET' && pathname === '/callback') { - return await callback(request, env); - } - if (request.method === 'POST' && pathname === '/token') { - return await token(request, env); - } - if (request.method === 'GET' && pathname === '/userinfo') { - return await userinfo(request, env); - } - return new Response('Not found', { status: 404 }); - } catch (error) { - if (error instanceof OAuthRequestError) { - return oauthError(error.code, 'OAuth request rejected', error.status); - } - return oauthError('server_error', 'OAuth service unavailable', 500); - } -} - -async function fetch(request: Request, env: Env): Promise { - const requestId = crypto.randomUUID(); - const endpoint = new URL(request.url).pathname; - const startedAt = performance.now(); - const response = await handleRequest(request, env); - const logEntry: Record = { - requestId, - endpoint, - status: response.status, - durationMs: Math.round(performance.now() - startedAt), - }; - if (response.status >= 400) { - logEntry.errorCode = `http_${response.status}`; - } - console.log(JSON.stringify(logEntry)); - return response; -} - -export default { fetch }; - -export { OAuthStateStore } from './state-store'; diff --git a/apps/crove-sso/src/oauth.ts b/apps/crove-sso/src/oauth.ts deleted file mode 100644 index 6f6c1aaac0..0000000000 --- a/apps/crove-sso/src/oauth.ts +++ /dev/null @@ -1,121 +0,0 @@ -import type { Env } from './env'; - -export interface AuthorizeRequest { - redirectUri: string; - scope: string; - state?: string; -} - -export interface TokenRequest { - code: string; -} - -export class OAuthRequestError extends Error { - constructor( - readonly code: string, - readonly status = 400, - ) { - super(code); - this.name = 'OAuthRequestError'; - } -} - -function base64Url(bytes: Uint8Array): string { - return btoa(String.fromCharCode(...bytes)) - .replace(/\+/g, '-') - .replace(/\//g, '_') - .replace(/=+$/g, ''); -} - -export function randomToken(): string { - return base64Url(crypto.getRandomValues(new Uint8Array(32))); -} - -async function constantTimeEqual(actual: string, expected: string): Promise { - const encoder = new TextEncoder(); - const [actualDigest, expectedDigest] = await Promise.all([ - crypto.subtle.digest('SHA-256', encoder.encode(actual)), - crypto.subtle.digest('SHA-256', encoder.encode(expected)), - ]); - const actualBytes = new Uint8Array(actualDigest); - const expectedBytes = new Uint8Array(expectedDigest); - let difference = 0; - for (let index = 0; index < actualBytes.length; index += 1) { - difference |= actualBytes[index] ^ expectedBytes[index]; - } - return difference === 0; -} - -export function parseAuthorizeRequest(request: Request, env: Env): AuthorizeRequest { - const params = new URL(request.url).searchParams; - if (params.get('client_id') !== env.DOWNSTREAM_CLIENT_ID) { - throw new OAuthRequestError('invalid_client', 401); - } - if (params.get('redirect_uri') !== env.DOWNSTREAM_REDIRECT_URI) { - throw new OAuthRequestError('invalid_request'); - } - if (params.get('response_type') !== 'code') { - throw new OAuthRequestError('unsupported_response_type'); - } - if (params.get('scope') !== env.ALLOWED_SCOPE) { - throw new OAuthRequestError('invalid_scope'); - } - - return { - redirectUri: env.DOWNSTREAM_REDIRECT_URI, - scope: env.ALLOWED_SCOPE, - state: params.get('state') || undefined, - }; -} - -export async function createPkce(): Promise<{ verifier: string; challenge: string }> { - const verifier = randomToken(); - const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier)); - return { verifier, challenge: base64Url(new Uint8Array(digest)) }; -} - -export async function parseTokenRequest(request: Request, env: Env): Promise { - const contentType = request.headers.get('content-type')?.toLowerCase() || ''; - if (!contentType.startsWith('application/x-www-form-urlencoded')) { - throw new OAuthRequestError('invalid_request'); - } - - const form = await request.formData(); - const params = new URLSearchParams(); - for (const [key, value] of form.entries()) { - if (typeof value === 'string') params.append(key, value); - } - if (params.get('grant_type') !== 'authorization_code') { - throw new OAuthRequestError('unsupported_grant_type'); - } - const clientIdMatches = params.get('client_id') === env.DOWNSTREAM_CLIENT_ID; - const secretMatches = await constantTimeEqual( - params.get('client_secret') || '', - env.DOWNSTREAM_CLIENT_SECRET, - ); - if (!clientIdMatches || !secretMatches) { - throw new OAuthRequestError('invalid_client', 401); - } - if (params.get('redirect_uri') !== env.DOWNSTREAM_REDIRECT_URI) { - throw new OAuthRequestError('invalid_grant'); - } - const code = params.get('code'); - if (!code) { - throw new OAuthRequestError('invalid_grant'); - } - - return { code }; -} - -export function oauthError(error: string, description: string, status = 400): Response { - return Response.json( - { error, error_description: description }, - { - status, - headers: { - 'Cache-Control': 'no-store', - Pragma: 'no-cache', - }, - }, - ); -} diff --git a/apps/crove-sso/src/state-store.ts b/apps/crove-sso/src/state-store.ts deleted file mode 100644 index b3ac18aaca..0000000000 --- a/apps/crove-sso/src/state-store.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { DurableObject } from 'cloudflare:workers'; - -import type { Env } from './env'; - -interface StoredEntry { - value: T; -} - -export class OAuthStateStore extends DurableObject { - constructor(ctx: DurableObjectState, env: Env) { - super(ctx, env); - ctx.blockConcurrencyWhile(async () => { - ctx.storage.sql.exec(` - CREATE TABLE IF NOT EXISTS oauth_entries ( - id TEXT PRIMARY KEY, - value TEXT NOT NULL, - expires_at INTEGER NOT NULL - ) - `); - }); - } - - async fetch(request: Request): Promise { - const path = new URL(request.url).pathname; - if (request.method === 'POST' && path === '/put') { - const entry = await request.json<{ - key: string; - value: unknown; - expiresAt: number; - }>(); - this.ctx.storage.sql.exec( - 'INSERT OR REPLACE INTO oauth_entries (id, value, expires_at) VALUES (?, ?, ?)', - entry.key, - JSON.stringify({ value: entry.value }), - entry.expiresAt, - ); - return new Response(null, { status: 204 }); - } - - if (request.method === 'POST' && path === '/take') { - const { key } = await request.json<{ key: string }>(); - const rows = [ - ...this.ctx.storage.sql.exec<{ value: string }>( - 'DELETE FROM oauth_entries WHERE id = ? AND expires_at > ? RETURNING value', - key, - Date.now(), - ), - ]; - this.ctx.storage.sql.exec('DELETE FROM oauth_entries WHERE id = ? AND expires_at <= ?', key, Date.now()); - if (rows.length !== 1) return new Response(null, { status: 404 }); - return Response.json(JSON.parse(rows[0].value) as StoredEntry); - } - - return new Response(null, { status: 404 }); - } -} - -function store(env: Env): DurableObjectStub { - return env.OAUTH_STATE.get(env.OAUTH_STATE.idFromName('oauth-state')); -} - -export async function putState( - env: Env, - key: string, - value: T, - ttlSeconds: number, -): Promise { - const response = await store(env).fetch('https://state.internal/put', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ key, value, expiresAt: Date.now() + ttlSeconds * 1000 }), - }); - if (!response.ok) throw new Error('state_store_unavailable'); -} - -export async function takeState(env: Env, key: string): Promise { - const response = await store(env).fetch('https://state.internal/take', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ key }), - }); - if (response.status === 404) return null; - if (!response.ok) throw new Error('state_store_unavailable'); - const entry = await response.json>(); - return entry.value; -} diff --git a/apps/crove-sso/test/env.d.ts b/apps/crove-sso/test/env.d.ts deleted file mode 100644 index 88936844c7..0000000000 --- a/apps/crove-sso/test/env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { Env } from '../src/env'; - -declare module 'cloudflare:workers' { - interface ProvidedEnv extends Env {} -} diff --git a/apps/crove-sso/test/oauth.test.ts b/apps/crove-sso/test/oauth.test.ts deleted file mode 100644 index e5dc2bf799..0000000000 --- a/apps/crove-sso/test/oauth.test.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { describe, expect, it } from 'vitest'; - -import type { Env } from '../src/env'; -import { - createPkce, - oauthError, - parseAuthorizeRequest, - parseTokenRequest, -} from '../src/oauth'; - -const env = { - DOWNSTREAM_CLIENT_ID: 'crove-postiz', - DOWNSTREAM_CLIENT_SECRET: 'bridge-secret-value', - DOWNSTREAM_REDIRECT_URI: 'https://post.crove.com/settings', - ALLOWED_SCOPE: 'openid profile email', -} as Env; - -function authorizeUrl(overrides: Record = {}) { - const params = new URLSearchParams({ - client_id: env.DOWNSTREAM_CLIENT_ID, - redirect_uri: env.DOWNSTREAM_REDIRECT_URI, - response_type: 'code', - scope: env.ALLOWED_SCOPE, - state: 'downstream-state', - ...overrides, - }); - return new Request(`https://sso.crove.com/authorize?${params}`); -} - -describe('parseAuthorizeRequest', () => { - it('accepts the exact Postiz authorization request', () => { - expect(parseAuthorizeRequest(authorizeUrl(), env)).toEqual({ - redirectUri: env.DOWNSTREAM_REDIRECT_URI, - scope: env.ALLOWED_SCOPE, - state: 'downstream-state', - }); - }); - - it.each([ - ['unknown client', { client_id: 'unknown' }, 'invalid_client'], - ['wrong redirect', { redirect_uri: 'https://evil.example/callback' }, 'invalid_request'], - ['wrong response type', { response_type: 'token' }, 'unsupported_response_type'], - ['extra scope', { scope: 'openid profile email admin' }, 'invalid_scope'], - ])('rejects %s', (_name, overrides, code) => { - expect(() => parseAuthorizeRequest(authorizeUrl(overrides), env)).toThrow(code); - }); -}); - -describe('createPkce', () => { - it('returns a valid S256 verifier and challenge', async () => { - const { verifier, challenge } = await createPkce(); - const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier)); - const expected = btoa(String.fromCharCode(...new Uint8Array(digest))) - .replace(/\+/g, '-') - .replace(/\//g, '_') - .replace(/=+$/g, ''); - - expect(verifier).toMatch(/^[A-Za-z0-9_-]{43}$/); - expect(challenge).toBe(expected); - }); -}); - -function tokenRequest(overrides: Record = {}, contentType = 'application/x-www-form-urlencoded') { - const body = new URLSearchParams({ - grant_type: 'authorization_code', - client_id: env.DOWNSTREAM_CLIENT_ID, - client_secret: env.DOWNSTREAM_CLIENT_SECRET, - redirect_uri: env.DOWNSTREAM_REDIRECT_URI, - code: 'single-use-code', - ...overrides, - }); - return new Request('https://sso.crove.com/token', { - method: 'POST', - headers: { 'Content-Type': contentType }, - body, - }); -} - -describe('parseTokenRequest', () => { - it('accepts the exact Postiz token request', async () => { - await expect(parseTokenRequest(tokenRequest(), env)).resolves.toEqual({ code: 'single-use-code' }); - }); - - it.each([ - ['wrong grant type', { grant_type: 'refresh_token' }, 'unsupported_grant_type'], - ['unknown client', { client_id: 'unknown' }, 'invalid_client'], - ['invalid client secret', { client_secret: 'wrong-secret' }, 'invalid_client'], - ['wrong redirect', { redirect_uri: 'https://evil.example/callback' }, 'invalid_grant'], - ['missing code', { code: '' }, 'invalid_grant'], - ])('rejects %s', async (_name, overrides, code) => { - await expect(parseTokenRequest(tokenRequest(overrides), env)).rejects.toThrow(code); - }); - - it('rejects a non-form request', async () => { - await expect(parseTokenRequest(tokenRequest({}, 'application/json'), env)).rejects.toThrow( - 'invalid_request', - ); - }); -}); - -describe('oauthError', () => { - it('returns a safe no-store OAuth response', async () => { - const response = oauthError('invalid_grant', 'Authorization code is invalid', 400); - expect(response.status).toBe(400); - expect(response.headers.get('cache-control')).toBe('no-store'); - expect(response.headers.get('pragma')).toBe('no-cache'); - await expect(response.json()).resolves.toEqual({ - error: 'invalid_grant', - error_description: 'Authorization code is invalid', - }); - }); -}); diff --git a/apps/crove-sso/test/state-store.test.ts b/apps/crove-sso/test/state-store.test.ts deleted file mode 100644 index 3ee490e97f..0000000000 --- a/apps/crove-sso/test/state-store.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { env } from 'cloudflare:workers'; -import { evictDurableObject } from 'cloudflare:test'; -import { describe, expect, it } from 'vitest'; - -import type { Env } from '../src/env'; -import { putState, takeState } from '../src/state-store'; - -const workerEnv = env as unknown as Env; - -describe('OAuthStateStore', () => { - it('returns a stored value exactly once', async () => { - const key = crypto.randomUUID(); - await putState(workerEnv, key, { state: 'stored' }, 60); - - await expect(takeState<{ state: string }>(workerEnv, key)).resolves.toEqual({ state: 'stored' }); - await expect(takeState(workerEnv, key)).resolves.toBeNull(); - }); - - it('does not return an expired value', async () => { - const key = crypto.randomUUID(); - await putState(workerEnv, key, { state: 'expired' }, 0); - - await expect(takeState(workerEnv, key)).resolves.toBeNull(); - }); - - it('allows exactly one concurrent consumer', async () => { - const key = crypto.randomUUID(); - await putState(workerEnv, key, { state: 'race' }, 60); - - const values = await Promise.all([ - takeState<{ state: string }>(workerEnv, key), - takeState<{ state: string }>(workerEnv, key), - ]); - - expect(values.filter((value) => value !== null)).toHaveLength(1); - expect(values.find((value) => value !== null)).toEqual({ state: 'race' }); - }); - - it('preserves state across Durable Object eviction', async () => { - const key = crypto.randomUUID(); - await putState(workerEnv, key, { state: 'persisted' }, 60); - const id = workerEnv.OAUTH_STATE.idFromName('oauth-state'); - await evictDurableObject(workerEnv.OAUTH_STATE.get(id)); - - await expect(takeState<{ state: string }>(workerEnv, key)).resolves.toEqual({ - state: 'persisted', - }); - }); -}); diff --git a/apps/crove-sso/test/worker.test.ts b/apps/crove-sso/test/worker.test.ts deleted file mode 100644 index b928d2b216..0000000000 --- a/apps/crove-sso/test/worker.test.ts +++ /dev/null @@ -1,257 +0,0 @@ -import { env, exports } from 'cloudflare:workers'; -import { afterEach, describe, expect, it, vi } from 'vitest'; - -import type { Env } from '../src/env'; - -const workerEnv = env as unknown as Env; -const worker = exports as unknown as { - default: { fetch(request: Request): Promise }; -}; - -afterEach(() => { - vi.restoreAllMocks(); -}); - -function authorizeUrl(overrides: Record = {}) { - const params = new URLSearchParams({ - client_id: workerEnv.DOWNSTREAM_CLIENT_ID, - redirect_uri: workerEnv.DOWNSTREAM_REDIRECT_URI, - response_type: 'code', - scope: workerEnv.ALLOWED_SCOPE, - state: 'postiz-state', - ...overrides, - }); - return new Request(`https://sso.crove.com/authorize?${params}`, { redirect: 'manual' }); -} - -async function issueBridgeCode(): Promise { - const authorization = await worker.default.fetch(authorizeUrl()); - const upstreamState = new URL(authorization.headers.get('location')!).searchParams.get('state')!; - vi.spyOn(globalThis, 'fetch').mockImplementation(async () => - Response.json({ - access_token: 'upstream-access-token', - token_type: 'bearer', - expires_in: 3600, - refresh_token: 'upstream-refresh-token', - }), - ); - const callback = await worker.default.fetch( - new Request(`https://sso.crove.com/callback?code=supabase-code&state=${upstreamState}`, { - redirect: 'manual', - }), - ); - vi.restoreAllMocks(); - return new URL(callback.headers.get('location')!).searchParams.get('code')!; -} - -function tokenRequest(code: string, overrides: Record = {}): Request { - return new Request('https://sso.crove.com/token', { - method: 'POST', - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - body: new URLSearchParams({ - grant_type: 'authorization_code', - client_id: workerEnv.DOWNSTREAM_CLIENT_ID, - client_secret: workerEnv.DOWNSTREAM_CLIENT_SECRET, - redirect_uri: workerEnv.DOWNSTREAM_REDIRECT_URI, - code, - ...overrides, - }), - }); -} - -describe('Crove SSO Worker', () => { - it('serves a static health response', async () => { - const response = await worker.default.fetch(new Request('https://sso.crove.com/health')); - expect(response.status).toBe(200); - await expect(response.json()).resolves.toEqual({ status: 'ok', service: 'crove-sso' }); - }); - - it('redirects an exact authorization request to DOS ID with S256 PKCE', async () => { - const response = await worker.default.fetch(authorizeUrl()); - expect(response.status).toBe(302); - const location = new URL(response.headers.get('location')!); - expect(location.origin + location.pathname).toBe(workerEnv.UPSTREAM_AUTHORIZE_URL); - expect(location.searchParams.get('client_id')).toBe(workerEnv.UPSTREAM_CLIENT_ID); - expect(location.searchParams.get('redirect_uri')).toBe(workerEnv.UPSTREAM_REDIRECT_URI); - expect(location.searchParams.get('response_type')).toBe('code'); - expect(location.searchParams.get('scope')).toBe(workerEnv.ALLOWED_SCOPE); - expect(location.searchParams.get('code_challenge_method')).toBe('S256'); - expect(location.searchParams.get('code_challenge')).toMatch(/^[A-Za-z0-9_-]{43}$/); - expect(location.searchParams.get('state')).toMatch(/^[A-Za-z0-9_-]{43}$/); - expect(location.searchParams.get('state')).not.toContain('postiz-state'); - expect(response.headers.get('referrer-policy')).toBe('no-referrer'); - }); - - it('rejects an invalid authorization request without redirecting', async () => { - const response = await worker.default.fetch( - authorizeUrl({ redirect_uri: 'https://evil.example/callback' }), - ); - expect(response.status).toBe(400); - expect(response.headers.get('location')).toBeNull(); - await expect(response.json()).resolves.toMatchObject({ error: 'invalid_request' }); - }); - - it('exchanges an upstream callback and preserves downstream state', async () => { - const authorization = await worker.default.fetch(authorizeUrl()); - const upstreamState = new URL(authorization.headers.get('location')!).searchParams.get('state')!; - let submittedVerifier = ''; - vi.spyOn(globalThis, 'fetch').mockImplementation(async (input, init) => { - const request = new Request(input, init); - expect(request.url).toBe(workerEnv.UPSTREAM_TOKEN_URL); - const form = await request.formData(); - submittedVerifier = String(form.get('code_verifier')); - expect(form.get('code')).toBe('supabase-code'); - expect(form.get('client_id')).toBe(workerEnv.UPSTREAM_CLIENT_ID); - expect(form.get('client_secret')).toBe(workerEnv.UPSTREAM_CLIENT_SECRET); - expect(form.get('redirect_uri')).toBe(workerEnv.UPSTREAM_REDIRECT_URI); - return Response.json({ - access_token: 'upstream-access-token', - token_type: 'bearer', - expires_in: 3600, - refresh_token: 'upstream-refresh-token', - }); - }); - - const callback = await worker.default.fetch( - new Request( - `https://sso.crove.com/callback?code=supabase-code&state=${encodeURIComponent(upstreamState)}`, - { redirect: 'manual' }, - ), - ); - - expect(callback.status).toBe(302); - expect(submittedVerifier).toMatch(/^[A-Za-z0-9_-]{43}$/); - expect(callback.headers.get('referrer-policy')).toBe('no-referrer'); - const downstream = new URL(callback.headers.get('location')!); - expect(downstream.origin + downstream.pathname).toBe(workerEnv.DOWNSTREAM_REDIRECT_URI); - expect(downstream.searchParams.get('state')).toBe('postiz-state'); - expect(downstream.searchParams.get('code')).toMatch(/^[A-Za-z0-9_-]{43}$/); - }); - - it('rejects a replayed upstream callback', async () => { - const authorization = await worker.default.fetch(authorizeUrl()); - const upstreamState = new URL(authorization.headers.get('location')!).searchParams.get('state')!; - vi.spyOn(globalThis, 'fetch').mockImplementation(async () => - Response.json({ access_token: 'upstream-access-token', token_type: 'bearer' }), - ); - const callbackUrl = `https://sso.crove.com/callback?code=supabase-code&state=${upstreamState}`; - - expect((await worker.default.fetch(new Request(callbackUrl, { redirect: 'manual' }))).status).toBe(302); - const replay = await worker.default.fetch(new Request(callbackUrl, { redirect: 'manual' })); - expect(replay.status).toBe(400); - await expect(replay.json()).resolves.toMatchObject({ error: 'invalid_request' }); - }); - - it('does not expose an upstream token error body', async () => { - const authorization = await worker.default.fetch(authorizeUrl()); - const upstreamState = new URL(authorization.headers.get('location')!).searchParams.get('state')!; - vi.spyOn(globalThis, 'fetch').mockImplementation(async () => - Response.json({ error: 'invalid_client', leaked: 'upstream-secret-body' }, { status: 401 }), - ); - - const response = await worker.default.fetch( - new Request(`https://sso.crove.com/callback?code=bad&state=${upstreamState}`), - ); - expect(response.status).toBe(502); - expect(await response.text()).not.toContain('upstream-secret-body'); - }); - - it('exchanges a bridge code for the upstream token response', async () => { - const bridgeCode = await issueBridgeCode(); - const response = await worker.default.fetch(tokenRequest(bridgeCode)); - - expect(response.status).toBe(200); - expect(response.headers.get('cache-control')).toBe('no-store'); - expect(response.headers.get('pragma')).toBe('no-cache'); - await expect(response.json()).resolves.toEqual({ - access_token: 'upstream-access-token', - token_type: 'bearer', - expires_in: 3600, - refresh_token: 'upstream-refresh-token', - }); - }); - - it('rejects a replayed bridge code', async () => { - const bridgeCode = await issueBridgeCode(); - expect((await worker.default.fetch(tokenRequest(bridgeCode))).status).toBe(200); - - const replay = await worker.default.fetch(tokenRequest(bridgeCode)); - expect(replay.status).toBe(400); - await expect(replay.json()).resolves.toMatchObject({ error: 'invalid_grant' }); - }); - - it('rejects an invalid downstream secret without consuming the bridge code', async () => { - const bridgeCode = await issueBridgeCode(); - const invalid = await worker.default.fetch( - tokenRequest(bridgeCode, { client_secret: 'wrong-secret' }), - ); - expect(invalid.status).toBe(401); - await expect(invalid.json()).resolves.toMatchObject({ error: 'invalid_client' }); - - expect((await worker.default.fetch(tokenRequest(bridgeCode))).status).toBe(200); - }); - - it('rejects a wrong downstream redirect URI without consuming the bridge code', async () => { - const bridgeCode = await issueBridgeCode(); - const invalid = await worker.default.fetch( - tokenRequest(bridgeCode, { redirect_uri: 'https://evil.example/callback' }), - ); - expect(invalid.status).toBe(400); - await expect(invalid.json()).resolves.toMatchObject({ error: 'invalid_grant' }); - - expect((await worker.default.fetch(tokenRequest(bridgeCode))).status).toBe(200); - }); - - it('proxies userinfo with the bearer token and strips upstream headers', async () => { - const log = vi.spyOn(console, 'log').mockImplementation(() => undefined); - vi.spyOn(globalThis, 'fetch').mockImplementation(async (input, init) => { - const upstream = new Request(input, init); - expect(upstream.url).toBe(workerEnv.UPSTREAM_USERINFO_URL); - expect(upstream.headers.get('authorization')).toBe('Bearer upstream-access-token'); - return Response.json( - { sub: 'dos-id-subject', email: 'joy@dos.ai', email_verified: true, name: 'JOY' }, - { headers: { 'Set-Cookie': 'should-not-pass=1', 'X-Upstream': 'private' } }, - ); - }); - - const response = await worker.default.fetch( - new Request('https://sso.crove.com/userinfo', { - headers: { Authorization: 'Bearer upstream-access-token' }, - }), - ); - expect(response.status).toBe(200); - expect(response.headers.get('set-cookie')).toBeNull(); - expect(response.headers.get('x-upstream')).toBeNull(); - expect(response.headers.get('cache-control')).toBe('no-store'); - await expect(response.json()).resolves.toEqual({ - sub: 'dos-id-subject', - email: 'joy@dos.ai', - email_verified: true, - name: 'JOY', - }); - const logOutput = log.mock.calls.flat().join(' '); - expect(logOutput).toContain('"endpoint":"/userinfo"'); - expect(logOutput).not.toContain('upstream-access-token'); - expect(logOutput).not.toContain('joy@dos.ai'); - expect(logOutput).not.toContain('dos-id-subject'); - }); - - it('rejects userinfo without an exact bearer token', async () => { - const response = await worker.default.fetch(new Request('https://sso.crove.com/userinfo')); - expect(response.status).toBe(401); - await expect(response.json()).resolves.toMatchObject({ error: 'invalid_token' }); - }); - - it('does not expose an upstream userinfo error body', async () => { - vi.spyOn(globalThis, 'fetch').mockImplementation(async () => - Response.json({ leaked: 'upstream-private-error' }, { status: 401 }), - ); - const response = await worker.default.fetch( - new Request('https://sso.crove.com/userinfo', { - headers: { Authorization: 'Bearer bad-token' }, - }), - ); - expect(response.status).toBe(401); - expect(await response.text()).not.toContain('upstream-private-error'); - }); -}); diff --git a/apps/crove-sso/tsconfig.json b/apps/crove-sso/tsconfig.json deleted file mode 100644 index ad9b11aed0..0000000000 --- a/apps/crove-sso/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "moduleResolution": "Bundler", - "lib": ["ES2022", "WebWorker"], - "types": ["@cloudflare/workers-types", "@cloudflare/vitest-pool-workers/types", "vitest/globals"], - "strict": true, - "noEmit": true, - "skipLibCheck": true - }, - "include": ["worker-configuration.d.ts", "src/**/*.ts", "test/**/*.ts", "vitest.config.ts"] -} diff --git a/apps/crove-sso/vitest.config.ts b/apps/crove-sso/vitest.config.ts deleted file mode 100644 index 4ecdecb3b8..0000000000 --- a/apps/crove-sso/vitest.config.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { cloudflareTest } from '@cloudflare/vitest-pool-workers'; -import { defineConfig } from 'vitest/config'; - -export default defineConfig({ - plugins: [ - cloudflareTest({ - wrangler: { configPath: './wrangler.jsonc' }, - miniflare: { - bindings: { - UPSTREAM_CLIENT_ID: 'supabase-crove-client', - UPSTREAM_CLIENT_SECRET: 'supabase-crove-secret', - DOWNSTREAM_CLIENT_ID: 'crove-postiz', - DOWNSTREAM_CLIENT_SECRET: 'bridge-secret-value', - }, - }, - }), - ], - test: { - globals: true, - }, -}); diff --git a/apps/crove-sso/worker-configuration.d.ts b/apps/crove-sso/worker-configuration.d.ts deleted file mode 100644 index db30f51567..0000000000 --- a/apps/crove-sso/worker-configuration.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* eslint-disable */ -// Generated by Wrangler by running `wrangler types --include-runtime=false` (hash: 5c92285b797f3da694d2250982e79c06) -interface __BaseEnv_Env { - UPSTREAM_AUTHORIZE_URL: "https://gulptwduchsjcsbndmua.supabase.co/auth/v1/oauth/authorize"; - UPSTREAM_TOKEN_URL: "https://gulptwduchsjcsbndmua.supabase.co/auth/v1/oauth/token"; - UPSTREAM_USERINFO_URL: "https://gulptwduchsjcsbndmua.supabase.co/auth/v1/oauth/userinfo"; - UPSTREAM_REDIRECT_URI: "https://sso.crove.com/callback"; - DOWNSTREAM_REDIRECT_URI: "https://post.crove.com/settings"; - ALLOWED_SCOPE: "openid profile email"; - OAUTH_STATE: DurableObjectNamespace; -} -declare namespace Cloudflare { - interface GlobalProps { - mainModule: typeof import("./src/index"); - durableNamespaces: "OAuthStateStore"; - } - interface Env extends __BaseEnv_Env {} -} -interface Env extends __BaseEnv_Env {} -type StringifyValues> = { - [Binding in keyof EnvType]: EnvType[Binding] extends string ? EnvType[Binding] : string; -}; -declare namespace NodeJS { - interface ProcessEnv extends StringifyValues> {} -} diff --git a/apps/crove-sso/wrangler.jsonc b/apps/crove-sso/wrangler.jsonc deleted file mode 100644 index b3a9f1c24c..0000000000 --- a/apps/crove-sso/wrangler.jsonc +++ /dev/null @@ -1,76 +0,0 @@ -{ - "$schema": "node_modules/wrangler/config-schema.json", - "name": "crove-sso", - "account_id": "5f2a58925e790423dfafa0e6bee46b28", - "main": "src/index.ts", - "compatibility_date": "2026-08-13", - "compatibility_flags": ["nodejs_compat"], - "routes": [ - { - "pattern": "sso.crove.com", - "custom_domain": true - } - ], - "observability": { - "enabled": true - }, - "durable_objects": { - "bindings": [ - { - "name": "OAUTH_STATE", - "class_name": "OAuthStateStore" - } - ] - }, - "migrations": [ - { - "tag": "v1", - "new_sqlite_classes": ["OAuthStateStore"] - } - ], - "vars": { - "UPSTREAM_AUTHORIZE_URL": "https://gulptwduchsjcsbndmua.supabase.co/auth/v1/oauth/authorize", - "UPSTREAM_TOKEN_URL": "https://gulptwduchsjcsbndmua.supabase.co/auth/v1/oauth/token", - "UPSTREAM_USERINFO_URL": "https://gulptwduchsjcsbndmua.supabase.co/auth/v1/oauth/userinfo", - "UPSTREAM_REDIRECT_URI": "https://sso.crove.com/callback", - "UPSTREAM_CLIENT_ID": "18790ccb-4d71-48cd-ad24-aee5f3ced3da", - "DOWNSTREAM_REDIRECT_URI": "https://post.crove.com/settings", - "DOWNSTREAM_CLIENT_ID": "crove-postiz", - "ALLOWED_SCOPE": "openid profile email" - }, - "env": { - "beta": { - "name": "crove-sso-beta", - "routes": [ - { - "pattern": "beta-sso.crove.com", - "custom_domain": true - } - ], - "durable_objects": { - "bindings": [ - { - "name": "OAUTH_STATE", - "class_name": "OAuthStateStore" - } - ] - }, - "migrations": [ - { - "tag": "v1", - "new_sqlite_classes": ["OAuthStateStore"] - } - ], - "vars": { - "UPSTREAM_AUTHORIZE_URL": "https://oyajkbadsykigtfrpdpg.supabase.co/auth/v1/oauth/authorize", - "UPSTREAM_TOKEN_URL": "https://oyajkbadsykigtfrpdpg.supabase.co/auth/v1/oauth/token", - "UPSTREAM_USERINFO_URL": "https://oyajkbadsykigtfrpdpg.supabase.co/auth/v1/oauth/userinfo", - "UPSTREAM_REDIRECT_URI": "https://beta-sso.crove.com/callback", - "UPSTREAM_CLIENT_ID": "7ef5e5f1-68e6-42a7-901e-1f39e9471d24", - "DOWNSTREAM_REDIRECT_URI": "https://beta-post.crove.com/settings", - "DOWNSTREAM_CLIENT_ID": "crove-postiz", - "ALLOWED_SCOPE": "openid profile email" - } - } - } -} diff --git a/apps/frontend/src/app/(app)/auth/layout.tsx b/apps/frontend/src/app/(app)/auth/layout.tsx index 8157e6b131..9711cb886e 100644 --- a/apps/frontend/src/app/(app)/auth/layout.tsx +++ b/apps/frontend/src/app/(app)/auth/layout.tsx @@ -4,6 +4,8 @@ export const dynamic = 'force-dynamic'; import { ReactNode } from 'react'; import loadDynamic from 'next/dynamic'; import { TestimonialComponent } from '@gitroom/frontend/components/auth/testimonial.component'; +import { MantineWrapper } from '@gitroom/react/helpers/mantine.wrapper'; +import { Toaster } from '@gitroom/react/toaster/toaster'; import { LogoTextComponent } from '@gitroom/frontend/components/ui/logo-text.component'; import { getBrandNameServerSide } from '@gitroom/helpers/utils/is.general.server.side'; import { LanguageComponent } from '@gitroom/frontend/components/layout/language.component'; @@ -19,6 +21,8 @@ export default async function AuthLayout({ const brandName = getBrandNameServerSide(); return ( + +
@@ -41,5 +45,6 @@ export default async function AuthLayout({
+
); } diff --git a/apps/frontend/src/app/(app)/layout.tsx b/apps/frontend/src/app/(app)/layout.tsx index 9495eca762..5e4852d884 100644 --- a/apps/frontend/src/app/(app)/layout.tsx +++ b/apps/frontend/src/app/(app)/layout.tsx @@ -67,7 +67,7 @@ export default async function AppLayout({ children }: { children: ReactNode }) { plontoKey={process.env.NEXT_PUBLIC_POLOTNO!} stripeClient={process.env.STRIPE_PUBLISHABLE_KEY!} isChatBase={!!process.env.CHATBASE_TOKEN} - billingEnabled={!!process.env.STRIPE_PUBLISHABLE_KEY} + billingEnabled={!!process.env.STRIPE_PUBLISHABLE_KEY || process.env.DOS_SHARED_BILLING === 'true'} discordUrl={process.env.NEXT_PUBLIC_DISCORD_SUPPORT!} frontEndUrl={process.env.FRONTEND_URL!} isGeneral={!!process.env.IS_GENERAL} @@ -92,6 +92,11 @@ export default async function AppLayout({ children }: { children: ReactNode }) { googleAdsId={process.env.NEXT_PUBLIC_GTM_ID} googleAdsTrialTracking={process.env.NEXT_PUBLIC_TRACKING_TRIAL} language={language} + mediaProcessing={ + process.env.STORAGE_PROVIDER === 'cloudflare' && + !!process.env.RUNPOD_API_KEY && + !!process.env.RUNPOD_ENDPOINT_ID + } transloadit={ process.env.TRANSLOADIT_AUTH && process.env.TRANSLOADIT_TEMPLATE ? [ diff --git a/apps/frontend/src/app/(extension)/layout.tsx b/apps/frontend/src/app/(extension)/layout.tsx index c4d070af2f..5bc8cc5789 100644 --- a/apps/frontend/src/app/(extension)/layout.tsx +++ b/apps/frontend/src/app/(extension)/layout.tsx @@ -37,7 +37,7 @@ export default async function AppLayout({ children }: { children: ReactNode }) { environment={process.env.NODE_ENV!} backendUrl={process.env.NEXT_PUBLIC_BACKEND_URL!} plontoKey={process.env.NEXT_PUBLIC_POLOTNO!} - billingEnabled={!!process.env.STRIPE_PUBLISHABLE_KEY} + billingEnabled={!!process.env.STRIPE_PUBLISHABLE_KEY || process.env.DOS_SHARED_BILLING === 'true'} discordUrl={process.env.NEXT_PUBLIC_DISCORD_SUPPORT!} frontEndUrl={process.env.FRONTEND_URL!} isGeneral={!!process.env.IS_GENERAL} @@ -60,6 +60,11 @@ export default async function AppLayout({ children }: { children: ReactNode }) { disableXAnalytics={!!process.env.DISABLE_X_ANALYTICS} sentryDsn={process.env.NEXT_PUBLIC_SENTRY_DSN!} extensionId={process.env.EXTENSION_ID || ''} + mediaProcessing={ + process.env.STORAGE_PROVIDER === 'cloudflare' && + !!process.env.RUNPOD_API_KEY && + !!process.env.RUNPOD_ENDPOINT_ID + } transloadit={ process.env.TRANSLOADIT_AUTH && process.env.TRANSLOADIT_TEMPLATE ? [ diff --git a/apps/frontend/src/app/(provider)/layout.tsx b/apps/frontend/src/app/(provider)/layout.tsx index fc1737d723..2c20db68d9 100644 --- a/apps/frontend/src/app/(provider)/layout.tsx +++ b/apps/frontend/src/app/(provider)/layout.tsx @@ -39,7 +39,7 @@ export default async function AppLayout({ children }: { children: ReactNode }) { environment={process.env.NODE_ENV!} backendUrl={process.env.NEXT_PUBLIC_BACKEND_URL!} plontoKey={process.env.NEXT_PUBLIC_POLOTNO!} - billingEnabled={!!process.env.STRIPE_PUBLISHABLE_KEY} + billingEnabled={!!process.env.STRIPE_PUBLISHABLE_KEY || process.env.DOS_SHARED_BILLING === 'true'} discordUrl={process.env.NEXT_PUBLIC_DISCORD_SUPPORT!} frontEndUrl={process.env.FRONTEND_URL!} isGeneral={!!process.env.IS_GENERAL} @@ -62,6 +62,11 @@ export default async function AppLayout({ children }: { children: ReactNode }) { disableXAnalytics={!!process.env.DISABLE_X_ANALYTICS} sentryDsn={process.env.NEXT_PUBLIC_SENTRY_DSN!} extensionId={process.env.EXTENSION_ID || ''} + mediaProcessing={ + process.env.STORAGE_PROVIDER === 'cloudflare' && + !!process.env.RUNPOD_API_KEY && + !!process.env.RUNPOD_ENDPOINT_ID + } transloadit={ process.env.TRANSLOADIT_AUTH && process.env.TRANSLOADIT_TEMPLATE ? [ diff --git a/apps/frontend/src/app/global.scss b/apps/frontend/src/app/global.scss index 1b7000c5a7..a900a44d4f 100644 --- a/apps/frontend/src/app/global.scss +++ b/apps/frontend/src/app/global.scss @@ -524,6 +524,12 @@ div div .set-font-family { display: none !important; } +.hideChatbase #chatbase-bubble-button, +.hideChatbase #chatbase-bubble-window, +.hideChatbase #chatbase-message-bubbles { + display: none !important; +} + html[dir='rtl'] .rbox { direction: rtl !important; } diff --git a/apps/frontend/src/components/admin/admin-stats.component.tsx b/apps/frontend/src/components/admin/admin-stats.component.tsx index 1b5a51659f..2673eaa3bd 100644 --- a/apps/frontend/src/components/admin/admin-stats.component.tsx +++ b/apps/frontend/src/components/admin/admin-stats.component.tsx @@ -27,6 +27,7 @@ interface StatsResponse { scheduledAccounts?: StatsBlock; publishingChannels?: StatsBlock; scheduledChannels?: StatsBlock; + activeOrgsBySource?: StatsBlock; } const isoDaysAgo = (days: number) => { @@ -280,6 +281,14 @@ export const AdminStatsComponent: FC = () => { /> )} + {data.activeOrgsBySource && ( +
+ +
+ )}
@@ -337,6 +346,14 @@ export const AdminStatsComponent: FC = () => { />
)} + {data.activeOrgsBySource && ( +
+ +
+ )} )} diff --git a/apps/frontend/src/components/agents/agent.chat.tsx b/apps/frontend/src/components/agents/agent.chat.tsx index b12cdc85fe..80168237a7 100644 --- a/apps/frontend/src/components/agents/agent.chat.tsx +++ b/apps/frontend/src/components/agents/agent.chat.tsx @@ -9,11 +9,12 @@ import React, { useRef, useState, } from 'react'; -import { CopilotChat, CopilotKitCSSProperties } from '@copilotkit/react-ui'; import { + CopilotChat, + CopilotKitCSSProperties, InputProps, UserMessageProps, -} from '@copilotkit/react-ui/dist/components/chat/props'; +} from '@copilotkit/react-ui'; import { Input } from '@gitroom/frontend/components/agents/agent.input'; import { useModals } from '@gitroom/frontend/components/layout/new-modal'; import { @@ -50,6 +51,7 @@ export const AgentChat: FC = () => { {...(params.id === 'new' ? {} : { threadId: params.id })} credentials="include" runtimeUrl={backendUrl + '/copilot/agent'} + useSingleEndpoint={true} showDevConsole={false} agent="postiz" properties={{ @@ -104,7 +106,11 @@ const LoadMessages: FC<{ id: string }> = ({ id }) => { const data = await (await fetch(`/copilot/${idToSet}/list`)).json(); const list = data.messages.map((p: any) => { return new TextMessage({ - content: p.content.content, + content: + p.content.content || + (p.content.parts || []) + .map((part: any) => (part.type === 'text' ? part.text : '')) + .join(''), role: p.role, }); }); @@ -150,7 +156,13 @@ const LoadMessages: FC<{ id: string }> = ({ id }) => { const Message: FC = (props) => { const convertContentToImagesAndVideo = useMemo(() => { - return (props.message?.content || '') + const content = props.message?.content || ''; + const text = + typeof content === 'string' + ? content + : content.map((p) => (p.type === 'text' ? p.text : '')).join(''); + + return text .replace(/Video: (http.*mp4\n)/g, (match, p1) => { return ``; }) diff --git a/apps/frontend/src/components/agents/agent.input.tsx b/apps/frontend/src/components/agents/agent.input.tsx index 85d22b9b05..7e59cc5693 100644 --- a/apps/frontend/src/components/agents/agent.input.tsx +++ b/apps/frontend/src/components/agents/agent.input.tsx @@ -1,8 +1,11 @@ import React, { useMemo, useRef, useState } from 'react'; -import { useCopilotContext, useCopilotReadable } from '@copilotkit/react-core'; +import { + useCopilotChatInternal, + useCopilotContext, + useCopilotReadable, +} from '@copilotkit/react-core'; import AutoResizingTextarea from '@gitroom/frontend/components/agents/agent.textarea'; -import { useChatContext } from '@copilotkit/react-ui'; -import { InputProps } from '@copilotkit/react-ui/dist/components/chat/props'; +import { useChatContext, InputProps } from '@copilotkit/react-ui'; const MAX_NEWLINES = 6; export const Input = ({ @@ -49,14 +52,10 @@ export const Input = ({ ? context.icons.stopIcon : context.icons.sendIcon; + const { interrupt } = useCopilotChatInternal(); const canSend = useMemo(() => { - const interruptEvent = copilotContext.langGraphInterruptAction?.event; - const interruptInProgress = - interruptEvent?.name === 'LangGraphInterruptEvent' && - !interruptEvent?.response; - - return !isInProgress && text.trim().length > 0 && !interruptInProgress; - }, [copilotContext.langGraphInterruptAction?.event, isInProgress, text]); + return !isInProgress && text.trim().length > 0 && !interrupt; + }, [interrupt, isInProgress, text]); const canStop = useMemo(() => { return isInProgress && !hideStopButton; diff --git a/apps/frontend/src/components/auth/nayner.auth.button.tsx b/apps/frontend/src/components/auth/nayner.auth.button.tsx deleted file mode 100644 index da450b6df6..0000000000 --- a/apps/frontend/src/components/auth/nayner.auth.button.tsx +++ /dev/null @@ -1,85 +0,0 @@ -'use client'; - -import React, { - useCallback, - useEffect, - useState, - useRef, - FC, - ReactNode, -} from 'react'; -import { useNeynarContext } from '@neynar/react'; -export const NeynarAuthButton: FC<{ - children: ReactNode; - onLogin: (code: string) => void; -}> = (props) => { - const { children, onLogin } = props; - const { client_id } = useNeynarContext(); - const [showModal, setShowModal] = useState(false); - const authWindowRef = useRef(null); - const neynarLoginUrl = `${ - process.env.NEYNAR_LOGIN_URL ?? 'https://app.neynar.com/login' - }?client_id=${client_id}`; - const authOrigin = new URL(neynarLoginUrl).origin; - const modalRef = useRef(null); - const handleMessage = useCallback( - async (event: MessageEvent) => { - if ( - event.origin === authOrigin && - event.data && - event.data.is_authenticated - ) { - authWindowRef.current?.close(); - window.removeEventListener('message', handleMessage); // Remove listener here - delete event.data.user.profile; - const _user = { - signer_uuid: event.data.signer_uuid, - ...event.data.user, - }; - onLogin(Buffer.from(JSON.stringify(_user)).toString('base64')); - } - }, - [client_id, onLogin] - ); - const handleSignIn = useCallback(() => { - const width = 600, - height = 700; - const left = window.screen.width / 2 - width / 2; - const top = window.screen.height / 2 - height / 2; - const windowFeatures = `width=${width},height=${height},top=${top},left=${left}`; - authWindowRef.current = window.open( - neynarLoginUrl, - '_blank', - windowFeatures - ); - if (!authWindowRef.current) { - console.error( - 'Failed to open the authentication window. Please check your pop-up blocker settings.' - ); - return; - } - window.addEventListener('message', handleMessage, false); - }, [client_id, handleMessage]); - const closeModal = () => setShowModal(false); - useEffect(() => { - return () => { - window.removeEventListener('message', handleMessage); // Cleanup function to remove listener - }; - }, [handleMessage]); - const handleOutsideClick = useCallback((event: any) => { - if (modalRef.current && !modalRef.current.contains(event.target)) { - closeModal(); - } - }, []); - useEffect(() => { - if (showModal) { - document.addEventListener('mousedown', handleOutsideClick); - } else { - document.removeEventListener('mousedown', handleOutsideClick); - } - return () => { - document.removeEventListener('mousedown', handleOutsideClick); - }; - }, [showModal, handleOutsideClick]); - return
{children}
; -}; diff --git a/apps/frontend/src/components/auth/providers/farcaster.provider.tsx b/apps/frontend/src/components/auth/providers/farcaster.provider.tsx index 683b67e224..9c1cb3b0c9 100644 --- a/apps/frontend/src/components/auth/providers/farcaster.provider.tsx +++ b/apps/frontend/src/components/auth/providers/farcaster.provider.tsx @@ -1,59 +1,205 @@ 'use client'; -import { FC, useCallback } from 'react'; -import { useVariables } from '@gitroom/react/helpers/variable.context'; -import { NeynarContextProvider, Theme, useNeynarContext } from '@neynar/react'; -import { NeynarAuthButton } from '@gitroom/frontend/components/auth/nayner.auth.button'; +import { FC, useCallback, useEffect, useRef, useState } from 'react'; +import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; +import { timer } from '@gitroom/helpers/utils/timer'; +import { useToaster } from '@gitroom/react/toaster/toaster'; import { useT } from '@gitroom/react/translation/get.transation.service.client'; +import { useModals } from '@gitroom/frontend/components/layout/new-modal'; +import { Button } from '@gitroom/react/form/button'; +import copy from 'copy-to-clipboard'; +import Loading from '@gitroom/frontend/components/layout/loading'; export const FarcasterProvider = () => { + const fetch = useFetch(); + const modal = useModals(); + const t = useT(); const gotoLogin = useCallback(async (code: string) => { - window.location.href = `/auth?provider=FARCASTER&code=${code}`; + const state = await (await fetch('/auth/oauth/FARCASTER')).text(); + window.location.href = `/auth?provider=FARCASTER&code=${encodeURIComponent(code)}&state=${state}`; + }, []); + const open = useCallback(() => { + modal.openModal({ + title: t('farcaster', 'Farcaster'), + withCloseButton: true, + classNames: { + modal: 'bg-transparent text-textColor', + }, + children: (close) => ( + + ), + }); }, []); - return ; + return ( +
+ + + + + + + + + + + +
{t('farcaster', 'Farcaster')}
+
+ ); }; -export const ButtonCaster: FC<{ +export const FarcasterApproval: FC<{ login: (code: string) => void; + onFail: () => void; }> = (props) => { - const { login } = props; - const { neynarClientId } = useVariables(); + const { login, onFail } = props; + const fetch = useFetch(); + const toaster = useToaster(); const t = useT(); + const activeSigner = useRef(''); + const [approvalUrl, setApprovalUrl] = useState(''); + const [qrCode, setQrCode] = useState(''); + + async function* load(signerUuid: string) { + while (true) { + try { + yield await ( + await fetch( + `/auth/farcaster/signer?signerUuid=${encodeURIComponent( + signerUuid + )}` + ) + ).json(); + } catch (err) { + // network blip, keep polling until approved or timed out + yield {}; + } + } + } + + const poll = async (signerUuid: string) => { + activeSigner.current = signerUuid; + const startedAt = Date.now(); + const generator = load(signerUuid); + for await (const data of generator) { + if (activeSigner.current !== signerUuid) { + return; + } + if (data.status === 'approved') { + login(data.code); + return; + } + if (data.status === 'revoked') { + toaster.show( + t( + 'farcaster_signer_revoked', + 'The Farcaster approval was revoked, please try again' + ), + 'warning' + ); + onFail(); + return; + } + if (Date.now() - startedAt > 10 * 60 * 1000) { + toaster.show( + t( + 'farcaster_approval_timeout', + 'Farcaster approval timed out, please try again' + ), + 'warning' + ); + onFail(); + return; + } + await timer(2000); + } + }; + + const start = async () => { + try { + const data = await ( + await fetch('/auth/farcaster/signer', { method: 'POST' }) + ).json(); + if (!data.approvalUrl) { + toaster.show( + data.error || + t( + 'farcaster_signer_failed', + 'Failed to start the Farcaster connection' + ), + 'warning' + ); + onFail(); + return; + } + setApprovalUrl(data.approvalUrl); + setQrCode(data.qrCode); + poll(data.signerUuid); + } catch (err) { + toaster.show( + t('farcaster_signer_failed', 'Failed to start the Farcaster connection'), + 'warning' + ); + onFail(); + } + }; + + const copyLink = useCallback(() => { + copy(approvalUrl); + toaster.show( + t('link_copied_to_clipboard', 'Link copied to clipboard'), + 'success' + ); + }, [approvalUrl]); + + useEffect(() => { + start(); + return () => { + activeSigner.current = ''; + }; + }, []); + + if (!approvalUrl) { + return ( +
+ +
+ ); + } + return ( - - -
- - - - - - - - - - - -
{t('farcaster', 'Farcaster')}
-
-
-
+
+ +
+ {t( + 'farcaster_scan_instructions', + 'Scan the QR code with your phone, or copy the link and open it on your phone, then approve Postiz in the Farcaster app.' + )} +
+ +
+ + {t('farcaster_waiting_for_approval', 'Waiting for your approval...')} +
+
); }; diff --git a/apps/frontend/src/components/billing/first.billing.component.tsx b/apps/frontend/src/components/billing/first.billing.component.tsx index ee8d8b1657..bd4d631cad 100644 --- a/apps/frontend/src/components/billing/first.billing.component.tsx +++ b/apps/frontend/src/components/billing/first.billing.component.tsx @@ -53,15 +53,20 @@ export const FirstBillingComponent = () => { const [stripe, setStripe] = useState>(null); const [tier, setTier] = useState('STANDARD'); const [period, setPeriod] = useState('MONTHLY'); + const [dosCheckoutLoading, setDosCheckoutLoading] = useState(false); const fetch = useFetch(); const modals = useModals(); const t = useT(); const [datafast_visitor_id] = useCookie('datafast_visitor_id', ''); const [datafast_session_id] = useCookie('datafast_session_id', ''); + const sharedDosBilling = !!user?.sharedDosBilling; useEffect(() => { + if (sharedDosBilling) { + return; + } setStripe(loadStripe(stripeClient)); - }, []); + }, [sharedDosBilling, stripeClient]); const loadCheckout = useCallback(async () => { return ( @@ -79,6 +84,30 @@ export const FirstBillingComponent = () => { ).json(); }, [tier, period]); + const startDosCheckout = useCallback(async () => { + setDosCheckoutLoading(true); + try { + const result = await ( + await fetch('/billing/subscribe', { + method: 'POST', + body: JSON.stringify({ + billing: tier, + period: 'MONTHLY', + }), + }) + ).json(); + if (result.url) { + window.location.href = result.url; + return; + } + if (result.portal) { + window.location.href = result.portal; + } + } finally { + setDosCheckoutLoading(false); + } + }, [fetch, tier]); + const showYouTube = () => { modals.openModal({ title: 'Grow Fast With Postiz (Play the video)', @@ -95,7 +124,7 @@ export const FirstBillingComponent = () => { }; const { data, isLoading } = useSWR( - `/billing-${tier}-${period}`, + sharedDosBilling ? null : `/billing-${tier}-${period}`, loadCheckout, { revalidateOnFocus: false, @@ -107,8 +136,13 @@ export const FirstBillingComponent = () => { ); const price = useMemo( - () => Object.entries(pricing).filter(([key, value]) => key !== 'FREE'), - [] + () => + Object.entries(pricing).filter(([key]) => + sharedDosBilling + ? key === 'STANDARD' || key === 'PRO' + : key !== 'FREE' + ), + [sharedDosBilling] ); const JoinOver = () => { @@ -212,6 +246,25 @@ export const FirstBillingComponent = () => { 'Another account with this email already has an active subscription. Please log off and sign in to that account to manage your subscription.' )} + ) : sharedDosBilling ? ( +
+
+ {t( + 'billing_dos_shared_plan', + 'Crove uses your DOS plan. Plus is $9/month (5 channels). Pro is $19/month (30 channels). One checkout covers DOS.AI and Crove.' + )} +
+ +
) : !isLoading && data && stripe ? ( { > {t('billing_monthly', 'Monthly')} + {!sharedDosBilling && (
{ {t('billing_20_percent_off', '20% Off')}
+ )}
@@ -274,16 +329,22 @@ export const FirstBillingComponent = () => { )} >
- {capitalize(key)} + {sharedDosBilling && key === 'STANDARD' + ? 'Plus' + : sharedDosBilling && key === 'PRO' + ? 'Pro' + : capitalize(key)}
$ - { - value[ - period === 'MONTHLY' ? 'month_price' : 'year_price' - ] - } + {sharedDosBilling + ? key === 'PRO' + ? 19 + : 9 + : value[ + period === 'MONTHLY' ? 'month_price' : 'year_price' + ]} {' '} {period === 'MONTHLY' ? t('billing_per_month', '/ month') diff --git a/apps/frontend/src/components/billing/main.billing.component.tsx b/apps/frontend/src/components/billing/main.billing.component.tsx index ff75f66dba..cd51e17381 100644 --- a/apps/frontend/src/components/billing/main.billing.component.tsx +++ b/apps/frontend/src/components/billing/main.billing.component.tsx @@ -221,6 +221,7 @@ export const MainBillingComponent: FC<{ const fetch = useFetch(); const toast = useToaster(); const user = useUser(); + const sharedDosBilling = !!user?.sharedDosBilling; const dub = useDubClickId(); const modal = useModals(); const router = useRouter(); @@ -265,14 +266,16 @@ export const MainBillingComponent: FC<{ if (!subscription) { return 'FREE'; } - if (period === 'YEARLY' && monthlyOrYearly === 'off') { - return ''; - } - if (period === 'MONTHLY' && monthlyOrYearly === 'on') { - return ''; + if (!sharedDosBilling) { + if (period === 'YEARLY' && monthlyOrYearly === 'off') { + return ''; + } + if (period === 'MONTHLY' && monthlyOrYearly === 'on') { + return ''; + } } return subscription?.subscriptionTier; - }, [subscription, initialChannels, monthlyOrYearly, period]); + }, [subscription, initialChannels, monthlyOrYearly, period, sharedDosBilling]); const moveToCheckout = useCallback( (billing: 'STANDARD' | 'PRO' | 'FREE', reactivate = false) => async () => { @@ -318,25 +321,27 @@ export const MainBillingComponent: FC<{ 'Cancel Subscription' )) ) { - const checkDiscount = await ( - await fetch('/billing/check-discount') - ).json(); - if (checkDiscount.offerCoupon) { - const info = await new Promise((res) => { - modal.openModal({ - title: 'Before you cancel', - withCloseButton: true, - classNames: { - modal: 'bg-transparent text-textColor', - }, - children: , + if (!sharedDosBilling) { + const checkDiscount = await ( + await fetch('/billing/check-discount') + ).json(); + if (checkDiscount.offerCoupon) { + const info = await new Promise((res) => { + modal.openModal({ + title: 'Before you cancel', + withCloseButton: true, + classNames: { + modal: 'bg-transparent text-textColor', + }, + children: , + }); }); - }); - modal.closeAll(); + modal.closeAll(); - if (info) { - return; + if (info) { + return; + } } } @@ -481,6 +486,7 @@ export const MainBillingComponent: FC<{
{t('plans', 'Plans')}
+ {!sharedDosBilling && (
{t('monthly', 'MONTHLY')}
@@ -488,27 +494,43 @@ export const MainBillingComponent: FC<{
{t('yearly', 'YEARLY')}
+ )}
{finishTrial && setFinishTrial(false)} />}
{Object.entries(pricing) - .filter((f) => !isGeneral || f[0] !== 'FREE') + .filter((f) => { + if (sharedDosBilling) { + return ['FREE', 'STANDARD', 'PRO'].includes(f[0]); + } + return !isGeneral || f[0] !== 'FREE'; + }) .map(([name, values]) => (
-
{name}
+
+ {sharedDosBilling && name === 'STANDARD' ? 'Plus' : name} +
$ - {monthlyOrYearly === 'on' + {sharedDosBilling + ? name === 'PRO' + ? 19 + : name === 'STANDARD' + ? 9 + : 0 + : monthlyOrYearly === 'on' ? values.year_price : values.month_price}
- {monthlyOrYearly === 'on' ? '/year' : '/month'} + {sharedDosBilling || monthlyOrYearly !== 'on' + ? '/month' + : '/year'}
diff --git a/apps/frontend/src/components/launches/add.provider.component.tsx b/apps/frontend/src/components/launches/add.provider.component.tsx index b47070b11e..bc46c6e97e 100644 --- a/apps/frontend/src/components/launches/add.provider.component.tsx +++ b/apps/frontend/src/components/launches/add.provider.component.tsx @@ -453,7 +453,7 @@ export const AddProviderComponent: FC<{ > { - window.location.href = `/integrations/social/${identifier}?code=${code}&state=${newState}${ + window.location.href = `/integrations/social/${identifier}?code=${encodeURIComponent(code)}&state=${newState}${ onboarding ? '&onboarding=true' : '' }`; }} diff --git a/apps/frontend/src/components/launches/customer.modal.tsx b/apps/frontend/src/components/launches/customer.modal.tsx index 07b7b83a93..591a719bd7 100644 --- a/apps/frontend/src/components/launches/customer.modal.tsx +++ b/apps/frontend/src/components/launches/customer.modal.tsx @@ -3,7 +3,6 @@ import React, { FC, useCallback, useEffect, useState } from 'react'; import { useModals } from '@gitroom/frontend/components/layout/new-modal'; import { Integration } from '@prisma/client'; -import { Autocomplete } from '@mantine/core'; import useSWR from 'swr'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; import { Button } from '@gitroom/react/form/button'; @@ -50,17 +49,24 @@ export const CustomerModal: FC<{ const { data } = useSWR('/customers', loadCustomers); return (
-
- + + setCustomer(e.target.value)} placeholder={t('start_typing', 'Start typing...')} - data={data?.map((p: any) => p.name) || []} + autoComplete="off" + className="bg-newBgColorInner h-[42px] border-newTableBorder border rounded-[8px] text-textColor placeholder-textColor px-[16px] text-[14px] outline-none" /> + + {(data?.map((p: any) => p.name) || []).map((name: string) => ( +
diff --git a/apps/frontend/src/components/launches/information.component.tsx b/apps/frontend/src/components/launches/information.component.tsx index c734429f45..718a8eb643 100644 --- a/apps/frontend/src/components/launches/information.component.tsx +++ b/apps/frontend/src/components/launches/information.component.tsx @@ -1,6 +1,6 @@ 'use client'; -import React, { FC, Fragment, useMemo } from 'react'; +import React, { FC, Fragment, useCallback, useMemo } from 'react'; import { useLaunchStore } from '@gitroom/frontend/components/new-launch/store'; import { useShallow } from 'zustand/react/shallow'; import clsx from 'clsx'; @@ -8,6 +8,7 @@ import SafeImage from '@gitroom/react/helpers/safe.image'; import { capitalize } from 'lodash'; import { useT } from '@gitroom/react/translation/get.transation.service.client'; import { hasLinks } from '@gitroom/helpers/utils/strip.links'; +import { countLength } from '@gitroom/helpers/utils/count.length'; const Valid: FC = () => { return ( @@ -91,6 +92,13 @@ export const InformationComponent: FC<{ const showStripLinkWarning = stripLinkNames.length > 0; + const countFor = useCallback( + (identifier?: string) => countLength(identifier || '', text || ''), + [text] + ); + + const currentChars = countFor(currentIntegration?.identifier); + const isInternal = useMemo(() => { if (!isGlobal) { return []; @@ -113,11 +121,11 @@ export const InformationComponent: FC<{ return false; } - if (totalChars > totalAllowedChars && !isGlobal) { + if (currentChars > totalAllowedChars && !isGlobal) { return false; } - if (totalChars <= totalAllowedChars && !isGlobal) { + if (currentChars <= totalAllowedChars && !isGlobal) { return true; } @@ -127,7 +135,10 @@ export const InformationComponent: FC<{ return false; } - return totalChars > (chars?.[p.integration.id] || 0); + return ( + countFor(p.integration.identifier) > + (chars?.[p.integration.id] || 0) + ); }) ) { return false; @@ -137,6 +148,8 @@ export const InformationComponent: FC<{ }, [ totalAllowedChars, totalChars, + currentChars, + countFor, isInternal, isPicture, chars, @@ -152,11 +165,11 @@ export const InformationComponent: FC<{ const limits = selectedIntegrations .map((p, index) => ({ limit: chars?.[p.integration.id] || 0, + count: countFor(p.integration.identifier), isInternal: isInternal[index], })) .filter((item) => !item.isInternal && item.limit > 0) - .map((item) => item.limit) - .sort((a, b) => a - b); + .sort((a, b) => a.limit - b.limit); if (!limits.length) { return null; @@ -164,9 +177,9 @@ export const InformationComponent: FC<{ // Find the smallest limit that hasn't been exceeded yet // If all are exceeded, show the smallest one - const validLimit = limits.find((limit) => totalChars <= limit); + const validLimit = limits.find((item) => item.count <= item.limit); return validLimit ?? limits[0]; - }, [isGlobal, selectedIntegrations, chars, isInternal, totalChars]); + }, [isGlobal, selectedIntegrations, chars, isInternal, countFor]); return (
- {totalChars}/{totalAllowedChars} + {currentChars}/{totalAllowedChars}
)} {isGlobal && globalDisplayLimit !== null && (
- {totalChars}/{globalDisplayLimit} + {globalDisplayLimit.count}/{globalDisplayLimit.limit}
)} {((isGlobal && selectedIntegrations.length) || !isValid) && ( @@ -237,7 +250,8 @@ export const InformationComponent: FC<{ 'whitespace-nowrap', isInternal?.[index] ? '' - : totalChars > (chars?.[p.integration.id] || 0) + : countFor(p.integration.identifier) > + (chars?.[p.integration.id] || 0) ? 'text-[#FF3F3F]' : '' )} @@ -250,14 +264,17 @@ export const InformationComponent: FC<{ 'whitespace-nowrap', isInternal?.[index] ? '' - : totalChars > (chars?.[p.integration.id] || 0) + : countFor(p.integration.identifier) > + (chars?.[p.integration.id] || 0) ? 'text-[#FF3F3F]' : '' )} > {isInternal?.[index] ? t('internal_edit', 'Internal Edit') - : `${totalChars}/${chars?.[p.integration.id] || 0}`} + : `${countFor(p.integration.identifier)}/${ + chars?.[p.integration.id] || 0 + }`}
))} diff --git a/apps/frontend/src/components/launches/launches.component.tsx b/apps/frontend/src/components/launches/launches.component.tsx index 8544a3e77f..bb8d9ce6d7 100644 --- a/apps/frontend/src/components/launches/launches.component.tsx +++ b/apps/frontend/src/components/launches/launches.component.tsx @@ -1,6 +1,9 @@ 'use client'; -import { AddProviderButton } from '@gitroom/frontend/components/launches/add.provider.component'; +import { + AddProviderButton, + CustomVariables, +} from '@gitroom/frontend/components/launches/add.provider.component'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import SafeImage from '@gitroom/react/helpers/safe.image'; import { capitalize, groupBy, orderBy } from 'lodash'; @@ -26,6 +29,7 @@ import { useT } from '@gitroom/react/translation/get.transation.service.client'; import { useIntegrationList } from '@gitroom/frontend/components/launches/helpers/use.integration.list'; import useCookie from 'react-use-cookie'; import { Onboarding } from '@gitroom/frontend/components/onboarding/onboarding'; +import { useModals } from '@gitroom/frontend/components/layout/new-modal'; export const SVGLine = () => { return ( @@ -358,6 +362,7 @@ export const LaunchesComponent = () => { const toast = useToaster(); const fireEvents = useFireEvents(); const t = useT(); + const modal = useModals(); const [reload, setReload] = useState(false); const [collapseMenu, setCollapseMenu] = useCookie('collapseMenu', '0'); const [mode] = useCookie('mode', 'dark'); @@ -441,9 +446,31 @@ export const LaunchesComponent = () => { ( integration: Integration & { identifier: string; + isCustomFields?: boolean; + customFields?: any[]; } ) => async () => { + // Custom-fields providers (Bluesky, etc.) have no OAuth URL to redirect + // to: reconnect by re-entering the credentials, like the menu does. + if (integration.isCustomFields) { + modal.openModal({ + title: t('custom_url', 'Custom URL'), + withCloseButton: false, + classNames: { + modal: 'md', + }, + children: ( + router.push(url)} + variables={integration.customFields || []} + /> + ), + }); + return; + } + const { url } = await ( await fetch( `/integrations/social/${integration.identifier}?refresh=${integration.internalId}`, diff --git a/apps/frontend/src/components/launches/web3/providers/telegram.provider.tsx b/apps/frontend/src/components/launches/web3/providers/telegram.provider.tsx index 8ade765367..94f77a5703 100644 --- a/apps/frontend/src/components/launches/web3/providers/telegram.provider.tsx +++ b/apps/frontend/src/components/launches/web3/providers/telegram.provider.tsx @@ -1,6 +1,5 @@ 'use client'; -import '@neynar/react/dist/style.css'; import React, { FC, useCallback, useEffect, useRef, useState } from 'react'; import { Web3ProviderInterface } from '@gitroom/frontend/components/launches/web3/web3.provider.interface'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; diff --git a/apps/frontend/src/components/launches/web3/providers/wrapcaster.provider.tsx b/apps/frontend/src/components/launches/web3/providers/wrapcaster.provider.tsx index c3814ac9cd..fec71e5f8a 100644 --- a/apps/frontend/src/components/launches/web3/providers/wrapcaster.provider.tsx +++ b/apps/frontend/src/components/launches/web3/providers/wrapcaster.provider.tsx @@ -1,20 +1,10 @@ 'use client'; -import '@neynar/react/dist/style.css'; -import React, { FC, useMemo, useState, useCallback, useEffect } from 'react'; +import React, { FC, useState, useCallback } from 'react'; import { Web3ProviderInterface } from '@gitroom/frontend/components/launches/web3/web3.provider.interface'; -import { useVariables } from '@gitroom/react/helpers/variable.context'; -import { TopTitle } from '@gitroom/frontend/components/launches/helpers/top.title.component'; -import { useModals } from '@gitroom/frontend/components/layout/new-modal'; import { LoadingComponent } from '@gitroom/frontend/components/layout/loading'; -import { - NeynarAuthButton, - NeynarContextProvider, - Theme, - useNeynarContext, -} from '@neynar/react'; -import { INeynarAuthenticatedUser } from '@neynar/react/dist/types/common'; -import { ButtonCaster } from '@gitroom/frontend/components/auth/providers/farcaster.provider'; +import { useModals } from '@gitroom/frontend/components/layout/new-modal'; +import { FarcasterApproval } from '@gitroom/frontend/components/auth/providers/farcaster.provider'; export const WrapcasterProvider: FC = (props) => { const [_, state] = props.nonce.split('||'); const modal = useModals(); @@ -33,9 +23,8 @@ export const WrapcasterProvider: FC = (props) => {
) : ( -
-
Click on the bottom below to start the process
- +
+
)}
diff --git a/apps/frontend/src/components/layout/user.context.tsx b/apps/frontend/src/components/layout/user.context.tsx index c6490c5f06..d3f0588eda 100644 --- a/apps/frontend/src/components/layout/user.context.tsx +++ b/apps/frontend/src/components/layout/user.context.tsx @@ -19,6 +19,8 @@ export const UserContext = createContext< allowTrial: boolean; isTrailing: boolean; streakSince: string | null; + sharedDosBilling?: boolean; + dosPlan?: 'free' | 'plus' | 'pro' | null; }) >(undefined); export const ContextWrapper: FC<{ diff --git a/apps/frontend/src/components/media/media.component.tsx b/apps/frontend/src/components/media/media.component.tsx index 2dbbd83fc1..901e9e5400 100644 --- a/apps/frontend/src/components/media/media.component.tsx +++ b/apps/frontend/src/components/media/media.component.tsx @@ -170,28 +170,30 @@ export const Pagination: FC<{ ); }; export const ShowMediaBoxModal: FC = () => { - const [showModal, setShowModal] = useState(false); - const [callBack, setCallBack] = - useState<(params: { id: string; path: string }[]) => void | undefined>(); - const closeModal = useCallback(() => { - setShowModal(false); - setCallBack(undefined); - }, []); + const modals = useModals(); + const t = useT(); useEffect(() => { showModalEmitter.on('show-modal', (cCallback) => { - setShowModal(true); - setCallBack(() => cCallback); + modals.openModal({ + title: t('media_library', 'Media Library'), + askClose: false, + closeOnEscape: true, + fullScreen: true, + size: 'calc(100% - 80px)', + height: 'calc(100% - 80px)', + children: (close) => ( + cCallback(media[0])} + closeModal={close} + /> + ), + }); }); return () => { showModalEmitter.removeAllListeners('show-modal'); }; }, []); - if (!showModal) return null; - return ( -
- -
- ); + return null; }; export const showMediaBox = ( callback: (params: { id: string; path: string }) => void diff --git a/apps/frontend/src/components/media/new.uploader.tsx b/apps/frontend/src/components/media/new.uploader.tsx index cde95e738a..532dc0132a 100644 --- a/apps/frontend/src/components/media/new.uploader.tsx +++ b/apps/frontend/src/components/media/new.uploader.tsx @@ -3,7 +3,10 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; import Uppy, { BasePlugin, UploadResult, UppyFile } from '@uppy/core'; // @ts-ignore import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; -import { getUppyUploadPlugin } from '@gitroom/react/helpers/uppy.upload'; +import { + getUppyUploadPlugin, + WaitForMediaProcessing, +} from '@gitroom/react/helpers/uppy.upload'; import { Dashboard, FileInput, ProgressBar } from '@uppy/react'; // Uppy styles @@ -44,8 +47,14 @@ export function useUppyUploader(props: { }) { const setLocked = useLaunchStore((state) => state.setLocked); const toast = useToaster(); - const { storageProvider, backendUrl, disableImageCompression, transloadit } = - useVariables(); + const t = useT(); + const { + storageProvider, + backendUrl, + disableImageCompression, + transloadit, + mediaProcessing, + } = useVariables(); const { onUploadSuccess, allowedFileTypes } = props; const fetch = useFetch(); return useMemo(() => { @@ -84,6 +93,10 @@ export function useUppyUploader(props: { if (type === 'video/*') { return ['video/mp4', 'video/mpeg', 'video/quicktime']; } + // the normalizer turns QuickTime into mp4, nothing else is accepted by the bucket + if (type === 'video/mp4' && mediaProcessing) { + return ['video/mp4', 'video/quicktime']; + } if (type === 'video/mp4' && transloadit && transloadit.length > 0) { return ['video/mp4', 'video/mpeg', 'video/quicktime']; } @@ -167,15 +180,31 @@ export function useUppyUploader(props: { }); }); + // The normalizer takes precedence over Transloadit, so both can stay + // configured and turning the normalizer off falls back to Transloadit + const useTransloadit = !mediaProcessing && transloadit.length > 0; const { plugin, options } = getUppyUploadPlugin( - transloadit.length > 0 ? 'transloadit' : storageProvider, + useTransloadit ? 'transloadit' : storageProvider, fetch, backendUrl, transloadit ); uppy2.use(plugin, options); - if (!disableImageCompression) { + // installed whenever the record can come back "processing", so the backend + // decides; it passes files through untouched when the row is already ready + if (storageProvider === 'cloudflare' && !useTransloadit) { + uppy2.use(WaitForMediaProcessing, { + fetch, + processingMessage: t('processing', 'Processing...'), + fallbackMessage: t( + 'could_not_optimize_file', + 'Could not optimize the file, the original will be used' + ), + }); + } + // the normalizer resizes on the server, shrinking first would only make it upscale a blurry copy + if (!disableImageCompression && !mediaProcessing) { uppy2.use(CompressionWrapper, { convertTypes: ['image/jpeg', 'image/png', 'image/webp'], maxWidth: 1000, @@ -222,7 +251,7 @@ export function useUppyUploader(props: { return; } - if (transloadit.length > 0) { + if (useTransloadit) { // @ts-ignore const allRes = result.transloadit[0].results; const toSave = uniqBy<{ name: string; originalName: string; order: number }>( 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 a974e4bf5a..7de3d565d9 100644 --- a/apps/frontend/src/components/new-launch/add.edit.modal.tsx +++ b/apps/frontend/src/components/new-launch/add.edit.modal.tsx @@ -52,6 +52,13 @@ export const AddEditModal: FC = (props) => { setIsCreateSet(!!props.addEditSets); }, []); + useEffect(() => { + document.querySelector('body')?.classList.add('hideChatbase'); + return () => { + document.querySelector('body')?.classList.remove('hideChatbase'); + }; + }, []); + if (!integrations.length) { return null; } diff --git a/apps/frontend/src/components/new-launch/providers/reddit/subreddit.tsx b/apps/frontend/src/components/new-launch/providers/reddit/subreddit.tsx index c3bdd53ffb..ae3b2d5a4f 100644 --- a/apps/frontend/src/components/new-launch/providers/reddit/subreddit.tsx +++ b/apps/frontend/src/components/new-launch/providers/reddit/subreddit.tsx @@ -90,6 +90,7 @@ export const Subreddit: FC<{ ...restrictions, type: restrictions.allow[0], media: [], + url: '', }, }, }); diff --git a/apps/frontend/src/components/new-layout/layout.component.tsx b/apps/frontend/src/components/new-layout/layout.component.tsx index 18b7e651fd..6d47d15f41 100644 --- a/apps/frontend/src/components/new-layout/layout.component.tsx +++ b/apps/frontend/src/components/new-layout/layout.component.tsx @@ -81,6 +81,7 @@ export const LayoutComponent = ({ children }: { children: ReactNode }) => { diff --git a/apps/frontend/src/components/preview/preview.wrapper.tsx b/apps/frontend/src/components/preview/preview.wrapper.tsx index f2922aba19..85df00de49 100644 --- a/apps/frontend/src/components/preview/preview.wrapper.tsx +++ b/apps/frontend/src/components/preview/preview.wrapper.tsx @@ -27,6 +27,7 @@ export const PreviewWrapper = ({ children }: { children: ReactNode }) => { diff --git a/apps/orchestrator/src/activities/media.activity.ts b/apps/orchestrator/src/activities/media.activity.ts new file mode 100644 index 0000000000..beff47318f --- /dev/null +++ b/apps/orchestrator/src/activities/media.activity.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; +import { Activity, ActivityMethod } from 'nestjs-temporal-core'; +import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; + +@Injectable() +@Activity() +export class MediaActivity { + constructor(private _mediaService: MediaService) {} + + // Returns the processor job id, or null when there is nothing to process + @ActivityMethod() + async submitMediaProcessing(mediaId: string) { + return this._mediaService.submitProcessing(mediaId); + } + + // Returns true once the media record is final (ready or failed) + @ActivityMethod() + async checkMediaProcessing(mediaId: string, jobId: string) { + return this._mediaService.checkProcessing(mediaId, jobId); + } + + @ActivityMethod() + async failMediaProcessing(mediaId: string, error: string) { + return this._mediaService.failProcessing(mediaId, error); + } +} diff --git a/apps/orchestrator/src/activities/post.activity.ts b/apps/orchestrator/src/activities/post.activity.ts index 271213f2aa..5c18c34759 100644 --- a/apps/orchestrator/src/activities/post.activity.ts +++ b/apps/orchestrator/src/activities/post.activity.ts @@ -498,7 +498,10 @@ export class PostActivity { return; } - const post = await this._postService.getPostByForWebhookId(postId); + const post = await this._postService.getPostByForWebhookId( + postId, + integrationId + ); await Promise.all( webhooks.map(async (webhook) => { try { diff --git a/apps/orchestrator/src/app.module.ts b/apps/orchestrator/src/app.module.ts index e2707b93ce..4c0af35bca 100644 --- a/apps/orchestrator/src/app.module.ts +++ b/apps/orchestrator/src/app.module.ts @@ -6,6 +6,7 @@ import { AutopostService } from '@gitroom/nestjs-libraries/database/prisma/autop import { EmailActivity } from '@gitroom/orchestrator/activities/email.activity'; import { IntegrationsActivity } from '@gitroom/orchestrator/activities/integrations.activity'; import { VideoActivity } from '@gitroom/orchestrator/activities/video.activity'; +import { MediaActivity } from '@gitroom/orchestrator/activities/media.activity'; import { VideoModule } from '@gitroom/nestjs-libraries/videos/video.module'; import { HealthController } from '@gitroom/orchestrator/health.controller'; @@ -15,6 +16,7 @@ const activities = [ EmailActivity, IntegrationsActivity, VideoActivity, + MediaActivity, ]; @Module({ imports: [ diff --git a/apps/orchestrator/src/workflows/index.ts b/apps/orchestrator/src/workflows/index.ts index a949c98937..4d902a0177 100644 --- a/apps/orchestrator/src/workflows/index.ts +++ b/apps/orchestrator/src/workflows/index.ts @@ -17,3 +17,4 @@ export * from './send.email.workflow'; export * from './refresh.token.workflow'; export * from './streak.workflow'; export * from './generate.video.workflow'; +export * from './process.media.workflow'; diff --git a/apps/orchestrator/src/workflows/process.media.workflow.ts b/apps/orchestrator/src/workflows/process.media.workflow.ts new file mode 100644 index 0000000000..7b6b30614b --- /dev/null +++ b/apps/orchestrator/src/workflows/process.media.workflow.ts @@ -0,0 +1,66 @@ +import { ActivityFailure, proxyActivities, sleep } from '@temporalio/workflow'; +import { MediaActivity } from '@gitroom/orchestrator/activities/media.activity'; + +// Submitting is a plain POST with no idempotency key, so a retry after the +// queue accepted the job would run it twice; one attempt, and a failure +// releases the media instead +const { submitMediaProcessing } = proxyActivities({ + startToCloseTimeout: '2 minute', + taskQueue: 'main', + retry: { + maximumAttempts: 1, + }, +}); + +// Polling is idempotent: ride out a queue API outage of a few minutes. +// Terminal answers are recorded by the activity itself and never throw +const { checkMediaProcessing, failMediaProcessing } = + proxyActivities({ + startToCloseTimeout: '2 minute', + taskQueue: 'main', + retry: { + maximumAttempts: 10, + backoffCoefficient: 2, + initialInterval: '10 seconds', + maximumInterval: '2 minutes', + }, + }); + +// the workflow only sees the activity failure wrapper; the reason is its cause +const reason = (err: any, fallback: string) => + (err instanceof ActivityFailure ? err.cause?.message : err?.message) || + fallback; + +// Polls a job on the media normalization service; the service has no callbacks, +// and the RunPod job TTL is one hour so polling past it is pointless +const POLL_INTERVAL = 5000; +const MAX_POLLS = (60 * 60 * 1000) / POLL_INTERVAL; + +export async function processMediaWorkflow({ mediaId }: { mediaId: string }) { + let jobId: string | null; + try { + jobId = await submitMediaProcessing(mediaId); + } catch (err: any) { + await failMediaProcessing(mediaId, reason(err, 'Could not submit job')); + return; + } + + // nothing to run: the activity already released the media as ready + if (!jobId) { + return; + } + + for (let i = 0; i < MAX_POLLS; i++) { + await sleep(POLL_INTERVAL); + try { + if (await checkMediaProcessing(mediaId, jobId)) { + return; + } + } catch (err: any) { + await failMediaProcessing(mediaId, reason(err, 'Could not check job')); + return; + } + } + + await failMediaProcessing(mediaId, 'Processing timed out'); +} diff --git a/chatgpt-app-submission.json b/chatgpt-app-submission.json index de60c3e5e0..6f8e45cbf2 100644 --- a/chatgpt-app-submission.json +++ b/chatgpt-app-submission.json @@ -163,6 +163,42 @@ "open_world_justification": "Reads from a public URL and stores the resulting media through external storage.", "destructive_justification": "Does not delete or overwrite existing media, revoke access, or publish content." } + }, + "uploadWidgetTool": { + "annotations": { + "readOnlyHint": false, + "openWorldHint": false, + "destructiveHint": false + }, + "justifications": { + "read_only_justification": "Opens an upload session and shows a widget the user uploads media to their own media library with.", + "open_world_justification": "Only creates an upload session inside the user's Postiz workspace; nothing is published or sent to a third party.", + "destructive_justification": "Does not delete or overwrite existing media, revoke access, or publish content." + } + }, + "uploadWidgetTicketTool": { + "annotations": { + "readOnlyHint": false, + "openWorldHint": false, + "destructiveHint": false + }, + "justifications": { + "read_only_justification": "Creates a short-lived upload ticket for the upload widget; it is only callable by the widget, not by the model.", + "open_world_justification": "The ticket only allows uploads into the user's own Postiz media library; no public or third-party state changes.", + "destructive_justification": "Does not delete or overwrite anything, revoke access, or publish content." + } + }, + "uploadWidgetStatusTool": { + "annotations": { + "readOnlyHint": true, + "openWorldHint": false, + "destructiveHint": false + }, + "justifications": { + "read_only_justification": "Only reads the media uploaded in an upload widget session.", + "open_world_justification": "Reads internal Postiz data for the user's workspace only.", + "destructive_justification": "Read-only; it cannot change or delete anything." + } } }, "test_cases": [ diff --git a/docs/README.md b/docs/README.md index 1a2175c12c..ebbe1fca5c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -29,7 +29,6 @@ The project is structured as a **Monorepo (PNPM Workspaces)**: │ ├── orchestrator/ # Temporal Worker (Workflows & Activities for scheduled posting) │ ├── frontend/ # Next.js 16 (App Router) + React 19 + Tailwind CSS 3 │ ├── extension/ # Chrome Extension Manifest V3 (Cookie capture & social bridge) -│ └── crove-sso/ # Cloudflare Worker SSO Bridge (OAuth 2.1 PKCE) ├── libraries/ │ ├── helpers/ # Shared utilities, Brand Config Engine, Fetch wrappers │ ├── nestjs-libraries/# 34+ Social Providers, Email, Database Prisma, Mastra MCP diff --git a/docs/beta-environment.md b/docs/beta-environment.md index 1693cf70aa..9fd7473c04 100644 --- a/docs/beta-environment.md +++ b/docs/beta-environment.md @@ -10,7 +10,6 @@ Tài liệu này mô tả chi tiết kiến trúc phân chia 2 môi trường ** | :--- | :--- | :--- | :--- | | **Landing Page** (`apps/web`) | `https://crove.com`
`https://www.crove.com` | `https://beta.crove.com` | Next.js 16 App Router, đa ngôn ngữ VI/EN, Dark/Light theme | | **App Dashboard** (`apps/frontend` + `backend`) | `https://post.crove.com` | `https://beta-post.crove.com` | Core App Postiz, quản lý 28+ mạng xã hội | -| **SSO Worker** (`apps/crove-sso`) | `https://sso.crove.com` | `https://beta-sso.crove.com` | Cloudflare Worker OAuth 2.1 PKCE Bridge kết nối Supabase | | **Supabase Client ID** | `18790ccb-4d71-48cd-ad24-aee5f3ced3da` | `7ef5e5f1-68e6-42a7-901e-1f39e9471d24` | Ứng dụng OAuth riêng biệt trên Supabase / DOS ID | | **Docker Compose Stack** | `scripts/docker-compose.prod.yaml` | `scripts/docker-compose.beta.yaml` | Độc lập về Database & Redis, chia sẻ Temporal cluster | | **Environment File** | `scripts/crove-server.env` | `scripts/crove-server.beta.env` | Chứa các biến cấu hình riêng biệt | diff --git a/docs/cicd.md b/docs/cicd.md index 5acdcd86f2..2625a634ea 100644 --- a/docs/cicd.md +++ b/docs/cicd.md @@ -8,7 +8,6 @@ The Crove Post CI/CD system provides end-to-end automation: source code verifica | Workflow | File | Trigger | Purpose | | :--- | :--- | :--- | :--- | -| **Deploy SSO Bridge** | `.github/workflows/deploy-sso.yml` | Push to `apps/crove-sso/**` or dispatch | Runs Vitest (31 tests) + deploys Cloudflare Worker to `sso.crove.com` (main) or `beta-sso.crove.com` (dev). | | **Build & Deploy Containers** | `.github/workflows/build-deploy-crove.yml` | Push to `dev` or published release | Runs Branding Guard -> Builds & pushes GHCR image `ghcr.io/dos/crove-post` (`beta` / `latest`). | | **Build & Publish Containers** | `.github/workflows/build-containers.yml` | Push to `main` / `dev` or tags | Multi-arch container build (amd64 + arm64) for `ghcr.io/dos/crove-post`. | | **Branding Guard CI** | `.github/workflows/branding-guard.yml` | Push / PR to `main` or `dev` | Validates runtime branding engine contracts and AGPL-3.0 compliance. | @@ -52,9 +51,8 @@ The Crove Post CI/CD system provides end-to-end automation: source code verifica | Script | Path | Purpose | | :--- | :--- | :--- | -| **Deploy Beta** | `scripts/deploy-beta.ps1` | Runs tests, deploys SSO Beta, and outputs container instructions | -| **Deploy Prod** | `scripts/deploy-prod.ps1` | Runs tests, deploys SSO Prod, and outputs container instructions | -| **Deploy SSO** | `scripts/deploy-sso.ps1` | Independent SSO deployment with `-Environment beta` or `prod` | +| **Deploy Beta** | `scripts/deploy-beta.ps1` | Runs Branding Guard, validates beta contract, and outputs container instructions | +| **Deploy Prod** | `scripts/deploy-prod.ps1` | Runs Branding Guard and outputs container instructions | | **Branding Guard** | `scripts/branding-guard.ts` | Comprehensive contract validation suite for runtime branding | | **Build All** | `scripts/build-all.ps1` | Full parallel/sequential workspace build verification | | **Dev Environment** | `scripts/dev.ps1` | Starts development server on Windows PowerShell | diff --git a/docs/sso-integration.md b/docs/sso-integration.md index 13e5175630..7b13aeab2e 100644 --- a/docs/sso-integration.md +++ b/docs/sso-integration.md @@ -1,5 +1,11 @@ # Kiến Trúc Single Sign-On (SSO) & OAuth 2.1 PKCE Bridge +> **STATUS 2026-09: Triển khai bridge đã dời vào `api.dos.me` (PKCE bridge central, +> `POSTIZ_OAUTH_*` trỏ tới `https://api.dos.me/sso/*`). Cloudflare Worker +> `apps/crove-sso` (`sso.crove.com` / `beta-sso.crove.com`) đã bị gỡ bỏ - xem +> `docs/README.md` và CHANGELOG. Tài liệu này giữ lại làm bản ghi thiết kế lịch sử +> cho bài toán bridge; các đoạn hướng dẫn `cd apps/crove-sso` bên dưới không còn +> áp dụng. ## 1. Tổng Quan Hệ thống cho phép người dùng **Crove** đăng nhập thông qua tài khoản **DOS ID** (sử dụng Supabase OAuth 2.1) mà **không làm thay đổi hoặc can thiệp trực tiếp vào mã nguồn OAuth mặc định của Postiz**. diff --git a/i18n.lock b/i18n.lock index 8d227e15b8..88840d1e14 100644 --- a/i18n.lock +++ b/i18n.lock @@ -579,7 +579,16 @@ checksums: email_address: 0ee22bbbe989a0c61a18023407d12dc2 email_already_exists: ad25f0ca7a16c0d37e566a9c090a0fd2 google: 6cc462fb53d90d404f48d5a6695c1de1 + apple: 4e2ced07ca66bd1cf0562882d019aff2 farcaster: b09af25fcb497663e8594b9fc514b969 + farcaster_approve_instructions: 97061425f4de396ed7fdbca1f59fe702 + farcaster_open_in_farcaster: cc32bd29fef8129fbd9a30385b163c49 + farcaster_waiting_for_approval: 2ee1cd6c0ff8d0db1a4924c08b80e498 + farcaster_signer_revoked: 0eff3e12951a952f8db78f54be25cf2d + farcaster_signer_failed: d3274186449d73fb6ffb37b2f47bb9d4 + farcaster_scan_instructions: 28fdf8386de75fc770b3c2585a3cf8bc + farcaster_copy_link: 3bf926fddc31ea08755160e6abce8674 + farcaster_approval_timeout: 2a434e0962661820d56dba28a88ec18d edit_autopost: 2cde36144cddda0acc069e6913e095f9 add_autopost_title: d018d5d12c9f41c0b610da4b101d77e9 webhook_deleted_successfully: fcefd247ec76a372002d2cffac3c5b0f @@ -697,10 +706,31 @@ checksums: connected_channels: b64d400364bb3ccb4b1d4b547673f4c3 continue: 3cfba90b4600131e82fc4260c568d044 continue_without_channels: fa9c2e19c59e2eac86c1fcac35611337 + connect_agents: 3272e6e7b043cd9bd5626dc57892b4b2 + connect_your_ai_agent: 29cfdf27911e816ade81f5dc3ba948eb + connect_agent_description: 087b814876d35ea71d2f63d54cc39788 + agent_access_unavailable: 80a529742f86d7cacb9bb44d5e06be04 + sign_in_no_api_key: b17680d7465d120632114d25217e0e2e + oauth_sign_in_hint: 92797174fbc54b56b7c81f485dc9008b + add_to_cursor: da1a4472a29f82361b48e26842c05a0e + cli: 6bfaaf925aa1c902820f2059a234e467 + other_agents: e85458e10eb4bd29157a1f77568a3845 + documentation: 1563fcb5ddb5037b0709ccd3dd384a92 + read_the_api_docs: 016e8f560539f8c57727cab2b2e4fc1d + api_key_onboarding_description: 426162950cd838b5ebd90d22151ae4b0 + api_onboarding_description: 97cc31ad6bfe6ef3f479e72987ea69a4 + chat: 1171b63c16b3431dca319af1804de2a0 + chat_onboarding_description: 9da74037342cd6adb283e8205299b986 + connector: 7abb5584501ce0e3cc51ba19f0561ca8 + connector_onboarding_description: eb8027296b46bf58475f6b4925bd6351 + mcp_onboarding_description: 5b33036d174222d86ac50039a3a31724 + cli_onboarding_description: b4aba065e5a8410ee2c365ee4d7aa87c + agent_settings_later: bbdd45a80cc5218809363348e0b03a32 watch_tutorial: 7f202b82c805285109187f099d22e863 watch_tutorial_title: c3c0d814f10a3325a7fd52a7fb44ae38 watch_tutorial_description: 25dd65235d9603f6d65d62f953791722 back: f541015a827e37cb3b1234e56bc2aa3c + continue_skip: 82edfa21507a88b8788d33cc632d64af get_started: 1d5f030c4ec9c869e647ae060518b948 kick_select_channel: 13fa95c439addeb6674e571e37c96b79 annual: 5d4f1c56f4e9e579ec9967ca68cc64ac diff --git a/libraries/helpers/src/utils/count.length.ts b/libraries/helpers/src/utils/count.length.ts index 4a97255f53..d44dca1b91 100644 --- a/libraries/helpers/src/utils/count.length.ts +++ b/libraries/helpers/src/utils/count.length.ts @@ -37,3 +37,15 @@ export const textSlicer = ( export const weightedLength = (text: string): number => { return twitter.parseTweet(text).weightedLength; }; + +export const countLength = (integrationType: string, text: string): number => { + if (integrationType === 'x') { + return weightedLength(text); + } + + if (integrationType === 'threads') { + return new TextEncoder().encode(text).length; + } + + return text.length; +}; diff --git a/libraries/nestjs-libraries/jest.dos-billing.config.cjs b/libraries/nestjs-libraries/jest.dos-billing.config.cjs new file mode 100644 index 0000000000..13a3a49ca2 --- /dev/null +++ b/libraries/nestjs-libraries/jest.dos-billing.config.cjs @@ -0,0 +1,9 @@ +/** Isolated unit tests for DOS shared billing mapping. */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + roots: ['/src/dos-billing'], + moduleNameMapper: { + '^@gitroom/nestjs-libraries/(.*)$': '/src/$1', + }, +}; diff --git a/libraries/nestjs-libraries/src/chat/agent.tool.interface.ts b/libraries/nestjs-libraries/src/chat/agent.tool.interface.ts index 42de607588..e3bea8b468 100644 --- a/libraries/nestjs-libraries/src/chat/agent.tool.interface.ts +++ b/libraries/nestjs-libraries/src/chat/agent.tool.interface.ts @@ -4,5 +4,7 @@ export type ToolReturn = ToolAction; export interface AgentToolInterface { name: string; + // needs an MCP host (e.g. renders a ui:// widget), so the in-app agent doesn't get it + mcpOnly?: boolean; run(): ToolReturn; } diff --git a/libraries/nestjs-libraries/src/chat/load.tools.service.ts b/libraries/nestjs-libraries/src/chat/load.tools.service.ts index 3e2c11cb1e..2b31e605bf 100644 --- a/libraries/nestjs-libraries/src/chat/load.tools.service.ts +++ b/libraries/nestjs-libraries/src/chat/load.tools.service.ts @@ -6,6 +6,7 @@ import { pStore } from '@gitroom/nestjs-libraries/chat/mastra.store'; import { array, object, string } from 'zod'; import { ModuleRef } from '@nestjs/core'; import { toolList } from '@gitroom/nestjs-libraries/chat/tools/tool.list'; +import { AgentToolInterface } from '@gitroom/nestjs-libraries/chat/agent.tool.interface'; import dayjs from 'dayjs'; import { getBrandConfig } from '@gitroom/helpers/utils/brand.config'; @@ -22,11 +23,15 @@ const renderArray = (list: string[], show: boolean) => { export class LoadToolsService { constructor(private _moduleRef: ModuleRef) {} - async loadTools() { + async loadTools(mcpOnly = false) { const directTools = ( await Promise.all<{ name: string; tool: any }>( toolList - .map((p) => this._moduleRef.get(p, { strict: false })) + .map( + (p) => + this._moduleRef.get(p, { strict: false }) as AgentToolInterface + ) + .filter((p) => !!p.mcpOnly === mcpOnly) .map(async (p) => ({ name: p.name as string, tool: await p.run(), diff --git a/libraries/nestjs-libraries/src/chat/oauth-types.ts b/libraries/nestjs-libraries/src/chat/oauth-types.ts index 67b4ec4486..720625c84f 100644 --- a/libraries/nestjs-libraries/src/chat/oauth-types.ts +++ b/libraries/nestjs-libraries/src/chat/oauth-types.ts @@ -92,6 +92,36 @@ export function generateProtectedResourceMetadata(config: MCPServerOAuthConfig): }; } +// RFC 6749 §2.3.1 client_secret_basic: "Basic base64(urlencode(id):urlencode(secret))" +export function extractBasicCredentials( + authHeader: string | null | undefined, +): { clientId: string; clientSecret: string } | undefined { + if (!authHeader) return undefined; + + const prefix = 'basic '; + if (authHeader.length <= prefix.length) return undefined; + if (authHeader.slice(0, prefix.length).toLowerCase() !== prefix) return undefined; + + let decoded: string; + try { + decoded = Buffer.from(authHeader.slice(prefix.length).trim(), 'base64').toString('utf8'); + } catch { + return undefined; + } + + const separator = decoded.indexOf(':'); + if (separator <= 0) return undefined; + + try { + return { + clientId: decodeURIComponent(decoded.slice(0, separator)), + clientSecret: decodeURIComponent(decoded.slice(separator + 1)), + }; + } catch { + return undefined; + } +} + export function extractBearerToken(authHeader: string | null | undefined): string | undefined { if (!authHeader) return undefined; diff --git a/libraries/nestjs-libraries/src/chat/start.mcp.ts b/libraries/nestjs-libraries/src/chat/start.mcp.ts index 1d52aa83f2..8430dad5b8 100644 --- a/libraries/nestjs-libraries/src/chat/start.mcp.ts +++ b/libraries/nestjs-libraries/src/chat/start.mcp.ts @@ -1,12 +1,14 @@ import { INestApplication } from '@nestjs/common'; import { Request, Response } from 'express'; 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 { 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'; const fixAcceptHeader = (req: Request) => { const value = 'application/json, text/event-stream'; req.headers.accept = value; @@ -30,6 +32,7 @@ export const startMcp = async (app: INestApplication) => { const mastraService = app.get(MastraService, { strict: false }); const organizationService = app.get(OrganizationService, { strict: false }); const oauthService = app.get(OAuthService, { strict: false }); + const loadToolsService = app.get(LoadToolsService, { strict: false }); const resolveAuth = async (token: string) => { if (token.startsWith('pos_')) { @@ -42,7 +45,11 @@ export const startMcp = async (app: INestApplication) => { const mastra = await mastraService.mastra(); const agent = mastra.getAgent('postiz'); - const tools = await agent.listTools(); + const tools = { + ...(await agent.listTools()), + // tools that only make sense inside an MCP host (ui:// widgets) + ...(await loadToolsService.loadTools(true)), + }; const brand = getBrandConfig(); // The Claude connector directory does not accept AI media generation tools, @@ -66,6 +73,25 @@ export const startMcp = async (app: INestApplication) => { const claudeTools = Object.fromEntries( Object.entries(tools).filter(([name]) => !claudeHiddenTools.includes(name)) ) as typeof tools; + + const backendUrl = process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL; + + // MCP Apps widgets (ui:// resources). They run in the host's sandboxed iframe, + // which can only reach the domains listed in the csp + const appResources = { + [UPLOAD_WIDGET_URI]: { + name: 'Upload Media', + description: 'Upload an image or video from the device to the media library', + html: uploadWidgetHtml(backendUrl!), + meta: { + csp: { connectDomains: [new URL(backendUrl!).origin] }, + // the "Copy link" button of the uploaded media + permissions: { clipboardWrite: {} }, + prefersBorder: true, + }, + }, + }; + const serverConfig = { name: `${brand.name} MCP`, version: '1.0.0', @@ -76,6 +102,7 @@ export const startMcp = async (app: INestApplication) => { crove_post: agent, post: agent, }, + appResources, }; const server = new MCPServer(serverConfig); @@ -87,24 +114,61 @@ export const startMcp = async (app: INestApplication) => { name: `${brand.name} MCP`, version: '1.0.0', tools, + appResources, }); const claudeOauthServer = new MCPServer({ name: `${brand.name} MCP`, version: '1.0.0', tools: claudeTools, + appResources, }); - const oauthResource = new URL('/mcp-oauth', process.env.NEXT_PUBLIC_BACKEND_URL!).toString(); + // 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 + // the pre-defined client credentials instead of DCR (a fresh path, because + // OpenAI kept serving its cached copy of the old /mcp-oauth metadata). + // /mcp-oauth-dynamic keeps DCR for Claude, Cursor and every other + // self-registering client + const authorizationServers: Record = { + '/mcp-oauth-chatgpt': { + issuer: new URL('/mcp-oauth-chatgpt', process.env.NEXT_PUBLIC_BACKEND_URL!).toString(), + registration: false, + }, + '/mcp-oauth-dynamic': { + issuer: new URL('/mcp-oauth-dynamic', process.env.NEXT_PUBLIC_BACKEND_URL!).toString(), + registration: true, + }, + }; + + const authorizationServerMetadata = (server: { issuer: string; registration: boolean }) => ({ + // RFC 8414: metadata served at /.well-known/oauth-authorization-server/ + // belongs to the path-based issuer / + issuer: server.issuer, + authorization_endpoint: `${process.env.FRONTEND_URL}/oauth/authorize`, + token_endpoint: `${backendUrl}/oauth/token`, + ...(server.registration && { + registration_endpoint: `${backendUrl}/oauth/register`, + }), + ...(enableOidcEmailClaims && { + userinfo_endpoint: `${backendUrl}/oauth/userinfo`, + }), + response_types_supported: ['code'], + grant_types_supported: ['authorization_code'], + token_endpoint_auth_methods_supported: ['client_secret_basic', 'client_secret_post', 'none'], + code_challenge_methods_supported: ['S256'], + scopes_supported: oauthScopes, + }); - // Every OAuth-protected MCP path is its own RFC 9728 protected resource, but - // they all share the /mcp-oauth authorization server (the token endpoint - // ignores the RFC 8707 resource param, so one AS covers all of them) - const createResourceMiddleware = (mcpPath: string) => + // Every OAuth-protected MCP path is its own RFC 9728 protected resource + // (the token endpoint ignores the RFC 8707 resource param, so the issuers + // above cover all of them) + const createResourceMiddleware = (mcpPath: string, authorizationServer: string) => createOAuthMiddleware({ oauth: { resource: new URL(mcpPath, process.env.NEXT_PUBLIC_BACKEND_URL!).toString(), - authorizationServers: [oauthResource], + authorizationServers: [authorizationServers[authorizationServer].issuer], scopesSupported: oauthScopes, validateToken: async (token: string) => { const org = await resolveAuth(token); @@ -121,13 +185,15 @@ export const startMcp = async (app: INestApplication) => { string, { middleware: ReturnType; mcpServer: MCPServer } > = { - // ChatGPT app submission - '/mcp-oauth': { middleware: createResourceMiddleware('/mcp-oauth'), mcpServer: oauthServer }, + // ChatGPT app submission (pre-defined client credentials, no DCR) + '/mcp-oauth-chatgpt': { middleware: createResourceMiddleware('/mcp-oauth-chatgpt', '/mcp-oauth-chatgpt'), mcpServer: oauthServer }, + // Former ChatGPT path, kept for connectors that were created against it + '/mcp-oauth': { middleware: createResourceMiddleware('/mcp-oauth', '/mcp-oauth-dynamic'), mcpServer: oauthServer }, // Claude connector directory submission - '/mcp-oauth-claude': { middleware: createResourceMiddleware('/mcp-oauth-claude'), mcpServer: claudeOauthServer }, + '/mcp-oauth-claude': { middleware: createResourceMiddleware('/mcp-oauth-claude', '/mcp-oauth-dynamic'), mcpServer: claudeOauthServer }, // 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'), mcpServer: oauthServer }, + '/mcp-oauth-dynamic': { middleware: createResourceMiddleware('/mcp-oauth-dynamic', '/mcp-oauth-dynamic'), mcpServer: oauthServer }, }; if (process.env.OPENAI_APP_CHALLANGE) { @@ -152,7 +218,8 @@ export const startMcp = async (app: INestApplication) => { }); app.use('/.well-known/oauth-authorization-server', async (req: Request, res: Response, next: () => void) => { - if (req.path !== '/mcp-oauth') { + const server = authorizationServers[req.path]; + if (!server) { next(); return; } @@ -167,26 +234,12 @@ export const startMcp = async (app: INestApplication) => { } res.setHeader('Content-Type', 'application/json'); res.setHeader('Cache-Control', 'max-age=3600'); - res.json({ - // RFC 8414: metadata served at /.well-known/oauth-authorization-server/mcp-oauth - // belongs to the path-based issuer /mcp-oauth - issuer: oauthResource, - authorization_endpoint: `${process.env.FRONTEND_URL}/oauth/authorize`, - token_endpoint: `${process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL}/oauth/token`, - registration_endpoint: `${process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL}/oauth/register`, - ...(enableOidcEmailClaims && { - userinfo_endpoint: `${process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL}/oauth/userinfo`, - }), - response_types_supported: ['code'], - grant_types_supported: ['authorization_code'], - token_endpoint_auth_methods_supported: ['client_secret_post', 'none'], - code_challenge_methods_supported: ['S256'], - scopes_supported: oauthScopes, - }); + res.json(authorizationServerMetadata(server)); }); app.use('/.well-known/openid-configuration', async (req: Request, res: Response, next: () => void) => { - if (req.path !== '/mcp-oauth' || !enableOidcEmailClaims) { + const server = authorizationServers[req.path]; + if (!server || !enableOidcEmailClaims) { next(); return; } @@ -202,16 +255,7 @@ export const startMcp = async (app: INestApplication) => { res.setHeader('Content-Type', 'application/json'); res.setHeader('Cache-Control', 'max-age=3600'); res.json({ - issuer: oauthResource, - authorization_endpoint: `${process.env.FRONTEND_URL}/oauth/authorize`, - token_endpoint: `${process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL}/oauth/token`, - registration_endpoint: `${process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL}/oauth/register`, - userinfo_endpoint: `${process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL}/oauth/userinfo`, - response_types_supported: ['code'], - grant_types_supported: ['authorization_code'], - token_endpoint_auth_methods_supported: ['client_secret_post', 'none'], - code_challenge_methods_supported: ['S256'], - scopes_supported: oauthScopes, + ...authorizationServerMetadata(server), subject_types_supported: ['public'], claims_supported: ['sub', 'email', 'email_verified'], }); diff --git a/libraries/nestjs-libraries/src/chat/tools/tool.list.ts b/libraries/nestjs-libraries/src/chat/tools/tool.list.ts index dc5fc98934..c1c5a4bf7d 100644 --- a/libraries/nestjs-libraries/src/chat/tools/tool.list.ts +++ b/libraries/nestjs-libraries/src/chat/tools/tool.list.ts @@ -11,6 +11,9 @@ import { GroupListTool } from '@gitroom/nestjs-libraries/chat/tools/group.list.t import { UploadFromUrlTool } from '@gitroom/nestjs-libraries/chat/tools/upload.from.url.tool'; import { PostsListTool } from '@gitroom/nestjs-libraries/chat/tools/posts.list.tool'; import { PostSettingsTool } from '@gitroom/nestjs-libraries/chat/tools/post.settings.tool'; +import { UploadWidgetTool } from '@gitroom/nestjs-libraries/chat/tools/upload.widget.tool'; +import { UploadWidgetTicketTool } from '@gitroom/nestjs-libraries/chat/tools/upload.widget.ticket.tool'; +import { UploadWidgetStatusTool } from '@gitroom/nestjs-libraries/chat/tools/upload.widget.status.tool'; export const toolList = [ IntegrationListTool, @@ -26,4 +29,7 @@ export const toolList = [ VideoStatusTool, GenerateImageTool, UploadFromUrlTool, + UploadWidgetTool, + UploadWidgetTicketTool, + UploadWidgetStatusTool, ]; diff --git a/libraries/nestjs-libraries/src/chat/tools/upload.from.url.tool.ts b/libraries/nestjs-libraries/src/chat/tools/upload.from.url.tool.ts index 3d99c365e3..7b7fb4dbb1 100644 --- a/libraries/nestjs-libraries/src/chat/tools/upload.from.url.tool.ts +++ b/libraries/nestjs-libraries/src/chat/tools/upload.from.url.tool.ts @@ -3,30 +3,10 @@ import { createTool } from '@mastra/core/tools'; import { z } from 'zod'; import { Injectable } from '@nestjs/common'; import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; -import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory'; -import { getMaxSize } from '@gitroom/nestjs-libraries/upload/custom.upload.validation'; import { checkAuth } from '@gitroom/nestjs-libraries/chat/auth.context'; -import { ssrfSafeDispatcher } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher'; -import { Readable } from 'stream'; -// eslint-disable-next-line @typescript-eslint/no-var-requires -const { fileTypeFromBuffer } = require('file-type'); - -// Same allow-list as the public API /upload-from-url route. -const ALLOWED_MIME = new Set([ - 'image/jpeg', - 'image/png', - 'image/gif', - 'image/webp', - 'image/avif', - 'image/bmp', - 'image/tiff', - 'video/mp4', -]); @Injectable() export class UploadFromUrlTool implements AgentToolInterface { - private storage = UploadFactory.createStorage(); - constructor(private _mediaService: MediaService) {} name = 'uploadFromUrlTool'; @@ -68,75 +48,27 @@ so the attachment passes the upload-domain validation. Returns the hosted media (context?.requestContext as any)?.get('organization') as string ); - const response = await fetch(inputData.url, { - // @ts-ignore — undici option, not in lib.dom fetch types - dispatcher: ssrfSafeDispatcher, - }); - - if (!response.ok) { - return { error: 'Failed to fetch URL' }; - } - - // Guard against OOM: bail out before buffering the whole body into - // memory. Content-Length may be absent or wrong, so we re-check the - // real size after download too. The type isn't known yet (sniffed - // below), so the pre-check uses the largest allowed cap (video). - const maxDownloadSize = getMaxSize('video/mp4'); - const declaredSize = Number(response.headers.get('content-length')); - if (declaredSize && declaredSize > maxDownloadSize) { - return { - error: `File is too large: ${declaredSize} bytes (max ${maxDownloadSize} bytes).`, - }; - } - - const buffer = Buffer.from(await response.arrayBuffer()); - const detected = await fileTypeFromBuffer(buffer); - if (!detected || !ALLOWED_MIME.has(detected.mime)) { - return { error: 'Unsupported file type.' }; - } - - const maxSize = getMaxSize(detected.mime); - if (buffer.length > maxSize) { - return { - error: `File is too large: ${buffer.length} bytes (max ${maxSize} bytes).`, - }; - } - - const getFile = await this.storage.uploadFile({ - buffer, - mimetype: detected.mime, - size: buffer.length, - path: '', - fieldname: '', - destination: '', - stream: new Readable(), - filename: '', - originalname: `upload.${detected.ext}`, - encoding: '', - }); - - return await this._mediaService.saveFile( - org.id, - getFile.originalname, - getFile.path - ); + return await this._mediaService.uploadFromUrl(org.id, inputData.url); } catch (err) { // undici's fetch rejects with a generic TypeError('fetch failed') // and hides the real reason (DNS, TLS, SSRF block, ...) in - // err.cause, so surface it for the agent. Error.cause isn't in the - // es2020 lib typings this repo compiles against, hence the cast. - const cause = - err instanceof Error - ? (err as Error & { cause?: unknown }).cause - : undefined; - const causeText = - cause instanceof Error && cause.message - ? ` (${cause.message})` - : ''; + // err.cause, which the service wraps once more, so walk the chain + // and surface it for the agent. Error.cause isn't in the es2020 + // lib typings this repo compiles against, hence the cast + const message = + err instanceof Error ? err.message : 'Unexpected error'; + const causes: string[] = []; + let cause = (err as Error & { cause?: unknown })?.cause; + while (cause instanceof Error) { + if (cause.message) { + causes.push(cause.message); + } + cause = (cause as Error & { cause?: unknown }).cause; + } + const causeText = causes.length ? ` (${causes.join(': ')})` : ''; + return { - error: `Failed to upload media from URL: ${ - err instanceof Error ? err.message : 'Unexpected error' - }${causeText}`, + error: `Failed to upload media from URL: ${message}${causeText}`, }; } }, diff --git a/libraries/nestjs-libraries/src/chat/tools/upload.widget.status.tool.ts b/libraries/nestjs-libraries/src/chat/tools/upload.widget.status.tool.ts new file mode 100644 index 0000000000..ce32d12597 --- /dev/null +++ b/libraries/nestjs-libraries/src/chat/tools/upload.widget.status.tool.ts @@ -0,0 +1,72 @@ +import { AgentToolInterface } from '@gitroom/nestjs-libraries/chat/agent.tool.interface'; +import { createTool } from '@mastra/core/tools'; +import { z } from 'zod'; +import { Injectable } from '@nestjs/common'; +import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; +import { checkAuth } from '@gitroom/nestjs-libraries/chat/auth.context'; + +@Injectable() +export class UploadWidgetStatusTool implements AgentToolInterface { + constructor(private _mediaService: MediaService) {} + name = 'uploadWidgetStatusTool'; + mcpOnly = true; + + run() { + return createTool({ + id: 'uploadWidgetStatusTool', + description: `List the media the user uploaded with the upload widget, using the sessionId returned by uploadWidgetTool. +An empty list means the user did not upload anything yet. A media with the status "processing" is still being prepared: wait about 10 seconds and call again. +A media with the status "ready" can be used as a post attachment with its { id, path }.`, + mcp: { + annotations: { + title: 'Upload Widget Status', + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false, + }, + }, + inputSchema: z.object({ + sessionId: z + .string() + .describe('The sessionId returned by uploadWidgetTool'), + }), + outputSchema: z.object({ + media: z + .array( + z.object({ + id: z.string(), + path: z.string(), + status: z.string(), + error: z.string().optional(), + }) + ) + .optional(), + error: z.string().optional(), + }), + execute: async (inputData, context) => { + checkAuth(inputData, context); + try { + const org = JSON.parse( + (context?.requestContext as any)?.get('organization') as string + ); + const media = await this._mediaService.getUploadSession( + org.id, + inputData.sessionId + ); + return { + media: media.map((p) => ({ + id: p.id, + path: p.path, + status: p.status, + ...(p.processingError ? { error: p.processingError } : {}), + })), + }; + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + return { error: `Upload session lookup failed: ${message}` }; + } + }, + }); + } +} diff --git a/libraries/nestjs-libraries/src/chat/tools/upload.widget.ticket.tool.ts b/libraries/nestjs-libraries/src/chat/tools/upload.widget.ticket.tool.ts new file mode 100644 index 0000000000..f716a2126f --- /dev/null +++ b/libraries/nestjs-libraries/src/chat/tools/upload.widget.ticket.tool.ts @@ -0,0 +1,63 @@ +import { AgentToolInterface } from '@gitroom/nestjs-libraries/chat/agent.tool.interface'; +import { createTool } from '@mastra/core/tools'; +import { z } from 'zod'; +import { Injectable } from '@nestjs/common'; +import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; +import { checkAuth } from '@gitroom/nestjs-libraries/chat/auth.context'; + +// Meant for the upload widget itself: visibility "app" asks the host to keep it +// away from the model, so the upload credential stays out of the conversation. +// It is a hint only - the ticket is still scoped to the caller's own organization +@Injectable() +export class UploadWidgetTicketTool implements AgentToolInterface { + constructor(private _mediaService: MediaService) {} + name = 'uploadWidgetTicketTool'; + mcpOnly = true; + + run() { + return createTool({ + id: 'uploadWidgetTicketTool', + description: `Used by the upload widget to get a short-lived upload ticket for the sessionId returned by uploadWidgetTool.`, + mcp: { + annotations: { + title: 'Upload Widget Ticket', + readOnlyHint: false, + destructiveHint: false, + idempotentHint: false, + openWorldHint: false, + }, + _meta: { + ui: { + visibility: ['app'], + }, + }, + }, + inputSchema: z.object({ + sessionId: z + .string() + .describe('The sessionId returned by uploadWidgetTool'), + }), + outputSchema: z.object({ + ticket: z.string().optional(), + error: z.string().optional(), + }), + execute: async (inputData, context) => { + checkAuth(inputData, context); + try { + const org = JSON.parse( + (context?.requestContext as any)?.get('organization') as string + ); + return { + ticket: await this._mediaService.createUploadTicket( + org.id, + inputData.sessionId + ), + }; + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + return { error: `Failed to create an upload ticket: ${message}` }; + } + }, + }); + } +} diff --git a/libraries/nestjs-libraries/src/chat/tools/upload.widget.tool.ts b/libraries/nestjs-libraries/src/chat/tools/upload.widget.tool.ts new file mode 100644 index 0000000000..826b927ad2 --- /dev/null +++ b/libraries/nestjs-libraries/src/chat/tools/upload.widget.tool.ts @@ -0,0 +1,57 @@ +import { AgentToolInterface } from '@gitroom/nestjs-libraries/chat/agent.tool.interface'; +import { createTool } from '@mastra/core/tools'; +import { z } from 'zod'; +import { Injectable } from '@nestjs/common'; +import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; +import { checkAuth } from '@gitroom/nestjs-libraries/chat/auth.context'; +import { UPLOAD_WIDGET_URI } from '@gitroom/nestjs-libraries/chat/ui/upload.widget'; + +@Injectable() +export class UploadWidgetTool implements AgentToolInterface { + constructor(private _mediaService: MediaService) {} + name = 'uploadWidgetTool'; + mcpOnly = true; + + run() { + return createTool({ + id: 'uploadWidgetTool', + description: `Show the user an upload widget to add images or videos from their own device to the media library. +Use this when the user wants to attach a local file to a post. When the media is already available on a public URL, use uploadFromUrlTool instead. +The widget is only displayed by apps that support MCP Apps (interactive UI); in any other app no widget appears and uploadFromUrlTool with a public URL is the way to add media. +Returns a sessionId: the files the user uploads are reported in the conversation, and can also be read with uploadWidgetStatusTool.`, + mcp: { + annotations: { + title: 'Upload Media From Device', + readOnlyHint: false, + destructiveHint: false, + idempotentHint: false, + openWorldHint: false, + }, + _meta: { + ui: { + resourceUri: UPLOAD_WIDGET_URI, + }, + }, + }, + inputSchema: z.object({}), + outputSchema: z.object({ + sessionId: z.string().optional(), + error: z.string().optional(), + }), + execute: async (inputData, context) => { + checkAuth(inputData, context); + try { + const org = JSON.parse( + (context?.requestContext as any)?.get('organization') as string + ); + return { + sessionId: await this._mediaService.createUploadSession(org.id), + }; + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + return { error: `Failed to open the upload widget: ${message}` }; + } + }, + }); + } +} diff --git a/libraries/nestjs-libraries/src/chat/ui/upload.widget.ts b/libraries/nestjs-libraries/src/chat/ui/upload.widget.ts new file mode 100644 index 0000000000..b25e709c84 --- /dev/null +++ b/libraries/nestjs-libraries/src/chat/ui/upload.widget.ts @@ -0,0 +1,318 @@ +import { getMaxSize } from '@gitroom/nestjs-libraries/upload/custom.upload.validation'; + +const megabytes = (mime: string) => Math.floor(getMaxSize(mime) / 1024 / 1024); + +export const UPLOAD_WIDGET_URI = 'ui://postiz/upload'; + +// MCP Apps (SEP-1865) widget: a single self-contained HTML document rendered by +// the host inside a sandboxed iframe. It can't load our bundles or cookies, so +// it talks to the host over postMessage JSON-RPC and to the backend over fetch: +// uploadWidgetTool result (sessionId) -> uploadWidgetTicketTool (ticket, through +// the host) -> POST /media-widget/upload -> report the media back to the model. +// The upload is a plain multipart fetch on purpose: no custom headers and no +// XHR progress listeners, so the browser never sends a CORS preflight +export const uploadWidgetHtml = (backendUrl: string) => ` + + + + + + + + +
+
+ + +`; diff --git a/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts b/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts index 7e875f213f..fded269d23 100644 --- a/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts @@ -6,6 +6,15 @@ export interface StatsParams { from: Date; to: Date; unknownOnly?: boolean; + organizationId?: string; + includeDeleted?: boolean; +} + +export interface OrgActivityParams { + from: Date; + to: Date; + organizationId: string; + includeDeleted?: boolean; } // Unknown errors are stored as the serialized error payload, e.g. @@ -17,6 +26,24 @@ interface PerSocial { count: number; } +interface PerState { + state: string; + count: number; +} + +export interface OrgActivityResponse { + from: string; + to: string; + organizationId: string; + errors: { total: number; perSocial: PerSocial[] }; + posts: { total: number; perSocial: PerSocial[] }; + connectedInRange: { total: number; perSocial: PerSocial[] }; + channels: { total: number; perSocial: PerSocial[] }; + postsByState: PerState[]; + firstActivityAt: string | null; + lastActivityAt: string | null; +} + export interface StatsResponse { from: string; to: string; @@ -27,6 +54,7 @@ export interface StatsResponse { scheduledAccounts: { total: number; perSocial: PerSocial[] }; publishingChannels: { total: number; perSocial: PerSocial[] }; scheduledChannels: { total: number; perSocial: PerSocial[] }; + activeOrgsBySource: { total: number; perSocial: PerSocial[] }; } const sortDesc = (list: PerSocial[]) => @@ -46,6 +74,9 @@ export class AdminStatsRepository { ...(params.unknownOnly ? { message: { contains: UNKNOWN_ERROR_TOKEN } } : {}), + ...(params.organizationId + ? { organizationId: params.organizationId } + : {}), }; const [total, grouped] = await Promise.all([ @@ -74,8 +105,11 @@ export class AdminStatsRepository { const where: Prisma.PostWhereInput = { state: 'PUBLISHED', parentPostId: null, - deletedAt: null, + ...(params.includeDeleted ? {} : { deletedAt: null }), publishDate: { gte: params.from, lte: params.to }, + ...(params.organizationId + ? { organizationId: params.organizationId } + : {}), }; const [total, grouped] = await Promise.all([ @@ -212,10 +246,50 @@ export class AdminStatsRepository { }; } + // Distinct organizations with at least one top-level scheduled, published + // or failed post in the range, per creation source (web, API, MCP, ...). + // The total is distinct across all sources combined, not a summation. + private async sourceStats(params: StatsParams) { + const where: Prisma.PostWhereInput = { + parentPostId: null, + deletedAt: null, + publishDate: { gte: params.from, lte: params.to }, + state: { in: ['QUEUE', 'PUBLISHED', 'ERROR'] }, + }; + + const groups = await this._post.model.post.groupBy({ + by: ['organizationId', 'creationMethod'], + where, + }); + + const allOrgs = new Set(); + const orgsBySource = new Map>(); + for (const g of groups) { + if (!orgsBySource.has(g.creationMethod)) { + orgsBySource.set(g.creationMethod, new Set()); + } + orgsBySource.get(g.creationMethod)!.add(g.organizationId); + allOrgs.add(g.organizationId); + } + + return { + total: allOrgs.size, + perSocial: sortDesc( + [...orgsBySource.entries()].map(([provider, orgs]) => ({ + provider, + count: orgs.size, + })) + ), + }; + } + private async connectedStats(params: StatsParams) { const where: Prisma.IntegrationWhereInput = { - deletedAt: null, + ...(params.includeDeleted ? {} : { deletedAt: null }), createdAt: { gte: params.from, lte: params.to }, + ...(params.organizationId + ? { organizationId: params.organizationId } + : {}), }; const [total, grouped] = await Promise.all([ @@ -238,14 +312,108 @@ export class AdminStatsRepository { }; } - async getStats(params: StatsParams): Promise { - const [errors, posts, accounts, connected] = await Promise.all([ - this.errorStats(params), - this.postStats(params), - this.accountStats(params), - this.connectedStats(params), + private async postStateStats(params: OrgActivityParams) { + const grouped = await this._post.model.post.groupBy({ + by: ['state'], + where: { + organizationId: params.organizationId, + parentPostId: null, + ...(params.includeDeleted ? {} : { deletedAt: null }), + publishDate: { gte: params.from, lte: params.to }, + }, + _count: { _all: true }, + }); + + return grouped + .map((g) => ({ state: g.state as string, count: g._count._all })) + .sort((a, b) => b.count - a.count || a.state.localeCompare(b.state)); + } + + private async currentChannelStats( + organizationId: string, + includeDeleted?: boolean + ) { + const where: Prisma.IntegrationWhereInput = { + organizationId, + ...(includeDeleted ? {} : { deletedAt: null }), + }; + + const [total, grouped] = await Promise.all([ + this._integration.model.integration.count({ where }), + this._integration.model.integration.groupBy({ + by: ['providerIdentifier'], + where, + _count: { _all: true }, + }), ]); + return { + total, + perSocial: sortDesc( + grouped.map((g) => ({ + provider: g.providerIdentifier, + count: g._count._all, + })) + ), + }; + } + + private async activityRange( + organizationId: string, + includeDeleted?: boolean + ) { + const { _min, _max } = await this._post.model.post.aggregate({ + where: { + organizationId, + state: 'PUBLISHED', + ...(includeDeleted ? {} : { deletedAt: null }), + }, + _min: { publishDate: true }, + _max: { publishDate: true }, + }); + + return { + firstActivityAt: _min.publishDate?.toISOString() || null, + lastActivityAt: _max.publishDate?.toISOString() || null, + }; + } + + async getOrgActivity( + params: OrgActivityParams + ): Promise { + const [errors, posts, connectedInRange, channels, postsByState, activity] = + await Promise.all([ + this.errorStats(params), + this.postStats(params), + this.connectedStats(params), + this.currentChannelStats(params.organizationId, params.includeDeleted), + this.postStateStats(params), + this.activityRange(params.organizationId, params.includeDeleted), + ]); + + return { + from: params.from.toISOString(), + to: params.to.toISOString(), + organizationId: params.organizationId, + errors, + posts, + connectedInRange, + channels, + postsByState, + ...activity, + }; + } + + async getStats(params: StatsParams): Promise { + const [errors, posts, accounts, connected, activeOrgsBySource] = + await Promise.all([ + this.errorStats(params), + this.postStats(params), + this.accountStats(params), + this.connectedStats(params), + this.sourceStats(params), + ]); + return { from: params.from.toISOString(), to: params.to.toISOString(), @@ -256,6 +424,7 @@ export class AdminStatsRepository { scheduledAccounts: accounts.scheduledAccounts, publishingChannels: accounts.publishingChannels, scheduledChannels: accounts.scheduledChannels, + activeOrgsBySource, }; } } diff --git a/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.service.ts b/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.service.ts index e1af176bb6..62c024c3a5 100644 --- a/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { AdminStatsRepository, + OrgActivityParams, StatsParams, } from '@gitroom/nestjs-libraries/database/prisma/admin-stats/admin-stats.repository'; @@ -11,4 +12,8 @@ export class AdminStatsService { getStats(params: StatsParams) { return this._adminStatsRepository.getStats(params); } + + getOrgActivity(params: OrgActivityParams) { + return this._adminStatsRepository.getOrgActivity(params); + } } 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 aa241ff24c..37274a6f37 100644 --- a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts @@ -2,7 +2,7 @@ import { PrismaRepository } from '@gitroom/nestjs-libraries/database/prisma/pris import { Injectable } from '@nestjs/common'; import { createHash } from 'crypto'; import dayjs from 'dayjs'; -import { Integration } from '@prisma/client'; +import { Integration, Prisma } from '@prisma/client'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import { IntegrationTimeDto } from '@gitroom/nestjs-libraries/dtos/integrations/integration.time.dto'; import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory'; @@ -560,6 +560,152 @@ export class IntegrationRepository { }); } + private async latestPostsFor( + org: string, + state: 'PUBLISHED' | 'ERROR', + field: 'publishDate' | 'updatedAt', + options: { topLevelOnly: boolean; includeDeleted: boolean }, + groups: { integrationId: string; date: Date | null }[] + ) { + const matches = groups.filter((group) => group.date); + + if (!matches.length) { + return []; + } + + return this._posts.model.post.findMany({ + where: { + organizationId: org, + state, + ...(options.includeDeleted ? {} : { deletedAt: null }), + ...(options.topLevelOnly ? { parentPostId: null } : {}), + OR: matches.map( + (group) => + ({ + integrationId: group.integrationId, + [field]: group.date, + } as Prisma.PostWhereInput) + ), + }, + orderBy: { + id: 'asc', + }, + select: { + id: true, + integrationId: true, + publishDate: true, + updatedAt: true, + releaseURL: true, + error: true, + }, + }); + } + + private firstPerIntegration(posts: T[]) { + const byIntegration = new Map(); + + for (const post of posts) { + if (!byIntegration.has(post.integrationId)) { + byIntegration.set(post.integrationId, post); + } + } + + return byIntegration; + } + + async getChannelHealth(org: string, includeDeleted = false) { + const [integrations, lastPublished, lastErrored] = await Promise.all([ + this._integration.model.integration.findMany({ + where: { + organizationId: org, + }, + orderBy: { + createdAt: 'asc', + }, + select: { + id: true, + internalId: true, + name: true, + providerIdentifier: true, + type: true, + disabled: true, + refreshNeeded: true, + inBetweenSteps: true, + tokenExpiration: true, + deletedAt: true, + createdAt: true, + updatedAt: true, + customer: { + select: { + id: true, + name: true, + }, + }, + }, + }), + this._posts.model.post.groupBy({ + by: ['integrationId'], + where: { + organizationId: org, + state: 'PUBLISHED', + ...(includeDeleted ? {} : { deletedAt: null }), + parentPostId: null, + }, + _max: { publishDate: true }, + }), + this._posts.model.post.groupBy({ + by: ['integrationId'], + where: { + organizationId: org, + state: 'ERROR', + ...(includeDeleted ? {} : { deletedAt: null }), + }, + _max: { updatedAt: true }, + }), + ]); + + const [publishedPosts, erroredPosts] = await Promise.all([ + this.latestPostsFor( + org, + 'PUBLISHED', + 'publishDate', + { topLevelOnly: true, includeDeleted }, + lastPublished.map((group) => ({ + integrationId: group.integrationId, + date: group._max.publishDate, + })) + ), + this.latestPostsFor( + org, + 'ERROR', + 'updatedAt', + { topLevelOnly: false, includeDeleted }, + lastErrored.map((group) => ({ + integrationId: group.integrationId, + date: group._max.updatedAt, + })) + ), + ]); + + const publishedByIntegration = this.firstPerIntegration(publishedPosts); + const erroredByIntegration = this.firstPerIntegration(erroredPosts); + + return integrations.map((integration) => { + const published = publishedByIntegration.get(integration.id); + const errored = erroredByIntegration.get(integration.id); + + return { + ...integration, + lastPublishedAt: published?.publishDate || null, + lastPublishedPostId: published?.id || null, + lastPublishedUrl: published?.releaseURL || null, + lastErrorAt: errored?.updatedAt || null, + lastErrorPostId: errored?.id || null, + lastError: errored?.error || null, + }; + }); + } + async disableChannel(org: string, id: string) { await this._integration.model.integration.update({ 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 884ce9578e..8e4bf24c1f 100644 --- a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts @@ -21,6 +21,7 @@ import { RefreshToken, } from '@gitroom/nestjs-libraries/integrations/social.abstract'; import { IntegrationTimeDto } from '@gitroom/nestjs-libraries/dtos/integrations/integration.time.dto'; +import { isCroveBillingGated } from '@gitroom/nestjs-libraries/dos-billing/crove-billing-gate'; import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory'; import { PlugDto } from '@gitroom/nestjs-libraries/dtos/plugs/plug.dto'; import { difference, uniq } from 'lodash'; @@ -154,6 +155,10 @@ export class IntegrationService { return this._integrationRepository.getIntegrationsList(org); } + getChannelHealth(org: string, includeDeleted = false) { + return this._integrationRepository.getChannelHealth(org, includeDeleted); + } + getIntegrationForOrder(id: string, order: string, user: string, org: string) { return this._integrationRepository.getIntegrationForOrder( id, @@ -369,7 +374,7 @@ export class IntegrationService { await this._integrationRepository.getIntegrationsList(org) ).filter((f) => !f.disabled); if ( - !!process.env.STRIPE_PUBLISHABLE_KEY && + isCroveBillingGated() && integrations.length >= totalChannels ) { throw new Error('You have reached the maximum number of channels'); diff --git a/libraries/nestjs-libraries/src/database/prisma/media/media.repository.ts b/libraries/nestjs-libraries/src/database/prisma/media/media.repository.ts index 208def20f6..7f05d20b39 100644 --- a/libraries/nestjs-libraries/src/database/prisma/media/media.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/media/media.repository.ts @@ -25,6 +25,53 @@ export class MediaRepository { path: true, thumbnail: true, alt: true, + status: true, + }, + }); + } + + startProcessing(org: string, id: string) { + return this._media.model.media.update({ + where: { id, organizationId: org }, + data: { status: 'processing', processingError: null }, + select: { id: true, status: true }, + }); + } + + finishProcessing( + org: string, + id: string, + data: { name?: string; path?: string; fileSize?: number; error?: string } + ) { + return this._media.model.media.update({ + where: { id, organizationId: org }, + data: { + ...(data.name ? { name: data.name } : {}), + ...(data.path ? { path: data.path } : {}), + ...(data.fileSize ? { fileSize: data.fileSize } : {}), + status: data.error ? 'failed' : 'ready', + processingError: data.error || null, + }, + select: { id: true, status: true }, + }); + } + + getMediaStatus(org: string, id: string) { + return this._media.model.media.findFirst({ + where: { + id, + organizationId: org, + deletedAt: null, + }, + select: { + id: true, + name: true, + originalName: true, + path: true, + thumbnail: true, + alt: true, + status: true, + processingError: true, }, }); } @@ -89,6 +136,7 @@ export class MediaRepository { id: org, }, deletedAt: null, + status: { not: 'processing' }, ...searchFilter, }, }; @@ -97,6 +145,8 @@ export class MediaRepository { where: { organizationId: org, deletedAt: null, + // still being normalized: it shows up once the workflow releases it + status: { not: 'processing' }, ...searchFilter, }, orderBy: { diff --git a/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts b/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts index c56534b85e..bdeaf1f8da 100644 --- a/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts @@ -1,4 +1,4 @@ -import { HttpException, Injectable } from '@nestjs/common'; +import { BadRequestException, HttpException, Injectable } from '@nestjs/common'; import { MediaRepository } from '@gitroom/nestjs-libraries/database/prisma/media/media.repository'; import { OpenaiService } from '@gitroom/nestjs-libraries/openai/openai.service'; import { generationError } from '@gitroom/nestjs-libraries/openai/generation.error'; @@ -17,10 +17,74 @@ import { TemporalService } from 'nestjs-temporal-core'; import { TypedSearchAttributes } from '@temporalio/common'; import { organizationId } from '@gitroom/nestjs-libraries/temporal/temporal.search.attribute'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; +import { MediaProcessorJob } from '@gitroom/nestjs-libraries/upload/media.processor.interface'; +import { extname } from 'path'; +import { randomBytes } from 'crypto'; +import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service'; +import { ssrfSafeDispatcher } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher'; +import { + getMaxSize, + uploadStreamToStorage, +} from '@gitroom/nestjs-libraries/upload/custom.upload.validation'; + +// What every upload is normalized to before a provider ever sees it. The +// service applies exactly these, so a platform-specific need belongs in the +// provider, not here. +const VIDEO_RULES: MediaProcessorJob['rules'] = { + short_side_min: 1080, + short_side_max: 1080, + long_side_max: 1920, + video: { + container: 'mp4', + video_codec: 'h264', + profile: 'high', + pixel_format: 'yuv420p', + fps_max: 60, + quality: 23, + audio_codec: 'aac', + audio_bitrate_kbps: 128, + audio_sample_rate: 48000, + faststart: true, + }, +}; +const IMAGE_RULES: MediaProcessorJob['rules'] = { + short_side_min: 1, + short_side_max: 1080, + long_side_max: 1920, + image: { jpeg_quality: 90, keep_format: true }, +}; +const LIMITS: MediaProcessorJob['limits'] = { + max_input_bytes: 1073741824, + max_duration_seconds: 900, + timeout_seconds: 1200, +}; +// Extension of the normalized file and the content type the presigned PUT is +// minted for; anything else (gif, avif, ...) is stored as uploaded +const PROCESSABLE: Record< + string, + { type: 'video' | 'image'; ext: string; contentType: string } +> = { + '.mp4': { type: 'video', ext: 'mp4', contentType: 'video/mp4' }, + '.mov': { type: 'video', ext: 'mp4', contentType: 'video/mp4' }, + '.jpg': { type: 'image', ext: 'jpg', contentType: 'image/jpeg' }, + '.jpeg': { type: 'image', ext: 'jpg', contentType: 'image/jpeg' }, + '.png': { type: 'image', ext: 'png', contentType: 'image/png' }, + '.webp': { type: 'image', ext: 'webp', contentType: 'image/webp' }, +}; +// Formats a post can carry without normalization; anything else only exists to be converted +const USABLE_AS_IS = new Set([ + '.mp4', + '.jpg', + '.jpeg', + '.png', + '.webp', + '.gif', +]); @Injectable() export class MediaService { private storage = UploadFactory.createStorage(); + private processor = UploadFactory.createProcessor(); constructor( private _mediaRepository: MediaRepository, @@ -62,8 +126,336 @@ export class MediaService { } } - saveFile(org: string, fileName: string, filePath: string, originalName?: string) { - return this._mediaRepository.saveFile(org, fileName, filePath, originalName); + // Streams the remote body straight into storage: only the sniffing prefix + // and a few upload parts are ever in memory, so a 1 GB video does not cost + // 1 GB of heap + async uploadFromUrl(org: string, url: string) { + let response: globalThis.Response; + try { + response = await fetch(url, { + // @ts-ignore — undici option, not in lib.dom fetch types + dispatcher: ssrfSafeDispatcher, + }); + } catch (err) { + // Network-level failure (DNS, connection refused, SSRF block, etc.) — + // fetch rejects rather than returning a non-ok response. Keep the real + // reason reachable for callers that want to surface it + throw new BadRequestException('Failed to fetch URL', { cause: err }); + } + if (!response.ok || !response.body) { + throw new BadRequestException('Failed to fetch URL'); + } + + // Cheap early exit when the server declares the size; Content-Length may + // be absent or wrong, so the stream cap below is what really enforces it. + // The type isn't known yet (sniffed below), so this uses the largest cap + const declaredSize = Number(response.headers.get('content-length')); + if (declaredSize && declaredSize > getMaxSize('video/mp4')) { + await response.body.cancel(); + throw new BadRequestException('File is too large.'); + } + + const uploaded = await uploadStreamToStorage( + this.storage, + response.body, + declaredSize + ); + return this.saveFile(org, uploaded.originalname, uploaded.path); + } + + saveFile( + org: string, + fileName: string, + filePath: string, + originalName?: string + ) { + return this._mediaRepository.saveFile( + org, + fileName, + filePath, + originalName + ); + } + + // Saves an upload and, when a normalizer is configured, hands it to the + // processing workflow; the caller polls getMediaStatus until it is ready + async saveUploadedFile( + org: string, + fileName: string, + filePath: string, + originalName?: string + ) { + const media = await this.saveFile(org, fileName, filePath, originalName); + const client = this._temporalService.client.getRawClient(); + if ( + !this.processor || + !PROCESSABLE[extname(fileName).toLowerCase()] || + !client + ) { + return media; + } + + await this._mediaRepository.startProcessing(org, media.id); + try { + await client.workflow.start('processMediaWorkflow', { + workflowId: `media_${media.id}`, + taskQueue: 'main', + args: [{ mediaId: media.id }], + typedSearchAttributes: new TypedSearchAttributes([ + { + key: organizationId, + value: org, + }, + ]), + }); + } catch (err) { + // no workflow means nothing will ever flip the status + return this.releaseUnprocessed(org, media.id, media.name); + } + + return { ...media, status: 'processing' }; + } + + // Lets go of a media the normalizer will not touch. A source the platforms + // accept as-is (mp4, png, ...) becomes ready; one that only exists to be + // converted (mov) is failed, since nothing downstream can use it + private async releaseUnprocessed(org: string, id: string, name: string) { + const convertOnly = !USABLE_AS_IS.has(extname(name).toLowerCase()); + await this._mediaRepository.finishProcessing(org, id, { + ...(convertOnly + ? { error: 'No media processor is available to convert this file' } + : {}), + }); + return this._mediaRepository.getMediaStatus(org, id); + } + + // Upload widget (MCP Apps): the session id is what the model sees and polls, + // the ticket is the credential the widget uploads with. It is handed to the + // widget only, so it doesn't end up in the conversation + async createUploadSession(org: string) { + const sessionId = randomBytes(16).toString('hex'); + await ioRedis.set(`uploadSession:${sessionId}`, org, 'EX', 3600); + return sessionId; + } + + private async checkUploadSession(org: string, sessionId: string) { + if ((await ioRedis.get(`uploadSession:${sessionId}`)) !== org) { + throw new HttpException('Upload session not found or expired', 404); + } + } + + async createUploadTicket(org: string, sessionId: string) { + await this.checkUploadSession(org, sessionId); + const ticket = randomBytes(32).toString('hex'); + await ioRedis.set( + `uploadTicket:${ticket}`, + JSON.stringify({ org, sessionId }), + 'EX', + 600 + ); + return ticket; + } + + // A ticket never outlives its session: the file is streamed to storage right + // after this check, so an expired session has to be refused here + async getUploadTicket(ticket: string) { + const found = JSON.parse( + (await ioRedis.get(`uploadTicket:${ticket}`)) || 'null' + ) as { org: string; sessionId: string } | null; + if ( + !found || + (await ioRedis.get(`uploadSession:${found.sessionId}`)) !== found.org + ) { + return null; + } + return found; + } + + async saveUploadSessionFile( + org: string, + sessionId: string, + fileName: string, + filePath: string, + originalName?: string + ) { + await this.checkUploadSession(org, sessionId); + const media = await this.saveUploadedFile( + org, + fileName, + filePath, + originalName + ); + // a list, so parallel uploads of the same session can't overwrite each other + await ioRedis.rpush(`uploadSessionMedia:${sessionId}`, media.id); + await ioRedis.expire(`uploadSessionMedia:${sessionId}`, 3600); + return media; + } + + async getUploadSession(org: string, sessionId: string) { + await this.checkUploadSession(org, sessionId); + const list = await ioRedis.lrange(`uploadSessionMedia:${sessionId}`, 0, -1); + return ( + await Promise.all( + list.map((id) => this._mediaRepository.getMediaStatus(org, id)) + ) + ).filter((f) => f); + } + + async getMediaStatus(org: string, id: string) { + const media = await this._mediaRepository.getMediaStatus(org, id); + if (!media) { + throw new HttpException('Media not found', 404); + } + + return media; + } + + // The normalized file overwrites the original in place; only a container + // change (mov -> mp4, jpeg -> jpg) lands under a new key. Either way the + // polling side needs nothing but the media record to know where it is + private normalizedName(name: string) { + const ext = extname(name).toLowerCase(); + return `${name.slice(0, -ext.length)}.${PROCESSABLE[ext].ext}`; + } + + // Returns the processor job id; when this process has nothing to run the + // media (already marked processing by the upload) is released as ready, so + // a worker without the processor configured never leaves an upload hanging + async submitProcessing(mediaId: string) { + const media = await this._mediaRepository.getMediaById(mediaId); + if (!media) { + return null; + } + + const processable = PROCESSABLE[extname(media.name).toLowerCase()]; + if ( + !this.processor || + !processable || + !this.storage.signDownloadUrl || + !this.storage.signUploadUrl + ) { + await this.releaseUnprocessed(media.organizationId, media.id, media.name); + return null; + } + + const outputName = this.normalizedName(media.name); + return this.processor.submit({ + version: 1, + type: processable.type, + reference: media.id, + source: { url: await this.storage.signDownloadUrl(media.name) }, + output: { + url: await this.storage.signUploadUrl( + outputName, + processable.contentType + ), + content_type: processable.contentType, + }, + rules: processable.type === 'video' ? VIDEO_RULES : IMAGE_RULES, + limits: LIMITS, + }); + } + + // Returns true once the record is final. A transport error throws so the + // activity retries the poll; a terminal answer from the queue or the service + // marks the media failed and keeps the original usable + async checkProcessing(mediaId: string, jobId: string) { + const media = await this._mediaRepository.getMediaById(mediaId); + if (!media) { + return true; + } + + // a retried activity after the record was already finalized must not + // derive the output key a second time from the rewritten name + if (media.status !== 'processing') { + return true; + } + + const org = media.organizationId; + if (!this.processor) { + await this.releaseUnprocessed(org, mediaId, media.name); + return true; + } + + const job = await this.processor.status(jobId); + if (job.status === 'pending') { + return false; + } + + if (job.status === 'failed') { + await this._mediaRepository.finishProcessing(org, mediaId, { + error: job.error, + }); + return true; + } + + const { result } = job; + if ( + !result || + !['completed', 'unchanged', 'failed'].includes(result.status) + ) { + await this._mediaRepository.finishProcessing(org, mediaId, { + error: `Unexpected processor result: ${JSON.stringify(result).slice( + 0, + 500 + )}`, + }); + return true; + } + + if (result.status === 'failed') { + // the stderr tail is the only way to know what ffmpeg objected to + await this._mediaRepository.finishProcessing(org, mediaId, { + error: [ + `${result.failure?.code || 'FAILED'}: ${ + result.failure?.message || '' + }`, + result.failure?.stderr_tail, + ] + .filter(Boolean) + .join('\n') + .slice(0, 4000), + }); + return true; + } + + if (result.status === 'unchanged') { + await this._mediaRepository.finishProcessing(org, mediaId, {}); + return true; + } + + const outputName = this.normalizedName(media.name); + await this._mediaRepository.finishProcessing(org, mediaId, { + name: outputName, + path: media.path.slice(0, media.path.lastIndexOf('/') + 1) + outputName, + fileSize: result.output?.bytes, + }); + + // a same-key output already replaced the original; a stray object after a + // container change is harmless, so a failed delete never fails the media + if (outputName !== media.name) { + try { + await this.storage.removeFile(media.name); + } catch (err) { + console.error(`Could not remove original media ${media.name}:`, err); + } + } + return true; + } + + async failProcessing(mediaId: string, error: string) { + const media = await this._mediaRepository.getMediaById(mediaId); + if (!media) { + return; + } + + return this._mediaRepository.finishProcessing( + media.organizationId, + mediaId, + { + error, + } + ); } getMedia(org: string, page: number, search?: string) { 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 48f54206a6..123712aed0 100644 --- a/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.repository.ts @@ -281,6 +281,8 @@ export class OAuthRepository { oauthApp: { select: { clientId: true, + dynamic: true, + redirectUris: true, }, }, organization: { 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 94a2c7110d..87f50f666c 100644 --- a/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.service.ts @@ -7,18 +7,21 @@ import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; 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'; const openAiOAuthClientId = () => process.env.OPENAI_OAUTH_CLIENT_ID?.trim(); const enableOidcEmailClaims = () => Boolean(openAiOAuthClientId()); -const oauthScope = (clientId: string) => - [ - ...(clientId === openAiOAuthClientId() ? ['openid', 'email'] : []), - 'mcp:read', - 'mcp:write', - ].join(' '); +// 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[]) => + verifiedDomains.some( + (domain) => host === domain || host.endsWith('.' + domain) + ); + +type EmailClaimsApp = Pick; // Schemes a browser would execute instead of navigating away from the // consent screen, so they can never be a redirect_uri @@ -152,10 +155,7 @@ export class OAuthService { } const host = parsed.hostname.toLowerCase(); - const isVerified = verifiedDomains.some( - (domain) => host === domain || host.endsWith('.' + domain) - ); - if (!isVerified) { + if (!isVerifiedHost(host, verifiedDomains)) { throw new HttpException( { error: 'invalid_redirect_uri', @@ -180,6 +180,13 @@ export class OAuthService { .catch(() => {}); const isPublicClient = dto.token_endpoint_auth_method === 'none'; + // The token endpoint accepts the secret from either place; the stored + // method only mirrors back what the client asked for + const tokenEndpointAuthMethod = isPublicClient + ? 'none' + : dto.token_endpoint_auth_method === 'client_secret_basic' + ? 'client_secret_basic' + : 'client_secret_post'; const clientId = 'pcd_' + makeId(32); const clientSecret = isPublicClient ? undefined : 'pcs_' + makeId(48); @@ -189,7 +196,7 @@ export class OAuthService { redirectUris: JSON.stringify(redirectUris), clientId, clientSecret: clientSecret && AuthService.fixedEncryption(clientSecret), - tokenEndpointAuthMethod: isPublicClient ? 'none' : 'client_secret_post', + tokenEndpointAuthMethod, }); return { @@ -198,13 +205,60 @@ export class OAuthService { client_id_issued_at: Math.floor(app.createdAt.getTime() / 1000), client_name: app.name, redirect_uris: redirectUris, - token_endpoint_auth_method: isPublicClient ? 'none' : 'client_secret_post', + token_endpoint_auth_method: tokenEndpointAuthMethod, grant_types: ['authorization_code'], response_types: ['code'], scope: 'mcp:read mcp:write', }; } + // Email claims (openid/email scope + userinfo) go to the static ChatGPT app + // and to dynamically registered clients whose web callbacks all live on a + // verified domain (DCR_VERIFIED_DOMAINS). Everything else, including every + // dynamic client on a self-hosted install with no verified domains, only + // gets the mcp scopes + private allowsEmailClaims(app: EmailClaimsApp) { + if (!enableOidcEmailClaims()) { + return false; + } + if (app.clientId === openAiOAuthClientId()) { + return true; + } + if (!app.dynamic) { + return false; + } + + const verifiedDomains = this.verifiedDomainList(); + if (!verifiedDomains.length) { + return false; + } + + const webHosts: string[] = []; + for (const uri of JSON.parse(app.redirectUris || '[]') as string[]) { + try { + const parsed = new URL(uri); + if (parsed.protocol === 'https:') { + webHosts.push(parsed.hostname.toLowerCase()); + } + } catch { + return false; + } + } + + return ( + webHosts.length > 0 && + webHosts.every((host) => isVerifiedHost(host, verifiedDomains)) + ); + } + + private grantedScope(app: EmailClaimsApp) { + return [ + ...(this.allowsEmailClaims(app) ? ['openid', 'email'] : []), + 'mcp:read', + 'mcp:write', + ].join(' '); + } + async validateAuthorizationRequest( clientId: string, options?: { @@ -359,7 +413,7 @@ export class OAuthService { cus: paymentId, access_token: token, token_type: 'bearer', - scope: oauthScope(clientId), + scope: this.grantedScope(app), }; } @@ -395,7 +449,7 @@ export class OAuthService { ); } - if (authorizationRecord.oauthApp.clientId !== openAiOAuthClientId()) { + if (!this.allowsEmailClaims(authorizationRecord.oauthApp)) { throw new HttpException( { error: 'insufficient_scope', diff --git a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts index 32e1ccf682..b263134cbc 100644 --- a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts @@ -4,6 +4,7 @@ import { Injectable } from '@nestjs/common'; import { AuthService } from '@gitroom/helpers/auth/auth.service'; import { CreateOrgUserDto } from '@gitroom/nestjs-libraries/dtos/auth/create.org.user.dto'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; +import { isCroveBillingGated } from '@gitroom/nestjs-libraries/dos-billing/crove-billing-gate'; @Injectable() export class OrganizationRepository { @@ -87,6 +88,22 @@ export class OrganizationRepository { }); } + getPrivilegedNonSuperAdminUser(orgId: string) { + return this._userOrg.model.userOrganization.findFirst({ + where: { + organizationId: orgId, + disabled: false, + role: { + in: [Role.SUPERADMIN, Role.ADMIN], + }, + user: { + isSuperAdmin: false, + deletedAt: null, + }, + }, + }); + } + getUserOrg(id: string) { return this._userOrg.model.userOrganization.findFirst({ where: { @@ -287,6 +304,98 @@ export class OrganizationRepository { }); } + async getAccountOverview(orgId: string) { + const [organization, members] = await Promise.all([ + this._organization.model.organization.findUnique({ + where: { + id: orgId, + }, + select: { + id: true, + name: true, + createdAt: true, + deletedAt: true, + allowTrial: true, + isTrailing: true, + subscription: { + select: { + subscriptionTier: true, + period: true, + identifier: true, + totalChannels: true, + isLifetime: true, + cancelAt: true, + createdAt: true, + updatedAt: true, + deletedAt: true, + }, + }, + }, + }), + this._userOrg.model.userOrganization.findMany({ + where: { + organizationId: orgId, + }, + orderBy: { + createdAt: 'asc', + }, + select: { + role: true, + disabled: true, + createdAt: true, + user: { + select: { + id: true, + email: true, + activated: true, + providerName: true, + lastOnline: true, + createdAt: true, + }, + }, + }, + }), + ]); + + if (!organization) { + return null; + } + + const owner = members.find((member) => member.role === Role.SUPERADMIN); + const lastOnlineMax = members.reduce( + (latest, member) => + !latest || member.user.lastOnline > latest + ? member.user.lastOnline + : latest, + null + ); + + return { + organization: { + id: organization.id, + name: organization.name, + createdAt: organization.createdAt, + deletedAt: organization.deletedAt, + allowTrial: organization.allowTrial, + isTrailing: organization.isTrailing, + }, + subscription: organization.subscription || null, + owner: owner + ? { + ...owner.user, + role: owner.role, + memberSince: owner.createdAt, + } + : null, + users: { + total: members.length, + activated: members.filter((member) => member.user.activated).length, + disabled: members.filter((member) => member.disabled).length, + lastOnlineMax, + }, + }; + } + getUsersByEmail(email: string) { return this._user.model.user.findMany({ where: { @@ -322,7 +431,7 @@ export class OrganizationRepository { }); if ( - process.env.STRIPE_PUBLISHABLE_KEY && + isCroveBillingGated() && checkForSubscription?.subscription?.subscriptionTier === SubscriptionTier.STANDARD ) { diff --git a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts index d45e51b2ea..6734cfcbad 100644 --- a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts @@ -1,4 +1,5 @@ import { CreateOrgUserDto } from '@gitroom/nestjs-libraries/dtos/auth/create.org.user.dto'; +import { isCroveBillingGated } from '@gitroom/nestjs-libraries/dos-billing/crove-billing-gate'; import { HttpException, Injectable } from '@nestjs/common'; import { OrganizationRepository } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.repository'; import { NotificationService } from '@gitroom/nestjs-libraries/database/prisma/notifications/notification.service'; @@ -56,12 +57,21 @@ export class OrganizationService { return this._organizationRepository.getOrgByIdWithSubscription(id); } + getAccountOverview(orgId: string) { + return this._organizationRepository.getAccountOverview(orgId); + } + getOrgByApiKey(api: string) { return this._organizationRepository.getOrgByApiKey(api); } - async hasSuperAdminUser(orgId: string) { - return !!(await this._organizationRepository.getSuperAdminUser(orgId)); + async canUseSuperAdminApi(orgId: string) { + const [superAdmin, privilegedOther] = await Promise.all([ + this._organizationRepository.getSuperAdminUser(orgId), + this._organizationRepository.getPrivilegedNonSuperAdminUser(orgId), + ]); + + return !!superAdmin && !privilegedOther; } getUserOrg(id: string) { @@ -111,7 +121,7 @@ export class OrganizationService { const tier = // @ts-ignore org?.subscription?.subscriptionTier || - (!process.env.STRIPE_PUBLISHABLE_KEY ? 'ULTIMATE' : 'FREE'); + (!isCroveBillingGated() ? 'ULTIMATE' : 'FREE'); if (!pricing[tier].team_members) { throw new HttpException( 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 4d6e240f6a..1aa9e1538f 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts @@ -734,6 +734,59 @@ export class PostsRepository { }); } + private get postTimelineSelect() { + return { + id: true, + state: true, + publishDate: true, + createdAt: true, + updatedAt: true, + deletedAt: true, + releaseId: true, + releaseURL: true, + error: true, + creationMethod: true, + group: true, + parentPostId: true, + } as const; + } + + getPostTimeline(id: string, org: string) { + return this._post.model.post.findFirst({ + where: { + id, + organizationId: org, + }, + select: { + ...this.postTimelineSelect, + integration: { + select: { + id: true, + name: true, + providerIdentifier: true, + disabled: true, + refreshNeeded: true, + deletedAt: true, + }, + }, + childrenPost: { + select: this.postTimelineSelect, + orderBy: { publishDate: 'asc' as const }, + }, + errors: { + select: { + id: true, + platform: true, + message: true, + body: true, + createdAt: true, + }, + orderBy: { createdAt: 'desc' as const }, + }, + }, + }); + } + findAllExistingCategories() { return this._popularPosts.model.popularPosts.findMany({ select: { @@ -884,29 +937,51 @@ export class PostsRepository { }); } - async getPostByForWebhookId(postId: string) { - return this._post.model.post.findMany({ + async getPostByForWebhookId(postId: string, integrationId: string) { + const select = { + id: true, + content: true, + publishDate: true, + releaseURL: true, + state: true, + integration: { + select: { + id: true, + name: true, + providerIdentifier: true, + picture: true, + type: true, + }, + }, + }; + + const posts = await this._post.model.post.findMany({ where: { id: postId, deletedAt: null, parentPostId: null, }, - select: { - id: true, - content: true, - publishDate: true, - releaseURL: true, - state: true, - integration: { - select: { - id: true, - name: true, - providerIdentifier: true, - picture: true, - type: true, - }, - }, + select, + }); + + if (posts.length) { + return posts; + } + + // The running workflows pass the platform's post id, which updatePost + // already stored on the row as releaseId before the webhook is sent. + return this._post.model.post.findMany({ + where: { + releaseId: postId, + integrationId, + deletedAt: null, + parentPostId: null, + }, + orderBy: { + updatedAt: 'desc' as const, }, + take: 1, + select, }); } 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 13e684f813..5d5508bc6b 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -53,7 +53,7 @@ import { stripLinks } from '@gitroom/helpers/utils/strip.links'; import { validate } from 'class-validator'; import { plainToInstance } from 'class-transformer'; import { stripHtmlValidation } from '@gitroom/helpers/utils/strip.html.validation'; -import { weightedLength } from '@gitroom/helpers/utils/count.length'; +import { countLength } from '@gitroom/helpers/utils/count.length'; type PostWithConditionals = Post & { integration?: Integration; @@ -146,6 +146,10 @@ export class PostsService { return this._postRepository.getPostById(postId, orgId); } + async getPostTimeline(postId: string, orgId: string) { + return this._postRepository.getPostTimeline(postId, orgId); + } + async updateReleaseId(orgId: string, postId: string, releaseId: string) { return this._postRepository.updateReleaseId(postId, orgId, releaseId); } @@ -349,11 +353,23 @@ export class PostsService { ( await Promise.all( (imagesList || []).map(async (p: any) => { - if (!p.path && p.id) { + if (!p.id) { + return p; + } + + if (!p.path) { imageUpdateNeeded = true; return this._mediaService.getMediaById(p.id); } + // the normalizer may have replaced the file after the post was + // composed; a record still processing publishes the original + const fresh = await this._mediaService.getMediaById(p.id); + if (fresh?.status === 'ready' && fresh.path !== p.path) { + imageUpdateNeeded = true; + return { ...p, name: fresh.name, path: fresh.path }; + } + return p; }) ) @@ -688,8 +704,8 @@ export class PostsService { return this._postRepository.countPostsFromDay(orgId, date); } - getPostByForWebhookId(id: string) { - return this._postRepository.getPostByForWebhookId(id); + getPostByForWebhookId(id: string, integrationId: string) { + return this._postRepository.getPostByForWebhookId(id, integrationId); } async startWorkflow( @@ -827,20 +843,17 @@ export class PostsService { } const maximumCharacters = provider.maxLength(additionalSettings, settings); - const isX = integration.providerIdentifier === 'x'; const emptyContent = (post.value || []).some((a) => { const strip = stripHtmlValidation('normal', a.content || '', true); - const length = isX ? weightedLength(strip) : strip.length; + const length = countLength(integration.providerIdentifier, strip); return length === 0 && (a.image || []).length === 0; }); const tooLong = (post.value || []).some((a) => { const strip = stripHtmlValidation('normal', a.content || '', true); - const weighted = isX ? weightedLength(strip) : strip.length; - const totalCharacters = - weighted > strip.length ? weighted : strip.length; - return totalCharacters > (maximumCharacters || 1000000); + const counted = countLength(integration.providerIdentifier, strip); + return counted > (maximumCharacters || 1000000); }); return { diff --git a/libraries/nestjs-libraries/src/database/prisma/schema.prisma b/libraries/nestjs-libraries/src/database/prisma/schema.prisma index f3ba6dbf40..60dee99c9f 100644 --- a/libraries/nestjs-libraries/src/database/prisma/schema.prisma +++ b/libraries/nestjs-libraries/src/database/prisma/schema.prisma @@ -225,6 +225,8 @@ model Media { thumbnail String? alt String? thumbnailTimestamp Int? + status String @default("ready") + processingError String? organization Organization @relation(fields: [organizationId], references: [id]) agencies SocialMediaAgency[] userPicture User[] diff --git a/libraries/nestjs-libraries/src/database/prisma/subscriptions/subscription.repository.ts b/libraries/nestjs-libraries/src/database/prisma/subscriptions/subscription.repository.ts index 1071b7fc50..38e35e24af 100644 --- a/libraries/nestjs-libraries/src/database/prisma/subscriptions/subscription.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/subscriptions/subscription.repository.ts @@ -296,4 +296,40 @@ export class SubscriptionRepository { }, }); } + + syncFromDosPlan( + organizationId: string, + billing: 'STANDARD' | 'PRO', + totalChannels: number, + identifier: string, + cancelAt: Date | null + ) { + return this._subscription.model.subscription.upsert({ + where: { organizationId }, + update: { + subscriptionTier: billing, + totalChannels, + identifier, + period: 'MONTHLY', + cancelAt, + deletedAt: null, + isLifetime: false, + }, + create: { + organizationId, + subscriptionTier: billing, + totalChannels, + identifier, + period: 'MONTHLY', + cancelAt, + isLifetime: false, + }, + }); + } + + clearDosSyncedSubscription(organizationId: string) { + return this._subscription.model.subscription.deleteMany({ + where: { organizationId }, + }); + } } diff --git a/libraries/nestjs-libraries/src/database/prisma/subscriptions/subscription.service.ts b/libraries/nestjs-libraries/src/database/prisma/subscriptions/subscription.service.ts index aaf2ed471d..db6155d864 100644 --- a/libraries/nestjs-libraries/src/database/prisma/subscriptions/subscription.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/subscriptions/subscription.service.ts @@ -349,4 +349,26 @@ export class SubscriptionService { orgId ); } + + syncFromDosPlan( + organizationId: string, + billing: 'STANDARD' | 'PRO', + totalChannels: number, + identifier: string, + cancelAt: Date | null + ) { + return this._subscriptionRepository.syncFromDosPlan( + organizationId, + billing, + totalChannels, + identifier, + cancelAt + ); + } + + clearDosSyncedSubscription(organizationId: string) { + return this._subscriptionRepository.clearDosSyncedSubscription( + organizationId + ); + } } diff --git a/libraries/nestjs-libraries/src/dos-billing/crove-billing-gate.ts b/libraries/nestjs-libraries/src/dos-billing/crove-billing-gate.ts new file mode 100644 index 0000000000..f4d0b7e3f6 --- /dev/null +++ b/libraries/nestjs-libraries/src/dos-billing/crove-billing-gate.ts @@ -0,0 +1,13 @@ +export function isDosSharedBillingEnabled(): boolean { + return process.env.DOS_SHARED_BILLING === 'true'; +} + +export function isCroveBillingGated(): boolean { + return ( + !!process.env.STRIPE_PUBLISHABLE_KEY || isDosSharedBillingEnabled() + ); +} + +export function croveUiBillingEnabled(): boolean { + return isCroveBillingGated(); +} diff --git a/libraries/nestjs-libraries/src/dos-billing/dos-me-billing.client.ts b/libraries/nestjs-libraries/src/dos-billing/dos-me-billing.client.ts new file mode 100644 index 0000000000..537b5d5fe3 --- /dev/null +++ b/libraries/nestjs-libraries/src/dos-billing/dos-me-billing.client.ts @@ -0,0 +1,109 @@ +import { Injectable, Logger } from '@nestjs/common'; +import type { DosPlan } from './dos-plan.map'; + +export type DosEntitlement = { + user_id: string; + plan: DosPlan; + active_subscription_source: 'none' | 'stripe' | 'apple' | 'google'; + active_subscription_id: string | null; + current_period_start: string | null; + current_period_end: string | null; +}; + +@Injectable() +export class DosMeBillingClient { + private readonly logger = new Logger(DosMeBillingClient.name); + + private apiUrl() { + return (process.env.DOS_ME_API_URL || 'https://api.dos.me').replace( + /\/+$/, + '' + ); + } + + private apiKey() { + const key = process.env.DOS_ME_INTERNAL_API_KEY || ''; + if (key.length < 32) { + throw new Error('DOS_ME_INTERNAL_API_KEY is not configured'); + } + return key; + } + + async getEntitlement(userId: string): Promise { + return this.request(`/internal/users/${userId}/plan`, { + method: 'GET', + }); + } + + async checkout(input: { + userId: string; + plan: Exclude; + successUrl: string; + cancelUrl: string; + }) { + return this.request<{ + url?: string; + plan?: string; + already_subscribed?: boolean; + portal_url?: string; + updated?: boolean; + }>('/internal/billing/checkout', { + method: 'POST', + body: JSON.stringify({ + userId: input.userId, + plan: input.plan, + successUrl: input.successUrl, + cancelUrl: input.cancelUrl, + }), + }); + } + + async portal(userId: string, returnUrl: string) { + return this.request<{ url: string }>('/internal/billing/portal', { + method: 'POST', + body: JSON.stringify({ userId, returnUrl }), + }); + } + + async cancel(userId: string) { + return this.request<{ cancel_at_period_end: boolean; plan: string }>( + '/internal/billing/cancel', + { + method: 'POST', + body: JSON.stringify({ userId }), + } + ); + } + + private async request(path: string, init: RequestInit): Promise { + const url = `${this.apiUrl()}${path}`; + const response = await fetch(url, { + ...init, + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + 'X-API-Key': this.apiKey(), + ...(init.headers || {}), + }, + }); + const text = await response.text(); + let body: any = {}; + try { + body = text ? JSON.parse(text) : {}; + } catch { + body = { error: text }; + } + if (!response.ok) { + this.logger.warn( + `DOS-Me ${init.method} ${path} failed: ${response.status} ${text}` + ); + const err = new Error( + body?.error?.message || body?.message || `DOS-Me ${response.status}` + ) as Error & { status?: number; body?: unknown }; + err.status = response.status; + err.body = body; + throw err; + } + return body as T; + } +} diff --git a/libraries/nestjs-libraries/src/dos-billing/dos-plan.map.spec.ts b/libraries/nestjs-libraries/src/dos-billing/dos-plan.map.spec.ts new file mode 100644 index 0000000000..5ade4805dd --- /dev/null +++ b/libraries/nestjs-libraries/src/dos-billing/dos-plan.map.spec.ts @@ -0,0 +1,49 @@ +import { mapDosPlanToCrove, crovePackToDosPlan, isDosUserId } from './dos-plan.map'; + +describe('mapDosPlanToCrove', () => { + it('maps pro to Crove PRO with 30 channels', () => { + expect(mapDosPlanToCrove('pro')).toMatchObject({ + dosPlan: 'pro', + tier: 'PRO', + channels: 30, + monthPrice: 19, + }); + }); + + it('maps plus to Crove STANDARD with 5 channels', () => { + expect(mapDosPlanToCrove('plus')).toMatchObject({ + dosPlan: 'plus', + tier: 'STANDARD', + channels: 5, + monthPrice: 9, + }); + }); + + it('maps missing/free to FREE with 0 channels', () => { + expect(mapDosPlanToCrove(undefined)).toMatchObject({ + dosPlan: 'free', + tier: 'FREE', + channels: 0, + }); + }); +}); + +describe('crovePackToDosPlan', () => { + it('maps STANDARD purchase buttons to DOS plus', () => { + expect(crovePackToDosPlan('STANDARD')).toBe('plus'); + }); + + it('maps PRO purchase buttons to DOS pro', () => { + expect(crovePackToDosPlan('PRO')).toBe('pro'); + }); +}); + +describe('isDosUserId', () => { + it('accepts the DOS OIDC sub', () => { + expect(isDosUserId('550e8400-e29b-41d4-a716-446655440000')).toBe(true); + }); + + it('rejects a Postiz local id', () => { + expect(isDosUserId('clxyz')).toBe(false); + }); +}); diff --git a/libraries/nestjs-libraries/src/dos-billing/dos-plan.map.ts b/libraries/nestjs-libraries/src/dos-billing/dos-plan.map.ts new file mode 100644 index 0000000000..2cff3c21c6 --- /dev/null +++ b/libraries/nestjs-libraries/src/dos-billing/dos-plan.map.ts @@ -0,0 +1,60 @@ +import { pricing } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/pricing'; + +export type DosPlan = 'free' | 'plus' | 'pro'; +export type CroveMappedTier = 'FREE' | 'STANDARD' | 'PRO'; + +export type CrovePlanMapping = { + dosPlan: DosPlan; + tier: CroveMappedTier; + channels: number; + monthPrice: number; +}; + +const DOS_MONTH_PRICE = { plus: 9, pro: 19 } as const; + +export function mapDosPlanToCrove(plan: string | null | undefined): CrovePlanMapping { + if (plan === 'pro') { + return { + dosPlan: 'pro', + tier: 'PRO', + channels: pricing.PRO.channel || 30, + monthPrice: DOS_MONTH_PRICE.pro, + }; + } + if (plan === 'plus') { + return { + dosPlan: 'plus', + tier: 'STANDARD', + channels: pricing.STANDARD.channel || 5, + monthPrice: DOS_MONTH_PRICE.plus, + }; + } + return { + dosPlan: 'free', + tier: 'FREE', + channels: pricing.FREE.channel || 0, + monthPrice: 0, + }; +} + +export function crovePackToDosPlan( + pack: string, +): Exclude | 'free' { + const upper = pack.toUpperCase(); + if (upper === 'PRO' || upper === 'ULTIMATE') { + return 'pro'; + } + if (upper === 'FREE') { + return 'free'; + } + return 'plus'; +} + +export function isDosUserId(value: string | undefined | null): value is string { + return ( + typeof value === 'string' && + /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test( + value + ) + ); +} diff --git a/libraries/nestjs-libraries/src/dos-billing/dos-shared-billing.service.ts b/libraries/nestjs-libraries/src/dos-billing/dos-shared-billing.service.ts new file mode 100644 index 0000000000..bf68642233 --- /dev/null +++ b/libraries/nestjs-libraries/src/dos-billing/dos-shared-billing.service.ts @@ -0,0 +1,122 @@ +import { HttpException, Injectable, Logger } from '@nestjs/common'; +import { Provider, User } from '@prisma/client'; +import { SubscriptionService } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/subscription.service'; +import { isDosSharedBillingEnabled } from './crove-billing-gate'; +import { DosMeBillingClient } from './dos-me-billing.client'; +import { + CrovePlanMapping, + crovePackToDosPlan, + isDosUserId, + mapDosPlanToCrove, +} from './dos-plan.map'; + +@Injectable() +export class DosSharedBillingService { + private readonly logger = new Logger(DosSharedBillingService.name); + + constructor( + private readonly client: DosMeBillingClient, + private readonly subscriptions: SubscriptionService + ) {} + + enabled() { + return isDosSharedBillingEnabled(); + } + + dosUserId(user: User): string | null { + if (user.providerName !== Provider.GENERIC) { + return null; + } + return isDosUserId(user.providerId) ? user.providerId : null; + } + + async syncOrg( + user: User, + organizationId: string + ): Promise { + const dosUserId = this.dosUserId(user); + if (!dosUserId) { + this.logger.warn( + `DOS shared billing is on but user ${user.id} has no DOS UUID providerId` + ); + return mapDosPlanToCrove('free'); + } + + const entitlement = await this.client.getEntitlement(dosUserId); + const mapped = mapDosPlanToCrove(entitlement.plan); + const cancelAt = entitlement.current_period_end + ? new Date(entitlement.current_period_end) + : null; + + if (mapped.tier === 'FREE') { + await this.subscriptions.clearDosSyncedSubscription(organizationId); + } else { + await this.subscriptions.syncFromDosPlan( + organizationId, + mapped.tier, + mapped.channels, + entitlement.active_subscription_id || `dos-${dosUserId}`, + cancelAt + ); + } + return mapped; + } + + async checkout( + user: User, + pack: string, + frontendUrl: string + ) { + const dosUserId = this.requireDosUserId(user); + const plan = crovePackToDosPlan(pack); + try { + if (plan === 'free') { + return this.client.cancel(dosUserId); + } + const billingUrl = `${frontendUrl.replace(/\/+$/, '')}/billing`; + return await this.client.checkout({ + userId: dosUserId, + plan, + successUrl: `${billingUrl}?success=true&plan=${plan}`, + cancelUrl: `${billingUrl}?canceled=true`, + }); + } catch (err) { + this.rethrowDosMe(err); + } + } + + async portal(user: User, frontendUrl: string) { + try { + const dosUserId = this.requireDosUserId(user); + const billingUrl = `${frontendUrl.replace(/\/+$/, '')}/billing`; + return await this.client.portal(dosUserId, billingUrl); + } catch (err) { + this.rethrowDosMe(err); + } + } + + async cancel(user: User) { + try { + return await this.client.cancel(this.requireDosUserId(user)); + } catch (err) { + this.rethrowDosMe(err); + } + } + + private rethrowDosMe(err: unknown): never { + const status = (err as { status?: number })?.status; + const message = err instanceof Error ? err.message : 'DOS billing failed'; + throw new HttpException(message, status && status >= 400 ? status : 502); + } + + private requireDosUserId(user: User): string { + const dosUserId = this.dosUserId(user); + if (!dosUserId) { + throw new HttpException( + 'Crove account is not linked to a DOS ID', + 400 + ); + } + return dosUserId; + } +} diff --git a/libraries/nestjs-libraries/src/dtos/analytics/get.org.activity.dto.ts b/libraries/nestjs-libraries/src/dtos/analytics/get.org.activity.dto.ts new file mode 100644 index 0000000000..6311b1d925 --- /dev/null +++ b/libraries/nestjs-libraries/src/dtos/analytics/get.org.activity.dto.ts @@ -0,0 +1,11 @@ +import { IsDateString, IsOptional } from 'class-validator'; + +export class GetOrgActivityDto { + @IsOptional() + @IsDateString() + from?: string; + + @IsOptional() + @IsDateString() + to?: string; +} diff --git a/libraries/nestjs-libraries/src/dtos/oauth/token-exchange.dto.ts b/libraries/nestjs-libraries/src/dtos/oauth/token-exchange.dto.ts index 36a3c22bf4..ca3b3b7fe2 100644 --- a/libraries/nestjs-libraries/src/dtos/oauth/token-exchange.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/oauth/token-exchange.dto.ts @@ -9,9 +9,12 @@ export class TokenExchangeDto { @IsDefined() code: string; + // Optional here because client_secret_basic clients send the id and secret + // in the Authorization header; the controller merges the two sources and + // the service rejects a request that ends up without a client_id @IsString() - @IsDefined() - client_id: string; + @IsOptional() + client_id?: string; // Optional to allow PKCE-only public clients (dynamic registration); // the service still enforces it for confidential clients diff --git a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/reddit.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/reddit.dto.ts index 4a8f2a13fe..f4d4d813c1 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/reddit.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/reddit.dto.ts @@ -2,6 +2,7 @@ import { ArrayMinSize, IsBoolean, IsDefined, + IsIn, IsString, IsUrl, Matches, @@ -37,10 +38,11 @@ export class RedditSettingsDtoInner { title: string; @IsString() - @MinLength(2) + @IsIn(['self', 'link', 'media']) @IsDefined() @JSONSchema({ - description: 'Must be any of link, self (normal post), image, video, videogif', + description: + "Must be one of self (text post), link (requires url), media (uploads the post's first attached image or mp4 video)", }) type: string; diff --git a/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts b/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts index cb7ff2c3a1..4efd91c26d 100644 --- a/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts @@ -371,8 +371,22 @@ export class BlueskyProvider extends SocialAbstract implements SocialProvider { identifier: body.identifier, password: body.password, }); - } catch (err) { - throw new RefreshToken('bluesky', JSON.stringify(err), {} as BodyInit); + } catch (err: any) { + // Only a definite 4xx (bad password, account taken down) means the + // credentials are broken. A 5xx or network error is Bluesky being + // unavailable: let it propagate as a transient failure instead of + // marking the channel as disconnected. + const status = err?.status; + if ( + typeof status === 'number' && + status >= 400 && + status < 500 && + status !== 429 + ) { + throw new RefreshToken('bluesky', JSON.stringify(err), {} as BodyInit); + } + + throw err; } return agent; @@ -612,11 +626,12 @@ export class BlueskyProvider extends SocialAbstract implements SocialProvider { // this is safe and beats exhausting the check budget into a misleading // "check your account" warning. if ((pendingData.prepFailures || 0) >= 4) { + const reason = (err as any)?.message || String(err); throw new BadBody( 'bluesky', - JSON.stringify({}), + JSON.stringify({ message: reason }), {} as any, - 'Could not prepare the post for Bluesky, nothing was published, please try again' + `Could not prepare the post for Bluesky, nothing was published: ${reason}` ); } diff --git a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts index eabed2bafe..e009bd65b6 100644 --- a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts @@ -83,6 +83,28 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { }; } + // The token is valid but belongs to the user, not to the page - the page + // was never granted to the app, so only reconnecting can fix it + if ( + body.indexOf( + 'Unpublished posts must be posted to a page as the page itself' + ) > -1 + ) { + return { + type: 'refresh-token' as const, + value: + 'Postiz is not authorized to publish as this page, please reconnect the channel', + }; + } + + if (body.indexOf('(#200)') > -1) { + return { + type: 'bad-body' as const, + value: + 'Facebook rejected the post due to missing permissions. Make sure your Facebook account has full content access to the Page, then reconnect the channel.', + }; + } + if (body.indexOf('1366046') > -1) { return { type: 'bad-body' as const, @@ -1008,6 +1030,19 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { ): Promise { const today = dayjs().format('YYYY-MM-DD'); + // The stored id (releaseId) shape depends on the post type set in post(): + // - feed post -> `{pageid}_{postid}` (contains `_`), has an `insights` edge + // - reel/video -> bare numeric video id, NO `insights` edge (only `video_insights`) + // - story -> bare story id, no usable insights via this path + // There is no separate stored type, so id shape is the discriminator. Calling + // `/{videoId}/insights` on a video/story node returns + // `(#100) Tried accessing nonexisting field (insights)`, which is what surfaced + // in prod as "Error fetching Facebook post analytics: ApplicationFailure". Route + // bare ids to the video-only edge instead. + if (!postId.includes('_')) { + return this.videoPostAnalytics(accessToken, postId, today); + } + try { // Fetch post insights from Facebook Graph API. // post_impressions_unique was deprecated by Meta on 2026-06-15; it is replaced @@ -1078,4 +1113,89 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { return []; } } + + // Video/reel posts store a bare video id whose node has no `insights` edge; their + // analytics live on the `/{videoId}/video_insights` edge instead. Story posts also + // store a bare id but have no usable insights here — the video_insights call comes + // back with an `error` (or empty data), which we swallow to an empty result so a + // single story/video can't break the statistics page. + private async videoPostAnalytics( + accessToken: string, + videoId: string, + today: string + ): Promise { + try { + // Metric names verified against the Graph API v23.0 video_insights docs: + // - total_video_impressions: times the video was shown + // - total_video_views: 3s+ (or full, if shorter) plays + // - total_video_reactions_by_type_total: reactions object, keyed by type + // Use plain fetch (not this.fetch) so a `(#100) nonexisting field` / story + // response doesn't throw an ApplicationFailure — we want a quiet `[]` instead. + const { data, error } = await ( + await fetch( + `https://graph.facebook.com/${META_GRAPH_API_VERSION}/${videoId}/video_insights?metric=total_video_impressions,total_video_views,total_video_reactions_by_type_total&access_token=${accessToken}` + ) + ).json(); + + // Stories (and videos without this edge) come back with an error / no data — + // return an empty result quietly rather than logging a scary error. But a + // `nonexisting field (video_insights)` is the only "expected" error here; any + // other error (bad metric name, token, permissions) means the fix is silently + // returning empty when it shouldn't be, so surface it as a warning (not a throw, + // not a scary error) so it's diagnosable without breaking the statistics page. + if (error || !data || data.length === 0) { + if (error && !/nonexisting field/i.test(error.message || '')) { + console.warn('Facebook video_insights returned an error:', { + videoId, + error, + }); + } + return []; + } + + const result: AnalyticsData[] = []; + + for (const metric of data) { + const value = metric.values?.[0]?.value; + if (value === undefined) continue; + + let label = ''; + let total = ''; + + switch (metric.name) { + case 'total_video_impressions': + label = 'Impressions'; + total = String(value); + break; + case 'total_video_views': + label = 'Views'; + total = String(value); + break; + case 'total_video_reactions_by_type_total': + // This returns an object with reaction types + if (typeof value === 'object') { + const totalReactions = Object.values( + value as Record + ).reduce((sum: number, v: number) => sum + v, 0); + label = 'Reactions'; + total = String(totalReactions); + } + break; + } + + if (label) { + result.push({ + label, + percentageChange: 0, + data: [{ total, date: today }], + }); + } + } + + return result; + } catch (err) { + console.error('Error fetching Facebook video post analytics:', err); + return []; + } + } } diff --git a/libraries/nestjs-libraries/src/integrations/social/farcaster.provider.ts b/libraries/nestjs-libraries/src/integrations/social/farcaster.provider.ts index 0e237c4015..c61a265ce4 100644 --- a/libraries/nestjs-libraries/src/integrations/social/farcaster.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/farcaster.provider.ts @@ -15,11 +15,26 @@ import { Integration } from '@prisma/client'; import { FarcasterDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/farcaster.dto'; import { Tool } from '@gitroom/nestjs-libraries/integrations/tool.decorator'; import { Rules } from '@gitroom/nestjs-libraries/chat/rules.description.decorator'; +import { mnemonicToAccount } from 'viem/accounts'; +import { toDataURL } from 'qrcode'; const client = new NeynarAPIClient({ apiKey: process.env.NEYNAR_SECRET_KEY || '00000000-000-0000-000-000000000000', }); +const SIGNED_KEY_REQUEST_VALIDATOR_EIP_712_DOMAIN = { + name: 'Farcaster SignedKeyRequestValidator', + version: '1', + chainId: 10, + verifyingContract: '0x00000000fc700472606ed4fa22623acf62c60553', +} as const; + +const SIGNED_KEY_REQUEST_TYPE = [ + { name: 'requestFid', type: 'uint256' }, + { name: 'key', type: 'bytes' }, + { name: 'deadline', type: 'uint256' }, +] as const; + @Rules( 'Farcaster/Warpcast can only accept pictures' ) @@ -73,6 +88,76 @@ export class FarcasterProvider }; } + async createSigner(): Promise<{ + signerUuid: string; + approvalUrl: string; + qrCode: string; + }> { + if (!process.env.NEYNAR_APP_FID || !process.env.NEYNAR_APP_MNEMONIC) { + throw new Error( + 'Farcaster is not configured: set NEYNAR_APP_FID and NEYNAR_APP_MNEMONIC' + ); + } + + const appFid = Number(process.env.NEYNAR_APP_FID); + const signer = await client.createSigner(); + const deadline = Math.floor(Date.now() / 1000) + 24 * 60 * 60; + const signature = await mnemonicToAccount( + process.env.NEYNAR_APP_MNEMONIC + ).signTypedData({ + domain: SIGNED_KEY_REQUEST_VALIDATOR_EIP_712_DOMAIN, + types: { SignedKeyRequest: SIGNED_KEY_REQUEST_TYPE }, + primaryType: 'SignedKeyRequest', + message: { + requestFid: BigInt(appFid), + key: signer.public_key as `0x${string}`, + deadline: BigInt(deadline), + }, + }); + + const registered = await client.registerSignedKey({ + signerUuid: signer.signer_uuid, + appFid, + deadline, + signature, + ...(process.env.NEYNAR_SPONSOR_SIGNERS === 'true' + ? { sponsor: { sponsored_by_neynar: true } } + : {}), + }); + + return { + signerUuid: registered.signer_uuid, + approvalUrl: registered.signer_approval_url!, + qrCode: await toDataURL(registered.signer_approval_url!), + }; + } + + async signerStatus( + signerUuid: string + ): Promise<{ status: string; code?: string }> { + const signer = await client.lookupSigner({ signerUuid }); + if (signer.status !== 'approved') { + return { status: signer.status }; + } + + const { + users: [user], + } = await client.fetchBulkUsers({ fids: [signer.fid!] }); + + return { + status: signer.status, + code: Buffer.from( + JSON.stringify({ + signer_uuid: signerUuid, + fid: signer.fid, + username: user.username, + display_name: user.display_name, + pfp_url: user.pfp_url, + }) + ).toString('base64'), + }; + } + async authenticate(params: { code: string; codeVerifier: string; diff --git a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts index 81b7cc8802..f8c9aa08cb 100644 --- a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts @@ -308,6 +308,14 @@ export class InstagramProvider }; } + if (body.indexOf('(#200)') > -1) { + return { + type: 'bad-body' as const, + value: + 'Facebook rejected the post due to missing permissions. Make sure your Facebook account has full content access to the Page linked to this Instagram account, then reconnect the channel.', + }; + } + if (body.indexOf('Not enough permissions to post') > -1) { return { type: 'bad-body' as const, @@ -597,6 +605,12 @@ export class InstagramProvider }; } + // Instagram rejects collaborator handles that carry a leading @ with + // error_subcode 2207018, and the tag input stores whatever the user typed. + private stripHandle(handle: string) { + return handle.replace(/^@+/, ''); + } + // Single, read-only status check of a media container - the polling loops // that used to live inside post() are now driven by the post workflow. private async igContainerStatus( @@ -656,6 +670,16 @@ export class InstagramProvider const [accessToken] = token.split('___'); const [firstPost] = postDetails; const isStory = firstPost.settings.post_type === 'story'; + const collaborators = + firstPost?.settings?.collaborators?.length && !isStory + ? `&collaborators=${encodeURIComponent( + JSON.stringify( + firstPost?.settings?.collaborators.map((p) => + this.stripHandle(p.label) + ) + ) + )}` + : ``; const isTrialReel = this.assetBoolean(firstPost.settings.is_trial_reel); const medias = await Promise.all( firstPost?.media?.map(async (m) => { @@ -692,12 +716,10 @@ export class InstagramProvider )}` : ``; - const collaborators = - firstPost?.settings?.collaborators?.length && !isStory - ? `&collaborators=${JSON.stringify( - firstPost?.settings?.collaborators.map((p) => p.label) - )}` - : ``; + // collaborators are not allowed on carousel child items, + // they go on the carousel container instead + const itemCollaborators = + firstPost?.media?.length === 1 ? collaborators : ``; // audio_configuration is only supported for Reels (single video, not a story) // and only with Facebook Login (not Instagram Login / graph.instagram.com) @@ -724,7 +746,7 @@ export class InstagramProvider const { id: photoId } = await ( await this.fetch( - `https://${type}/${META_GRAPH_API_VERSION}/${id}/media?${mediaType}${isCarousel}${collaborators}${trialParams}${audioConfiguration}&access_token=${accessToken}${caption}`, + `https://${type}/${META_GRAPH_API_VERSION}/${id}/media?${mediaType}${isCarousel}${itemCollaborators}${trialParams}${audioConfiguration}&access_token=${accessToken}${caption}`, { method: 'POST', } @@ -754,6 +776,13 @@ export class InstagramProvider : 'carousel', containers: medias, message: firstPost?.message || '', + ...(collaborators + ? { + collaborators: firstPost.settings.collaborators!.map((p) => + this.stripHandle(p.label) + ), + } + : {}), }, }, ]; @@ -767,6 +796,7 @@ export class InstagramProvider containers: string[]; message?: string; carouselId?: string; + collaborators?: string[]; }, integration: Integration ): Promise { @@ -833,6 +863,7 @@ export class InstagramProvider containers: string[]; message?: string; carouselId?: string; + collaborators?: string[]; }, integration: Integration ): Promise { @@ -889,7 +920,13 @@ export class InstagramProvider pendingData.message || '' )}&media_type=CAROUSEL&children=${encodeURIComponent( pendingData.containers.join(',') - )}&access_token=${accessToken}`, + )}${ + pendingData.collaborators?.length + ? `&collaborators=${encodeURIComponent( + JSON.stringify(pendingData.collaborators) + )}` + : `` + }&access_token=${accessToken}`, { method: 'POST', } diff --git a/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts b/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts index 36bbdce5b5..0e933e1d97 100644 --- a/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts @@ -260,7 +260,9 @@ export class LinkedinPageProvider ).json(); return { - id: id, + // namespaced placeholder so the in-between row never collides with the + // personal LinkedIn channel row (same org + same member sub) + id: `${this.identifier}_${id}`, accessToken, refreshToken, expiresIn, diff --git a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts index 3317cd5075..7de3797745 100644 --- a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts @@ -639,40 +639,43 @@ export class PinterestProvider const result: AnalyticsData[] = []; const metrics = data.all; - if (metrics.lifetime_metrics) { - const lifetimeMetrics = metrics.lifetime_metrics; + // The requested metric types are period metrics: Pinterest returns them + // in summary_metrics, never in lifetime_metrics (that only ever carries + // TOTAL_COMMENTS / TOTAL_REACTIONS). + if (metrics.summary_metrics) { + const summaryMetrics = metrics.summary_metrics; - if (lifetimeMetrics.IMPRESSION !== undefined) { + if (summaryMetrics.IMPRESSION !== undefined) { result.push({ label: 'Impressions', percentageChange: 0, - data: [{ total: String(lifetimeMetrics.IMPRESSION), date: today }], + data: [{ total: String(summaryMetrics.IMPRESSION), date: today }], }); } - if (lifetimeMetrics.PIN_CLICK !== undefined) { + if (summaryMetrics.PIN_CLICK !== undefined) { result.push({ label: 'Pin Clicks', percentageChange: 0, - data: [{ total: String(lifetimeMetrics.PIN_CLICK), date: today }], + data: [{ total: String(summaryMetrics.PIN_CLICK), date: today }], }); } - if (lifetimeMetrics.OUTBOUND_CLICK !== undefined) { + if (summaryMetrics.OUTBOUND_CLICK !== undefined) { result.push({ label: 'Outbound Clicks', percentageChange: 0, data: [ - { total: String(lifetimeMetrics.OUTBOUND_CLICK), date: today }, + { total: String(summaryMetrics.OUTBOUND_CLICK), date: today }, ], }); } - if (lifetimeMetrics.SAVE !== undefined) { + if (summaryMetrics.SAVE !== undefined) { result.push({ label: 'Saves', percentageChange: 0, - data: [{ total: String(lifetimeMetrics.SAVE), date: today }], + data: [{ total: String(summaryMetrics.SAVE), date: today }], }); } } diff --git a/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts b/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts index 627645b360..3d4eac5852 100644 --- a/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts @@ -443,7 +443,7 @@ export class RedditProvider extends SocialAbstract implements SocialProvider { // finds the armed marker and asks Reddit instead of resubmitting blindly. const value = data.subreddits[data.cursor].value; data.armed = { - sr: value.subreddit.replace('/r/', '').toLowerCase(), + sr: value.subreddit.replace(/^\/?r\//, '').replace(/^\/+|\/+$/g, '').toLowerCase(), title: value.title || '', armedAt: Date.now(), media: value.type === 'media', @@ -502,7 +502,7 @@ export class RedditProvider extends SocialAbstract implements SocialProvider { } : {}), text: data.message, - sr: value.subreddit.replace('/r/', '').toLowerCase(), + sr: value.subreddit.replace(/^\/?r\//, '').replace(/^\/+|\/+$/g, '').toLowerCase(), }; const all = await ( diff --git a/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts index 654d6285c9..2ce190280f 100644 --- a/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts @@ -68,6 +68,22 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { ) { return 'You need one media'; } + + // TikTok fails the whole photo post when a single image is oversized, and + // the status only says `picture_size_check_failed` without naming it. + if (firstItems?.every((p) => (p?.path?.indexOf?.('mp4') ?? -1) === -1)) { + const dimensions = await Promise.all( + firstItems?.map((p) => this.getImageDimensions(p?.path)) ?? [] + ); + const tooBig = dimensions.findIndex( + (p) => Math.min(p?.width ?? 0, p?.height ?? 0) > 1080 + ); + if (tooBig > -1) { + return `Image ${tooBig + 1} is ${dimensions[tooBig]?.width}x${ + dimensions[tooBig]?.height + }, TikTok allows a maximum of 1080px on the shorter side`; + } + } return true; } @@ -260,7 +276,8 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { if (body.indexOf('picture_size_check_failed') > -1) { return { type: 'bad-body' as const, - value: 'Video must be at least 720p, Picture must no exceed 1080p', + value: + 'Media size not supported by TikTok: images up to 1080px on the shorter side, videos at least 360px on both sides', }; } diff --git a/libraries/nestjs-libraries/src/redis/redis.service.ts b/libraries/nestjs-libraries/src/redis/redis.service.ts index 92a95a6a4c..c54b142de4 100644 --- a/libraries/nestjs-libraries/src/redis/redis.service.ts +++ b/libraries/nestjs-libraries/src/redis/redis.service.ts @@ -18,6 +18,20 @@ class MockRedis { return 1; } + async rpush(key: string, value: any) { + this.data.set(key, [...(this.data.get(key) || []), value]); + return this.data.get(key).length; + } + + async lrange(key: string, start: number, end: number) { + const list = this.data.get(key) || []; + return list.slice(start, end === -1 ? undefined : end + 1); + } + + async expire() { + return 1; + } + // Add other Redis methods as needed for your tests } diff --git a/libraries/nestjs-libraries/src/sentry/initialize.sentry.ts b/libraries/nestjs-libraries/src/sentry/initialize.sentry.ts index 34e69a3e0c..c59c598a4c 100644 --- a/libraries/nestjs-libraries/src/sentry/initialize.sentry.ts +++ b/libraries/nestjs-libraries/src/sentry/initialize.sentry.ts @@ -63,7 +63,14 @@ export const initializeSentry = (appName: string, allowLogs = false) => { recordOutputs: true, }), ], - tracesSampleRate: 1.0, + tracesSampler: ({ name, attributes, normalizedRequest, inheritOrSampleWith }) => { + const path = String( + normalizedRequest?.url || attributes?.['http.target'] || attributes?.['url.path'] || name || '' + ); + return inheritOrSampleWith( + path.includes('/public/v1/analytics/') ? 0.01 : 0.2 + ); + }, enableLogs: true, // Bootstrap payloads and ticket exchanges must not enter telemetry. beforeSend(event) { @@ -86,8 +93,7 @@ export const initializeSentry = (appName: string, allowLogs = false) => { }, // Profiling - profileSessionSampleRate: - process.env.NODE_ENV === 'development' ? 1.0 : 0.3, + profileSessionSampleRate: process.env.NODE_ENV === 'development' ? 1.0 : 0.2, profileLifecycle: 'trace', }); } catch (err) { diff --git a/libraries/nestjs-libraries/src/throttler/throttler.provider.ts b/libraries/nestjs-libraries/src/throttler/throttler.provider.ts index 72b218d559..db506f9ffd 100644 --- a/libraries/nestjs-libraries/src/throttler/throttler.provider.ts +++ b/libraries/nestjs-libraries/src/throttler/throttler.provider.ts @@ -23,3 +23,15 @@ export class ThrottlerBehindProxyGuard extends ThrottlerGuard { ); } } + +// route-level guard for public endpoints, keyed by the client address the +// proxy forwards rather than the org the global guard expects +@Injectable() +export class ThrottlerRealIpGuard extends ThrottlerGuard { + protected override async getTracker( + req: Record + ): Promise { + const forwarded = String(req.headers?.['x-forwarded-for'] || ''); + return forwarded.split(',')[0].trim() || req.ip; + } +} diff --git a/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts b/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts index e01438aad9..6fc597d5c7 100644 --- a/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts +++ b/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts @@ -1,10 +1,18 @@ -import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'; +import { + S3Client, + PutObjectCommand, + GetObjectCommand, + DeleteObjectCommand, +} from '@aws-sdk/client-s3'; +import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; +import { Upload } from '@aws-sdk/lib-storage'; +import { Readable } from 'stream'; import 'multer'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import mime from 'mime-types'; // @ts-ignore import { getExtension } from 'mime'; -import { IUploadProvider } from './upload.interface'; +import { IUploadProvider, UploadedStream } from './upload.interface'; import axios from 'axios'; import { isSafePublicHttpsUrl } from '@gitroom/nestjs-libraries/dtos/webhooks/webhook.url.validator'; import { ssrfSafeDispatcher } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher'; @@ -154,14 +162,77 @@ class CloudflareStorage implements IUploadProvider { } } - // Implement the removeFile method from IUploadProvider + async uploadStream( + stream: Readable, + mimetype: string, + ext: string + ): Promise { + try { + if (!ALLOWED_MIME_TYPES.has(mimetype)) { + throw new Error('Unsupported file type.'); + } + const id = makeId(10); + const key = `${id}.${ext}`; + + // Multipart upload holds only a few parts in memory at a time instead + // of the whole body, and does not need to know the length up front + const upload = new Upload({ + client: this._client, + params: { + Bucket: this._bucketName, + ACL: 'public-read', + Key: key, + Body: stream, + ContentType: mimetype, + }, + }); + await upload.done(); + + return { + filename: key, + mimetype, + originalname: key, + path: `${this._uploadUrl}/${key}`, + }; + } catch (err) { + console.error('Error streaming file to Cloudflare R2:', err); + throw err; + } + } + + async signDownloadUrl(fileName: string) { + return getSignedUrl( + this._client, + new GetObjectCommand({ Bucket: this._bucketName, Key: fileName }), + { expiresIn: 3 * 3600 } + ); + } + + async signUploadUrl(fileName: string, contentType: string) { + return getSignedUrl( + this._client, + new PutObjectCommand({ + Bucket: this._bucketName, + Key: fileName, + ContentType: contentType, + }), + { expiresIn: 3 * 3600 } + ); + } + + // Accepts either the public URL or the bare key async removeFile(filePath: string): Promise { - // const fileName = filePath.split('/').pop(); // Extract the filename from the path - // const command = new DeleteObjectCommand({ - // Bucket: this._bucketName, - // Key: fileName, - // }); - // await this._client.send(command); + const fileName = filePath.split('/').pop(); + if (!fileName) { + return; + } + + await this._client.send( + new DeleteObjectCommand({ + Bucket: this._bucketName, + Key: fileName, + }) + ); } } diff --git a/libraries/nestjs-libraries/src/upload/custom.upload.validation.ts b/libraries/nestjs-libraries/src/upload/custom.upload.validation.ts index 1e3c5d1441..788473b8a1 100644 --- a/libraries/nestjs-libraries/src/upload/custom.upload.validation.ts +++ b/libraries/nestjs-libraries/src/upload/custom.upload.validation.ts @@ -1,12 +1,12 @@ -import { - BadRequestException, - Injectable, - PipeTransform, -} from '@nestjs/common'; +import { BadRequestException } from '@nestjs/common'; +import { pipeline, Readable, Transform } from 'stream'; +import { IUploadProvider } from './upload.interface'; // eslint-disable-next-line @typescript-eslint/no-var-requires -const { fileTypeFromBuffer } = require('file-type'); +const { fileTypeStream } = require('file-type'); -const ALLOWED_MIME_TYPES = new Set([ +// What users may put in the media library, whether by multipart upload or +// from a remote URL; narrower than what storage itself accepts, no audio +export const UPLOAD_ALLOWED_MIME = new Set([ 'image/jpeg', 'image/png', 'image/gif', @@ -17,46 +17,6 @@ const ALLOWED_MIME_TYPES = new Set([ 'video/mp4', ]); -@Injectable() -export class CustomFileValidationPipe implements PipeTransform { - async transform(value: any) { - if (!value || typeof value !== 'object') { - return value; - } - - // Skip non-file parameters (org, body, query, etc.) - if (!('buffer' in value) && !('mimetype' in value) && !('fieldname' in value)) { - return value; - } - - if (!value.buffer || !Buffer.isBuffer(value.buffer)) { - throw new BadRequestException('Invalid file upload.'); - } - - const detected = await fileTypeFromBuffer(value.buffer); - if (!detected || !ALLOWED_MIME_TYPES.has(detected.mime)) { - throw new BadRequestException('Unsupported file type.'); - } - - const maxSize = getMaxSize(detected.mime); - if (value.size > maxSize) { - throw new BadRequestException( - `File size exceeds the maximum allowed size of ${maxSize} bytes.` - ); - } - - value.mimetype = detected.mime; - const safeBase = (value.originalname || 'upload') - .replace(/\.[^./\\]*$/, '') - .replace(/[\\/]/g, '_') - .slice(0, 100) || 'upload'; - value.originalname = `${safeBase}.${detected.ext}`; - - return value; - } - -} - export function getMaxSize(mimeType: string): number { if (mimeType.startsWith('image/')) { return 10 * 1024 * 1024; // 10 MB @@ -66,3 +26,68 @@ export function getMaxSize(mimeType: string): number { throw new BadRequestException('Unsupported file type.'); } } + +// Passes bytes through and fails once they exceed maxSize, so a body with a +// missing or lying Content-Length cannot be streamed into storage unbounded +export function maxSizeStream(maxSize: number) { + let total = 0; + return new Transform({ + transform(chunk: Buffer, _encoding, callback) { + total += chunk.length; + if (total > maxSize) { + return callback(new BadRequestException('File is too large.')); + } + callback(null, chunk); + }, + }); +} + +// Sniffs the real type from the first bytes, applies the per-type size cap +// and streams the rest into storage, so only the sniffing prefix and a few +// upload parts are ever in memory. Rejections are BadRequestException with +// the same messages the old buffer validation used. `declaredSize` is the +// Content-Length when the sender gave one; it may be absent or wrong, so the +// stream cap is what really enforces the limit +export async function uploadStreamToStorage( + storage: IUploadProvider, + webStream: ReadableStream, + declaredSize = 0 +) { + let sniffed: ReadableStream & { fileType?: { mime: string; ext: string } }; + try { + sniffed = await fileTypeStream(webStream); + } catch (err) { + throw new BadRequestException('Failed to read file', { cause: err }); + } + const detected = sniffed.fileType; + if (!detected || !UPLOAD_ALLOWED_MIME.has(detected.mime)) { + await sniffed.cancel(); + throw new BadRequestException('Unsupported file type.'); + } + + const maxSize = getMaxSize(detected.mime); + if (declaredSize > maxSize) { + await sniffed.cancel(); + throw new BadRequestException('File is too large.'); + } + + // pipeline (not pipe) so failing the cap also tears down the source + const body = pipeline( + Readable.fromWeb(sniffed as any), + maxSizeStream(maxSize), + () => {} + ); + + try { + const uploaded = await storage.uploadStream( + body, + detected.mime, + detected.ext + ); + return { ...uploaded, ext: detected.ext }; + } catch (err) { + // The size cap rejects mid-upload with its own BadRequestException + body.destroy(); + throw err; + } +} diff --git a/libraries/nestjs-libraries/src/upload/local.storage.ts b/libraries/nestjs-libraries/src/upload/local.storage.ts index 3351253a02..6a4452e1fa 100644 --- a/libraries/nestjs-libraries/src/upload/local.storage.ts +++ b/libraries/nestjs-libraries/src/upload/local.storage.ts @@ -1,5 +1,7 @@ -import { IUploadProvider } from './upload.interface'; -import { mkdirSync, unlink, writeFileSync } from 'fs'; +import { IUploadProvider, UploadedStream } from './upload.interface'; +import { createWriteStream, mkdirSync, unlink, writeFileSync } from 'fs'; +import { Readable } from 'stream'; +import { pipeline } from 'stream/promises'; import { isSafePublicHttpsUrl } from '@gitroom/nestjs-libraries/dtos/webhooks/webhook.url.validator'; import { ssrfSafeDispatcher } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher'; import { parseDataUrl } from '@gitroom/nestjs-libraries/upload/data.url'; @@ -23,6 +25,30 @@ const LOCAL_STORAGE_ALLOWED_MIME = new Set([ export class LocalStorage implements IUploadProvider { constructor(private uploadDirectory: string) {} + // Files live under /YYYY/MM/DD with a random name; creates the folder + private newFilePath(ext: string) { + const now = new Date(); + const year = now.getFullYear(); + const month = String(now.getMonth() + 1).padStart(2, '0'); + const day = String(now.getDate()).padStart(2, '0'); + + const innerPath = `/${year}/${month}/${day}`; + const dir = `${this.uploadDirectory}${innerPath}`; + mkdirSync(dir, { recursive: true }); + + const randomName = Array(32) + .fill(null) + .map(() => Math.round(Math.random() * 16).toString(16)) + .join(''); + + const filename = `${randomName}.${ext}`; + return { + filename, + filePath: `${dir}/${filename}`, + path: process.env.FRONTEND_URL + '/uploads' + `${innerPath}/${filename}`, + }; + } + async uploadSimple(path: string) { const dataUrl = path.startsWith('data:') ? parseDataUrl(path) : null; @@ -49,28 +75,12 @@ export class LocalStorage implements IUploadProvider { if (!detected || !LOCAL_STORAGE_ALLOWED_MIME.has(detected.mime)) { throw new Error('Unsupported file type.'); } - const findExtension = detected.ext; - - const now = new Date(); - const year = now.getFullYear(); - const month = String(now.getMonth() + 1).padStart(2, '0'); - const day = String(now.getDate()).padStart(2, '0'); - const innerPath = `/${year}/${month}/${day}`; - const dir = `${this.uploadDirectory}${innerPath}`; - mkdirSync(dir, { recursive: true }); - - const randomName = Array(32) - .fill(null) - .map(() => Math.round(Math.random() * 16).toString(16)) - .join(''); - - const filePath = `${dir}/${randomName}.${findExtension}`; - const publicPath = `${innerPath}/${randomName}.${findExtension}`; + const { filePath, path: publicUrl } = this.newFilePath(detected.ext); // Logic to save the file to the filesystem goes here writeFileSync(filePath, body); - return process.env.FRONTEND_URL + '/uploads' + publicPath; + return publicUrl; } async uploadFile(file: Express.Multer.File): Promise { @@ -79,33 +89,16 @@ export class LocalStorage implements IUploadProvider { if (!detected || !LOCAL_STORAGE_ALLOWED_MIME.has(detected.mime)) { throw new Error('Unsupported file type.'); } - const safeExt = `.${detected.ext}`; const safeMime = detected.mime; - const now = new Date(); - const year = now.getFullYear(); - const month = String(now.getMonth() + 1).padStart(2, '0'); - const day = String(now.getDate()).padStart(2, '0'); - - const innerPath = `/${year}/${month}/${day}`; - const dir = `${this.uploadDirectory}${innerPath}`; - mkdirSync(dir, { recursive: true }); - - const randomName = Array(32) - .fill(null) - .map(() => Math.round(Math.random() * 16).toString(16)) - .join(''); - - const filePath = `${dir}/${randomName}${safeExt}`; - const publicPath = `${innerPath}/${randomName}${safeExt}`; - + const { filename, filePath, path } = this.newFilePath(detected.ext); writeFileSync(filePath, file.buffer); return { - filename: `${randomName}${safeExt}`, - path: process.env.FRONTEND_URL + '/uploads' + publicPath, + filename, + path, mimetype: safeMime, - originalname: `${randomName}${safeExt}`, + originalname: filename, }; } catch (err) { console.error('Error uploading file to Local Storage:', err); @@ -113,10 +106,46 @@ export class LocalStorage implements IUploadProvider { } } + async uploadStream( + stream: Readable, + mimetype: string, + ext: string + ): Promise { + try { + if (!LOCAL_STORAGE_ALLOWED_MIME.has(mimetype)) { + throw new Error('Unsupported file type.'); + } + + const { filename, filePath, path } = this.newFilePath(ext); + try { + await pipeline(stream, createWriteStream(filePath)); + } catch (err) { + // Don't leave a truncated file behind (size cap hit, remote closed, ...) + await this.removeFile(filePath).catch(() => {}); + throw err; + } + + return { + filename, + path, + mimetype, + originalname: filename, + }; + } catch (err) { + console.error('Error streaming file to Local Storage:', err); + throw err; + } + } + + // Accepts either the public URL or the filesystem path async removeFile(filePath: string): Promise { + const publicPrefix = process.env.FRONTEND_URL + '/uploads'; + const localPath = filePath.startsWith(publicPrefix) + ? this.uploadDirectory + filePath.slice(publicPrefix.length) + : filePath; // Logic to remove the file from the filesystem goes here return new Promise((resolve, reject) => { - unlink(filePath, (err) => { + unlink(localPath, (err) => { if (err) { reject(err); } else { diff --git a/libraries/nestjs-libraries/src/upload/media.processor.interface.ts b/libraries/nestjs-libraries/src/upload/media.processor.interface.ts new file mode 100644 index 0000000000..1d705b600f --- /dev/null +++ b/libraries/nestjs-libraries/src/upload/media.processor.interface.ts @@ -0,0 +1,69 @@ +// Contract of the media normalization service (postiz-uploader schema/v1). +// The service knows nothing about Postiz: URLs in, metadata out. +export interface MediaProcessorJob { + version: 1; + type: 'video' | 'image'; + reference: string; + source: { url: string; content_type?: string }; + output: { url: string; content_type: string }; + thumbnail?: { + url: string; + timestamp_seconds?: number; + content_type?: 'image/jpeg'; + }; + rules: { + short_side_min: number; + short_side_max: number; + long_side_max: number; + video?: { + container?: 'mp4'; + video_codec?: 'h264'; + profile?: string; + pixel_format?: string; + fps_max?: number; + quality?: number; + audio_codec?: string; + audio_bitrate_kbps?: number; + audio_sample_rate?: number; + faststart?: boolean; + }; + image?: { jpeg_quality?: number; keep_format?: boolean }; + }; + limits?: { + max_input_bytes?: number; + max_duration_seconds?: number; + timeout_seconds?: number; + }; +} + +export interface MediaProcessorResult { + version: 1; + reference: string; + status: 'completed' | 'unchanged' | 'failed'; + actions: string[]; + output?: { + width: number; + height: number; + duration_seconds?: number; + bytes: number; + content_type: string; + }; + thumbnail?: { width: number; height: number; bytes: number } | null; + failure?: { + code: string; + message: string; + retryable: boolean; + stderr_tail?: string; + } | null; +} + +export type MediaProcessorStatus = + | { status: 'pending' } + | { status: 'completed'; result: MediaProcessorResult } + // the queue itself failed (crash, expired job); retryable by the caller + | { status: 'failed'; error: string }; + +export interface IMediaProcessor { + submit(job: MediaProcessorJob): Promise; + status(jobId: string): Promise; +} diff --git a/libraries/nestjs-libraries/src/upload/multer.stream.engine.ts b/libraries/nestjs-libraries/src/upload/multer.stream.engine.ts new file mode 100644 index 0000000000..2d5d205a06 --- /dev/null +++ b/libraries/nestjs-libraries/src/upload/multer.stream.engine.ts @@ -0,0 +1,67 @@ +import { Request } from 'express'; +import { StorageEngine } from 'multer'; +import { Readable } from 'stream'; +import { IUploadProvider } from './upload.interface'; +import { UploadFactory } from './upload.factory'; +import { getMaxSize, uploadStreamToStorage } from './custom.upload.validation'; + +// Multer storage engine that streams each incoming file straight into +// storage instead of multer's default of buffering it whole in memory. +// `file.filename` / `file.path` end up as the stored key and public URL, +// `file.originalname` keeps the sender's name with the detected extension +export class MulterStreamEngine implements StorageEngine { + constructor(private storage: IUploadProvider) {} + + _handleFile( + req: Request, + file: Express.Multer.File, + cb: (error?: any, info?: Partial) => void + ) { + uploadStreamToStorage( + this.storage, + Readable.toWeb(file.stream) as any + ).then( + (uploaded) => { + const safeBase = + (file.originalname || 'upload') + .replace(/\.[^./\\]*$/, '') + .replace(/[\\/]/g, '_') + .slice(0, 100) || 'upload'; + cb(null, { + filename: uploaded.filename, + path: uploaded.path, + mimetype: uploaded.mimetype, + originalname: `${safeBase}.${uploaded.ext}`, + }); + }, + (err) => cb(err) + ); + } + + // Multer calls this when the request fails after the file was already + // stored (e.g. another part hit a limit), so the orphan is dropped + _removeFile( + req: Request, + file: Express.Multer.File, + cb: (error: Error | null) => void + ) { + this.storage.removeFile(file.path).then( + () => cb(null), + (err) => cb(err) + ); + } +} + +let engine: MulterStreamEngine; + +// Options for FileInterceptor on the multipart upload routes. Multer's own +// limit sits one byte above the largest allowed type so the in-stream cap is +// what rejects (a uniform 400 that aborts the upload) rather than multer +// truncating the file, storing it whole and only then failing with a 413 +export function streamUploadOptions() { + engine = engine || new MulterStreamEngine(UploadFactory.createStorage()); + return { + storage: engine, + limits: { fileSize: getMaxSize('video/mp4') + 1 }, + }; +} diff --git a/libraries/nestjs-libraries/src/upload/r2.uploader.ts b/libraries/nestjs-libraries/src/upload/r2.uploader.ts index ef2ed4fb5b..3164d5ed81 100644 --- a/libraries/nestjs-libraries/src/upload/r2.uploader.ts +++ b/libraries/nestjs-libraries/src/upload/r2.uploader.ts @@ -14,6 +14,7 @@ import { Request, Response } from 'express'; import crypto from 'crypto'; import path from 'path'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; +import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory'; // eslint-disable-next-line @typescript-eslint/no-var-requires const { fileTypeFromBuffer } = require('file-type'); @@ -30,9 +31,18 @@ const ALLOWED_EXT_TO_MIME: Record = { '.mp4': 'video/mp4', }; +// Multipart uploads go through the normalizer, so they may also carry +// QuickTime, which it turns into an mp4; simple uploads never do +function multipartExtToMime(): Record { + return { + ...ALLOWED_EXT_TO_MIME, + ...(UploadFactory.processorEnabled() ? { '.mov': 'video/quicktime' } : {}), + }; +} + function normalizeExtension(filename: string): string | null { const ext = path.extname(filename || '').toLowerCase(); - return ALLOWED_EXT_TO_MIME[ext] ? ext : null; + return multipartExtToMime()[ext] ? ext : null; } const { @@ -111,7 +121,7 @@ export async function createMultipartUpload(req: Request, res: Response) { if (!safeExt) { return res.status(400).json({ message: 'Unsupported file type.' }); } - const safeContentType = ALLOWED_EXT_TO_MIME[safeExt]; + const safeContentType = multipartExtToMime()[safeExt]; const randomFilename = generateRandomString() + safeExt; try { @@ -205,7 +215,7 @@ export async function completeMultipartUpload(req: Request, res: Response) { ); return res.status(400).json({ message: 'Unsupported file type.' }); } - const expectedMime = ALLOWED_EXT_TO_MIME[safeExt]; + const expectedMime = multipartExtToMime()[safeExt]; const head = await R2.send( new GetObjectCommand({ @@ -222,7 +232,10 @@ export async function completeMultipartUpload(req: Request, res: Response) { const prefix = Buffer.concat(chunks); const detected = await fileTypeFromBuffer(prefix); - if (!detected || detected.mime !== expectedMime) { + // a .mov with an ISO brand sniffs as video/mp4; the normalizer reads both + const acceptedMimes = + safeExt === '.mov' ? ['video/quicktime', 'video/mp4'] : [expectedMime]; + if (!detected || !acceptedMimes.includes(detected.mime)) { await R2.send( new DeleteObjectCommand({ Bucket: CLOUDFLARE_BUCKETNAME, Key: key }) ); diff --git a/libraries/nestjs-libraries/src/upload/runpod.media.processor.ts b/libraries/nestjs-libraries/src/upload/runpod.media.processor.ts new file mode 100644 index 0000000000..2366957726 --- /dev/null +++ b/libraries/nestjs-libraries/src/upload/runpod.media.processor.ts @@ -0,0 +1,66 @@ +import { + IMediaProcessor, + MediaProcessorJob, + MediaProcessorStatus, +} from './media.processor.interface'; + +// RunPod Serverless wraps every request as { input } and every result as +// { id, status, output }. The worker returns failures as a normal result with +// status "failed" inside, so a RunPod-level FAILED is only an unhandled crash. +export class RunPodMediaProcessor implements IMediaProcessor { + private _baseUrl: string; + + constructor(private _apiKey: string, endpointId: string) { + this._baseUrl = `https://api.runpod.ai/v2/${endpointId}`; + } + + private async request(path: string, init?: RequestInit) { + const response = await fetch(`${this._baseUrl}${path}`, { + ...init, + headers: { + Authorization: `Bearer ${this._apiKey}`, + 'Content-Type': 'application/json', + ...(init?.headers || {}), + }, + signal: AbortSignal.timeout(30000), + }); + + if (!response.ok) { + throw new Error( + `RunPod ${response.status}: ${(await response.text()).slice(0, 500)}` + ); + } + + return response.json(); + } + + async submit(job: MediaProcessorJob): Promise { + const { id } = await this.request('/run', { + method: 'POST', + body: JSON.stringify({ input: job }), + }); + + if (!id) { + throw new Error('RunPod accepted the job without returning an id'); + } + + return id; + } + + async status(jobId: string): Promise { + const { status, output, error } = await this.request(`/status/${jobId}`, { + method: 'GET', + }); + + switch (status) { + case 'COMPLETED': + return { status: 'completed', result: output }; + case 'FAILED': + case 'CANCELLED': + case 'TIMED_OUT': + return { status: 'failed', error: error || status }; + default: + return { status: 'pending' }; + } + } +} diff --git a/libraries/nestjs-libraries/src/upload/upload.factory.ts b/libraries/nestjs-libraries/src/upload/upload.factory.ts index f89d310a8c..a66332110f 100644 --- a/libraries/nestjs-libraries/src/upload/upload.factory.ts +++ b/libraries/nestjs-libraries/src/upload/upload.factory.ts @@ -1,6 +1,8 @@ import { CloudflareStorage } from './cloudflare.storage'; import { IUploadProvider } from './upload.interface'; import { LocalStorage } from './local.storage'; +import { IMediaProcessor } from './media.processor.interface'; +import { RunPodMediaProcessor } from './runpod.media.processor'; export class UploadFactory { static createStorage(): IUploadProvider { @@ -22,4 +24,24 @@ export class UploadFactory { throw new Error(`Invalid storage type ${storageProvider}`); } } + + // Normalization needs presigned URLs, so it is only available on cloud storage + static processorEnabled() { + return ( + process.env.STORAGE_PROVIDER === 'cloudflare' && + !!process.env.RUNPOD_API_KEY && + !!process.env.RUNPOD_ENDPOINT_ID + ); + } + + static createProcessor(): IMediaProcessor | null { + if (!UploadFactory.processorEnabled()) { + return null; + } + + return new RunPodMediaProcessor( + process.env.RUNPOD_API_KEY!, + process.env.RUNPOD_ENDPOINT_ID! + ); + } } diff --git a/libraries/nestjs-libraries/src/upload/upload.interface.ts b/libraries/nestjs-libraries/src/upload/upload.interface.ts index 52c2f030f5..3fda973527 100644 --- a/libraries/nestjs-libraries/src/upload/upload.interface.ts +++ b/libraries/nestjs-libraries/src/upload/upload.interface.ts @@ -1,5 +1,26 @@ +import { Readable } from 'stream'; + +export interface UploadedStream { + filename: string; + originalname: string; + path: string; + mimetype: string; +} + export interface IUploadProvider { uploadSimple(path: string): Promise; uploadFile(file: Express.Multer.File): Promise; + // Streams the body straight into storage without buffering it. The caller + // has already sniffed the real type from the first bytes, so it passes the + // detected mime/ext instead of the provider re-sniffing a buffer + uploadStream( + stream: Readable, + mimetype: string, + ext: string + ): Promise; removeFile(filePath: string): Promise; + // Presigned URLs handed to the media processor, which has no storage + // credentials; only cloud storage can mint them + signDownloadUrl?(fileName: string): Promise; + signUploadUrl?(fileName: string, contentType: string): Promise; } diff --git a/libraries/nestjs-libraries/src/upload/upload.module.ts b/libraries/nestjs-libraries/src/upload/upload.module.ts index aa03d86e69..2853315ad7 100644 --- a/libraries/nestjs-libraries/src/upload/upload.module.ts +++ b/libraries/nestjs-libraries/src/upload/upload.module.ts @@ -1,10 +1,9 @@ import { Global, Module } from '@nestjs/common'; import { UploadFactory } from './upload.factory'; -import { CustomFileValidationPipe } from '@gitroom/nestjs-libraries/upload/custom.upload.validation'; @Global() @Module({ - providers: [UploadFactory, CustomFileValidationPipe], - exports: [UploadFactory, CustomFileValidationPipe], + providers: [UploadFactory], + exports: [UploadFactory], }) export class UploadModule {} diff --git a/libraries/nestjs-libraries/src/user/include.deleted.from.request.ts b/libraries/nestjs-libraries/src/user/include.deleted.from.request.ts new file mode 100644 index 0000000000..904c4219f7 --- /dev/null +++ b/libraries/nestjs-libraries/src/user/include.deleted.from.request.ts @@ -0,0 +1,8 @@ +import { createParamDecorator, ExecutionContext } from '@nestjs/common'; + +export const GetIncludeDeletedFromRequest = createParamDecorator( + (data: unknown, ctx: ExecutionContext) => { + const request = ctx.switchToHttp().getRequest(); + return !!request.includeDeleted; + } +); diff --git a/libraries/react-shared-libraries/src/helpers/uppy.upload.ts b/libraries/react-shared-libraries/src/helpers/uppy.upload.ts index 12af1cd579..acece4e7d7 100644 --- a/libraries/react-shared-libraries/src/helpers/uppy.upload.ts +++ b/libraries/react-shared-libraries/src/helpers/uppy.upload.ts @@ -2,6 +2,110 @@ import XHRUpload from '@uppy/xhr-upload'; import AwsS3Multipart from '@uppy/aws-s3'; import sha256 from 'sha256'; import Transloadit from '@uppy/transloadit'; +import { BasePlugin } from '@uppy/core'; + +const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +// Keeps a file in the "processing" state after it reached the bucket until the +// media normalization workflow marks the record ready, the same way +// Transloadit's waitForEncoding holds the dashboard until the assembly is done. +// Files whose record is already ready (no normalizer, gif, ...) pass through. +// The bytes are already stored, so giving up never fails the upload: the +// original file is used instead. +export class WaitForMediaProcessing extends BasePlugin { + constructor( + uppy: any, + opts: { + fetch: any; + processingMessage: string; + fallbackMessage: string; + interval?: number; + maxWait?: number; + } + ) { + super(uppy, opts); + this.id = 'WaitForMediaProcessing'; + this.type = 'modifier'; + } + + install() { + this.uppy.addPostProcessor(this.process); + } + + uninstall() { + this.uppy.removePostProcessor(this.process); + } + + process = async (fileIDs: string[]) => { + await Promise.all(fileIDs.map((id) => this.waitForFile(id))); + }; + + waitForFile = async (id: string) => { + const file: any = this.uppy.getFile(id); + const saved = file?.response?.body?.saved; + if (saved?.status !== 'processing') { + return; + } + + this.uppy.emit('postprocess-progress', file, { + mode: 'indeterminate', + message: this.opts.processingMessage, + }); + + const interval = this.opts.interval || 2000; + const deadline = Date.now() + (this.opts.maxWait || 20 * 60 * 1000); + let failures = 0; + let media: any = saved; + // the file disappears when the user cancels, so stop polling with it + while (this.uppy.getFile(id) && Date.now() < deadline && failures < 5) { + await sleep(interval); + + try { + const response = await ( + await this.opts.fetch(`/media/${saved.id}/status`) + ).json(); + // a 4xx body has no status; treat it like a failed poll + if (!response?.status) { + throw new Error(response?.message || 'Media not found'); + } + media = response; + failures = 0; + } catch (err) { + failures++; + continue; + } + + if (media.status !== 'processing') { + break; + } + } + + const current: any = this.uppy.getFile(id); + if (!current) { + return; + } + + if (media.status !== 'ready') { + // a file that only existed to be converted has nothing to fall back to + const usable = /\.(png|jpe?g|gif|webp|mp4)$/i.test(media.name || ''); + if (!usable) { + this.uppy.info(media.processingError || this.opts.fallbackMessage, 'error', 5000); + this.uppy.setFileState(id, { error: media.processingError || 'failed' } as any); + this.uppy.emit('postprocess-complete', this.uppy.getFile(id)); + return; + } + this.uppy.info(this.opts.fallbackMessage, 'warning', 5000); + } + + this.uppy.setFileState(id, { + response: { + ...current.response, + body: { ...current.response.body, saved: media }, + }, + } as any); + this.uppy.emit('postprocess-complete', this.uppy.getFile(id)); + }; +} const fetchUploadApiEndpoint = async ( fetch: any, endpoint: string, diff --git a/libraries/react-shared-libraries/src/helpers/variable.context.tsx b/libraries/react-shared-libraries/src/helpers/variable.context.tsx index 9313789235..f84252109e 100644 --- a/libraries/react-shared-libraries/src/helpers/variable.context.tsx +++ b/libraries/react-shared-libraries/src/helpers/variable.context.tsx @@ -40,6 +40,7 @@ export interface VariableContextInterface { language: string; dub: boolean; transloadit: string[]; + mediaProcessing: boolean; sentryDsn: string; extensionId: string; googleAdsId?: string; @@ -82,6 +83,7 @@ const VariableContext = createContext({ language: '', dub: false, transloadit: [], + mediaProcessing: false, sentryDsn: '', extensionId: '', brandConfig: defaultBrandWithCustom, diff --git a/libraries/react-shared-libraries/src/sentry/initialize.sentry.client.ts b/libraries/react-shared-libraries/src/sentry/initialize.sentry.client.ts index 60c2317136..48016b1fd6 100644 --- a/libraries/react-shared-libraries/src/sentry/initialize.sentry.client.ts +++ b/libraries/react-shared-libraries/src/sentry/initialize.sentry.client.ts @@ -38,8 +38,8 @@ export const initializeSentryClient = (environment: string, dsn: string) => }), Sentry.replayCanvasIntegration(), ], - replaysSessionSampleRate: 1.0, + replaysSessionSampleRate: 0.4, replaysOnErrorSampleRate: 1.0, - profilesSampleRate: environment === 'development' ? 1.0 : 0.75, + profilesSampleRate: environment === 'development' ? 1.0 : 0.60, }); 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 29853bc81d..cde3b58c26 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 @@ -16,8 +16,19 @@ export const initializeSentryBasic = ( /^Load failed .*/i, /^NetworkError when attempting to fetch resource\.$/i, /^NetworkError when attempting to fetch resource\. .*/i, + /^Object captured as promise rejection with keys: code, message$/i, ]; + // Browser wallet extensions (Phantom, MetaMask, etc.) reject with a plain + // { code, message } object instead of an Error when the user closes their popup. + // Those rejections happen inside the extension's injected script, not in our code. + const isWalletExtensionRejection = (exception: unknown) => + !!exception && + typeof exception === 'object' && + !(exception instanceof Error) && + 'code' in exception && + 'message' in exception; + try { Sentry.init({ initialScope: { @@ -44,7 +55,7 @@ export const initializeSentryBasic = ( sendDefaultPii: true, ...extension, debug: environment === 'development', - tracesSampleRate: 1.0, + tracesSampleRate: 0.2, // Server tracing starts before the proxy exchanges the launch ticket. beforeSendTransaction(event) { @@ -64,6 +75,10 @@ export const initializeSentryBasic = ( ) ) return null; + if (isWalletExtensionRejection(hint?.originalException)) { + return null; // Ignore the event + } + if (event.exception && event.exception.values) { for (const exception of event.exception.values) { if (exception.value) { 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 a5008647fa..edebb4fa8c 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ar/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ar/translation.json @@ -575,7 +575,16 @@ "email_address": "عنوان البريد الإلكتروني", "email_already_exists": "البريد الإلكتروني موجود بالفعل", "google": "جوجل", + "apple": "تفاحة", "farcaster": "فاركاستر", + "farcaster_approve_instructions": "امسح رمز الاستجابة السريعة (QR) بهاتفك، أو افتح الرابط على هاتفك، ثم وافق على Postiz في تطبيق Farcaster.", + "farcaster_open_in_farcaster": "افتح في Farcaster", + "farcaster_waiting_for_approval": "بانتظار موافقتك...", + "farcaster_signer_revoked": "تم إلغاء موافقة Farcaster، يرجى المحاولة مرة أخرى", + "farcaster_signer_failed": "فشل بدء الاتصال بـ Farcaster", + "farcaster_scan_instructions": "امسح رمز الاستجابة السريعة (QR) بهاتفك، أو انسخ الرابط وافتحه على هاتفك، ثم وافق على Postiz في تطبيق Farcaster.", + "farcaster_copy_link": "انسخ رابط Farcaster", + "farcaster_approval_timeout": "انتهت مهلة موافقة Farcaster، يرجى المحاولة مرة أخرى", "edit_autopost": "تعديل النشر التلقائي", "add_autopost_title": "إضافة نشر تلقائي", "webhook_deleted_successfully": "تم حذف الويب هوك بنجاح", @@ -693,10 +702,31 @@ "connected_channels": "القنوات المتصلة", "continue": "متابعة", "continue_without_channels": "متابعة بدون قنوات", + "connect_agents": "ربط الوكلاء", + "connect_your_ai_agent": "اربط وكيل الذكاء الاصطناعي الخاص بك", + "connect_agent_description": "اختر الوكيل الذي تستخدمه ودعه ينشئ وجدول المنشورات نيابة عنك", + "agent_access_unavailable": "الوصول إلى الوكيل غير متاح في خطتك الحالية أو دورك. يمكنك إعداده لاحقًا من الإعدادات > المطورون.", + "sign_in_no_api_key": "تسجيل الدخول مع Postiz (بدون مفتاح API)", + "oauth_sign_in_hint": "سيفتح وكيلك نافذة متصفح لتسجيل الدخول إلى Postiz.", + "add_to_cursor": "أضف إلى المؤشر", + "cli": "CLI", + "other_agents": "وكلاء آخرون", + "documentation": "التوثيق", + "read_the_api_docs": "اقرأ مستندات واجهة برمجة التطبيقات", + "api_key_onboarding_description": "أرسلها كـ Authorization header في كل طلب", + "api_onboarding_description": "استخدم واجهة برمجة تطبيقات Postiz من كودك الخاص، n8n أو أي أتمتة أخرى", + "chat": "الدردشة", + "chat_onboarding_description": "لا حاجة لإعدادات MCP أو CLI. الصق هذا في الدردشة، سيقوم الوكيل بتثبيت Postiz CLI ويطلب منك مفتاح API الخاص بك.", + "connector": "موصل", + "connector_onboarding_description": "الأسرع: أضف Postiz بنقرة واحدة، سيطلب منك تسجيل الدخول", + "mcp_onboarding_description": "زود وكيلك بأدوات Postiz لإنشاء وجدولة وإدارة المنشورات", + "cli_onboarding_description": "ثبّت Postiz CLI والمهارة التي تعلم وكيلك كيفية استخدامها", + "agent_settings_later": "المزيد من الوكلاء والتعليمات الكاملة متوفرة في الإعدادات > المطورون", "watch_tutorial": "مشاهدة الدليل", "watch_tutorial_title": "تعلم كيفية استخدام Postiz", "watch_tutorial_description": "شاهد هذا الفيديو القصير لتتعلم كيف تستفيد من Postiz بأفضل شكل", "back": "رجوع", + "continue_skip": "متابعة / تخطي", "get_started": "ابدأ", "kick_select_channel": "اختر القناة", "annual": "سنوي", 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 2747b13b45..c4b21d5cd0 100644 --- a/libraries/react-shared-libraries/src/translation/locales/bn/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/bn/translation.json @@ -575,7 +575,16 @@ "email_address": "ইমেইল ঠিকানা", "email_already_exists": "ইমেইল ইতিমধ্যে বিদ্যমান", "google": "গুগল", + "apple": "আপেল", "farcaster": "ফারকাস্টার", + "farcaster_approve_instructions": "আপনার ফোন দিয়ে QR কোডটি স্ক্যান করুন অথবা লিঙ্কটি ফোনে খুলুন, তারপর Farcaster অ্যাপে Postiz অনুমোদন করুন।", + "farcaster_open_in_farcaster": "Farcaster-এ খুলুন", + "farcaster_waiting_for_approval": "আপনার অনুমোদনের জন্য অপেক্ষা করা হচ্ছে...", + "farcaster_signer_revoked": "Farcaster অনুমোদন বাতিল করা হয়েছে, অনুগ্রহ করে আবার চেষ্টা করুন", + "farcaster_signer_failed": "Farcaster সংযোগ শুরু করতে ব্যর্থ হয়েছে", + "farcaster_scan_instructions": "আপনার ফোন দিয়ে QR কোডটি স্ক্যান করুন, অথবা লিঙ্কটি কপি করে আপনার ফোনে খুলুন, এরপর Farcaster অ্যাপে Postiz অনুমোদন দিন।", + "farcaster_copy_link": "Farcaster লিঙ্ক কপি করুন", + "farcaster_approval_timeout": "Farcaster অনুমোদন সময় শেষ হয়েছে, অনুগ্রহ করে আবার চেষ্টা করুন", "edit_autopost": "অটোপোস্ট সম্পাদনা করুন", "add_autopost_title": "অটোপোস্ট যোগ করুন", "webhook_deleted_successfully": "ওয়েবহুক সফলভাবে মুছে ফেলা হয়েছে", @@ -693,10 +702,31 @@ "connected_channels": "সংযুক্ত চ্যানেলসমূহ", "continue": "চালিয়ে যান", "continue_without_channels": "চ্যানেল ছাড়াই চালিয়ে যান", + "connect_agents": "এজেন্ট সংযুক্ত করুন", + "connect_your_ai_agent": "আপনার AI এজেন্ট সংযুক্ত করুন", + "connect_agent_description": "আপনার ব্যবহৃত এজেন্টটি নির্বাচন করুন এবং তাকে পোস্ট তৈরি ও নির্ধারিত করতে দিন", + "agent_access_unavailable": "আপনার বর্তমান প্ল্যান বা ভূমিকার জন্য এজেন্ট অ্যাক্সেস উপলব্ধ নয়। আপনি পরে সেটিংস > ডেভেলপারস-এ সেট আপ করতে পারেন।", + "sign_in_no_api_key": "Postiz-এ সাইন ইন করুন (কোনো API কী ছাড়াই)", + "oauth_sign_in_hint": "আপনার এজেন্ট Postiz-এ সাইন ইন করার জন্য একটি ব্রাউজার উইন্ডো খুলবে।", + "add_to_cursor": "কার্সারে যোগ করুন", + "cli": "CLI", + "other_agents": "অন্যান্য এজেন্ট", + "documentation": "ডকুমেন্টেশন", + "read_the_api_docs": "API ডকুমেন্টেশন পড়ুন", + "api_key_onboarding_description": "প্রত্যেক অনুরোধের সাথে এটিকে Authorization হেডার হিসেবে পাঠান", + "api_onboarding_description": "নিজের কোড, n8n বা অন্য কোনো অটোমেশনের মাধ্যমে Postiz API ব্যবহার করুন", + "chat": "চ্যাট", + "chat_onboarding_description": "MCP বা CLI সেটিংসের প্রয়োজন নেই। এটি চ্যাটে পেস্ট করুন, এজেন্টটি Postiz CLI ইনস্টল করবে এবং আপনার API কী চাইবে।", + "connector": "কনেক্টর", + "connector_onboarding_description": "সবচেয়ে দ্রুত উপায়: এক ক্লিকে Postiz যোগ করুন, আপনাকে সাইন ইন করতে বলা হবে", + "mcp_onboarding_description": "আপনার এজেন্টকে Postiz টুল দিন যাতে সে পোস্ট তৈরি, নির্ধারণ এবং পরিচালনা করতে পারে", + "cli_onboarding_description": "Postiz CLI এবং সেই স্কিল ইনস্টল করুন যা আপনার এজেন্টকে এটি ব্যবহার করতে শেখায়", + "agent_settings_later": "আরও এজেন্ট এবং সম্পূর্ণ নির্দেশিকা সেটিংস > ডেভেলপারস-এ পাওয়া যাবে", "watch_tutorial": "টিউটোরিয়াল দেখুন", "watch_tutorial_title": "Postiz ব্যবহারের উপায় শিখুন", "watch_tutorial_description": "Postiz সর্বোচ্চভাবে কাজে লাগাতে এই সংক্ষিপ্ত ভিডিওটি দেখুন", "back": "পেছনে যান", + "continue_skip": "চালিয়ে যান / বাদ দিন", "get_started": "শুরু করুন", "kick_select_channel": "চ্যানেল নির্বাচন করুন", "annual": "বার্ষিক", 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 38203a66be..1d2f5347fb 100644 --- a/libraries/react-shared-libraries/src/translation/locales/de/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/de/translation.json @@ -575,7 +575,16 @@ "email_address": "E-Mail-Adresse", "email_already_exists": "E-Mail existiert bereits", "google": "Google", + "apple": "Apfel", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Scanne den QR-Code mit deinem Handy oder öffne den Link auf deinem Handy und bestätige dann Postiz in der Farcaster-App.", + "farcaster_open_in_farcaster": "In Farcaster öffnen", + "farcaster_waiting_for_approval": "Warte auf deine Bestätigung...", + "farcaster_signer_revoked": "Die Farcaster-Bestätigung wurde widerrufen, bitte versuche es erneut.", + "farcaster_signer_failed": "Die Verbindung zu Farcaster konnte nicht gestartet werden.", + "farcaster_scan_instructions": "Scannen Sie den QR-Code mit Ihrem Handy oder kopieren Sie den Link und öffnen Sie ihn auf Ihrem Handy. Genehmigen Sie dann Postiz in der Farcaster-App.", + "farcaster_copy_link": "Farcaster-Link kopieren", + "farcaster_approval_timeout": "Zeitüberschreitung bei der Farcaster-Bestätigung, bitte versuche es erneut.", "edit_autopost": "Autopost bearbeiten", "add_autopost_title": "Autopost hinzufügen", "webhook_deleted_successfully": "Webhook erfolgreich gelöscht", @@ -693,10 +702,31 @@ "connected_channels": "Verbundene Kanäle", "continue": "Weiter", "continue_without_channels": "Ohne Kanäle fortfahren", + "connect_agents": "Agenten verbinden", + "connect_your_ai_agent": "Verbinde deinen KI-Agenten", + "connect_agent_description": "Wähle den Agenten, den du nutzt, damit er Beiträge für dich erstellen und planen kann.", + "agent_access_unavailable": "Agentenzugriff ist für deinen aktuellen Plan oder deine Rolle nicht verfügbar. Du kannst ihn später unter Einstellungen > Entwickler einrichten.", + "sign_in_no_api_key": "Mit Postiz anmelden (kein API-Schlüssel)", + "oauth_sign_in_hint": "Dein Agent öffnet ein Browserfenster, um sich bei Postiz anzumelden.", + "add_to_cursor": "Zum Cursor hinzufügen", + "cli": "CLI", + "other_agents": "Weitere Agenten", + "documentation": "Dokumentation", + "read_the_api_docs": "Lies die API-Dokumentation", + "api_key_onboarding_description": "Sende ihn bei jeder Anfrage als Authorization-Header mit.", + "api_onboarding_description": "Nutze die Postiz API aus deinem eigenen Code, n8n oder einer anderen Automatisierungslösung.", + "chat": "Chat", + "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.", + "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.", "watch_tutorial": "Tutorial ansehen", "watch_tutorial_title": "Lerne, wie du Postiz benutzt", "watch_tutorial_description": "Sieh dir dieses kurze Video an, um das Beste aus Postiz herauszuholen", "back": "Zurück", + "continue_skip": "Weiter / Überspringen", "get_started": "Loslegen", "kick_select_channel": "Kanal auswählen", "annual": "Jährlich", 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 2d9252f525..eafd8f855f 100644 --- a/libraries/react-shared-libraries/src/translation/locales/en/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/en/translation.json @@ -578,6 +578,14 @@ "google": "Google", "apple": "Apple", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Scan the QR code with your phone, or open the link on your phone, then approve Postiz in the Farcaster app.", + "farcaster_open_in_farcaster": "Open in Farcaster", + "farcaster_waiting_for_approval": "Waiting for your approval...", + "farcaster_signer_revoked": "The Farcaster approval was revoked, please try again", + "farcaster_signer_failed": "Failed to start the Farcaster connection", + "farcaster_scan_instructions": "Scan the QR code with your phone, or copy the link and open it on your phone, then approve Postiz in the Farcaster app.", + "farcaster_copy_link": "Copy Farcaster link", + "farcaster_approval_timeout": "Farcaster approval timed out, please try again", "edit_autopost": "Edit Autopost", "add_autopost_title": "Add Autopost", "webhook_deleted_successfully": "Webhook deleted successfully", 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 c8302a9601..341056dc46 100644 --- a/libraries/react-shared-libraries/src/translation/locales/es/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/es/translation.json @@ -575,7 +575,16 @@ "email_address": "Dirección de correo electrónico", "email_already_exists": "El correo electrónico ya existe", "google": "Google", + "apple": "Manzana", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Escanee el código QR con su teléfono o abra el enlace en su teléfono, luego apruebe Postiz en la app de Farcaster.", + "farcaster_open_in_farcaster": "Abrir en Farcaster", + "farcaster_waiting_for_approval": "Esperando su aprobación...", + "farcaster_signer_revoked": "La aprobación de Farcaster fue revocada, intente nuevamente", + "farcaster_signer_failed": "No se pudo iniciar la conexión con Farcaster", + "farcaster_scan_instructions": "Escanea el código QR con tu teléfono, o copia el enlace y ábrelo en tu teléfono, luego aprueba Postiz en la app de Farcaster.", + "farcaster_copy_link": "Copiar enlace de Farcaster", + "farcaster_approval_timeout": "El tiempo de aprobación de Farcaster se agotó, intente nuevamente", "edit_autopost": "Editar autopublicación", "add_autopost_title": "Agregar autopublicación", "webhook_deleted_successfully": "Webhook eliminado correctamente", @@ -693,10 +702,31 @@ "connected_channels": "Canales conectados", "continue": "Continuar", "continue_without_channels": "Continuar sin canales", + "connect_agents": "Conectar agentes", + "connect_your_ai_agent": "Conecta tu agente de IA", + "connect_agent_description": "Elige el agente que usas y deja que cree y programe publicaciones por ti", + "agent_access_unavailable": "El acceso del agente no está disponible para tu plan o rol actual. Puedes configurarlo más tarde en Configuración > Desarrolladores.", + "sign_in_no_api_key": "Inicia sesión con Postiz (sin clave API)", + "oauth_sign_in_hint": "Tu agente abrirá una ventana en el navegador para iniciar sesión en Postiz.", + "add_to_cursor": "Agregar al Cursor", + "cli": "CLI", + "other_agents": "Otros agentes", + "documentation": "Documentación", + "read_the_api_docs": "Lee la documentación del API", + "api_key_onboarding_description": "Envíala como el encabezado de Autorización en cada solicitud", + "api_onboarding_description": "Usa el API de Postiz desde tu propio código, n8n o cualquier otra automatización", + "chat": "Chat", + "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", + "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", "watch_tutorial": "Ver tutorial", "watch_tutorial_title": "Aprende a usar Postiz", "watch_tutorial_description": "Mira este breve video para aprender a sacar el máximo provecho de Postiz", "back": "Atrás", + "continue_skip": "Continuar / Omitir", "get_started": "Comenzar", "kick_select_channel": "Seleccionar canal", "annual": "Anual", 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 ebb0e8d479..5289e94fa5 100644 --- a/libraries/react-shared-libraries/src/translation/locales/fr/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/fr/translation.json @@ -575,7 +575,16 @@ "email_address": "Adresse e-mail", "email_already_exists": "L'adresse e-mail existe déjà", "google": "Google", + "apple": "Pomme", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Scannez le code QR avec votre téléphone, ou ouvrez le lien sur votre téléphone, puis approuvez Postiz dans l’application Farcaster.", + "farcaster_open_in_farcaster": "Ouvrir dans Farcaster", + "farcaster_waiting_for_approval": "En attente de votre approbation...", + "farcaster_signer_revoked": "L’approbation Farcaster a été révoquée, veuillez réessayer", + "farcaster_signer_failed": "Échec de la connexion à Farcaster", + "farcaster_scan_instructions": "Scannez le code QR avec votre téléphone, ou copiez le lien et ouvrez-le sur votre téléphone, puis approuvez Postiz dans l’application Farcaster.", + "farcaster_copy_link": "Copier le lien Farcaster", + "farcaster_approval_timeout": "Le délai d’approbation Farcaster est dépassé, veuillez réessayer", "edit_autopost": "Modifier l'autopost", "add_autopost_title": "Ajouter un autopost", "webhook_deleted_successfully": "Webhook supprimé avec succès", @@ -693,10 +702,31 @@ "connected_channels": "Canaux connectés", "continue": "Continuer", "continue_without_channels": "Continuer sans canaux", + "connect_agents": "Connecter des agents", + "connect_your_ai_agent": "Connectez votre agent IA", + "connect_agent_description": "Choisissez l’agent que vous utilisez et laissez-le créer et programmer des publications pour vous", + "agent_access_unavailable": "L’accès agent n’est pas disponible pour votre plan ou votre rôle actuel. Vous pouvez le configurer plus tard dans Paramètres > Développeurs.", + "sign_in_no_api_key": "Se connecter avec Postiz (pas de clé API)", + "oauth_sign_in_hint": "Votre agent ouvrira une fenêtre de navigateur pour se connecter à Postiz.", + "add_to_cursor": "Ajouter au curseur", + "cli": "CLI", + "other_agents": "Autres agents", + "documentation": "Documentation", + "read_the_api_docs": "Lire la documentation de l’API", + "api_key_onboarding_description": "Envoyez-la en tant qu’en-tête Authorization à chaque requête", + "api_onboarding_description": "Utilisez l’API Postiz depuis votre propre code, n8n ou toute autre automatisation", + "chat": "Chat", + "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", + "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", "watch_tutorial": "Regarder le tutoriel", "watch_tutorial_title": "Apprenez à utiliser Postiz", "watch_tutorial_description": "Regardez cette courte vidéo pour apprendre à tirer le meilleur parti de Postiz", "back": "Retour", + "continue_skip": "Continuer / Passer", "get_started": "Commencer", "kick_select_channel": "Sélectionner le canal", "annual": "Annuel", 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 4b963c59e9..c80453e5e5 100644 --- a/libraries/react-shared-libraries/src/translation/locales/he/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/he/translation.json @@ -575,7 +575,16 @@ "email_address": "כתובת אימייל", "email_already_exists": "האימייל כבר קיים", "google": "גוגל", + "apple": "תפוח", "farcaster": "Farcaster", + "farcaster_approve_instructions": "סרקו את קוד ה-QR עם הטלפון שלכם, או פתחו את הקישור בטלפון ואז אשרו את Postiz באפליקציית Farcaster.", + "farcaster_open_in_farcaster": "פתחו ב-Farcaster", + "farcaster_waiting_for_approval": "מחכים לאישור ממך...", + "farcaster_signer_revoked": "האישור של Farcaster בוטל, נא לנסות שוב", + "farcaster_signer_failed": "החיבור ל-Farcaster נכשל", + "farcaster_scan_instructions": "סרוק את קוד ה-QR עם הטלפון שלך, או העתק את הקישור ופתח אותו בטלפון, ואז אשר את Postiz באפליקציית Farcaster.", + "farcaster_copy_link": "העתק קישור Farcaster", + "farcaster_approval_timeout": "פג תוקף האישור מ-Farcaster, נא לנסות שוב", "edit_autopost": "ערוך פרסום אוטומטי", "add_autopost_title": "הוסף פרסום אוטומטי", "webhook_deleted_successfully": "ה-Webhook נמחק בהצלחה", @@ -693,10 +702,31 @@ "connected_channels": "ערוצים מחוברים", "continue": "המשך", "continue_without_channels": "המשך ללא ערוצים", + "connect_agents": "חברו סוכנים", + "connect_your_ai_agent": "חברו את סוכן ה-AI שלכם", + "connect_agent_description": "בחרו את הסוכן שאתם משתמשים בו ותנו לו ליצור ולתזמן פוסטים עבורכם", + "agent_access_unavailable": "הגישה לסוכן אינה זמינה בתוכנית או בתפקיד הנוכחיים שלכם. ניתן להגדיר זאת מאוחר יותר בהגדרות > מפתחים.", + "sign_in_no_api_key": "התחברו ל-Postiz (ללא מפתח API)", + "oauth_sign_in_hint": "הסוכן שלכם יפתח חלון דפדפן כדי להיכנס ל-Postiz.", + "add_to_cursor": "הוסיפו ל-Cursor", + "cli": "CLI", + "other_agents": "סוכנים נוספים", + "documentation": "תיעוד", + "read_the_api_docs": "קראו את מסמכי ה-API", + "api_key_onboarding_description": "שלחו אותו בכותרת Authorization בכל בקשה", + "api_onboarding_description": "השתמשו ב-API של Postiz מהקוד שלכם, n8n או כל אוטומציה אחרת", + "chat": "צ'אט", + "chat_onboarding_description": "אין צורך ב-MCP או הגדרות CLI. העתיקו את זה לצ'אט, הסוכן יתקין את Postiz CLI וישאל אתכם את מפתח ה-API שלכם.", + "connector": "מחבר", + "connector_onboarding_description": "הדרך המהירה ביותר: הוסיפו את Postiz בלחיצה אחת, תתבקשו להתחבר", + "mcp_onboarding_description": "העניקו לסוכן שלכם כלים של Postiz ליצירת, תזמון וניהול פוסטים", + "cli_onboarding_description": "התקינו את Postiz CLI ואת המיומנות שמלמדת את הסוכן איך להשתמש בו", + "agent_settings_later": "סוכנים נוספים והוראות מלאות זמינים תחת הגדרות > מפתחים", "watch_tutorial": "צפה במדריך", "watch_tutorial_title": "למד כיצד להשתמש ב-Postiz", "watch_tutorial_description": "צפה בסרטון הקצר הזה ולמד כיצד להפיק את המרב מ-Postiz", "back": "חזרה", + "continue_skip": "המשך / דלג", "get_started": "התחלה", "kick_select_channel": "בחר ערוץ", "annual": "שנתי", 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 2e4cd0717c..8c12fd08df 100644 --- a/libraries/react-shared-libraries/src/translation/locales/it/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/it/translation.json @@ -575,7 +575,16 @@ "email_address": "Indirizzo email", "email_already_exists": "L'email esiste già", "google": "Google", + "apple": "Mela", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Scansiona il codice QR con il tuo telefono, oppure apri il link sul tuo telefono e poi approva Postiz nell'app Farcaster.", + "farcaster_open_in_farcaster": "Apri in Farcaster", + "farcaster_waiting_for_approval": "In attesa della tua approvazione...", + "farcaster_signer_revoked": "L'approvazione di Farcaster è stata revocata, riprova", + "farcaster_signer_failed": "Impossibile avviare la connessione con Farcaster", + "farcaster_scan_instructions": "Scansiona il codice QR con il tuo telefono, oppure copia il link e aprilo sul tuo telefono, quindi approva Postiz nell'app Farcaster.", + "farcaster_copy_link": "Copia il link di Farcaster", + "farcaster_approval_timeout": "L'approvazione di Farcaster è scaduta, riprova", "edit_autopost": "Modifica autopost", "add_autopost_title": "Aggiungi autopost", "webhook_deleted_successfully": "Webhook eliminato con successo", @@ -693,10 +702,31 @@ "connected_channels": "Canali collegati", "continue": "Continua", "continue_without_channels": "Continua senza canali", + "connect_agents": "Collega Agenti", + "connect_your_ai_agent": "Collega il tuo agente AI", + "connect_agent_description": "Scegli l'agente che usi e lascia che crei e programmi post per te", + "agent_access_unavailable": "L'accesso agli agenti non è disponibile per il tuo attuale piano o ruolo. Puoi configurarlo più tardi in Impostazioni > Sviluppatori.", + "sign_in_no_api_key": "Accedi con Postiz (nessuna API key)", + "oauth_sign_in_hint": "Il tuo agente aprirà una finestra del browser per accedere a Postiz.", + "add_to_cursor": "Aggiungi al Cursor", + "cli": "CLI", + "other_agents": "Altri agenti", + "documentation": "Documentazione", + "read_the_api_docs": "Leggi la documentazione API", + "api_key_onboarding_description": "Invialo come header Authorization in ogni richiesta", + "api_onboarding_description": "Usa le API di Postiz dal tuo codice, n8n o qualsiasi altra automazione", + "chat": "Chat", + "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", + "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", "watch_tutorial": "Guarda il tutorial", "watch_tutorial_title": "Scopri come usare Postiz", "watch_tutorial_description": "Guarda questo breve video per imparare a sfruttare al meglio Postiz", "back": "Indietro", + "continue_skip": "Continua / Salta", "get_started": "Inizia", "kick_select_channel": "Seleziona canale", "annual": "Annuale", 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 155a3d1a64..0ce5b6b737 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ja/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ja/translation.json @@ -575,7 +575,16 @@ "email_address": "メールアドレス", "email_already_exists": "メールアドレスは既に存在します", "google": "Google", + "apple": "アップル", "farcaster": "Farcaster", + "farcaster_approve_instructions": "スマートフォンでQRコードをスキャンするか、リンクをスマートフォンで開き、FarcasterアプリでPostizを承認してください。", + "farcaster_open_in_farcaster": "Farcasterで開く", + "farcaster_waiting_for_approval": "承認をお待ちしています...", + "farcaster_signer_revoked": "Farcasterの承認が取り消されました。もう一度お試しください。", + "farcaster_signer_failed": "Farcaster接続の開始に失敗しました", + "farcaster_scan_instructions": "QRコードをスマートフォンでスキャンするか、リンクをコピーしてスマートフォンで開き、FarcasterアプリでPostizを承認してください。", + "farcaster_copy_link": "Farcasterのリンクをコピー", + "farcaster_approval_timeout": "Farcasterの承認がタイムアウトしました。もう一度お試しください。", "edit_autopost": "自動投稿を編集", "add_autopost_title": "自動投稿を追加", "webhook_deleted_successfully": "Webhookが正常に削除されました", @@ -693,10 +702,31 @@ "connected_channels": "接続済みチャンネル", "continue": "続行", "continue_without_channels": "チャンネルなしで続行", + "connect_agents": "エージェントを接続", + "connect_your_ai_agent": "AIエージェントを接続", + "connect_agent_description": "利用するエージェントを選んで、投稿の作成・スケジュール管理を任せましょう", + "agent_access_unavailable": "現在のプランまたはロールではエージェントアクセスをご利用いただけません。設定 > 開発者 で後から設定することもできます。", + "sign_in_no_api_key": "Postizでサインイン(APIキー不要)", + "oauth_sign_in_hint": "エージェントがPostizにサインインするためのブラウザウィンドウを開きます。", + "add_to_cursor": "カーソルに追加", + "cli": "CLI", + "other_agents": "その他のエージェント", + "documentation": "ドキュメント", + "read_the_api_docs": "APIドキュメントを読む", + "api_key_onboarding_description": "すべてのリクエストで Authorization ヘッダーとして送信してください。", + "api_onboarding_description": "Postiz APIを自分のコードやn8n、その他の自動化から利用できます。", + "chat": "チャット", + "chat_onboarding_description": "MCPやCLIの設定は不要です。これをチャットに貼り付けるだけで、エージェントがPostiz CLIをインストールし、APIキーを尋ねます。", + "connector": "コネクタ", + "connector_onboarding_description": "最速の方法: ワンクリックでPostizを追加、サインインが求められます。", + "mcp_onboarding_description": "エージェントにPostizのツールを使わせて、投稿の作成やスケジュール管理をさせましょう。", + "cli_onboarding_description": "Postiz CLIと、それを使い方をエージェントに教えるスキルをインストールします。", + "agent_settings_later": "その他のエージェントや詳細な手順は、設定 > 開発者 から利用できます。", "watch_tutorial": "チュートリアルを見る", "watch_tutorial_title": "Postizの使い方を学ぶ", "watch_tutorial_description": "この短い動画を見て、Postizを最大限に活用する方法を学びましょう", "back": "戻る", + "continue_skip": "続行 / スキップ", "get_started": "開始", "kick_select_channel": "チャンネルを選択", "annual": "年額", 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 f2234dcefe..9dc6d1049d 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ko/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ko/translation.json @@ -575,7 +575,16 @@ "email_address": "이메일 주소", "email_already_exists": "이미 존재하는 이메일입니다", "google": "구글", + "apple": "애플", "farcaster": "파캐스터", + "farcaster_approve_instructions": "휴대폰으로 QR 코드를 스캔하거나, 링크를 휴대폰에서 열어 Farcaster 앱에서 Postiz 승인을 진행하세요.", + "farcaster_open_in_farcaster": "Farcaster에서 열기", + "farcaster_waiting_for_approval": "승인을 기다리는 중...", + "farcaster_signer_revoked": "Farcaster 승인이 취소되었습니다. 다시 시도해 주세요.", + "farcaster_signer_failed": "Farcaster 연결을 시작하지 못했습니다.", + "farcaster_scan_instructions": "휴대폰으로 QR 코드를 스캔하거나 링크를 복사해서 휴대폰에서 연 다음, Farcaster 앱에서 Postiz를 승인하세요.", + "farcaster_copy_link": "Farcaster 링크 복사", + "farcaster_approval_timeout": "Farcaster 승인 시간이 초과되었습니다. 다시 시도해 주세요.", "edit_autopost": "자동 게시 수정", "add_autopost_title": "자동 게시 추가", "webhook_deleted_successfully": "웹훅이 성공적으로 삭제되었습니다", @@ -693,10 +702,31 @@ "connected_channels": "연결된 채널", "continue": "계속하기", "continue_without_channels": "채널 없이 계속하기", + "connect_agents": "에이전트 연결", + "connect_your_ai_agent": "AI 에이전트 연결", + "connect_agent_description": "사용할 에이전트를 선택하면, 게시물을 생성하고 예약할 수 있습니다.", + "agent_access_unavailable": "현재 요금제 또는 역할에서는 에이전트 접근이 불가능합니다. 설정 > 개발자에서 나중에 설정할 수 있습니다.", + "sign_in_no_api_key": "Postiz로 로그인 (API 키 불필요)", + "oauth_sign_in_hint": "에이전트가 Postiz 로그인을 위해 브라우저 창을 엽니다.", + "add_to_cursor": "Cursor에 추가", + "cli": "CLI", + "other_agents": "기타 에이전트", + "documentation": "문서", + "read_the_api_docs": "API 문서 읽기", + "api_key_onboarding_description": "모든 요청에 Authorization 헤더로 전송하세요.", + "api_onboarding_description": "Postiz API를 직접 코드, n8n, 또는 다른 자동화 도구에서 사용하세요.", + "chat": "채팅", + "chat_onboarding_description": "MCP나 CLI 설정이 필요 없습니다. 채팅에 이 내용을 붙여넣으면 에이전트가 Postiz CLI를 설치하고 API 키를 입력받습니다.", + "connector": "커넥터", + "connector_onboarding_description": "가장 빠른 방법: 한 번의 클릭으로 Postiz를 추가하고, 로그인 요청을 받게 됩니다.", + "mcp_onboarding_description": "에이전트에게 Postiz 도구를 제공해 게시물을 생성, 예약, 관리할 수 있습니다.", + "cli_onboarding_description": "Postiz CLI와 에이전트에게 사용법을 알려주는 스킬을 설치하세요.", + "agent_settings_later": "더 많은 에이전트와 전체 안내는 설정 > 개발자에서 볼 수 있습니다.", "watch_tutorial": "튜토리얼 보기", "watch_tutorial_title": "Postiz 사용법 배우기", "watch_tutorial_description": "이 짧은 영상을 통해 Postiz를 최대한 활용하는 방법을 알아보세요", "back": "뒤로가기", + "continue_skip": "계속 / 건너뛰기", "get_started": "시작하기", "kick_select_channel": "채널 선택", "annual": "연간", 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 0c6e50fbef..08b003921b 100644 --- a/libraries/react-shared-libraries/src/translation/locales/pt/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/pt/translation.json @@ -575,7 +575,16 @@ "email_address": "Endereço de e-mail", "email_already_exists": "O e-mail já existe", "google": "Google", + "apple": "Maçã", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Escaneie o código QR com seu celular, ou abra o link no seu celular, depois aprove o Postiz no app Farcaster.", + "farcaster_open_in_farcaster": "Abrir no Farcaster", + "farcaster_waiting_for_approval": "Aguardando sua aprovação...", + "farcaster_signer_revoked": "A aprovação do Farcaster foi revogada, por favor, tente novamente", + "farcaster_signer_failed": "Falha ao iniciar a conexão com o Farcaster", + "farcaster_scan_instructions": "Escaneie o código QR com seu celular ou copie o link e abra-o no seu celular, depois aprove o Postiz no aplicativo Farcaster.", + "farcaster_copy_link": "Copiar link do Farcaster", + "farcaster_approval_timeout": "A aprovação do Farcaster expirou, por favor, tente novamente", "edit_autopost": "Editar autopost", "add_autopost_title": "Adicionar autopost", "webhook_deleted_successfully": "Webhook excluído com sucesso", @@ -693,10 +702,31 @@ "connected_channels": "Canais conectados", "continue": "Continuar", "continue_without_channels": "Continuar sem canais", + "connect_agents": "Conectar Agentes", + "connect_your_ai_agent": "Conecte Seu Agente de IA", + "connect_agent_description": "Escolha o agente que você usa e deixe-o criar e agendar posts para você", + "agent_access_unavailable": "O acesso ao agente não está disponível para seu plano ou função atual. Você pode configurá-lo mais tarde em Configurações > Desenvolvedores.", + "sign_in_no_api_key": "Entrar com o Postiz (sem chave de API)", + "oauth_sign_in_hint": "Seu agente abrirá uma janela do navegador para fazer login no Postiz.", + "add_to_cursor": "Adicionar ao Cursor", + "cli": "CLI", + "other_agents": "Outros agentes", + "documentation": "Documentação", + "read_the_api_docs": "Leia a documentação da API", + "api_key_onboarding_description": "Envie como o cabeçalho Authorization em todas as requisições", + "api_onboarding_description": "Use a API do Postiz a partir do seu próprio código, n8n ou qualquer outra automação", + "chat": "Chat", + "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", + "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", "watch_tutorial": "Assistir ao tutorial", "watch_tutorial_title": "Aprenda a usar o Postiz", "watch_tutorial_description": "Assista a este vídeo curto para aprender a tirar o máximo proveito do Postiz", "back": "Voltar", + "continue_skip": "Continuar / Pular", "get_started": "Começar", "kick_select_channel": "Selecionar canal", "annual": "Anual", 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 7a89b62dc5..532f03dee1 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ru/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ru/translation.json @@ -575,7 +575,16 @@ "email_address": "Адрес электронной почты", "email_already_exists": "Электронная почта уже существует", "google": "Google", + "apple": "Яблоко", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Отсканируйте QR-код с помощью телефона или откройте ссылку на своём телефоне, затем одобрите Postiz в приложении Farcaster.", + "farcaster_open_in_farcaster": "Открыть в Farcaster", + "farcaster_waiting_for_approval": "Ожидание вашего одобрения...", + "farcaster_signer_revoked": "Одобрение Farcaster было отозвано, попробуйте ещё раз", + "farcaster_signer_failed": "Не удалось запустить соединение с Farcaster", + "farcaster_scan_instructions": "Просканируйте QR-код с помощью телефона или скопируйте ссылку и откройте её на телефоне, затем подтвердите Postiz в приложении Farcaster.", + "farcaster_copy_link": "Скопировать ссылку Farcaster", + "farcaster_approval_timeout": "Время ожидания одобрения Farcaster истекло, попробуйте ещё раз", "edit_autopost": "Редактировать автопост", "add_autopost_title": "Добавить автопост", "webhook_deleted_successfully": "Вебхук успешно удалён", @@ -693,10 +702,31 @@ "connected_channels": "Подключенные каналы", "continue": "Продолжить", "continue_without_channels": "Продолжить без каналов", + "connect_agents": "Подключить агентов", + "connect_your_ai_agent": "Подключите вашего ИИ-агента", + "connect_agent_description": "Выберите используемого агента, чтобы он мог создавать и планировать публикации за вас", + "agent_access_unavailable": "Доступ к агенту недоступен для вашего текущего тарифа или роли. Позже вы сможете настроить это в Настройки > Разработчики.", + "sign_in_no_api_key": "Войти через Postiz (без API-ключа)", + "oauth_sign_in_hint": "Ваш агент откроет окно браузера для входа в Postiz.", + "add_to_cursor": "Добавить в Cursor", + "cli": "CLI", + "other_agents": "Другие агенты", + "documentation": "Документация", + "read_the_api_docs": "Прочитайте документацию по API", + "api_key_onboarding_description": "Передавайте его в заголовке Authorization при каждом запросе", + "api_onboarding_description": "Используйте API Postiz в своём коде, n8n или другой автоматизации", + "chat": "Чат", + "chat_onboarding_description": "Не нужны MCP или настройки CLI. Вставьте это в чат, агент установит Postiz CLI и спросит у вас API-ключ.", + "connector": "Коннектор", + "connector_onboarding_description": "Самый быстрый способ: добавьте Postiz одним кликом, вам предложат войти в систему", + "mcp_onboarding_description": "Дайте вашему агенту инструменты Postiz для создания, планирования и управления публикациями", + "cli_onboarding_description": "Установите Postiz CLI и навык, который научит вашего агента им пользоваться", + "agent_settings_later": "Больше агентов и полные инструкции доступны в разделе Настройки > Разработчики", "watch_tutorial": "Смотреть обучение", "watch_tutorial_title": "Узнайте, как пользоваться Postiz", "watch_tutorial_description": "Посмотрите это короткое видео, чтобы узнать, как получить максимум от Postiz", "back": "Назад", + "continue_skip": "Продолжить / Пропустить", "get_started": "Начать", "kick_select_channel": "Выберите канал", "annual": "Годовой", 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 1435f18913..32b5af7077 100644 --- a/libraries/react-shared-libraries/src/translation/locales/tr/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/tr/translation.json @@ -575,7 +575,16 @@ "email_address": "E-posta Adresi", "email_already_exists": "E-posta zaten mevcut", "google": "Google", + "apple": "Elma", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Telefonunuzla QR kodunu tarayın veya bağlantıyı telefonunuzda açın, ardından Postiz'i Farcaster uygulamasında onaylayın.", + "farcaster_open_in_farcaster": "Farcaster'da Aç", + "farcaster_waiting_for_approval": "Onayınızı bekliyoruz...", + "farcaster_signer_revoked": "Farcaster onayı iptal edildi, lütfen tekrar deneyin", + "farcaster_signer_failed": "Farcaster bağlantısı başlatılamadı", + "farcaster_scan_instructions": "QR kodunu telefonunla tara ya da bağlantıyı kopyalayıp telefonunda aç, ardından Farcaster uygulamasında Postiz'i onayla.", + "farcaster_copy_link": "Farcaster bağlantısını kopyala", + "farcaster_approval_timeout": "Farcaster onayı zaman aşımına uğradı, lütfen tekrar deneyin", "edit_autopost": "Otomatik Gönderiyi Düzenle", "add_autopost_title": "Otomatik Gönderi Ekle", "webhook_deleted_successfully": "Webhook başarıyla silindi", @@ -693,10 +702,31 @@ "connected_channels": "Bağlı Kanallar", "continue": "Devam Et", "continue_without_channels": "Kanallar olmadan devam et", + "connect_agents": "Ajanları Bağla", + "connect_your_ai_agent": "Yapay Zeka Ajanınızı Bağlayın", + "connect_agent_description": "Kullandığınız ajanı seçin ve gönderi oluşturup zamanlamasına izin verin", + "agent_access_unavailable": "Ajan erişimi mevcut planınızda veya rolünüzde mevcut değil. Daha sonra Ayarlar > Geliştiriciler bölümünden kurabilirsiniz.", + "sign_in_no_api_key": "Postiz ile oturum aç (API anahtarı yok)", + "oauth_sign_in_hint": "Ajanınız, Postiz'e giriş yapmanız için bir tarayıcı penceresi açacak.", + "add_to_cursor": "Imlece Ekle", + "cli": "CLI", + "other_agents": "Diğer ajanlar", + "documentation": "Dokümantasyon", + "read_the_api_docs": "API dokümantasyonunu okuyun", + "api_key_onboarding_description": "Her istekte Authorization başlığı olarak gönderin", + "api_onboarding_description": "Postiz API'sini kendi kodunuzdan, n8n veya başka bir otomasyondan kullanın", + "chat": "Sohbet", + "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", + "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", "watch_tutorial": "Eğitimi İzle", "watch_tutorial_title": "Postiz'i Nasıl Kullanacağınızı Öğrenin", "watch_tutorial_description": "Postiz'den en iyi şekilde yararlanmayı öğrenmek için bu kısa videoyu izleyin", "back": "Geri", + "continue_skip": "Devam Et / Atla", "get_started": "Başlayın", "kick_select_channel": "Kanal Seç", "annual": "Yıllık", 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 42a159b6b7..4aac09315c 100644 --- a/libraries/react-shared-libraries/src/translation/locales/vi/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/vi/translation.json @@ -575,7 +575,16 @@ "email_address": "Địa chỉ email", "email_already_exists": "Email đã tồn tại", "google": "Google", + "apple": "Apple", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Quét mã QR bằng điện thoại của bạn hoặc mở liên kết trên điện thoại, sau đó phê duyệt Postiz trong ứng dụng Farcaster.", + "farcaster_open_in_farcaster": "Mở trong Farcaster", + "farcaster_waiting_for_approval": "Đang chờ bạn phê duyệt...", + "farcaster_signer_revoked": "Phê duyệt Farcaster đã bị thu hồi, vui lòng thử lại", + "farcaster_signer_failed": "Không thể bắt đầu kết nối với Farcaster", + "farcaster_scan_instructions": "Quét mã QR bằng điện thoại của bạn, hoặc sao chép liên kết và mở nó trên điện thoại, sau đó phê duyệt Postiz trong ứng dụng Farcaster.", + "farcaster_copy_link": "Sao chép liên kết Farcaster", + "farcaster_approval_timeout": "Phê duyệt Farcaster đã hết thời gian, vui lòng thử lại", "edit_autopost": "Chỉnh sửa tự động đăng", "add_autopost_title": "Thêm tự động đăng", "webhook_deleted_successfully": "Đã xóa webhook thành công", @@ -693,10 +702,31 @@ "connected_channels": "Các kênh đã kết nối", "continue": "Tiếp tục", "continue_without_channels": "Tiếp tục mà không có kênh", + "connect_agents": "Kết nối Agent", + "connect_your_ai_agent": "Kết nối Agent AI của bạn", + "connect_agent_description": "Chọn Agent bạn sử dụng và để nó tạo, lên lịch bài đăng cho bạn", + "agent_access_unavailable": "Truy cập Agent không khả dụng với gói hoặc vai trò hiện tại của bạn. Bạn có thể thiết lập sau tại Cài đặt > Nhà phát triển.", + "sign_in_no_api_key": "Đăng nhập với Postiz (không cần API key)", + "oauth_sign_in_hint": "Agent của bạn sẽ mở một cửa sổ trình duyệt để đăng nhập vào Postiz.", + "add_to_cursor": "Thêm vào Cursor", + "cli": "CLI", + "other_agents": "Các Agent khác", + "documentation": "Tài liệu", + "read_the_api_docs": "Đọc tài liệu API", + "api_key_onboarding_description": "Gửi nó như header Authorization cho mọi yêu cầu", + "api_onboarding_description": "Sử dụng API Postiz từ mã của bạn, n8n hoặc bất kỳ giải pháp tự động hóa nào khác", + "chat": "Chat", + "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", + "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", "watch_tutorial": "Xem hướng dẫn", "watch_tutorial_title": "Tìm hiểu cách sử dụng Postiz", "watch_tutorial_description": "Xem video ngắn này để biết cách tận dụng tối đa Postiz", "back": "Quay lại", + "continue_skip": "Tiếp tục / Bỏ qua", "get_started": "Bắt đầu", "kick_select_channel": "Chọn kênh", "annual": "Hàng năm", 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 330f1c3353..e3c218598e 100644 --- a/libraries/react-shared-libraries/src/translation/locales/zh/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/zh/translation.json @@ -575,7 +575,16 @@ "email_address": "电子邮件地址", "email_already_exists": "电子邮件已存在", "google": "Google", + "apple": "苹果", "farcaster": "Farcaster", + "farcaster_approve_instructions": "请用手机扫描二维码,或在手机上打开链接,然后在 Farcaster 应用内批准 Postiz。", + "farcaster_open_in_farcaster": "在 Farcaster 中打开", + "farcaster_waiting_for_approval": "正在等待您的批准...", + "farcaster_signer_revoked": "Farcaster 的批准已被撤销,请重试", + "farcaster_signer_failed": "无法启动 Farcaster 连接", + "farcaster_scan_instructions": "请使用手机扫描二维码,或复制链接并在手机上打开,然后在 Farcaster 应用中批准 Postiz。", + "farcaster_copy_link": "复制 Farcaster 链接", + "farcaster_approval_timeout": "Farcaster 批准超时,请重试", "edit_autopost": "编辑自动发布", "add_autopost_title": "添加自动发布", "webhook_deleted_successfully": "Webhook 删除成功", @@ -693,10 +702,31 @@ "connected_channels": "已连接频道", "continue": "继续", "continue_without_channels": "继续但不添加频道", + "connect_agents": "连接代理", + "connect_your_ai_agent": "连接您的 AI 代理", + "connect_agent_description": "选择您使用的代理,让它为您创建和安排帖子", + "agent_access_unavailable": "您的当前套餐或角色无法使用代理访问。您可以稍后在 设置 > 开发者 中进行设置。", + "sign_in_no_api_key": "使用 Postiz 登录(无需 API 密钥)", + "oauth_sign_in_hint": "您的代理将会打开一个浏览器窗口用于登录 Postiz。", + "add_to_cursor": "添加到光标", + "cli": "CLI 命令行工具", + "other_agents": "其他代理", + "documentation": "文档", + "read_the_api_docs": "阅读 API 文档", + "api_key_onboarding_description": "在每次请求中,将其作为 Authorization header 发送", + "api_onboarding_description": "从您自己的代码、n8n 或任何其他自动化工具中使用 Postiz API", + "chat": "聊天", + "chat_onboarding_description": "无需 MCP 或 CLI 设置。将此粘贴到聊天中,代理会安装 Postiz CLI 并向您索取 API 密钥。", + "connector": "连接器", + "connector_onboarding_description": "最快捷的方法:一键添加 Postiz,系统会要求您登录", + "mcp_onboarding_description": "为您的代理提供 Postiz 工具,以创建、安排和管理帖子", + "cli_onboarding_description": "安装 Postiz CLI 以及教您的代理如何使用的技能", + "agent_settings_later": "更多代理和完整说明可在 设置 > 开发者 下查看", "watch_tutorial": "观看教程", "watch_tutorial_title": "学习如何使用Postiz", "watch_tutorial_description": "观看这个简短的视频,学习如何最大程度地利用Postiz", "back": "返回", + "continue_skip": "继续 / 跳过", "get_started": "开始使用", "kick_select_channel": "选择频道", "annual": "年度", diff --git a/package.json b/package.json index 7743c39366..169e3e5e6c 100644 --- a/package.json +++ b/package.json @@ -34,26 +34,24 @@ "start:prod:web": "pnpm --filter ./apps/web run start", "dev:docker": "docker compose -f ./docker-compose.dev.yaml up -d", "validate:beta-deploy": "node scripts/validate-beta-compose.mjs", - "typecheck:sso": "pnpm --filter @crove/sso run typecheck", "commands:build:development": "pnpm --filter ./apps/commands run build", "prisma-generate": "pnpm exec prisma generate --schema ./libraries/nestjs-libraries/src/database/prisma/schema.prisma", "prisma-db-push": "pnpm exec prisma db push --accept-data-loss --schema ./libraries/nestjs-libraries/src/database/prisma/schema.prisma", "prisma-db-pull": "pnpm exec prisma db pull --schema ./libraries/nestjs-libraries/src/database/prisma/schema.prisma", "postinstall": "pnpm run prisma-generate", - "test": "jest --coverage --detectOpenHandles --reporters=default --reporters=jest-junit", - "test:sso": "pnpm --filter @crove/sso test" + "test": "jest --coverage --detectOpenHandles --reporters=default --reporters=jest-junit" }, "dependencies": { - "@ag-ui/mastra": "^1.0.1", + "@ag-ui/mastra": "^1.1.4", "@ai-sdk/openai": "^2.0.52", "@atproto/api": "^0.15.15", "@aws-sdk/client-s3": "^3.787.0", "@aws-sdk/s3-request-presigner": "^3.787.0", "@casl/ability": "^6.5.0", - "@copilotkit/react-core": "1.10.6", - "@copilotkit/react-textarea": "1.10.6", - "@copilotkit/react-ui": "1.10.6", - "@copilotkit/runtime": "1.10.6", + "@copilotkit/react-core": "1.72.0", + "@copilotkit/react-textarea": "1.72.0", + "@copilotkit/react-ui": "1.72.0", + "@copilotkit/runtime": "1.72.0", "@dub/analytics": "^0.0.32", "@hookform/resolvers": "^3.3.4", "@langchain/community": "^1.1.27", @@ -65,10 +63,10 @@ "@mantine/dates": "^5.10.5", "@mantine/hooks": "^5.10.5", "@mantine/modals": "^5.10.5", - "@mastra/core": "^1.21.0", - "@mastra/mcp": "^1.4.1", - "@mastra/memory": "^1.13.0", - "@mastra/pg": "^1.8.5", + "@mastra/core": "^1.67.0", + "@mastra/mcp": "^1.18.0", + "@mastra/memory": "^1.30.0", + "@mastra/pg": "^1.25.0", "@meronex/icons": "^4.0.0", "@modelcontextprotocol/sdk": "^1.22.0", "@nest-lab/throttler-storage-redis": "^1.2.0", @@ -185,7 +183,7 @@ "jsonwebtoken": "^9.0.2", "lodash": "^4.17.21", "lucide-react": "^1.31.0", - "mastra": "^1.3.19", + "mastra": "^1.30.0", "md5": "^2.3.0", "mime": "^3.0.0", "mime-types": "^2.1.35", @@ -257,7 +255,10 @@ "yargs": "^17.7.2", "yup": "^1.4.0", "zod": "^3.25.76", - "zustand": "^5.0.5" + "zustand": "^5.0.5", + "@aws-sdk/lib-storage": "^3.1003.0", + "@copilotkit/runtime-client-gql": "1.72.0", + "qrcode": "^1.5.4" }, "devDependencies": { "@crxjs/vite-plugin": "^2.7.1", @@ -315,7 +316,9 @@ "typescript": "5.5.4", "vite": "^8.2.1", "vite-tsconfig-paths": "^5.1.4", - "vitest": "3.1.4" + "vitest": "3.1.4", + "@types/express": "^5.0.6", + "@types/qrcode": "^1.5.5" }, "volta": { "node": "20.17.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1bf278495f..8ccb5cd8ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,8 +18,8 @@ importers: .: dependencies: '@ag-ui/mastra': - specifier: ^1.0.1 - version: 1.0.1(@ag-ui/client@0.0.47)(@ag-ui/core@0.0.47)(@copilotkit/runtime@1.10.6(c5ef6e30f9cb72b0a9db20b1502179b1))(@mastra/client-js@0.15.2(openapi-types@12.1.3)(react@19.2.4)(zod@3.25.76))(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + 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)) '@ai-sdk/openai': specifier: ^2.0.52 version: 2.0.98(zod@3.25.76) @@ -29,6 +29,9 @@ importers: '@aws-sdk/client-s3': specifier: ^3.787.0 version: 3.1003.0 + '@aws-sdk/lib-storage': + specifier: ^3.1003.0 + version: 3.1003.0(@aws-sdk/client-s3@3.1003.0) '@aws-sdk/s3-request-presigner': specifier: ^3.787.0 version: 3.1003.0 @@ -36,17 +39,20 @@ importers: specifier: ^6.5.0 version: 6.8.0 '@copilotkit/react-core': - specifier: 1.10.6 - version: 1.10.6(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 1.72.0 + version: 1.72.0(@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/react-textarea': - specifier: 1.10.6 - version: 1.10.6(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 1.72.0 + 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/react-ui': - specifier: 1.10.6 - version: 1.10.6(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 1.72.0 + 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.10.6 - version: 1.10.6(c5ef6e30f9cb72b0a9db20b1502179b1) + specifier: 1.72.0 + version: 1.72.0(060090e105863d9983aa04d300df3d3a) + '@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) '@dub/analytics': specifier: ^0.0.32 version: 0.0.32 @@ -55,13 +61,13 @@ 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(877e75223018bd2be751ee722fb15fb5) + version: 1.1.27(66046857593e81cf94589e5d63e1e984) '@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)) '@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.1(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.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/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)) @@ -81,17 +87,17 @@ importers: specifier: ^5.10.5 version: 5.10.5(@mantine/core@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))(@mantine/hooks@5.10.5(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@mastra/core': - specifier: ^1.21.0 - version: 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76) + specifier: ^1.67.0 + version: 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) '@mastra/mcp': - specifier: ^1.4.1 - version: 1.4.1(@cfworker/json-schema@4.1.1)(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@types/json-schema@7.0.15)(zod@3.25.76) + specifier: ^1.18.0 + version: 1.18.0(@cfworker/json-schema@4.1.1)(@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))(express@5.2.1)(hono@4.12.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) '@mastra/memory': - specifier: ^1.13.0 - version: 1.13.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + specifier: ^1.30.0 + version: 1.30.0(@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)) '@mastra/pg': - specifier: ^1.8.5 - version: 1.8.5(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + specifier: ^1.25.0 + version: 1.25.0(@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)) '@meronex/icons': specifier: ^4.0.0 version: 4.0.0(react@19.2.4) @@ -103,7 +109,7 @@ importers: version: 1.2.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)(@nestjs/throttler@6.5.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)(reflect-metadata@0.2.2))(ioredis@5.10.0)(reflect-metadata@0.2.2) '@nestjs/cli': specifier: ^11.0.21 - version: 11.0.21(@swc/cli@0.3.14(@swc/core@1.5.7(@swc/helpers@0.5.13))(chokidar@4.0.3))(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(esbuild@0.27.7)(prettier@2.8.8) + version: 11.0.21(@swc/cli@0.3.14(@swc/core@1.5.7(@swc/helpers@0.5.13))(chokidar@4.0.3))(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(esbuild@0.28.2)(prettier@2.8.8) '@nestjs/common': specifier: ^11.1.21 version: 11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -130,13 +136,13 @@ importers: version: 3.137.0(@nestjs/microservices@11.1.21)(@nestjs/platform-express@11.1.21)(bufferutil@4.1.0)(class-transformer@0.5.1)(class-validator@0.14.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@neynar/react': specifier: ^1.2.22 - version: 1.2.22(@farcaster/miniapp-sdk@0.2.3(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(swr@2.4.1(react@19.2.4))(typescript@5.5.4) + version: 1.2.22(@farcaster/miniapp-sdk@0.3.0(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(swr@2.4.1(react@19.2.4))(typescript@5.5.4) '@pigment-css/react': specifier: ^0.0.30 version: 0.0.30(@types/react@19.1.8)(react@19.2.4)(typescript@5.5.4) '@postiz/wallets': specifier: ^0.0.1 - version: 0.0.1(@babel/runtime@7.28.6)(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bs58@6.0.0)(bufferutil@4.1.0)(ioredis@5.10.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 0.0.1(@babel/runtime@7.28.6)(@react-native-async-storage/async-storage@1.24.0(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)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bs58@6.0.0)(bufferutil@4.1.0)(ioredis@5.10.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@prisma/client': specifier: 6.5.0 version: 6.5.0(prisma@6.5.0(typescript@5.5.4))(typescript@5.5.4) @@ -145,7 +151,7 @@ importers: 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) '@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@7.29.0)(@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.27.7)) + 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)) '@sentry/profiling-node': specifier: ^10.25.0 version: 10.45.0 @@ -154,10 +160,10 @@ importers: version: 10.45.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@7.29.0)(@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) + 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) '@solana/wallet-adapter-react-ui': specifier: ^0.9.35 - version: 0.9.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-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@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) + version: 0.9.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-dom@19.2.4(react@19.2.4))(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) '@stripe/react-stripe-js': specifier: ^5.4.1 version: 5.6.1(@stripe/stripe-js@8.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -184,7 +190,7 @@ importers: version: 1.15.0 '@temporalio/worker': specifier: ^1.14.0 - version: 1.15.0(@swc/helpers@0.5.13)(esbuild@0.27.7)(tslib@2.8.1) + version: 1.15.0(@swc/helpers@0.5.13)(esbuild@0.28.2)(tslib@2.8.1) '@temporalio/workflow': specifier: ^1.14.0 version: 1.15.0 @@ -439,10 +445,10 @@ importers: version: 4.17.23 lucide-react: specifier: ^1.31.0 - version: 1.31.0(react@19.2.4) + version: 1.47.0(react@19.2.4) mastra: - specifier: ^1.3.19 - version: 1.3.19(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.5.4)(zod@3.25.76) + 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) md5: specifier: ^2.3.0 version: 2.3.0 @@ -466,13 +472,13 @@ importers: version: 3.0.1(@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-temporal-core: specifier: ^3.2.0 - version: 3.2.3(@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)(@temporalio/client@1.15.0)(@temporalio/common@1.15.0)(@temporalio/worker@1.15.0(@swc/helpers@0.5.13)(esbuild@0.27.7)(tslib@2.8.1))(@temporalio/workflow@1.15.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) + version: 3.2.3(@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)(@temporalio/client@1.15.0)(@temporalio/common@1.15.0)(@temporalio/worker@1.15.0(@swc/helpers@0.5.13)(esbuild@0.28.2)(tslib@2.8.1))(@temporalio/workflow@1.15.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) next: specifier: 16.3.1 - version: 16.3.1(@babel/core@7.29.0)(@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) + version: 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) next-plausible: specifier: ^3.12.0 - version: 3.12.5(next@16.3.1(@babel/core@7.29.0)(@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-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 3.12.5(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-dom@19.2.4(react@19.2.4))(react@19.2.4) node-fetch: specifier: ^3.3.2 version: 3.3.2 @@ -496,10 +502,13 @@ importers: version: 6.0.1 polotno: specifier: ^3.0.0-beta.25 - version: 3.0.0-beta.25(@types/react@19.1.8)(@types/sortablejs@1.15.9)(konva@10.2.0)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@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) + version: 3.0.0-beta.25(@types/react@19.1.8)(@types/sortablejs@1.15.9)(konva@10.2.0)(react-dom@19.2.4(react@19.2.4))(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) posthog-js: specifier: ^1.178.0 version: 1.359.1 + qrcode: + specifier: ^1.5.4 + version: 1.5.4 react: specifier: 19.2.4 version: 19.2.4 @@ -529,7 +538,7 @@ importers: version: 5.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react-i18next: specifier: ^15.5.2 - version: 15.7.4(i18next@25.8.14(typescript@5.5.4))(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@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) + version: 15.7.4(i18next@25.8.14(typescript@5.5.4))(react-dom@19.2.4(react@19.2.4))(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) react-loading: specifier: ^2.0.3 version: 2.0.3(prop-types@15.8.1)(react@19.2.4) @@ -662,7 +671,7 @@ importers: devDependencies: '@crxjs/vite-plugin': specifier: ^2.7.1 - version: 2.7.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) + version: 2.7.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1)) '@nestjs/schematics': specifier: ^11.1.0 version: 11.1.0(chokidar@4.0.3)(prettier@2.8.8)(typescript@5.5.4) @@ -671,7 +680,7 @@ importers: version: 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/core@11.1.21)(@nestjs/microservices@11.1.21)(@nestjs/platform-express@11.1.21) '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.5.7 - version: 0.5.17(react-refresh@0.10.0)(type-fest@4.41.0)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)) + version: 0.5.17(react-refresh@0.10.0)(type-fest@4.41.0)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) '@svgr/webpack': specifier: ^8.0.1 version: 8.1.0(typescript@5.5.4) @@ -686,7 +695,7 @@ importers: version: 1.5.7(@swc/helpers@0.5.13) '@tailwindcss/vite': specifier: ^4.0.17 - version: 4.2.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) + version: 4.2.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1)) '@testing-library/react': specifier: 16.3.0 version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -702,6 +711,9 @@ importers: '@types/cookie-parser': specifier: ^1.4.6 version: 1.4.10(@types/express@5.0.6) + '@types/express': + specifier: ^5.0.6 + version: 5.0.6 '@types/jest': specifier: 29.5.12 version: 29.5.12 @@ -711,6 +723,9 @@ importers: '@types/node-telegram-bot-api': specifier: ^0.64.7 version: 0.64.14 + '@types/qrcode': + specifier: ^1.5.5 + version: 1.5.5 '@types/react': specifier: 19.1.8 version: 19.1.8 @@ -734,7 +749,7 @@ importers: version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) '@vitejs/plugin-react': specifier: ^6.0.5 - version: 6.0.5(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) + version: 6.0.5(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1)) '@vitest/coverage-v8': specifier: 1.6.0 version: 1.6.0(vitest@3.1.4) @@ -746,7 +761,7 @@ importers: version: 10.4.27(postcss@8.5.26) babel-jest: specifier: 29.7.0 - version: 29.7.0(@babel/core@7.29.0) + version: 29.7.0(@babel/core@8.0.5) cross-env: specifier: ^10.0.0 version: 10.1.0 @@ -809,48 +824,30 @@ importers: version: 0.10.0 ts-jest: specifier: ^29.1.0 - version: 29.4.6(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(esbuild@0.27.7)(jest-util@29.7.0)(jest@29.7.0(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.4.6(@babel/core@8.0.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@8.0.5))(esbuild@0.28.2)(jest-util@29.7.0)(jest@29.7.0(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4)))(typescript@5.5.4) ts-node: specifier: 10.9.2 version: 10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4) tsup: specifier: ^8.5.0 - version: 8.5.1(@swc/core@1.5.7(@swc/helpers@0.5.13))(jiti@2.6.1)(postcss@8.5.26)(typescript@5.5.4)(yaml@2.8.3) + version: 8.5.1(@swc/core@1.5.7(@swc/helpers@0.5.13))(jiti@2.6.1)(postcss@8.5.26)(typescript@5.5.4)(yaml@2.9.1) typescript: specifier: 5.5.4 version: 5.5.4 vite: specifier: ^8.2.1 - version: 8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + version: 8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.5.4)(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) + version: 5.1.4(typescript@5.5.4)(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1)) vitest: specifier: 3.1.4 - version: 3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + version: 3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) apps/backend: {} apps/commands: {} - apps/crove-sso: - devDependencies: - '@cloudflare/vitest-pool-workers': - specifier: 0.21.3 - version: 0.21.3(@cloudflare/workers-types@5.20260813.1)(@vitest/runner@4.1.10)(@vitest/snapshot@4.1.10)(bufferutil@4.1.0)(utf-8-validate@6.0.6)(vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@20.19.37)(@vitest/coverage-v8@1.6.0(vitest@3.1.4))(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jsdom@29.1.0(@noble/hashes@2.0.1)(canvas@2.11.2))(vite@8.2.1(@types/node@20.19.37)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3))) - '@cloudflare/workers-types': - specifier: 5.20260813.1 - version: 5.20260813.1 - typescript: - specifier: 5.5.4 - version: 5.5.4 - vitest: - specifier: 4.1.10 - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@20.19.37)(@vitest/coverage-v8@1.6.0(vitest@3.1.4))(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jsdom@29.1.0(@noble/hashes@2.0.1)(canvas@2.11.2))(vite@8.2.1(@types/node@20.19.37)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) - wrangler: - specifier: 4.123.0 - version: 4.123.0(@cloudflare/workers-types@5.20260813.1)(bufferutil@4.1.0)(utf-8-validate@6.0.6) - apps/extension: {} apps/frontend: {} @@ -879,38 +876,95 @@ packages: resolution: {integrity: sha512-VTDuRS5V0ATbJ/LkaQlisMnTAeYKXAK6scMguVBstf+KIBQ7HIuKhiXLv+G/hvejkV+THoXzoNifInAkU81P1g==} engines: {node: '>=18'} + '@a2a-js/sdk@0.3.14': + resolution: {integrity: sha512-F6Ew1AtPzCLhTn8h9yiqTe7DiDf6XVrSnq9V1YqSl9eWqPm6anMveTiKdCSb/76cW0YiJc24rNaUrVezFFHbqQ==} + engines: {node: '>=18'} + peerDependencies: + '@bufbuild/protobuf': ^2.10.2 + '@grpc/grpc-js': ^1.11.0 + express: ^4.21.2 || ^5.1.0 + peerDependenciesMeta: + '@bufbuild/protobuf': + optional: true + '@grpc/grpc-js': + optional: true + express: + optional: true + + '@a2a-js/sdk@1.0.1': + resolution: {integrity: sha512-CJQdh3Wzwo8qIx5UUkSJ7+7BEI16PB+MXMHHNSmx8JQsQed2HlQgvx1ENOiKUfYA3PlcEvxIwv14dBblhDuPmw==} + engines: {node: '>=20'} + peerDependencies: + '@bufbuild/protobuf': ^2.10.2 + '@grpc/grpc-js': ^1.11.0 + express: ^4.21.2 || ^5.1.0 + peerDependenciesMeta: + '@bufbuild/protobuf': + optional: true + '@grpc/grpc-js': + optional: true + express: + optional: true + + '@a2ui/web_core@0.10.4': + resolution: {integrity: sha512-sahOUSKZIGv9ZtnHjfzWR8o/F1XfSTp4sQAX5/auSenQYBYDRaY0+vrZIkddc/IEzpXJob6cFJT2r5/mLzAvqg==} + '@adraffy/ens-normalize@1.11.1': resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} - '@ag-ui/client@0.0.47': - resolution: {integrity: sha512-zciVwYV6gmYzdMyWwSDR/VBcOj5x1lHPG/ZGDKyxDHbCeIdGp7sKoGORKHAiPAsfUhReGLKXsR/4IknqwY2PgQ==} + '@ag-ui/a2ui-middleware@0.0.10': + resolution: {integrity: sha512-2BQFUQ9vJzUAQSR0dNW/ijhyH8KpiRWISSLTP6mIe6ENyQ2cM1/XLG38/Dcb69olcs36gtZADZzAQWcno5H6fA==} + peerDependencies: + '@ag-ui/client': '>=0.0.40' + rxjs: 7.8.1 + + '@ag-ui/a2ui-toolkit@0.0.4': + resolution: {integrity: sha512-9VPmgpCAsFVICk7z23kh+Kp/BwYMxw0D0KGjOiKXhm1MAH+Wid2iC3yKsXso+q7UZZiyhWgeDUSgaAkltyLmGg==} - '@ag-ui/core@0.0.37': - resolution: {integrity: sha512-7bmjPn1Ol0Zo00F+MrPr0eOwH4AFZbhmq/ZMhCsrMILtVYBiBLcLU9QFBpBL3Zm9MCHha8b79N7JE2FzwcMaVA==} + '@ag-ui/client@0.0.59': + resolution: {integrity: sha512-d7++r8sBAq6z9G/D/WKrMznQ1Mdvew14pCqOVATReFIvl06mCi1BPqTwmos3zCDGAIiSgcvxc/8m472rYQgFFQ==} - '@ag-ui/core@0.0.47': - resolution: {integrity: sha512-fHat7ZErAH028R90psYclTWaj6PdcvN2GJxzwWPF/j1c5ceqbF2+6xe+t06Psg+gCzZneI9QE3IkOkdJNplZ5A==} + '@ag-ui/core@0.0.59': + resolution: {integrity: sha512-hDgy4ipTqXieT8YG8Mr917Y+FD/f11VK1GefZ5CwTDCuNqS/oTwjJ5l/DZkicThgS8hQW/Y7wPylPBMBJ8BkUg==} - '@ag-ui/encoder@0.0.47': - resolution: {integrity: sha512-AgKTM/DEHtaNrcbMa0z1UQ7lKiKtalbFAjBTTP0vCh+lJ6JWIu9LrpCJQ4EjON1IRoAZtJBORlCj1KY+F14HXQ==} + '@ag-ui/encoder@0.0.59': + resolution: {integrity: sha512-wQCzBsStyZMm8nzhTdTx1G0B1C8yv5rbzZLnz1ka/l5LcJEsK3KTounU8CR9l+7QtcpOUUDJKd0xAbyI6gNcSw==} - '@ag-ui/langgraph@0.0.24': - resolution: {integrity: sha512-ebTYpUw28fvbmhqbpAbmfsDTfEqm1gSeZaBcnxMGHFivJLCzsJ/C9hYw6aV8yRKV3lMFBwh/QFxn1eRcr7yRkQ==} + '@ag-ui/langgraph@0.0.43': + resolution: {integrity: sha512-eG8FBd7jQeo7lfraAz9fbuYM/sFJILnO7yFioCa/++cFygd5CpqpvVoUI1d/WEOzHYTwiuXYM5fPOQ8ZzQuYog==} peerDependencies: '@ag-ui/client': '>=0.0.42' '@ag-ui/core': '>=0.0.42' - '@ag-ui/mastra@1.0.1': - resolution: {integrity: sha512-8XcsAdZVweiQU7HeZW4sD9x4oXOk3VJ7piK3eihwIzVkEvd8YtfiPgwNlOzNxT6my8IHaHIuKtAlxLS/wo3TKQ==} + '@ag-ui/mastra@1.1.4': + resolution: {integrity: sha512-4snACp7ZSNRgHnSa0OIASoOMv6ytmEPWT4C+36yLc2c3YC4Heth84bhfnZhQBJ2Erjs1AluExzcpbB5CdVh2Yg==} peerDependencies: - '@ag-ui/client': '>=0.0.44' - '@ag-ui/core': '>=0.0.44' - '@copilotkit/runtime': 0.0.0-mme-ag-ui-0-0-46-20260227141603 + '@ag-ui/client': '>=0.0.58' + '@ag-ui/core': '>=0.0.58' + '@copilotkit/runtime': ^1.60.1 '@mastra/client-js': '>=1.0.0-0 <2.0.0-0' - '@mastra/core': '>=1.0.0-0 <2.0.0-0' + '@mastra/core': '>=1.29.0 <2.0.0-0' + + '@ag-ui/mcp-apps-middleware@0.1.1': + resolution: {integrity: sha512-bX02Hly+9oKTsBT+4RG7ntY9HSF1O+ysRHgXbkKY+ZNVYTCrtpiwgzUfQ1MqMPhBLbZUaVBh9uNfLVxU0maaNQ==} + peerDependencies: + '@ag-ui/client': '>=0.0.40' + rxjs: 7.8.1 + + '@ag-ui/mcp-middleware@0.0.2': + resolution: {integrity: sha512-+CwY9SUjXTvk1h77/nqpXEPj79i/Gt0G7ZEcZLlYsJHJkYYC8IG9yN/tiR++HS1Qb1R46btomrgoBfpBvpGwDw==} + peerDependencies: + '@ag-ui/client': '>=0.0.40' + rxjs: 7.8.1 + + '@ag-ui/proto@0.0.59': + resolution: {integrity: sha512-X+uvDaegLEHw5kJu8tv2eSqHH8ouat+JCfFokGV1uuMquY8qCEQSlGsM7xzexwX9fujuxgHOWumg5kJDqa0+RA==} - '@ag-ui/proto@0.0.47': - resolution: {integrity: sha512-+KCrkeVeR6MulWoYUq9Fwm22gFlI9aKG50eKYRtbTM/Yuei/Che5vjbF297XfSnGUunzScrOmdnTeTCprrtb7A==} + '@ai-sdk/anthropic@2.0.102': + resolution: {integrity: sha512-OGECnK9zIfZQQ++/py3lMDtFT1u43WQO7Js5V5esTOa2iu1E9gDYO5FsJq3DRHZiQlMwBUwIrKNKJfFk2zqgqw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 '@ai-sdk/anthropic@2.0.23': resolution: {integrity: sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw==} @@ -918,24 +972,66 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/anthropic@3.0.118': + resolution: {integrity: sha512-5j8Cc9owORxhhZxFtpznXPTdLxeWm6bPCVbndM0e+NdvGVxe9GDgNqQq1V0KqOV54hZ6hyQVEXHkgTRPyXzcQg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/gateway@1.0.33': resolution: {integrity: sha512-v9i3GPEo4t3fGcSkQkc07xM6KJN75VUv7C1Mqmmsu2xD8lQwnQfsrgAXyNuWe20yGY0eHuheSPDZhiqsGKtH1g==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/gateway@3.0.196': + resolution: {integrity: sha512-YMsbvS2UiPKDdg+dSusbC+SR9KkKyWEvRcURysYrsGK9A3ZIzC7n+Pi+67exlXT2FXC+yvCP1O8z8bbvOJ2ABA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/google-vertex@3.0.174': + resolution: {integrity: sha512-L1DniqC5AwiTR/6k6NPrDbyZce5bjQbcTsR5ANQqLjz2ntnbtQaAtK6SNuOD/6jLayoqXVuO/MLqQEoIyDeuVg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/google@2.0.17': resolution: {integrity: sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/google@2.0.97': + resolution: {integrity: sha512-IGv9wGvbeuNBUVXzqwuOZTHXZUUEuO/aUKfSw2iv7smhalBC1FFuth5WLapJQHb1nusoDup5nELopzXV28vcxA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/google@3.0.123': + resolution: {integrity: sha512-5r6Ie37dBzJltNwA4WkJV5xDMv9ntJHYjxTgO/11TtOjY4jJJA721w8wdsFZcpkIhtA4rRvCw/S1VYbtdqNvbQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/mcp@1.0.81': + resolution: {integrity: sha512-jy9DkejXJXylaXb0m69Klqipny4FVABaCqzRgD4avLrikPj9Br0cIAS/QyB4mHdX37Bw05aaeBhaWRqzBHUtCg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/openai-compatible@1.0.19': resolution: {integrity: sha512-hnsqPCCSNKgpZRNDOAIXZs7OcUDM4ut5ggWxj2sjB4tNL/aBn/xrM7pJkqu+WuPowyrE60wPVSlw0LvtXAlMXQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/openai-compatible@1.0.54': + resolution: {integrity: sha512-3wY1L21FLhfKN6I1nQeWgFzDCeBiRxXwU2guE9BCixSLfOPtkJ0vyF7zo7lbnAg1y7tz6RDPq/o+AJf6QSL55g==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/openai@2.0.42': resolution: {integrity: sha512-9mM6QS8k0ooH9qMC27nlrYLQmNDnO6Rk0JTmFo/yUxpABEWOcvQhMWNHbp9lFL6Ty5vkdINrujhsAQfWuEleOg==} engines: {node: '>=18'} @@ -948,6 +1044,12 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/openai@3.0.113': + resolution: {integrity: sha512-/T3z8ECzxfU5PqoC4i9/yzIqjQw2yRJOgeedGzBJ1RdFH9ZfL7TcDKStAiXJ5nZwFO50FUkqf6SgujhOrMGJKA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/provider-utils@2.2.8': resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} engines: {node: '>=18'} @@ -960,24 +1062,36 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@3.0.20': - resolution: {integrity: sha512-iXHVe0apM2zUEzauqJwqmpC37A5rihrStAih5Ks+JE32iTe4LZ58y17UGBjpQQTCRw9YxMeo2UFLxLpBluyvLQ==} + '@ai-sdk/provider-utils@3.0.22': + resolution: {integrity: sha512-fFT1KfUUKktfAFm5mClJhS1oux9tP2qgzmEZVl5UdwltQ1LO/s8hd7znVrgKzivwv1s1FIPza0s9OpJaNB/vHw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@3.0.22': - resolution: {integrity: sha512-fFT1KfUUKktfAFm5mClJhS1oux9tP2qgzmEZVl5UdwltQ1LO/s8hd7znVrgKzivwv1s1FIPza0s9OpJaNB/vHw==} + '@ai-sdk/provider-utils@3.0.37': + resolution: {integrity: sha512-mLx1SgE20xKQ87xME+9uG6pFlYPTqGDrMFrZ6XcytDnmbWGwmCIh2Xb9zFrfXUrKycSFRDet4Zovj388L9b1dg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@4.0.0': - resolution: {integrity: sha512-HyCyOls9I3a3e38+gtvOJOEjuw9KRcvbBnCL5GBuSmJvS9Jh9v3fz7pRC6ha1EUo/ZH1zwvLWYXBMtic8MTguA==} + '@ai-sdk/provider-utils@4.0.40': + resolution: {integrity: sha512-OL5IrpUm9Y8Dwy+w/vvFwPotS6m52O9W0op2oXgXdCROMJIBalBI0oro6OIBYkPxvm5Xg02GSkoQN25RlR0bnw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/provider-utils@4.0.51': + resolution: {integrity: sha512-ukLTs9x1Xm6lxSIwbJIxYQxbZHmVeIczNntARZrBcOa6pjdBhqeZnATNnJMHa7M9dZ8Ji5NJbpKpvz7o5XyBtg==} + engines: {node: '>=18.17'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@5.0.13': + resolution: {integrity: sha512-fScDJMDnTbx32kLDQqp0MvPjvwkgiwvlBxlmIg7XW5PbS91LG6JjH3PQG+34oMFglqfpQA355e24OdGj5PPoDw==} + engines: {node: '>=22'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/provider@1.1.3': resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} engines: {node: '>=18'} @@ -990,14 +1104,26 @@ packages: resolution: {integrity: sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng==} engines: {node: '>=18'} - '@ai-sdk/provider@3.0.0': - resolution: {integrity: sha512-m9ka3ptkPQbaHHZHqDXDF9C9B5/Mav0KTdky1k2HZ3/nrW2t1AgObxIVPyGDWQNS9FXT/FS6PIoSjpcP/No8rQ==} + '@ai-sdk/provider@2.0.3': + resolution: {integrity: sha512-h88OPkavHTiN9tMn2l5awAznGB0lXzjcLhgR1/rvjB2zlLprsNxbM2tt6OJsHUxduLC3klq0/eqaSf6fX5XVww==} + engines: {node: '>=18'} + + '@ai-sdk/provider@2.0.4': + resolution: {integrity: sha512-B0M50w0W43jTzZGyZrNwwaK1M79aKPw6PD/dQhkBR7vkR68yCINWBo2CbBLJrbrqYc46TaiSfsTiT+S9EmVl0w==} + engines: {node: '>=18'} + + '@ai-sdk/provider@3.0.14': + resolution: {integrity: sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA==} engines: {node: '>=18'} - '@ai-sdk/provider@3.0.5': - resolution: {integrity: sha512-2Xmoq6DBJqmSl80U6V9z5jJSJP7ehaJJQMy2iFUqTay06wdCqTnPVBBQbtEL8RCChenL+q5DC5H5WzU3vV3v8w==} + '@ai-sdk/provider@3.0.16': + resolution: {integrity: sha512-9Av6kg0t/IN/dcYAAmEJ4B9OPhcEJqwSR+GfHEA8olRkindXpUHadc3p3cyvgFUQFTVm1G5thtsmgZ9yVb2w3A==} engines: {node: '>=18'} + '@ai-sdk/provider@4.0.4': + resolution: {integrity: sha512-tbHKNLirllUNF3ZlkCsXnwab2ZV1Sl4b1H/Cp9ruCce15IBmskE8Gwkk0yo9xDWY+jho2of7lVXtwSsyrq7cwQ==} + engines: {node: '>=22'} + '@ai-sdk/react@1.2.12': resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==} engines: {node: '>=18'} @@ -1046,6 +1172,9 @@ packages: resolution: {integrity: sha512-lnw+ZM1Io+cJAkReC0NPDjqObL8NtKzKIkdgEEKC8CUmkhurYhedbicN8Y8NYHgG1uLd2GozW3+/QqPRZaN+Lw==} engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@antfu/install-pkg@2.1.0': + resolution: {integrity: sha512-sdg9NxU3zR4Mnawfbc/x6GB5Wf17WYud5qOuEuxXjaKpYpMkISSJEjItGebXJ2bQ4DIcly4NYH23mtkGJjvKUw==} + '@anthropic-ai/sdk@0.27.3': resolution: {integrity: sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw==} @@ -1057,12 +1186,6 @@ packages: resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} engines: {node: '>= 16'} - '@apidevtools/json-schema-ref-parser@14.2.1': - resolution: {integrity: sha512-HmdFw9CDYqM6B25pqGBpNeLCKvGPlIx1EbLrVL0zPvj50CJQUHyBNBw45Muk0kEIkogo1VZvOKHajdMuAzSxRg==} - engines: {node: '>= 20'} - peerDependencies: - '@types/json-schema': ^7.0.15 - '@asamuzakjp/css-color@5.1.11': resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -1188,6 +1311,12 @@ packages: resolution: {integrity: sha512-g2Z9s6Y4iNh0wICaEqutgYgt/Pmhv5Ev9G3eKGFe2w9VuZDhc76vYdop6I5OocmpHV79d4TuLG+JWg5rQIVDVA==} engines: {node: '>=20.0.0'} + '@aws-sdk/lib-storage@3.1003.0': + resolution: {integrity: sha512-tyc2WazRhlBNdJu1Vpi7v9Oak8gl4zo0521MYOZustCmdSvGmV8kJdOEa4VK8pUPvm2D7mRgdiNRqesy87gcuQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@aws-sdk/client-s3': ^3.1003.0 + '@aws-sdk/middleware-bucket-endpoint@3.972.7': resolution: {integrity: sha512-goX+axlJ6PQlRnzE2bQisZ8wVrlm6dXJfBzMJhd8LhAIBan/w1Kl73fJnalM/S+18VnpzIHumyV6DtgmvqG5IA==} engines: {node: '>=20.0.0'} @@ -1300,32 +1429,62 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} + '@babel/code-frame@8.0.0': + resolution: {integrity: sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/compat-data@7.29.0': resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} engines: {node: '>=6.9.0'} + '@babel/compat-data@8.0.5': + resolution: {integrity: sha512-YLsYoQMvL8l8WrGpN3Zj7O1wK5LEBN+cQtux7BcuHyxIXve724XG+zuJ1n3U1cUweRtTzQOA4IHbuQw3N34SZw==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/core@7.29.0': resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} + '@babel/core@8.0.5': + resolution: {integrity: sha512-2/oWkgTbBYoqioCWAE4XJobOrzwxTDa5/XjDP3tJ1BhDr/owcd9qnXBp4xc3/2G5X4bvXM04nrxbRJxFcXAxFQ==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/generator@7.29.1': resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} + '@babel/generator@8.0.5': + resolution: {integrity: sha512-f/TuhuMAxJqhwxEGNsJrswuG9VHmh0oNFoQoo6TbpgtFAz9wYZXcTAcWZMHfp7ljesr0RG04bp3Aos9GI59L7w==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@8.0.0': + resolution: {integrity: sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-compilation-targets@7.28.6': resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@8.0.5': + resolution: {integrity: sha512-Qk8ahMGooH5mz6uuhoDvfZGkUf/Mf3RTBucVVl4MKx4LKMTv872TeW8O92h15iVtlN8wAROBIpI1aV6x1z0LCQ==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-create-class-features-plugin@7.28.6': resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-create-class-features-plugin@8.0.5': + resolution: {integrity: sha512-ckUE7tmolBbW4QV02lD874sWSPy8da2A09i/h0qS+IWolR+WiNhpq7C/rHZm00uOIkUb0Cp6+0Cy1ku/wj5uQQ==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/helper-create-regexp-features-plugin@7.28.5': resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} engines: {node: '>=6.9.0'} @@ -1341,28 +1500,56 @@ packages: resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} + '@babel/helper-globals@8.0.0': + resolution: {integrity: sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-member-expression-to-functions@7.28.5': resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@8.0.5': + resolution: {integrity: sha512-GLe05QD98BkNFTkjaqeqF9QSRoHLKrrB4tpoplyQuuPrQJ72rtmkM4wvqJLX/sjZPqkbK5MUYSsuUTqdJoOVjA==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-module-imports@7.28.6': resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@8.0.0': + resolution: {integrity: sha512-NZ7mSS93o4ndX4KrbD7W8Sf3QT8Qe24PrnFyUcuOPDzK6faqDFKjY9RG7he7+I7FdiQ4llpnosFqzrXa+Vy3Ew==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-module-transforms@7.28.6': resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@8.0.5': + resolution: {integrity: sha512-lUsSqMD0l5cJKl+3vlTV/hPDA/IvNkcHWVI3zFud2Vur+C9bCKdpqbpkN9eABembedbdWwF0qow6nbdIpNlpcw==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/helper-optimise-call-expression@7.27.1': resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} + '@babel/helper-optimise-call-expression@8.0.0': + resolution: {integrity: sha512-3W6satvtPuCUkUx63S2jMoW9EQNYkADgs1HTfufmL7gCmAulHMKupA/12WNz4A0GMMFn/YnWWwqOT9IZrJHQjg==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-plugin-utils@7.28.6': resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@8.0.1': + resolution: {integrity: sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/helper-remap-async-to-generator@7.27.1': resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} @@ -1375,22 +1562,44 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-replace-supers@8.0.1': + resolution: {integrity: sha512-B1SZADIcy3tmH8CmWvj4SHi/oAPom4UL3uknTc2QRNsPVLFk/sPnZvQL/8kj7Y5omvjMqie0vklvs6XM4OLW5Q==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} + '@babel/helper-skip-transparent-expression-wrappers@8.0.0': + resolution: {integrity: sha512-xmCA9kP3IhySsqhzwIdWGlDN/1A4cCKNBO/uwZx/3YzmDoMePwno2Q5/Bq0q+tYaKbeF940YiKV/kaW8Mzvpjw==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@8.0.0': + resolution: {integrity: sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@8.0.4': + resolution: {integrity: sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@8.0.0': + resolution: {integrity: sha512-U4Dybxh4WESWHt5XhBeExi4DrY0/DNK1aHpQbsrQXCUbFHuMweT0TpLEWKvaraV2Y6fS+ZXunsZ8zIuZIgvF2Q==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-wrap-function@7.28.6': resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} engines: {node: '>=6.9.0'} @@ -1399,11 +1608,20 @@ packages: resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} + '@babel/helpers@8.0.5': + resolution: {integrity: sha512-fQtPOXjYOYv85PIdwotp2TJGVYOycX0PQq+l844fFAxOULtBy8BVF35GyeueX0r4KvDthqPH5xAI1clQPk/2uA==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/parser@7.29.0': resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@8.0.5': + resolution: {integrity: sha512-51RXvQNFakaS0bTpYiGkxNbUVwkPO4kONv6EVLorZABxsx+KZ6Z7uSYvi/wmKS/+X+rfj9RvOw0/ZNh+cmI0Rw==} + engines: {node: ^22.18.0 || >=24.11.0} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} engines: {node: '>=6.9.0'} @@ -1537,6 +1755,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@8.0.3': + resolution: {integrity: sha512-jmTPwps7oSQSZaV1SxkQ3C12UWyufGysGc5OzDpZzvPAIX4mO7dJT3hoqkWVrSImvkcMiknir1iLN1SNV/CZzg==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} @@ -1693,6 +1917,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-commonjs@8.0.1': + resolution: {integrity: sha512-PMuzulWrrzFNmY3lXSk/tV9NRb7y0eZZLJY4UEo2TKszroxvUZHAPPi+T9FDyrQhod+TQA+t+8/QYaaMpiEuhA==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/plugin-transform-modules-systemjs@7.29.0': resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==} engines: {node: '>=6.9.0'} @@ -1861,6 +2091,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@8.0.5': + resolution: {integrity: sha512-o6XW6OngFfpEQat3J1MxUDEd94Rjh80BZQqWmOXa9YTtoyDnk8Zim3NXcx3RTgGiOgkoayCMYp+Xk5NxEmzoMg==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/plugin-transform-unicode-escapes@7.27.1': resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} @@ -1908,6 +2144,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/preset-typescript@8.0.1': + resolution: {integrity: sha512-qrPhQIN1NLrPmzgazF9XKQqXrOcp/WJly+K+6ReFonn24FZqRJO7clxOJo6Ni75L+2vAqI3cHVU2OJLBxoPp5A==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/runtime@7.28.6': resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} @@ -1916,14 +2158,26 @@ packages: resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} + '@babel/template@8.0.0': + resolution: {integrity: sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/traverse@7.29.0': resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} + '@babel/traverse@8.0.5': + resolution: {integrity: sha512-XFfnuvapSc/vJOcUO7kwORSvpBIvraofKEZ2dhT0PjiF21BRCD7YbAFC8UEeDJNeLoQz82/gVqzgX5hCzkCbdg==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} + '@babel/types@8.0.5': + resolution: {integrity: sha512-eVdMqi3ej5aHhyQ2Si6yD2cAWeV8FJK9UrhK5aL0Sd8hu5GhT+YswhVNbVheOGVYMg8kuGuMaUpkB3stjj4z8A==} + engines: {node: ^22.18.0 || >=24.11.0} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1967,6 +2221,9 @@ packages: '@borewit/text-codec@0.2.2': resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + '@braintree/sanitize-url@7.1.2': + resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} + '@bramus/specificity@2.4.2': resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true @@ -1995,102 +2252,147 @@ packages: '@cfworker/json-schema@4.1.1': resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} - '@clack/core@1.2.0': - resolution: {integrity: sha512-qfxof/3T3t9DPU/Rj3OmcFyZInceqj/NVtO9rwIuJqCUgh32gwPjpFQQp/ben07qKlhpwq7GzfWpST4qdJ5Drg==} + '@chevrotain/types@11.1.2': + resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} + + '@clack/core@1.5.1': + resolution: {integrity: sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==} + engines: {node: '>= 20.12.0'} - '@clack/prompts@1.2.0': - resolution: {integrity: sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w==} + '@clack/prompts@1.8.1': + resolution: {integrity: sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==} + engines: {node: '>= 20.12.0'} - '@cloudflare/kv-asset-handler@0.5.0': - resolution: {integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==} - engines: {node: '>=22.0.0'} + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} - '@cloudflare/unenv-preset@2.16.1': - resolution: {integrity: sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==} + '@copilotkit/a2ui-renderer@1.72.0': + resolution: {integrity: sha512-i+dNKpWp9E3UyhWqORTS9deOdloppse1jr7xVQnxiT1Loar2LOzAcqdGbqXHRUYORNs2DHRNHCtQZEaE0laX7g==} peerDependencies: - unenv: 2.0.0-rc.24 - workerd: '>1.20260305.0 <2.0.0-0' + react: 19.2.4 + react-dom: 19.2.4 peerDependenciesMeta: - workerd: + react: + optional: true + react-dom: optional: true - '@cloudflare/vitest-pool-workers@0.21.3': - resolution: {integrity: sha512-jCoGRQ6FlsP5adp1GJISvITOGdTHTpsWOq3KkSGIfeDY/5RKjTUagDwaXjpqBXY5gAk6id/QbgnGuCTAg6lSTQ==} + '@copilotkit/channels-core@0.10.0': + resolution: {integrity: sha512-dmj1JDWzGR7TQu4TLKua/9qd6GaTjySppOQpGdkG+ake63Dwdw7yJn64iGXuYETsECk1jLsZWSF6R7qVvIfltg==} peerDependencies: - '@vitest/runner': ^4.1.0 - '@vitest/snapshot': ^4.1.0 - vitest: ^4.1.0 + vitest: ^4.0.0 + peerDependenciesMeta: + vitest: + optional: true - '@cloudflare/workerd-darwin-64@1.20260811.1': - resolution: {integrity: sha512-i5jqz+ywtOefr0AJbiAc8qxBLfSim/B0WJG7aW3B+pWnoVfMJdUQvi+BWcFKZJ0MoCci3KadTx6g31VfuEEqpQ==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] + '@copilotkit/channels-intelligence@0.10.0': + resolution: {integrity: sha512-Z1e+kdT9eB+nLNkPIpxL6MZ4Rnmp1abyOnBW6RwxuYF+B4wxcLAuBLpXPHQ0E72NxwVMbJ8qjwH8473rAm+LTQ==} - '@cloudflare/workerd-darwin-arm64@1.20260811.1': - resolution: {integrity: sha512-NoOUM/nvaDdm2Onlnz33FikWjtatzulNtvwvy4xs0IrHaTCHwC0c8NwIt6s+AI13FkDs02/vm2I3GTPLCT9+hQ==} - engines: {node: '>=16'} - cpu: [arm64] - os: [darwin] + '@copilotkit/channels-slack@0.10.0': + resolution: {integrity: sha512-zmojMtOwooAF3FVFQglYcq/icNZMdDpwk2HtBmFYZ2o44Sof77VQg7G3cdnb9UJuDyvOOMTSNRC2VOlXjXOK/g==} - '@cloudflare/workerd-linux-64@1.20260811.1': - resolution: {integrity: sha512-sdYq2jL1AD1supa3fsi5O4zTB28wSjvTHj7Migh6/ts8EROPdvrSwv+rdGHhv8HJNAz/wbIAY3wZsi1Rw4uUIg==} - engines: {node: '>=16'} - cpu: [x64] - os: [linux] + '@copilotkit/channels-teams@0.10.0': + resolution: {integrity: sha512-6CZ6wcnjZr/AB2zMOJUVzrjixLeUGQ6GSOaXMwWrBrR3Ik3dIMzUaNeIMFLuKE7cCUb30v0DUetDpNHsP1WNBQ==} + peerDependencies: + '@microsoft/agents-activity': ^1.5.3 + '@microsoft/agents-hosting': ^1.5.3 + express: ^4.21.2 || ^5.0.0 + peerDependenciesMeta: + '@microsoft/agents-activity': + optional: true + '@microsoft/agents-hosting': + optional: true + express: + optional: true - '@cloudflare/workerd-linux-arm64@1.20260811.1': - resolution: {integrity: sha512-RIRv4shbu1kg05sD+DHTpSFCNnb5Dl2SkPDMUykqZa508tkPqe7VVw7gO0Q5msTBGyL0FfFrLuRxwwfA8u5Sow==} - engines: {node: '>=16'} - cpu: [arm64] - os: [linux] + '@copilotkit/channels-ui@0.10.0': + resolution: {integrity: sha512-SpldPYXtP6j+n70srKlYYCHsyZsOt8Frr7RcnwRjFwmaqukPlOqc4AVg0UM8lxRmlascN679a4fQyg5Hxr2NEw==} - '@cloudflare/workerd-windows-64@1.20260811.1': - resolution: {integrity: sha512-g6VquwjASlYAibcNW/0E6Zszht4qLkmnXOGwIjjRHl2A0Qz48kVeMcGvyH6eA0G9U3OzZojjYFpP+YeyQmmdjw==} - engines: {node: '>=16'} - cpu: [x64] - os: [win32] + '@copilotkit/core@1.72.0': + resolution: {integrity: sha512-0kTTakTO20ZXwQu+YYxbwQoVA6QgDqKyl2vECDcGuX3etEGYGCKgrKf4r0aKc3WxeCiuvhwutXfPPxnCCC0sIA==} + engines: {node: '>=20'} - '@cloudflare/workers-types@5.20260813.1': - resolution: {integrity: sha512-RQNfm7xD10hNHEQZFxQPmyGMJ9+aDGPcdFZ0x1LtmjRoLFcgZkGvfaqJAbOMQBAUFSESO3bYJS4p9mOLv28Ihg==} + '@copilotkit/license-verifier@0.5.0': + resolution: {integrity: sha512-vrwKtIpYwF0FT9ZoYASH8owa2cGV0dhDvJGaCRaRMStwDxpc6DRdydKkhx8cWZXyBRxEYcq/Vygv4JvevhQQdQ==} - '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} + '@copilotkit/mcp-apps-renderer@1.72.0': + resolution: {integrity: sha512-gM6wK88doMybljXQPz3T4IbmyV/N6+wWukNAS+lOabo2L2ROHn2MevDTdAX1MNx7/HJ2PrcwpU3IDuGNk+ITQA==} + peerDependencies: + '@ag-ui/client': 0.0.59 + zod: '>=3.25' - '@copilotkit/react-core@1.10.6': - resolution: {integrity: sha512-sdojpntwgOxP8lWRzaFEiWr0g2wDefjQHtve5GPPie+otseFonV88FZjSqIq5LN+q5BIwDOEhCmDjALsGjXvuQ==} + '@copilotkit/react-core@1.72.0': + resolution: {integrity: sha512-TFQx5kk64gY2qIhaC7qrcMbnSRmS2+mKlQ7Yp63lFiSbBENwcmPxx6GvphvkolwrpwzC/wBY1xNGe6OHs68C4g==} peerDependencies: react: 19.2.4 react-dom: 19.2.4 + zod: '>=3.25' - '@copilotkit/react-textarea@1.10.6': - resolution: {integrity: sha512-04totNGPtBkfVdYy5rCBqn47HDbdd9cqHk49At0CD9DFmGOaL7kwMbywHj4Dqq6UpDKuJqnS9aYyLI073vuZwA==} + '@copilotkit/react-textarea@1.72.0': + resolution: {integrity: sha512-YKkZWkGBO1mEwpAj0UzzvfTw+8JuWJDr6luiXyl2XIUZxDqsK4Nme1Bbaw1nVQGNZ0QXjU6FTxiGvck+si/tBQ==} peerDependencies: react: 19.2.4 react-dom: 19.2.4 - '@copilotkit/react-ui@1.10.6': - resolution: {integrity: sha512-eNIbZKMvBVZqlAR4fqkmZRIYIt8WhwZOxfVJVwMD9nfmWdtatmxrOLecyDiPk/hkq2o/8s2/rubaZSMK6m+GHQ==} + '@copilotkit/react-ui@1.72.0': + resolution: {integrity: sha512-nCVAr2E8evnOvB6XXN7WKWBDgsYn07iWjuuI1h7U3zfdlS/d/oz3vob7w6Uq987lEGxWEmUf8KNuCj6kGFQZpg==} peerDependencies: react: 19.2.4 - '@copilotkit/runtime-client-gql@1.10.6': - resolution: {integrity: sha512-oLX8mjppVvQCWfquW9A0500hYVNxM4X/mtt76SEvfGUb2KsNQ4j2HOCzpmtm85MeLproC+f9738wLwRueLliZg==} + '@copilotkit/runtime-client-gql@1.72.0': + resolution: {integrity: sha512-ThXg3l+u71tt9l30f1cXaMLtJbKyDCeKDJ/zKpiLHnbemBxF7I0Ms9bjEYF2iCDviYTlQQ/8QUlfAjuq/Ohrww==} peerDependencies: react: 19.2.4 - '@copilotkit/runtime@1.10.6': - resolution: {integrity: sha512-35MdJ6nutC+spgHRJURbanLxBoQCNvVBYD0CBIk4Rv3/Ck8XgZA4lcc+5aGteuERXOPBsYEQjGD4xEPy3QXmGg==} + '@copilotkit/runtime@1.72.0': + resolution: {integrity: sha512-XTler40g1iONbr5euHkB5t3e6A/MzPKb26KHlyl220fb6mzgDUk0fBUfwlsBpXw/g8AXY1LiPGIP0+0eXQ7GUg==} + engines: {node: '>=20'} peerDependencies: - '@ag-ui/client': '>=0.0.39' - '@ag-ui/core': '>=0.0.39' - '@ag-ui/encoder': '>=0.0.39' - '@ag-ui/langgraph': '>=0.0.18' - '@ag-ui/proto': '>=0.0.39' + '@anthropic-ai/sdk': '>=0.57.0' + '@langchain/aws': '>=0.1.9' + '@langchain/community': '>=0.3.58' + '@langchain/core': '>=0.3.66' + '@langchain/google-gauth': '>=0.1.0' + '@langchain/langgraph-sdk': '>=0.1.2' + '@langchain/openai': '>=0.4.2' + groq-sdk: '>=0.3.0 <1.0.0' + langchain: '>=0.3.3' + openai: ^4.85.1 || >=5.0.0 + peerDependenciesMeta: + '@anthropic-ai/sdk': + optional: true + '@langchain/aws': + optional: true + '@langchain/community': + optional: true + '@langchain/google-gauth': + optional: true + '@langchain/langgraph-sdk': + optional: true + '@langchain/openai': + optional: true + groq-sdk: + optional: true + langchain: + optional: true + openai: + optional: true - '@copilotkit/shared@1.10.6': - resolution: {integrity: sha512-56Rltf4fDBqCpl1ZXARypt5NdE4LTg3tGPPLurZpgPmm31Lv5EAHpfjC7I55vt9A0mXWlTCHtCrpiaAlTyzGJw==} + '@copilotkit/shared@1.72.0': + resolution: {integrity: sha512-lqt2V2P063vEfb9xGIX4JWnuyNRJHz3MAUgwfTLpdpHU7k1nNcStbWlUCZUc7oSxLXaZ+cGj1Ncx/jcgNd7FFQ==} + peerDependencies: + '@ag-ui/core': '>=0.0.48' + + '@copilotkit/web-components@1.72.0': + resolution: {integrity: sha512-4pdhsZj3f3LJoTCJIc7MPJihKDFm/R9GhYVmdRGzWU5iQKKdQDdVg4Z7PZm7Y+hZ51ud1hCtmIwFKZFBmy8GAg==} + engines: {node: '>=20'} + peerDependencies: + lit: ^3.3.2 + + '@copilotkit/web-inspector@1.72.0': + resolution: {integrity: sha512-l+739387Gef/lbpj8Kf8G90+VYUKgTFsBTtWy4bqiGNBAFbRcerwNRx+C1xackFCmQCR/7TzBBy6HvzsgDLQHw==} + engines: {node: '>=20'} '@crxjs/vite-plugin@2.7.1': resolution: {integrity: sha512-mn77Lc1ilIvbO7ZqijjNy+AnRgc8srkfHOtV6HrGrYZgRe8YI3aIcSjHJCU5Kq75SejEZGrdAoHdn3gBGeKpEA==} @@ -2147,9 +2449,6 @@ packages: resolution: {integrity: sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==} engines: {node: '>= 6'} - '@datastructures-js/deque@1.0.8': - resolution: {integrity: sha512-PSBhJ2/SmeRPRHuBv7i/fHWIdSC3JTyq56qb+Rq0wjOagi0/fdV5/B/3Md5zFZus/W6OkSPMaxMKKMNMrSmubg==} - '@dub/analytics@0.0.32': resolution: {integrity: sha512-jmZrgbArOX08/kz+hi1s9ggt0k64WzRErt6jM6TfuqUHlXQYNNNRcefvKrmd9vwmbvNGR/GxZnYeyco6Zyw4fg==} @@ -2249,14 +2548,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.7': - resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.28.1': - resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -2273,14 +2566,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.7': - resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.28.1': - resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -2297,14 +2584,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.7': - resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.28.1': - resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -2321,14 +2602,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.7': - resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.28.1': - resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -2345,14 +2620,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.7': - resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.28.1': - resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -2369,14 +2638,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.7': - resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.28.1': - resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -2393,14 +2656,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.7': - resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.28.1': - resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -2417,14 +2674,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.7': - resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.28.1': - resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -2441,14 +2692,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.7': - resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.28.1': - resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -2465,14 +2710,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.7': - resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.28.1': - resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -2489,14 +2728,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.7': - resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.28.1': - resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -2513,14 +2746,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.7': - resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.28.1': - resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -2537,14 +2764,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.7': - resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.28.1': - resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -2561,14 +2782,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.7': - resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.28.1': - resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -2585,14 +2800,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.7': - resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.28.1': - resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -2609,14 +2818,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.7': - resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.28.1': - resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -2633,14 +2836,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.7': - resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.28.1': - resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -2657,14 +2854,8 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.27.7': - resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-arm64@0.28.1': - resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -2681,14 +2872,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.7': - resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.28.1': - resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -2705,14 +2890,8 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.27.7': - resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.28.1': - resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -2729,14 +2908,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.7': - resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.28.1': - resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -2753,14 +2926,8 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.27.7': - resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/openharmony-arm64@0.28.1': - resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -2777,14 +2944,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.7': - resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.28.1': - resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -2801,14 +2962,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.7': - resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.28.1': - resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -2825,14 +2980,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.7': - resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.28.1': - resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -2849,14 +2998,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.7': - resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.28.1': - resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -2903,17 +3046,21 @@ packages: '@expo/sudo-prompt@9.3.2': resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==} - '@farcaster/miniapp-core@0.5.1': - resolution: {integrity: sha512-5QFn9zTV8GHUqZF31X9iwq9tNlnoOgP/o0UXb+QmdNeJsWXrhUFBKYl+C7KQOhVw2xqWKhBSDgYIHOkSRua3vg==} + '@farcaster/miniapp-core@0.6.0': + resolution: {integrity: sha512-sgDQdU6fQDXYbNbjuvvwhww1rwf/S0JCnKsp/o2K+ubtboA3SOiy3Wrc+taBnAh56CCxVbZN9Hck3OpYh9wINw==} - '@farcaster/miniapp-sdk@0.2.3': - resolution: {integrity: sha512-FwxqGcYCXw3HyGfDuchFUmQN9Gd49jTJs585zzQv6l1Oba6A/vVVCYohEG6QxRT6b/UrdemImpNMGTnqAZ3hKw==} + '@farcaster/miniapp-sdk@0.3.0': + resolution: {integrity: sha512-mxze24B5SSLwqpPqUmzthfsGGPeevJvDuOEbLJay1DDgPS/B0LswA0XXfz4d6pViA7Y4TkbeAPMAfuVZ9nIqgQ==} '@farcaster/quick-auth@0.0.6': resolution: {integrity: sha512-tiZndhpfDtEhaKlkmS5cVDuS+A/tafqZT3y9I44rC69m3beJok6e8dIH2JhxVy3EvOWTyTBnrmNn6GOOh+qK6A==} peerDependencies: typescript: 5.8.3 + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + '@fastify/busboy@3.2.0': resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} @@ -3046,6 +3193,13 @@ packages: peerDependencies: hono: ^4 + '@hono/node-ws@1.3.1': + resolution: {integrity: sha512-vo/MwCnpJAVHBkGzWjCJ28wF45fYHAfbPZcH2rodZODHtch2GHA94KtMfusmVycTUtsLAsaNsHhtY6P8X3RQsA==} + engines: {node: '>=18.14.1'} + peerDependencies: + '@hono/node-server': ^1.19.11 + hono: ^4.6.0 + '@hookform/resolvers@3.10.0': resolution: {integrity: sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==} peerDependencies: @@ -3068,6 +3222,12 @@ packages: resolution: {integrity: sha512-farwTW1ffFt3NVvqZQIcd0VBKByLK6ctnfn4XM7Rf9Mf5JJbNwVPV1Wll046E/MlKAaZEM6sFDGAh+JCnnmqyQ==} engines: {node: '>=20.0.0'} + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.1.7': + resolution: {integrity: sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w==} + '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} @@ -3078,12 +3238,6 @@ packages: cpu: [arm64] os: [darwin] - '@img/sharp-darwin-arm64@0.35.2': - resolution: {integrity: sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg==} - engines: {node: '>=20.9.0'} - cpu: [arm64] - os: [darwin] - '@img/sharp-darwin-arm64@0.35.3': resolution: {integrity: sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==} engines: {node: '>=20.9.0'} @@ -3096,23 +3250,12 @@ packages: cpu: [x64] os: [darwin] - '@img/sharp-darwin-x64@0.35.2': - resolution: {integrity: sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==} - engines: {node: '>=20.9.0'} - cpu: [x64] - os: [darwin] - '@img/sharp-darwin-x64@0.35.3': resolution: {integrity: sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==} engines: {node: '>=20.9.0'} cpu: [x64] os: [darwin] - '@img/sharp-freebsd-wasm32@0.35.2': - resolution: {integrity: sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==} - engines: {node: '>=20.9.0'} - os: [freebsd] - '@img/sharp-freebsd-wasm32@0.35.3': resolution: {integrity: sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==} engines: {node: '>=20.9.0'} @@ -3123,11 +3266,6 @@ packages: cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.3.1': - resolution: {integrity: sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==} - cpu: [arm64] - os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.3.2': resolution: {integrity: sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==} cpu: [arm64] @@ -3138,11 +3276,6 @@ packages: cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.3.1': - resolution: {integrity: sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==} - cpu: [x64] - os: [darwin] - '@img/sharp-libvips-darwin-x64@1.3.2': resolution: {integrity: sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==} cpu: [x64] @@ -3153,11 +3286,6 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm64@1.3.1': - resolution: {integrity: sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==} - cpu: [arm64] - os: [linux] - '@img/sharp-libvips-linux-arm64@1.3.2': resolution: {integrity: sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==} cpu: [arm64] @@ -3168,31 +3296,16 @@ packages: cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-arm@1.3.1': - resolution: {integrity: sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==} - cpu: [arm] - os: [linux] - '@img/sharp-libvips-linux-arm@1.3.2': resolution: {integrity: sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.3.1': - resolution: {integrity: sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==} - cpu: [ppc64] - os: [linux] - '@img/sharp-libvips-linux-ppc64@1.3.2': resolution: {integrity: sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==} cpu: [ppc64] os: [linux] - '@img/sharp-libvips-linux-riscv64@1.3.1': - resolution: {integrity: sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==} - cpu: [riscv64] - os: [linux] - '@img/sharp-libvips-linux-riscv64@1.3.2': resolution: {integrity: sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==} cpu: [riscv64] @@ -3203,11 +3316,6 @@ packages: cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-s390x@1.3.1': - resolution: {integrity: sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==} - cpu: [s390x] - os: [linux] - '@img/sharp-libvips-linux-s390x@1.3.2': resolution: {integrity: sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==} cpu: [s390x] @@ -3218,11 +3326,6 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-libvips-linux-x64@1.3.1': - resolution: {integrity: sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==} - cpu: [x64] - os: [linux] - '@img/sharp-libvips-linux-x64@1.3.2': resolution: {integrity: sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==} cpu: [x64] @@ -3233,11 +3336,6 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.3.1': - resolution: {integrity: sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==} - cpu: [arm64] - os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.3.2': resolution: {integrity: sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==} cpu: [arm64] @@ -3248,11 +3346,6 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.3.1': - resolution: {integrity: sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==} - cpu: [x64] - os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.3.2': resolution: {integrity: sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==} cpu: [x64] @@ -3264,12 +3357,6 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-linux-arm64@0.35.2': - resolution: {integrity: sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==} - engines: {node: '>=20.9.0'} - cpu: [arm64] - os: [linux] - '@img/sharp-linux-arm64@0.35.3': resolution: {integrity: sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==} engines: {node: '>=20.9.0'} @@ -3282,36 +3369,18 @@ packages: cpu: [arm] os: [linux] - '@img/sharp-linux-arm@0.35.2': - resolution: {integrity: sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==} - engines: {node: '>=20.9.0'} - cpu: [arm] - os: [linux] - '@img/sharp-linux-arm@0.35.3': resolution: {integrity: sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==} engines: {node: '>=20.9.0'} cpu: [arm] os: [linux] - '@img/sharp-linux-ppc64@0.35.2': - resolution: {integrity: sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==} - engines: {node: '>=20.9.0'} - cpu: [ppc64] - os: [linux] - '@img/sharp-linux-ppc64@0.35.3': resolution: {integrity: sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==} engines: {node: '>=20.9.0'} cpu: [ppc64] os: [linux] - '@img/sharp-linux-riscv64@0.35.2': - resolution: {integrity: sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==} - engines: {node: '>=20.9.0'} - cpu: [riscv64] - os: [linux] - '@img/sharp-linux-riscv64@0.35.3': resolution: {integrity: sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==} engines: {node: '>=20.9.0'} @@ -3324,12 +3393,6 @@ packages: cpu: [s390x] os: [linux] - '@img/sharp-linux-s390x@0.35.2': - resolution: {integrity: sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==} - engines: {node: '>=20.9.0'} - cpu: [s390x] - os: [linux] - '@img/sharp-linux-s390x@0.35.3': resolution: {integrity: sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==} engines: {node: '>=20.9.0'} @@ -3342,12 +3405,6 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linux-x64@0.35.2': - resolution: {integrity: sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==} - engines: {node: '>=20.9.0'} - cpu: [x64] - os: [linux] - '@img/sharp-linux-x64@0.35.3': resolution: {integrity: sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==} engines: {node: '>=20.9.0'} @@ -3360,12 +3417,6 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.35.2': - resolution: {integrity: sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==} - engines: {node: '>=20.9.0'} - cpu: [arm64] - os: [linux] - '@img/sharp-linuxmusl-arm64@0.35.3': resolution: {integrity: sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==} engines: {node: '>=20.9.0'} @@ -3378,12 +3429,6 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-x64@0.35.2': - resolution: {integrity: sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==} - engines: {node: '>=20.9.0'} - cpu: [x64] - os: [linux] - '@img/sharp-linuxmusl-x64@0.35.3': resolution: {integrity: sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==} engines: {node: '>=20.9.0'} @@ -3395,30 +3440,15 @@ packages: engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-wasm32@0.35.2': - resolution: {integrity: sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==} - engines: {node: '>=20.9.0'} - '@img/sharp-wasm32@0.35.3': resolution: {integrity: sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==} engines: {node: '>=20.9.0'} - '@img/sharp-webcontainers-wasm32@0.35.2': - resolution: {integrity: sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==} - engines: {node: '>=20.9.0'} - cpu: [wasm32] - '@img/sharp-webcontainers-wasm32@0.35.3': resolution: {integrity: sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==} engines: {node: '>=20.9.0'} cpu: [wasm32] - '@img/sharp-win32-arm64@0.35.2': - resolution: {integrity: sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==} - engines: {node: '>=20.9.0'} - cpu: [arm64] - os: [win32] - '@img/sharp-win32-arm64@0.35.3': resolution: {integrity: sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==} engines: {node: '>=20.9.0'} @@ -3431,12 +3461,6 @@ packages: cpu: [ia32] os: [win32] - '@img/sharp-win32-ia32@0.35.2': - resolution: {integrity: sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==} - engines: {node: ^20.9.0} - cpu: [ia32] - os: [win32] - '@img/sharp-win32-ia32@0.35.3': resolution: {integrity: sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==} engines: {node: ^20.9.0} @@ -3449,12 +3473,6 @@ packages: cpu: [x64] os: [win32] - '@img/sharp-win32-x64@0.35.2': - resolution: {integrity: sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==} - engines: {node: '>=20.9.0'} - cpu: [x64] - os: [win32] - '@img/sharp-win32-x64@0.35.3': resolution: {integrity: sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==} engines: {node: '>=20.9.0'} @@ -3627,8 +3645,8 @@ packages: resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} engines: {node: '>=12'} - '@isaacs/ttlcache@2.1.4': - resolution: {integrity: sha512-7kMz0BJpMvgAMkyglums7B2vtrn5g0a0am77JY0GjkZZNetOBCFn7AG7gKCwT0QPiXyxW7YIQSgtARknUEOcxQ==} + '@isaacs/ttlcache@2.1.5': + resolution: {integrity: sha512-VwGZqqjAWPICTmxUZnbpEfO60LhPWzquik+bmyXGY7pYRn6diEvCI5i6Ca+J6o2y4vS73HrpuMTo2dOvUevH8w==} engines: {node: '>=12'} '@istanbuljs/load-nyc-config@1.1.0': @@ -3709,9 +3727,15 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jetbrains/websandbox@1.4.1': + resolution: {integrity: sha512-7FcQ9flzW0H+AjLlCRdhAE47zZxLtCwEcZjHvxtNLa0LbKMwEBBp0cQIaJ3vowCoUh6wqmSUXUCMtQzdv/SpLg==} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.4.0-beta.0': + resolution: {integrity: sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==} + '@jridgewell/remapping@2.3.5': resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} @@ -3725,6 +3749,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -3909,387 +3936,6 @@ packages: typeorm: optional: true - '@langchain/community@0.3.59': - resolution: {integrity: sha512-lYoVFC9wArWMXaixDgIadTE22jk4ZYAvSHHmwaMRagkGr5f4kyqMeJ83UUeW76XPx2cBy2fRSO+acSgqSuWE6A==} - engines: {node: '>=18'} - deprecated: This package has been deprecated. See https://github.com/langchain-ai/langchainjs-community/issues/61 for more info - peerDependencies: - '@arcjet/redact': ^v1.0.0-alpha.23 - '@aws-crypto/sha256-js': ^5.0.0 - '@aws-sdk/client-bedrock-agent-runtime': ^3.749.0 - '@aws-sdk/client-bedrock-runtime': ^3.749.0 - '@aws-sdk/client-dynamodb': ^3.749.0 - '@aws-sdk/client-kendra': ^3.749.0 - '@aws-sdk/client-lambda': ^3.749.0 - '@aws-sdk/client-s3': ^3.749.0 - '@aws-sdk/client-sagemaker-runtime': ^3.749.0 - '@aws-sdk/client-sfn': ^3.749.0 - '@aws-sdk/credential-provider-node': ^3.388.0 - '@aws-sdk/dsql-signer': '*' - '@azure/search-documents': ^12.0.0 - '@azure/storage-blob': ^12.15.0 - '@browserbasehq/sdk': '*' - '@browserbasehq/stagehand': ^1.0.0 - '@clickhouse/client': ^0.2.5 - '@cloudflare/ai': '*' - '@datastax/astra-db-ts': ^1.0.0 - '@elastic/elasticsearch': ^8.4.0 - '@getmetal/metal-sdk': '*' - '@getzep/zep-cloud': ^1.0.6 - '@getzep/zep-js': ^0.9.0 - '@gomomento/sdk': ^1.51.1 - '@gomomento/sdk-core': ^1.51.1 - '@google-ai/generativelanguage': '*' - '@google-cloud/storage': ^6.10.1 || ^7.7.0 - '@gradientai/nodejs-sdk': ^1.2.0 - '@huggingface/inference': ^4.0.5 - '@huggingface/transformers': ^3.5.2 - '@ibm-cloud/watsonx-ai': '*' - '@lancedb/lancedb': ^0.19.1 - '@langchain/core': '>=0.3.58 <0.4.0' - '@layerup/layerup-security': ^1.5.12 - '@libsql/client': ^0.14.0 - '@mendable/firecrawl-js': ^1.4.3 - '@mlc-ai/web-llm': '*' - '@mozilla/readability': '*' - '@neondatabase/serverless': '*' - '@notionhq/client': ^2.2.10 - '@opensearch-project/opensearch': '*' - '@pinecone-database/pinecone': '*' - '@planetscale/database': ^1.8.0 - '@premai/prem-sdk': ^0.3.25 - '@qdrant/js-client-rest': ^1.15.0 - '@raycast/api': ^1.55.2 - '@rockset/client': ^0.9.1 - '@smithy/eventstream-codec': ^2.0.5 - '@smithy/protocol-http': ^3.0.6 - '@smithy/signature-v4': ^2.0.10 - '@smithy/util-utf8': ^2.0.0 - '@spider-cloud/spider-client': ^0.0.21 - '@supabase/supabase-js': ^2.45.0 - '@tensorflow-models/universal-sentence-encoder': '*' - '@tensorflow/tfjs-converter': '*' - '@tensorflow/tfjs-core': '*' - '@upstash/ratelimit': ^1.1.3 || ^2.0.3 - '@upstash/redis': ^1.20.6 - '@upstash/vector': ^1.1.1 - '@vercel/kv': '*' - '@vercel/postgres': '*' - '@writerai/writer-sdk': ^0.40.2 - '@xata.io/client': ^0.28.0 - '@zilliz/milvus2-sdk-node': '>=2.3.5' - apify-client: ^2.7.1 - assemblyai: ^4.6.0 - azion: ^1.11.1 - better-sqlite3: '>=9.4.0 <12.0.0' - cassandra-driver: ^4.7.2 - cborg: ^4.1.1 - cheerio: ^1.0.0-rc.12 - chromadb: '*' - closevector-common: 0.1.3 - closevector-node: 0.1.6 - closevector-web: 0.1.6 - cohere-ai: '*' - convex: ^1.3.1 - crypto-js: ^4.2.0 - d3-dsv: ^2.0.0 - discord.js: ^14.14.1 - duck-duck-scrape: ^2.2.5 - epub2: ^3.0.1 - fast-xml-parser: '*' - firebase-admin: ^11.9.0 || ^12.0.0 || ^13.0.0 - google-auth-library: '*' - googleapis: '*' - hnswlib-node: ^3.0.0 - html-to-text: ^9.0.5 - ibm-cloud-sdk-core: '*' - ignore: ^5.2.0 - interface-datastore: ^8.2.11 - ioredis: ^5.3.2 - it-all: ^3.0.4 - jsdom: '*' - jsonwebtoken: ^9.0.2 - llmonitor: ^0.5.9 - lodash: ^4.17.21 - lunary: ^0.7.10 - mammoth: ^1.6.0 - mariadb: ^3.4.0 - mem0ai: ^2.1.8 - mongodb: ^6.17.0 - mysql2: ^3.9.8 - neo4j-driver: '*' - notion-to-md: ^3.1.0 - officeparser: ^4.0.4 - openai: '*' - pdf-parse: 1.1.1 - pg: ^8.11.0 - pg-copy-streams: ^6.0.5 - pickleparser: ^0.2.1 - playwright: ^1.32.1 - portkey-ai: ^0.1.11 - puppeteer: '*' - pyodide: '>=0.24.1 <0.27.0' - redis: '*' - replicate: '*' - sonix-speech-recognition: ^2.1.1 - srt-parser-2: ^1.2.3 - typeorm: ^0.3.20 - typesense: ^1.5.3 - usearch: ^1.1.1 - voy-search: 0.6.2 - weaviate-client: ^3.5.2 - web-auth-library: ^1.0.3 - word-extractor: '*' - ws: ^8.14.2 - youtubei.js: '*' - peerDependenciesMeta: - '@arcjet/redact': - optional: true - '@aws-crypto/sha256-js': - optional: true - '@aws-sdk/client-bedrock-agent-runtime': - optional: true - '@aws-sdk/client-bedrock-runtime': - optional: true - '@aws-sdk/client-dynamodb': - optional: true - '@aws-sdk/client-kendra': - optional: true - '@aws-sdk/client-lambda': - optional: true - '@aws-sdk/client-s3': - optional: true - '@aws-sdk/client-sagemaker-runtime': - optional: true - '@aws-sdk/client-sfn': - optional: true - '@aws-sdk/credential-provider-node': - optional: true - '@aws-sdk/dsql-signer': - optional: true - '@azure/search-documents': - optional: true - '@azure/storage-blob': - optional: true - '@browserbasehq/sdk': - optional: true - '@clickhouse/client': - optional: true - '@cloudflare/ai': - optional: true - '@datastax/astra-db-ts': - optional: true - '@elastic/elasticsearch': - optional: true - '@getmetal/metal-sdk': - optional: true - '@getzep/zep-cloud': - optional: true - '@getzep/zep-js': - optional: true - '@gomomento/sdk': - optional: true - '@gomomento/sdk-core': - optional: true - '@google-ai/generativelanguage': - optional: true - '@google-cloud/storage': - optional: true - '@gradientai/nodejs-sdk': - optional: true - '@huggingface/inference': - optional: true - '@huggingface/transformers': - optional: true - '@lancedb/lancedb': - optional: true - '@layerup/layerup-security': - optional: true - '@libsql/client': - optional: true - '@mendable/firecrawl-js': - optional: true - '@mlc-ai/web-llm': - optional: true - '@mozilla/readability': - optional: true - '@neondatabase/serverless': - optional: true - '@notionhq/client': - optional: true - '@opensearch-project/opensearch': - optional: true - '@pinecone-database/pinecone': - optional: true - '@planetscale/database': - optional: true - '@premai/prem-sdk': - optional: true - '@qdrant/js-client-rest': - optional: true - '@raycast/api': - optional: true - '@rockset/client': - optional: true - '@smithy/eventstream-codec': - optional: true - '@smithy/protocol-http': - optional: true - '@smithy/signature-v4': - optional: true - '@smithy/util-utf8': - optional: true - '@spider-cloud/spider-client': - optional: true - '@supabase/supabase-js': - optional: true - '@tensorflow-models/universal-sentence-encoder': - optional: true - '@tensorflow/tfjs-converter': - optional: true - '@tensorflow/tfjs-core': - optional: true - '@upstash/ratelimit': - optional: true - '@upstash/redis': - optional: true - '@upstash/vector': - optional: true - '@vercel/kv': - optional: true - '@vercel/postgres': - optional: true - '@writerai/writer-sdk': - optional: true - '@xata.io/client': - optional: true - '@zilliz/milvus2-sdk-node': - optional: true - apify-client: - optional: true - assemblyai: - optional: true - azion: - optional: true - better-sqlite3: - optional: true - cassandra-driver: - optional: true - cborg: - optional: true - cheerio: - optional: true - chromadb: - optional: true - closevector-common: - optional: true - closevector-node: - optional: true - closevector-web: - optional: true - cohere-ai: - optional: true - convex: - optional: true - crypto-js: - optional: true - d3-dsv: - optional: true - discord.js: - optional: true - duck-duck-scrape: - optional: true - epub2: - optional: true - fast-xml-parser: - optional: true - firebase-admin: - optional: true - google-auth-library: - optional: true - googleapis: - optional: true - hnswlib-node: - optional: true - html-to-text: - optional: true - ignore: - optional: true - interface-datastore: - optional: true - ioredis: - optional: true - it-all: - optional: true - jsdom: - optional: true - jsonwebtoken: - optional: true - llmonitor: - optional: true - lodash: - optional: true - lunary: - optional: true - mammoth: - optional: true - mariadb: - optional: true - mem0ai: - optional: true - mongodb: - optional: true - mysql2: - optional: true - neo4j-driver: - optional: true - notion-to-md: - optional: true - officeparser: - optional: true - pdf-parse: - optional: true - pg: - optional: true - pg-copy-streams: - optional: true - pickleparser: - optional: true - playwright: - optional: true - portkey-ai: - optional: true - puppeteer: - optional: true - pyodide: - optional: true - redis: - optional: true - replicate: - optional: true - sonix-speech-recognition: - optional: true - srt-parser-2: - optional: true - typeorm: - optional: true - typesense: - optional: true - usearch: - optional: true - voy-search: - optional: true - weaviate-client: - optional: true - web-auth-library: - optional: true - word-extractor: - optional: true - ws: - optional: true - youtubei.js: - optional: true - '@langchain/community@1.1.27': resolution: {integrity: sha512-s2U3w7QV7QpkFtY1eZMni4poz+nKLFclpDi3a7hUbZ67ttsGaU9WkZ2BiLuzLIs+IFaUvON/KcGkE8EqAl9aPA==} engines: {node: '>=20'} @@ -4656,14 +4302,14 @@ packages: youtubei.js: optional: true - '@langchain/core@0.3.80': - resolution: {integrity: sha512-vcJDV2vk1AlCwSh3aBm/urQ1ZrlXFFBocv11bz/NBUfLWD5/UDNMzwPdaAd2dKvNmTWa9FM2lirLU3+JCf4cRA==} - engines: {node: '>=18'} - '@langchain/core@1.1.39': resolution: {integrity: sha512-DP9c7TREy6iA7HnywstmUAsNyJNYTFpRg2yBfQ+6H0l1HnvQzei9GsQ36GeOLxgRaD3vm9K8urCcawSC7yQpCw==} engines: {node: '>=20'} + '@langchain/core@1.2.11': + resolution: {integrity: sha512-8yuWLLloTSYA453akm2JSadOVa8kGDY8v+kTzQ6kTY6aIETTEIxgysjZWyKrWQLo3UazctsSoGJ8JrdCGFL4/w==} + engines: {node: '>=20'} + '@langchain/google-common@0.1.8': resolution: {integrity: sha512-8auqWw2PMPhcHQHS+nMN3tVZrUPgSLckUaFeOHDOeSBiDvBd4KCybPwyl2oCwMDGvmyIxvOOckkMdeGaJ92vpQ==} engines: {node: '>=18'} @@ -4682,26 +4328,19 @@ packages: peerDependencies: '@langchain/core': ^1.0.1 - '@langchain/langgraph-sdk@0.0.70': - resolution: {integrity: sha512-O8I12bfeMVz5fOrXnIcK4IdRf50IqyJTO458V56wAIHLNoi4H8/JHM+2M+Y4H2PtslXIGnvomWqlBd0eY5z/Og==} + '@langchain/langgraph-checkpoint@1.1.5': + resolution: {integrity: sha512-BwDwl5VeTOh6CVuiIPgsUgfK51vTJDMSbFcSCUfjJWsl8/DPdK/mbv+ejxJstkSk/BlSPMP4JfXWcN6jD2ea2Q==} + engines: {node: '>=18'} peerDependencies: - '@langchain/core': '>=0.2.31 <0.4.0' - react: 19.2.4 - peerDependenciesMeta: - '@langchain/core': - optional: true - react: - optional: true + '@langchain/core': ^1.1.48 - '@langchain/langgraph-sdk@0.1.10': - resolution: {integrity: sha512-9srSCb2bSvcvehMgjA2sMMwX0o1VUgPN6ghwm5Fwc9JGAKsQa6n1S4eCwy1h4abuYxwajH5n3spBw+4I2WYbgw==} + '@langchain/langgraph-sdk@1.11.0': + resolution: {integrity: sha512-Gk6mrCs2fbqKr3luQxVM5ZEcpjK35QO5w/Tr9h/RQPzeKqrsHyPrP4NR9udfgy1ycu7KvvoZ3V0t3beN/edx0g==} peerDependencies: - '@langchain/core': '>=0.2.31 <0.4.0 || ^1.0.0-alpha' + '@langchain/core': ^1.1.48 react: 19.2.4 react-dom: 19.2.4 peerDependenciesMeta: - '@langchain/core': - optional: true react: optional: true react-dom: @@ -4738,17 +4377,12 @@ packages: zod-to-json-schema: optional: true - '@langchain/openai@0.4.9': - resolution: {integrity: sha512-NAsaionRHNdqaMjVLPkFCyjUDze+OqRHghA1Cn4fPoAafz+FXcl9c7LlEl9Xo0FH6/8yiCl7Rw2t780C/SBVxQ==} + '@langchain/langgraph@1.4.15': + resolution: {integrity: sha512-QG8led1xbFfgikAIF9E5G1Kp1KLtq/xv7YASWy+wnPftQw0Hxu0kpPXl0Q1U2Dfpwb8w/Vfz0QarUR8eI/xtRw==} engines: {node: '>=18'} peerDependencies: - '@langchain/core': '>=0.3.39 <0.4.0' - - '@langchain/openai@0.5.18': - resolution: {integrity: sha512-CX1kOTbT5xVFNdtLjnM0GIYNf+P7oMSu+dGCFxxWRa3dZwWiuyuBXCm+dToUGxDLnsHuV1bKBtIzrY1mLq/A1Q==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': '>=0.3.58 <0.4.0' + '@langchain/core': ^1.1.48 + zod: ^3.25.32 || ^4.2.0 '@langchain/openai@1.4.1': resolution: {integrity: sha512-jaHk4TnLqWrQ1KYmavvwCImW6x8pBy6LLTK73tzSMg7HBLbq0g/l7EkpMcxZWDOvyufuCXUqO2bj47apcOhw6Q==} @@ -4762,30 +4396,21 @@ packages: peerDependencies: '@langchain/core': ^1.1.39 + '@langchain/protocol@0.0.19': + resolution: {integrity: sha512-9hKcRrH7cBX6gfutdfXPoft1OCchHe4FEpALoDJMl5Qu+n/YG5ynZmyu8+8cxORlPwHBoKTxggvXz+76M1yX1Q==} + '@langchain/tavily@1.2.0': resolution: {integrity: sha512-aPLPgtw8+b/Rnr3H+X8H8z98T/Y7JuCE4B5eqRDHoEWgZvMDUFF7divqwQqCTMq2deQttlVrm5bN5JbKaAR7/w==} engines: {node: '>=20'} peerDependencies: '@langchain/core': ^1.0.0 - '@langchain/textsplitters@0.1.0': - resolution: {integrity: sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': '>=0.2.21 <0.4.0' - '@langchain/textsplitters@1.0.1': resolution: {integrity: sha512-rheJlB01iVtrOUzttscutRgLybPH9qR79EyzBEbf1u97ljWyuxQfCwIWK+SjoQTM9O8M7GGLLRBSYE26Jmcoww==} engines: {node: '>=20'} peerDependencies: '@langchain/core': ^1.0.0 - '@langchain/weaviate@0.2.3': - resolution: {integrity: sha512-WqNGn1eSrI+ZigJd7kZjCj3fvHBYicKr054qts2nNJ+IyO5dWmY3oFTaVHFq1OLFVZJJxrFeDnxSEOC3JnfP0w==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': '>=0.2.21 <0.4.0' - '@ledgerhq/devices@8.10.0': resolution: {integrity: sha512-ytT66KI8MizFX6dGJKthOzPDw5uNRmmg+RaMta62jbFePKYqfXtYTp6Wc0ErTXaL8nFS3IujHENwKthPmsj6jw==} @@ -4870,44 +4495,41 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 - '@mastra/core@1.21.0': - resolution: {integrity: sha512-DgFZpdvR1XR6tE/ocX+bhjlzGfjuSDPfiF0aWFYXpmvs66fKeLE/S/tWxkhWOPGr64e3fCU6U1GGOaPI1nh7OA==} + '@mastra/core@1.67.0': + resolution: {integrity: sha512-Z+kVa5SXpZ7c1xrycGOZ8tGFTDAeXYR+6rC8gAKY/m6Ac9dOPDaPCfQRmFHFxAgKIuxDj+bsauFPTnpkl9S4lw==} engines: {node: '>=22.13.0'} peerDependencies: zod: ^3.25.0 || ^4.0.0 - '@mastra/deployer@1.21.0': - resolution: {integrity: sha512-+B9z1bNCS+cXHHy8GRtNzYP9N5zjRucK3MicSc28fzPCxGib7SbqDJdLvUIRdtaxBLG9chKqM2enToPuALKwSQ==} + '@mastra/deployer@1.67.0': + resolution: {integrity: sha512-C1pDaZowdY0Kv337/A9rv7+HEWLYFTiRkLy5YLAAlz8JetssnMRNwHu2ftV6lIE54HQtqopMwKtlKyJaYXZ0jQ==} engines: {node: '>=22.13.0'} peerDependencies: - '@mastra/core': '>=1.0.0-0 <2.0.0-0' - zod: ^3.25.0 || ^4.0.0 + '@mastra/core': '>=1.50.0-0 <2.0.0-0' - '@mastra/loggers@1.1.0': - resolution: {integrity: sha512-SwEsBsckP3/00th4iV80k5/rj2OjaArIR8fedPq4MMnWS1a6HurXjnFF4ISGHuiTVvsx15a+3sRVy0IfSFp+QQ==} + '@mastra/loggers@1.3.2': + resolution: {integrity: sha512-8rw+hVlXFiw28UjZ6uaKlyXqsn55aOtyA3n+tVzPGU7+mg0FJmuGNKsIFDz+gaATi5b5vZPjPDgOXWZGRFYoAg==} engines: {node: '>=22.13.0'} peerDependencies: '@mastra/core': '>=1.0.0-0 <2.0.0-0' - '@mastra/mcp@1.4.1': - resolution: {integrity: sha512-LvFSh7NlKB7sMNfJKy/38h4QNN49Kqo6MmeM4mT6l3D8obUyYaFtrscmosuEoD7JnRx0ASuptGWKW0x+Afxp1Q==} + '@mastra/mcp@1.18.0': + resolution: {integrity: sha512-t9oO9N4YKgdW04h9dQ0M0WysE2INxRGEn8zkqcIrHkVg6kLSpu4pFMoI37v09cXrgzjcAI7uWRFAgBgRz2Kxwg==} engines: {node: '>=22.13.0'} peerDependencies: - '@mastra/core': '>=1.0.0-0 <2.0.0-0' - zod: ^3.25.0 || ^4.0.0 + '@mastra/core': '>=1.64.0-0 <2.0.0-0' - '@mastra/memory@1.13.0': - resolution: {integrity: sha512-fNAQ/C2ArKhmZwcRoy8oD1dEDKdIXyZrFMFX52GJzPcntlKx5YsL58BOB3kilFi/kFzfEE6h3nemv0CgI7l+SA==} + '@mastra/memory@1.30.0': + resolution: {integrity: sha512-rzl1tQLorwvHU6Ayi9T0ZiEiE/zKJGgPIpxmnZXTTJ9mn+Bs5FQ7tB4DHPidHNy1SVHRUwg3HRtqMX+nAeREaQ==} engines: {node: '>=22.13.0'} peerDependencies: '@mastra/core': '>=1.4.1-0 <2.0.0-0' - zod: ^3.25.0 || ^4.0.0 - '@mastra/pg@1.8.5': - resolution: {integrity: sha512-TNHA1KfgLrFjkjxuCDvn0s2Kqd9J4ivxbqGxOG4LA43SP8djYVoergigk5Us1JDktFIxGQru/HmS3HIOti0/tg==} + '@mastra/pg@1.25.0': + resolution: {integrity: sha512-RRgIRMBIKeCT/i5Mr8zFB1Pu6h9nLGui5Sd4C0wY454rOflexuHp1pUwlGsLRc3sB/79PhpAzPzyPkOoOV9ufQ==} engines: {node: '>=22.13.0'} peerDependencies: - '@mastra/core': '>=1.4.0-0 <2.0.0-0' + '@mastra/core': '>=1.63.1-0 <2.0.0-0' '@mastra/schema-compat@0.11.4': resolution: {integrity: sha512-oh3+enP3oYftZlmJAKQQj5VXR86KgTMwfMnwALZyLk04dPSWfVD2wGytoDg5Qbi3rX9qHj6g0rMNa0CUjR6aTg==} @@ -4915,19 +4537,22 @@ packages: ai: ^4.0.0 || ^5.0.0 zod: ^3.25.0 || ^4.0.0 - '@mastra/schema-compat@1.2.7': - resolution: {integrity: sha512-t63E0f5HcH8neXPfs3D5x4qqQM6Pf/pbhFUVk0cTC0bFo6609sT/+189I+2HY4sbAF3uzurOgy2fXIS4vfMkOA==} + '@mastra/schema-compat@1.3.10': + resolution: {integrity: sha512-ZrjvutWy3QJoJROA5PeSFdeFwDgyfGN1sOOObFirex9h9c/R4ReqRllCojNHSN0cKsKxkRlH6zBbWVTiybamUw==} engines: {node: '>=22.13.0'} peerDependencies: zod: ^3.25.0 || ^4.0.0 - '@mastra/server@1.21.0': - resolution: {integrity: sha512-VZTzNlsumEpibXjvDDyTbY9UzBgwa+TGO7CRReP+oaqfxu+kFi98ni9LuVGRQ8Hm9RhzuaO+PeRaVkxKgLN9oQ==} + '@mastra/server@1.67.0': + resolution: {integrity: sha512-tHez2qnKWMhfmjZrz6jFgSYxGAgIxm5Cb840qB7XmCr7o6Cjf1vlwOwCR4+112osBKu2lrnO0FNeNyg/7ueL/w==} engines: {node: '>=22.13.0'} peerDependencies: - '@mastra/core': '>=1.13.2-0 <2.0.0-0' + '@mastra/core': '>=1.50.0-0 <2.0.0-0' zod: ^3.25.0 || ^4.0.0 + '@mermaid-js/parser@1.2.1': + resolution: {integrity: sha512-n12NohV3mrUyUL2o93IgG/ifeW9FTyeJn3zDxkhwa8MJ9Fxg3HQMlA3RiGmD/3UnJvheztkjjQAjA2T4LmUcpw==} + '@meronex/icons@4.0.0': resolution: {integrity: sha512-WnoxUT02qawZSvsoPSwe7YOqOk0APysIHugiD3dYdc/QNeoigN4PD8mmmtmZFKlv8/Z7eERub0BmPkWcJ1BI+w==} peerDependencies: @@ -4936,6 +4561,38 @@ packages: '@microsoft/tsdoc@0.16.0': resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} + '@modelcontextprotocol/client@2.0.0': + resolution: {integrity: sha512-8f1OghQ2rjzIOfqgUCP+8GiUWqRs89njoWLNqAe8kWmDePv3s1fZXseej+QXemssEuuOvLLmLO/kqM3IQHtISw==} + engines: {node: '>=20'} + + '@modelcontextprotocol/core@2.0.0': + resolution: {integrity: sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==} + engines: {node: '>=20'} + + '@modelcontextprotocol/ext-apps@1.7.5': + resolution: {integrity: sha512-TjPH2S2y5UEGKhmI6+XGFuqfqOV4ppe1x6DA3txnUaEWkgtA4G5vo14jGKFZmegdkZ1H4QMLyujLvoU1BEdnAg==} + engines: {node: '>=20'} + peerDependencies: + '@modelcontextprotocol/sdk': ^1.29.0 + react: 19.2.4 + react-dom: 19.2.4 + zod: ^3.25.0 || ^4.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@modelcontextprotocol/node@2.0.0': + resolution: {integrity: sha512-Y4hAC2XdGDUdDOCbLDOCA4+aL3NUldjsOWlDL/YwpAxrPhRm1xHd7lZ+mLacvZ9t3PaH28wgNoaLQGrIk1P2pg==} + engines: {node: '>=20'} + peerDependencies: + '@modelcontextprotocol/server': ^2.0.0 + hono: ^4.11.4 + peerDependenciesMeta: + hono: + optional: true + '@modelcontextprotocol/sdk@1.27.1': resolution: {integrity: sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==} engines: {node: '>=18'} @@ -4946,6 +4603,30 @@ packages: '@cfworker/json-schema': optional: true + '@modelcontextprotocol/sdk@1.30.0': + resolution: {integrity: sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + + '@modelcontextprotocol/server-legacy@2.0.0': + resolution: {integrity: sha512-LnffC1BSqFMHtMQxEz92lqDpHWma+ErV3ghdHDgdkCyYzVcCYKcUT5loq4kflty+Bf9C9qjJqbnphyBWyCqo8Q==} + engines: {node: '>=20'} + deprecated: This package is a frozen copy of v1's SSE transport and OAuth Authorization Server helpers for migration purposes only. Use StreamableHTTP from @modelcontextprotocol/server and a dedicated OAuth server in production. Will not receive new features. + peerDependencies: + express: ^4.18.0 || ^5.0.0 + peerDependenciesMeta: + express: + optional: true + + '@modelcontextprotocol/server@2.0.0': + resolution: {integrity: sha512-YhHWdHfpFMQfd0prsEnxKeS3Qz3ytIGmsS0sth4KDjnacIT7hxk6hXHkJ9KysxlkvTM+WZAtQbbcUhdoP4Hvtw==} + engines: {node: '>=20'} + '@mole-inc/bin-wrapper@8.0.1': resolution: {integrity: sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5076,6 +4757,12 @@ packages: '@types/react': optional: true + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + '@napi-rs/nice-android-arm-eabi@1.1.1': resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} engines: {node: '>= 10'} @@ -6419,30 +6106,27 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@poppinss/colors@4.1.6': - resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} - - '@poppinss/dumper@0.6.5': - resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} - - '@poppinss/exception@1.2.3': - resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} - '@posthog/core@1.23.2': resolution: {integrity: sha512-zTDdda9NuSHrnwSOfFMxX/pyXiycF4jtU1kTr8DL61dHhV+7LF6XF1ndRZZTuaGGbfbb/GJYkEsjEX9SXfNZeQ==} - '@posthog/core@1.7.1': - resolution: {integrity: sha512-kjK0eFMIpKo9GXIbts8VtAknsoZ18oZorANdtuTj1CbgS28t4ZVq//HAWhnxEuXRTrtkd+SUJ6Ux3j2Af8NCuA==} + '@posthog/core@1.54.2': + resolution: {integrity: sha512-p0NuMjiZkploKG/aASj4nw4QDuhF87SIFWkelaFRrr3G0Myb7KWWUZot2hm5qXpPx7zKozVZJrJkGzC2kGBqbg==} '@posthog/types@1.359.1': resolution: {integrity: sha512-oQihoHWLnOkSkzOToCWKNigbJ7UZcIkl+rSJuq2PLwL7EB0Q/r1UGSbVCkrPH8xtPbYpi7w4TVpMrg41TMT+LQ==} + '@posthog/types@1.412.1': + resolution: {integrity: sha512-FxXsb9YOOME8bJI5K09qKeSvLjnZQ2dPV7wZpI7a8sERQtXkAuhBcPB/balCnVE7TYwhgtHj5NQss9BgQ5bAfQ==} + '@postiz/wallets@0.0.1': resolution: {integrity: sha512-zCkg5ZXHZkyCREvoAtxQAp5IoCYfSQs9xonzyMvV/LoY32KjudV5wc4rb4R7NYNdPTGfcni1R8ETojASnK6oUw==} engines: {node: '>=16'} peerDependencies: '@solana/web3.js': ^1.77.3 + '@preact/signals-core@1.14.4': + resolution: {integrity: sha512-HNB6HYeYKhQbJ1aKl+YRjrS4+QWHLKX6qKoUsfS/m0vqzsVaEBiZiaKbG/e+NKk2ch5ALQr/ihWaMHxiCuuWHA==} + '@prisma/client@6.5.0': resolution: {integrity: sha512-M6w1Ql/BeiGoZmhMdAZUXHu5sz5HubyVcKukbLs3l0ELcQb8hTUJxtGEChhv4SVJ0QJlwtLnwOLgIRQhpsm9dw==} engines: {node: '>=18.18'} @@ -6527,6 +6211,35 @@ packages: '@radix-ui/primitive@1.1.3': resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + '@radix-ui/primitive@1.1.7': + resolution: {integrity: sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==} + + '@radix-ui/react-arrow@1.1.15': + resolution: {integrity: sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.15': + resolution: {integrity: sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-compose-refs@1.0.0': resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} peerDependencies: @@ -6541,6 +6254,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-compose-refs@1.1.5': + resolution: {integrity: sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-context@1.0.0': resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} peerDependencies: @@ -6555,6 +6277,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-context@1.2.2': + resolution: {integrity: sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dialog@1.0.0': resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==} peerDependencies: @@ -6579,6 +6310,15 @@ packages: peerDependencies: react: 19.2.4 + '@radix-ui/react-direction@1.1.4': + resolution: {integrity: sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dismissable-layer@1.0.0': resolution: {integrity: sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==} peerDependencies: @@ -6598,6 +6338,32 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dismissable-layer@1.1.19': + resolution: {integrity: sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.24': + resolution: {integrity: sha512-geq8l2rJkxvkXsT9RMgtUE3P8pITFpTsvYpbySi1IH4fZEABD/Gp85myayFgxk0ktljGMJnCbeFkyTusvSvv7g==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-focus-guards@1.0.0': resolution: {integrity: sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==} peerDependencies: @@ -6612,12 +6378,34 @@ packages: '@types/react': optional: true + '@radix-ui/react-focus-guards@1.1.6': + resolution: {integrity: sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-focus-scope@1.0.0': resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==} peerDependencies: react: 19.2.4 react-dom: 19.2.4 + '@radix-ui/react-focus-scope@1.1.16': + resolution: {integrity: sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-focus-scope@1.1.7': resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} peerDependencies: @@ -6645,6 +6433,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-id@1.1.4': + resolution: {integrity: sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-label@2.1.8': resolution: {integrity: sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==} peerDependencies: @@ -6658,12 +6455,51 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-menu@2.1.24': + resolution: {integrity: sha512-uW7RVuU6Lp/ZtfeY4b3kL32zccgEWvPv1+cf17ubYzHa9cL8AHokmk36cG/XEiH/smbQvumnieXX9j/e9RqJWA==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.3.7': + resolution: {integrity: sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-portal@1.0.0': resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==} peerDependencies: react: 19.2.4 react-dom: 19.2.4 + '@radix-ui/react-portal@1.1.17': + resolution: {integrity: sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-portal@1.1.9': resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} peerDependencies: @@ -6683,6 +6519,19 @@ packages: react: 19.2.4 react-dom: 19.2.4 + '@radix-ui/react-presence@1.1.10': + resolution: {integrity: sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-presence@1.1.5': resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} peerDependencies: @@ -6708,6 +6557,19 @@ packages: react: 19.2.4 react-dom: 19.2.4 + '@radix-ui/react-primitive@2.1.10': + resolution: {integrity: sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-primitive@2.1.3': resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} peerDependencies: @@ -6734,6 +6596,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-roving-focus@1.1.19': + resolution: {integrity: sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-scroll-area@1.0.2': resolution: {integrity: sha512-k8VseTxI26kcKJaX0HPwkvlNBPTs56JRdYzcZ/vzrNUkDlvXBy8sMc7WvCpYzZkHgb+hd72VW9MqkqecGtuNgg==} peerDependencies: @@ -6781,6 +6656,28 @@ packages: '@types/react': optional: true + '@radix-ui/react-slot@1.3.3': + resolution: {integrity: sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-tooltip@1.2.16': + resolution: {integrity: sha512-6EamKFRRnlpdadndbZ6LMwycfwkwPte1B42hs6QA0gYhjaOKqW4PZ4pjaW9UrlDX5eVt/OjncE7BFTPL5nmZhg==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-use-callback-ref@1.0.0': resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} peerDependencies: @@ -6795,6 +6692,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-callback-ref@1.1.4': + resolution: {integrity: sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-controllable-state@1.0.0': resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} peerDependencies: @@ -6809,6 +6715,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-controllable-state@1.2.6': + resolution: {integrity: sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-effect-event@0.0.2': resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} peerDependencies: @@ -6818,6 +6733,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-effect-event@0.0.5': + resolution: {integrity: sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-escape-keydown@1.0.0': resolution: {integrity: sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==} peerDependencies: @@ -6832,6 +6756,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-is-hydrated@0.1.3': + resolution: {integrity: sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-layout-effect@1.0.0': resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} peerDependencies: @@ -6846,6 +6779,49 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-layout-effect@1.1.4': + resolution: {integrity: sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.4': + resolution: {integrity: sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.4': + resolution: {integrity: sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.11': + resolution: {integrity: sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.3': + resolution: {integrity: sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==} + '@react-aria/focus@3.21.5': resolution: {integrity: sha512-V18fwCyf8zqgJdpLQeDU5ZRNd9TeOfBbhLgmX77Zr5ae9XwaoJ1R3SFJG1wCJX60t34AW+aLZSEEK+saQElf3Q==} peerDependencies: @@ -6992,6 +6968,9 @@ packages: '@remirror/core-constants@3.0.0': resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + '@remix-run/node-fetch-server@0.13.3': + resolution: {integrity: sha512-UfjOXed/DQteaM5VyTfqTeGpHwyL2J5aoRGY6cydip4tt1ehNNeSwuXCC7AEGE0RWBs/7bgKxYkL/B/+UDe4AA==} + '@reown/appkit-common@1.7.2': resolution: {integrity: sha512-DZkl3P5+Iw3TmsitWmWxYbuSCox8iuzngNp/XhbNDJd7t4Cj4akaIUxSEeCajNDiGHlu4HZnfyM1swWsOJ0cOw==} @@ -7108,15 +7087,6 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@rollup/plugin-alias@6.0.0': - resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} - engines: {node: '>=20.19.0'} - peerDependencies: - rollup: '>=4.0.0' - peerDependenciesMeta: - rollup: - optional: true - '@rollup/plugin-commonjs@28.0.1': resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==} engines: {node: '>=16.0.0 || 14 >= 14.17'} @@ -7185,126 +7155,251 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.63.3': + resolution: {integrity: sha512-w3Jnvi1ocaVm/c7yVPpfB98XeSRBMyzp6njL5MVVbGyXjpmUkN+s6Hp4t0PqhGCCaI1ZHMKXt/w0lA1RCaLVcw==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.59.0': resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.63.3': + resolution: {integrity: sha512-uI/ESiaIbbRYAEhzy8PCUWDp1hB0bjAqM06mW9flOoNO4Q8DQpeoREhBR5Hegfl+wpXiguyJv6XSPzEN7OxyHQ==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.59.0': resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.63.3': + resolution: {integrity: sha512-oxhrd1jmXLwWZ83eQYDXxuqRdkqkzrjR3JobKeuUyfdNZo11FuQIvqEOZhyIT7OBHxXoGslDDjN0cQcM6T0TqQ==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.59.0': resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.63.3': + resolution: {integrity: sha512-7/YiIMghVE8DrxKvNdorAaJVdriOFgOIpdStnPx8ppx5zfTwC3jBCSEAIzB7JD5404m65THl6H93UTTVUvypmg==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.59.0': resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.63.3': + resolution: {integrity: sha512-GXFZRRoMAytaI5z6N3Zhfw0WL18Q0M8r95D5hlC4GqE/lGk8pbSJNUBoOWDfbm6dTciqHj2nU87tI5f6XhQiOg==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.59.0': resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.63.3': + resolution: {integrity: sha512-77W+8X3ddYgPxUpB8nZFQs2Mq+wc4HVlcSRtApXLjYBcnPMkttrSnU8VwKQjeWYhMsITHFs5cWBQ8vz1Q+5RHQ==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.63.3': + resolution: {integrity: sha512-FVkwK+iUC+mq+GipVK46rRVticfAPtvPUNlqlGXUDxdVk/UGjQiiiUVPUrEXdSpU2ufU0XxLGyTqDtBidDOVmg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.59.0': resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.63.3': + resolution: {integrity: sha512-+aGU1t3398yQOVj1Bz8o3e+KtswxAPvO+mtxtNdfXYMkXIHu7XhhkCD7/DEH9q8tF8uhDnMWvfpUKI8y1sZJsg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.59.0': resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.63.3': + resolution: {integrity: sha512-cR0kjpRXR2KJ2oQK8E2KTPtphs+b9hZ8IhTZubNryt/RsqgdOZBQ2Zq0q5UedtiIi0rs3jVhJh55RE1ZHUVGUA==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.59.0': resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.63.3': + resolution: {integrity: sha512-y1RYi4Q3/9ByVWSSt9kX2ustE0B7kFYbJ6zZdVZVyqopZs3yhCTwRfrjIX4vezUJInma/Gs6BOFDJg7yZmJ0IQ==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.59.0': resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.63.3': + resolution: {integrity: sha512-DNhEA5viIj3Z5bZLE4z4oV8N5ozWqDwyt7T6KG7VdLDJ0nW+rNOYlphBl4/3HQkK75qipPLsVOfStHHOwN9WSg==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-loong64-musl@4.59.0': resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] + '@rollup/rollup-linux-loong64-musl@4.63.3': + resolution: {integrity: sha512-17gQCqrIpXBX2Cmi9/TygnVOqGbzsba/iaqcYSL8FY7lNugg+7AiYNs5c5nKWD+NRQha36Sa0CqkJqH4XVHwnQ==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.59.0': resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.63.3': + resolution: {integrity: sha512-6LwVnZRIyINpdku/yOcI8Tm9YqLmhHK5emmlOOnW9tO0SYEm1FmKPcsSAGp0NBlqR2P04xaND4jvN6sTHqhq8A==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-ppc64-musl@4.59.0': resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-ppc64-musl@4.63.3': + resolution: {integrity: sha512-xMUqkTXlEUtI/p5AAukMwBRr1enU3efsTeF+bskeFfk8t1C9rcC8sLREcZXmTfAXEbvRdJVSonVJez3TMlbR3w==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.59.0': resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.63.3': + resolution: {integrity: sha512-S3E94co9F9WRRqEaUoQZ38K1gCz6KiM+nL7/3ijq7fDGF3OznjS5TasgYITlvl27GQKtu4lOAOsr5MFwkijvOA==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.59.0': resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.63.3': + resolution: {integrity: sha512-1QtRDwG42x5BJI3s9mxu5rEjDnfbSnk20HQ9/ylTAYnSwYwxMVb+Vgu34wzzTQ7ogqBybebgQNUDAvZVQ38DbA==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.59.0': resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.63.3': + resolution: {integrity: sha512-BQhejF6ZXOpxbngiNTP12GCGQeaDVL2QXGeBVViKIYzFHM5RKxTxwUMB1fr1BeNFphFMpnRqC5QSXFSa4z6UQw==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.59.0': resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.63.3': + resolution: {integrity: sha512-SXagRwnI2Wlwlitllu59UK/nGVbD1CKPcNqDplHwIC4BqJcpXFjD32d1R/RbuISa95HdQrZM3/7v4bKiowFaLA==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.59.0': resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.63.3': + resolution: {integrity: sha512-2IPozoEALRCziGqE8O9KMK60PMu5TS1huv4fwoeCexj+WjmcwFtX9CTOVbfXCUqcELAubEwRFPYlzb/WvwY2HQ==} + cpu: [x64] + os: [linux] + '@rollup/rollup-openbsd-x64@4.59.0': resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} cpu: [x64] os: [openbsd] + '@rollup/rollup-openbsd-x64@4.63.3': + resolution: {integrity: sha512-AoxqosUHT9IX54hFn2TiN6A7d6ZKTtE6pd2bqWtqkkNJ6HJGaU6FRouGX8L1O7R/ZwsnCnpQrHzb4pDEx+UHRQ==} + cpu: [x64] + os: [openbsd] + '@rollup/rollup-openharmony-arm64@4.59.0': resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} cpu: [arm64] os: [openharmony] + '@rollup/rollup-openharmony-arm64@4.63.3': + resolution: {integrity: sha512-d+CaftKgmkFBzCwezMqqy1d0QNNYugqLCMcYVQWBy5SS2YfeMP8Q8ripkgx9O8IyBXXLHrJ+aaCV4U96usv6Yg==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.59.0': resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.63.3': + resolution: {integrity: sha512-xXlDF6nR1eOuXbdDy5Hl5fmtY7teUDevF/k0O7IPoZe4Tpmdv+lgdE5JRsnhQtt37ql9P0VF2kAN9a0OCZdo+Q==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.59.0': resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.63.3': + resolution: {integrity: sha512-YtXAgLN+JP7Ay6qG3eWhc7IHMQPzLc8r3uvhAvlJIoCz/4Q32+Bl9Fmnywidh8v1GOIMmymjovfqY9ETAtysvA==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-gnu@4.59.0': resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-gnu@4.63.3': + resolution: {integrity: sha512-WuWtSJRNo549vzcfZyEgfqb6zeSgn1F+UE5kQ+BCjzz0W4MGCjntUHkZVc1VRuAM7+ULaSyhiPxD1spyewFvkQ==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.59.0': resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.63.3': + resolution: {integrity: sha512-+lIKX7O0+IGe7WuhATaAMMeT7B76vfhXH/l9wLQL+nvyhbw2ohYCKIdWL56JfDu75CWt5oKRP4QFH/jkMtBquA==} + cpu: [x64] + os: [win32] + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -7523,6 +7618,27 @@ packages: peerDependencies: webpack: '>=5.0.0' + '@shikijs/core@3.23.0': + resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} + + '@shikijs/engine-javascript@3.23.0': + resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==} + + '@shikijs/engine-oniguruma@3.23.0': + resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + + '@shikijs/langs@3.23.0': + resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + + '@shikijs/themes@3.23.0': + resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + + '@shikijs/types@3.23.0': + resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sinclair/typebox@0.27.10': resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} @@ -7530,10 +7646,6 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - '@sindresorhus/is@7.2.0': - resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} - engines: {node: '>=18'} - '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} @@ -7552,6 +7664,32 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@slack/bolt@4.7.3': + resolution: {integrity: sha512-bODs8q/yNDWUPoxmQhFrRqLMA5vhB/PDizYWqb6CkQhLWEUo5JFtfJcmeU4ElGl6qSt++OKjSYNa4MPc77CleQ==} + engines: {node: '>=18', npm: '>=8.6.0'} + peerDependencies: + '@types/express': ^5.0.0 + + '@slack/logger@4.0.1': + resolution: {integrity: sha512-6cmdPrV/RYfd2U0mDGiMK8S7OJqpCTm7enMLRR3edccsPX8j7zXTLnaEF4fhxxJJTAIOil6+qZrnUPTuaLvwrQ==} + engines: {node: '>= 18', npm: '>= 8.6.0'} + + '@slack/oauth@3.0.5': + resolution: {integrity: sha512-exqFQySKhNDptWYSWhvRUJ4/+ndu2gayIy7vg/JfmJq3wGtGdHk531P96fAZyBm5c1Le3yaPYqv92rL4COlU3A==} + engines: {node: '>=18', npm: '>=8.6.0'} + + '@slack/socket-mode@2.0.7': + resolution: {integrity: sha512-qYy07je71WnEHgRwmw12DlAnZLi5HXmdlI2WUzUK2LH/rYXQpP6uEg462S5CwfE8FoCKUdIigHtYnOOfzZH1lQ==} + engines: {node: '>= 18', npm: '>= 8.6.0'} + + '@slack/types@2.22.0': + resolution: {integrity: sha512-sZ9lIgJhPX2qft/tKWiklFlc0o1FWeI7QtciZJfW1+ErH1eGGHvOZ8e73sleTCFEFJp1q/R0WeS8Oa7AsiDprg==} + engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} + + '@slack/web-api@7.19.0': + resolution: {integrity: sha512-ItjyjEZml+LDH8CjcCLRLJHh7VZtevPKExrRN3l5KWyBliyDnGAeoO4Y+K+fFBmRpKLYVPgqWMX4THldv2HVtA==} + engines: {node: '>= 18', npm: '>= 8.6.0'} + '@smithy/abort-controller@4.2.11': resolution: {integrity: sha512-Hj4WoYWMJnSpM6/kchsm4bUNTL9XiSyhvoMb2KIq4VJzyDt7JpGHUZHkVNPZVC7YE1tf8tPeVauxpFBKGW4/KQ==} engines: {node: '>=18.0.0'} @@ -7692,6 +7830,10 @@ packages: resolution: {integrity: sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw==} engines: {node: '>=18.0.0'} + '@smithy/types@4.18.0': + resolution: {integrity: sha512-CgB6HHWer/vrKps24ulRIbpcpb7K4xAU7SkZ7YHzBPlwHsvsrCJFEXK421s+cJzX+ZrqtA/TuU5w1HzI7k9N8A==} + engines: {node: '>=18.0.0'} + '@smithy/url-parser@4.2.11': resolution: {integrity: sha512-oTAGGHo8ZYc5VZsBREzuf5lf2pAurJQsccMusVZ85wDkX66ojEc/XauiGjzCj50A61ObFTPe6d7Pyt6UBYaing==} engines: {node: '>=18.0.0'} @@ -8127,70 +8269,6 @@ packages: peerDependencies: '@solana/web3.js': '*' - '@speed-highlight/core@1.2.24': - resolution: {integrity: sha512-qeW2e1l78afw8VhRPfPQ1Gjj+KU5XFQ/OFV5ti6eTa9bruO7mJyZtA4vw0ofqmA3tKCkROE9xLk3VZoeRc98nw==} - - '@standard-community/standard-json@0.3.5': - resolution: {integrity: sha512-4+ZPorwDRt47i+O7RjyuaxHRK/37QY/LmgxlGrRrSTLYoFatEOzvqIc85GTlM18SFZ5E91C+v0o/M37wZPpUHA==} - peerDependencies: - '@standard-schema/spec': ^1.0.0 - '@types/json-schema': ^7.0.15 - '@valibot/to-json-schema': ^1.3.0 - arktype: ^2.1.20 - effect: ^3.16.8 - quansync: ^0.2.11 - sury: ^10.0.0 - typebox: ^1.0.17 - valibot: ^1.1.0 - zod: ^3.25.0 || ^4.0.0 - zod-to-json-schema: ^3.24.5 - peerDependenciesMeta: - '@valibot/to-json-schema': - optional: true - arktype: - optional: true - effect: - optional: true - sury: - optional: true - typebox: - optional: true - valibot: - optional: true - zod: - optional: true - zod-to-json-schema: - optional: true - - '@standard-community/standard-openapi@0.2.9': - resolution: {integrity: sha512-htj+yldvN1XncyZi4rehbf9kLbu8os2Ke/rfqoZHCMHuw34kiF3LP/yQPdA0tQ940y8nDq3Iou8R3wG+AGGyvg==} - peerDependencies: - '@standard-community/standard-json': ^0.3.5 - '@standard-schema/spec': ^1.0.0 - arktype: ^2.1.20 - effect: ^3.17.14 - openapi-types: ^12.1.3 - sury: ^10.0.0 - typebox: ^1.0.0 - valibot: ^1.1.0 - zod: ^3.25.0 || ^4.0.0 - zod-openapi: ^4 - peerDependenciesMeta: - arktype: - optional: true - effect: - optional: true - sury: - optional: true - typebox: - optional: true - valibot: - optional: true - zod: - optional: true - zod-openapi: - optional: true - '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -8498,12 +8576,24 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 || ^7 + '@tanstack/devtools-event-client@0.4.4': + resolution: {integrity: sha512-6T5Yop/793YI+H+5J8Hsyj4kCih9sl4t3ElLgKioW5hk3ocn+ZdSJ94tT7vL7uabxSugWYBZlOTMPzEw2puvQw==} + engines: {node: '>=18'} + hasBin: true + + '@tanstack/pacer@0.20.1': + resolution: {integrity: sha512-ZNQ1bIL6eUXVKdic0tiImvBVkWrg/IoSK6VIacTrO3d3HAGnd70qFJNJagR/YOJIOw4EKGWnodwpYZkN1pWuVQ==} + engines: {node: '>=18'} + '@tanstack/react-virtual@3.13.21': resolution: {integrity: sha512-SYXFrmrbPgXBvf+HsOsKhFgqSe4M6B29VHOsX9Jih9TlNkNkDWx0hWMiMLUghMEzyUz772ndzdEeCEBx+3GIZw==} peerDependencies: react: 19.2.4 react-dom: 19.2.4 + '@tanstack/store@0.9.3': + resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} + '@tanstack/virtual-core@3.13.21': resolution: {integrity: sha512-ww+fmLHyCbPSf7JNbWZP3g7wl6SdNo3ah5Aiw+0e9FDErkVHLKprYUrwTm7dF646FtEkN/KkAKPYezxpmvOjxw==} @@ -8852,9 +8942,6 @@ packages: '@types/caseless@0.12.5': resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@types/chrome@0.0.319': resolution: {integrity: sha512-k+E1b3VrWEj7OqQ22cPxHs3o/jrYWEEDGaocwjlIGtul+WrAn1vaBANc0iurgm0aXkyIVs7aH3ce0lpr96XYhw==} @@ -8875,12 +8962,102 @@ packages: '@types/cors@2.8.19': resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.7': + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.1': + resolution: {integrity: sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.4': + resolution: {integrity: sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.12': + resolution: {integrity: sha512-Qe/KWYhEiIIxGs7HrAAjMfShxKldx19SJtr5zu53f3afPsdZNz7HHtdTLXo/kqeiWNXVycI24kSnfzBYkTzpgw==} + + '@types/d3-shape@3.2.0': + resolution: {integrity: sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/diff-match-patch@1.0.36': resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} @@ -8902,6 +9079,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/express-serve-static-core@4.19.8': resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} @@ -8923,6 +9103,12 @@ packages: '@types/filewriter@0.0.33': resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} + '@types/gensync@1.0.5': + resolution: {integrity: sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -8959,6 +9145,9 @@ packages: '@types/jsdom@20.0.1': resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -9073,6 +9262,9 @@ packages: '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + '@types/qrcode@1.5.5': + resolution: {integrity: sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==} + '@types/qs@6.15.0': resolution: {integrity: sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==} @@ -9639,6 +9831,9 @@ packages: peerDependencies: '@uppy/core': ^4.5.2 + '@upsetjs/venn.js@2.0.0': + resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} + '@upstash/redis@1.36.3': resolution: {integrity: sha512-wxo1ei4OHDHm4UGMgrNVz9QUEela9N/Iwi4p1JlHNSowQiPi+eljlGnfbZVkV0V4PIrjGtGFJt5GjWM5k28enA==} @@ -9670,9 +9865,6 @@ packages: '@vitest/expect@3.1.4': resolution: {integrity: sha512-xkD/ljeliyaClDYqHPNCiJ0plY5YIcM0OlRiZizLhlPmpXWpxnGMyTZXOHFhFeG7w9P5PBeL4IdtJ/HeQwTbQA==} - '@vitest/expect@4.1.10': - resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} - '@vitest/mocker@3.1.4': resolution: {integrity: sha512-8IJ3CvwtSw/EFXqWFL8aCMu+YyYXG2WUSrQbViOZkWTKTVicVwZ/YiEZDSqD00kX+v/+W+OnxhNWoeVKorHygA==} peerDependencies: @@ -9684,44 +9876,21 @@ packages: vite: optional: true - '@vitest/mocker@4.1.10': - resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} - peerDependencies: - msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - '@vitest/pretty-format@3.1.4': resolution: {integrity: sha512-cqv9H9GvAEoTaoq+cYqUTCGscUjKqlJZC7PRwY5FMySVj5J+xOm1KQcCiYHJOEzOKRUhLH4R2pTwvFlWCEScsg==} '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/pretty-format@4.1.10': - resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} - '@vitest/runner@3.1.4': resolution: {integrity: sha512-djTeF1/vt985I/wpKVFBMWUlk/I7mb5hmD5oP8K9ACRmVXgKTae3TUOtXAEBfslNKPzUQvnKhNd34nnRSYgLNQ==} - '@vitest/runner@4.1.10': - resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} - '@vitest/snapshot@3.1.4': resolution: {integrity: sha512-JPHf68DvuO7vilmvwdPr9TS0SuuIzHvxeaCkxYcCD4jTk67XwL45ZhEHFKIuCm8CYstgI6LZ4XbwD6ANrwMpFg==} - '@vitest/snapshot@4.1.10': - resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} - '@vitest/spy@3.1.4': resolution: {integrity: sha512-Xg1bXhu+vtPXIodYN369M86K8shGLouNjoVI78g8iAq2rFoHFdajNvJJ5A/9bPMFcfQqdaCpOgWKEoMQg/s0Yg==} - '@vitest/spy@4.1.10': - resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} - '@vitest/ui@1.6.0': resolution: {integrity: sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==} peerDependencies: @@ -9733,9 +9902,6 @@ packages: '@vitest/utils@3.1.4': resolution: {integrity: sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg==} - '@vitest/utils@4.1.10': - resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} - '@wallet-standard/app@1.1.0': resolution: {integrity: sha512-3CijvrO9utx598kjr45hTbbeeykQrQfKmSnxeWOgU25TOEpvcipD/bYDQWIqUv1Oc6KK4YStokSMu/FBNecGUQ==} engines: {node: '>=16'} @@ -9928,6 +10094,12 @@ packages: resolution: {integrity: sha512-kMwLlxUbduttIgaPdSkmEarFpP+mSY8FEm+QWMBRJwxOHWkri+cxd8KZHO9EMrB9vgUuz+5WEaCawaL5wGVoXg==} engines: {node: '>=18.0.0'} + '@workflow/serde@4.1.0': + resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==} + + '@workflow/serde@4.1.0-beta.2': + resolution: {integrity: sha512-8kkeoQKLDaKXefjV5dbhBj2aErfKp1Mc4pb6tj8144cF+Em5SPbyMbyLCHp+BVrFfFVCBluCtMx+jjvaFVZGww==} + '@wyw-in-js/processor-utils@0.5.5': resolution: {integrity: sha512-L3IcAfoowhM0fw9Cnv2CNzfjWNLKpYl2CFqam6NvwpiXNR1kXz/GpO0AOiKvCs5h4Ps5kWxE2e8knXLpk8q/2g==} engines: {node: '>=16.0.0'} @@ -9946,9 +10118,6 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - '@zeit/schemas@2.36.0': - resolution: {integrity: sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==} - abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead @@ -9982,12 +10151,6 @@ packages: zod: optional: true - abort-controller-x@0.4.3: - resolution: {integrity: sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA==} - - abort-controller-x@0.5.0: - resolution: {integrity: sha512-yTt9CI0x+nRfX6BFMenEGP8ooPvErGH6AbFz20C2IeOLIlDsrw/VHpgne3GsCEuTA410IiFiaLVFKmgM4bKEPQ==} - abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -10063,6 +10226,12 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 + ai@6.0.285: + resolution: {integrity: sha512-WfcHLHP8TvheInKofMlfpNzssKJ8HrqUNcQcjzAU28f9SFCYwEHhSjRu6m5saSvGcrObRG2ozXEv0IJWlEWVxA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -10095,12 +10264,12 @@ packages: ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + anser@1.4.10: resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} - ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -10157,6 +10326,10 @@ packages: arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + archiver@8.0.0: + resolution: {integrity: sha512-fV1orZfsnPn9BaSByR/qE67rJCLJEy2Ox5bq7nJh+jquWaNh6Sfec75kJ2T6PtdGUbPQlrVoSVCEOa5SdiTQ1g==} + engines: {node: '>=18'} + are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} @@ -10276,6 +10449,9 @@ packages: async-mutex@0.5.0: resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -10322,6 +10498,14 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + b4a@1.9.0: + resolution: {integrity: sha512-dpfcF9fDNR6++cthXR67iyhgqWy9CBouAvIWhIntzBG6cvK/cnIPiZQjBwi/ZqjjBEDGfoNDtmB0kTjroOJ3pQ==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10385,6 +10569,43 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + bare-events@2.9.2: + resolution: {integrity: sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.8.1: + resolution: {integrity: sha512-N1nnXdHZAOSstz0XiHikGS4HGMH4CnSwhqWdGQQMqqdvp4Jybm9sE3R1WVnpWVd4SFkc8ryPDBLViNLwiEqECg==} + engines: {bare: '>=1.28.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-path@3.1.2: + resolution: {integrity: sha512-ZyKbsuuqK6Ag0K8pX6V5Txq6XeJRvY+wXucnFGRjiyVYP9YWDpIQugk/b+enRYrEYBJaqLzghRQpXPMR7341Nw==} + + bare-stream@2.13.4: + resolution: {integrity: sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA==} + peerDependencies: + bare-abort-controller: '*' + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.5.4: + resolution: {integrity: sha512-Gxa7UVWBr0/edU1b+TJhn/AZvMQUj9OGspvYsaTYQrAbZA4BOTZGL3LiZxvD+CeMlDH4juwD84+eTAp/bLYW5g==} + base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} @@ -10463,9 +10684,6 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - blake3-wasm@2.1.5: - resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} - bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} @@ -10498,10 +10716,6 @@ packages: bowser@2.14.1: resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} - boxen@7.0.0: - resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==} - engines: {node: '>=14.16'} - brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -10563,6 +10777,10 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -10572,6 +10790,9 @@ packages: buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + buffer@5.6.0: + resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -10646,10 +10867,6 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - caniuse-lite@1.0.30001777: resolution: {integrity: sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==} @@ -10673,22 +10890,10 @@ packages: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} - chai@6.2.2: - resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} - engines: {node: '>=18'} - - chalk-template@0.4.0: - resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} - engines: {node: '>=12'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.0.1: - resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -10703,21 +10908,12 @@ packages: character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} @@ -10731,6 +10927,21 @@ packages: resolution: {integrity: sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==} engines: {pnpm: '>=8'} + chat@4.40.0: + resolution: {integrity: sha512-slu3VDxItlelEZ8A5vqzlmtT2WErqj2YCGuhhcNx+Ev0+wHeBUqUDUA7hXkca+BfFtW1ZX7ECcySCTG2q2gefg==} + engines: {node: '>=20'} + peerDependencies: + ai: ^6.0.182 || ^7.0.0 + workflow: ^5.0.0-beta.35 + zod: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + ai: + optional: true + workflow: + optional: true + zod: + optional: true + check-error@2.1.3: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} @@ -10781,15 +10992,16 @@ packages: resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==} engines: {node: '>= 0.10'} - cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} cjs-module-lexer@2.2.0: resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} + clarinet@0.12.6: + resolution: {integrity: sha512-0FR+TrvLbYHLjhzs9oeIbd3yfZmd4u2DzYQEjUTm2dNfh4Y/9RIRWPjsm3aBtrVEpjKI7+lWa4ouqEXoml84mQ==} + engines: {chrome: '>=16.0.912', firefox: '>=0.8.0', node: '>=0.3.6'} + class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} @@ -10805,6 +11017,9 @@ packages: class-variance-authority@0.6.1: resolution: {integrity: sha512-eurOEGc7YVx3majOrOb099PNKgO3KnKSApOprXI4BTq6bcfbqbQXPN2u+rPPmIJ2di23bMwhk0SxCCthBmszEQ==} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + classnames@2.3.1: resolution: {integrity: sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==} @@ -10815,10 +11030,6 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} - cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -10838,10 +11049,6 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - clipboardy@3.0.0: - resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -10920,9 +11127,6 @@ packages: comlink@4.4.2: resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==} - comma-separated-tokens@1.0.8: - resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -10975,6 +11179,10 @@ packages: resolution: {integrity: sha512-4m5s3Me2xxlVKG9PkZpQqHQR7bgpnN7joDMJ4yvVkVXngjoITG76IaZmzmywSeRTeTpc6N6r3H3+KyUurV8OYw==} engines: {node: '>=18'} + compress-commons@7.0.1: + resolution: {integrity: sha512-g0S8KAD8qf4+V//pr3BfB1aBnARLXNz2Gx+jmHU0LEriUuoQUOPOulVquHKTJ8+EAIIO7fhseNDr9wK5Q9FKBQ==} + engines: {node: '>=18'} + compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -11024,9 +11232,6 @@ packages: console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - console-table-printer@2.15.0: - resolution: {integrity: sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw==} - console.table@0.10.0: resolution: {integrity: sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==} engines: {node: '> 0.10'} @@ -11087,10 +11292,6 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - cookie@1.1.1: - resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} - engines: {node: '>=18'} - copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} @@ -11117,6 +11318,12 @@ packages: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} @@ -11130,6 +11337,15 @@ packages: typescript: optional: true + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@7.0.1: + resolution: {integrity: sha512-IBWsY8xznyQrcHn8h4bC8/4ErNke5elzgG8GcqF4RFPw6aHkWWRc7Tgw6upjaTX/CT/yQgqYENkxYsTYN+hW2g==} + engines: {node: '>=18'} + crc@3.8.0: resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} @@ -11157,6 +11373,10 @@ packages: resolution: {integrity: sha512-fkdfq+b+AHI4cKdhZlppHveI/mgz2qpiYxcm+t5E5TsxX7QrLS1VE0+7GENEk9z0EeGPcpSciGv6ez24duWhwQ==} engines: {node: '>=18.x'} + croner@10.0.1: + resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==} + engines: {node: '>=18.0'} + cropperjs@1.6.2: resolution: {integrity: sha512-nhymn9GdnV3CqiEHJVai54TULFAE3VshJTXSqSJKa8yXAKyBKDWdhHarnlIPrshJ0WMFTGuFvG02YjLXfPiuOA==} @@ -11261,6 +11481,162 @@ packages: custom-error-instance@2.1.1: resolution: {integrity: sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==} + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.34.3: + resolution: {integrity: sha512-yfYGhRcGAntq6YBD583j4n0Eg3jIxvWmZtz/5uz9UYkeIStSlMxuUja+ec5j3iBD8nv1rwaOAYMW09tBdkSeaQ==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.2: + resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.14: + resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -11303,6 +11679,9 @@ packages: date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + date-fns@4.4.0: + resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} + dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} @@ -11312,6 +11691,9 @@ packages: dayjs@1.11.19: resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + dayjs@1.11.23: + resolution: {integrity: sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -11375,10 +11757,6 @@ packages: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -11412,6 +11790,9 @@ packages: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} + delaunator@5.1.0: + resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==} + delay@5.0.0: resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} engines: {node: '>=10'} @@ -11491,6 +11872,10 @@ packages: resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} engines: {node: '>=0.3.1'} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + diffie-hellman@5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} @@ -11640,6 +12025,10 @@ packages: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} + empathic@2.0.1: + resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + engines: {node: '>=14'} + encode-utf8@1.0.3: resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} @@ -11690,9 +12079,6 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - error-stack-parser-es@1.0.5: - resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} - error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} @@ -11743,6 +12129,9 @@ packages: es-toolkit@1.33.0: resolution: {integrity: sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==} + es-toolkit@1.52.0: + resolution: {integrity: sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==} + es6-promise@4.2.8: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} @@ -11764,13 +12153,8 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.27.7: - resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.28.1: - resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} hasBin: true @@ -11999,6 +12383,9 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -12007,6 +12394,10 @@ packages: resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} engines: {node: '>=18.0.0'} + eventsource-parser@3.1.1: + resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} + engines: {node: '>=18.0.0'} + eventsource@3.0.7: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} @@ -12117,6 +12508,9 @@ packages: resolution: {integrity: sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==} engines: {node: '>=6.0.0'} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} @@ -12144,11 +12538,11 @@ packages: fast-stable-stringify@1.0.0: resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - fast-string-truncated-width@1.2.1: - resolution: {integrity: sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} - fast-string-width@1.1.0: - resolution: {integrity: sha512-O3fwIVIH5gKB38QNbdg+3760ZmGz0SZMgvwJbA1b2TGXceKE6A2cOlfogh1iw8lr049zPyd7YADHy+B7U4W9bQ==} + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} fast-text-encoding@1.0.6: resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} @@ -12156,8 +12550,8 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fast-wrap-ansi@0.1.6: - resolution: {integrity: sha512-HlUwET7a5gqjURj70D5jl7aC3Zmy4weA1SHUfM0JFI0Ptq987NH2TwbBFLoERhfwk+E+eaq4EK3jXoT+R3yp3w==} + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} fast-xml-builder@1.0.0: resolution: {integrity: sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==} @@ -12173,6 +12567,9 @@ packages: resolution: {integrity: sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==} hasBin: true + fastdom@1.0.12: + resolution: {integrity: sha512-LB+xjSTEbjHE1cWsxu+tN2Xqr1kpi+V9aADI7sVM5ZMaXyYGPHULQMzpJMYqOTULK/73pUkWVzzObFRBkPr+hg==} + fastestsmallesttextencoderdecoder@1.0.22: resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} @@ -12459,6 +12856,10 @@ packages: resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} engines: {node: '>=14'} + gaxios@7.3.1: + resolution: {integrity: sha512-kB3rzJV7d9juLZh8/56QTXCwQfxyhdOMdyYk1HdQKFtF8TJTDTZQJtixWIwXdE9Jji91mC41DUNpjleo4L4eAQ==} + engines: {node: '>=18'} + gcp-metadata@5.3.0: resolution: {integrity: sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==} engines: {node: '>=12'} @@ -12467,6 +12868,10 @@ packages: resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} engines: {node: '>=14'} + gcp-metadata@8.1.2: + resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==} + engines: {node: '>=18'} + generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} @@ -12483,6 +12888,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.7.0: + resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} + engines: {node: '>=18'} + get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} @@ -12594,6 +13003,10 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + google-auth-library@10.9.1: + resolution: {integrity: sha512-i1ydyHrqcIxXkWh/uBmVkzCvIuq5yiK2ATndIe5XxKholrG/MTYP9xGYka4sQhrbIAgGjL2B6NOE7rFaiF3fXw==} + engines: {node: '>=18'} + google-auth-library@8.9.0: resolution: {integrity: sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==} engines: {node: '>=12'} @@ -12606,6 +13019,10 @@ packages: resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} engines: {node: '>=14'} + google-logging-utils@1.1.3: + resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==} + engines: {node: '>=14'} + google-p12-pem@4.0.1: resolution: {integrity: sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==} engines: {node: '>=12.0.0'} @@ -12643,11 +13060,6 @@ packages: peerDependencies: graphql: ^14.6.0 || ^15.0.0 || ^16.0.0 - graphql-request@6.1.0: - resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==} - peerDependencies: - graphql: 14 - 16 - graphql-scalars@1.25.0: resolution: {integrity: sha512-b0xyXZeRFkne4Eq7NAnL400gStGqG/Sx9VqX0A05nHyEbv57UJnWKsjNnrpVqv5e/8N1MUxkt0wwcRXbiyKcFg==} engines: {node: '>=10'} @@ -12682,6 +13094,9 @@ packages: h3@1.15.5: resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -12762,6 +13177,12 @@ packages: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} + hast-util-from-dom@5.0.1: + resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} + + hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} @@ -12777,9 +13198,6 @@ packages: hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - hast-util-parse-selector@2.2.5: - resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} - hast-util-parse-selector@3.1.1: resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} @@ -12789,6 +13207,9 @@ packages: hast-util-raw@9.1.0: resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + hast-util-select@6.0.4: resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} @@ -12804,14 +13225,18 @@ packages: hast-util-to-string@3.0.1: resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + hast-util-whitespace@2.0.1: resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hastscript@6.0.0: - resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + hast@1.0.0: + resolution: {integrity: sha512-vFUqlRV5C+xqP76Wwq2SrM0kipnmpxJm7OfvVXpB35Fp+Fn4MV+ozr+JZr5qFvyR1q/U+Foim2x+3P+x9S1PLA==} + deprecated: Renamed to rehype hastscript@7.2.0: resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} @@ -12860,8 +13285,8 @@ packages: highlightjs-vue@1.0.0: resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} - hls.js@1.6.15: - resolution: {integrity: sha512-E3a5VwgXimGHwpRGV+WxRTKeSp2DW5DI5MWv34ulL3t5UNmyJWCQ1KmLEHbYzcfThfXG8amBL+fCYPneGHC4VA==} + hls.js@1.7.3: + resolution: {integrity: sha512-MsPlx6yVW4Qv4C7mEVou4/gk/5cN2dVxOTnrNjPSmyH2f0Ln+/UkG10Ax1PE6OvrmTVPKgQYozTtBaPOuCzq7A==} hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} @@ -12914,21 +13339,6 @@ packages: zod-openapi: optional: true - hono-openapi@1.3.0: - resolution: {integrity: sha512-xDvCWpWEIv0weEmnl3EjRQzqbHIO8LnfzMuYOCmbuyE5aes6aXxLg4vM3ybnoZD5TiTUkA6PuRQPJs3R7WRBig==} - peerDependencies: - '@hono/standard-validator': ^0.2.0 - '@standard-community/standard-json': ^0.3.5 - '@standard-community/standard-openapi': ^0.2.9 - '@types/json-schema': ^7.0.15 - hono: ^4.8.3 - openapi-types: ^12.1.3 - peerDependenciesMeta: - '@hono/standard-validator': - optional: true - hono: - optional: true - hono@4.12.10: resolution: {integrity: sha512-mx/p18PLy5og9ufies2GOSUqep98Td9q4i/EF6X7yJgAiIopxqdfIO3jbqsi3jRgTgw88jMDEzVKi+V2EF+27w==} engines: {node: '>=16.9.0'} @@ -13082,11 +13492,6 @@ packages: engines: {node: '>=16.x'} hasBin: true - image-size@2.0.2: - resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} - engines: {node: '>=16.x'} - hasBin: true - image-to-pdf@3.0.2: resolution: {integrity: sha512-6/IQCt4f384zjQ1w8P7FHIN/tF0mau8RbAIydT/+wyfZ1RAb8E2fiKe9t/k0V880h0d3zRpw9Q1bM5AIgVL/4g==} @@ -13115,6 +13520,9 @@ packages: engines: {node: '>=8'} hasBin: true + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -13146,6 +13554,13 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + into-stream@6.0.0: resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} engines: {node: '>=10'} @@ -13168,15 +13583,9 @@ packages: iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} - is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} @@ -13240,9 +13649,6 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} - is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -13251,6 +13657,9 @@ packages: engines: {node: '>=8'} hasBin: true + is-electron@2.2.2: + resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} + is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} @@ -13283,9 +13692,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} @@ -13350,10 +13756,6 @@ packages: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} - is-port-reachable@4.0.0: - resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -13686,6 +14088,9 @@ packages: jose@6.2.0: resolution: {integrity: sha512-xsfE1TcSCbUdo6U07tR0mvhg0flGxU8tPLbF03mirl2ukGQENhUg4ubGYQnhVH0b5stLlPM+WOqDkEl1R1y5sQ==} + jose@6.2.12: + resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -13694,6 +14099,9 @@ packages: resolution: {integrity: sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + jpeg-js@0.4.4: + resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + js-base64@2.6.4: resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} @@ -13718,6 +14126,9 @@ packages: js-tiktoken@1.0.21: resolution: {integrity: sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==} + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -13875,6 +14286,10 @@ packages: resolution: {integrity: sha512-S0+riEvy1CK4VKse1ivMff8gmabe/prY7sKB3njjhyoLLsNFDQYtKNgXrbWUggGDCJBz7Fctl5i8fLCESHXzSg==} hasBin: true + katex@0.16.47: + resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} + hasBin: true + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -13884,6 +14299,9 @@ packages: keyvaluestorage-interface@1.0.0: resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -13899,80 +14317,11 @@ packages: konva@10.2.0: resolution: {integrity: sha512-JBoz0Xjbf49UPxCZegZ4WseqOzJ+C4AUDOtJ9eBve5RS5Fcq/u8TdBD5fDl/uPFInpC3a9uycm0sRyZpF4hheg==} - langchain@0.3.37: - resolution: {integrity: sha512-1jPsZ6xsxkcQPUvqRjvfuOLwZLLyt49hzcOK7OYAJovIkkOxd5gzK4Yw6giPUQ8g4XHyvULNlWBz+subdkcokw==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/anthropic': '*' - '@langchain/aws': '*' - '@langchain/cerebras': '*' - '@langchain/cohere': '*' - '@langchain/core': '>=0.3.58 <0.4.0' - '@langchain/deepseek': '*' - '@langchain/google-genai': '*' - '@langchain/google-vertexai': '*' - '@langchain/google-vertexai-web': '*' - '@langchain/groq': '*' - '@langchain/mistralai': '*' - '@langchain/ollama': '*' - '@langchain/xai': '*' - axios: '*' - cheerio: '*' - handlebars: ^4.7.8 - peggy: ^3.0.2 - typeorm: '*' - peerDependenciesMeta: - '@langchain/anthropic': - optional: true - '@langchain/aws': - optional: true - '@langchain/cerebras': - optional: true - '@langchain/cohere': - optional: true - '@langchain/deepseek': - optional: true - '@langchain/google-genai': - optional: true - '@langchain/google-vertexai': - optional: true - '@langchain/google-vertexai-web': - optional: true - '@langchain/groq': - optional: true - '@langchain/mistralai': - optional: true - '@langchain/ollama': - optional: true - '@langchain/xai': - optional: true - axios: - optional: true - cheerio: - optional: true - handlebars: - optional: true - peggy: - optional: true - typeorm: - optional: true - - langsmith@0.3.87: - resolution: {integrity: sha512-XXR1+9INH8YX96FKWc5tie0QixWz6tOqAsAKfcJyPkE0xPep+NDz0IQLR32q4bn10QK3LqD2HN6T3n6z1YLW7Q==} + langchain@1.5.11: + resolution: {integrity: sha512-6Sx9N5ylAJ11WrP1QnJLSIo75UABZbshzTJgG28H4mXuGcDk+w+7ZaNLkmGIh9sy/3PZcYS8UrI2rvH6A8NYIg==} + engines: {node: '>=20'} peerDependencies: - '@opentelemetry/api': '*' - '@opentelemetry/exporter-trace-otlp-proto': '*' - '@opentelemetry/sdk-trace-base': '*' - openai: '*' - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@opentelemetry/exporter-trace-otlp-proto': - optional: true - '@opentelemetry/sdk-trace-base': - optional: true - openai: - optional: true + '@langchain/core': ^1.2.10 langsmith@0.5.17: resolution: {integrity: sha512-/MEqTL50YH2SUZJtRl4+xI/tIgvu8OG5v6PMALKNkznjIelzf9q9kw0xxj1PC+r/ammMjVD1V2z9JmiT3AMqsQ==} @@ -14004,6 +14353,16 @@ packages: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + leac@0.6.0: resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} @@ -14186,6 +14545,9 @@ packages: lit@3.1.0: resolution: {integrity: sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==} + lit@3.3.3: + resolution: {integrity: sha512-fycuvZg/hkpozL00lm1pEJH5nN/lr9ZXd6mJI2HSN4+Bzc+LDNdEApJ6HFbPkdFNHLvOplIIuJvxkS4XUxqirw==} + load-esm@1.0.3: resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==} engines: {node: '>=13.2.0'} @@ -14346,10 +14708,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.7: - resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} - engines: {node: 20 || >=22} - lru-cache@11.3.5: resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} engines: {node: 20 || >=22} @@ -14373,11 +14731,24 @@ packages: peerDependencies: react: 19.2.4 - lucide-react@1.31.0: - resolution: {integrity: sha512-G8u2eEtoHUnUa9f8lbvqDhCiORMnYLdUEo06EEG9MQvHQrInKcX3Pa2TH39MM5qyzRcWETxB0+aOwAPI1g1kEg==} + lucide-react@0.525.0: + resolution: {integrity: sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ==} + peerDependencies: + react: 19.2.4 + + lucide-react@0.542.0: + resolution: {integrity: sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==} peerDependencies: react: 19.2.4 + lucide-react@1.47.0: + resolution: {integrity: sha512-o8C23aXpNQypRY73W7fW02EyvWJinEMXgKeGjFoKym0zj3Q73hD97A1IQps1g8C14HTGsOpZL0Am+xjfgFZAbg==} + peerDependencies: + react: 19.2.4 + + lucide@0.525.0: + resolution: {integrity: sha512-sfehWlaE/7NVkcEQ4T9JD3eID8RNMIGJBBUq9wF3UFiJIrcMKRbU3g1KGfDk4svcW7yw8BtDLXaXo02scDtUYQ==} + luxon@3.7.2: resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} engines: {node: '>=12'} @@ -14416,16 +14787,25 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marked@12.0.2: + resolution: {integrity: sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==} + engines: {node: '>= 18'} + hasBin: true + + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + marky@1.3.0: resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} - mastra@1.3.19: - resolution: {integrity: sha512-ZN1ZQ4mjK2t9KNdD/kSBNr4m2TlEfcbGxWGHtnVQ5bU6Vn0YywCDhESEa+4djIVO88jkqb+8ETFavsTiCecLsg==} + mastra@1.30.0: + resolution: {integrity: sha512-fed0N9+0PuXfit8lEDDk+EP3amwczgon6W1EVlXV5ZB7ZyJyz+dzzcRh1TIeugVls34zBJvRjgbaqy0v6IJXlA==} engines: {node: '>=22.13.0'} hasBin: true peerDependencies: - '@mastra/core': '>=1.1.0-0 <2.0.0-0' - zod: ^3.25.0 || ^4.0.0 + '@mastra/core': '>=1.50.0-0 <2.0.0-0' material-icons@1.13.14: resolution: {integrity: sha512-kZOfc7xCC0rAT8Q3DQixYAeT+tBqZnxkseQtp2bxBxz7q5pMAC+wmit7vJn1g/l7wRU+HEPq23gER4iPjGs5Cg==} @@ -14563,6 +14943,9 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + mermaid@11.17.2: + resolution: {integrity: sha512-V6K3C8EBdEsPFZXSKMJe6ppQOENxuHARr9GvHX4hh47lAbhMRD9qf4oEK7LoaRQxULMa80/qt5gHO73aCleBBg==} + methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -14631,6 +15014,35 @@ packages: micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + micromark-extension-cjk-friendly-gfm-strikethrough@1.2.3: + resolution: {integrity: sha512-gSPnxgHDDqXYOBvQRq6lerrq9mjDhdtKn+7XETuXjxWcL62yZEfUdA28Ml1I2vDIPfAOIKLa0h2XDSGkInGHFQ==} + engines: {node: '>=16'} + peerDependencies: + micromark: ^4.0.0 + micromark-util-types: ^2.0.0 + peerDependenciesMeta: + micromark-util-types: + optional: true + + micromark-extension-cjk-friendly-util@2.1.1: + resolution: {integrity: sha512-egs6+12JU2yutskHY55FyR48ZiEcFOJFyk9rsiyIhcJ6IvWB6ABBqVrBw8IobqJTDZ/wdSr9eoXDPb5S2nW1bg==} + engines: {node: '>=16'} + peerDependencies: + micromark-util-types: '*' + peerDependenciesMeta: + micromark-util-types: + optional: true + + micromark-extension-cjk-friendly@1.2.3: + resolution: {integrity: sha512-gRzVLUdjXBLX6zNPSnHGDoo+ZTp5zy+MZm0g3sv+3chPXY7l9gW+DnrcHcZh/jiPR6MjPKO4AEJNp4Aw6V9z5Q==} + engines: {node: '>=16'} + peerDependencies: + micromark: ^4.0.0 + micromark-util-types: ^2.0.0 + peerDependenciesMeta: + micromark-util-types: + optional: true + micromark-extension-gfm-autolink-literal@2.1.0: resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} @@ -14836,10 +15248,6 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - miniflare@5.20260811.1-alpha: - resolution: {integrity: sha512-DtOG0BeanIxs2sH0smFvExZD89cBQwGckbHiFkRJrrNAUu3NGClZkUxqu+zy7HYfKBAgq935EMY49vIPm3JVdA==} - engines: {node: '>=22.0.0'} - minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -15081,15 +15489,6 @@ packages: resolution: {integrity: sha512-hAWn8Hh2eewpB5McXR5EW81R3pR/ziuGhKCF3wFyUVCklanPqrIgMNr7jKCbzXeNVad0nUDfWpFRqh2u+zxQtw==} engines: {node: '>= 18.0.0'} - nice-grpc-client-middleware-retry@3.1.13: - resolution: {integrity: sha512-Q9I/wm5lYkDTveKFirrTHBkBY137yavXZ4xQDXTPIycUp7aLXD8xPTHFhqtAFWUw05aS91uffZZRgdv3HS0y/g==} - - nice-grpc-common@2.0.2: - resolution: {integrity: sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ==} - - nice-grpc@2.1.14: - resolution: {integrity: sha512-GK9pKNxlvnU5FAdaw7i2FFuR9CqBspcE+if2tqnKXBcE0R8525wj4BZvfcwj7FjvqbssqKxRHt2nwedalbJlww==} - no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -15286,8 +15685,8 @@ packages: resolution: {integrity: sha512-szyd0ou0T8nsAqHtprRcP3WidfsN1TnAR5yWXf2mFCEr5ek3LEOkT6EZ/92Xfs74HIdyhG5WkGxIssMU0jBaeg==} engines: {node: '>=16'} - obug@2.1.4: - resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} engines: {node: '>=12.20.0'} ofetch@1.5.1: @@ -15319,34 +15718,16 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} - openai@4.104.0: - resolution: {integrity: sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==} - hasBin: true - peerDependencies: - ws: ^8.18.0 - zod: ^3.23.8 - peerDependenciesMeta: - ws: - optional: true - zod: - optional: true - - openai@5.23.2: - resolution: {integrity: sha512-MQBzmTulj+MM5O8SKEk/gL8a7s5mktS9zUtAkU257WjvobGc9nKcBuVwjyEEcb9SI8a8Y2G/mzn3vm9n1Jlleg==} - hasBin: true - peerDependencies: - ws: ^8.18.0 - zod: ^3.23.8 - peerDependenciesMeta: - ws: - optional: true - zod: - optional: true - openai@6.27.0: resolution: {integrity: sha512-osTKySlrdYrLYTt0zjhY8yp0JUBmWDCN+Q+QxsV4xMQnnoVFpylgKGgxwN8sSdTNw0G4y+WUXs4eCMWpyDNWZQ==} hasBin: true @@ -15371,9 +15752,15 @@ packages: zod: optional: true + openapi-fetch@0.17.0: + resolution: {integrity: sha512-PsbZR1wAPcG91eEthKhN+Zn92FMHxv+/faECIwjXdxfTODGSGegYv0sc1Olz+HYPvKOuoXfp+0pA2XVt2cI0Ig==} + openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + openapi-typescript-helpers@0.1.0: + resolution: {integrity: sha512-OKTGPthhivLw/fHz6c3OPtg72vi86qaMlqbJuVJ23qOvQ+53uw1n7HdmkJFibloF7QEjDrDkzJiOJuockM/ljw==} + openapi3-ts@3.2.0: resolution: {integrity: sha512-/ykNWRV5Qs0Nwq7Pc0nJ78fgILvOT/60OxEmB3v7yQ8a8Bwcm43D4diaYazG/KBn6czA+52XYy931WFLMCUeSg==} @@ -15404,14 +15791,6 @@ packages: typescript: optional: true - ox@0.4.4: - resolution: {integrity: sha512-oJPEeCDs9iNiPs6J0rTx+Y0KGeCGyCAA3zo94yZhm8G5WpOxrwUtn2Ie/Y8IyARSqqY/j9JTKA3Fc1xs1DvFnw==} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - ox@0.6.7: resolution: {integrity: sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==} peerDependencies: @@ -15507,6 +15886,9 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@1.8.0: + resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} + pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} @@ -15524,9 +15906,6 @@ packages: resolution: {integrity: sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==} engines: {node: '>= 0.10'} - parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} - parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} @@ -15572,6 +15951,9 @@ packages: path-case@3.0.4: resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -15616,9 +15998,6 @@ packages: path-to-regexp@3.3.0: resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} - path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-to-regexp@8.3.0: resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} @@ -15660,30 +16039,36 @@ packages: performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - pg-cloudflare@1.3.0: - resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==} + pg-cloudflare@1.4.0: + resolution: {integrity: sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==} pg-connection-string@2.12.0: resolution: {integrity: sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==} + pg-connection-string@2.14.0: + resolution: {integrity: sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==} + pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - pg-pool@3.13.0: - resolution: {integrity: sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==} + pg-pool@3.14.0: + resolution: {integrity: sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==} 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==} + pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} - pg@8.20.0: - resolution: {integrity: sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==} + pg@8.23.0: + resolution: {integrity: sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg==} engines: {node: '>= 16.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -15694,6 +16079,9 @@ packages: pgpass@1.0.5: resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + phoenix@1.8.14: + resolution: {integrity: sha512-erAGbssrbK7xe4l/tWXZTdsstCY+ufGTt/Kdin4uwceaP2TVqSL6v4s3flQOvIxShpwQx2/8NcOcBXOqgQ+ltw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -15701,10 +16089,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} @@ -15794,6 +16178,12 @@ packages: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + polotno@3.0.0-beta.25: resolution: {integrity: sha512-r1MyrHQ7lpQ7zNflXLfNbCZP1kYAtstiA2ez1GAu05goxg7TTnNGyT0Q8PYF/G3PpKoompAS7CXrUq5tXWdRWw==} peerDependencies: @@ -15886,9 +16276,14 @@ packages: posthog-js@1.359.1: resolution: {integrity: sha512-Gy/eX02im6ON0zMxfTR61GNk1sjgLT9rVGfBQ5C757/WS4mN3vTUJveQYoX9jr3y0pqPZ57DqCcf6zcw++bpzQ==} - posthog-node@5.17.2: - resolution: {integrity: sha512-lz3YJOr0Nmiz0yHASaINEDHqoV+0bC3eD8aZAG+Ky292dAnVYul+ga/dMX8KCBXg8hHfKdxw0SztYD5j6dgUqQ==} - engines: {node: '>=20'} + posthog-node@5.52.4: + resolution: {integrity: sha512-P3p4OouGQfw/ouv+Px4gcVWLNwYsFB4JPyksYmxv7QRX4niwp1/C9XjQSUyl0nt+KoQnK14zFDfONHWVthwKDA==} + engines: {node: ^20.20.0 || >=22.22.0} + peerDependencies: + rxjs: ^7.0.0 + peerDependenciesMeta: + rxjs: + optional: true preact@10.28.4: resolution: {integrity: sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==} @@ -15902,11 +16297,6 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} - engines: {node: '>=14'} - hasBin: true - pretty-bytes@6.1.1: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} @@ -15933,10 +16323,6 @@ packages: typescript: optional: true - prismjs@1.27.0: - resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} - engines: {node: '>=6'} - prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} @@ -15985,9 +16371,6 @@ packages: property-expr@2.0.6: resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} - property-information@5.6.0: - resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} - property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} @@ -16209,10 +16592,6 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - react-colorful@5.6.1: resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} peerDependencies: @@ -16437,8 +16816,9 @@ packages: '@types/react': optional: true - react-syntax-highlighter@15.6.6: - resolution: {integrity: sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==} + react-syntax-highlighter@16.1.1: + resolution: {integrity: sha512-PjVawBGy80C6YbC5DDZJeUjBmC7skaoEUdvfFQediQHgCL7aKyVHe57SaJGfQsloGDac+gCpTfRdtxzWWKmCXA==} + engines: {node: '>= 16.20.2'} peerDependencies: react: 19.2.4 @@ -16506,6 +16886,10 @@ packages: resolution: {integrity: sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==} engines: {node: '>=8'} + readdir-glob@3.0.0: + resolution: {integrity: sha512-AhNB2KgKeVJr16nK9LLZbJNWnYoT23ZrumNKFDebHBdkC8KHSqWo871JAUhoWC/RtjEVdqNMFpM6qrwRbaUqpw==} + engines: {node: '>=18'} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -16547,9 +16931,6 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - refractor@3.6.0: - resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} - refractor@4.9.0: resolution: {integrity: sha512-nEG1SPXFoGGx+dcjftjv8cAjEusIh6ED1xhf5DG3C0x/k+rmZ2duKnc3QLpt6qeHv5fPb8uwN3VWN2BT7fr3Og==} @@ -16566,6 +16947,15 @@ packages: regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -16574,13 +16964,6 @@ packages: resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} engines: {node: '>=4'} - registry-auth-token@3.3.2: - resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} - - registry-url@3.1.0: - resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} - engines: {node: '>=0.10.0'} - regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} @@ -16595,10 +16978,16 @@ packages: rehype-autolink-headings@7.1.0: resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + rehype-harden@1.1.8: + resolution: {integrity: sha512-Qn7vR1xrf6fZCrkm9TDWi/AB4ylrHy+jqsNm1EHOAmbARYA6gsnVJBq/sdBh6kmT4NEZxH5vgIjrscefJAOXcw==} + rehype-ignore@2.0.3: resolution: {integrity: sha512-IzhP6/u/6sm49sdktuYSmeIuObWB+5yC/5eqVws8BhuGA9kY25/byz6uCy/Ravj6lXUShEd2ofHM5MyAIj86Sg==} engines: {node: '>=16'} + rehype-katex@7.0.1: + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + rehype-parse@9.0.1: resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} @@ -16615,6 +17004,9 @@ packages: resolution: {integrity: sha512-L/FO96EOzSA6bzOam4DVu61/PB3AGKcSPXpa53yMIozoxH4qg1+bVZDF8zh1EsuxtSauAhzt5cCnvoplAaSLrw==} engines: {node: '>=16.0.0'} + rehype-sanitize@6.0.0: + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + rehype-slug@6.0.0: resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} @@ -16624,6 +17016,26 @@ packages: rehype@13.0.2: resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + remark-cjk-friendly-gfm-strikethrough@1.2.3: + resolution: {integrity: sha512-bXfMZtsaomK6ysNN/UGRIcasQAYkC10NtPmP0oOHOV8YOhA2TXmwRXCku4qOzjIFxAPfish5+XS0eIug2PzNZA==} + engines: {node: '>=16'} + peerDependencies: + '@types/mdast': ^4.0.0 + unified: ^11.0.0 + peerDependenciesMeta: + '@types/mdast': + optional: true + + remark-cjk-friendly@1.2.3: + resolution: {integrity: sha512-UvAgxwlNk+l9Oqgl/9MWK2eWRS7zgBW/nXX9AthV7nd/3lNejF138E7Xbmk9Zs4WjTJGs721r7fAEc7tNFoH7g==} + engines: {node: '>=16'} + peerDependencies: + '@types/mdast': ^4.0.0 + unified: ^11.0.0 + peerDependenciesMeta: + '@types/mdast': + optional: true + remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} @@ -16649,6 +17061,12 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remend@1.0.1: + resolution: {integrity: sha512-152puVH0qMoRJQFnaMG+rVDdf01Jq/CaED+MBuXExurJgdbkLp0c3TIe4R12o28Klx8uyGsjvFNG05aFG69G9w==} + + remend@1.3.1: + resolution: {integrity: sha512-N3DiY5qbRPoa5vkxn1oDLMyXOVTeo6Hp+XOj6SIqJAYUgLS0Q587gILPMom/qm86AQ/ZrcOdwEIzCz8V3J0nxQ==} + remove-markdown@0.5.5: resolution: {integrity: sha512-lMR8tOtDqazFT6W2bZidoXwkptMdF3pCxpri0AEokHg0sZlC2GdoLqnoaxsEj1o7/BtXV1MKtT3YviA1t7rW7g==} @@ -16761,6 +17179,9 @@ packages: resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} engines: {node: '>= 0.8'} + robust-predicates@3.0.3: + resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} + rolldown@1.2.4: resolution: {integrity: sha512-rSr7irW0K7QRWzjdJXqZowkcRdDtjRduh43rBltnVKd0VFq839l1lJoDvGJb6gl7+4rTTCrPWu+YfujUL8Ug7w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -16783,9 +17204,17 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.63.3: + resolution: {integrity: sha512-1i2XreiAoMMXuPGD6Msj2xWrMMkHojNRKivInxGQcg7/1KuPuYlfUutLyh4drnOxUTHX9cHI4wFoat8D/NKaBw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -16810,6 +17239,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + rxjs@6.6.7: resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} engines: {npm: '>=2.0.0'} @@ -16956,11 +17388,6 @@ packages: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} - serve@14.2.6: - resolution: {integrity: sha512-QEjUSA+sD4Rotm1znR8s50YqA3kYpRGPmtd5GlFxbaL9n/FdUNbqMhxClqdditSk0LlZyA/dhud6XNRTOC9x2Q==} - engines: {node: '>= 14'} - hasBin: true - server-only@0.0.1: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} @@ -16997,10 +17424,6 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - sharp@0.35.2: - resolution: {integrity: sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==} - engines: {node: '>=20.9.0'} - sharp@0.35.3: resolution: {integrity: sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==} engines: {node: '>=20.9.0'} @@ -17030,6 +17453,9 @@ packages: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} + shiki@3.23.0: + resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -17075,9 +17501,6 @@ packages: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} - simple-wcswidth@1.1.2: - resolution: {integrity: sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==} - sirv@2.0.4: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} @@ -17180,9 +17603,6 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - space-separated-tokens@1.1.5: - resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} - space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -17236,9 +17656,6 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - std-env@4.2.0: - resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} - stealthy-require@1.1.1: resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} engines: {node: '>=0.10.0'} @@ -17262,14 +17679,25 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + streamdown@1.6.11: + resolution: {integrity: sha512-Y38fwRx5kCKTluwM+Gf27jbbi9q6Qy+WC9YrC1YbCpMkktT3PsRBJHMWiqYeF8y/JzLpB1IzDoeaB6qkQEDnAA==} + peerDependencies: + react: 19.2.4 + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} + streamx@2.28.1: + resolution: {integrity: sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==} + strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} + strictdom@1.0.1: + resolution: {integrity: sha512-cEmp9QeXXRmjj/rVp9oyiqcvyocWab/HaoN4+bwFeZ7QzykJD6L3yD4v12K1x0tHpqRqVpJevN3gW7kyM39Bqg==} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -17346,10 +17774,6 @@ packages: resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} engines: {node: '>=18'} - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -17445,10 +17869,6 @@ packages: resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} engines: {node: '>=14.0.0'} - supports-color@10.2.2: - resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} - engines: {node: '>=18'} - supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -17506,6 +17926,9 @@ packages: tailwind-merge@1.14.0: resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} + tailwind-merge@3.7.0: + resolution: {integrity: sha512-XPPUyAc+cvspz3lHTcR/QgPfW2A0lv/xQNIjX3HGhLR+Nq2lHaLq5MtTesHn8GUr3W3DguT2KT5x3NVgRtYwmA==} + tailwind-scrollbar@3.1.0: resolution: {integrity: sha512-pmrtDIZeHyu2idTejfV59SbaJyvp1VRjYxAjZBH0jnyrPRo6HL1kD5Glz8VPagasqr6oAx6M05+Tuw429Z8jxg==} engines: {node: '>=12.13.0'} @@ -17527,11 +17950,17 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + tar-stream@3.2.1: + resolution: {integrity: sha512-nqsEO8zLZJvrOMdEwkA0QdCLFbetHMn95Zqu4fKwX+hkaTWJPZZOrxx/PwtxoK0MMGQmBQNRW3CPs8IFYQz4cQ==} + tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + terser-webpack-plugin@5.3.17: resolution: {integrity: sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw==} engines: {node: '>= 10.13.0'} @@ -17557,6 +17986,9 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + text-encoding-utf-8@1.0.2: resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} @@ -17620,8 +18052,8 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.3.0: - resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} engines: {node: '>=18'} tinyglobby@0.2.15: @@ -17640,10 +18072,6 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyrainbow@3.1.1: - resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} - engines: {node: '>=14.0.0'} - tinyspy@3.0.2: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} @@ -17780,8 +18208,9 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-error@1.0.6: - resolution: {integrity: sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==} + ts-dedent@2.3.0: + resolution: {integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==} + engines: {node: '>=6.10'} ts-essentials@10.1.1: resolution: {integrity: sha512-4aTB7KLHKmUvkjNj8V+EdnmuVTiECzn3K+zIbRthumvHu+j44x3w63xpfs0JL3NGIzGXqoQ7AV591xHO+XrOTw==} @@ -17878,6 +18307,10 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + tsup@8.5.1: resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} engines: {node: '>=18'} @@ -17907,6 +18340,9 @@ packages: resolution: {integrity: sha512-ZLeYmjrkaU1fUsKbIi8JML52uAocjEZtBx4DKjRrqzrZa0O4MYwT6db+oqePlspV+FxXJAyFBc/L5gwUi2OFsg==} engines: {node: '>=18'} + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} @@ -17995,10 +18431,10 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - typescript-paths@1.5.1: - resolution: {integrity: sha512-lYErSLCON2MSplVV5V/LBgD4UNjMgY3guATdFCZY2q1Nr6OZEu4q6zX/rYMsG1TaWqqQSszg6C9EU7AGWMDrIw==} + typescript-paths@1.5.2: + resolution: {integrity: sha512-s5iiRIWOSw80dBgPACm0asPQZHHQcbPz69f26eRq01dStusuD11idZ0NDcAbkj6WuUGcRwJediPOsrArIS92eg==} peerDependencies: - typescript: ^4.7.2 || ^5 + typescript: ^4.7.2 || ^5 || ^6 typescript@5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} @@ -18051,6 +18487,14 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + + undici@6.28.1: + resolution: {integrity: sha512-zWpdTVD54H48CIybL0rWQ3ukpb9d23wM7eH5RtfdmeP70cWHNjtfo7P4vZX+5CoDcO53J4Pu5uXp7lNfjc6DRA==} + engines: {node: '>=18.17'} + undici@7.25.0: resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} engines: {node: '>=20.18.1'} @@ -18059,9 +18503,6 @@ packages: resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} engines: {node: '>=20.18.1'} - unenv@2.0.0-rc.24: - resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} - unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -18106,6 +18547,9 @@ packages: unist-util-filter@5.0.1: resolution: {integrity: sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw==} + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-generated@2.0.1: resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} @@ -18238,9 +18682,6 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - update-check@1.5.4: - resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} - upper-case-first@2.0.2: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} @@ -18328,6 +18769,11 @@ packages: '@types/react': optional: true + use-stick-to-bottom@1.1.6: + resolution: {integrity: sha512-z3Up8jYQGTkUCsGBnwg6/wj70KgXoW5Kz1AAc1j8MtQuYMBo6ZsdhrIXoegxa7gaMMilgQYyTohTrt3p94jHog==} + peerDependencies: + react: 19.2.4 + use-sync-external-store@1.2.0: resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: @@ -18420,6 +18866,10 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + verkit@0.3.2: + resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} + engines: {node: '>=18.12.0'} + verror@1.10.0: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} @@ -18579,47 +19029,6 @@ packages: jsdom: optional: true - vitest@4.1.10: - resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.10 - '@vitest/browser-preview': 4.1.10 - '@vitest/browser-webdriverio': 4.1.10 - '@vitest/coverage-istanbul': 4.1.10 - '@vitest/coverage-v8': 4.1.10 - '@vitest/ui': 4.1.10 - happy-dom: '*' - jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@opentelemetry/api': - optional: true - '@types/node': - optional: true - '@vitest/browser-playwright': - optional: true - '@vitest/browser-preview': - optional: true - '@vitest/browser-webdriverio': - optional: true - '@vitest/coverage-istanbul': - optional: true - '@vitest/coverage-v8': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} @@ -18651,10 +19060,6 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - weaviate-client@3.12.0: - resolution: {integrity: sha512-z61T1WA44meNMbabzQ6GSXWkZyc/wGcC17X8DTB5tPs0ojatwFmdySLtXLzSvvgmIeLn+PI0+7eZgg42XYbAIw==} - engines: {node: '>=20.0.0'} - web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -18791,10 +19196,6 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} - wildcard@1.1.2: resolution: {integrity: sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==} @@ -18811,21 +19212,6 @@ packages: wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - workerd@1.20260811.1: - resolution: {integrity: sha512-kh+FFm55JQ4ssxhHZV9VPdMQq3D1nHxNJgwxMtWGD4dGppJvLySdguTRDKgeNTvgq6heSz+6TTXyPSDGj8Yllw==} - engines: {node: '>=16'} - hasBin: true - - wrangler@4.123.0: - resolution: {integrity: sha512-VXo2I1oa0x9aGAKIFPRSQPqTh0RBY5Ktl44YOhNmsJQFUdJKDA2vVTU6Xj+FC2koll6orJqWZN8jbXVIk9O67Q==} - engines: {node: '>=22.0.0'} - hasBin: true - peerDependencies: - '@cloudflare/workers-types': ^5.20260811.1 - peerDependenciesMeta: - '@cloudflare/workers-types': - optional: true - wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -18893,8 +19279,8 @@ packages: utf-8-validate: optional: true - ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + ws@8.21.3: + resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -18978,6 +19364,11 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yaml@2.9.1: + resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -19014,15 +19405,13 @@ packages: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} - youch-core@0.3.3: - resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} - - youch@4.1.0-beta.10: - resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} - yup@1.7.1: resolution: {integrity: sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==} + zip-stream@7.0.5: + resolution: {integrity: sha512-dSvYKdvLsAHCDqPOhIwk/q5CvuWtTB3Dgpoe0uVEFjTzIOAmsQpprX25InCvrvJsirEbu1OHyy67n/kAj1Sw/w==} + engines: {node: '>=18'} + zod-from-json-schema@0.0.5: resolution: {integrity: sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ==} @@ -19034,6 +19423,11 @@ packages: peerDependencies: zod: ^3.25 || ^4 + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + zod-validation-error@4.0.2: resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} engines: {node: '>=18.0.0'} @@ -19046,11 +19440,8 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} - - zod@4.4.3: - resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.6.5: + resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} zustand@5.0.11: resolution: {integrity: sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==} @@ -19090,13 +19481,46 @@ snapshots: transitivePeerDependencies: - supports-color + '@a2a-js/sdk@0.3.14(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(express@5.2.1)': + dependencies: + uuid: 11.1.0 + optionalDependencies: + '@bufbuild/protobuf': 2.11.0 + '@grpc/grpc-js': 1.14.3 + express: 5.2.1 + + '@a2a-js/sdk@1.0.1(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(express@5.2.1)': + dependencies: + jose: 6.2.12 + uuid: 11.1.0 + optionalDependencies: + '@bufbuild/protobuf': 2.11.0 + '@grpc/grpc-js': 1.14.3 + express: 5.2.1 + + '@a2ui/web_core@0.10.4': + dependencies: + '@preact/signals-core': 1.14.4 + date-fns: 4.4.0 + zod: 3.25.76 + zod-to-json-schema: 3.25.2(zod@3.25.76) + '@adraffy/ens-normalize@1.11.1': {} - '@ag-ui/client@0.0.47': + '@ag-ui/a2ui-middleware@0.0.10(@ag-ui/client@0.0.59)(rxjs@7.8.1)': dependencies: - '@ag-ui/core': 0.0.47 - '@ag-ui/encoder': 0.0.47 - '@ag-ui/proto': 0.0.47 + '@ag-ui/a2ui-toolkit': 0.0.4 + '@ag-ui/client': 0.0.59 + clarinet: 0.12.6 + rxjs: 7.8.1 + + '@ag-ui/a2ui-toolkit@0.0.4': {} + + '@ag-ui/client@0.0.59': + dependencies: + '@ag-ui/core': 0.0.59 + '@ag-ui/encoder': 0.0.59 + '@ag-ui/proto': 0.0.59 '@types/uuid': 10.0.0 compare-versions: 6.1.1 fast-json-patch: 3.1.1 @@ -19105,27 +19529,23 @@ snapshots: uuid: 11.1.0 zod: 3.25.76 - '@ag-ui/core@0.0.37': + '@ag-ui/core@0.0.59': dependencies: - rxjs: 7.8.1 zod: 3.25.76 - '@ag-ui/core@0.0.47': + '@ag-ui/encoder@0.0.59': dependencies: - rxjs: 7.8.1 - zod: 3.25.76 - - '@ag-ui/encoder@0.0.47': - dependencies: - '@ag-ui/core': 0.0.47 - '@ag-ui/proto': 0.0.47 + '@ag-ui/core': 0.0.59 + '@ag-ui/proto': 0.0.59 - '@ag-ui/langgraph@0.0.24(@ag-ui/client@0.0.47)(@ag-ui/core@0.0.47)(@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)': + '@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))': dependencies: - '@ag-ui/client': 0.0.47 - '@ag-ui/core': 0.0.47 - '@langchain/core': 0.3.80(@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)) - '@langchain/langgraph-sdk': 0.1.10(@langchain/core@0.3.80(@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) + '@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)) partial-json: 0.1.7 rxjs: 7.8.1 transitivePeerDependencies: @@ -19135,31 +19555,67 @@ snapshots: - openai - react - react-dom + - svelte + - vue + - ws - '@ag-ui/mastra@1.0.1(@ag-ui/client@0.0.47)(@ag-ui/core@0.0.47)(@copilotkit/runtime@1.10.6(c5ef6e30f9cb72b0a9db20b1502179b1))(@mastra/client-js@0.15.2(openapi-types@12.1.3)(react@19.2.4)(zod@3.25.76))(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(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(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))': dependencies: - '@ag-ui/client': 0.0.47 - '@ag-ui/core': 0.0.47 + '@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.10.6(c5ef6e30f9cb72b0a9db20b1502179b1) + '@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.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(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 + rxjs: 7.8.1 + zod: 3.25.76 + + '@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)': + dependencies: + '@ag-ui/client': 0.0.59 + '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) rxjs: 7.8.1 transitivePeerDependencies: + - '@cfworker/json-schema' + - supports-color - zod - '@ag-ui/proto@0.0.47': + '@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)': dependencies: - '@ag-ui/core': 0.0.47 + '@ag-ui/client': 0.0.59 + '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) + rxjs: 7.8.1 + transitivePeerDependencies: + - '@cfworker/json-schema' + - supports-color + - zod + + '@ag-ui/proto@0.0.59': + dependencies: + '@ag-ui/core': 0.0.59 '@bufbuild/protobuf': 2.11.0 '@protobuf-ts/protoc': 2.11.1 + '@ai-sdk/anthropic@2.0.102(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.4 + '@ai-sdk/provider-utils': 3.0.37(zod@3.25.76) + zod: 3.25.76 + '@ai-sdk/anthropic@2.0.23(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 '@ai-sdk/provider-utils': 3.0.10(zod@3.25.76) zod: 3.25.76 + '@ai-sdk/anthropic@3.0.118(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.16 + '@ai-sdk/provider-utils': 4.0.51(zod@3.25.76) + zod: 3.25.76 + '@ai-sdk/gateway@1.0.33(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -19167,18 +19623,63 @@ snapshots: '@vercel/oidc': 3.2.0 zod: 3.25.76 + '@ai-sdk/gateway@3.0.196(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.16 + '@ai-sdk/provider-utils': 4.0.51(zod@3.25.76) + '@vercel/oidc': 3.2.0 + zod: 3.25.76 + + '@ai-sdk/google-vertex@3.0.174(zod@3.25.76)': + dependencies: + '@ai-sdk/anthropic': 2.0.102(zod@3.25.76) + '@ai-sdk/google': 2.0.97(zod@3.25.76) + '@ai-sdk/openai-compatible': 1.0.54(zod@3.25.76) + '@ai-sdk/provider': 2.0.4 + '@ai-sdk/provider-utils': 3.0.37(zod@3.25.76) + google-auth-library: 10.9.1 + zod: 3.25.76 + transitivePeerDependencies: + - supports-color + '@ai-sdk/google@2.0.17(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 '@ai-sdk/provider-utils': 3.0.10(zod@3.25.76) zod: 3.25.76 + '@ai-sdk/google@2.0.97(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.4 + '@ai-sdk/provider-utils': 3.0.37(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/google@3.0.123(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.16 + '@ai-sdk/provider-utils': 4.0.51(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/mcp@1.0.81(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.16 + '@ai-sdk/provider-utils': 4.0.51(zod@3.25.76) + cross-spawn: 7.0.6 + pkce-challenge: 5.0.1 + zod: 3.25.76 + '@ai-sdk/openai-compatible@1.0.19(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 '@ai-sdk/provider-utils': 3.0.10(zod@3.25.76) zod: 3.25.76 + '@ai-sdk/openai-compatible@1.0.54(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.4 + '@ai-sdk/provider-utils': 3.0.37(zod@3.25.76) + zod: 3.25.76 + '@ai-sdk/openai@2.0.42(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -19191,6 +19692,12 @@ snapshots: '@ai-sdk/provider-utils': 3.0.22(zod@3.25.76) zod: 3.25.76 + '@ai-sdk/openai@3.0.113(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.16 + '@ai-sdk/provider-utils': 4.0.51(zod@3.25.76) + zod: 3.25.76 + '@ai-sdk/provider-utils@2.2.8(zod@3.25.76)': dependencies: '@ai-sdk/provider': 1.1.3 @@ -19202,28 +19709,45 @@ snapshots: dependencies: '@ai-sdk/provider': 2.0.0 '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 + eventsource-parser: 3.1.1 zod: 3.25.76 - '@ai-sdk/provider-utils@3.0.20(zod@3.25.76)': + '@ai-sdk/provider-utils@3.0.22(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.1 '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 zod: 3.25.76 - '@ai-sdk/provider-utils@3.0.22(zod@3.25.76)': + '@ai-sdk/provider-utils@3.0.37(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider': 2.0.4 '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 + eventsource-parser: 3.1.1 + undici: 5.29.0 zod: 3.25.76 - '@ai-sdk/provider-utils@4.0.0(zod@3.25.76)': + '@ai-sdk/provider-utils@4.0.40(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 3.0.0 + '@ai-sdk/provider': 3.0.14 '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 + eventsource-parser: 3.1.1 + zod: 3.25.76 + + '@ai-sdk/provider-utils@4.0.51(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.16 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.1.1 + undici: 6.28.1 + zod: 3.25.76 + + '@ai-sdk/provider-utils@5.0.13(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 4.0.4 + '@standard-schema/spec': 1.1.0 + '@workflow/serde': 4.1.0 + eventsource-parser: 3.1.1 zod: 3.25.76 '@ai-sdk/provider@1.1.3': @@ -19238,11 +19762,23 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@3.0.0': + '@ai-sdk/provider@2.0.3': dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@3.0.5': + '@ai-sdk/provider@2.0.4': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@3.0.14': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@3.0.16': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@4.0.4': dependencies: json-schema: 0.4.0 @@ -19310,6 +19846,11 @@ snapshots: transitivePeerDependencies: - chokidar + '@antfu/install-pkg@2.1.0': + dependencies: + package-manager-detector: 1.8.0 + tinyexec: 1.3.1 + '@anthropic-ai/sdk@0.27.3': dependencies: '@types/node': 18.16.9 @@ -19322,7 +19863,8 @@ snapshots: transitivePeerDependencies: - encoding - '@anthropic-ai/sdk@0.57.0': {} + '@anthropic-ai/sdk@0.57.0': + optional: true '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: @@ -19330,11 +19872,6 @@ snapshots: '@types/json-schema': 7.0.15 js-yaml: 4.1.1 - '@apidevtools/json-schema-ref-parser@14.2.1(@types/json-schema@7.0.15)': - dependencies: - '@types/json-schema': 7.0.15 - js-yaml: 4.1.1 - '@asamuzakjp/css-color@5.1.11': dependencies: '@asamuzakjp/generational-cache': 1.0.1 @@ -19493,7 +20030,7 @@ snapshots: '@smithy/node-http-handler': 4.4.14 '@smithy/protocol-http': 5.3.11 '@smithy/smithy-client': 4.12.2 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 '@smithy/url-parser': 4.2.11 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 @@ -19507,6 +20044,7 @@ snapshots: tslib: 2.8.1 transitivePeerDependencies: - aws-crt + optional: true '@aws-sdk/client-bedrock-runtime@3.1003.0': dependencies: @@ -19544,7 +20082,7 @@ snapshots: '@smithy/node-http-handler': 4.4.14 '@smithy/protocol-http': 5.3.11 '@smithy/smithy-client': 4.12.2 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 '@smithy/url-parser': 4.2.11 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 @@ -19559,6 +20097,7 @@ snapshots: tslib: 2.8.1 transitivePeerDependencies: - aws-crt + optional: true '@aws-sdk/client-kendra@3.1003.0': dependencies: @@ -19589,7 +20128,7 @@ snapshots: '@smithy/node-http-handler': 4.4.14 '@smithy/protocol-http': 5.3.11 '@smithy/smithy-client': 4.12.2 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 '@smithy/url-parser': 4.2.11 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 @@ -19603,6 +20142,7 @@ snapshots: tslib: 2.8.1 transitivePeerDependencies: - aws-crt + optional: true '@aws-sdk/client-s3@3.1003.0': dependencies: @@ -19733,7 +20273,7 @@ snapshots: '@smithy/property-provider': 4.2.11 '@smithy/protocol-http': 5.3.11 '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -19793,7 +20333,19 @@ snapshots: dependencies: '@aws-sdk/types': 3.973.5 '@smithy/eventstream-codec': 4.2.11 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + optional: true + + '@aws-sdk/lib-storage@3.1003.0(@aws-sdk/client-s3@3.1003.0)': + dependencies: + '@aws-sdk/client-s3': 3.1003.0 + '@smithy/abort-controller': 4.2.11 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/smithy-client': 4.12.2 + buffer: 5.6.0 + events: 3.3.0 + stream-browserify: 3.0.0 tslib: 2.8.1 '@aws-sdk/middleware-bucket-endpoint@3.972.7': @@ -19810,8 +20362,9 @@ snapshots: dependencies: '@aws-sdk/types': 3.973.5 '@smithy/protocol-http': 5.3.11 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 tslib: 2.8.1 + optional: true '@aws-sdk/middleware-expect-continue@3.972.7': dependencies: @@ -19906,11 +20459,12 @@ snapshots: '@smithy/fetch-http-handler': 5.3.13 '@smithy/protocol-http': 5.3.11 '@smithy/signature-v4': 5.3.11 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 '@smithy/util-base64': 4.3.2 '@smithy/util-hex-encoding': 4.2.2 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 + optional: true '@aws-sdk/nested-clients@3.996.6': dependencies: @@ -19940,7 +20494,7 @@ snapshots: '@smithy/node-http-handler': 4.4.14 '@smithy/protocol-http': 5.3.11 '@smithy/smithy-client': 4.12.2 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 '@smithy/url-parser': 4.2.11 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 @@ -19990,7 +20544,7 @@ snapshots: '@aws-sdk/types': 3.973.5 '@smithy/property-provider': 4.2.11 '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -20052,8 +20606,15 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@8.0.0': + dependencies: + '@babel/helper-validator-identifier': 8.0.4 + js-tokens: 10.0.0 + '@babel/compat-data@7.29.0': {} + '@babel/compat-data@8.0.5': {} + '@babel/core@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -20074,6 +20635,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@8.0.5': + dependencies: + '@babel/code-frame': 8.0.0 + '@babel/generator': 8.0.5 + '@babel/helper-compilation-targets': 8.0.5 + '@babel/helpers': 8.0.5 + '@babel/parser': 8.0.5 + '@babel/template': 8.0.0 + '@babel/traverse': 8.0.5 + '@babel/types': 8.0.5 + '@types/gensync': 1.0.5 + convert-source-map: 2.0.0 + empathic: 2.0.1 + gensync: 1.0.0-beta.2 + import-meta-resolve: 4.2.0 + json5: 2.2.3 + obug: 2.2.1 + verkit: 0.3.2 + '@babel/generator@7.29.1': dependencies: '@babel/parser': 7.29.0 @@ -20082,10 +20662,23 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 + '@babel/generator@8.0.5': + dependencies: + '@babel/parser': 8.0.5 + '@babel/types': 8.0.5 + '@jridgewell/gen-mapping': 0.4.0-beta.0 + '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.27.3': dependencies: '@babel/types': 7.29.0 + '@babel/helper-annotate-as-pure@8.0.0': + dependencies: + '@babel/types': 8.0.5 + '@babel/helper-compilation-targets@7.28.6': dependencies: '@babel/compat-data': 7.29.0 @@ -20094,6 +20687,14 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-compilation-targets@8.0.5': + dependencies: + '@babel/compat-data': 8.0.5 + '@babel/helper-validator-option': 8.0.0 + browserslist: 4.28.1 + lru-cache: 11.3.5 + verkit: 0.3.2 + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -20107,6 +20708,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-class-features-plugin@8.0.5(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-annotate-as-pure': 8.0.0 + '@babel/helper-member-expression-to-functions': 8.0.5 + '@babel/helper-optimise-call-expression': 8.0.0 + '@babel/helper-replace-supers': 8.0.1(@babel/core@8.0.5) + '@babel/helper-skip-transparent-expression-wrappers': 8.0.0 + '@babel/traverse': 8.0.5 + verkit: 0.3.2 + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -20127,6 +20739,8 @@ snapshots: '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@8.0.0': {} + '@babel/helper-member-expression-to-functions@7.28.5': dependencies: '@babel/traverse': 7.29.0 @@ -20134,6 +20748,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-member-expression-to-functions@8.0.5': + dependencies: + '@babel/traverse': 8.0.5 + '@babel/types': 8.0.5 + '@babel/helper-module-imports@7.28.6': dependencies: '@babel/traverse': 7.29.0 @@ -20141,6 +20760,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@8.0.0': + dependencies: + '@babel/traverse': 8.0.5 + '@babel/types': 8.0.5 + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -20150,12 +20774,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@8.0.5(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-module-imports': 8.0.0 + '@babel/helper-validator-identifier': 8.0.4 + '@babel/traverse': 8.0.5 + '@babel/helper-optimise-call-expression@7.27.1': dependencies: '@babel/types': 7.29.0 + '@babel/helper-optimise-call-expression@8.0.0': + dependencies: + '@babel/types': 8.0.5 + '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-plugin-utils@8.0.1(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -20174,6 +20813,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-replace-supers@8.0.1(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-member-expression-to-functions': 8.0.5 + '@babel/helper-optimise-call-expression': 8.0.0 + '@babel/traverse': 8.0.5 + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: '@babel/traverse': 7.29.0 @@ -20181,12 +20827,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-skip-transparent-expression-wrappers@8.0.0': + dependencies: + '@babel/traverse': 8.0.5 + '@babel/types': 8.0.5 + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@8.0.0': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@8.0.4': {} + '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-option@8.0.0': {} + '@babel/helper-wrap-function@7.28.6': dependencies: '@babel/template': 7.28.6 @@ -20200,10 +20857,19 @@ snapshots: '@babel/template': 7.28.6 '@babel/types': 7.29.0 + '@babel/helpers@8.0.5': + dependencies: + '@babel/template': 8.0.0 + '@babel/types': 8.0.5 + '@babel/parser@7.29.0': dependencies: '@babel/types': 7.29.0 + '@babel/parser@8.0.5': + dependencies: + '@babel/types': 8.0.5 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -20248,21 +20914,41 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -20273,16 +20959,31 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -20293,46 +20994,91 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-typescript@8.0.3(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.5) + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -20507,6 +21253,12 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-commonjs@8.0.1(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-module-transforms': 8.0.5(@babel/core@8.0.5) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.5) + '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -20694,6 +21446,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-typescript@8.0.5(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-annotate-as-pure': 8.0.0 + '@babel/helper-create-class-features-plugin': 8.0.5(@babel/core@8.0.5) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.5) + '@babel/helper-skip-transparent-expression-wrappers': 8.0.0 + '@babel/plugin-syntax-typescript': 8.0.3(@babel/core@8.0.5) + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -20823,6 +21584,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-typescript@8.0.1(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.5) + '@babel/helper-validator-option': 8.0.0 + '@babel/plugin-transform-modules-commonjs': 8.0.1(@babel/core@8.0.5) + '@babel/plugin-transform-typescript': 8.0.5(@babel/core@8.0.5) + '@babel/runtime@7.28.6': {} '@babel/template@7.28.6': @@ -20831,6 +21600,12 @@ snapshots: '@babel/parser': 7.29.0 '@babel/types': 7.29.0 + '@babel/template@8.0.0': + dependencies: + '@babel/code-frame': 8.0.0 + '@babel/parser': 8.0.5 + '@babel/types': 8.0.5 + '@babel/traverse@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -20843,11 +21618,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@8.0.5': + dependencies: + '@babel/code-frame': 8.0.0 + '@babel/generator': 8.0.5 + '@babel/helper-globals': 8.0.0 + '@babel/parser': 8.0.5 + '@babel/template': 8.0.0 + '@babel/types': 8.0.5 + obug: 2.2.1 + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@8.0.5': + dependencies: + '@babel/helper-string-parser': 8.0.0 + '@babel/helper-validator-identifier': 8.0.4 + '@bcoe/v8-coverage@0.2.3': {} '@blueprintjs/colors@5.1.16': @@ -20897,6 +21687,8 @@ snapshots: '@borewit/text-codec@0.2.2': {} + '@braintree/sanitize-url@7.1.2': {} + '@bramus/specificity@2.4.2': dependencies: css-tree: 3.2.1 @@ -20921,9 +21713,9 @@ snapshots: 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) - ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.25.2(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -20942,81 +21734,194 @@ snapshots: '@cfworker/json-schema@4.1.1': {} - '@clack/core@1.2.0': + '@chevrotain/types@11.1.2': {} + + '@clack/core@1.5.1': dependencies: - fast-wrap-ansi: 0.1.6 + fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 - '@clack/prompts@1.2.0': + '@clack/prompts@1.8.1': dependencies: - '@clack/core': 1.2.0 - fast-string-width: 1.1.0 - fast-wrap-ansi: 0.1.6 + '@clack/core': 1.5.1 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 - '@cloudflare/kv-asset-handler@0.5.0': {} + '@colors/colors@1.5.0': + optional: true + + '@copilotkit/a2ui-renderer@1.72.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@a2ui/web_core': 0.10.4 + clsx: 2.1.1 + lit: 3.3.3 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) - '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260811.1)': + '@copilotkit/channels-core@0.10.0(vitest@3.1.4)(zod@3.25.76)': dependencies: - unenv: 2.0.0-rc.24 + '@ag-ui/client': 0.0.59 + '@ag-ui/core': 0.0.59 + '@copilotkit/channels-ui': 0.10.0(@ag-ui/core@0.0.59) + '@copilotkit/core': 1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76) + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + zod-to-json-schema: 3.25.1(zod@3.25.76) optionalDependencies: - workerd: 1.20260811.1 + vitest: 3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) + transitivePeerDependencies: + - encoding + - zod - '@cloudflare/vitest-pool-workers@0.21.3(@cloudflare/workers-types@5.20260813.1)(@vitest/runner@4.1.10)(@vitest/snapshot@4.1.10)(bufferutil@4.1.0)(utf-8-validate@6.0.6)(vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@20.19.37)(@vitest/coverage-v8@1.6.0(vitest@3.1.4))(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jsdom@29.1.0(@noble/hashes@2.0.1)(canvas@2.11.2))(vite@8.2.1(@types/node@20.19.37)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)))': + '@copilotkit/channels-intelligence@0.10.0(@ag-ui/core@0.0.59)(@types/express@4.17.25)(bufferutil@4.1.0)(express@4.22.1)(utf-8-validate@5.0.10)(vitest@3.1.4)(zod@3.25.76)': dependencies: - '@vitest/runner': 4.1.10 - '@vitest/snapshot': 4.1.10 - cjs-module-lexer: 1.2.3 - esbuild: 0.28.1 - miniflare: 5.20260811.1-alpha(bufferutil@4.1.0)(utf-8-validate@6.0.6) - vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@20.19.37)(@vitest/coverage-v8@1.6.0(vitest@3.1.4))(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jsdom@29.1.0(@noble/hashes@2.0.1)(canvas@2.11.2))(vite@8.2.1(@types/node@20.19.37)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) - wrangler: 4.123.0(@cloudflare/workers-types@5.20260813.1)(bufferutil@4.1.0)(utf-8-validate@6.0.6) - zod: 4.4.3 + '@ag-ui/client': 0.0.59 + '@copilotkit/channels-core': 0.10.0(vitest@3.1.4)(zod@3.25.76) + '@copilotkit/channels-slack': 0.10.0(@types/express@4.17.25)(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vitest@3.1.4)(zod@3.25.76) + '@copilotkit/channels-teams': 0.10.0(express@4.22.1)(vitest@3.1.4)(zod@3.25.76) + '@copilotkit/channels-ui': 0.10.0(@ag-ui/core@0.0.59) + phoenix: 1.8.14 transitivePeerDependencies: - - '@cloudflare/workers-types' + - '@ag-ui/core' + - '@microsoft/agents-activity' + - '@microsoft/agents-hosting' + - '@types/express' - bufferutil + - debug + - encoding + - express + - supports-color - utf-8-validate + - vitest + - zod - '@cloudflare/workerd-darwin-64@1.20260811.1': - optional: true - - '@cloudflare/workerd-darwin-arm64@1.20260811.1': - optional: true + '@copilotkit/channels-slack@0.10.0(@types/express@4.17.25)(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vitest@3.1.4)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.59 + '@ag-ui/core': 0.0.59 + '@copilotkit/channels-core': 0.10.0(vitest@3.1.4)(zod@3.25.76) + '@copilotkit/channels-ui': 0.10.0(@ag-ui/core@0.0.59) + '@copilotkit/core': 1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76) + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + '@slack/bolt': 4.7.3(@types/express@4.17.25)(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@slack/types': 2.22.0 + '@slack/web-api': 7.19.0 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/express' + - bufferutil + - debug + - encoding + - supports-color + - utf-8-validate + - vitest + - zod - '@cloudflare/workerd-linux-64@1.20260811.1': - optional: true + '@copilotkit/channels-teams@0.10.0(express@4.22.1)(vitest@3.1.4)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.59 + '@ag-ui/core': 0.0.59 + '@copilotkit/channels-core': 0.10.0(vitest@3.1.4)(zod@3.25.76) + '@copilotkit/channels-ui': 0.10.0(@ag-ui/core@0.0.59) + '@copilotkit/core': 1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76) + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + rxjs: 7.8.2 + optionalDependencies: + express: 4.22.1 + transitivePeerDependencies: + - encoding + - vitest + - zod - '@cloudflare/workerd-linux-arm64@1.20260811.1': - optional: true + '@copilotkit/channels-ui@0.10.0(@ag-ui/core@0.0.59)': + dependencies: + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + transitivePeerDependencies: + - '@ag-ui/core' + - encoding - '@cloudflare/workerd-windows-64@1.20260811.1': - optional: true + '@copilotkit/core@1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.59 + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + '@tanstack/pacer': 0.20.1 + phoenix: 1.8.14 + rxjs: 7.8.1 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - '@ag-ui/core' + - encoding + - zod - '@cloudflare/workers-types@5.20260813.1': {} + '@copilotkit/license-verifier@0.5.0': {} - '@colors/colors@1.5.0': - optional: true + '@copilotkit/mcp-apps-renderer@1.72.0(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@cfworker/json-schema@4.1.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.59 + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + '@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) + '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - '@ag-ui/core' + - '@cfworker/json-schema' + - encoding + - react + - react-dom + - supports-color - '@copilotkit/react-core@1.10.6(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@copilotkit/react-core@1.72.0(@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)': dependencies: - '@copilotkit/runtime-client-gql': 1.10.6(graphql@16.13.1)(react@19.2.4) - '@copilotkit/shared': 1.10.6 + '@ag-ui/client': 0.0.59 + '@ag-ui/core': 0.0.59 + '@copilotkit/a2ui-renderer': 1.72.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@copilotkit/core': 1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76) + '@copilotkit/mcp-apps-renderer': 1.72.0(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@cfworker/json-schema@4.1.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) + '@copilotkit/runtime-client-gql': 1.72.0(@ag-ui/core@0.0.59)(graphql@16.13.1)(react@19.2.4) + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + '@copilotkit/web-components': 1.72.0(lit@3.3.3) + '@copilotkit/web-inspector': 1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76) + '@jetbrains/websandbox': 1.4.1 + '@radix-ui/react-dropdown-menu': 2.1.24(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-tooltip': 1.2.16(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@scarf/scarf': 1.4.0 + '@tanstack/react-virtual': 3.13.21(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + class-variance-authority: 0.7.1 + clsx: 2.1.1 + katex: 0.16.35 + lit: 3.3.3 + lucide-react: 0.525.0(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) react-markdown: 8.0.7(@types/react@19.1.8)(react@19.2.4) + rxjs: 7.8.1 + streamdown: 1.6.11(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.2.4) + tailwind-merge: 3.7.0 + tw-animate-css: 1.4.0 untruncate-json: 0.0.1 + use-stick-to-bottom: 1.1.6(react@19.2.4) + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: + - '@cfworker/json-schema' + - '@types/mdast' - '@types/react' + - '@types/react-dom' - encoding - graphql + - micromark + - micromark-util-types - supports-color - '@copilotkit/react-textarea@1.10.6(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@copilotkit/react-textarea@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)': dependencies: - '@copilotkit/react-core': 1.10.6(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@copilotkit/runtime-client-gql': 1.10.6(graphql@16.13.1)(react@19.2.4) - '@copilotkit/shared': 1.10.6 + '@copilotkit/react-core': 1.72.0(@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-client-gql': 1.72.0(@ag-ui/core@0.0.59)(graphql@16.13.1)(react@19.2.4) + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) '@emotion/css': 11.13.5 '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.2.4) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.2.4))(@types/react@19.1.8)(react@19.2.4) @@ -21038,237 +21943,166 @@ snapshots: slate-react: 0.98.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(slate@0.94.1) tailwind-merge: 1.14.0 transitivePeerDependencies: + - '@ag-ui/core' + - '@cfworker/json-schema' + - '@types/mdast' - '@types/react' - '@types/react-dom' - encoding - graphql + - micromark + - micromark-util-types - supports-color + - zod - '@copilotkit/react-ui@1.10.6(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@copilotkit/react-ui@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)': dependencies: - '@copilotkit/react-core': 1.10.6(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@copilotkit/runtime-client-gql': 1.10.6(graphql@16.13.1)(react@19.2.4) - '@copilotkit/shared': 1.10.6 + '@copilotkit/react-core': 1.72.0(@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-client-gql': 1.72.0(@ag-ui/core@0.0.59)(graphql@16.13.1)(react@19.2.4) + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) '@headlessui/react': 2.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-markdown: 10.1.0(@types/react@19.1.8)(react@19.2.4) - react-syntax-highlighter: 15.6.6(react@19.2.4) + react-syntax-highlighter: 16.1.1(react@19.2.4) rehype-raw: 7.0.0 + rehype-sanitize: 6.0.0 remark-gfm: 4.0.1 remark-math: 6.0.0 transitivePeerDependencies: + - '@ag-ui/core' + - '@cfworker/json-schema' + - '@types/mdast' - '@types/react' + - '@types/react-dom' - encoding - graphql + - micromark + - micromark-util-types - react-dom - supports-color + - zod - '@copilotkit/runtime-client-gql@1.10.6(graphql@16.13.1)(react@19.2.4)': + '@copilotkit/runtime-client-gql@1.72.0(@ag-ui/core@0.0.59)(graphql@16.13.1)(react@19.2.4)': dependencies: - '@copilotkit/shared': 1.10.6 + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) '@urql/core': 5.2.0(graphql@16.13.1) react: 19.2.4 untruncate-json: 0.0.1 urql: 4.2.2(@urql/core@5.2.0(graphql@16.13.1))(react@19.2.4) transitivePeerDependencies: + - '@ag-ui/core' - encoding - graphql - '@copilotkit/runtime@1.10.6(c5ef6e30f9cb72b0a9db20b1502179b1)': - dependencies: - '@ag-ui/client': 0.0.47 - '@ag-ui/core': 0.0.47 - '@ag-ui/encoder': 0.0.47 - '@ag-ui/langgraph': 0.0.24(@ag-ui/client@0.0.47)(@ag-ui/core@0.0.47)(@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) - '@ag-ui/proto': 0.0.47 - '@anthropic-ai/sdk': 0.57.0 - '@copilotkit/shared': 1.10.6 + '@copilotkit/runtime@1.72.0(060090e105863d9983aa04d300df3d3a)': + 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/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) + '@ai-sdk/google': 3.0.123(zod@3.25.76) + '@ai-sdk/google-vertex': 3.0.174(zod@3.25.76) + '@ai-sdk/mcp': 1.0.81(zod@3.25.76) + '@ai-sdk/openai': 3.0.113(zod@3.25.76) + '@cfworker/json-schema': 4.1.1 + '@copilotkit/channels-core': 0.10.0(vitest@3.1.4)(zod@3.25.76) + '@copilotkit/channels-intelligence': 0.10.0(@ag-ui/core@0.0.59)(@types/express@4.17.25)(bufferutil@4.1.0)(express@4.22.1)(utf-8-validate@5.0.10)(vitest@3.1.4)(zod@3.25.76) + '@copilotkit/license-verifier': 0.5.0 + '@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) - '@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': 0.3.59(bde0b9db2f2a07fbe92f00b76fe0eadb) - '@langchain/core': 0.3.80(@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@4.104.0(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@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(zod@3.25.76) - '@langchain/langgraph-sdk': 0.0.70(@langchain/core@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(react@19.2.4) - '@langchain/openai': 0.4.9(@langchain/core@0.3.80(@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@4.104.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)) + '@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)) + '@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 + '@segment/analytics-node': 2.3.0 + '@types/cors': 2.8.19 + '@types/express': 4.17.25 + ai: 6.0.285(zod@3.25.76) + clarinet: 0.12.6 class-transformer: 0.5.1 class-validator: 0.14.4 + cors: 2.8.6 express: 4.22.1 graphql: 16.13.1 graphql-scalars: 1.25.0(graphql@16.13.1) graphql-yoga: 5.18.0(graphql@16.13.1) - groq-sdk: 0.5.0 - langchain: 0.3.37(@langchain/aws@0.1.15(@langchain/core@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))))(@langchain/core@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(@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))(axios@1.19.0)(cheerio@1.2.0)(handlebars@4.7.9)(openai@4.104.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)) - openai: 4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + hono: 4.12.10 partial-json: 0.1.7 - pino: 9.14.0 + phoenix: 1.8.14 + pino: 10.3.1 pino-pretty: 11.3.0 reflect-metadata: 0.2.2 rxjs: 7.8.1 type-graphql: 2.0.0-rc.1(class-validator@0.14.4)(graphql-scalars@1.25.0(graphql@16.13.1))(graphql@16.13.1) + uuid: 11.1.0 + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) 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)) + 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)) + openai: 6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) transitivePeerDependencies: - - '@arcjet/redact' - - '@aws-crypto/sha256-js' - - '@aws-sdk/client-bedrock-agent-runtime' - - '@aws-sdk/client-bedrock-runtime' - - '@aws-sdk/client-dynamodb' - - '@aws-sdk/client-kendra' - - '@aws-sdk/client-lambda' - - '@aws-sdk/client-s3' - - '@aws-sdk/client-sagemaker-runtime' - - '@aws-sdk/client-sfn' - - '@aws-sdk/credential-provider-node' - - '@aws-sdk/dsql-signer' - - '@azure/search-documents' - - '@azure/storage-blob' - - '@browserbasehq/sdk' - - '@browserbasehq/stagehand' - - '@clickhouse/client' - - '@cloudflare/ai' - - '@datastax/astra-db-ts' - - '@elastic/elasticsearch' - - '@getmetal/metal-sdk' - - '@getzep/zep-cloud' - - '@getzep/zep-js' - - '@gomomento/sdk' - - '@gomomento/sdk-core' - - '@google-ai/generativelanguage' - - '@google-cloud/storage' - - '@gradientai/nodejs-sdk' - - '@huggingface/inference' - - '@huggingface/transformers' - - '@ibm-cloud/watsonx-ai' - - '@lancedb/lancedb' - - '@langchain/anthropic' - - '@langchain/cerebras' - - '@langchain/cohere' - - '@langchain/deepseek' - - '@langchain/google-genai' - - '@langchain/google-vertexai' - - '@langchain/google-vertexai-web' - - '@langchain/groq' - - '@langchain/mistralai' - - '@langchain/ollama' - - '@langchain/xai' - - '@layerup/layerup-security' - - '@libsql/client' - - '@mendable/firecrawl-js' - - '@mlc-ai/web-llm' - - '@mozilla/readability' - - '@neondatabase/serverless' - - '@notionhq/client' - - '@opensearch-project/opensearch' + - '@microsoft/agents-activity' + - '@microsoft/agents-hosting' - '@opentelemetry/api' - '@opentelemetry/exporter-trace-otlp-proto' - '@opentelemetry/sdk-trace-base' - - '@pinecone-database/pinecone' - - '@planetscale/database' - - '@premai/prem-sdk' - - '@qdrant/js-client-rest' - - '@raycast/api' - - '@rockset/client' - - '@smithy/eventstream-codec' - - '@smithy/protocol-http' - - '@smithy/signature-v4' - - '@smithy/util-utf8' - - '@spider-cloud/spider-client' - - '@supabase/supabase-js' - - '@tensorflow-models/universal-sentence-encoder' - - '@tensorflow/tfjs-converter' - - '@tensorflow/tfjs-core' - - '@upstash/ratelimit' - - '@upstash/redis' - - '@upstash/vector' - - '@vercel/kv' - - '@vercel/postgres' - - '@writerai/writer-sdk' - - '@xata.io/client' - - '@zilliz/milvus2-sdk-node' - - apify-client - - assemblyai - - aws-crt - - axios - - azion - - better-sqlite3 - - cassandra-driver - - cborg - - cheerio - - chromadb - - closevector-common - - closevector-node - - closevector-web - - cohere-ai - - convex - - crypto-js - - d3-dsv - - discord.js - - duck-duck-scrape + - bufferutil + - debug - encoding - - epub2 - - fast-xml-parser - - firebase-admin - - google-auth-library - - googleapis - - handlebars - - hnswlib-node - - html-to-text - - ibm-cloud-sdk-core - - ignore - - interface-datastore - - ioredis - - it-all - - jsdom - - jsonwebtoken - - llmonitor - - lodash - - lunary - - mammoth - - mariadb - - mem0ai - - mongodb - - mysql2 - - neo4j-driver - - notion-to-md - - officeparser - - pdf-parse - - peggy - - pg - - pg-copy-streams - - pickleparser - - playwright - - portkey-ai - - puppeteer - - pyodide - react - - redis - - replicate - - sonix-speech-recognition - - srt-parser-2 - - supports-color - - typeorm - - typesense - - usearch - - voy-search - - weaviate-client - - web-auth-library - - word-extractor - - ws - - youtubei.js + - react-dom + - supports-color + - svelte + - utf-8-validate + - vitest + - vue - '@copilotkit/shared@1.10.6': + '@copilotkit/shared@1.72.0(@ag-ui/core@0.0.59)': dependencies: - '@ag-ui/core': 0.0.37 + '@ag-ui/client': 0.0.59 + '@ag-ui/core': 0.0.59 + '@copilotkit/license-verifier': 0.5.0 '@segment/analytics-node': 2.3.0 + '@standard-schema/spec': 1.1.0 chalk: 4.1.2 graphql: 16.13.1 - uuid: 10.0.0 + partial-json: 0.1.7 + uuid: 11.1.0 zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.25.2(zod@3.25.76) transitivePeerDependencies: - encoding - '@crxjs/vite-plugin@2.7.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3))': + '@copilotkit/web-components@1.72.0(lit@3.3.3)': + dependencies: + lit: 3.3.3 + + '@copilotkit/web-inspector@1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.59 + '@copilotkit/core': 1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76) + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + lit: 3.3.3 + lucide: 0.525.0 + marked: 12.0.2 + transitivePeerDependencies: + - '@ag-ui/core' + - encoding + - zod + + '@crxjs/vite-plugin@2.7.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1))': dependencies: '@webcomponents/custom-elements': 1.6.0 acorn-walk: 8.3.5 @@ -21284,7 +22118,7 @@ snapshots: rollup: 2.80.0 rxjs: 7.5.7 tinyglobby: 0.2.17 - vite: 8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vite: 8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) transitivePeerDependencies: - supports-color @@ -21347,8 +22181,6 @@ snapshots: tunnel-agent: 0.6.0 uuid: 8.3.2 - '@datastructures-js/deque@1.0.8': {} - '@dub/analytics@0.0.32': dependencies: server-only: 0.0.1 @@ -21492,10 +22324,7 @@ snapshots: '@esbuild/aix-ppc64@0.27.3': optional: true - '@esbuild/aix-ppc64@0.27.7': - optional: true - - '@esbuild/aix-ppc64@0.28.1': + '@esbuild/aix-ppc64@0.28.2': optional: true '@esbuild/android-arm64@0.25.12': @@ -21504,10 +22333,7 @@ snapshots: '@esbuild/android-arm64@0.27.3': optional: true - '@esbuild/android-arm64@0.27.7': - optional: true - - '@esbuild/android-arm64@0.28.1': + '@esbuild/android-arm64@0.28.2': optional: true '@esbuild/android-arm@0.25.12': @@ -21516,10 +22342,7 @@ snapshots: '@esbuild/android-arm@0.27.3': optional: true - '@esbuild/android-arm@0.27.7': - optional: true - - '@esbuild/android-arm@0.28.1': + '@esbuild/android-arm@0.28.2': optional: true '@esbuild/android-x64@0.25.12': @@ -21528,10 +22351,7 @@ snapshots: '@esbuild/android-x64@0.27.3': optional: true - '@esbuild/android-x64@0.27.7': - optional: true - - '@esbuild/android-x64@0.28.1': + '@esbuild/android-x64@0.28.2': optional: true '@esbuild/darwin-arm64@0.25.12': @@ -21540,10 +22360,7 @@ snapshots: '@esbuild/darwin-arm64@0.27.3': optional: true - '@esbuild/darwin-arm64@0.27.7': - optional: true - - '@esbuild/darwin-arm64@0.28.1': + '@esbuild/darwin-arm64@0.28.2': optional: true '@esbuild/darwin-x64@0.25.12': @@ -21552,10 +22369,7 @@ snapshots: '@esbuild/darwin-x64@0.27.3': optional: true - '@esbuild/darwin-x64@0.27.7': - optional: true - - '@esbuild/darwin-x64@0.28.1': + '@esbuild/darwin-x64@0.28.2': optional: true '@esbuild/freebsd-arm64@0.25.12': @@ -21564,10 +22378,7 @@ snapshots: '@esbuild/freebsd-arm64@0.27.3': optional: true - '@esbuild/freebsd-arm64@0.27.7': - optional: true - - '@esbuild/freebsd-arm64@0.28.1': + '@esbuild/freebsd-arm64@0.28.2': optional: true '@esbuild/freebsd-x64@0.25.12': @@ -21576,10 +22387,7 @@ snapshots: '@esbuild/freebsd-x64@0.27.3': optional: true - '@esbuild/freebsd-x64@0.27.7': - optional: true - - '@esbuild/freebsd-x64@0.28.1': + '@esbuild/freebsd-x64@0.28.2': optional: true '@esbuild/linux-arm64@0.25.12': @@ -21588,10 +22396,7 @@ snapshots: '@esbuild/linux-arm64@0.27.3': optional: true - '@esbuild/linux-arm64@0.27.7': - optional: true - - '@esbuild/linux-arm64@0.28.1': + '@esbuild/linux-arm64@0.28.2': optional: true '@esbuild/linux-arm@0.25.12': @@ -21600,10 +22405,7 @@ snapshots: '@esbuild/linux-arm@0.27.3': optional: true - '@esbuild/linux-arm@0.27.7': - optional: true - - '@esbuild/linux-arm@0.28.1': + '@esbuild/linux-arm@0.28.2': optional: true '@esbuild/linux-ia32@0.25.12': @@ -21612,10 +22414,7 @@ snapshots: '@esbuild/linux-ia32@0.27.3': optional: true - '@esbuild/linux-ia32@0.27.7': - optional: true - - '@esbuild/linux-ia32@0.28.1': + '@esbuild/linux-ia32@0.28.2': optional: true '@esbuild/linux-loong64@0.25.12': @@ -21624,10 +22423,7 @@ snapshots: '@esbuild/linux-loong64@0.27.3': optional: true - '@esbuild/linux-loong64@0.27.7': - optional: true - - '@esbuild/linux-loong64@0.28.1': + '@esbuild/linux-loong64@0.28.2': optional: true '@esbuild/linux-mips64el@0.25.12': @@ -21636,10 +22432,7 @@ snapshots: '@esbuild/linux-mips64el@0.27.3': optional: true - '@esbuild/linux-mips64el@0.27.7': - optional: true - - '@esbuild/linux-mips64el@0.28.1': + '@esbuild/linux-mips64el@0.28.2': optional: true '@esbuild/linux-ppc64@0.25.12': @@ -21648,10 +22441,7 @@ snapshots: '@esbuild/linux-ppc64@0.27.3': optional: true - '@esbuild/linux-ppc64@0.27.7': - optional: true - - '@esbuild/linux-ppc64@0.28.1': + '@esbuild/linux-ppc64@0.28.2': optional: true '@esbuild/linux-riscv64@0.25.12': @@ -21660,10 +22450,7 @@ snapshots: '@esbuild/linux-riscv64@0.27.3': optional: true - '@esbuild/linux-riscv64@0.27.7': - optional: true - - '@esbuild/linux-riscv64@0.28.1': + '@esbuild/linux-riscv64@0.28.2': optional: true '@esbuild/linux-s390x@0.25.12': @@ -21672,10 +22459,7 @@ snapshots: '@esbuild/linux-s390x@0.27.3': optional: true - '@esbuild/linux-s390x@0.27.7': - optional: true - - '@esbuild/linux-s390x@0.28.1': + '@esbuild/linux-s390x@0.28.2': optional: true '@esbuild/linux-x64@0.25.12': @@ -21684,10 +22468,7 @@ snapshots: '@esbuild/linux-x64@0.27.3': optional: true - '@esbuild/linux-x64@0.27.7': - optional: true - - '@esbuild/linux-x64@0.28.1': + '@esbuild/linux-x64@0.28.2': optional: true '@esbuild/netbsd-arm64@0.25.12': @@ -21696,10 +22477,7 @@ snapshots: '@esbuild/netbsd-arm64@0.27.3': optional: true - '@esbuild/netbsd-arm64@0.27.7': - optional: true - - '@esbuild/netbsd-arm64@0.28.1': + '@esbuild/netbsd-arm64@0.28.2': optional: true '@esbuild/netbsd-x64@0.25.12': @@ -21708,10 +22486,7 @@ snapshots: '@esbuild/netbsd-x64@0.27.3': optional: true - '@esbuild/netbsd-x64@0.27.7': - optional: true - - '@esbuild/netbsd-x64@0.28.1': + '@esbuild/netbsd-x64@0.28.2': optional: true '@esbuild/openbsd-arm64@0.25.12': @@ -21720,10 +22495,7 @@ snapshots: '@esbuild/openbsd-arm64@0.27.3': optional: true - '@esbuild/openbsd-arm64@0.27.7': - optional: true - - '@esbuild/openbsd-arm64@0.28.1': + '@esbuild/openbsd-arm64@0.28.2': optional: true '@esbuild/openbsd-x64@0.25.12': @@ -21732,10 +22504,7 @@ snapshots: '@esbuild/openbsd-x64@0.27.3': optional: true - '@esbuild/openbsd-x64@0.27.7': - optional: true - - '@esbuild/openbsd-x64@0.28.1': + '@esbuild/openbsd-x64@0.28.2': optional: true '@esbuild/openharmony-arm64@0.25.12': @@ -21744,10 +22513,7 @@ snapshots: '@esbuild/openharmony-arm64@0.27.3': optional: true - '@esbuild/openharmony-arm64@0.27.7': - optional: true - - '@esbuild/openharmony-arm64@0.28.1': + '@esbuild/openharmony-arm64@0.28.2': optional: true '@esbuild/sunos-x64@0.25.12': @@ -21756,10 +22522,7 @@ snapshots: '@esbuild/sunos-x64@0.27.3': optional: true - '@esbuild/sunos-x64@0.27.7': - optional: true - - '@esbuild/sunos-x64@0.28.1': + '@esbuild/sunos-x64@0.28.2': optional: true '@esbuild/win32-arm64@0.25.12': @@ -21768,10 +22531,7 @@ snapshots: '@esbuild/win32-arm64@0.27.3': optional: true - '@esbuild/win32-arm64@0.27.7': - optional: true - - '@esbuild/win32-arm64@0.28.1': + '@esbuild/win32-arm64@0.28.2': optional: true '@esbuild/win32-ia32@0.25.12': @@ -21780,10 +22540,7 @@ snapshots: '@esbuild/win32-ia32@0.27.3': optional: true - '@esbuild/win32-ia32@0.27.7': - optional: true - - '@esbuild/win32-ia32@0.28.1': + '@esbuild/win32-ia32@0.28.2': optional: true '@esbuild/win32-x64@0.25.12': @@ -21792,10 +22549,7 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true - '@esbuild/win32-x64@0.27.7': - optional: true - - '@esbuild/win32-x64@0.28.1': + '@esbuild/win32-x64@0.28.2': optional: true '@eslint-community/eslint-utils@4.9.1(eslint@8.57.0)': @@ -21841,24 +22595,24 @@ snapshots: '@expo/sudo-prompt@9.3.2': {} - '@farcaster/miniapp-core@0.5.1(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)': + '@farcaster/miniapp-core@0.6.0(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) - ox: 0.4.4(typescript@5.5.4)(zod@3.25.76) - zod: 3.25.76 + ox: 0.14.0(typescript@5.5.4)(zod@4.6.5) + zod: 4.6.5 transitivePeerDependencies: - bufferutil - encoding - typescript - utf-8-validate - '@farcaster/miniapp-sdk@0.2.3(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@farcaster/miniapp-sdk@0.3.0(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@farcaster/miniapp-core': 0.5.1(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) + '@farcaster/miniapp-core': 0.6.0(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) '@farcaster/quick-auth': 0.0.6(typescript@5.5.4) comlink: 4.4.2 eventemitter3: 5.0.4 - ox: 0.4.4(typescript@5.5.4)(zod@3.25.76) + ox: 0.14.0(typescript@5.5.4)(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -21872,6 +22626,8 @@ snapshots: typescript: 5.5.4 zod: 3.25.76 + '@fastify/busboy@2.1.1': {} + '@fastify/busboy@3.2.0': {} '@fastify/otel@0.17.1(@opentelemetry/api@1.9.0)': @@ -22033,10 +22789,23 @@ snapshots: react-dom: 19.2.4(react@19.2.4) use-sync-external-store: 1.6.0(react@19.2.4) + '@hono/node-server@1.19.11(hono@4.12.10)': + dependencies: + hono: 4.12.10 + '@hono/node-server@1.19.11(hono@4.12.5)': dependencies: hono: 4.12.5 + '@hono/node-ws@1.3.1(@hono/node-server@1.19.11(hono@4.12.10))(bufferutil@4.1.0)(hono@4.12.10)(utf-8-validate@5.0.10)': + dependencies: + '@hono/node-server': 1.19.11(hono@4.12.10) + hono: 4.12.10 + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@hookform/resolvers@3.10.0(react-hook-form@7.71.2(react@19.2.4))': dependencies: react-hook-form: 7.71.2(react@19.2.4) @@ -22062,16 +22831,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@img/colour@1.1.0': {} + '@iconify/types@2.0.0': {} - '@img/sharp-darwin-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@iconify/utils@3.1.7': + dependencies: + '@antfu/install-pkg': 2.1.0 + '@iconify/types': 2.0.0 + import-meta-resolve: 4.2.0 + + '@img/colour@1.1.0': optional: true - '@img/sharp-darwin-arm64@0.35.2': + '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.3.1 + '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true '@img/sharp-darwin-arm64@0.35.3': @@ -22084,21 +22857,11 @@ snapshots: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true - '@img/sharp-darwin-x64@0.35.2': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.3.1 - optional: true - '@img/sharp-darwin-x64@0.35.3': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.3.2 optional: true - '@img/sharp-freebsd-wasm32@0.35.2': - dependencies: - '@img/sharp-wasm32': 0.35.2 - optional: true - '@img/sharp-freebsd-wasm32@0.35.3': dependencies: '@img/sharp-wasm32': 0.35.3 @@ -22107,84 +22870,54 @@ snapshots: '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true - '@img/sharp-libvips-darwin-arm64@1.3.1': - optional: true - '@img/sharp-libvips-darwin-arm64@1.3.2': optional: true '@img/sharp-libvips-darwin-x64@1.0.4': optional: true - '@img/sharp-libvips-darwin-x64@1.3.1': - optional: true - '@img/sharp-libvips-darwin-x64@1.3.2': optional: true '@img/sharp-libvips-linux-arm64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm64@1.3.1': - optional: true - '@img/sharp-libvips-linux-arm64@1.3.2': optional: true '@img/sharp-libvips-linux-arm@1.0.5': optional: true - '@img/sharp-libvips-linux-arm@1.3.1': - optional: true - '@img/sharp-libvips-linux-arm@1.3.2': optional: true - '@img/sharp-libvips-linux-ppc64@1.3.1': - optional: true - '@img/sharp-libvips-linux-ppc64@1.3.2': optional: true - '@img/sharp-libvips-linux-riscv64@1.3.1': - optional: true - '@img/sharp-libvips-linux-riscv64@1.3.2': optional: true '@img/sharp-libvips-linux-s390x@1.0.4': optional: true - '@img/sharp-libvips-linux-s390x@1.3.1': - optional: true - '@img/sharp-libvips-linux-s390x@1.3.2': optional: true '@img/sharp-libvips-linux-x64@1.0.4': optional: true - '@img/sharp-libvips-linux-x64@1.3.1': - optional: true - '@img/sharp-libvips-linux-x64@1.3.2': optional: true '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.3.1': - optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.3.2': optional: true '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.3.1': - optional: true - '@img/sharp-libvips-linuxmusl-x64@1.3.2': optional: true @@ -22193,11 +22926,6 @@ snapshots: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true - '@img/sharp-linux-arm64@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.3.1 - optional: true - '@img/sharp-linux-arm64@0.35.3': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.3.2 @@ -22208,31 +22936,16 @@ snapshots: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true - '@img/sharp-linux-arm@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.3.1 - optional: true - '@img/sharp-linux-arm@0.35.3': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.3.2 optional: true - '@img/sharp-linux-ppc64@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.3.1 - optional: true - '@img/sharp-linux-ppc64@0.35.3': optionalDependencies: '@img/sharp-libvips-linux-ppc64': 1.3.2 optional: true - '@img/sharp-linux-riscv64@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.3.1 - optional: true - '@img/sharp-linux-riscv64@0.35.3': optionalDependencies: '@img/sharp-libvips-linux-riscv64': 1.3.2 @@ -22243,11 +22956,6 @@ snapshots: '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true - '@img/sharp-linux-s390x@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.3.1 - optional: true - '@img/sharp-linux-s390x@0.35.3': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.3.2 @@ -22258,11 +22966,6 @@ snapshots: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true - '@img/sharp-linux-x64@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.3.1 - optional: true - '@img/sharp-linux-x64@0.35.3': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.3.2 @@ -22273,11 +22976,6 @@ snapshots: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true - '@img/sharp-linuxmusl-arm64@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.3.1 - optional: true - '@img/sharp-linuxmusl-arm64@0.35.3': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.3.2 @@ -22288,11 +22986,6 @@ snapshots: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true - '@img/sharp-linuxmusl-x64@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.3.1 - optional: true - '@img/sharp-linuxmusl-x64@0.35.3': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.3.2 @@ -22303,47 +22996,28 @@ snapshots: '@emnapi/runtime': 1.8.1 optional: true - '@img/sharp-wasm32@0.35.2': - dependencies: - '@emnapi/runtime': 1.11.3 - optional: true - '@img/sharp-wasm32@0.35.3': dependencies: '@emnapi/runtime': 1.11.3 optional: true - '@img/sharp-webcontainers-wasm32@0.35.2': - dependencies: - '@img/sharp-wasm32': 0.35.2 - optional: true - '@img/sharp-webcontainers-wasm32@0.35.3': dependencies: '@img/sharp-wasm32': 0.35.3 optional: true - '@img/sharp-win32-arm64@0.35.2': - optional: true - '@img/sharp-win32-arm64@0.35.3': optional: true '@img/sharp-win32-ia32@0.33.5': optional: true - '@img/sharp-win32-ia32@0.35.2': - optional: true - '@img/sharp-win32-ia32@0.35.3': optional: true '@img/sharp-win32-x64@0.33.5': optional: true - '@img/sharp-win32-x64@0.35.2': - optional: true - '@img/sharp-win32-x64@0.35.3': optional: true @@ -22529,7 +23203,7 @@ snapshots: '@isaacs/ttlcache@1.4.1': {} - '@isaacs/ttlcache@2.1.4': {} + '@isaacs/ttlcache@2.1.5': {} '@istanbuljs/load-nyc-config@1.1.0': dependencies: @@ -22707,11 +23381,18 @@ snapshots: '@types/yargs': 17.0.35 chalk: 4.1.2 + '@jetbrains/websandbox@1.4.1': {} + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping@0.4.0-beta.0': + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -22726,6 +23407,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -22928,6 +23611,7 @@ snapshots: '@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)) 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))': dependencies: @@ -22951,69 +23635,7 @@ snapshots: - openai - ws - '@langchain/community@0.3.59(bde0b9db2f2a07fbe92f00b76fe0eadb)': - 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/core': 0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - '@langchain/openai': 0.5.18(@langchain/core@0.3.80(@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@4.104.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/weaviate': 0.2.3(@langchain/core@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))) - binary-extensions: 2.3.0 - flat: 5.0.2 - ibm-cloud-sdk-core: 5.4.8 - js-yaml: 4.1.1 - langchain: 0.3.37(@langchain/aws@0.1.15(@langchain/core@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))))(@langchain/core@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(@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))(axios@1.19.0)(cheerio@1.2.0)(handlebars@4.7.9)(openai@4.104.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.3.87(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - math-expression-evaluator: 2.0.7 - openai: 4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) - uuid: 10.0.0 - zod: 3.25.76 - optionalDependencies: - '@aws-crypto/sha256-js': 5.2.0 - '@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/client-s3': 3.1003.0 - '@aws-sdk/credential-provider-node': 3.972.17 - '@browserbasehq/sdk': 2.7.0 - '@upstash/redis': 1.36.3 - cheerio: 1.2.0 - crypto-js: 4.2.0 - fast-xml-parser: 5.11.0 - google-auth-library: 9.15.1 - googleapis: 137.1.0 - html-to-text: 9.0.5 - ioredis: 5.10.0 - jsdom: 22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10) - jsonwebtoken: 9.0.3 - lodash: 4.17.23 - pg: 8.20.0 - playwright: 1.58.2 - redis: 4.7.1 - weaviate-client: 3.12.0 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - '@langchain/anthropic' - - '@langchain/aws' - - '@langchain/cerebras' - - '@langchain/cohere' - - '@langchain/deepseek' - - '@langchain/google-genai' - - '@langchain/google-vertexai' - - '@langchain/google-vertexai-web' - - '@langchain/groq' - - '@langchain/mistralai' - - '@langchain/ollama' - - '@langchain/xai' - - '@opentelemetry/api' - - '@opentelemetry/exporter-trace-otlp-proto' - - '@opentelemetry/sdk-trace-base' - - axios - - encoding - - handlebars - - peggy - - '@langchain/community@1.1.27(877e75223018bd2be751ee722fb15fb5)': + '@langchain/community@1.1.27(66046857593e81cf94589e5d63e1e984)': 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 @@ -23034,21 +23656,26 @@ snapshots: '@aws-sdk/client-s3': 3.1003.0 '@aws-sdk/credential-provider-node': 3.972.17 '@browserbasehq/sdk': 2.7.0 + '@smithy/eventstream-codec': 4.2.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/signature-v4': 5.3.11 + '@smithy/util-utf8': 4.2.2 '@upstash/redis': 1.36.3 cheerio: 1.2.0 crypto-js: 4.2.0 + d3-dsv: 3.0.1 fast-xml-parser: 5.11.0 google-auth-library: 9.15.1 googleapis: 137.1.0 html-to-text: 9.0.5 + ignore: 7.0.5 ioredis: 5.10.0 jsdom: 22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10) jsonwebtoken: 9.0.3 lodash: 4.17.23 - pg: 8.20.0 + pg: 8.23.0 playwright: 1.58.2 redis: 4.7.1 - weaviate-client: 3.12.0 ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@opentelemetry/api' @@ -23056,58 +23683,34 @@ snapshots: - '@opentelemetry/sdk-trace-base' - peggy - '@langchain/core@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))': - dependencies: - '@cfworker/json-schema': 4.1.1 - ansi-styles: 5.2.0 - camelcase: 6.3.0 - decamelize: 1.2.0 - js-tiktoken: 1.0.21 - langsmith: 0.3.87(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - mustache: 4.2.0 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 10.0.0 - zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) - transitivePeerDependencies: - - '@opentelemetry/api' - - '@opentelemetry/exporter-trace-otlp-proto' - - '@opentelemetry/sdk-trace-base' - - openai - - '@langchain/core@0.3.80(@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))': + '@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))': dependencies: '@cfworker/json-schema': 4.1.1 + '@standard-schema/spec': 1.1.0 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.21 - langsmith: 0.3.87(@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)) + 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)) mustache: 4.2.0 p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 10.0.0 + uuid: 11.1.0 zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/exporter-trace-otlp-proto' - '@opentelemetry/sdk-trace-base' - openai + - ws - '@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.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))': dependencies: '@cfworker/json-schema': 4.1.1 '@standard-schema/spec': 1.1.0 - ansi-styles: 5.2.0 - 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.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)) mustache: 4.2.0 p-queue: 6.6.2 - uuid: 11.1.0 zod: 3.25.76 transitivePeerDependencies: - '@opentelemetry/api' @@ -23116,47 +23719,60 @@ snapshots: - openai - ws - '@langchain/google-common@0.1.8(@langchain/core@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(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.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)': dependencies: - '@langchain/core': 0.3.80(@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@4.104.0(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.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)) uuid: 10.0.0 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.25.2(zod@3.25.76) transitivePeerDependencies: - zod + optional: true - '@langchain/google-gauth@0.1.8(@langchain/core@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(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.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)': dependencies: - '@langchain/core': 0.3.80(@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@4.104.0(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@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(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.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) google-auth-library: 8.9.0 transitivePeerDependencies: - encoding - supports-color - 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)))': 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)) uuid: 10.0.0 - '@langchain/langgraph-sdk@0.0.70(@langchain/core@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(react@19.2.4)': + '@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)))': + 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)) + 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)))': 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-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)': + 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/protocol': 0.0.19 '@types/json-schema': 7.0.15 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 9.0.1 + p-queue: 9.1.2 + p-retry: 7.1.1 optionalDependencies: - '@langchain/core': 0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optional: true - '@langchain/langgraph-sdk@0.1.10(@langchain/core@0.3.80(@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)': + '@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)': 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/protocol': 0.0.19 '@types/json-schema': 7.0.15 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 9.0.1 + p-queue: 9.1.2 + p-retry: 7.1.1 optionalDependencies: - '@langchain/core': 0.3.80(@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: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -23171,7 +23787,18 @@ snapshots: 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.1(zod@3.25.76))(zod@3.25.76)': + '@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)': + 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)) + 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)': 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))) @@ -23180,32 +23807,37 @@ snapshots: uuid: 10.0.0 zod: 3.25.76 optionalDependencies: - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.25.2(zod@3.25.76) transitivePeerDependencies: - react - react-dom - svelte - vue - '@langchain/openai@0.4.9(@langchain/core@0.3.80(@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@4.104.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)': dependencies: - '@langchain/core': 0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - js-tiktoken: 1.0.21 - openai: 4.104.0(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.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/protocol': 0.0.19 + '@standard-schema/spec': 1.1.0 zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: - - encoding - - ws + - react + - react-dom + optional: true - '@langchain/openai@0.5.18(@langchain/core@0.3.80(@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@4.104.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.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)': dependencies: - '@langchain/core': 0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - js-tiktoken: 1.0.21 - openai: 5.23.2(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + '@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/protocol': 0.0.19 + '@standard-schema/spec': 1.1.0 zod: 3.25.76 transitivePeerDependencies: - - ws + - 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))': dependencies: @@ -23225,29 +23857,18 @@ snapshots: transitivePeerDependencies: - ws + '@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)))': 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)) zod: 3.25.76 - '@langchain/textsplitters@0.1.0(@langchain/core@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))': - dependencies: - '@langchain/core': 0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - js-tiktoken: 1.0.21 - '@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)))': 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)) js-tiktoken: 1.0.21 - '@langchain/weaviate@0.2.3(@langchain/core@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))': - dependencies: - '@langchain/core': 0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - uuid: 10.0.0 - weaviate-client: 3.12.0 - transitivePeerDependencies: - - encoding - '@ledgerhq/devices@8.10.0': dependencies: '@ledgerhq/errors': 6.29.0 @@ -23354,7 +23975,7 @@ snapshots: json-schema: 0.4.0 rxjs: 7.8.1 zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.25.2(zod@3.25.76) transitivePeerDependencies: - '@hono/arktype-validator' - '@hono/effect-validator' @@ -23418,7 +24039,7 @@ snapshots: sift: 17.1.3 xstate: 5.28.0 zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.25.2(zod@3.25.76) transitivePeerDependencies: - '@hono/arktype-validator' - '@hono/effect-validator' @@ -23436,123 +24057,137 @@ snapshots: - valibot - zod-openapi - '@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(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: - '@a2a-js/sdk': 0.2.5 - '@ai-sdk/provider-utils-v5': '@ai-sdk/provider-utils@3.0.20(zod@3.25.76)' - '@ai-sdk/provider-utils-v6': '@ai-sdk/provider-utils@4.0.0(zod@3.25.76)' - '@ai-sdk/provider-v5': '@ai-sdk/provider@2.0.1' - '@ai-sdk/provider-v6': '@ai-sdk/provider@3.0.5' - '@ai-sdk/ui-utils-v5': '@ai-sdk/ui-utils@1.2.11(zod@3.25.76)' - '@isaacs/ttlcache': 2.1.4 + '@a2a-js/sdk-v0_3': '@a2a-js/sdk@0.3.14(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(express@5.2.1)' + '@a2a-js/sdk-v1': '@a2a-js/sdk@1.0.1(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(express@5.2.1)' + '@ai-sdk/provider-utils-v6': '@ai-sdk/provider-utils@4.0.40(zod@3.25.76)' + '@ai-sdk/provider-utils-v7': '@ai-sdk/provider-utils@5.0.13(zod@3.25.76)' + '@ai-sdk/provider-v5': '@ai-sdk/provider@2.0.3' + '@ai-sdk/provider-v6': '@ai-sdk/provider@3.0.14' + '@ai-sdk/provider-v7': '@ai-sdk/provider@4.0.4' + '@isaacs/ttlcache': 2.1.5 '@lukeed/uuid': 2.0.1 - '@mastra/schema-compat': 1.2.7(zod@3.25.76) - '@modelcontextprotocol/sdk': 1.27.1(@cfworker/json-schema@4.1.1)(zod@3.25.76) + '@mastra/schema-compat': 1.3.10(zod@3.25.76) + '@modelcontextprotocol/server': 2.0.0 '@sindresorhus/slugify': 2.2.1 '@standard-schema/spec': 1.1.0 - ajv: 8.18.0 + ajv: 8.20.0 + chat: 4.40.0(ai@4.3.19(react@19.2.4)(zod@3.25.76))(zod@3.25.76) + croner: 10.0.1 dotenv: 17.4.0 execa: 9.6.1 + fastq: 1.20.1 gray-matter: 4.0.3 - hono: 4.12.10 - hono-openapi: 1.3.0(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(hono@4.12.10)(openapi-types@12.1.3) ignore: 7.0.5 - js-tiktoken: 1.0.21 + jpeg-js: 0.4.4 json-schema: 0.4.0 - lru-cache: 11.2.7 + lru-cache: 11.3.5 p-map: 7.0.4 p-retry: 7.1.1 - picomatch: 4.0.3 - radash: 12.1.1 + picomatch: 4.0.5 + posthog-node: 5.52.4(rxjs@7.8.2) tokenx: 1.3.0 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) xxhash-wasm: 1.1.0 zod: 3.25.76 transitivePeerDependencies: - - '@cfworker/json-schema' - - '@hono/standard-validator' - - '@standard-community/standard-json' - - '@standard-community/standard-openapi' - - '@types/json-schema' + - '@bufbuild/protobuf' + - '@grpc/grpc-js' + - ai - bufferutil - - openapi-types + - express + - rxjs - supports-color - utf-8-validate - - '@mastra/deployer@1.21.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.5.4)(zod@3.25.76)': - dependencies: - '@babel/core': 7.29.0 - '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 - '@mastra/core': 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@mastra/server': 1.21.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) - '@optimize-lodash/rollup-plugin': 5.1.0(rollup@4.59.0) - '@rollup/plugin-alias': 6.0.0(rollup@4.59.0) - '@rollup/plugin-commonjs': 29.0.2(rollup@4.59.0) - '@rollup/plugin-esm-shim': 0.1.8(rollup@4.59.0) - '@rollup/plugin-json': 6.1.0(rollup@4.59.0) - '@rollup/plugin-node-resolve': 16.0.3(rollup@4.59.0) - '@rollup/plugin-virtual': 3.0.2(rollup@4.59.0) + - workflow + + '@mastra/deployer@1.67.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)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@babel/core': 8.0.5 + '@babel/preset-typescript': 8.0.1(@babel/core@8.0.5) + '@babel/traverse': 8.0.5 + '@hono/node-ws': 1.3.1(@hono/node-server@1.19.11(hono@4.12.10))(bufferutil@4.1.0)(hono@4.12.10)(utf-8-validate@5.0.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) + '@mastra/server': 1.67.0(@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))(zod@3.25.76) + '@optimize-lodash/rollup-plugin': 5.1.0(rollup@4.63.3) + '@rollup/plugin-commonjs': 29.0.2(rollup@4.63.3) + '@rollup/plugin-esm-shim': 0.1.8(rollup@4.63.3) + '@rollup/plugin-json': 6.1.0(rollup@4.63.3) + '@rollup/plugin-node-resolve': 16.0.3(rollup@4.63.3) + '@rollup/plugin-virtual': 3.0.2(rollup@4.63.3) '@sindresorhus/slugify': 2.2.1 - '@types/babel__traverse': 7.28.0 empathic: 2.0.0 - esbuild: 0.27.7 + esbuild: 0.28.2 find-workspaces: 0.3.1 - fs-extra: 11.3.4 + fs-extra: 11.4.0 + gray-matter: 4.0.3 hono: 4.12.10 local-pkg: 1.1.2 - resolve-from: 5.0.0 resolve.exports: 2.0.3 - rollup: 4.59.0 - rollup-plugin-esbuild: 6.2.1(esbuild@0.27.7)(rollup@4.59.0) + rollup: 4.63.3 + rollup-plugin-esbuild: 6.2.1(esbuild@0.28.2)(rollup@4.63.3) strip-json-comments: 5.0.3 - tinyglobby: 0.2.15 - typescript-paths: 1.5.1(typescript@5.5.4) - zod: 3.25.76 + tinyglobby: 0.2.17 + typescript-paths: 1.5.2(typescript@5.5.4) + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + yaml: 2.9.1 transitivePeerDependencies: + - '@hono/node-server' + - bufferutil - supports-color - typescript + - utf-8-validate + - zod - '@mastra/loggers@1.1.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + '@mastra/loggers@1.3.2(@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: - '@mastra/core': 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(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) pino: 10.3.1 pino-pretty: 13.1.3 - '@mastra/mcp@1.4.1(@cfworker/json-schema@4.1.1)(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@types/json-schema@7.0.15)(zod@3.25.76)': + '@mastra/mcp@1.18.0(@cfworker/json-schema@4.1.1)(@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))(express@5.2.1)(hono@4.12.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': dependencies: - '@apidevtools/json-schema-ref-parser': 14.2.1(@types/json-schema@7.0.15) - '@mastra/core': 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@modelcontextprotocol/sdk': 1.27.1(@cfworker/json-schema@4.1.1)(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) + '@modelcontextprotocol/client': 2.0.0 + '@modelcontextprotocol/core': 2.0.0 + '@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) + '@modelcontextprotocol/node': 2.0.0(@modelcontextprotocol/server@2.0.0)(hono@4.12.10) + '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) + '@modelcontextprotocol/server': 2.0.0 + '@modelcontextprotocol/server-legacy': 2.0.0(express@5.2.1) exit-hook: 5.1.0 fast-deep-equal: 3.1.3 - uuid: 13.0.0 - zod: 3.25.76 transitivePeerDependencies: - '@cfworker/json-schema' - - '@types/json-schema' + - express + - hono + - react + - react-dom - supports-color + - zod - '@mastra/memory@1.13.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)': + '@mastra/memory@1.30.0(@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: - '@mastra/core': 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@mastra/schema-compat': 1.2.7(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) + '@mastra/schema-compat': 1.3.10(zod@4.6.5) async-mutex: 0.5.0 - image-size: 2.0.2 + diff: 8.0.4 json-schema: 0.4.0 - lru-cache: 11.2.7 + lru-cache: 11.3.5 probe-image-size: 7.2.3 tokenx: 1.3.0 xxhash-wasm: 1.1.0 - zod: 3.25.76 + zod: 4.6.5 transitivePeerDependencies: - supports-color - '@mastra/pg@1.8.5(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + '@mastra/pg@1.25.0(@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: - '@mastra/core': 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(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) async-mutex: 0.5.0 - pg: 8.20.0 + pg: 8.23.0 + pg-connection-string: 2.12.0 xxhash-wasm: 1.1.0 transitivePeerDependencies: - pg-native @@ -23564,22 +24199,30 @@ snapshots: zod: 3.25.76 zod-from-json-schema: 0.5.2 zod-from-json-schema-v3: zod-from-json-schema@0.0.5 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.25.2(zod@3.25.76) - '@mastra/schema-compat@1.2.7(zod@3.25.76)': + '@mastra/schema-compat@1.3.10(zod@3.25.76)': dependencies: json-schema-to-zod: 2.7.0 zod: 3.25.76 zod-from-json-schema: 0.5.2 - zod-from-json-schema-v3: zod-from-json-schema@0.0.5 - zod-to-json-schema: 3.25.1(zod@3.25.76) - '@mastra/server@1.21.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)': + '@mastra/schema-compat@1.3.10(zod@4.6.5)': + dependencies: + json-schema-to-zod: 2.7.0 + zod: 4.6.5 + zod-from-json-schema: 0.5.2 + + '@mastra/server@1.67.0(@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))(zod@3.25.76)': dependencies: - '@mastra/core': 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(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) hono: 4.12.10 zod: 3.25.76 + '@mermaid-js/parser@1.2.1': + dependencies: + '@chevrotain/types': 11.1.2 + '@meronex/icons@4.0.0(react@19.2.4)': dependencies: camelcase: 5.3.1 @@ -23588,6 +24231,36 @@ snapshots: '@microsoft/tsdoc@0.16.0': {} + '@modelcontextprotocol/client@2.0.0': + dependencies: + '@modelcontextprotocol/core': 2.0.0 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + jose: 6.2.0 + pkce-challenge: 5.0.1 + zod: 4.6.5 + + '@modelcontextprotocol/core@2.0.0': + dependencies: + zod: 4.6.5 + + '@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: + '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) + '@standard-schema/spec': 1.1.0 + zod: 3.25.76 + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@modelcontextprotocol/node@2.0.0(@modelcontextprotocol/server@2.0.0)(hono@4.12.10)': + dependencies: + '@hono/node-server': 1.19.11(hono@4.12.10) + '@modelcontextprotocol/server': 2.0.0 + optionalDependencies: + hono: 4.12.10 + '@modelcontextprotocol/sdk@1.27.1(@cfworker/json-schema@4.1.1)(zod@3.25.76)': dependencies: '@hono/node-server': 1.19.11(hono@4.12.5) @@ -23612,6 +24285,47 @@ snapshots: transitivePeerDependencies: - supports-color + '@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76)': + dependencies: + '@hono/node-server': 1.19.11(hono@4.12.10) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.1 + express: 5.2.1 + express-rate-limit: 8.3.0(express@5.2.1) + hono: 4.12.10 + jose: 6.2.12 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + optionalDependencies: + '@cfworker/json-schema': 4.1.1 + transitivePeerDependencies: + - supports-color + + '@modelcontextprotocol/server-legacy@2.0.0(express@5.2.1)': + dependencies: + '@modelcontextprotocol/core': 2.0.0 + content-type: 1.0.5 + cors: 2.8.6 + express-rate-limit: 8.3.0(express@5.2.1) + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.6.5 + optionalDependencies: + express: 5.2.1 + + '@modelcontextprotocol/server@2.0.0': + dependencies: + '@modelcontextprotocol/core': 2.0.0 + zod: 4.6.5 + '@mole-inc/bin-wrapper@8.0.1': dependencies: bin-check: 4.1.0 @@ -23749,6 +24463,9 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + '@napi-rs/nice-android-arm-eabi@1.1.1': optional: true @@ -23843,7 +24560,7 @@ snapshots: axios: 1.19.0(debug@4.4.3) rxjs: 7.8.2 - '@nestjs/cli@11.0.21(@swc/cli@0.3.14(@swc/core@1.5.7(@swc/helpers@0.5.13))(chokidar@4.0.3))(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(esbuild@0.27.7)(prettier@2.8.8)': + '@nestjs/cli@11.0.21(@swc/cli@0.3.14(@swc/core@1.5.7(@swc/helpers@0.5.13))(chokidar@4.0.3))(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(esbuild@0.28.2)(prettier@2.8.8)': dependencies: '@angular-devkit/core': 19.2.24(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.24(chokidar@4.0.3) @@ -23854,14 +24571,14 @@ snapshots: chokidar: 4.0.3 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)) + fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) glob: 13.0.6 node-emoji: 1.11.0 ora: 5.4.1 tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.2.0 typescript: 5.9.3 - webpack: 5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) webpack-node-externals: 3.0.0 optionalDependencies: '@swc/cli': 0.3.14(@swc/core@1.5.7(@swc/helpers@0.5.13))(chokidar@4.0.3) @@ -24078,10 +24795,10 @@ snapshots: - utf-8-validate - zod - '@neynar/react@1.2.22(@farcaster/miniapp-sdk@0.2.3(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(swr@2.4.1(react@19.2.4))(typescript@5.5.4)': + '@neynar/react@1.2.22(@farcaster/miniapp-sdk@0.3.0(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(swr@2.4.1(react@19.2.4))(typescript@5.5.4)': dependencies: - '@farcaster/miniapp-sdk': 0.2.3(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - hls.js: 1.6.15 + '@farcaster/miniapp-sdk': 0.3.0(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + hls.js: 1.7.3 mipd: 0.0.7(typescript@5.5.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -25204,11 +25921,11 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@optimize-lodash/rollup-plugin@5.1.0(rollup@4.59.0)': + '@optimize-lodash/rollup-plugin@5.1.0(rollup@4.63.3)': dependencies: '@optimize-lodash/transform': 3.0.6 - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) - rollup: 4.59.0 + '@rollup/pluginutils': 5.3.0(rollup@4.63.3) + rollup: 4.63.3 '@optimize-lodash/transform@3.0.6': dependencies: @@ -25261,7 +25978,7 @@ snapshots: detect-libc: 2.1.2 is-glob: 4.0.3 node-addon-api: 7.1.1 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: '@parcel/watcher-android-arm64': 2.5.6 '@parcel/watcher-darwin-arm64': 2.5.6 @@ -25343,7 +26060,7 @@ snapshots: dependencies: playwright: 1.58.2 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.10.0)(type-fest@4.41.0)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.10.0)(type-fest@4.41.0)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2))': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -25353,7 +26070,7 @@ snapshots: react-refresh: 0.10.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) optionalDependencies: type-fest: 4.41.0 @@ -25361,29 +26078,19 @@ snapshots: '@popperjs/core@2.11.8': {} - '@poppinss/colors@4.1.6': - dependencies: - kleur: 4.1.5 - - '@poppinss/dumper@0.6.5': - dependencies: - '@poppinss/colors': 4.1.6 - '@sindresorhus/is': 7.2.0 - supports-color: 10.2.2 - - '@poppinss/exception@1.2.3': {} - '@posthog/core@1.23.2': dependencies: cross-spawn: 7.0.6 - '@posthog/core@1.7.1': + '@posthog/core@1.54.2': dependencies: - cross-spawn: 7.0.6 + '@posthog/types': 1.412.1 '@posthog/types@1.359.1': {} - '@postiz/wallets@0.0.1(@babel/runtime@7.28.6)(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bs58@6.0.0)(bufferutil@4.1.0)(ioredis@5.10.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@posthog/types@1.412.1': {} + + '@postiz/wallets@0.0.1(@babel/runtime@7.28.6)(@react-native-async-storage/async-storage@1.24.0(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)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bs58@6.0.0)(bufferutil@4.1.0)(ioredis@5.10.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@solana/wallet-adapter-alpha': 0.1.14(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-avana': 0.1.17(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) @@ -25418,7 +26125,7 @@ snapshots: '@solana/wallet-adapter-torus': 0.11.32(@babel/runtime@7.28.6)(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) '@solana/wallet-adapter-trust': 0.1.17(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-unsafe-burner': 0.1.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-walletconnect': 0.1.21(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@solana/wallet-adapter-walletconnect': 0.1.21(@react-native-async-storage/async-storage@1.24.0(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)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@solana/wallet-adapter-xdefi': 0.1.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -25454,6 +26161,8 @@ snapshots: - utf-8-validate - zod + '@preact/signals-core@1.14.4': {} + '@prisma/client@6.5.0(prisma@6.5.0(typescript@5.5.4))(typescript@5.5.4)': optionalDependencies: prisma: 6.5.0(typescript@5.5.4) @@ -25461,8 +26170,8 @@ snapshots: '@prisma/config@6.5.0': dependencies: - esbuild: 0.27.3 - esbuild-register: 3.6.0(esbuild@0.27.3) + esbuild: 0.28.2 + esbuild-register: 3.6.0(esbuild@0.28.2) transitivePeerDependencies: - supports-color @@ -25535,6 +26244,29 @@ snapshots: '@radix-ui/primitive@1.1.3': {} + '@radix-ui/primitive@1.1.7': {} + + '@radix-ui/react-arrow@1.1.15(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-collection@1.1.15(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-context': 1.2.2(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.3.3(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-compose-refs@1.0.0(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -25546,6 +26278,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-compose-refs@1.1.5(@types/react@19.1.8)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-context@1.0.0(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -25557,6 +26295,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-context@1.2.2(@types/react@19.1.8)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-dialog@1.0.0(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -25606,6 +26350,12 @@ snapshots: '@babel/runtime': 7.28.6 react: 19.2.4 + '@radix-ui/react-direction@1.1.4(@types/react@19.1.8)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-dismissable-layer@1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -25630,6 +26380,34 @@ snapshots: '@types/react': 19.1.8 '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-dropdown-menu@2.1.24(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-context': 1.2.2(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-id': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-menu': 2.1.24(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-focus-guards@1.0.0(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -25641,6 +26419,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-focus-guards@1.1.6(@types/react@19.1.8)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-focus-scope@1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -25650,6 +26434,17 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-focus-scope@1.1.16(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.2.4) @@ -25674,6 +26469,13 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-id@1.1.4(@types/react@19.1.8)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-label@2.1.8(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -25683,6 +26485,50 @@ snapshots: '@types/react': 19.1.8 '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-menu@2.1.24(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-context': 1.2.2(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-direction': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.3.3(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.1.8)(react@19.2.4) + aria-hidden: 1.2.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.1.8)(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-popper@1.3.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-arrow': 1.1.15(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-context': 1.2.2(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-rect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/rect': 1.1.3 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-portal@1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -25690,6 +26536,16 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-portal@1.1.17(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -25708,6 +26564,15 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-presence@1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.2.4) @@ -25732,6 +26597,15 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-primitive@2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-slot': 1.3.3(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.2.4) @@ -25750,6 +26624,25 @@ snapshots: '@types/react': 19.1.8 '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-roving-focus@1.1.19(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-context': 1.2.2(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-direction': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-id': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-scroll-area@1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -25800,6 +26693,34 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-slot@1.3.3(@types/react@19.1.8)(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-tooltip@1.2.16(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-context': 1.2.2(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.3.3(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-use-callback-ref@1.0.0(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -25811,6 +26732,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-use-callback-ref@1.1.4(@types/react@19.1.8)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-use-controllable-state@1.0.0(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -25825,6 +26752,15 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-use-controllable-state@1.2.6(@types/react@19.1.8)(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.8)(react@19.2.4)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.2.4) @@ -25832,6 +26768,13 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-use-effect-event@0.0.5(@types/react@19.1.8)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-use-escape-keydown@1.0.0(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -25845,6 +26788,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-use-is-hydrated@0.1.3(@types/react@19.1.8)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-use-layout-effect@1.0.0(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -25856,6 +26805,37 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-use-layout-effect@1.1.4(@types/react@19.1.8)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-use-rect@1.1.4(@types/react@19.1.8)(react@19.2.4)': + dependencies: + '@radix-ui/rect': 1.1.3 + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-use-size@1.1.4(@types/react@19.1.8)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-visually-hidden@1.2.11(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/rect@1.1.3': {} + '@react-aria/focus@3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -25906,17 +26886,17 @@ snapshots: react-dom: 19.2.4(react@19.2.4) react-promise-suspense: 0.3.4 - '@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))': + '@react-native-async-storage/async-storage@1.24.0(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))': dependencies: merge-options: 3.0.4 - react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) + 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) optional: true '@react-native/assets-registry@0.84.1': {} - '@react-native/codegen@0.84.1(@babel/core@7.29.0)': + '@react-native/codegen@0.84.1(@babel/core@8.0.5)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 8.0.5 '@babel/parser': 7.29.0 hermes-parser: 0.32.0 invariant: 2.2.4 @@ -25973,12 +26953,12 @@ snapshots: '@react-native/normalize-colors@0.84.1': {} - '@react-native/virtualized-lists@0.84.1(@types/react@19.1.8)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)': + '@react-native/virtualized-lists@0.84.1(@types/react@19.1.8)(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)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 19.2.4 - react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) + 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) optionalDependencies: '@types/react': 19.1.8 @@ -26023,6 +27003,8 @@ snapshots: '@remirror/core-constants@3.0.0': {} + '@remix-run/node-fetch-server@0.13.3': {} + '@reown/appkit-common@1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.22.4)': dependencies: big.js: 6.2.2 @@ -26045,11 +27027,11 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-controllers@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-controllers@1.7.2(@react-native-async-storage/async-storage@1.24.0(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)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 1.13.2(@types/react@19.1.8)(react@19.2.4) viem: 2.47.0(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: @@ -26084,12 +27066,12 @@ snapshots: dependencies: buffer: 6.0.3 - '@reown/appkit-scaffold-ui@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76)': + '@reown/appkit-scaffold-ui@1.7.2(@react-native-async-storage/async-storage@1.24.0(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)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(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)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0(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)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.2(@react-native-async-storage/async-storage@1.24.0(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)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76) '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) lit: 3.1.0 transitivePeerDependencies: @@ -26121,10 +27103,10 @@ snapshots: - valtio - zod - '@reown/appkit-ui@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-ui@1.7.2(@react-native-async-storage/async-storage@1.24.0(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)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(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)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) lit: 3.1.0 qrcode: 1.5.3 @@ -26156,14 +27138,14 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76)': + '@reown/appkit-utils@1.7.2(@react-native-async-storage/async-storage@1.24.0(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)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(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)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-polyfills': 1.7.2 '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 1.13.2(@types/react@19.1.8)(react@19.2.4) viem: 2.47.0(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: @@ -26205,17 +27187,17 @@ snapshots: - typescript - utf-8-validate - '@reown/appkit@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit@1.7.2(@react-native-async-storage/async-storage@1.24.0(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)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(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)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-polyfills': 1.7.2 - '@reown/appkit-scaffold-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76) - '@reown/appkit-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-scaffold-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0(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)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0(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)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.2(@react-native-async-storage/async-storage@1.24.0(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)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76) '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) - '@walletconnect/universal-provider': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/universal-provider': 2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) bs58: 6.0.0 valtio: 1.13.2(@types/react@19.1.8)(react@19.2.4) viem: 2.47.0(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -26293,144 +27275,223 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} - '@rollup/plugin-alias@6.0.0(rollup@4.59.0)': - optionalDependencies: - rollup: 4.59.0 - '@rollup/plugin-commonjs@28.0.1(rollup@4.59.0)': dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.59.0) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.5.0(picomatch@4.0.4) + fdir: 6.5.0(picomatch@4.0.5) is-reference: 1.2.1 magic-string: 0.30.21 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: rollup: 4.59.0 - '@rollup/plugin-commonjs@29.0.2(rollup@4.59.0)': + '@rollup/plugin-commonjs@29.0.2(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.4) + fdir: 6.5.0(picomatch@4.0.5) is-reference: 1.2.1 magic-string: 0.30.21 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: - rollup: 4.59.0 + rollup: 4.63.3 - '@rollup/plugin-esm-shim@0.1.8(rollup@4.59.0)': + '@rollup/plugin-esm-shim@0.1.8(rollup@4.63.3)': dependencies: magic-string: 0.30.21 mlly: 1.8.1 optionalDependencies: - rollup: 4.59.0 + rollup: 4.63.3 - '@rollup/plugin-json@6.1.0(rollup@4.59.0)': + '@rollup/plugin-json@6.1.0(rollup@4.63.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@rollup/pluginutils': 5.3.0(rollup@4.63.3) optionalDependencies: - rollup: 4.59.0 + rollup: 4.63.3 - '@rollup/plugin-node-resolve@16.0.3(rollup@4.59.0)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.63.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@rollup/pluginutils': 5.3.0(rollup@4.63.3) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.11 optionalDependencies: - rollup: 4.59.0 + rollup: 4.63.3 - '@rollup/plugin-virtual@3.0.2(rollup@4.59.0)': + '@rollup/plugin-virtual@3.0.2(rollup@4.63.3)': optionalDependencies: - rollup: 4.59.0 + rollup: 4.63.3 '@rollup/pluginutils@5.3.0(rollup@4.59.0)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: rollup: 4.59.0 + '@rollup/pluginutils@5.3.0(rollup@4.63.3)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.5 + optionalDependencies: + rollup: 4.63.3 + '@rollup/rollup-android-arm-eabi@4.59.0': optional: true + '@rollup/rollup-android-arm-eabi@4.63.3': + optional: true + '@rollup/rollup-android-arm64@4.59.0': optional: true + '@rollup/rollup-android-arm64@4.63.3': + optional: true + '@rollup/rollup-darwin-arm64@4.59.0': optional: true + '@rollup/rollup-darwin-arm64@4.63.3': + optional: true + '@rollup/rollup-darwin-x64@4.59.0': optional: true + '@rollup/rollup-darwin-x64@4.63.3': + optional: true + '@rollup/rollup-freebsd-arm64@4.59.0': optional: true + '@rollup/rollup-freebsd-arm64@4.63.3': + optional: true + '@rollup/rollup-freebsd-x64@4.59.0': optional: true + '@rollup/rollup-freebsd-x64@4.63.3': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.63.3': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.59.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.63.3': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.59.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.63.3': + optional: true + '@rollup/rollup-linux-arm64-musl@4.59.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.63.3': + optional: true + '@rollup/rollup-linux-loong64-gnu@4.59.0': optional: true + '@rollup/rollup-linux-loong64-gnu@4.63.3': + optional: true + '@rollup/rollup-linux-loong64-musl@4.59.0': optional: true + '@rollup/rollup-linux-loong64-musl@4.63.3': + optional: true + '@rollup/rollup-linux-ppc64-gnu@4.59.0': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.63.3': + optional: true + '@rollup/rollup-linux-ppc64-musl@4.59.0': optional: true + '@rollup/rollup-linux-ppc64-musl@4.63.3': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.59.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.63.3': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.59.0': optional: true + '@rollup/rollup-linux-riscv64-musl@4.63.3': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.59.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.63.3': + optional: true + '@rollup/rollup-linux-x64-gnu@4.59.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.63.3': + optional: true + '@rollup/rollup-linux-x64-musl@4.59.0': optional: true + '@rollup/rollup-linux-x64-musl@4.63.3': + optional: true + '@rollup/rollup-openbsd-x64@4.59.0': optional: true + '@rollup/rollup-openbsd-x64@4.63.3': + optional: true + '@rollup/rollup-openharmony-arm64@4.59.0': optional: true + '@rollup/rollup-openharmony-arm64@4.63.3': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.59.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.63.3': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.59.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.63.3': + optional: true + '@rollup/rollup-win32-x64-gnu@4.59.0': optional: true + '@rollup/rollup-win32-x64-gnu@4.63.3': + optional: true + '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.63.3': + optional: true + '@rtsao/scc@1.1.0': {} '@scarf/scarf@1.4.0': {} @@ -26621,7 +27682,7 @@ snapshots: transitivePeerDependencies: - 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@7.29.0)(@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.27.7))': + '@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))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.40.0 @@ -26633,8 +27694,8 @@ snapshots: '@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.27.7)) - next: 16.3.1(@babel/core@7.29.0)(@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) + '@sentry/webpack-plugin': 5.1.1(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 stacktrace-parser: 0.1.11 transitivePeerDependencies: @@ -26729,21 +27790,52 @@ snapshots: '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) '@sentry/core': 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.27.7))': + '@sentry/webpack-plugin@5.1.1(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 - webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) transitivePeerDependencies: - encoding - supports-color + '@shikijs/core@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/themes@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/types@3.23.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + '@sinclair/typebox@0.27.10': {} '@sindresorhus/is@4.6.0': {} - '@sindresorhus/is@7.2.0': {} - '@sindresorhus/merge-streams@4.0.0': {} '@sindresorhus/slugify@2.2.1': @@ -26763,9 +27855,77 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 + '@slack/bolt@4.7.3(@types/express@4.17.25)(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@slack/logger': 4.0.1 + '@slack/oauth': 3.0.5 + '@slack/socket-mode': 2.0.7(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@slack/types': 2.22.0 + '@slack/web-api': 7.19.0 + '@types/express': 4.17.25 + axios: 1.19.0(debug@4.4.3) + express: 5.2.1 + path-to-regexp: 8.4.2 + raw-body: 3.0.2 + tsscmp: 1.0.6 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + '@slack/logger@4.0.1': + dependencies: + '@types/node': 18.16.9 + + '@slack/oauth@3.0.5': + dependencies: + '@slack/logger': 4.0.1 + '@slack/web-api': 7.19.0 + '@types/jsonwebtoken': 9.0.10 + '@types/node': 18.16.9 + jsonwebtoken: 9.0.3 + transitivePeerDependencies: + - debug + - supports-color + + '@slack/socket-mode@2.0.7(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@slack/logger': 4.0.1 + '@slack/web-api': 7.19.0 + '@types/node': 18.16.9 + '@types/ws': 8.18.1 + eventemitter3: 5.0.4 + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + '@slack/types@2.22.0': {} + + '@slack/web-api@7.19.0': + dependencies: + '@slack/logger': 4.0.1 + '@slack/types': 2.22.0 + '@types/node': 18.16.9 + '@types/retry': 0.12.0 + axios: 1.19.0(debug@4.4.3) + eventemitter3: 5.0.4 + form-data: 4.0.6 + is-electron: 2.2.2 + is-stream: 2.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + retry: 0.13.1 + transitivePeerDependencies: + - debug + - supports-color + '@smithy/abort-controller@4.2.11': dependencies: - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 tslib: 2.8.1 '@smithy/chunked-blob-reader-native@4.2.3': @@ -26810,7 +27970,7 @@ snapshots: '@smithy/eventstream-codec@4.2.11': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 '@smithy/util-hex-encoding': 4.2.2 tslib: 2.8.1 @@ -26994,6 +28154,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/types@4.18.0': + dependencies: + tslib: 2.8.1 + '@smithy/url-parser@4.2.11': dependencies: '@smithy/querystring-parser': 4.2.11 @@ -27103,9 +28267,9 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} - '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@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)': + '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(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)': dependencies: - '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@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) + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@5.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) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) bs58: 5.0.0 js-base64: 3.7.8 @@ -27116,14 +28280,14 @@ snapshots: - react-native - typescript - '@solana-mobile/mobile-wallet-adapter-protocol@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@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)': + '@solana-mobile/mobile-wallet-adapter-protocol@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@5.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)': dependencies: '@solana/codecs-strings': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) '@solana/wallet-standard': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.4) '@solana/wallet-standard-util': 1.1.2 '@wallet-standard/core': 1.1.1 js-base64: 3.7.8 - react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) + 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) transitivePeerDependencies: - '@solana/wallet-adapter-base' - '@solana/web3.js' @@ -27132,25 +28296,25 @@ snapshots: - react - typescript - '@solana-mobile/wallet-adapter-mobile@2.2.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@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)': + '@solana-mobile/wallet-adapter-mobile@2.2.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(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)': dependencies: - '@solana-mobile/mobile-wallet-adapter-protocol-web3js': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@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) - '@solana-mobile/wallet-standard-mobile': 0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@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) + '@solana-mobile/mobile-wallet-adapter-protocol-web3js': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(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) + '@solana-mobile/wallet-standard-mobile': 0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(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) '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/wallet-standard-features': 1.3.0 '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) js-base64: 3.7.8 optionalDependencies: - '@react-native-async-storage/async-storage': 1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)) + '@react-native-async-storage/async-storage': 1.24.0(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)) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - react - react-native - typescript - '@solana-mobile/wallet-standard-mobile@0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@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)': + '@solana-mobile/wallet-standard-mobile@0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(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)': dependencies: - '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@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) + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@5.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) '@solana/wallet-standard-chains': 1.1.1 '@solana/wallet-standard-features': 1.3.0 '@wallet-standard/base': 1.1.0 @@ -27222,9 +28386,9 @@ snapshots: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@solana/wallet-adapter-base-ui@0.1.6(@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@7.29.0)(@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)': + '@solana/wallet-adapter-base-ui@0.1.6(@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)': dependencies: - '@solana/wallet-adapter-react': 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@7.29.0)(@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) + '@solana/wallet-adapter-react': 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) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) react: 19.2.4 transitivePeerDependencies: @@ -27358,11 +28522,11 @@ snapshots: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@solana/wallet-adapter-react-ui@0.9.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-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@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)': + '@solana/wallet-adapter-react-ui@0.9.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-dom@19.2.4(react@19.2.4))(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)': dependencies: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-base-ui': 0.1.6(@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@7.29.0)(@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) - '@solana/wallet-adapter-react': 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@7.29.0)(@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) + '@solana/wallet-adapter-base-ui': 0.1.6(@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) + '@solana/wallet-adapter-react': 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) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -27372,9 +28536,9 @@ snapshots: - react-native - typescript - '@solana/wallet-adapter-react@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@7.29.0)(@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)': + '@solana/wallet-adapter-react@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)': dependencies: - '@solana-mobile/wallet-adapter-mobile': 2.2.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@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) + '@solana-mobile/wallet-adapter-mobile': 2.2.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(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) '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/wallet-standard-wallet-adapter-react': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@19.2.4) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) @@ -27466,11 +28630,11 @@ snapshots: '@solana/wallet-standard-util': 1.1.2 '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@solana/wallet-adapter-walletconnect@0.1.21(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@solana/wallet-adapter-walletconnect@0.1.21(@react-native-async-storage/async-storage@1.24.0(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)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@walletconnect/solana-adapter': 0.0.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/solana-adapter': 0.0.8(@react-native-async-storage/async-storage@1.24.0(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)))(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -27632,25 +28796,6 @@ snapshots: eventemitter3: 5.0.4 uuid: 9.0.1 - '@speed-highlight/core@1.2.24': {} - - '@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76)': - dependencies: - '@standard-schema/spec': 1.1.0 - '@types/json-schema': 7.0.15 - quansync: 0.2.11 - optionalDependencies: - zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) - - '@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76)': - dependencies: - '@standard-community/standard-json': 0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76) - '@standard-schema/spec': 1.1.0 - openapi-types: 12.1.3 - optionalDependencies: - zod: 3.25.76 - '@standard-schema/spec@1.1.0': {} '@stripe/react-stripe-js@5.6.1(@stripe/stripe-js@8.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': @@ -27936,12 +29081,19 @@ snapshots: postcss: 8.5.26 tailwindcss: 4.2.1 - '@tailwindcss/vite@4.2.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3))': + '@tailwindcss/vite@4.2.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1))': dependencies: '@tailwindcss/node': 4.2.1 '@tailwindcss/oxide': 4.2.1 tailwindcss: 4.2.1 - vite: 8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vite: 8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) + + '@tanstack/devtools-event-client@0.4.4': {} + + '@tanstack/pacer@0.20.1': + dependencies: + '@tanstack/devtools-event-client': 0.4.4 + '@tanstack/store': 0.9.3 '@tanstack/react-virtual@3.13.21(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: @@ -27949,6 +29101,8 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + '@tanstack/store@0.9.3': {} + '@tanstack/virtual-core@3.13.21': {} '@temporalio/activity@1.15.0': @@ -27992,7 +29146,7 @@ snapshots: long: 5.3.2 protobufjs: 7.5.4 - '@temporalio/worker@1.15.0(@swc/helpers@0.5.13)(esbuild@0.27.7)(tslib@2.8.1)': + '@temporalio/worker@1.15.0(@swc/helpers@0.5.13)(esbuild@0.28.2)(tslib@2.8.1)': dependencies: '@grpc/grpc-js': 1.14.3 '@swc/core': 1.5.7(@swc/helpers@0.5.13) @@ -28011,11 +29165,11 @@ snapshots: protobufjs: 7.5.4 rxjs: 7.8.2 source-map: 0.7.6 - source-map-loader: 4.0.2(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)) + source-map-loader: 4.0.2(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) supports-color: 8.1.1 - swc-loader: 0.2.7(@swc/core@1.5.7(@swc/helpers@0.5.13))(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)) + swc-loader: 0.2.7(@swc/core@1.5.7(@swc/helpers@0.5.13))(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) unionfs: 4.6.0 - webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) transitivePeerDependencies: - '@swc/helpers' - esbuild @@ -28422,11 +29576,6 @@ snapshots: '@types/caseless@0.12.5': {} - '@types/chai@5.2.3': - dependencies: - '@types/deep-eql': 4.0.2 - assertion-error: 2.0.1 - '@types/chrome@0.0.319': dependencies: '@types/filesystem': 0.0.36 @@ -28453,12 +29602,127 @@ snapshots: dependencies: '@types/node': 18.16.9 + '@types/d3-array@3.2.2': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.12 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.12 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.2 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.7': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.12 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.1': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.4': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-selection@3.0.12': {} + + '@types/d3-shape@3.2.0': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.12 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.12 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.1 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.12 + '@types/d3-shape': 3.2.0 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 - '@types/deep-eql@4.0.2': {} - '@types/diff-match-patch@1.0.36': {} '@types/dom-mediacapture-transform@0.1.11': @@ -28483,6 +29747,8 @@ snapshots: '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} + '@types/express-serve-static-core@4.19.8': dependencies: '@types/node': 18.16.9 @@ -28518,6 +29784,10 @@ snapshots: '@types/filewriter@0.0.33': {} + '@types/gensync@1.0.5': {} + + '@types/geojson@7946.0.16': {} + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 18.16.9 @@ -28559,6 +29829,8 @@ snapshots: '@types/tough-cookie': 4.0.5 parse5: 7.3.0 + '@types/jsesc@2.5.1': {} + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -28628,7 +29900,7 @@ snapshots: '@types/node-fetch@2.6.13': dependencies: '@types/node': 18.16.9 - form-data: 4.0.5 + form-data: 4.0.6 '@types/node-telegram-bot-api@0.64.14': dependencies: @@ -28670,7 +29942,7 @@ snapshots: '@types/pg@8.15.5': dependencies: '@types/node': 18.16.9 - pg-protocol: 1.13.0 + pg-protocol: 1.16.0 pg-types: 2.2.0 '@types/pg@8.15.6': @@ -28683,6 +29955,10 @@ snapshots: '@types/prop-types@15.7.15': {} + '@types/qrcode@1.5.5': + dependencies: + '@types/node': 18.16.9 + '@types/qs@6.15.0': {} '@types/range-parser@1.2.7': {} @@ -28947,8 +30223,8 @@ snapshots: '@typescript-eslint/visitor-keys': 8.57.2 debug: 4.4.3(supports-color@5.5.0) minimatch: 10.2.4 - semver: 7.7.4 - tinyglobby: 0.2.15 + semver: 7.8.5 + tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: @@ -29370,6 +30646,11 @@ snapshots: '@uppy/utils': 6.2.2 preact: 10.28.4 + '@upsetjs/venn.js@2.0.0': + optionalDependencies: + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + '@upstash/redis@1.36.3': dependencies: uncrypto: 0.1.3 @@ -29384,10 +30665,10 @@ snapshots: '@vercel/oidc@3.2.0': {} - '@vitejs/plugin-react@6.0.5(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3))': + '@vitejs/plugin-react@6.0.5(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vite: 8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) '@vitest/coverage-v8@1.6.0(vitest@3.1.4)': dependencies: @@ -29404,7 +30685,7 @@ snapshots: std-env: 3.10.0 strip-literal: 2.1.1 test-exclude: 6.0.0 - vitest: 3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vitest: 3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) transitivePeerDependencies: - supports-color @@ -29415,30 +30696,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/expect@4.1.10': - dependencies: - '@standard-schema/spec': 1.1.0 - '@types/chai': 5.2.3 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 - chai: 6.2.2 - tinyrainbow: 3.1.1 - - '@vitest/mocker@3.1.4(vite@6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3))': + '@vitest/mocker@3.1.4(vite@6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1))': dependencies: '@vitest/spy': 3.1.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) - - '@vitest/mocker@4.1.10(vite@8.2.1(@types/node@20.19.37)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3))': - dependencies: - '@vitest/spy': 4.1.10 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 8.2.1(@types/node@20.19.37)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vite: 6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) '@vitest/pretty-format@3.1.4': dependencies: @@ -29448,39 +30712,21 @@ snapshots: dependencies: tinyrainbow: 2.0.0 - '@vitest/pretty-format@4.1.10': - dependencies: - tinyrainbow: 3.1.1 - '@vitest/runner@3.1.4': dependencies: '@vitest/utils': 3.1.4 pathe: 2.0.3 - '@vitest/runner@4.1.10': - dependencies: - '@vitest/utils': 4.1.10 - pathe: 2.0.3 - '@vitest/snapshot@3.1.4': dependencies: '@vitest/pretty-format': 3.1.4 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/snapshot@4.1.10': - dependencies: - '@vitest/pretty-format': 4.1.10 - '@vitest/utils': 4.1.10 - magic-string: 0.30.21 - pathe: 2.0.3 - '@vitest/spy@3.1.4': dependencies: tinyspy: 3.0.2 - '@vitest/spy@4.1.10': {} - '@vitest/ui@1.6.0(vitest@3.1.4)': dependencies: '@vitest/utils': 1.6.0 @@ -29490,7 +30736,7 @@ snapshots: pathe: 1.1.2 picocolors: 1.1.1 sirv: 2.0.4 - vitest: 3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vitest: 3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) '@vitest/utils@1.6.0': dependencies: @@ -29505,12 +30751,6 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 - '@vitest/utils@4.1.10': - dependencies: - '@vitest/pretty-format': 4.1.10 - convert-source-map: 2.0.0 - tinyrainbow: 3.1.1 - '@wallet-standard/app@1.1.0': dependencies: '@wallet-standard/base': 1.1.0 @@ -29538,21 +30778,21 @@ snapshots: dependencies: '@wallet-standard/base': 1.1.0 - '@walletconnect/core@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/core@2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) - '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/window-getters': 1.0.1 events: 3.3.0 lodash.isequal: 4.5.0 @@ -29582,21 +30822,21 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/core@2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) - '@walletconnect/utils': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/utils': 2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -29677,13 +30917,13 @@ snapshots: - bufferutil - utf-8-validate - '@walletconnect/keyvaluestorage@1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0)': + '@walletconnect/keyvaluestorage@1.1.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0)': dependencies: '@walletconnect/safe-json': 1.0.2 idb-keyval: 6.2.2 unstorage: 1.17.4(@upstash/redis@1.36.3)(idb-keyval@6.2.2)(ioredis@5.10.0) optionalDependencies: - '@react-native-async-storage/async-storage': 1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)) + '@react-native-async-storage/async-storage': 1.24.0(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)) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -29725,16 +30965,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/sign-client@2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/core': 2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) - '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -29761,16 +31001,16 @@ snapshots: - utf-8-validate - zod - '@walletconnect/sign-client@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/sign-client@2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/core': 2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) - '@walletconnect/utils': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/utils': 2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -29797,13 +31037,13 @@ snapshots: - utf-8-validate - zod - '@walletconnect/solana-adapter@0.0.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/solana-adapter@0.0.8(@react-native-async-storage/async-storage@1.24.0(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)))(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@reown/appkit': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit': 1.7.2(@react-native-async-storage/async-storage@1.24.0(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)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) bs58: 6.0.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -29837,12 +31077,12 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/types@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0)': + '@walletconnect/types@2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/logger': 2.1.2 events: 3.3.0 transitivePeerDependencies: @@ -29866,12 +31106,12 @@ snapshots: - ioredis - uploadthing - '@walletconnect/types@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0)': + '@walletconnect/types@2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/logger': 2.1.2 events: 3.3.0 transitivePeerDependencies: @@ -29895,18 +31135,18 @@ snapshots: - ioredis - uploadthing - '@walletconnect/universal-provider@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/universal-provider@2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) - '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/sign-client': 2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) events: 3.3.0 lodash: 4.17.21 transitivePeerDependencies: @@ -29935,18 +31175,18 @@ snapshots: - utf-8-validate - zod - '@walletconnect/universal-provider@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/universal-provider@2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) - '@walletconnect/utils': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/sign-client': 2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/utils': 2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: @@ -29975,18 +31215,18 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/utils@2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 detect-browser: 5.3.0 @@ -30019,18 +31259,18 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/utils@2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(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)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 bs58: 6.0.0 @@ -30184,6 +31424,10 @@ snapshots: '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 + '@workflow/serde@4.1.0': {} + + '@workflow/serde@4.1.0-beta.2': {} + '@wyw-in-js/processor-utils@0.5.5': dependencies: '@babel/generator': 7.29.1 @@ -30224,8 +31468,6 @@ snapshots: '@xtuc/long@4.2.2': {} - '@zeit/schemas@2.36.0': {} - abab@2.0.6: {} abbrev@1.1.1: {} @@ -30247,9 +31489,10 @@ snapshots: typescript: 5.5.4 zod: 3.25.76 - abort-controller-x@0.4.3: {} - - abort-controller-x@0.5.0: {} + abitype@1.2.3(typescript@5.5.4)(zod@4.6.5): + optionalDependencies: + typescript: 5.5.4 + zod: 4.6.5 abort-controller@3.0.0: dependencies: @@ -30329,6 +31572,14 @@ snapshots: '@opentelemetry/api': 1.9.0 zod: 3.25.76 + ai@6.0.285(zod@3.25.76): + dependencies: + '@ai-sdk/gateway': 3.0.196(zod@3.25.76) + '@ai-sdk/provider': 3.0.16 + '@ai-sdk/provider-utils': 4.0.51(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + zod: 3.25.76 + ajv-formats@2.1.1(ajv@8.18.0): optionalDependencies: ajv: 8.18.0 @@ -30337,6 +31588,10 @@ snapshots: optionalDependencies: ajv: 8.18.0 + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + ajv-keywords@3.5.2(ajv@6.14.0): dependencies: ajv: 6.14.0 @@ -30360,11 +31615,14 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - anser@1.4.10: {} - - ansi-align@3.0.1: + ajv@8.20.0: dependencies: - string-width: 4.2.3 + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + anser@1.4.10: {} ansi-colors@4.1.3: {} @@ -30403,6 +31661,22 @@ snapshots: arch@2.2.0: {} + archiver@8.0.0: + dependencies: + async: 3.2.6 + buffer-crc32: 1.0.0 + is-stream: 4.0.1 + lazystream: 1.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + readdir-glob: 3.0.0 + tar-stream: 3.2.1 + zip-stream: 7.0.5 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + are-we-there-yet@2.0.0: dependencies: delegates: 1.0.0 @@ -30512,7 +31786,8 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - arrify@2.0.1: {} + arrify@2.0.1: + optional: true asap@2.0.6: {} @@ -30552,6 +31827,8 @@ snapshots: dependencies: tslib: 2.8.1 + async@3.2.6: {} + asynckit@0.4.0: {} atomic-sleep@1.0.0: {} @@ -30593,6 +31870,8 @@ snapshots: axobject-query@4.1.0: {} + b4a@1.9.0: {} + babel-jest@29.7.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 @@ -30606,6 +31885,19 @@ snapshots: transitivePeerDependencies: - supports-color + babel-jest@29.7.0(@babel/core@8.0.5): + dependencies: + '@babel/core': 8.0.5 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@8.0.5) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + babel-merge@3.0.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 @@ -30682,18 +31974,72 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) + babel-preset-current-node-syntax@1.2.0(@babel/core@8.0.5): + dependencies: + '@babel/core': 8.0.5 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@8.0.5) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@8.0.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@8.0.5) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@8.0.5) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@8.0.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@8.0.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@8.0.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@8.0.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@8.0.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@8.0.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@8.0.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@8.0.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@8.0.5) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@8.0.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@8.0.5) + babel-preset-jest@29.6.3(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + babel-preset-jest@29.6.3(@babel/core@8.0.5): + dependencies: + '@babel/core': 8.0.5 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.2.0(@babel/core@8.0.5) + bail@2.0.2: {} balanced-match@1.0.2: {} balanced-match@4.0.4: {} + bare-events@2.9.2: {} + + bare-fs@4.8.1: + dependencies: + bare-events: 2.9.2 + bare-path: 3.1.2 + bare-stream: 2.13.4(bare-events@2.9.2) + bare-url: 2.5.4 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + bare-path@3.1.2: {} + + bare-stream@2.13.4(bare-events@2.9.2): + dependencies: + b4a: 1.9.0 + streamx: 2.28.1 + teex: 1.0.1 + optionalDependencies: + bare-events: 2.9.2 + transitivePeerDependencies: + - react-native-b4a + + bare-url@2.5.4: + dependencies: + bare-path: 3.1.2 + base-x@3.0.11: dependencies: safe-buffer: 5.2.1 @@ -30746,7 +32092,7 @@ snapshots: bin-version-check@5.1.0: dependencies: bin-version: 6.0.0 - semver: 7.7.4 + semver: 7.8.5 semver-truncate: 3.0.0 bin-version@6.0.0: @@ -30767,8 +32113,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - blake3-wasm@2.1.5: {} - bluebird@3.7.2: {} blueimp-canvas-to-blob@3.29.0: {} @@ -30820,17 +32164,6 @@ snapshots: bowser@2.14.1: {} - boxen@7.0.0: - dependencies: - ansi-align: 3.0.1 - camelcase: 7.0.1 - chalk: 5.6.2 - cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 - brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -30928,12 +32261,19 @@ snapshots: dependencies: node-int64: 0.4.0 + buffer-crc32@1.0.0: {} + buffer-equal-constant-time@1.0.1: {} buffer-from@1.1.2: {} buffer-xor@1.0.3: {} + buffer@5.6.0: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -31010,8 +32350,6 @@ snapshots: camelcase@6.3.0: {} - camelcase@7.0.1: {} - caniuse-lite@1.0.30001777: {} canvas@2.11.2: @@ -31043,19 +32381,11 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 - chai@6.2.2: {} - - chalk-template@0.4.0: - dependencies: - chalk: 4.1.2 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.0.1: {} - chalk@5.6.2: {} change-case@4.1.2: @@ -31077,16 +32407,10 @@ snapshots: character-entities-html4@2.1.0: {} - character-entities-legacy@1.1.4: {} - character-entities-legacy@3.0.0: {} - character-entities@1.2.4: {} - character-entities@2.0.2: {} - character-reference-invalid@1.1.4: {} - character-reference-invalid@2.0.1: {} chardet@2.1.1: {} @@ -31097,6 +32421,21 @@ snapshots: dependencies: '@kurkle/color': 0.3.4 + chat@4.40.0(ai@4.3.19(react@19.2.4)(zod@3.25.76))(zod@3.25.76): + dependencies: + '@workflow/serde': 4.1.0-beta.2 + mdast-util-to-string: 4.0.0 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + remend: 1.3.1 + unified: 11.0.5 + optionalDependencies: + ai: 4.3.19(react@19.2.4)(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - supports-color + check-error@2.1.3: {} cheerio-select@2.1.0: @@ -31178,12 +32517,12 @@ snapshots: safe-buffer: 5.2.1 to-buffer: 1.2.2 - cjs-module-lexer@1.2.3: {} - cjs-module-lexer@1.4.3: {} cjs-module-lexer@2.2.0: {} + clarinet@0.12.6: {} + class-transformer@0.5.1: {} class-validator-jsonschema@5.1.0(class-transformer@0.5.1)(class-validator@0.14.4): @@ -31206,14 +32545,16 @@ snapshots: dependencies: clsx: 1.2.1 + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + classnames@2.3.1: {} classnames@2.5.1: {} clean-stack@2.2.0: {} - cli-boxes@3.0.0: {} - cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -31230,12 +32571,6 @@ snapshots: client-only@0.0.1: {} - clipboardy@3.0.0: - dependencies: - arch: 2.2.0 - execa: 5.1.1 - is-wsl: 2.2.0 - cliui@6.0.0: dependencies: string-width: 4.2.3 @@ -31307,8 +32642,6 @@ snapshots: comlink@4.4.2: {} - comma-separated-tokens@1.0.8: {} - comma-separated-tokens@2.0.3: {} commander@10.0.1: {} @@ -31340,6 +32673,14 @@ snapshots: component-emitter@2.0.0: {} + compress-commons@7.0.1: + dependencies: + crc-32: 1.2.2 + crc32-stream: 7.0.1 + is-stream: 4.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + compressible@2.0.18: dependencies: mime-db: 1.54.0 @@ -31405,10 +32746,6 @@ snapshots: console-control-strings@1.1.0: {} - console-table-printer@2.15.0: - dependencies: - simple-wcswidth: 1.1.2 - console.table@0.10.0: dependencies: easy-table: 1.1.0 @@ -31454,8 +32791,6 @@ snapshots: cookie@0.7.2: {} - cookie@1.1.1: {} - copy-to-clipboard@3.3.3: dependencies: toggle-selection: 1.0.6 @@ -31479,6 +32814,14 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 @@ -31505,6 +32848,13 @@ snapshots: optionalDependencies: typescript: 5.9.3 + crc-32@1.2.2: {} + + crc32-stream@7.0.1: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.7.0 + crc@3.8.0: dependencies: buffer: 5.7.1 @@ -31555,6 +32905,8 @@ snapshots: '@types/luxon': 3.7.1 luxon: 3.7.2 + croner@10.0.1: {} + cropperjs@1.6.2: {} cross-env@10.1.0: @@ -31669,6 +33021,190 @@ snapshots: custom-error-instance@2.1.1: {} + cytoscape-cose-bilkent@4.1.0(cytoscape@3.34.3): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.34.3 + + cytoscape-fcose@2.2.0(cytoscape@3.34.3): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.34.3 + + cytoscape@3.34.3: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.1.0 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.2: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.2 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.2 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.14: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.23 + damerau-levenshtein@1.0.8: {} dashdash@1.14.1: @@ -31718,12 +33254,16 @@ snapshots: date-fns@3.6.0: {} + date-fns@4.4.0: {} + dateformat@4.6.3: {} dayjs@1.11.13: {} dayjs@1.11.19: {} + dayjs@1.11.23: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -31783,8 +33323,6 @@ snapshots: which-collection: 1.0.2 which-typed-array: 1.1.20 - deep-extend@0.6.0: {} - deep-is@0.1.4: {} deepmerge@2.2.1: {} @@ -31817,6 +33355,10 @@ snapshots: escodegen: 2.1.0 esprima: 4.0.1 + delaunator@5.1.0: + dependencies: + robust-predicates: 3.0.3 + delay@5.0.0: {} delayed-stream@1.0.0: {} @@ -31868,6 +33410,8 @@ snapshots: diff@5.2.2: {} + diff@8.0.4: {} + diffie-hellman@5.0.3: dependencies: bn.js: 4.12.3 @@ -31999,7 +33543,7 @@ snapshots: '@one-ini/wasm': 0.1.1 commander: 10.0.1 minimatch: 9.0.9 - semver: 7.7.4 + semver: 7.8.5 ee-first@1.1.1: {} @@ -32030,6 +33574,8 @@ snapshots: empathic@2.0.0: {} + empathic@2.0.1: {} + encode-utf8@1.0.3: {} encodeurl@1.0.2: {} @@ -32080,8 +33626,6 @@ snapshots: dependencies: is-arrayish: 0.2.1 - error-stack-parser-es@1.0.5: {} - error-stack-parser@2.1.4: dependencies: stackframe: 1.3.4 @@ -32207,16 +33751,18 @@ snapshots: es-toolkit@1.33.0: {} + es-toolkit@1.52.0: {} + es6-promise@4.2.8: {} es6-promisify@5.0.0: dependencies: es6-promise: 4.2.8 - esbuild-register@3.6.0(esbuild@0.27.3): + esbuild-register@3.6.0(esbuild@0.28.2): dependencies: debug: 4.4.3(supports-color@5.5.0) - esbuild: 0.27.3 + esbuild: 0.28.2 transitivePeerDependencies: - supports-color @@ -32278,63 +33824,34 @@ snapshots: '@esbuild/win32-ia32': 0.27.3 '@esbuild/win32-x64': 0.27.3 - esbuild@0.27.7: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.7 - '@esbuild/android-arm': 0.27.7 - '@esbuild/android-arm64': 0.27.7 - '@esbuild/android-x64': 0.27.7 - '@esbuild/darwin-arm64': 0.27.7 - '@esbuild/darwin-x64': 0.27.7 - '@esbuild/freebsd-arm64': 0.27.7 - '@esbuild/freebsd-x64': 0.27.7 - '@esbuild/linux-arm': 0.27.7 - '@esbuild/linux-arm64': 0.27.7 - '@esbuild/linux-ia32': 0.27.7 - '@esbuild/linux-loong64': 0.27.7 - '@esbuild/linux-mips64el': 0.27.7 - '@esbuild/linux-ppc64': 0.27.7 - '@esbuild/linux-riscv64': 0.27.7 - '@esbuild/linux-s390x': 0.27.7 - '@esbuild/linux-x64': 0.27.7 - '@esbuild/netbsd-arm64': 0.27.7 - '@esbuild/netbsd-x64': 0.27.7 - '@esbuild/openbsd-arm64': 0.27.7 - '@esbuild/openbsd-x64': 0.27.7 - '@esbuild/openharmony-arm64': 0.27.7 - '@esbuild/sunos-x64': 0.27.7 - '@esbuild/win32-arm64': 0.27.7 - '@esbuild/win32-ia32': 0.27.7 - '@esbuild/win32-x64': 0.27.7 - - esbuild@0.28.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.28.1 - '@esbuild/android-arm': 0.28.1 - '@esbuild/android-arm64': 0.28.1 - '@esbuild/android-x64': 0.28.1 - '@esbuild/darwin-arm64': 0.28.1 - '@esbuild/darwin-x64': 0.28.1 - '@esbuild/freebsd-arm64': 0.28.1 - '@esbuild/freebsd-x64': 0.28.1 - '@esbuild/linux-arm': 0.28.1 - '@esbuild/linux-arm64': 0.28.1 - '@esbuild/linux-ia32': 0.28.1 - '@esbuild/linux-loong64': 0.28.1 - '@esbuild/linux-mips64el': 0.28.1 - '@esbuild/linux-ppc64': 0.28.1 - '@esbuild/linux-riscv64': 0.28.1 - '@esbuild/linux-s390x': 0.28.1 - '@esbuild/linux-x64': 0.28.1 - '@esbuild/netbsd-arm64': 0.28.1 - '@esbuild/netbsd-x64': 0.28.1 - '@esbuild/openbsd-arm64': 0.28.1 - '@esbuild/openbsd-x64': 0.28.1 - '@esbuild/openharmony-arm64': 0.28.1 - '@esbuild/sunos-x64': 0.28.1 - '@esbuild/win32-arm64': 0.28.1 - '@esbuild/win32-ia32': 0.28.1 - '@esbuild/win32-x64': 0.28.1 + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 escalade@3.2.0: {} @@ -32675,10 +34192,18 @@ snapshots: eventemitter3@5.0.4: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.9.2 + transitivePeerDependencies: + - bare-abort-controller + events@3.3.0: {} eventsource-parser@3.0.6: {} + eventsource-parser@3.1.1: {} + eventsource@3.0.7: dependencies: eventsource-parser: 3.0.6 @@ -32867,6 +34392,8 @@ snapshots: fast-equals@5.4.0: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.1: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -32895,19 +34422,20 @@ snapshots: fast-stable-stringify@1.0.0: {} - fast-string-truncated-width@1.2.1: {} + fast-string-truncated-width@3.0.3: {} - fast-string-width@1.1.0: + fast-string-width@3.0.2: dependencies: - fast-string-truncated-width: 1.2.1 + fast-string-truncated-width: 3.0.3 - fast-text-encoding@1.0.6: {} + fast-text-encoding@1.0.6: + optional: true fast-uri@3.1.0: {} - fast-wrap-ansi@0.1.6: + fast-wrap-ansi@0.2.2: dependencies: - fast-string-width: 1.1.0 + fast-string-width: 3.0.2 fast-xml-builder@1.0.0: {} @@ -32930,6 +34458,10 @@ snapshots: fast-xml-builder: 1.0.0 strnum: 2.2.0 + fastdom@1.0.12: + dependencies: + strictdom: 1.0.1 + fastestsmallesttextencoderdecoder@1.0.22: {} fastq@1.20.1: @@ -32946,13 +34478,9 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.5.0(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 - - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 fetch-blob@3.2.0: dependencies: @@ -33089,7 +34617,7 @@ snapshots: dependencies: fast-glob: 3.3.3 pkg-types: 1.3.1 - yaml: 2.8.2 + yaml: 2.9.1 first-match@0.0.1: {} @@ -33140,7 +34668,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -33155,7 +34683,7 @@ snapshots: semver: 7.7.4 tapable: 2.3.0 typescript: 5.9.3 - webpack: 5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) form-data-encoder@1.7.2: {} @@ -33290,6 +34818,7 @@ snapshots: transitivePeerDependencies: - encoding - supports-color + optional: true gaxios@6.7.1: dependencies: @@ -33302,6 +34831,14 @@ snapshots: - encoding - supports-color + gaxios@7.3.1: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + transitivePeerDependencies: + - supports-color + gcp-metadata@5.3.0: dependencies: gaxios: 5.1.3 @@ -33309,6 +34846,7 @@ snapshots: transitivePeerDependencies: - encoding - supports-color + optional: true gcp-metadata@6.1.1: dependencies: @@ -33319,6 +34857,14 @@ snapshots: - encoding - supports-color + gcp-metadata@8.1.2: + dependencies: + gaxios: 7.3.1 + google-logging-utils: 1.1.3 + json-bigint: 1.0.0 + transitivePeerDependencies: + - supports-color + generator-function@2.0.1: {} generic-pool@3.9.0: {} @@ -33327,6 +34873,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.7.0: {} + get-func-name@2.0.2: {} get-intrinsic@1.3.0: @@ -33456,6 +35004,17 @@ snapshots: globrex@0.1.2: {} + google-auth-library@10.9.1: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 7.3.1 + gcp-metadata: 8.1.2 + google-logging-utils: 1.1.3 + jws: 4.0.1 + transitivePeerDependencies: + - supports-color + google-auth-library@8.9.0: dependencies: arrify: 2.0.1 @@ -33470,6 +35029,7 @@ snapshots: transitivePeerDependencies: - encoding - supports-color + optional: true google-auth-library@9.15.1: dependencies: @@ -33485,9 +35045,12 @@ snapshots: google-logging-utils@0.0.2: {} + google-logging-utils@1.1.3: {} + google-p12-pem@4.0.1: dependencies: node-forge: 1.3.3 + optional: true googleapis-common@7.2.0: dependencies: @@ -33536,14 +35099,6 @@ snapshots: graphql: 16.13.1 lodash.get: 4.4.2 - graphql-request@6.1.0(graphql@16.13.1): - dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.13.1) - cross-fetch: 3.2.0 - graphql: 16.13.1 - transitivePeerDependencies: - - encoding - graphql-scalars@1.25.0(graphql@16.13.1): dependencies: graphql: 16.13.1 @@ -33586,6 +35141,7 @@ snapshots: web-streams-polyfill: 3.3.3 transitivePeerDependencies: - encoding + optional: true gtoken@6.1.2: dependencies: @@ -33595,6 +35151,7 @@ snapshots: transitivePeerDependencies: - encoding - supports-color + optional: true gtoken@7.1.0: dependencies: @@ -33616,6 +35173,8 @@ snapshots: ufo: 1.6.3 uncrypto: 0.1.3 + hachure-fill@0.5.2: {} + handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -33700,6 +35259,19 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-from-dom@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hastscript: 9.0.1 + web-namespaces: 2.0.1 + + hast-util-from-html-isomorphic@2.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-dom: 5.0.1 + hast-util-from-html: 2.0.3 + unist-util-remove-position: 5.0.0 + hast-util-from-html@2.0.3: dependencies: '@types/hast': 3.0.4 @@ -33732,8 +35304,6 @@ snapshots: dependencies: '@types/hast': 3.0.4 - hast-util-parse-selector@2.2.5: {} - hast-util-parse-selector@3.1.1: dependencies: '@types/hast': 2.3.10 @@ -33758,6 +35328,12 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 + hast-util-sanitize@5.0.2: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + unist-util-position: 5.0.0 + hast-util-select@6.0.4: dependencies: '@types/hast': 3.0.4 @@ -33824,19 +35400,20 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + hast-util-whitespace@2.0.1: {} hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 - hastscript@6.0.0: - dependencies: - '@types/hast': 2.3.10 - comma-separated-tokens: 1.0.8 - hast-util-parse-selector: 2.2.5 - property-information: 5.6.0 - space-separated-tokens: 1.1.5 + hast@1.0.0: {} hastscript@7.2.0: dependencies: @@ -33889,7 +35466,7 @@ snapshots: highlightjs-vue@1.0.0: {} - hls.js@1.6.15: {} + hls.js@1.7.3: {} hmac-drbg@1.0.1: dependencies: @@ -33909,15 +35486,6 @@ snapshots: hono: 4.12.10 zod: 3.25.76 - hono-openapi@1.3.0(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(hono@4.12.10)(openapi-types@12.1.3): - dependencies: - '@standard-community/standard-json': 0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76) - '@standard-community/standard-openapi': 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76) - '@types/json-schema': 7.0.15 - openapi-types: 12.1.3 - optionalDependencies: - hono: 4.12.10 - hono@4.12.10: {} hono@4.12.5: {} @@ -34106,8 +35674,6 @@ snapshots: dependencies: queue: 6.0.2 - image-size@2.0.2: {} - image-to-pdf@3.0.2: dependencies: pdfkit: 0.15.2 @@ -34147,6 +35713,8 @@ snapshots: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 + import-meta-resolve@4.2.0: {} + imurmurhash@0.1.4: {} indent-string@4.0.0: {} @@ -34175,6 +35743,10 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 + internmap@1.0.1: {} + + internmap@2.0.3: {} + into-stream@6.0.0: dependencies: from2: 2.3.0 @@ -34204,15 +35776,8 @@ snapshots: iron-webcrypto@1.2.1: {} - is-alphabetical@1.0.4: {} - is-alphabetical@2.0.1: {} - is-alphanumerical@1.0.4: - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - is-alphanumerical@2.0.1: dependencies: is-alphabetical: 2.0.1 @@ -34262,7 +35827,7 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.7.4 + semver: 7.8.5 is-callable@1.2.7: {} @@ -34281,12 +35846,12 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-decimal@1.0.4: {} - is-decimal@2.0.1: {} is-docker@2.2.1: {} + is-electron@2.2.2: {} + is-extendable@0.1.1: {} is-extendable@1.0.1: @@ -34315,8 +35880,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-hexadecimal@1.0.4: {} - is-hexadecimal@2.0.1: {} is-hotkey@0.1.8: {} @@ -34360,8 +35923,6 @@ snapshots: is-plain-object@5.0.0: {} - is-port-reachable@4.0.0: {} - is-potential-custom-element-name@1.0.1: {} is-promise@4.0.0: {} @@ -34479,7 +36040,7 @@ snapshots: '@babel/parser': 7.29.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.4 + semver: 7.8.5 transitivePeerDependencies: - supports-color @@ -34840,7 +36401,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.4 + semver: 7.8.5 transitivePeerDependencies: - supports-color @@ -34906,10 +36467,14 @@ snapshots: jose@6.2.0: {} + jose@6.2.12: {} + joycon@3.1.1: {} jpeg-exif@1.1.4: {} + jpeg-js@0.4.4: {} + js-base64@2.6.4: {} js-base64@3.7.8: {} @@ -34932,6 +36497,8 @@ snapshots: dependencies: base64-js: 1.5.1 + js-tokens@10.0.0: {} + js-tokens@4.0.0: {} js-tokens@9.0.1: {} @@ -35162,6 +36729,10 @@ snapshots: dependencies: commander: 8.3.0 + katex@0.16.47: + dependencies: + commander: 8.3.0 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -35172,6 +36743,8 @@ snapshots: keyvaluestorage-interface@1.0.0: {} + khroma@2.1.0: {} + kind-of@6.0.3: {} kleur@3.0.3: {} @@ -35180,61 +36753,51 @@ snapshots: konva@10.2.0: {} - langchain@0.3.37(@langchain/aws@0.1.15(@langchain/core@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))))(@langchain/core@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(@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))(axios@1.19.0)(cheerio@1.2.0)(handlebars@4.7.9)(openai@4.104.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@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)): dependencies: - '@langchain/core': 0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - '@langchain/openai': 0.5.18(@langchain/core@0.3.80(@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@4.104.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': 0.1.0(@langchain/core@0.3.80(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))) - js-tiktoken: 1.0.21 - js-yaml: 4.1.1 - jsonpointer: 5.0.1 - langsmith: 0.3.87(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - openapi-types: 12.1.3 - p-retry: 4.6.2 - uuid: 10.0.0 - yaml: 2.8.2 + '@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)) zod: 3.25.76 - optionalDependencies: - '@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))) - axios: 1.19.0(debug@4.4.3) - cheerio: 1.2.0 - handlebars: 4.7.9 transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/exporter-trace-otlp-proto' - '@opentelemetry/sdk-trace-base' - openai + - react + - react-dom - ws + optional: true - langsmith@0.3.87(@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@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)): + 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)): dependencies: - '@types/uuid': 10.0.0 - chalk: 4.1.2 - console-table-printer: 2.15.0 - p-queue: 6.6.2 - semver: 7.7.4 - 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) - openai: 4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + '@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)) + zod: 3.25.76 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + - react + - react-dom + - ws - langsmith@0.3.87(@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)): + 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)): dependencies: - '@types/uuid': 10.0.0 - chalk: 4.1.2 - console-table-printer: 2.15.0 p-queue: 6.6.2 - semver: 7.7.4 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) 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)): + 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)): dependencies: p-queue: 6.6.2 uuid: 10.0.0 @@ -35243,7 +36806,7 @@ snapshots: '@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.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) language-subtag-registry@0.3.23: {} @@ -35255,6 +36818,14 @@ snapshots: dependencies: language-subtag-registry: 0.3.23 + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + leac@0.6.0: {} leven@3.1.0: {} @@ -35402,6 +36973,12 @@ snapshots: lit-element: 4.2.2 lit-html: 3.3.2 + lit@3.3.3: + dependencies: + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.2 + load-esm@1.0.3: {} load-tsconfig@0.2.5: {} @@ -35534,8 +37111,6 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.7: {} - lru-cache@11.3.5: {} lru-cache@4.1.5: @@ -35550,6 +37125,7 @@ snapshots: lru-cache@6.0.0: dependencies: yallist: 4.0.0 + optional: true lru-cache@7.18.3: {} @@ -35557,10 +37133,20 @@ snapshots: dependencies: react: 19.2.4 - lucide-react@1.31.0(react@19.2.4): + lucide-react@0.525.0(react@19.2.4): + dependencies: + react: 19.2.4 + + lucide-react@0.542.0(react@19.2.4): dependencies: react: 19.2.4 + lucide-react@1.47.0(react@19.2.4): + dependencies: + react: 19.2.4 + + lucide@0.525.0: {} + luxon@3.7.2: {} lz-string@1.5.0: {} @@ -35585,7 +37171,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.4 + semver: 7.8.5 make-error@1.3.6: {} @@ -35604,34 +37190,47 @@ snapshots: markdown-table@3.0.4: {} + marked@12.0.2: {} + + marked@16.4.2: {} + marky@1.3.0: {} - mastra@1.3.19(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.5.4)(zod@3.25.76): + mastra@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): dependencies: - '@clack/prompts': 1.2.0 + '@babel/parser': 8.0.5 + '@babel/types': 8.0.5 + '@clack/prompts': 1.8.1 '@expo/devcert': 1.2.1 - '@mastra/core': 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@mastra/deployer': 1.21.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.5.4)(zod@3.25.76) - '@mastra/loggers': 1.1.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(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) + '@mastra/deployer': 1.67.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)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@mastra/loggers': 1.3.2(@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)) + archiver: 8.0.0 commander: 14.0.3 dotenv: 17.4.0 execa: 9.6.1 - fs-extra: 11.3.4 + fs-extra: 11.4.0 get-port: 7.1.0 local-pkg: 1.1.2 + openapi-fetch: 0.17.0 picocolors: 1.1.1 - posthog-node: 5.17.2 - prettier: 3.8.1 - semver: 7.7.4 - serve: 14.2.6 + posthog-node: 5.52.4(rxjs@7.8.2) + semver: 7.8.5 serve-handler: 6.1.7 - shell-quote: 1.8.3 strip-json-comments: 5.0.3 + tinyglobby: 0.2.17 yocto-spinner: 1.1.0 - zod: 3.25.76 transitivePeerDependencies: + - '@hono/node-server' + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - rxjs - supports-color - typescript + - utf-8-validate + - zod material-icons@1.13.14: {} @@ -35911,6 +37510,31 @@ snapshots: merge2@1.4.1: {} + mermaid@11.17.2: + dependencies: + '@braintree/sanitize-url': 7.1.2 + '@iconify/utils': 3.1.7 + '@mermaid-js/parser': 1.2.1 + '@types/d3': 7.4.3 + '@upsetjs/venn.js': 2.0.0 + cytoscape: 3.34.3 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.34.3) + cytoscape-fcose: 2.2.0(cytoscape@3.34.3) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.14 + dayjs: 1.11.23 + dompurify: 3.4.1 + es-toolkit: 1.52.0 + fastdom: 1.0.12 + katex: 0.16.47 + khroma: 2.1.0 + marked: 16.4.2 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.3.0 + uuid: 13.0.0 + methods@1.1.2: {} metro-babel-transformer@0.83.5: @@ -35944,7 +37568,7 @@ snapshots: metro-cache: 0.83.5 metro-core: 0.83.5 metro-runtime: 0.83.5 - yaml: 2.8.3 + yaml: 2.9.1 transitivePeerDependencies: - bufferutil - supports-color @@ -36125,6 +37749,38 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-extension-cjk-friendly-gfm-strikethrough@1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2): + dependencies: + devlop: 1.1.0 + get-east-asian-width: 1.7.0 + micromark: 4.0.2 + micromark-extension-cjk-friendly-util: 2.1.1(micromark-util-types@2.0.2) + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + optionalDependencies: + micromark-util-types: 2.0.2 + + micromark-extension-cjk-friendly-util@2.1.1(micromark-util-types@2.0.2): + dependencies: + get-east-asian-width: 1.7.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + optionalDependencies: + micromark-util-types: 2.0.2 + + micromark-extension-cjk-friendly@1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2): + dependencies: + devlop: 1.1.0 + micromark: 4.0.2 + micromark-extension-cjk-friendly-util: 2.1.1(micromark-util-types@2.0.2) + micromark-util-chunked: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + optionalDependencies: + micromark-util-types: 2.0.2 + micromark-extension-gfm-autolink-literal@2.1.0: dependencies: micromark-util-character: 2.1.1 @@ -36465,18 +38121,6 @@ snapshots: mimic-response@3.1.0: {} - miniflare@5.20260811.1-alpha(bufferutil@4.1.0)(utf-8-validate@6.0.6): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - sharp: 0.35.2 - undici: 7.29.0 - workerd: 1.20260811.1 - ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) - youch: 4.1.0-beta.10 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} @@ -36523,14 +38167,14 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.3 - mobx-react-lite@4.1.1(mobx@6.15.0)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4): + mobx-react-lite@4.1.1(mobx@6.15.0)(react-dom@19.2.4(react@19.2.4))(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): dependencies: mobx: 6.15.0 react: 19.2.4 use-sync-external-store: 1.6.0(react@19.2.4) optionalDependencies: react-dom: 19.2.4(react@19.2.4) - react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) + 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) mobx-state-tree@7.0.2(mobx@6.15.0)(typescript@5.5.4): dependencies: @@ -36639,13 +38283,13 @@ snapshots: '@nestjs/common': 11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@supercharge/request-ip': 1.2.0 - nestjs-temporal-core@3.2.3(@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)(@temporalio/client@1.15.0)(@temporalio/common@1.15.0)(@temporalio/worker@1.15.0(@swc/helpers@0.5.13)(esbuild@0.27.7)(tslib@2.8.1))(@temporalio/workflow@1.15.0)(reflect-metadata@0.2.2)(rxjs@7.8.2): + nestjs-temporal-core@3.2.3(@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)(@temporalio/client@1.15.0)(@temporalio/common@1.15.0)(@temporalio/worker@1.15.0(@swc/helpers@0.5.13)(esbuild@0.28.2)(tslib@2.8.1))(@temporalio/workflow@1.15.0)(reflect-metadata@0.2.2)(rxjs@7.8.2): 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) '@temporalio/client': 1.15.0 '@temporalio/common': 1.15.0 - '@temporalio/worker': 1.15.0(@swc/helpers@0.5.13)(esbuild@0.27.7)(tslib@2.8.1) + '@temporalio/worker': 1.15.0(@swc/helpers@0.5.13)(esbuild@0.28.2)(tslib@2.8.1) '@temporalio/workflow': 1.15.0 ms: 2.1.3 reflect-metadata: 0.2.2 @@ -36653,13 +38297,13 @@ snapshots: netmask@2.0.2: {} - next-plausible@3.12.5(next@16.3.1(@babel/core@7.29.0)(@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-dom@19.2.4(react@19.2.4))(react@19.2.4): + next-plausible@3.12.5(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-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - next: 16.3.1(@babel/core@7.29.0)(@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) + 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 react-dom: 19.2.4(react@19.2.4) - next@16.3.1(@babel/core@7.29.0)(@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): + 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): dependencies: '@next/env': 16.3.1 '@swc/helpers': 0.5.23 @@ -36668,7 +38312,7 @@ snapshots: postcss: 8.5.23 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - styled-jsx: 5.1.6(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react@19.2.4) + styled-jsx: 5.1.6(@babel/core@8.0.5)(babel-plugin-macros@3.1.0)(react@19.2.4) optionalDependencies: '@next/swc-darwin-arm64': 16.3.1 '@next/swc-darwin-x64': 16.3.1 @@ -36689,21 +38333,6 @@ snapshots: nexus-rpc@0.0.1: {} - nice-grpc-client-middleware-retry@3.1.13: - dependencies: - abort-controller-x: 0.4.3 - nice-grpc-common: 2.0.2 - - nice-grpc-common@2.0.2: - dependencies: - ts-error: 1.0.6 - - nice-grpc@2.1.14: - dependencies: - '@grpc/grpc-js': 1.14.3 - abort-controller-x: 0.4.3 - nice-grpc-common: 2.0.2 - no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -36711,7 +38340,7 @@ snapshots: node-abi@3.87.0: dependencies: - semver: 7.7.4 + semver: 7.8.5 node-abort-controller@3.1.1: {} @@ -36745,7 +38374,8 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-forge@1.3.3: {} + node-forge@1.3.3: + optional: true node-gyp-build@4.8.4: {} @@ -36915,7 +38545,7 @@ snapshots: oblivious-set@1.4.0: {} - obug@2.1.4: {} + obug@2.2.1: {} ofetch@1.5.1: dependencies: @@ -36945,31 +38575,19 @@ snapshots: dependencies: mimic-fn: 2.1.0 + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + open@7.4.2: dependencies: is-docker: 2.2.1 is-wsl: 2.2.0 - openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76): - dependencies: - '@types/node': 18.16.9 - '@types/node-fetch': 2.6.13 - abort-controller: 3.0.0 - agentkeepalive: 4.6.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0 - optionalDependencies: - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - zod: 3.25.76 - transitivePeerDependencies: - - encoding - - openai@5.23.2(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76): - optionalDependencies: - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - zod: 3.25.76 - openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76): optionalDependencies: ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -36980,8 +38598,14 @@ snapshots: ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) zod: 3.25.76 + openapi-fetch@0.17.0: + dependencies: + openapi-typescript-helpers: 0.1.0 + openapi-types@12.1.3: {} + openapi-typescript-helpers@0.1.0: {} + openapi3-ts@3.2.0: dependencies: yaml: 2.8.2 @@ -37049,14 +38673,15 @@ snapshots: transitivePeerDependencies: - zod - ox@0.4.4(typescript@5.5.4)(zod@3.25.76): + ox@0.14.0(typescript@5.5.4)(zod@4.6.5): dependencies: '@adraffy/ens-normalize': 1.11.1 - '@noble/curves': 1.9.7 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.3(typescript@5.5.4)(zod@3.25.76) + abitype: 1.2.3(typescript@5.5.4)(zod@4.6.5) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.5.4 @@ -37165,6 +38790,8 @@ snapshots: package-json-from-dist@1.0.1: {} + package-manager-detector@1.8.0: {} + pako@0.2.9: {} param-case@3.0.4: @@ -37186,15 +38813,6 @@ snapshots: pbkdf2: 3.1.5 safe-buffer: 5.2.1 - parse-entities@2.0.0: - dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 - parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 @@ -37256,6 +38874,8 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 + path-data-parser@0.1.0: {} + path-exists@4.0.0: {} path-expression-matcher@1.6.2: {} @@ -37286,8 +38906,6 @@ snapshots: path-to-regexp@3.3.0: {} - path-to-regexp@6.3.0: {} - path-to-regexp@8.3.0: {} path-to-regexp@8.4.2: {} @@ -37325,19 +38943,23 @@ snapshots: performance-now@2.1.0: {} - pg-cloudflare@1.3.0: + pg-cloudflare@1.4.0: optional: true pg-connection-string@2.12.0: {} + pg-connection-string@2.14.0: {} + pg-int8@1.0.1: {} - pg-pool@3.13.0(pg@8.20.0): + pg-pool@3.14.0(pg@8.23.0): dependencies: - pg: 8.20.0 + pg: 8.23.0 pg-protocol@1.13.0: {} + pg-protocol@1.16.0: {} + pg-types@2.2.0: dependencies: pg-int8: 1.0.1 @@ -37346,26 +38968,26 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg@8.20.0: + pg@8.23.0: dependencies: - pg-connection-string: 2.12.0 - pg-pool: 3.13.0(pg@8.20.0) - pg-protocol: 1.13.0 + pg-connection-string: 2.14.0 + pg-pool: 3.14.0(pg@8.23.0) + pg-protocol: 1.16.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: - pg-cloudflare: 1.3.0 + pg-cloudflare: 1.4.0 pgpass@1.0.5: dependencies: split2: 4.2.0 + phoenix@1.8.14: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} - picomatch@4.0.3: {} - picomatch@4.0.4: {} picomatch@4.0.5: {} @@ -37502,7 +39124,14 @@ snapshots: pngjs@5.0.0: {} - polotno@3.0.0-beta.25(@types/react@19.1.8)(@types/sortablejs@1.15.9)(konva@10.2.0)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@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): + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + + polotno@3.0.0-beta.25(@types/react@19.1.8)(@types/sortablejs@1.15.9)(konva@10.2.0)(react-dom@19.2.4(react@19.2.4))(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): dependencies: '@blueprintjs/core': 6.10.0(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@blueprintjs/icons': 6.8.0(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -37513,7 +39142,7 @@ snapshots: mediabunny: 1.40.1 mensch: 0.3.4 mobx: 6.15.0 - mobx-react-lite: 4.1.1(mobx@6.15.0)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4) + mobx-react-lite: 4.1.1(mobx@6.15.0)(react-dom@19.2.4(react@19.2.4))(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) mobx-state-tree: 7.0.2(mobx@6.15.0)(typescript@5.5.4) nanoid: 3.3.11 quill: 2.0.3 @@ -37558,13 +39187,13 @@ snapshots: postcss: 8.5.26 ts-node: 10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4) - postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.26)(yaml@2.8.3): + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.26)(yaml@2.9.1): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.6.1 postcss: 8.5.26 - yaml: 2.8.3 + yaml: 2.9.1 postcss-nested@6.2.0(postcss@8.5.26): dependencies: @@ -37616,9 +39245,11 @@ snapshots: query-selector-shadow-dom: 1.0.1 web-vitals: 5.1.0 - posthog-node@5.17.2: + posthog-node@5.52.4(rxjs@7.8.2): dependencies: - '@posthog/core': 1.7.1 + '@posthog/core': 1.54.2 + optionalDependencies: + rxjs: 7.8.2 preact@10.28.4: {} @@ -37626,8 +39257,6 @@ snapshots: prettier@2.8.8: {} - prettier@3.8.1: {} - pretty-bytes@6.1.1: {} pretty-format@27.5.1: @@ -37656,8 +39285,6 @@ snapshots: transitivePeerDependencies: - supports-color - prismjs@1.27.0: {} - prismjs@1.30.0: {} probe-image-size@7.2.3: @@ -37708,10 +39335,6 @@ snapshots: property-expr@2.0.6: {} - property-information@5.6.0: - dependencies: - xtend: 4.0.2 - property-information@6.5.0: {} property-information@7.1.0: {} @@ -38005,13 +39628,6 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - react-colorful@5.6.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: react: 19.2.4 @@ -38068,7 +39684,7 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-i18next@15.7.4(i18next@25.8.14(typescript@5.5.4))(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@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): + react-i18next@15.7.4(i18next@25.8.14(typescript@5.5.4))(react-dom@19.2.4(react@19.2.4))(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): dependencies: '@babel/runtime': 7.28.6 html-parse-stringify: 3.0.1 @@ -38076,7 +39692,7 @@ snapshots: react: 19.2.4 optionalDependencies: react-dom: 19.2.4(react@19.2.4) - react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) + 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) typescript: 5.5.4 react-is@16.13.1: {} @@ -38180,20 +39796,20 @@ snapshots: react-lifecycles-compat: 3.0.4 warning: 4.0.3 - react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10): + 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): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.84.1 - '@react-native/codegen': 0.84.1(@babel/core@7.29.0) + '@react-native/codegen': 0.84.1(@babel/core@8.0.5) '@react-native/community-cli-plugin': 0.84.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) '@react-native/gradle-plugin': 0.84.1 '@react-native/js-polyfills': 0.84.1 '@react-native/normalize-colors': 0.84.1 - '@react-native/virtualized-lists': 0.84.1(@types/react@19.1.8)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4) + '@react-native/virtualized-lists': 0.84.1(@types/react@19.1.8)(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) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 - babel-jest: 29.7.0(@babel/core@7.29.0) + babel-jest: 29.7.0(@babel/core@8.0.5) babel-plugin-syntax-hermes-parser: 0.32.0 base64-js: 1.5.1 commander: 12.1.0 @@ -38304,7 +39920,7 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 - react-syntax-highlighter@15.6.6(react@19.2.4): + react-syntax-highlighter@16.1.1(react@19.2.4): dependencies: '@babel/runtime': 7.28.6 highlight.js: 10.7.3 @@ -38312,7 +39928,7 @@ snapshots: lowlight: 1.20.0 prismjs: 1.30.0 react: 19.2.4 - refractor: 3.6.0 + refractor: 5.0.0 react-tag-autocomplete@7.5.1(react@19.2.4): dependencies: @@ -38392,6 +40008,10 @@ snapshots: dependencies: readable-stream: 4.7.0 + readdir-glob@3.0.0: + dependencies: + minimatch: 10.2.4 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -38436,12 +40056,6 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - refractor@3.6.0: - dependencies: - hastscript: 6.0.0 - parse-entities: 2.0.0 - prismjs: 1.27.0 - refractor@4.9.0: dependencies: '@types/hast': 2.3.10 @@ -38464,6 +40078,16 @@ snapshots: regenerator-runtime@0.13.11: {} + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -38482,15 +40106,6 @@ snapshots: unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.1 - registry-auth-token@3.3.2: - dependencies: - rc: 1.2.8 - safe-buffer: 5.2.1 - - registry-url@3.1.0: - dependencies: - rc: 1.2.8 - regjsgen@0.8.0: {} regjsparser@0.13.0: @@ -38511,12 +40126,26 @@ snapshots: unified: 11.0.5 unist-util-visit: 5.1.0 + rehype-harden@1.1.8: + dependencies: + unist-util-visit: 5.1.0 + rehype-ignore@2.0.3: dependencies: hast-util-select: 6.0.4 unified: 11.0.5 unist-util-visit: 5.1.0 + rehype-katex@7.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.8 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.2 + katex: 0.16.35 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + rehype-parse@9.0.1: dependencies: '@types/hast': 3.0.4 @@ -38553,6 +40182,11 @@ snapshots: unified: 11.0.5 unist-util-visit: 5.1.0 + rehype-sanitize@6.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-sanitize: 5.0.2 + rehype-slug@6.0.0: dependencies: '@types/hast': 3.0.4 @@ -38574,6 +40208,26 @@ snapshots: rehype-stringify: 10.0.1 unified: 11.0.5 + remark-cjk-friendly-gfm-strikethrough@1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5): + dependencies: + micromark-extension-cjk-friendly-gfm-strikethrough: 1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2) + unified: 11.0.5 + optionalDependencies: + '@types/mdast': 4.0.4 + transitivePeerDependencies: + - micromark + - micromark-util-types + + remark-cjk-friendly@1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5): + dependencies: + micromark-extension-cjk-friendly: 1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2) + unified: 11.0.5 + optionalDependencies: + '@types/mdast': 4.0.4 + transitivePeerDependencies: + - micromark + - micromark-util-types + remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 @@ -38636,6 +40290,10 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 + remend@1.0.1: {} + + remend@1.3.1: {} + remove-markdown@0.5.5: {} request-promise-core@1.1.3(request@2.88.2): @@ -38757,6 +40415,8 @@ snapshots: hash-base: 3.1.2 inherits: 2.0.4 + robust-predicates@3.0.3: {} + rolldown@1.2.4: dependencies: '@oxc-project/types': 0.144.0 @@ -38777,13 +40437,13 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.2.4 '@rolldown/binding-win32-x64-msvc': 1.2.4 - rollup-plugin-esbuild@6.2.1(esbuild@0.27.7)(rollup@4.59.0): + rollup-plugin-esbuild@6.2.1(esbuild@0.28.2)(rollup@4.63.3): dependencies: debug: 4.4.3(supports-color@5.5.0) es-module-lexer: 1.7.0 - esbuild: 0.27.7 + esbuild: 0.28.2 get-tsconfig: 4.13.6 - rollup: 4.59.0 + rollup: 4.63.3 unplugin-utils: 0.2.5 transitivePeerDependencies: - supports-color @@ -38823,8 +40483,47 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.59.0 fsevents: 2.3.3 + rollup@4.63.3: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.63.3 + '@rollup/rollup-android-arm64': 4.63.3 + '@rollup/rollup-darwin-arm64': 4.63.3 + '@rollup/rollup-darwin-x64': 4.63.3 + '@rollup/rollup-freebsd-arm64': 4.63.3 + '@rollup/rollup-freebsd-x64': 4.63.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.63.3 + '@rollup/rollup-linux-arm-musleabihf': 4.63.3 + '@rollup/rollup-linux-arm64-gnu': 4.63.3 + '@rollup/rollup-linux-arm64-musl': 4.63.3 + '@rollup/rollup-linux-loong64-gnu': 4.63.3 + '@rollup/rollup-linux-loong64-musl': 4.63.3 + '@rollup/rollup-linux-ppc64-gnu': 4.63.3 + '@rollup/rollup-linux-ppc64-musl': 4.63.3 + '@rollup/rollup-linux-riscv64-gnu': 4.63.3 + '@rollup/rollup-linux-riscv64-musl': 4.63.3 + '@rollup/rollup-linux-s390x-gnu': 4.63.3 + '@rollup/rollup-linux-x64-gnu': 4.63.3 + '@rollup/rollup-linux-x64-musl': 4.63.3 + '@rollup/rollup-openbsd-x64': 4.63.3 + '@rollup/rollup-openharmony-arm64': 4.63.3 + '@rollup/rollup-win32-arm64-msvc': 4.63.3 + '@rollup/rollup-win32-ia32-msvc': 4.63.3 + '@rollup/rollup-win32-x64-gnu': 4.63.3 + '@rollup/rollup-win32-x64-msvc': 4.63.3 + fsevents: 2.3.3 + rope-sequence@1.3.4: {} + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + router@2.2.0: dependencies: debug: 4.4.3(supports-color@5.5.0) @@ -38843,7 +40542,7 @@ snapshots: buffer: 6.0.3 eventemitter3: 5.0.4 uuid: 11.1.0 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: bufferutil: 4.1.0 utf-8-validate: 6.0.6 @@ -38865,6 +40564,8 @@ snapshots: dependencies: queue-microtask: 1.2.3 + rw@1.3.3: {} + rxjs@6.6.7: dependencies: tslib: 1.14.1 @@ -38972,7 +40673,7 @@ snapshots: semver-truncate@3.0.0: dependencies: - semver: 7.7.4 + semver: 7.8.5 semver@6.3.1: {} @@ -39052,22 +40753,6 @@ snapshots: transitivePeerDependencies: - supports-color - serve@14.2.6: - dependencies: - '@zeit/schemas': 2.36.0 - ajv: 8.18.0 - arg: 5.0.2 - boxen: 7.0.0 - chalk: 5.0.1 - chalk-template: 0.4.0 - clipboardy: 3.0.0 - compression: 1.8.1 - is-port-reachable: 4.0.0 - serve-handler: 6.1.7 - update-check: 1.5.4 - transitivePeerDependencies: - - supports-color - server-only@0.0.1: {} set-blocking@2.0.0: {} @@ -39135,38 +40820,6 @@ snapshots: '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 - sharp@0.35.2: - dependencies: - '@img/colour': 1.1.0 - detect-libc: 2.1.2 - semver: 7.8.5 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.35.2 - '@img/sharp-darwin-x64': 0.35.2 - '@img/sharp-freebsd-wasm32': 0.35.2 - '@img/sharp-libvips-darwin-arm64': 1.3.1 - '@img/sharp-libvips-darwin-x64': 1.3.1 - '@img/sharp-libvips-linux-arm': 1.3.1 - '@img/sharp-libvips-linux-arm64': 1.3.1 - '@img/sharp-libvips-linux-ppc64': 1.3.1 - '@img/sharp-libvips-linux-riscv64': 1.3.1 - '@img/sharp-libvips-linux-s390x': 1.3.1 - '@img/sharp-libvips-linux-x64': 1.3.1 - '@img/sharp-libvips-linuxmusl-arm64': 1.3.1 - '@img/sharp-libvips-linuxmusl-x64': 1.3.1 - '@img/sharp-linux-arm': 0.35.2 - '@img/sharp-linux-arm64': 0.35.2 - '@img/sharp-linux-ppc64': 0.35.2 - '@img/sharp-linux-riscv64': 0.35.2 - '@img/sharp-linux-s390x': 0.35.2 - '@img/sharp-linux-x64': 0.35.2 - '@img/sharp-linuxmusl-arm64': 0.35.2 - '@img/sharp-linuxmusl-x64': 0.35.2 - '@img/sharp-webcontainers-wasm32': 0.35.2 - '@img/sharp-win32-arm64': 0.35.2 - '@img/sharp-win32-ia32': 0.35.2 - '@img/sharp-win32-x64': 0.35.2 - sharp@0.35.3(@types/node@18.16.9): dependencies: '@img/colour': 1.1.0 @@ -39215,6 +40868,17 @@ snapshots: shell-quote@1.8.3: {} + shiki@3.23.0: + dependencies: + '@shikijs/core': 3.23.0 + '@shikijs/engine-javascript': 3.23.0 + '@shikijs/engine-oniguruma': 3.23.0 + '@shikijs/langs': 3.23.0 + '@shikijs/themes': 3.23.0 + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -39269,8 +40933,6 @@ snapshots: dependencies: semver: 7.7.4 - simple-wcswidth@1.1.2: {} - sirv@2.0.4: dependencies: '@polka/url': 1.0.0-next.29 @@ -39294,7 +40956,7 @@ snapshots: direction: 1.0.4 is-hotkey: 0.1.8 is-plain-object: 5.0.0 - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) scroll-into-view-if-needed: 2.2.31 @@ -39367,11 +41029,11 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@4.0.2(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)): + source-map-loader@4.0.2(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) source-map-support@0.5.13: dependencies: @@ -39391,8 +41053,6 @@ snapshots: source-map@0.7.6: {} - space-separated-tokens@1.1.5: {} - space-separated-tokens@2.0.2: {} split-on-first@1.1.0: {} @@ -39439,8 +41099,6 @@ snapshots: std-env@3.10.0: {} - std-env@4.2.0: {} - stealthy-require@1.1.1: {} stop-iteration-iterator@1.1.0: @@ -39467,10 +41125,53 @@ snapshots: stream-shift@1.0.3: {} + streamdown@1.6.11(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.2.4): + dependencies: + clsx: 2.1.1 + hast: 1.0.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + katex: 0.16.35 + lucide-react: 0.542.0(react@19.2.4) + marked: 16.4.2 + mermaid: 11.17.2 + react: 19.2.4 + rehype-harden: 1.1.8 + rehype-katex: 7.0.1 + rehype-raw: 7.0.0 + rehype-sanitize: 6.0.0 + remark-cjk-friendly: 1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5) + remark-cjk-friendly-gfm-strikethrough: 1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5) + remark-gfm: 4.0.1 + remark-math: 6.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remend: 1.0.1 + shiki: 3.23.0 + tailwind-merge: 3.7.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + transitivePeerDependencies: + - '@types/mdast' + - micromark + - micromark-util-types + - supports-color + streamsearch@1.1.0: {} + streamx@2.28.1: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + strict-uri-encode@2.0.0: {} + strictdom@1.0.1: {} + string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -39571,8 +41272,6 @@ snapshots: strip-final-newline@4.0.0: {} - strip-json-comments@2.0.1: {} - strip-json-comments@3.1.1: {} strip-json-comments@5.0.3: {} @@ -39625,12 +41324,12 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - styled-jsx@5.1.6(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react@19.2.4): + styled-jsx@5.1.6(@babel/core@8.0.5)(babel-plugin-macros@3.1.0)(react@19.2.4): dependencies: client-only: 0.0.1 react: 19.2.4 optionalDependencies: - '@babel/core': 7.29.0 + '@babel/core': 8.0.5 babel-plugin-macros: 3.1.0 stylis-plugin-rtl@2.1.1(stylis@4.3.6): @@ -39658,13 +41357,11 @@ snapshots: lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.7 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 ts-interface-checker: 0.1.13 superstruct@2.0.2: {} - supports-color@10.2.2: {} - supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -39697,11 +41394,11 @@ snapshots: dependencies: '@scarf/scarf': 1.4.0 - swc-loader@0.2.7(@swc/core@1.5.7(@swc/helpers@0.5.13))(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)): + swc-loader@0.2.7(@swc/core@1.5.7(@swc/helpers@0.5.13))(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)): dependencies: '@swc/core': 1.5.7(@swc/helpers@0.5.13) '@swc/counter': 0.1.3 - webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) sweetalert2@11.4.8: {} @@ -39719,6 +41416,8 @@ snapshots: tailwind-merge@1.14.0: {} + tailwind-merge@3.7.0: {} + tailwind-scrollbar@3.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4))): dependencies: tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4)) @@ -39756,6 +41455,17 @@ snapshots: tapable@2.3.0: {} + tar-stream@3.2.1: + dependencies: + b4a: 1.9.0 + bare-fs: 4.8.1 + fast-fifo: 1.3.2 + streamx: 2.28.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + tar@6.2.1: dependencies: chownr: 2.0.0 @@ -39765,27 +41475,34 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - terser-webpack-plugin@5.3.17(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)): + teex@1.0.1: + dependencies: + streamx: 2.28.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + terser-webpack-plugin@5.3.17(@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)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.46.0 - webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) optionalDependencies: '@swc/core': 1.5.7(@swc/helpers@0.5.13) - esbuild: 0.27.7 + esbuild: 0.28.2 - terser-webpack-plugin@5.3.17(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)): + terser-webpack-plugin@5.3.17(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.46.0 - webpack: 5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) optionalDependencies: '@swc/core': 1.5.7(@swc/helpers@0.5.13) - esbuild: 0.27.7 + esbuild: 0.28.2 terser@5.46.0: dependencies: @@ -39800,6 +41517,12 @@ snapshots: glob: 7.2.3 minimatch: 3.1.5 + text-decoder@1.2.7: + dependencies: + b4a: 1.9.0 + transitivePeerDependencies: + - react-native-b4a + text-encoding-utf-8@1.0.2: {} text-table@0.2.0: {} @@ -39850,24 +41573,22 @@ snapshots: tinyexec@0.3.2: {} - tinyexec@1.3.0: {} + tinyexec@1.3.1: {} tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinypool@1.1.1: {} tinyrainbow@2.0.0: {} - tinyrainbow@3.1.1: {} - tinyspy@3.0.2: {} tippy.js@6.3.7: @@ -39998,7 +41719,7 @@ snapshots: dependencies: typescript: 5.5.4 - ts-error@1.0.6: {} + ts-dedent@2.3.0: {} ts-essentials@10.1.1(typescript@5.5.4): optionalDependencies: @@ -40014,7 +41735,7 @@ snapshots: dependencies: tslib: 2.8.1 - ts-jest@29.4.6(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(esbuild@0.27.7)(jest-util@29.7.0)(jest@29.7.0(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4)))(typescript@5.5.4): + ts-jest@29.4.6(@babel/core@8.0.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@8.0.5))(esbuild@0.28.2)(jest-util@29.7.0)(jest@29.7.0(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4)))(typescript@5.5.4): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -40028,11 +41749,11 @@ snapshots: typescript: 5.5.4 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.29.0 + '@babel/core': 8.0.5 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.29.0) - esbuild: 0.27.7 + babel-jest: 29.7.0(@babel/core@8.0.5) + esbuild: 0.28.2 jest-util: 29.7.0 ts-node@10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4): @@ -40085,7 +41806,9 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(@swc/core@1.5.7(@swc/helpers@0.5.13))(jiti@2.6.1)(postcss@8.5.26)(typescript@5.5.4)(yaml@2.8.3): + tsscmp@1.0.6: {} + + tsup@8.5.1(@swc/core@1.5.7(@swc/helpers@0.5.13))(jiti@2.6.1)(postcss@8.5.26)(typescript@5.5.4)(yaml@2.9.1): dependencies: bundle-require: 5.1.0(esbuild@0.27.3) cac: 6.7.14 @@ -40096,7 +41819,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.26)(yaml@2.8.3) + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.26)(yaml@2.9.1) resolve-from: 5.0.0 rollup: 4.59.0 source-map: 0.7.6 @@ -40138,6 +41861,8 @@ snapshots: proper-lockfile: 4.1.2 url-parse: 1.5.10 + tw-animate-css@1.4.0: {} + tweetnacl@0.14.5: {} tweetnacl@1.0.3: {} @@ -40177,7 +41902,7 @@ snapshots: graphql: 16.13.1 graphql-query-complexity: 0.12.0(graphql@16.13.1) graphql-scalars: 1.25.0(graphql@16.13.1) - semver: 7.7.4 + semver: 7.8.5 tslib: 2.8.1 optionalDependencies: class-validator: 0.14.4 @@ -40239,7 +41964,7 @@ snapshots: transitivePeerDependencies: - supports-color - typescript-paths@1.5.1(typescript@5.5.4): + typescript-paths@1.5.2(typescript@5.5.4): dependencies: typescript: 5.5.4 @@ -40283,13 +42008,16 @@ snapshots: undici-types@6.21.0: {} - undici@7.25.0: {} + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 - undici@7.29.0: {} + undici@6.28.1: {} - unenv@2.0.0-rc.24: - dependencies: - pathe: 2.0.3 + undici@7.25.0: {} + + undici@7.29.0: + optional: true unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -40350,6 +42078,11 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-generated@2.0.1: {} unist-util-is@5.2.1: @@ -40420,7 +42153,7 @@ snapshots: unplugin-utils@0.2.5: dependencies: pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.5 unrs-resolver@1.11.1: dependencies: @@ -40469,11 +42202,6 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - update-check@1.5.4: - dependencies: - registry-auth-token: 3.3.2 - registry-url: 3.1.0 - upper-case-first@2.0.2: dependencies: tslib: 2.8.1 @@ -40549,6 +42277,10 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + use-stick-to-bottom@1.1.6(react@19.2.4): + dependencies: + react: 19.2.4 + use-sync-external-store@1.2.0(react@19.2.4): dependencies: react: 19.2.4 @@ -40623,6 +42355,8 @@ snapshots: vary@1.1.2: {} + verkit@0.3.2: {} + verror@1.10.0: dependencies: assert-plus: 1.0.0 @@ -40707,13 +42441,13 @@ snapshots: - utf-8-validate - zod - vite-node@3.1.4(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3): + vite-node@3.1.4(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@5.5.0) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vite: 6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) transitivePeerDependencies: - '@types/node' - jiti @@ -40728,25 +42462,25 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.5.4)(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)): + vite-tsconfig-paths@5.1.4(typescript@5.5.4)(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1)): dependencies: debug: 4.4.3(supports-color@5.5.0) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.5.4) optionalDependencies: - vite: 8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vite: 8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) transitivePeerDependencies: - supports-color - typescript - vite@6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3): + vite@6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1): dependencies: esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 postcss: 8.5.26 rollup: 4.59.0 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 18.16.9 fsevents: 2.3.3 @@ -40754,9 +42488,9 @@ snapshots: lightningcss: 1.33.0 sass: 1.97.3 terser: 5.46.0 - yaml: 2.8.3 + yaml: 2.9.1 - vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3): + vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 @@ -40765,33 +42499,17 @@ snapshots: tinyglobby: 0.2.17 optionalDependencies: '@types/node': 18.16.9 - esbuild: 0.27.7 - fsevents: 2.3.3 - jiti: 2.6.1 - sass: 1.97.3 - terser: 5.46.0 - yaml: 2.8.3 - - vite@8.2.1(@types/node@20.19.37)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3): - dependencies: - lightningcss: 1.33.0 - picomatch: 4.0.5 - postcss: 8.5.26 - rolldown: 1.2.4 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 20.19.37 - esbuild: 0.28.1 + esbuild: 0.28.2 fsevents: 2.3.3 jiti: 2.6.1 sass: 1.97.3 terser: 5.46.0 - yaml: 2.8.3 + yaml: 2.9.1 - vitest@3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3): + vitest@3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1): dependencies: '@vitest/expect': 3.1.4 - '@vitest/mocker': 3.1.4(vite@6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) + '@vitest/mocker': 3.1.4(vite@6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.1.4 '@vitest/snapshot': 3.1.4 @@ -40808,8 +42526,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) - vite-node: 3.1.4(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vite: 6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) + vite-node: 3.1.4(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -40831,38 +42549,6 @@ snapshots: - tsx - yaml - vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@20.19.37)(@vitest/coverage-v8@1.6.0(vitest@3.1.4))(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jsdom@29.1.0(@noble/hashes@2.0.1)(canvas@2.11.2))(vite@8.2.1(@types/node@20.19.37)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)): - dependencies: - '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@20.19.37)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) - '@vitest/pretty-format': 4.1.10 - '@vitest/runner': 4.1.10 - '@vitest/snapshot': 4.1.10 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 - es-module-lexer: 2.0.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.4 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.2.0 - tinybench: 2.9.0 - tinyexec: 1.3.0 - tinyglobby: 0.2.15 - tinyrainbow: 3.1.1 - vite: 8.2.1(@types/node@20.19.37)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) - why-is-node-running: 2.3.0 - optionalDependencies: - '@opentelemetry/api': 1.9.0 - '@types/node': 20.19.37 - '@vitest/coverage-v8': 1.6.0(vitest@3.1.4) - '@vitest/ui': 1.6.0(vitest@3.1.4) - happy-dom: 15.11.7 - jsdom: 29.1.0(@noble/hashes@2.0.1)(canvas@2.11.2) - transitivePeerDependencies: - - msw - vlq@1.0.1: {} void-elements@3.1.0: {} @@ -40894,20 +42580,6 @@ snapshots: dependencies: defaults: 1.0.4 - weaviate-client@3.12.0: - dependencies: - '@datastructures-js/deque': 1.0.8 - abort-controller-x: 0.5.0 - graphql: 16.13.1 - graphql-request: 6.1.0(graphql@16.13.1) - long: 5.3.2 - nice-grpc: 2.1.14 - nice-grpc-client-middleware-retry: 3.1.13 - nice-grpc-common: 2.0.2 - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - web-namespaces@2.0.1: {} web-streams-polyfill@3.3.3: {} @@ -40928,7 +42600,7 @@ snapshots: webpack-sources@3.3.4: {} - webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7): + webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -40952,7 +42624,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.17(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)) + terser-webpack-plugin: 5.3.17(@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)) watchpack: 2.5.1 webpack-sources: 3.3.4 transitivePeerDependencies: @@ -40960,7 +42632,7 @@ snapshots: - esbuild - uglify-js - webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7): + webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -40984,7 +42656,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.17(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)) + terser-webpack-plugin: 5.3.17(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) watchpack: 2.5.1 webpack-sources: 3.3.4 transitivePeerDependencies: @@ -41098,10 +42770,6 @@ snapshots: dependencies: string-width: 4.2.3 - widest-line@4.0.1: - dependencies: - string-width: 5.1.2 - wildcard@1.1.2: {} win-guid@0.2.1: {} @@ -41112,31 +42780,6 @@ snapshots: wordwrap@1.0.0: {} - workerd@1.20260811.1: - optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20260811.1 - '@cloudflare/workerd-darwin-arm64': 1.20260811.1 - '@cloudflare/workerd-linux-64': 1.20260811.1 - '@cloudflare/workerd-linux-arm64': 1.20260811.1 - '@cloudflare/workerd-windows-64': 1.20260811.1 - - wrangler@4.123.0(@cloudflare/workers-types@5.20260813.1)(bufferutil@4.1.0)(utf-8-validate@6.0.6): - dependencies: - '@cloudflare/kv-asset-handler': 0.5.0 - '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260811.1) - blake3-wasm: 2.1.5 - esbuild: 0.28.1 - miniflare: 5.20260811.1-alpha(bufferutil@4.1.0)(utf-8-validate@6.0.6) - path-to-regexp: 6.3.0 - unenv: 2.0.0-rc.24 - workerd: 1.20260811.1 - optionalDependencies: - '@cloudflare/workers-types': 5.20260813.1 - fsevents: 2.3.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -41182,17 +42825,12 @@ snapshots: 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: 6.0.6 - - ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.1.0 utf-8-validate: 5.0.10 - ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): + ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6): optionalDependencies: bufferutil: 4.1.0 utf-8-validate: 6.0.6 @@ -41240,6 +42878,8 @@ snapshots: yaml@2.8.3: {} + yaml@2.9.1: {} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 @@ -41283,19 +42923,6 @@ snapshots: yoctocolors@2.1.2: {} - youch-core@0.3.3: - dependencies: - '@poppinss/exception': 1.2.3 - error-stack-parser-es: 1.0.5 - - youch@4.1.0-beta.10: - dependencies: - '@poppinss/colors': 4.1.6 - '@poppinss/dumper': 0.6.5 - '@speed-highlight/core': 1.2.24 - cookie: 1.1.1 - youch-core: 0.3.3 - yup@1.7.1: dependencies: property-expr: 2.0.6 @@ -41303,18 +42930,28 @@ snapshots: toposort: 2.0.2 type-fest: 2.19.0 + zip-stream@7.0.5: + dependencies: + compress-commons: 7.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + zod-from-json-schema@0.0.5: dependencies: zod: 3.25.76 zod-from-json-schema@0.5.2: dependencies: - zod: 4.3.6 + zod: 4.6.5 zod-to-json-schema@3.25.1(zod@3.25.76): dependencies: zod: 3.25.76 + zod-to-json-schema@3.25.2(zod@3.25.76): + dependencies: + zod: 3.25.76 + zod-validation-error@4.0.2(zod@3.25.76): dependencies: zod: 3.25.76 @@ -41323,9 +42960,7 @@ snapshots: zod@3.25.76: {} - zod@4.3.6: {} - - zod@4.4.3: {} + 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)): optionalDependencies: diff --git a/scripts/branding-guard.ts b/scripts/branding-guard.ts index 05cda5cba2..68ef513649 100644 --- a/scripts/branding-guard.ts +++ b/scripts/branding-guard.ts @@ -215,7 +215,7 @@ console.log('=== Running Branding Guard Validations ===\n'); ]; // Directories we own and actively edit — leaks here are strict. const STRICT_PREFIXES = [ - 'apps/backend/src/', 'apps/frontend/src/', 'apps/crove-sso/', + 'apps/backend/src/', 'apps/frontend/src/', 'apps/sdk/', 'libraries/nestjs-libraries/src/', 'libraries/helpers/src/', 'libraries/react-shared-libraries/src/', diff --git a/scripts/build-all.ps1 b/scripts/build-all.ps1 index 138ecffc39..a831a1d0cc 100644 --- a/scripts/build-all.ps1 +++ b/scripts/build-all.ps1 @@ -7,7 +7,6 @@ - apps/frontend (App Dashboard Next.js) - apps/backend (API NestJS) - apps/orchestrator (Temporal Background Jobs) - - apps/crove-sso (Cloudflare Worker SSO Bridge) .EXAMPLE .\scripts\build-all.ps1 #> @@ -18,23 +17,18 @@ Write-Host "==========================================================" -Foregro Write-Host " CROVE MONOREPO - FULL BUILD & VALIDATION" -ForegroundColor Yellow Write-Host "==========================================================" -ForegroundColor Cyan -# 1. Build & Test SSO Worker -Write-Host "`n[1/4] Build & Test Cloudflare Worker SSO (@crove/sso)..." -ForegroundColor Green -pnpm --filter @crove/sso test -if ($LASTEXITCODE -ne 0) { Write-Error "SSO Test failed!"; exit 1 } - -# 2. Build Landing Page -Write-Host "`n[2/4] Build Landing Page (@crove/web)..." -ForegroundColor Green +# 1. Build Landing Page +Write-Host "`n[1/3] Build Landing Page (@crove/web)..." -ForegroundColor Green pnpm --filter @crove/web run build if ($LASTEXITCODE -ne 0) { Write-Error "Web Build failed!"; exit 1 } # 3. Prisma Generate -Write-Host "`n[3/4] Generate Prisma Client..." -ForegroundColor Green +Write-Host "`n[2/3] Generate Prisma Client..." -ForegroundColor Green pnpm run prisma-generate if ($LASTEXITCODE -ne 0) { Write-Error "Prisma generate failed!"; exit 1 } # 4. Build Core Apps -Write-Host "`n[4/4] Build Core Backend & Frontend..." -ForegroundColor Green +Write-Host "`n[3/3] Build Core Backend & Frontend..." -ForegroundColor Green pnpm run build if ($LASTEXITCODE -ne 0) { Write-Error "Core build failed!"; exit 1 } diff --git a/scripts/deploy-beta.ps1 b/scripts/deploy-beta.ps1 index ad1fbc19b3..c1a42d863f 100644 --- a/scripts/deploy-beta.ps1 +++ b/scripts/deploy-beta.ps1 @@ -3,9 +3,8 @@ Automated deployment pipeline for the Crove Beta environment (beta-post.crove.com). .DESCRIPTION Script workflow: - 1. Run SSO Worker tests (@crove/sso) and Branding Guard validation - 2. Deploy Cloudflare Worker Crove SSO for Beta (beta-sso.crove.com) - 3. Output Docker compose stack commands for GCP server + 1. Run Branding Guard validation + 2. Output Docker compose stack commands for GCP server .EXAMPLE .\scripts\deploy-beta.ps1 #> @@ -25,25 +24,18 @@ Write-Host "==========================================================" -Foregro Write-Host " CROVE BETA ENVIRONMENT - AUTOMATED DEPLOYMENT PIPELINE" -ForegroundColor Yellow Write-Host "==========================================================" -ForegroundColor Cyan -# 1. Run tests & Branding Guard +# 1. Branding Guard if (-not $SkipTests) { - Write-Host "`n[1/3] Running Vitest unit tests for @crove/sso..." -ForegroundColor Green - pnpm --filter @crove/sso test - if ($LASTEXITCODE -ne 0) { - Write-Error "SSO tests failed! Aborting deployment." - exit 1 - } - - Write-Host "`nChecking Branding Guard validation..." -ForegroundColor Green + Write-Host "`n[1/2] Checking Branding Guard validation..." -ForegroundColor Green pnpm dlx tsx scripts/branding-guard.ts if ($LASTEXITCODE -ne 0) { Write-Error "Branding Guard validation failed! Aborting deployment." exit 1 } - Write-Host "-> All tests and branding validation passed!" -ForegroundColor Green + Write-Host "-> Branding validation passed!" -ForegroundColor Green } else { - Write-Host "`n[1/3] Skipping tests (-SkipTests)." -ForegroundColor Yellow + Write-Host "`n[1/2] Skipping tests (-SkipTests)." -ForegroundColor Yellow } Write-Host "`nChecking Beta deployment contract..." -ForegroundColor Green @@ -53,18 +45,8 @@ if ($LASTEXITCODE -ne 0) { exit 1 } -# 2. Deploy Cloudflare Worker for Beta -Write-Host "`n[2/3] Deploying Cloudflare Worker Crove SSO (Beta)..." -ForegroundColor Green -pnpm --filter @crove/sso run deploy:beta - -if ($LASTEXITCODE -ne 0) { - Write-Error "Failed to deploy SSO Beta to Cloudflare." - exit 1 -} -Write-Host "-> SSO Beta Worker deployed successfully to https://beta-sso.crove.com" -ForegroundColor Green - -# 3. Docker Stack Beta deployment instructions -Write-Host "`n[3/3] Configure Docker Stack Beta on GCP Server..." -ForegroundColor Green +# 2. Docker Stack Beta deployment instructions +Write-Host "`n[2/2] Configure Docker Stack Beta on GCP Server..." -ForegroundColor Green Write-Host "Beta environment configuration file:" -ForegroundColor Cyan Write-Host " - scripts/crove-server.beta.env" -ForegroundColor White Write-Host " - scripts/docker-compose.beta.yaml" -ForegroundColor White @@ -75,5 +57,5 @@ Write-Host " docker compose -f scripts/docker-compose.beta.yaml up -d --no-deps Write-Host "`n==========================================================" -ForegroundColor Green Write-Host " BETA DEPLOYMENT READY!" -ForegroundColor Green Write-Host " - App Dashboard: https://beta-post.crove.com" -ForegroundColor Cyan -Write-Host " - SSO Endpoint: https://beta-sso.crove.com" -ForegroundColor Cyan +Write-Host " - SSO: via api.dos.me PKCE bridge (sso.crove.com worker removed)" -ForegroundColor Cyan Write-Host "==========================================================" -ForegroundColor Green diff --git a/scripts/deploy-prod.ps1 b/scripts/deploy-prod.ps1 index cb026a3c8a..8aaaac5ea7 100644 --- a/scripts/deploy-prod.ps1 +++ b/scripts/deploy-prod.ps1 @@ -3,9 +3,8 @@ Automated deployment pipeline for the Crove Production environment (crove.com & post.crove.com). .DESCRIPTION Script workflow: - 1. Comprehensive testing for SSO Worker and Branding Guard - 2. Deploy Cloudflare Worker Crove SSO for Production (sso.crove.com) - 3. Output Docker compose stack commands for production server + 1. Run Branding Guard validation + 2. Output Docker compose stack commands for production server .EXAMPLE .\scripts\deploy-prod.ps1 #> @@ -22,38 +21,21 @@ Write-Host "==========================================================" -Foregro Write-Host " CROVE PRODUCTION ENVIRONMENT - DEPLOYMENT PIPELINE" -ForegroundColor Yellow Write-Host "==========================================================" -ForegroundColor Cyan -# 1. Run tests & Branding Guard +# 1. Branding Guard if (-not $SkipTests) { - Write-Host "`n[1/3] Running Vitest unit tests for @crove/sso..." -ForegroundColor Green - pnpm --filter @crove/sso test - if ($LASTEXITCODE -ne 0) { - Write-Error "SSO tests failed! Aborting deployment." - exit 1 - } - - Write-Host "`nChecking Branding Guard validation..." -ForegroundColor Green + Write-Host "`n[1/2] Checking Branding Guard validation..." -ForegroundColor Green pnpm dlx tsx scripts/branding-guard.ts if ($LASTEXITCODE -ne 0) { Write-Error "Branding Guard validation failed! Aborting deployment." exit 1 } - Write-Host "-> All tests and branding validation passed!" -ForegroundColor Green + Write-Host "-> Branding validation passed!" -ForegroundColor Green } else { - Write-Host "`n[1/3] Skipping tests (-SkipTests)." -ForegroundColor Yellow -} - -# 2. Deploy Cloudflare Worker for Production -Write-Host "`n[2/3] Deploying Cloudflare Worker Crove SSO (Production)..." -ForegroundColor Green -pnpm --filter @crove/sso run deploy:prod - -if ($LASTEXITCODE -ne 0) { - Write-Error "Failed to deploy SSO Production to Cloudflare." - exit 1 + Write-Host "`n[1/2] Skipping tests (-SkipTests)." -ForegroundColor Yellow } -Write-Host "-> SSO Production Worker deployed successfully to https://sso.crove.com" -ForegroundColor Green -# 3. Docker Stack Production deployment instructions -Write-Host "`n[3/3] Configure Docker Stack Production on GCP Server..." -ForegroundColor Green +# 2. Docker Stack Production deployment instructions +Write-Host "`n[2/2] Configure Docker Stack Production on GCP Server..." -ForegroundColor Green Write-Host "Production environment configuration files:" -ForegroundColor Cyan Write-Host " - scripts/crove-server.env" -ForegroundColor White Write-Host " - scripts/docker-compose.prod.yaml" -ForegroundColor White @@ -65,5 +47,5 @@ Write-Host "`n==========================================================" -Foreg Write-Host " PRODUCTION DEPLOYMENT READY!" -ForegroundColor Green Write-Host " - Landing Page: https://crove.com (and https://www.crove.com)" -ForegroundColor Cyan Write-Host " - App Dashboard: https://post.crove.com" -ForegroundColor Cyan -Write-Host " - SSO Endpoint: https://sso.crove.com" -ForegroundColor Cyan +Write-Host " - SSO: via api.dos.me PKCE bridge (sso.crove.com worker removed)" -ForegroundColor Cyan Write-Host "==========================================================" -ForegroundColor Green diff --git a/scripts/deploy-sso.ps1 b/scripts/deploy-sso.ps1 deleted file mode 100644 index 822e63218a..0000000000 --- a/scripts/deploy-sso.ps1 +++ /dev/null @@ -1,98 +0,0 @@ -<# -.SYNOPSIS - Automated build, test and deployment for Cloudflare Worker Crove SSO (Beta & Prod). -.DESCRIPTION - Script workflow: - 1. Verify Node.js & pnpm environment - 2. Run SSO unit test suite (31/31 unit tests) - 3. Deploy worker to Cloudflare via Wrangler CLI for the specified environment -.PARAMETER Environment - Deployment target: 'beta' (default) or 'prod' -.EXAMPLE - .\scripts\deploy-sso.ps1 -Environment beta -.EXAMPLE - .\scripts\deploy-sso.ps1 -Environment prod -#> - -[CmdletBinding()] -param ( - [Parameter(Position = 0)] - [ValidateSet("beta", "prod")] - [string]$Environment = "beta", - - [Parameter()] - [string]$UpstreamClientId = "", - - [Parameter()] - [string]$UpstreamClientSecret = "", - - [Parameter()] - [string]$DownstreamClientId = "", - - [Parameter()] - [string]$DownstreamClientSecret = "" -) - -$ErrorActionPreference = "Stop" - -Write-Host "==========================================================" -ForegroundColor Cyan -Write-Host " CROVE SSO WORKER - AUTOMATED DEPLOYMENT ($($Environment.ToUpper()))" -ForegroundColor Yellow -Write-Host "==========================================================" -ForegroundColor Cyan - -# 1. Run SSO unit tests -Write-Host "`n[1/3] Running Vitest unit tests for @crove/sso..." -ForegroundColor Green -$testResult = pnpm --filter @crove/sso test -if ($LASTEXITCODE -ne 0) { - Write-Error "Tests failed! Aborting deployment." - exit 1 -} -Write-Host "-> All tests passed successfully!" -ForegroundColor Green - -# 2. Configure Secrets if provided -if ($UpstreamClientId -or $UpstreamClientSecret) { - Write-Host "`n[2/3] Configuring Cloudflare Secrets..." -ForegroundColor Green - $envFlag = if ($Environment -eq "beta") { "-e beta" } else { "" } - - if ($UpstreamClientId) { - Write-Host "-> Setting UPSTREAM_CLIENT_ID..." - $UpstreamClientId | pnpm --filter @crove/sso exec wrangler secret put UPSTREAM_CLIENT_ID $envFlag - } - if ($UpstreamClientSecret) { - Write-Host "-> Setting UPSTREAM_CLIENT_SECRET..." - $UpstreamClientSecret | pnpm --filter @crove/sso exec wrangler secret put UPSTREAM_CLIENT_SECRET $envFlag - } - if ($DownstreamClientId) { - Write-Host "-> Setting DOWNSTREAM_CLIENT_ID..." - $DownstreamClientId | pnpm --filter @crove/sso exec wrangler secret put DOWNSTREAM_CLIENT_ID $envFlag - } - if ($DownstreamClientSecret) { - Write-Host "-> Setting DOWNSTREAM_CLIENT_SECRET..." - $DownstreamClientSecret | pnpm --filter @crove/sso exec wrangler secret put DOWNSTREAM_CLIENT_SECRET $envFlag - } -} else { - Write-Host "`n[2/3] Skipping secrets upload (using pre-configured dashboard/env secrets)." -ForegroundColor Gray -} - -# 3. Deploy Worker -Write-Host "`n[3/3] Deploying Cloudflare Worker ($Environment)..." -ForegroundColor Green -if ($Environment -eq "beta") { - pnpm --filter @crove/sso run deploy:beta -} else { - pnpm --filter @crove/sso run deploy:prod -} - -if ($LASTEXITCODE -eq 0) { - Write-Host "`n==========================================================" -ForegroundColor Green - Write-Host " DEPLOYMENT SUCCEEDED FOR $($Environment.ToUpper())!" -ForegroundColor Green - if ($Environment -eq "beta") { - Write-Host " SSO Endpoint: https://beta-sso.crove.com" -ForegroundColor Cyan - Write-Host " App Callback: https://beta-post.crove.com/settings" -ForegroundColor Cyan - } else { - Write-Host " SSO Endpoint: https://sso.crove.com" -ForegroundColor Cyan - Write-Host " App Callback: https://post.crove.com/settings" -ForegroundColor Cyan - } - Write-Host "==========================================================" -ForegroundColor Green -} else { - Write-Error "Deployment failed. Please check Cloudflare authentication or API token." - exit 1 -} diff --git a/scripts/dev.ps1 b/scripts/dev.ps1 index dd5321af0d..0c966b70cc 100644 --- a/scripts/dev.ps1 +++ b/scripts/dev.ps1 @@ -7,7 +7,7 @@ - App Frontend Dashboard (Port 4200) - Backend API & Orchestrator (Port 3000 internal / background) .PARAMETER Mode - 'all' (Full stack: Web + App + Backend), 'web' (Landing Page only), 'app' (App Frontend only), 'sso' (SSO Worker only) + 'all' (Full stack: Web + App + Backend), 'web' (Landing Page only), 'app' (App Frontend only) .EXAMPLE .\scripts\dev.ps1 -Mode all .EXAMPLE @@ -17,7 +17,7 @@ [CmdletBinding()] param ( [Parameter(Position = 0)] - [ValidateSet("all", "web", "app", "sso")] + [ValidateSet("all", "web", "app")] [string]$Mode = "all" ) @@ -34,10 +34,6 @@ switch ($Mode) { Write-Host "Starting App Frontend (apps/frontend)..." -ForegroundColor Green pnpm --filter @crove/frontend run dev } - "sso" { - Write-Host "Starting local SSO Worker..." -ForegroundColor Green - pnpm --filter @crove/sso run dev - } "all" { Write-Host "Starting Landing Page, Frontend & Backend in parallel..." -ForegroundColor Green pnpm run dev