From 34769a5d58e998f32f10c9bbba0238ce958a7f61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Gerhard=20Lindesva=CC=88rd?= Date: Tue, 15 Apr 2025 14:30:21 +0200 Subject: [PATCH] feat(ai): add ai chat to dashboard --- apps/api/package.json | 6 +- apps/api/src/controllers/ai.controller.ts | 134 ++ apps/api/src/index.ts | 26 +- apps/api/src/routes/ai.router.ts | 28 + apps/api/src/utils/ai-tools.ts | 475 ++++ apps/api/src/utils/ai.ts | 115 + apps/api/src/utils/errors.ts | 24 + apps/api/src/utils/rate-limiter.ts | 12 +- apps/dashboard/package.json | 14 +- .../[projectId]/chat/page.tsx | 31 + .../[projectId]/layout-content.tsx | 10 +- .../[projectId]/layout-menu.tsx | 16 +- .../[projectId]/reports/report-editor.tsx | 18 +- apps/dashboard/src/app/layout.tsx | 1 + apps/dashboard/src/app/manifest.ts | 2 + apps/dashboard/src/app/providers.tsx | 44 +- .../src/components/chat/chat-form.tsx | 70 + .../src/components/chat/chat-message.tsx | 144 ++ .../src/components/chat/chat-messages.tsx | 84 + .../src/components/chat/chat-report.tsx | 90 + apps/dashboard/src/components/chat/chat.tsx | 76 + apps/dashboard/src/components/markdown.tsx | 26 + .../src/components/report-chart/context.tsx | 1 + .../report-chart/conversion/chart.tsx | 6 +- .../src/components/report-chart/index.tsx | 9 +- .../src/components/report/ReportChartType.tsx | 18 +- .../src/components/report/ReportInterval.tsx | 122 +- apps/dashboard/src/components/syntax.tsx | 8 +- .../src/components/ui/scroll-area.tsx | 14 +- apps/dashboard/src/hooks/use-scroll-anchor.ts | 82 + apps/dashboard/src/modals/SaveReport.tsx | 33 +- apps/dashboard/src/styles/globals.css | 2 +- apps/public/package.json | 2 +- package.json | 3 - packages/cli/package.json | 2 +- packages/db/package.json | 2 +- .../20250409203918_add_chat/migration.sql | 13 + packages/db/prisma/schema.prisma | 12 + packages/email/package.json | 2 +- packages/trpc/package.json | 2 +- packages/trpc/src/routers/chart.ts | 52 +- packages/validation/package.json | 2 +- packages/validation/src/index.ts | 160 +- packages/validation/src/types.validation.ts | 2 + pnpm-lock.yaml | 2068 +++++++---------- pnpm-workspace.yaml | 10 +- 46 files changed, 2624 insertions(+), 1449 deletions(-) create mode 100644 apps/api/src/controllers/ai.controller.ts create mode 100644 apps/api/src/routes/ai.router.ts create mode 100644 apps/api/src/utils/ai-tools.ts create mode 100644 apps/api/src/utils/ai.ts create mode 100644 apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/chat/page.tsx create mode 100644 apps/dashboard/src/components/chat/chat-form.tsx create mode 100644 apps/dashboard/src/components/chat/chat-message.tsx create mode 100644 apps/dashboard/src/components/chat/chat-messages.tsx create mode 100644 apps/dashboard/src/components/chat/chat-report.tsx create mode 100644 apps/dashboard/src/components/chat/chat.tsx create mode 100644 apps/dashboard/src/components/markdown.tsx create mode 100644 apps/dashboard/src/hooks/use-scroll-anchor.ts create mode 100644 packages/db/prisma/migrations/20250409203918_add_chat/migration.sql diff --git a/apps/api/package.json b/apps/api/package.json index bcd10ea8..d56abc79 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -11,6 +11,8 @@ "typecheck": "tsc --noEmit" }, "dependencies": { + "@ai-sdk/anthropic": "^1.2.10", + "@ai-sdk/openai": "^1.3.12", "@fastify/compress": "^8.0.1", "@fastify/cookie": "^11.0.2", "@fastify/cors": "^11.0.0", @@ -19,6 +21,7 @@ "@node-rs/argon2": "^2.0.2", "@openpanel/auth": "workspace:^", "@openpanel/common": "workspace:*", + "@openpanel/constants": "workspace:*", "@openpanel/db": "workspace:*", "@openpanel/integrations": "workspace:^", "@openpanel/json": "workspace:*", @@ -29,6 +32,7 @@ "@openpanel/trpc": "workspace:*", "@openpanel/validation": "workspace:*", "@trpc/server": "^10.45.2", + "ai": "^4.2.10", "bcrypt": "^5.1.1", "fast-json-stable-hash": "^1.0.3", "fastify": "^5.2.1", @@ -45,7 +49,7 @@ "svix": "^1.24.0", "url-metadata": "^4.1.1", "uuid": "^9.0.1", - "zod": "^3.22.4" + "zod": "catalog:" }, "devDependencies": { "@faker-js/faker": "^9.0.1", diff --git a/apps/api/src/controllers/ai.controller.ts b/apps/api/src/controllers/ai.controller.ts new file mode 100644 index 00000000..20631af6 --- /dev/null +++ b/apps/api/src/controllers/ai.controller.ts @@ -0,0 +1,134 @@ +import { getChatModel, getChatSystemPrompt } from '@/utils/ai'; +import { + getAllEventNames, + getConversionReport, + getFunnelReport, + getProfile, + getProfiles, + getReport, +} from '@/utils/ai-tools'; +import { HttpError } from '@/utils/errors'; +import { db, getOrganizationByProjectIdCached } from '@openpanel/db'; +import { getProjectAccessCached } from '@openpanel/trpc/src/access'; +import { type Message, appendResponseMessages, streamText } from 'ai'; +import type { FastifyReply, FastifyRequest } from 'fastify'; + +export async function chat( + request: FastifyRequest<{ + Querystring: { + projectId: string; + }; + Body: { + messages: Message[]; + }; + }>, + reply: FastifyReply, +) { + const { session } = request.session; + const { messages } = request.body; + const { projectId } = request.query; + + if (!session?.userId) { + return reply.status(401).send('Unauthorized'); + } + + if (!projectId) { + return reply.status(400).send('Missing projectId'); + } + + const organization = await getOrganizationByProjectIdCached(projectId); + const access = await getProjectAccessCached({ + projectId, + userId: session.userId, + }); + + if (!organization) { + throw new HttpError('Organization not found', { + status: 404, + }); + } + + if (!access) { + throw new HttpError('You are not allowed to access this project', { + status: 403, + }); + } + + if (organization?.isExceeded) { + throw new HttpError('Organization has exceeded its limits', { + status: 403, + }); + } + + if (organization?.isCanceled) { + throw new HttpError('Organization has been canceled', { + status: 403, + }); + } + + const systemPrompt = getChatSystemPrompt({ + projectId, + }); + + try { + const result = streamText({ + model: getChatModel(), + messages: messages.slice(-4), + maxSteps: 2, + tools: { + getAllEventNames: getAllEventNames({ + projectId, + }), + getReport: getReport({ + projectId, + }), + getConversionReport: getConversionReport({ + projectId, + }), + getFunnelReport: getFunnelReport({ + projectId, + }), + getProfiles: getProfiles({ + projectId, + }), + getProfile: getProfile({ + projectId, + }), + }, + toolCallStreaming: false, + system: systemPrompt, + onFinish: async ({ response, usage }) => { + request.log.info('chat usage', { usage }); + const messagesToSave = appendResponseMessages({ + messages, + responseMessages: response.messages, + }); + + await db.chat.deleteMany({ + where: { + projectId, + }, + }); + + await db.chat.create({ + data: { + messages: messagesToSave.slice(-10), + projectId, + }, + }); + }, + onError: async (error) => { + request.log.error('chat error', { error }); + }, + }); + + reply.header('X-Vercel-AI-Data-Stream', 'v1'); + reply.header('Content-Type', 'text/plain; charset=utf-8'); + + return reply.send(result.toDataStream()); + } catch (error) { + throw new HttpError('Error during stream processing', { + error, + }); + } +} diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 7c2a93fe..e180edbc 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -28,6 +28,7 @@ import { ipHook } from './hooks/ip.hook'; import { requestIdHook } from './hooks/request-id.hook'; import { requestLoggingHook } from './hooks/request-logging.hook'; import { timestampHook } from './hooks/timestamp.hook'; +import aiRouter from './routes/ai.router'; import eventRouter from './routes/event.router'; import exportRouter from './routes/export.router'; import importRouter from './routes/import.router'; @@ -37,6 +38,7 @@ import oauthRouter from './routes/oauth-callback.router'; import profileRouter from './routes/profile.router'; import trackRouter from './routes/track.router'; import webhookRouter from './routes/webhook.router'; +import { HttpError } from './utils/errors'; import { logger } from './utils/logger'; sourceMapSupport.install(); @@ -74,7 +76,14 @@ const startServer = async () => { callback: (error: Error | null, options: FastifyCorsOptions) => void, ) => { // TODO: set prefix on dashboard routes - const corsPaths = ['/trpc', '/live', '/webhook', '/oauth', '/misc']; + const corsPaths = [ + '/trpc', + '/live', + '/webhook', + '/oauth', + '/misc', + '/ai', + ]; const isPrivatePath = corsPaths.some((path) => req.url.startsWith(path), @@ -150,6 +159,7 @@ const startServer = async () => { instance.register(webhookRouter, { prefix: '/webhook' }); instance.register(oauthRouter, { prefix: '/oauth' }); instance.register(miscRouter, { prefix: '/misc' }); + instance.register(aiRouter, { prefix: '/ai' }); }); // Public API @@ -168,7 +178,19 @@ const startServer = async () => { }); fastify.setErrorHandler((error, request, reply) => { - if (error.statusCode === 429) { + if (error instanceof HttpError) { + request.log.error(`${error.message}`, error); + if (process.env.NODE_ENV === 'production' && error.status === 500) { + request.log.error('request error', { error }); + reply.status(500).send('Internal server error'); + } else { + reply.status(error.status).send({ + status: error.status, + error: error.error, + message: error.message, + }); + } + } else if (error.statusCode === 429) { reply.status(429).send({ status: 429, error: 'Too Many Requests', diff --git a/apps/api/src/routes/ai.router.ts b/apps/api/src/routes/ai.router.ts new file mode 100644 index 00000000..e396a2cf --- /dev/null +++ b/apps/api/src/routes/ai.router.ts @@ -0,0 +1,28 @@ +import * as controller from '@/controllers/ai.controller'; +import { activateRateLimiter } from '@/utils/rate-limiter'; +import type { FastifyPluginCallback, FastifyRequest } from 'fastify'; + +const aiRouter: FastifyPluginCallback = async (fastify) => { + await activateRateLimiter< + FastifyRequest<{ + Querystring: { + projectId: string; + }; + }> + >({ + fastify, + max: process.env.NODE_ENV === 'production' ? 20 : 100, + timeWindow: '300 seconds', + keyGenerator: (req) => { + return req.query.projectId; + }, + }); + + fastify.route({ + method: 'POST', + url: '/chat', + handler: controller.chat, + }); +}; + +export default aiRouter; diff --git a/apps/api/src/utils/ai-tools.ts b/apps/api/src/utils/ai-tools.ts new file mode 100644 index 00000000..ffe91e1c --- /dev/null +++ b/apps/api/src/utils/ai-tools.ts @@ -0,0 +1,475 @@ +import { chartTypes } from '@openpanel/constants'; +import type { IClickhouseSession } from '@openpanel/db'; +import { + type IClickhouseEvent, + type IClickhouseProfile, + TABLE_NAMES, + ch, + clix, +} from '@openpanel/db'; +import { getCache } from '@openpanel/redis'; +import { getChart } from '@openpanel/trpc/src/routers/chart.helpers'; +import { zChartInputAI } from '@openpanel/validation'; +import { tool } from 'ai'; +import { z } from 'zod'; + +export function getReport({ + projectId, +}: { + projectId: string; +}) { + return tool({ + description: `Generate a report (a chart) for + - ${chartTypes.area} + - ${chartTypes.linear} + - ${chartTypes.pie} + - ${chartTypes.histogram} + - ${chartTypes.metric} + - ${chartTypes.bar} +`, + parameters: zChartInputAI, + execute: async (report) => { + return { + type: 'report', + report: { + ...report, + projectId, + }, + }; + // try { + // const data = await getChart({ + // ...report, + // projectId, + // }); + + // return { + // type: 'report', + // data: `Avg: ${data.metrics.average}, Min: ${data.metrics.min}, Max: ${data.metrics.max}, Sum: ${data.metrics.sum} + // X-Axis: ${data.series[0]?.data.map((i) => i.date).join(',')} + // Series: + // ${data.series + // .slice(0, 5) + // .map((item) => { + // return `- ${item.names.join(' ')} | Sum: ${item.metrics.sum} | Avg: ${item.metrics.average} | Min: ${item.metrics.min} | Max: ${item.metrics.max} | Data: ${item.data.map((i) => i.count).join(',')}`; + // }) + // .join('\n')} + // `, + // report, + // }; + // } catch (error) { + // return { + // error: 'Failed to generate report', + // }; + // } + }, + }); +} +export function getConversionReport({ + projectId, +}: { + projectId: string; +}) { + return tool({ + description: + 'Generate a report (a chart) for conversions between two actions a unique user took.', + parameters: zChartInputAI, + execute: async (report) => { + return { + type: 'report', + // data: await conversionService.getConversion(report), + report: { + ...report, + projectId, + chartType: 'conversion', + }, + }; + }, + }); +} +export function getFunnelReport({ + projectId, +}: { + projectId: string; +}) { + return tool({ + description: + 'Generate a report (a chart) for funnel between two or more actions a unique user (session_id or profile_id) took.', + parameters: zChartInputAI, + execute: async (report) => { + return { + type: 'report', + // data: await funnelService.getFunnel(report), + report: { + ...report, + projectId, + chartType: 'funnel', + }, + }; + }, + }); +} + +export function getProfiles({ + projectId, +}: { + projectId: string; +}) { + return tool({ + description: 'Get profiles', + parameters: z.object({ + projectId: z.string(), + limit: z.number().optional(), + email: z.string().optional(), + firstName: z.string().optional(), + lastName: z.string().optional(), + country: z.string().describe('ISO 3166-1 alpha-2').optional(), + city: z.string().optional(), + region: z.string().optional(), + device: z.string().optional(), + browser: z.string().optional(), + }), + execute: async (input) => { + const builder = clix(ch) + .select([ + 'id', + 'email', + 'first_name', + 'last_name', + 'properties', + ]) + .from(TABLE_NAMES.profiles) + .where('project_id', '=', projectId); + + if (input.email) { + builder.where('email', 'LIKE', `%${input.email}%`); + } + + if (input.firstName) { + builder.where('first_name', 'LIKE', `%${input.firstName}%`); + } + + if (input.lastName) { + builder.where('last_name', 'LIKE', `%${input.lastName}%`); + } + + if (input.country) { + builder.where(`properties['country']`, '=', input.country); + } + + if (input.city) { + builder.where(`properties['city']`, '=', input.city); + } + + if (input.region) { + builder.where(`properties['region']`, '=', input.region); + } + + if (input.device) { + builder.where(`properties['device']`, '=', input.device); + } + + if (input.browser) { + builder.where(`properties['browser']`, '=', input.browser); + } + + const profiles = await builder.limit(input.limit ?? 5).execute(); + + return profiles; + }, + }); +} + +export function getProfile({ + projectId, +}: { + projectId: string; +}) { + return tool({ + description: 'Get a specific profile', + parameters: z.object({ + projectId: z.string(), + email: z.string().optional(), + firstName: z.string().optional(), + lastName: z.string().optional(), + country: z.string().describe('ISO 3166-1 alpha-2').optional(), + city: z.string().optional(), + region: z.string().optional(), + device: z.string().optional(), + browser: z.string().optional(), + }), + execute: async (input) => { + const builder = clix(ch) + .select([ + 'id', + 'email', + 'first_name', + 'last_name', + 'properties', + ]) + .from(TABLE_NAMES.profiles) + .where('project_id', '=', projectId); + + if (input.email) { + builder.where('email', 'LIKE', `%${input.email}%`); + } + + if (input.firstName) { + builder.where('first_name', 'LIKE', `%${input.firstName}%`); + } + + if (input.lastName) { + builder.where('last_name', 'LIKE', `%${input.lastName}%`); + } + + if (input.country) { + builder.where(`properties['country']`, '=', input.country); + } + + if (input.city) { + builder.where(`properties['city']`, '=', input.city); + } + + if (input.region) { + builder.where(`properties['region']`, '=', input.region); + } + + if (input.device) { + builder.where(`properties['device']`, '=', input.device); + } + + if (input.browser) { + builder.where(`properties['browser']`, '=', input.browser); + } + + const profiles = await builder.limit(1).execute(); + + const profile = profiles[0]; + if (!profile) { + return { + error: 'Profile not found', + }; + } + + const events = await clix(ch) + .select([]) + .from(TABLE_NAMES.events) + .where('project_id', '=', input.projectId) + .where('profile_id', '=', profile.id) + .limit(5) + .orderBy('created_at', 'DESC') + .execute(); + + return { + profile, + events, + }; + }, + }); +} + +export function getEvents({ + projectId, +}: { + projectId: string; +}) { + return tool({ + description: 'Get events for a project or specific profile', + parameters: z.object({ + projectId: z.string(), + profileId: z.string().optional(), + take: z.number().optional().default(10), + eventNames: z.array(z.string()).optional(), + referrer: z.string().optional(), + referrerName: z.string().optional(), + referrerType: z.string().optional(), + device: z.string().optional(), + country: z.string().optional(), + city: z.string().optional(), + os: z.string().optional(), + browser: z.string().optional(), + properties: z.record(z.string(), z.string()).optional(), + startDate: z.string().optional().describe('ISO date string'), + endDate: z.string().optional().describe('ISO date string'), + }), + execute: async (input) => { + const builder = clix(ch) + .select([]) + .from(TABLE_NAMES.events) + .where('project_id', '=', projectId); + + if (input.profileId) { + builder.where('profile_id', '=', input.profileId); + } + + if (input.eventNames) { + builder.where('name', 'IN', input.eventNames); + } + + if (input.referrer) { + builder.where('referrer', '=', input.referrer); + } + + if (input.referrerName) { + builder.where('referrer_name', '=', input.referrerName); + } + + if (input.referrerType) { + builder.where('referrer_type', '=', input.referrerType); + } + + if (input.device) { + builder.where('device', '=', input.device); + } + + if (input.country) { + builder.where('country', '=', input.country); + } + + if (input.city) { + builder.where('city', '=', input.city); + } + + if (input.os) { + builder.where('os', '=', input.os); + } + + if (input.browser) { + builder.where('browser', '=', input.browser); + } + + if (input.properties) { + for (const [key, value] of Object.entries(input.properties)) { + builder.where(`properties['${key}']`, '=', value); + } + } + + if (input.startDate && input.endDate) { + builder.where('created_at', 'BETWEEN', [ + clix.datetime(input.startDate), + clix.datetime(input.endDate), + ]); + } else { + builder.where('created_at', 'BETWEEN', [ + clix.datetime(new Date(Date.now() - 1000 * 60 * 60 * 24 * 7)), + clix.datetime(new Date()), + ]); + } + + return await builder.limit(input.take).execute(); + }, + }); +} + +export function getSessions({ + projectId, +}: { + projectId: string; +}) { + return tool({ + description: 'Get sessions for a project or specific profile', + parameters: z.object({ + projectId: z.string(), + profileId: z.string().optional(), + take: z.number().optional().default(10), + referrer: z.string().optional(), + referrerName: z.string().optional(), + referrerType: z.string().optional(), + device: z.string().optional(), + country: z.string().optional(), + city: z.string().optional(), + os: z.string().optional(), + browser: z.string().optional(), + properties: z.record(z.string(), z.string()).optional(), + startDate: z.string().optional().describe('ISO date string'), + endDate: z.string().optional().describe('ISO date string'), + }), + execute: async (input) => { + const builder = clix(ch) + .select([]) + .from(TABLE_NAMES.sessions) + .where('project_id', '=', projectId) + .where('sign', '=', 1); + + if (input.profileId) { + builder.where('profile_id', '=', input.profileId); + } + + if (input.referrer) { + builder.where('referrer', '=', input.referrer); + } + + if (input.referrerName) { + builder.where('referrer_name', '=', input.referrerName); + } + + if (input.referrerType) { + builder.where('referrer_type', '=', input.referrerType); + } + + if (input.device) { + builder.where('device', '=', input.device); + } + + if (input.country) { + builder.where('country', '=', input.country); + } + + if (input.city) { + builder.where('city', '=', input.city); + } + + if (input.os) { + builder.where('os', '=', input.os); + } + + if (input.browser) { + builder.where('browser', '=', input.browser); + } + + if (input.properties) { + for (const [key, value] of Object.entries(input.properties)) { + builder.where(`properties['${key}']`, '=', value); + } + } + + if (input.startDate && input.endDate) { + builder.where('created_at', 'BETWEEN', [ + clix.datetime(input.startDate), + clix.datetime(input.endDate), + ]); + } else { + builder.where('created_at', 'BETWEEN', [ + clix.datetime(new Date(Date.now() - 1000 * 60 * 60 * 24 * 7)), + clix.datetime(new Date()), + ]); + } + + return await builder.limit(input.take).execute(); + }, + }); +} + +export function getAllEventNames({ + projectId, +}: { + projectId: string; +}) { + return tool({ + description: 'Get the top 50 event names in a comma separated list', + parameters: z.object({}), + execute: async () => { + return getCache(`top-event-names:${projectId}`, 60 * 10, async () => { + const events = await clix(ch) + .select(['name', 'count() as count']) + .from(TABLE_NAMES.event_names_mv) + .where('project_id', '=', projectId) + .groupBy(['name']) + .orderBy('count', 'DESC') + .limit(50) + .execute(); + + return events.map((event) => event.name).join(','); + }); + }, + }); +} diff --git a/apps/api/src/utils/ai.ts b/apps/api/src/utils/ai.ts new file mode 100644 index 00000000..0fcf69de --- /dev/null +++ b/apps/api/src/utils/ai.ts @@ -0,0 +1,115 @@ +import { anthropic } from '@ai-sdk/anthropic'; +import { openai } from '@ai-sdk/openai'; +import { chartTypes, operators, timeWindows } from '@openpanel/constants'; +import { mapKeys } from '@openpanel/validation'; + +export const getChatModel = () => { + switch (process.env.AI_MODEL) { + case 'gpt-4o': + return openai('gpt-4o'); + case 'claude-3-5': + return anthropic('claude-3-5-haiku-latest'); + default: + return openai('gpt-4.1-mini'); + } +}; + +export const getChatSystemPrompt = ({ + projectId, +}: { + projectId: string; +}) => { + return `You're an product and web analytics expert. Don't generate more than the user asks for. Follow all rules listed below! +## General: +- projectId: \`${projectId}\` +- Do not hallucinate, if you can't make a report based on the user's request, just say so. +- Today is ${new Date().toISOString()} +- \`range\` should always be \`custom\` + - if range is \`custom\`, make sure to have \`startDate\` and \`endDate\` +- Available intervals: ${Object.values(timeWindows) + .map((t) => t.key) + .join(', ')} +- Try to figure out a time window, ${Object.values(timeWindows) + .map((t) => t.key) + .join(', ')}. If no match always use \`custom\` with a start and end date. +- Pick corresponding chartType from \`${Object.keys(chartTypes).join(', ')}\`, match with your best effort. +- Always add a name to the report. +- Never do a summary! + +### Formatting +- Never generate images +- If you use katex, please wrap the equation in $$ +- Use tables when showing lists of data. + +### Events +- Tool: \`getAllEventNames\`, use this tool *before* calling any other tool if the user's request mentions an event but you are unsure of the exact event name stored in the system. Only call this once! +- \`screen_view\` is a page view event +- If you see any paths you should pick \`screen_view\` event and use a \`path\` filter +- To find referrers you can use \`referrer\`, \`referrer_name\` and \`referrer_type\` columns +- Use unique IDs for each event and each filter + +### Filters +- If you see a '*' in the filters value, depending on where it is you can split it up and do 'startsWith' together with 'endsWith'. Eg: '/path/*' -> 'path startsWith /path/', or '*/path' -> 'path endsWith /path/', or '/path/*/something' -> 'path startsWith /path/ and endsWith /something' +- If user asks for several events you can use this tool once (with all events) + - Example: path is /path/*/something \`{"id":"1","name":"screen_view","displayName":"Path is something","segment":"user","filters":[{"id":"1","name":"path","operator":"startsWith","value":["/path/"]},{"id":"1","name":"path","operator":"endsWith","value":["/something"]}]}\` +- Other examples for filters: + - Available operators: ${mapKeys(operators).join(', ')} + - {"id":"1","name":"path","operator":"endsWith","value":["/foo", "/bar"]} + - {"id":"1","name":"path","operator":"isNot","value":["/","/a","/b"]} + - {"id":"1","name":"path","operator":"contains","value":["nuke"]} + - {"id":"1","name":"path","operator":"regex","value":["/onboarding/.+/verify/?"]} + - {"id":"1","name":"path","operator":"isNull","value":[]} + +## Conversion Report + +Tool: \`getConversionReport\` +Rules: +- Use this when ever a user wants any conversion rate over time. +- Needs two events + +## Funnel Report + +Tool: \`getFunnelReport\` +Rules: +- Use this when ever a user wants to see a funnel between two or more events. +- Needs two or more events + +## Other reports + +Tool: \`getReport\` +Rules: +- Use this when ever a user wants any other report than a conversion, funnel or retention. + +### Examples + +#### Active users the last 30min +\`\`\` +{"events":[{"id":"1","name":"*","displayName":"Active users","segment":"user","filters":[{"id":"1","name":"name","operator":"is","value":["screen_view","session_start"]}]}],"breakdowns":[]} +\`\`\` + +#### How to get most events with breakdown by title +\`\`\` +{"events":[{"id":"1","name":"screen_view","segment":"event","filters":[{"id":"1","name":"path","operator":"is","value":["Article"]}]}],"breakdowns":[{"id":"1","name":"properties.params.title"}]} +\`\`\` + +#### Get popular referrers +\`\`\` +{"events":[{"id":"1","name":"session_start","segment":"event","filters":[]}],"breakdowns":[{"id":"1","name":"referrer_name"}]} +\`\`\` + +#### Popular screen views +\`\`\` +{"chartType":"bar","events":[{"id":"1","name":"screen_view","segment":"event","filters":[]}],"breakdowns":[{"id":"1","name":"path"}]} +\`\`\` + +#### Popular screen views from X,Y,Z referrers +\`\`\` +{"chartType":"bar","events":[{"id":"1","name":"screen_view","segment":"event","filters":[{"id":"1","name":"referrer_name","operator":"is","value":["Google","Bing","Yahoo!"]}]}],"breakdowns":[{"id":"1","name":"path"}]} +\`\`\` + +#### Bounce rate (use session_end together with formula) +\`\`\` +{"chartType":"linear","formula":"B/A*100","events":[{"id":"1","name":"session_end","segment":"event","filters":[]},{"id":"2","name":"session_end","segment":"event","filters":[{"id":"3","name":"properties.__bounce","operator":"is","value":["true"]}]}],"breakdowns":[]} +\`\`\` +`; +}; diff --git a/apps/api/src/utils/errors.ts b/apps/api/src/utils/errors.ts index 1f6ce8ac..193a9611 100644 --- a/apps/api/src/utils/errors.ts +++ b/apps/api/src/utils/errors.ts @@ -13,3 +13,27 @@ export class LogError extends Error { Object.setPrototypeOf(this, new.target.prototype); } } + +export class HttpError extends Error { + public readonly status: number; + public readonly fingerprint?: string; + public readonly extra?: Record; + public readonly error?: Error | unknown; + constructor( + message: string, + options?: { + status?: number; + fingerprint?: string; + extra?: Record; + error?: Error | unknown; + }, + ) { + super(message); + this.name = 'HttpError'; + this.status = options?.status ?? 500; + this.fingerprint = options?.fingerprint; + this.extra = options?.extra; + this.error = options?.error; + Object.setPrototypeOf(this, new.target.prototype); + } +} diff --git a/apps/api/src/utils/rate-limiter.ts b/apps/api/src/utils/rate-limiter.ts index 8ab3132c..f0cff50b 100644 --- a/apps/api/src/utils/rate-limiter.ts +++ b/apps/api/src/utils/rate-limiter.ts @@ -1,14 +1,16 @@ import { getRedisCache } from '@openpanel/redis'; -import type { FastifyInstance } from 'fastify'; +import type { FastifyInstance, FastifyRequest } from 'fastify'; -export async function activateRateLimiter({ +export async function activateRateLimiter({ fastify, max, timeWindow, + keyGenerator, }: { fastify: FastifyInstance; max: number; timeWindow?: string; + keyGenerator?: (req: T) => string | undefined; }) { await fastify.register(import('@fastify/rate-limit'), { max, @@ -22,6 +24,12 @@ export async function activateRateLimiter({ }, redis: getRedisCache(), keyGenerator(req) { + if (keyGenerator) { + const key = keyGenerator(req as T); + if (key) { + return key; + } + } return (req.headers['openpanel-client-id'] || req.headers['x-real-ip'] || req.headers['x-client-ip'] || diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index ab79f601..91c60e36 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -6,11 +6,12 @@ "dev": "rm -rf .next && pnpm with-env next dev", "testing": "pnpm dev", "build": "pnpm with-env next build", - "start": "next start", + "start": "pnpm with-env next start", "typecheck": "tsc --noEmit", "with-env": "dotenv -e ../../.env -c --" }, "dependencies": { + "@ai-sdk/react": "^1.2.5", "@clickhouse/client": "^1.2.0", "@hookform/resolvers": "^3.3.4", "@hyperdx/node-opentelemetry": "^0.8.1", @@ -57,6 +58,7 @@ "@trpc/react-query": "^10.45.2", "@trpc/server": "^10.45.2", "@types/d3": "^7.4.3", + "ai": "^4.2.10", "bcrypt": "^5.1.1", "bind-event-listener": "^3.0.0", "class-variance-authority": "^0.7.0", @@ -71,6 +73,7 @@ "hamburger-react": "^2.5.0", "input-otp": "^1.2.4", "javascript-time-ago": "^2.5.9", + "katex": "^0.16.21", "lodash.debounce": "^4.0.8", "lodash.isequal": "^4.5.0", "lodash.throttle": "^4.1.1", @@ -95,6 +98,7 @@ "react-dom": "18.2.0", "react-hook-form": "^7.50.1", "react-in-viewport": "1.0.0-alpha.30", + "react-markdown": "^10.1.0", "react-redux": "^8.1.3", "react-responsive": "^9.0.2", "react-simple-maps": "3.0.0", @@ -103,6 +107,12 @@ "react-use-websocket": "^4.7.0", "react-virtualized-auto-sizer": "^1.0.22", "recharts": "^2.12.0", + "rehype-katex": "^7.0.1", + "remark-gfm": "^4.0.1", + "remark-highlight": "^0.1.1", + "remark-math": "^6.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", "short-unique-id": "^5.0.3", "slugify": "^1.6.6", "sonner": "^1.4.0", @@ -111,7 +121,7 @@ "tailwind-merge": "^1.14.0", "tailwindcss-animate": "^1.0.7", "usehooks-ts": "^2.14.0", - "zod": "^3.22.4" + "zod": "catalog:" }, "devDependencies": { "@openpanel/payments": "workspace:*", diff --git a/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/chat/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/chat/page.tsx new file mode 100644 index 00000000..729ef1cc --- /dev/null +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/chat/page.tsx @@ -0,0 +1,31 @@ +import Chat from '@/components/chat/chat'; +import { db, getOrganizationBySlug } from '@openpanel/db'; +import type { UIMessage } from 'ai'; + +export default async function ChatPage({ + params, +}: { + params: { organizationSlug: string; projectId: string }; +}) { + const { projectId } = await params; + const [organization, chat] = await Promise.all([ + getOrganizationBySlug(params.organizationSlug), + db.chat.findFirst({ + where: { + projectId, + }, + orderBy: { + createdAt: 'desc', + }, + }), + ]); + + const messages = ((chat?.messages as UIMessage[]) || []).slice(-10); + return ( + + ); +} diff --git a/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-content.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-content.tsx index 2f61ba46..dff7f706 100644 --- a/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-content.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-content.tsx @@ -1,5 +1,6 @@ 'use client'; +import { cn } from '@/utils/cn'; import { useSelectedLayoutSegments } from 'next/navigation'; const NOT_MIGRATED_PAGES = ['reports']; @@ -16,6 +17,13 @@ export default function LayoutContent({ } return ( -
{children}
+
+ {children} +
); } diff --git a/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-menu.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-menu.tsx index 3f0d51ef..133802b5 100644 --- a/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-menu.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-menu.tsx @@ -15,6 +15,7 @@ import { PlusIcon, ScanEyeIcon, ServerIcon, + SparklesIcon, UsersIcon, WallpaperIcon, } from 'lucide-react'; @@ -23,6 +24,7 @@ import { usePathname } from 'next/navigation'; import { ProjectLink } from '@/components/links'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; +import { CommandShortcut } from '@/components/ui/command'; import { useNumber } from '@/hooks/useNumerFormatter'; import type { IServiceDashboards, IServiceOrganization } from '@openpanel/db'; import { differenceInDays, format } from 'date-fns'; @@ -174,15 +176,25 @@ export default function LayoutMenu({ )} + + +
+
Ask AI
+
+ ⌘K +
Create report
- + ⌘J
diff --git a/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/report-editor.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/report-editor.tsx index 27adfbc9..f8ae86f5 100644 --- a/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/report-editor.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/report-editor.tsx @@ -7,8 +7,10 @@ import { ReportInterval } from '@/components/report/ReportInterval'; import { ReportLineType } from '@/components/report/ReportLineType'; import { ReportSaveButton } from '@/components/report/ReportSaveButton'; import { + changeChartType, changeDateRanges, changeEndDate, + changeInterval, changeStartDate, ready, reset, @@ -74,7 +76,13 @@ export default function ReportEditor({
- + { + dispatch(changeChartType(type)); + }} + value={report.chartType} + /> { @@ -90,7 +98,13 @@ export default function ReportEditor({ endDate={report.endDate} startDate={report.startDate} /> - + dispatch(changeInterval(newInterval))} + range={report.range} + chartType={report.chartType} + />
diff --git a/apps/dashboard/src/app/layout.tsx b/apps/dashboard/src/app/layout.tsx index 356f4987..a4f84b64 100644 --- a/apps/dashboard/src/app/layout.tsx +++ b/apps/dashboard/src/app/layout.tsx @@ -5,6 +5,7 @@ import Providers from './providers'; import '@/styles/globals.css'; import 'flag-icons/css/flag-icons.min.css'; +import 'katex/dist/katex.min.css'; import { GeistMono } from 'geist/font/mono'; import { GeistSans } from 'geist/font/sans'; diff --git a/apps/dashboard/src/app/manifest.ts b/apps/dashboard/src/app/manifest.ts index 3a6da255..4fd3b21a 100644 --- a/apps/dashboard/src/app/manifest.ts +++ b/apps/dashboard/src/app/manifest.ts @@ -1,5 +1,7 @@ import type { MetadataRoute } from 'next'; +export const dynamic = 'static'; + export default function manifest(): MetadataRoute.Manifest { return { id: process.env.NEXT_PUBLIC_DASHBOARD_URL, diff --git a/apps/dashboard/src/app/providers.tsx b/apps/dashboard/src/app/providers.tsx index 4454c367..1ea1cbec 100644 --- a/apps/dashboard/src/app/providers.tsx +++ b/apps/dashboard/src/app/providers.tsx @@ -54,34 +54,34 @@ function AllProviders({ children }: { children: React.ReactNode }) { } return ( - - {process.env.NEXT_PUBLIC_OP_CLIENT_ID && ( - - )} - - - - + + + {process.env.NEXT_PUBLIC_OP_CLIENT_ID && ( + + )} + + + {children} - - - - - + + + + + ); } diff --git a/apps/dashboard/src/components/chat/chat-form.tsx b/apps/dashboard/src/components/chat/chat-form.tsx new file mode 100644 index 00000000..88ff294e --- /dev/null +++ b/apps/dashboard/src/components/chat/chat-form.tsx @@ -0,0 +1,70 @@ +import { cn } from '@/utils/cn'; +import type { useChat } from '@ai-sdk/react'; +import { useLocalStorage } from 'usehooks-ts'; +import { Button } from '../ui/button'; +import { ScrollArea } from '../ui/scroll-area'; + +type Props = Pick< + ReturnType, + 'handleSubmit' | 'handleInputChange' | 'input' | 'append' +> & { + projectId: string; + isLimited: boolean; +}; + +export function ChatForm({ + handleSubmit: handleSubmitProp, + input, + handleInputChange, + append, + projectId, + isLimited, +}: Props) { + const [quickActions, setQuickActions] = useLocalStorage( + `chat-quick-actions:${projectId}`, + [], + ); + + const handleSubmit = (e: React.FormEvent) => { + handleSubmitProp(e); + setQuickActions([input, ...quickActions].slice(0, 5)); + }; + + return ( +
+ +
+ {quickActions.map((q) => ( + + ))} +
+
+
+ +
+
+ ); +} diff --git a/apps/dashboard/src/components/chat/chat-message.tsx b/apps/dashboard/src/components/chat/chat-message.tsx new file mode 100644 index 00000000..5d08db9e --- /dev/null +++ b/apps/dashboard/src/components/chat/chat-message.tsx @@ -0,0 +1,144 @@ +import { Markdown } from '@/components/markdown'; +import { cn } from '@/utils/cn'; +import { zChartInputAI } from '@openpanel/validation'; +import type { UIMessage } from 'ai'; +import { Loader2Icon, UserIcon } from 'lucide-react'; +import { Fragment, memo } from 'react'; +import { Card } from '../card'; +import { LogoSquare } from '../logo'; +import { Skeleton } from '../skeleton'; +import Syntax from '../syntax'; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from '../ui/accordion'; +import { ChatReport } from './chat-report'; + +export const ChatMessage = memo( + ({ + message, + isLast, + isStreaming, + debug, + }: { + message: UIMessage; + isLast: boolean; + isStreaming: boolean; + debug: boolean; + }) => { + const showIsStreaming = isLast && isStreaming; + return ( +
+
+
+
+ {message.role === 'assistant' ? ( + + ) : ( +
+ +
+ )} + +
+ +
+
+
+
+ {message.parts.map((p, index) => { + const key = index.toString() + p.type; + const isToolInvocation = p.type === 'tool-invocation'; + + if (p.type === 'step-start') { + return null; + } + + if (!isToolInvocation && p.type !== 'text') { + return ; + } + + if (p.type === 'text') { + return ( +
+ {p.text} +
+ ); + } + + if (isToolInvocation && p.toolInvocation.state === 'result') { + const { result } = p.toolInvocation; + + if (result.type === 'report') { + const report = zChartInputAI.safeParse(result.report); + if (report.success) { + return ( + + + + + ); + } + } + + return ( + + ); + } + + return null; + })} + {showIsStreaming && ( +
+ + + +
+ )} +
+
+ {!isLast && ( +
+
+
+ )} +
+ ); + }, +); + +function Debug({ enabled, json }: { enabled?: boolean; json?: any }) { + if (!enabled) { + return null; + } + + return ( + + + + + Show JSON result + + + + + + + + ); +} diff --git a/apps/dashboard/src/components/chat/chat-messages.tsx b/apps/dashboard/src/components/chat/chat-messages.tsx new file mode 100644 index 00000000..24622372 --- /dev/null +++ b/apps/dashboard/src/components/chat/chat-messages.tsx @@ -0,0 +1,84 @@ +import { useScrollAnchor } from '@/hooks/use-scroll-anchor'; +import type { IServiceOrganization, Organization } from '@openpanel/db'; +import type { UIMessage } from 'ai'; +import { Loader2Icon } from 'lucide-react'; +import { useEffect } from 'react'; +import { ProjectLink } from '../links'; +import { Markdown } from '../markdown'; +import { Skeleton } from '../skeleton'; +import { Alert, AlertDescription, AlertTitle } from '../ui/alert'; +import { Button, LinkButton } from '../ui/button'; +import { ScrollArea } from '../ui/scroll-area'; +import { ChatMessage } from './chat-message'; + +export function ChatMessages({ + messages, + debug, + status, + isLimited, +}: { + messages: UIMessage[]; + debug: boolean; + status: 'submitted' | 'streaming' | 'ready' | 'error'; + isLimited: boolean; +}) { + const { messagesRef, scrollRef, visibilityRef, scrollToBottom } = + useScrollAnchor(); + + useEffect(() => { + scrollToBottom(); + }, []); + + useEffect(() => { + const lastMessage = messages[messages.length - 1]; + if (lastMessage?.role === 'user') { + scrollToBottom(); + } + }, [messages]); + + return ( + +
+ {messages.map((m, index) => { + return ( + + ); + })} + {status === 'submitted' && ( +
+ +
+ )} + {isLimited && ( +
+ + Upgrade your account + +

+ To keep using this feature you need to upgrade your account. +

+

+ + Visit Billing + {' '} + to upgrade. +

+
+
+
+ )} +
+
+
+ + ); +} diff --git a/apps/dashboard/src/components/chat/chat-report.tsx b/apps/dashboard/src/components/chat/chat-report.tsx new file mode 100644 index 00000000..c1d843db --- /dev/null +++ b/apps/dashboard/src/components/chat/chat-report.tsx @@ -0,0 +1,90 @@ +'use client'; + +import { pushModal } from '@/modals'; +import type { + IChartInputAi, + IChartRange, + IChartType, + IInterval, +} from '@openpanel/validation'; +import { endOfDay, startOfDay } from 'date-fns'; +import { SaveIcon } from 'lucide-react'; +import { useState } from 'react'; +import { ReportChart } from '../report-chart'; +import { ReportChartType } from '../report/ReportChartType'; +import { ReportInterval } from '../report/ReportInterval'; +import { TimeWindowPicker } from '../time-window-picker'; +import { Button } from '../ui/button'; + +export function ChatReport({ + lazy, + ...props +}: { report: IChartInputAi; lazy: boolean }) { + const [chartType, setChartType] = useState( + props.report.chartType, + ); + const [startDate, setStartDate] = useState(props.report.startDate); + const [endDate, setEndDate] = useState(props.report.endDate); + const [range, setRange] = useState(props.report.range); + const [interval, setInterval] = useState(props.report.interval); + const report = { + ...props.report, + lineType: 'linear' as const, + chartType, + startDate: range === 'custom' ? startDate : null, + endDate: range === 'custom' ? endDate : null, + range, + interval, + }; + return ( +
+
+ {props.report.name} +
+
+ +
+
+
+ + setStartDate(startOfDay(date).toISOString()) + } + onEndDateChange={(date) => setEndDate(endOfDay(date).toISOString())} + endDate={report.endDate} + startDate={report.startDate} + /> + + { + setChartType(type); + }} + /> +
+ +
+
+ ); +} diff --git a/apps/dashboard/src/components/chat/chat.tsx b/apps/dashboard/src/components/chat/chat.tsx new file mode 100644 index 00000000..06677e7d --- /dev/null +++ b/apps/dashboard/src/components/chat/chat.tsx @@ -0,0 +1,76 @@ +'use client'; + +import { ChatForm } from '@/components/chat/chat-form'; +import { ChatMessages } from '@/components/chat/chat-messages'; +import { useChat } from '@ai-sdk/react'; +import type { IServiceOrganization } from '@openpanel/db'; +import type { UIMessage } from 'ai'; +import { parseAsBoolean, useQueryState } from 'nuqs'; +import { toast } from 'sonner'; + +const getErrorMessage = (error: Error) => { + try { + const parsed = JSON.parse(error.message); + return parsed.message || error.message; + } catch (e) { + return error.message; + } +}; +export default function Chat({ + initialMessages, + projectId, + organization, +}: { + initialMessages?: UIMessage[]; + projectId: string; + organization: IServiceOrganization; +}) { + const { messages, input, handleInputChange, handleSubmit, status, append } = + useChat({ + onError(error) { + const message = getErrorMessage(error); + toast.error(message); + }, + api: `${process.env.NEXT_PUBLIC_API_URL}/ai/chat?projectId=${projectId}`, + initialMessages: (initialMessages ?? []) as any, + fetch: (url, options) => { + return fetch(url, { + ...options, + credentials: 'include', + mode: 'cors', + }); + }, + }); + + const [debug, setDebug] = useQueryState( + 'debug', + parseAsBoolean.withDefault(false), + ); + const isLimited = Boolean( + messages.length > 5 && + (organization.isCanceled || + organization.isTrial || + organization.isWillBeCanceled || + organization.isExceeded || + organization.isExpired), + ); + + return ( +
+ + +
+ ); +} diff --git a/apps/dashboard/src/components/markdown.tsx b/apps/dashboard/src/components/markdown.tsx new file mode 100644 index 00000000..9b69dd96 --- /dev/null +++ b/apps/dashboard/src/components/markdown.tsx @@ -0,0 +1,26 @@ +import { memo } from 'react'; +import ReactMarkdown, { type Options } from 'react-markdown'; +import rehypeKatex from 'rehype-katex'; +import remarkGfm from 'remark-gfm'; +import remarkHighlight from 'remark-highlight'; +import remarkMath from 'remark-math'; +import remarkParse from 'remark-parse'; +import remarkRehype from 'remark-rehype'; +import 'katex/dist/katex.min.css'; + +export const Markdown = memo( + (props) => ( + + ), + (prevProps, nextProps) => + prevProps.children === nextProps.children && + 'className' in prevProps && + 'className' in nextProps && + prevProps.className === nextProps.className, +); + +Markdown.displayName = 'Markdown'; diff --git a/apps/dashboard/src/components/report-chart/context.tsx b/apps/dashboard/src/components/report-chart/context.tsx index 5499d9b9..8dd60331 100644 --- a/apps/dashboard/src/components/report-chart/context.tsx +++ b/apps/dashboard/src/components/report-chart/context.tsx @@ -39,6 +39,7 @@ type ReportChartContextProviderProps = ReportChartContextType & { export type ReportChartProps = Partial & { report: IChartInput; + lazy?: boolean; }; const context = createContext(null); diff --git a/apps/dashboard/src/components/report-chart/conversion/chart.tsx b/apps/dashboard/src/components/report-chart/conversion/chart.tsx index a2e7f85a..a523c360 100644 --- a/apps/dashboard/src/components/report-chart/conversion/chart.tsx +++ b/apps/dashboard/src/components/report-chart/conversion/chart.tsx @@ -157,7 +157,11 @@ const { Tooltip, TooltipProvider } = createChartTooltip< interval: IInterval; } >(({ data, context }) => { - const { date } = data[0]!; + if (!data[0]) { + return null; + } + + const { date } = data[0]; const formatDate = useFormatDateInterval(context.interval); const number = useNumber(); return ( diff --git a/apps/dashboard/src/components/report-chart/index.tsx b/apps/dashboard/src/components/report-chart/index.tsx index cb89a5af..4f203f18 100644 --- a/apps/dashboard/src/components/report-chart/index.tsx +++ b/apps/dashboard/src/components/report-chart/index.tsx @@ -1,9 +1,10 @@ 'use client'; import { mergeDeepRight } from 'ramda'; -import React, { useEffect, useRef } from 'react'; +import React, { memo, useEffect, useRef } from 'react'; import { useInViewport } from 'react-in-viewport'; +import { shallowEqual } from 'react-redux'; import { ReportAreaChart } from './area'; import { ReportBarChart } from './bar'; import type { ReportChartProps } from './context'; @@ -17,7 +18,7 @@ import { ReportMetricChart } from './metric'; import { ReportPieChart } from './pie'; import { ReportRetentionChart } from './retention'; -export function ReportChart(props: ReportChartProps) { +export const ReportChart = ({ lazy = true, ...props }: ReportChartProps) => { const ref = useRef(null); const once = useRef(false); const { inViewport } = useInViewport(ref, undefined, { @@ -30,7 +31,7 @@ export function ReportChart(props: ReportChartProps) { } }, [inViewport]); - const loaded = once.current || inViewport; + const loaded = lazy ? once.current || inViewport : true; const renderReportChart = () => { switch (props.report.chartType) { @@ -69,4 +70,4 @@ export function ReportChart(props: ReportChartProps) {
); -} +}; diff --git a/apps/dashboard/src/components/report/ReportChartType.tsx b/apps/dashboard/src/components/report/ReportChartType.tsx index 15764e53..ccc6f822 100644 --- a/apps/dashboard/src/components/report/ReportChartType.tsx +++ b/apps/dashboard/src/components/report/ReportChartType.tsx @@ -14,7 +14,7 @@ import { } from 'lucide-react'; import { chartTypes } from '@openpanel/constants'; -import { objectToZodEnums } from '@openpanel/validation'; +import { type IChartType, objectToZodEnums } from '@openpanel/validation'; import { DropdownMenu, @@ -32,10 +32,14 @@ import { changeChartType } from './reportSlice'; interface ReportChartTypeProps { className?: string; + value: IChartType; + onChange: (type: IChartType) => void; } -export function ReportChartType({ className }: ReportChartTypeProps) { - const dispatch = useDispatch(); - const type = useSelector((state) => state.report.chartType); +export function ReportChartType({ + className, + value, + onChange, +}: ReportChartTypeProps) { const items = objectToZodEnums(chartTypes).map((key) => ({ label: chartTypes[key], value: key, @@ -61,10 +65,10 @@ export function ReportChartType({ className }: ReportChartTypeProps) { @@ -77,7 +81,7 @@ export function ReportChartType({ className }: ReportChartTypeProps) { return ( dispatch(changeChartType(item.value))} + onClick={() => onChange(item.value)} className="group" > {item.label} diff --git a/apps/dashboard/src/components/report/ReportInterval.tsx b/apps/dashboard/src/components/report/ReportInterval.tsx index c5ab0b72..1754f03c 100644 --- a/apps/dashboard/src/components/report/ReportInterval.tsx +++ b/apps/dashboard/src/components/report/ReportInterval.tsx @@ -6,17 +6,36 @@ import { isMinuteIntervalEnabledByRange, } from '@openpanel/constants'; -import { Combobox } from '../ui/combobox'; +import { cn } from '@/utils/cn'; +import type { IChartRange, IChartType, IInterval } from '@openpanel/validation'; +import { Button } from '../ui/button'; +import { CommandShortcut } from '../ui/command'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuTrigger, +} from '../ui/dropdown-menu'; import { changeInterval } from './reportSlice'; interface ReportIntervalProps { className?: string; + interval: IInterval; + onChange: (range: IInterval) => void; + chartType: IChartType; + range: IChartRange; } -export function ReportInterval({ className }: ReportIntervalProps) { - const dispatch = useDispatch(); - const interval = useSelector((state) => state.report.interval); - const range = useSelector((state) => state.report.range); - const chartType = useSelector((state) => state.report.chartType); +export function ReportInterval({ + className, + interval, + onChange, + chartType, + range, +}: ReportIntervalProps) { if ( chartType !== 'linear' && chartType !== 'histogram' && @@ -28,37 +47,66 @@ export function ReportInterval({ className }: ReportIntervalProps) { return null; } + const items = [ + { + value: 'minute', + label: 'Minute', + disabled: !isMinuteIntervalEnabledByRange(range), + }, + { + value: 'hour', + label: 'Hour', + disabled: !isHourIntervalEnabledByRange(range), + }, + { + value: 'day', + label: 'Day', + }, + { + value: 'month', + label: 'Month', + disabled: range === 'today' || range === 'lastHour' || range === '30min', + }, + ]; + + const selectedItem = items.find((item) => item.value === interval); + return ( - { - dispatch(changeInterval(value)); - }} - value={interval} - items={[ - { - value: 'minute', - label: 'Minute', - disabled: !isMinuteIntervalEnabledByRange(range), - }, - { - value: 'hour', - label: 'Hour', - disabled: !isHourIntervalEnabledByRange(range), - }, - { - value: 'day', - label: 'Day', - }, - { - value: 'month', - label: 'Month', - disabled: - range === 'today' || range === 'lastHour' || range === '30min', - }, - ]} - /> + + + + + + + Select interval + {!!selectedItem && ( + {selectedItem?.label} + )} + + + + {items.map((item) => ( + onChange(item.value as IInterval)} + disabled={item.disabled} + > + {item.label} + {item.value === interval && ( + + + + )} + + ))} + + + ); } diff --git a/apps/dashboard/src/components/syntax.tsx b/apps/dashboard/src/components/syntax.tsx index 159ff0fb..5d9139cb 100644 --- a/apps/dashboard/src/components/syntax.tsx +++ b/apps/dashboard/src/components/syntax.tsx @@ -5,22 +5,26 @@ import { cn } from '@/utils/cn'; import { CopyIcon } from 'lucide-react'; import { Light as SyntaxHighlighter } from 'react-syntax-highlighter'; import bash from 'react-syntax-highlighter/dist/cjs/languages/hljs/bash'; +import json from 'react-syntax-highlighter/dist/cjs/languages/hljs/json'; import ts from 'react-syntax-highlighter/dist/cjs/languages/hljs/typescript'; import docco from 'react-syntax-highlighter/dist/cjs/styles/hljs/vs2015'; SyntaxHighlighter.registerLanguage('typescript', ts); +SyntaxHighlighter.registerLanguage('json', json); SyntaxHighlighter.registerLanguage('bash', bash); interface SyntaxProps { code: string; className?: string; - language?: 'typescript' | 'bash'; + language?: 'typescript' | 'bash' | 'json'; + wrapLines?: boolean; } export default function Syntax({ code, className, language = 'typescript', + wrapLines = false, }: SyntaxProps) { return (
@@ -35,7 +39,7 @@ export default function Syntax({ , - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( + React.ComponentPropsWithoutRef & { + orientation?: 'vertical' | 'horizontal'; + } +>(({ className, children, orientation = 'vertical', ...props }, ref) => ( - + {children} - + )); diff --git a/apps/dashboard/src/hooks/use-scroll-anchor.ts b/apps/dashboard/src/hooks/use-scroll-anchor.ts new file mode 100644 index 00000000..93555153 --- /dev/null +++ b/apps/dashboard/src/hooks/use-scroll-anchor.ts @@ -0,0 +1,82 @@ +import { useCallback, useEffect, useRef, useState } from 'react'; + +export const useScrollAnchor = () => { + const messagesRef = useRef(null); + const scrollRef = useRef(null); + const visibilityRef = useRef(null); + + const [isAtBottom, setIsAtBottom] = useState(true); + const [isVisible, setIsVisible] = useState(false); + + const scrollToBottom = useCallback(() => { + if (messagesRef.current) { + messagesRef.current.scrollIntoView({ + block: 'end', + behavior: 'smooth', + }); + } + }, []); + + useEffect(() => { + if (messagesRef.current) { + if (isAtBottom && !isVisible) { + messagesRef.current.scrollIntoView({ + block: 'end', + }); + } + } + }, [isAtBottom, isVisible]); + + useEffect(() => { + const { current } = scrollRef; + + if (current) { + const handleScroll = (event: Event) => { + const target = event.target as HTMLDivElement; + const offset = 20; + const isAtBottom = + target.scrollTop + target.clientHeight >= + target.scrollHeight - offset; + + setIsAtBottom(isAtBottom); + }; + + current.addEventListener('scroll', handleScroll, { + passive: true, + }); + + return () => { + current.removeEventListener('scroll', handleScroll); + }; + } + }, []); + + useEffect(() => { + if (visibilityRef.current) { + const observer = new IntersectionObserver((entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + setIsVisible(true); + } else { + setIsVisible(false); + } + }); + }); + + observer.observe(visibilityRef.current); + + return () => { + observer.disconnect(); + }; + } + }); + + return { + messagesRef, + scrollRef, + visibilityRef, + scrollToBottom, + isAtBottom, + isVisible, + }; +}; diff --git a/apps/dashboard/src/modals/SaveReport.tsx b/apps/dashboard/src/modals/SaveReport.tsx index efb7ed6b..eb919a83 100644 --- a/apps/dashboard/src/modals/SaveReport.tsx +++ b/apps/dashboard/src/modals/SaveReport.tsx @@ -18,7 +18,7 @@ import { ModalContent, ModalHeader } from './Modal/Container'; type SaveReportProps = { report: IChartProps; - reportId?: string; + disableRedirect?: boolean; }; const validator = z.object({ @@ -28,7 +28,10 @@ const validator = z.object({ type IForm = z.infer; -export default function SaveReport({ report }: SaveReportProps) { +export default function SaveReport({ + report, + disableRedirect, +}: SaveReportProps) { const router = useRouter(); const { organizationId, projectId } = useAppParams(); const searchParams = useSearchParams(); @@ -37,15 +40,27 @@ export default function SaveReport({ report }: SaveReportProps) { const save = api.report.create.useMutation({ onError: handleError, onSuccess(res) { - toast('Success', { - description: 'Report saved.', + const goToReport = () => { + router.push( + `/${organizationId}/${projectId}/reports/${ + res.id + }?${searchParams?.toString()}`, + ); + }; + + toast('Report created', { + description:
Hello world
, + action: { + label: 'View report', + onClick: () => goToReport(), + }, }); + + if (!disableRedirect) { + goToReport(); + } + popModal(); - router.push( - `/${organizationId}/${projectId}/reports/${ - res.id - }?${searchParams?.toString()}`, - ); }, }); diff --git a/apps/dashboard/src/styles/globals.css b/apps/dashboard/src/styles/globals.css index ff7089b0..26f9c086 100644 --- a/apps/dashboard/src/styles/globals.css +++ b/apps/dashboard/src/styles/globals.css @@ -168,4 +168,4 @@ .hide-scrollbar { -ms-overflow-style: none; /* IE and Edge */ scrollbar-width: none; /* Firefox */ -} +} \ No newline at end of file diff --git a/apps/public/package.json b/apps/public/package.json index fac30a3e..53138234 100644 --- a/apps/public/package.json +++ b/apps/public/package.json @@ -34,7 +34,7 @@ "rehype-external-links": "3.0.0", "tailwind-merge": "1.14.0", "tailwindcss-animate": "1.0.7", - "zod": "^3.22.4" + "zod": "catalog:" }, "devDependencies": { "@types/mdx": "^2.0.13", diff --git a/package.json b/package.json index f6885950..6642f8cb 100644 --- a/package.json +++ b/package.json @@ -34,9 +34,6 @@ "typescript": "^5.2.2", "winston": "^3.14.2" }, - "resolutions": { - "zod": "3.22.4" - }, "trustedDependencies": [ "@biomejs/biome", "@prisma/client", diff --git a/packages/cli/package.json b/packages/cli/package.json index 286c8b28..896e4265 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -17,7 +17,7 @@ "p-limit": "^6.1.0", "progress": "^2.0.3", "ramda": "^0.29.1", - "zod": "^3.22.4" + "zod": "catalog:" }, "devDependencies": { "@openpanel/db": "workspace:^", diff --git a/packages/db/package.json b/packages/db/package.json index 1b1c48c5..df9e9832 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -29,7 +29,7 @@ "sqlstring": "^2.3.3", "superjson": "^1.13.3", "uuid": "^9.0.1", - "zod": "^3.22.4" + "zod": "catalog:" }, "devDependencies": { "@openpanel/tsconfig": "workspace:*", diff --git a/packages/db/prisma/migrations/20250409203918_add_chat/migration.sql b/packages/db/prisma/migrations/20250409203918_add_chat/migration.sql new file mode 100644 index 00000000..0ac0314b --- /dev/null +++ b/packages/db/prisma/migrations/20250409203918_add_chat/migration.sql @@ -0,0 +1,13 @@ +-- CreateTable +CREATE TABLE "chats" ( + "id" TEXT NOT NULL DEFAULT gen_random_uuid(), + "messages" JSONB NOT NULL, + "projectId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "chats_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "chats" ADD CONSTRAINT "chats_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/packages/db/prisma/schema.prisma b/packages/db/prisma/schema.prisma index 76789b5b..b433e277 100644 --- a/packages/db/prisma/schema.prisma +++ b/packages/db/prisma/schema.prisma @@ -30,6 +30,17 @@ enum ProjectType { backend } +model Chat { + id String @id @default(dbgenerated("gen_random_uuid()")) + messages Json + projectId String + project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + + @@map("chats") +} + model Organization { id String @id @default(dbgenerated("gen_random_uuid()")) name String @@ -184,6 +195,7 @@ model Project { createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt + Chat Chat[] @@map("projects") } diff --git a/packages/email/package.json b/packages/email/package.json index 91d9f202..41d86e31 100644 --- a/packages/email/package.json +++ b/packages/email/package.json @@ -12,7 +12,7 @@ "react-dom": "18.2.0", "resend": "^4.0.1", "responsive-react-email": "^0.0.5", - "zod": "^3.22.4" + "zod": "catalog:" }, "devDependencies": { "@openpanel/tsconfig": "workspace:*", diff --git a/packages/trpc/package.json b/packages/trpc/package.json index ff992497..9728086f 100644 --- a/packages/trpc/package.json +++ b/packages/trpc/package.json @@ -28,7 +28,7 @@ "sqlstring": "^2.3.3", "superjson": "^1.13.3", "uuid": "^9.0.1", - "zod": "^3.22.4" + "zod": "catalog:" }, "devDependencies": { "@openpanel/tsconfig": "workspace:*", diff --git a/packages/trpc/src/routers/chart.ts b/packages/trpc/src/routers/chart.ts index a8ae244a..ccd2761a 100644 --- a/packages/trpc/src/routers/chart.ts +++ b/packages/trpc/src/routers/chart.ts @@ -28,7 +28,12 @@ import { } from 'date-fns'; import { getProjectAccessCached } from '../access'; import { TRPCAccessError } from '../errors'; -import { createTRPCRouter, protectedProcedure, publicProcedure } from '../trpc'; +import { + cacheMiddleware, + createTRPCRouter, + protectedProcedure, + publicProcedure, +} from '../trpc'; import { getChart, getChartPrevStartEndDate, @@ -42,6 +47,8 @@ function utc(date: string | Date) { return formatISO(date).replace('T', ' ').slice(0, 19); } +const cacher = cacheMiddleware(60); + export const chartRouter = createTRPCRouter({ events: protectedProcedure .input( @@ -220,13 +227,27 @@ export const chartRouter = createTRPCRouter({ }; }), - chart: publicProcedure.input(zChartInput).query(async ({ input, ctx }) => { - if (ctx.session.userId) { - const access = await getProjectAccessCached({ - projectId: input.projectId, - userId: ctx.session.userId, - }); - if (!access) { + chart: publicProcedure + .use(cacher) + .input(zChartInput) + .query(async ({ input, ctx }) => { + if (ctx.session.userId) { + const access = await getProjectAccessCached({ + projectId: input.projectId, + userId: ctx.session.userId, + }); + if (!access) { + const share = await db.shareOverview.findFirst({ + where: { + projectId: input.projectId, + }, + }); + + if (!share) { + throw TRPCAccessError('You do not have access to this project'); + } + } + } else { const share = await db.shareOverview.findFirst({ where: { projectId: input.projectId, @@ -237,20 +258,9 @@ export const chartRouter = createTRPCRouter({ throw TRPCAccessError('You do not have access to this project'); } } - } else { - const share = await db.shareOverview.findFirst({ - where: { - projectId: input.projectId, - }, - }); - if (!share) { - throw TRPCAccessError('You do not have access to this project'); - } - } - - return getChart(input); - }), + return getChart(input); + }), cohort: protectedProcedure .input( z.object({ diff --git a/packages/validation/package.json b/packages/validation/package.json index 782e9af1..7a841536 100644 --- a/packages/validation/package.json +++ b/packages/validation/package.json @@ -7,7 +7,7 @@ }, "dependencies": { "@openpanel/constants": "workspace:*", - "zod": "^3.22.4" + "zod": "catalog:" }, "devDependencies": { "@openpanel/tsconfig": "workspace:*", diff --git a/packages/validation/src/index.ts b/packages/validation/src/index.ts index 8ab44dd8..8aa9161c 100644 --- a/packages/validation/src/index.ts +++ b/packages/validation/src/index.ts @@ -19,27 +19,48 @@ export function objectToZodEnums( export const mapKeys = objectToZodEnums; export const zChartEventFilter = z.object({ - id: z.string().optional(), - name: z.string(), - operator: z.enum(objectToZodEnums(operators)), - value: z.array(z.string().or(z.number()).or(z.boolean()).or(z.null())), + id: z.string().optional().describe('Unique identifier for the filter'), + name: z.string().describe('The property name to filter on'), + operator: z + .enum(objectToZodEnums(operators)) + .describe('The operator to use for the filter'), + value: z + .array(z.string().or(z.number()).or(z.boolean()).or(z.null())) + .describe('The values to filter on'), }); export const zChartEvent = z.object({ - id: z.string().optional(), - name: z.string(), - displayName: z.string().optional(), - property: z.string().optional(), - segment: z.enum([ - 'event', - 'user', - 'session', - 'user_average', - 'one_event_per_user', - 'property_sum', - 'property_average', - ]), - filters: z.array(zChartEventFilter).default([]), + id: z + .string() + .optional() + .describe('Unique identifier for the chart event configuration'), + name: z.string().describe('The name of the event as tracked in the system'), + displayName: z + .string() + .optional() + .describe('A user-friendly name for display purposes'), + property: z + .string() + .optional() + .describe( + 'Optional property of the event used for specific segment calculations (e.g., value for property_sum/average)', + ), + segment: z + .enum([ + 'event', + 'user', + 'session', + 'user_average', + 'one_event_per_user', + 'property_sum', + 'property_average', + ]) + .default('event') + .describe('Defines how the event data should be segmented or aggregated'), + filters: z + .array(zChartEventFilter) + .default([]) + .describe('Filters applied specifically to this event'), }); export const zChartBreakdown = z.object({ id: z.string().optional(), @@ -62,30 +83,95 @@ export const zRange = z.enum(objectToZodEnums(timeWindows)); export const zCriteria = z.enum(['on_or_after', 'on']); export const zChartInput = z.object({ - chartType: zChartType.default('linear'), - interval: zTimeInterval.default('day'), - events: zChartEvents, - breakdowns: zChartBreakdowns.default([]), - range: zRange.default('30d'), - previous: z.boolean().default(false), - formula: z.string().optional(), - metric: zMetric.default('sum'), - projectId: z.string(), - startDate: z.string().nullish(), - endDate: z.string().nullish(), - limit: z.number().optional(), - offset: z.number().optional(), - criteria: zCriteria.optional(), - funnelGroup: z.string().optional(), - funnelWindow: z.number().optional(), + chartType: zChartType + .default('linear') + .describe('What type of chart should be displayed'), + interval: zTimeInterval + .default('day') + .describe( + 'The time interval for data aggregation (e.g., day, week, month)', + ), + events: zChartEvents.describe( + 'Array of events to be tracked and displayed in the chart', + ), + breakdowns: zChartBreakdowns + .default([]) + .describe('Array of dimensions to break down the data by'), + range: zRange + .default('30d') + .describe('The time range for which data should be displayed'), + previous: z + .boolean() + .default(false) + .describe('Whether to show data from the previous period for comparison'), + formula: z + .string() + .optional() + .describe('Custom formula for calculating derived metrics'), + metric: zMetric + .default('sum') + .describe( + 'The aggregation method for the metric (e.g., sum, count, average)', + ), + projectId: z.string().describe('The ID of the project this chart belongs to'), + startDate: z + .string() + .nullish() + .describe( + 'Custom start date for the data range (overrides range if provided)', + ), + endDate: z + .string() + .nullish() + .describe( + 'Custom end date for the data range (overrides range if provided)', + ), + limit: z + .number() + .optional() + .describe('Limit how many series should be returned'), + offset: z + .number() + .optional() + .describe('Skip how many series should be returned'), + criteria: zCriteria + .optional() + .describe('Filtering criteria for retention chart (e.g., on_or_after, on)'), + funnelGroup: z + .string() + .optional() + .describe( + 'Group identifier for funnel analysis, e.g. "profile_id" or "session_id"', + ), + funnelWindow: z + .number() + .optional() + .describe('Time window in hours for funnel analysis'), }); export const zReportInput = zChartInput.extend({ - name: z.string(), - lineType: zLineType, - unit: z.string().optional(), + name: z.string().describe('The user-defined name for the report'), + lineType: zLineType.describe('The visual style of the line in the chart'), + unit: z + .string() + .optional() + .describe( + "Optional unit of measurement for the chart's Y-axis (e.g., $, %, users)", + ), }); +export const zChartInputAI = zReportInput + .omit({ + startDate: true, + endDate: true, + lineType: true, + unit: true, + }) + .extend({ + startDate: z.string().describe('The start date for the report'), + endDate: z.string().describe('The end date for the report'), + }); + export const zInviteUser = z.object({ email: z.string().email(), organizationId: z.string(), diff --git a/packages/validation/src/types.validation.ts b/packages/validation/src/types.validation.ts index 4eeddd10..c3880e91 100644 --- a/packages/validation/src/types.validation.ts +++ b/packages/validation/src/types.validation.ts @@ -4,6 +4,7 @@ import type { zChartBreakdown, zChartEvent, zChartInput, + zChartInputAI, zChartType, zCriteria, zLineType, @@ -14,6 +15,7 @@ import type { } from './index'; export type IChartInput = z.infer; +export type IChartInputAi = z.infer; export type IChartProps = z.infer & { name: string; lineType: IChartLineType; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 721ef501..2ddc03f1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,8 +4,11 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - zod: 3.22.4 +catalogs: + default: + zod: + specifier: ^3.24.2 + version: 3.24.2 importers: @@ -36,6 +39,12 @@ importers: apps/api: dependencies: + '@ai-sdk/anthropic': + specifier: ^1.2.10 + version: 1.2.10(zod@3.24.2) + '@ai-sdk/openai': + specifier: ^1.3.12 + version: 1.3.12(zod@3.24.2) '@fastify/compress': specifier: ^8.0.1 version: 8.0.1 @@ -60,6 +69,9 @@ importers: '@openpanel/common': specifier: workspace:* version: link:../../packages/common + '@openpanel/constants': + specifier: workspace:* + version: link:../../packages/constants '@openpanel/db': specifier: workspace:* version: link:../../packages/db @@ -90,6 +102,9 @@ importers: '@trpc/server': specifier: ^10.45.2 version: 10.45.2 + ai: + specifier: ^4.2.10 + version: 4.2.10(react@18.3.1)(zod@3.24.2) bcrypt: specifier: ^5.1.1 version: 5.1.1 @@ -139,8 +154,8 @@ importers: specifier: ^9.0.1 version: 9.0.1 zod: - specifier: 3.22.4 - version: 3.22.4 + specifier: 'catalog:' + version: 3.24.2 devDependencies: '@faker-js/faker': specifier: ^9.0.1 @@ -187,6 +202,9 @@ importers: apps/dashboard: dependencies: + '@ai-sdk/react': + specifier: ^1.2.5 + version: 1.2.5(react@18.2.0)(zod@3.24.2) '@clickhouse/client': specifier: ^1.2.0 version: 1.2.0 @@ -294,7 +312,7 @@ importers: version: 1.9.7(react-redux@8.1.3(@types/react-dom@18.2.19)(@types/react@18.2.56)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.6(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))(react@18.2.0))(react@18.2.0)(redux@4.2.1))(react@18.2.0) '@t3-oss/env-nextjs': specifier: ^0.7.3 - version: 0.7.3(typescript@5.3.3)(zod@3.22.4) + version: 0.7.3(typescript@5.3.3)(zod@3.24.2) '@tailwindcss/container-queries': specifier: ^0.1.1 version: 0.1.1(tailwindcss@3.4.1) @@ -325,6 +343,9 @@ importers: '@types/d3': specifier: ^7.4.3 version: 7.4.3 + ai: + specifier: ^4.2.10 + version: 4.2.10(react@18.2.0)(zod@3.24.2) bcrypt: specifier: ^5.1.1 version: 5.1.1 @@ -367,6 +388,9 @@ importers: javascript-time-ago: specifier: ^2.5.9 version: 2.5.9 + katex: + specifier: ^0.16.21 + version: 0.16.21 lodash.debounce: specifier: ^4.0.8 version: 4.0.8 @@ -439,6 +463,9 @@ importers: react-in-viewport: specifier: 1.0.0-alpha.30 version: 1.0.0-alpha.30(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-markdown: + specifier: ^10.1.0 + version: 10.1.0(@types/react@18.2.56)(react@18.2.0) react-redux: specifier: ^8.1.3 version: 8.1.3(@types/react-dom@18.2.19)(@types/react@18.2.56)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.6(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))(react@18.2.0))(react@18.2.0)(redux@4.2.1) @@ -463,6 +490,24 @@ importers: recharts: specifier: ^2.12.0 version: 2.12.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rehype-katex: + specifier: ^7.0.1 + version: 7.0.1 + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 + remark-highlight: + specifier: ^0.1.1 + version: 0.1.1 + remark-math: + specifier: ^6.0.0 + version: 6.0.0 + remark-parse: + specifier: ^11.0.0 + version: 11.0.0 + remark-rehype: + specifier: ^11.1.2 + version: 11.1.2 short-unique-id: specifier: ^5.0.3 version: 5.0.3 @@ -488,8 +533,8 @@ importers: specifier: ^2.14.0 version: 2.14.0(react@18.2.0) zod: - specifier: 3.22.4 - version: 3.22.4 + specifier: 'catalog:' + version: 3.24.2 devDependencies: '@openpanel/payments': specifier: workspace:* @@ -562,7 +607,7 @@ importers: version: 0.3.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@openpanel/nextjs': specifier: ^1.0.5 - version: 1.0.5(next@15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.0.5(next@15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@openpanel/sdk-info': specifier: workspace:^ version: link:../../packages/sdks/_info @@ -595,22 +640,22 @@ importers: version: 11.18.2(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) fumadocs-core: specifier: 14.1.1 - version: 14.1.1(@types/react@18.3.12)(algoliasearch@4.24.0)(next@15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.1.1(@types/react@18.3.12)(algoliasearch@4.24.0)(next@15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) fumadocs-mdx: specifier: 11.1.1 - version: 11.1.1(acorn@8.11.3)(fumadocs-core@14.1.1(@types/react@18.3.12)(algoliasearch@4.24.0)(next@15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(next@15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 11.1.1(acorn@8.11.3)(fumadocs-core@14.1.1(@types/react@18.3.12)(algoliasearch@4.24.0)(next@15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(next@15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) fumadocs-ui: specifier: 14.1.1 - version: 14.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(next@15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(next@15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) geist: specifier: 1.3.1 - version: 1.3.1(next@15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 1.3.1(next@15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) lucide-react: specifier: 0.454.0 version: 0.454.0(react@18.3.1) next: specifier: 15.0.3 - version: 15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -627,8 +672,8 @@ importers: specifier: 1.0.7 version: 1.0.7(tailwindcss@3.4.17) zod: - specifier: 3.22.4 - version: 3.22.4 + specifier: 'catalog:' + version: 3.24.2 devDependencies: '@types/mdx': specifier: ^2.0.13 @@ -756,7 +801,7 @@ importers: version: 2.3.0 next: specifier: 14.2.1 - version: 14.2.1(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) + version: 14.2.1(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) react: specifier: 18.2.0 version: 18.2.0 @@ -801,8 +846,8 @@ importers: specifier: ^0.29.1 version: 0.29.1 zod: - specifier: 3.22.4 - version: 3.22.4 + specifier: 'catalog:' + version: 3.24.2 devDependencies: '@openpanel/db': specifier: workspace:^ @@ -950,8 +995,8 @@ importers: specifier: ^9.0.1 version: 9.0.1 zod: - specifier: 3.22.4 - version: 3.22.4 + specifier: 'catalog:' + version: 3.24.2 devDependencies: '@openpanel/tsconfig': specifier: workspace:* @@ -991,10 +1036,10 @@ importers: version: 4.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) responsive-react-email: specifier: ^0.0.5 - version: 0.0.5(react-email@3.0.4(@opentelemetry/api@1.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + version: 0.0.5(react-email@3.0.4(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) zod: - specifier: 3.22.4 - version: 3.22.4 + specifier: 'catalog:' + version: 3.24.2 devDependencies: '@openpanel/tsconfig': specifier: workspace:* @@ -1007,7 +1052,7 @@ importers: version: 18.3.12 react-email: specifier: 3.0.4 - version: 3.0.4(@opentelemetry/api@1.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 3.0.4(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) typescript: specifier: ^5.2.2 version: 5.6.3 @@ -1079,7 +1124,7 @@ importers: dependencies: '@polar-sh/sdk': specifier: ^0.26.1 - version: 0.26.1(zod@3.23.8) + version: 0.26.1(zod@3.24.2) devDependencies: '@openpanel/db': specifier: workspace:* @@ -1213,7 +1258,7 @@ importers: version: link:../web next: specifier: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 - version: 15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 version: 18.3.1 @@ -1241,13 +1286,13 @@ importers: version: link:../sdk expo-application: specifier: 5 - 6 - version: 5.3.1(expo@50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))) + version: 5.3.1(expo@50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))) expo-constants: specifier: 14 - 17 - version: 15.4.5(expo@50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))) + version: 15.4.5(expo@50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))) react-native: specifier: '*' - version: 0.73.6(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))(react@18.3.1) + version: 0.73.6(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))(react@18.3.1) devDependencies: '@openpanel/tsconfig': specifier: workspace:* @@ -1365,8 +1410,8 @@ importers: specifier: ^9.0.1 version: 9.0.1 zod: - specifier: 3.22.4 - version: 3.22.4 + specifier: 'catalog:' + version: 3.24.2 devDependencies: '@openpanel/tsconfig': specifier: workspace:* @@ -1396,8 +1441,8 @@ importers: specifier: workspace:* version: link:../constants zod: - specifier: 3.22.4 - version: 3.22.4 + specifier: 'catalog:' + version: 3.24.2 devDependencies: '@openpanel/tsconfig': specifier: workspace:* @@ -1442,6 +1487,54 @@ importers: packages: + '@ai-sdk/anthropic@1.2.10': + resolution: {integrity: sha512-PyE7EC2fPjs9DnzRAHDrPQmcnI2m2Eojr8pfhckOejOlDEh2w7NnSJr1W3qe5hUWzKr+6d7NG1ZKR9fhmpDdEQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/openai@1.3.12': + resolution: {integrity: sha512-ueAP69p8a/ZR2ns+pmlr9h/nyV2/DAwzfnPUGZiLpXbxWnLXd2g3a7l38CuEhBydH/nOfDb/byMgpS8+bnJHTg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/provider-utils@2.2.3': + resolution: {integrity: sha512-o3fWTzkxzI5Af7U7y794MZkYNEsxbjLam2nxyoUZSScqkacb7vZ3EYHLh21+xCcSSzEC161C7pZAGHtC0hTUMw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + + '@ai-sdk/provider-utils@2.2.7': + resolution: {integrity: sha512-kM0xS3GWg3aMChh9zfeM+80vEZfXzR3JEUBdycZLtbRZ2TRT8xOj3WodGHPb06sUK5yD7pAXC/P7ctsi2fvUGQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + + '@ai-sdk/provider@1.1.0': + resolution: {integrity: sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew==} + engines: {node: '>=18'} + + '@ai-sdk/provider@1.1.3': + resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} + engines: {node: '>=18'} + + '@ai-sdk/react@1.2.5': + resolution: {integrity: sha512-0jOop3S2WkDOdO4X5I+5fTGqZlNX8/h1T1eYokpkR9xh8Vmrxqw8SsovqGvrddTsZykH8uXRsvI+G4FTyy894A==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.23.8 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/ui-utils@1.2.4': + resolution: {integrity: sha512-wLTxEZrKZRyBmlVZv8nGXgLBg5tASlqXwbuhoDu0MhZa467ZFREEnosH/OC/novyEHTQXko2zC606xoVbMrUcA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + '@algolia/cache-browser-local-storage@4.24.0': resolution: {integrity: sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==} @@ -1498,10 +1591,6 @@ packages: '@babel/code-frame@7.10.4': resolution: {integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==} - '@babel/code-frame@7.23.5': - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -1510,18 +1599,10 @@ packages: resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} - '@babel/core@7.23.9': - resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} - engines: {node: '>=6.9.0'} - '@babel/core@7.24.5': resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.23.6': - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.26.3': resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} engines: {node: '>=6.9.0'} @@ -1571,20 +1652,10 @@ packages: resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.22.15': - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.23.3': - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.26.0': resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} @@ -1647,10 +1718,6 @@ packages: resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.23.9': - resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.26.0': resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} engines: {node: '>=6.9.0'} @@ -1659,11 +1726,6 @@ packages: resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} - '@babel/parser@7.23.9': - resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.24.5': resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} engines: {node: '>=6.0.0'} @@ -2269,18 +2331,10 @@ packages: resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} engines: {node: '>=6.9.0'} - '@babel/template@7.23.9': - resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} - engines: {node: '>=6.9.0'} - '@babel/template@7.25.9': resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.23.9': - resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.4': resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} engines: {node: '>=6.9.0'} @@ -3521,6 +3575,10 @@ packages: resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} engines: {node: '>=8.0.0'} + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + '@opentelemetry/auto-instrumentations-node@0.46.1': resolution: {integrity: sha512-s0CwmY9KYtPawOhV5YO2Gf62uVOQRNvT6Or8IZ0S4gr/kPVNhoMehTsQvqBwSWQfoFrkmW3KKOHiKJEp4dVGXg==} engines: {node: '>=14'} @@ -4010,7 +4068,7 @@ packages: '@polar-sh/sdk@0.26.1': resolution: {integrity: sha512-OEaxiNJaxpeNi7LANHR5S71BAyORk6W0lwkfHcrGyMGS9VDdgXnZjB8QZ3tFSXbQvt3yZdHShX6pPC8xOxNvFw==} peerDependencies: - zod: 3.22.4 + zod: '>= 3' '@prisma/client@5.9.1': resolution: {integrity: sha512-caSOnG4kxcSkhqC/2ShV7rEoWwd3XrftokxJqOCMVvia4NYV/TPtJlS9C2os3Igxw/Qyxumj9GBQzcStzECvtQ==} @@ -5682,7 +5740,7 @@ packages: resolution: {integrity: sha512-hhtj59TKC6TKVdwJ0CcbKsvkr9R8Pc/SNKd4IgGUIC9T9X6moB8EZZ3FTJdABA/h9UABCK4J+KsF8gzmvMvHPg==} peerDependencies: typescript: '>=4.7.2' - zod: 3.22.4 + zod: ^3.0.0 peerDependenciesMeta: typescript: optional: true @@ -5691,7 +5749,7 @@ packages: resolution: {integrity: sha512-90TNffS17vjkQwfYyMUb4Zw9yqHwFV40f78qFug4JiQa5+N6DydTdlLOpzOcj8Cna/qpAVDwMSypofF/TVQDuA==} peerDependencies: typescript: '>=4.7.2' - zod: 3.22.4 + zod: ^3.0.0 peerDependenciesMeta: typescript: optional: true @@ -5943,6 +6001,9 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/diff-match-patch@1.0.36': + resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -6000,6 +6061,9 @@ packages: '@types/jsonwebtoken@9.0.9': resolution: {integrity: sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==} + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + '@types/keygrip@1.0.6': resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} @@ -6027,6 +6091,9 @@ packages: '@types/mdast@4.0.3': resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} @@ -6241,6 +6308,16 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} + ai@4.2.10: + resolution: {integrity: sha512-rOfKbNRWlzwxbFll6W9oAdnC0R5VVbAJoof+p92CatHzA3reqQZmYn33IBnj+CgqeXYUsH9KX9Wnj7g2wCHc9Q==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.23.8 + peerDependenciesMeta: + react: + optional: true + ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: @@ -6641,6 +6718,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -6852,6 +6933,10 @@ packages: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} @@ -7206,6 +7291,15 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -7309,6 +7403,9 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -8137,12 +8234,27 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 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==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + 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@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-to-estree@3.1.0: resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} @@ -8155,12 +8267,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@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==} + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + hermes-estree@0.15.0: resolution: {integrity: sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==} @@ -8191,6 +8309,9 @@ packages: resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} engines: {node: '>=14'} + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -8671,11 +8792,6 @@ packages: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} @@ -8697,6 +8813,9 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -8705,6 +8824,11 @@ packages: engines: {node: '>=6'} hasBin: true + jsondiffpatch@0.6.0: + resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -8721,6 +8845,10 @@ packages: jws@3.2.2: resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + katex@0.16.21: + resolution: {integrity: sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==} + hasBin: true + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -9028,6 +9156,9 @@ packages: mdast-util-gfm@3.0.0: resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + mdast-util-mdx-expression@2.0.1: resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} @@ -9161,6 +9292,9 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + micromark-extension-mdx-expression@3.0.0: resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} @@ -9254,6 +9388,10 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} @@ -9373,6 +9511,11 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -10087,6 +10230,9 @@ packages: property-information@6.4.1: resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} + property-information@7.0.0: + resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -10244,6 +10390,12 @@ packages: react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + react-markdown@10.1.0: + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + react-medium-image-zoom@5.2.10: resolution: {integrity: sha512-JBYf4u0zsocezIDtrjwStD+8sX+c8XuLsdz+HxPbojRj0sCicua0XOQKysuPetoFyX+YgStfj+vEtZ+699O/pg==} peerDependencies: @@ -10528,6 +10680,9 @@ packages: rehype-external-links@3.0.0: resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} + rehype-katex@7.0.1: + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + rehype-recma@1.0.0: resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} @@ -10537,6 +10692,16 @@ packages: remark-gfm@4.0.0: resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-highlight@0.1.1: + resolution: {integrity: sha512-sEstDJ5RG4dVpq2swkbC8fy71ZFo0rCPxfutvVY+Z2icoSb+HsM/9frGxYDyszm1CO2kDwi0CqwwX+vRIMzplA==} + engines: {node: '>=18'} + + remark-math@6.0.0: + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} + remark-mdx@3.1.0: resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} @@ -10546,6 +10711,9 @@ packages: remark-rehype@11.1.1: resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} @@ -11152,6 +11320,11 @@ packages: svix@1.24.0: resolution: {integrity: sha512-TEznBskvdvEJElo/j7BiIZAoaQEWyj/NCmwiV0izlVRf5DnCBFdowkEXERDA3JgUlAYoAJi0S7atWit7nkTMtw==} + swr@2.3.3: + resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + tailwind-merge@1.14.0: resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} @@ -11228,6 +11401,10 @@ packages: throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -11448,6 +11625,9 @@ packages: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} @@ -11457,6 +11637,9 @@ packages: unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} @@ -11532,6 +11715,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + usehooks-ts@2.14.0: resolution: {integrity: sha512-jnhrjTRJoJS7cFxz63tRYc5mzTKf/h+Ii8P0PDHymT9qDe4ZA2/gzDRmDR4WGausg5X8wMIdghwi3BBCN9JKow==} engines: {node: '>=16.15.0'} @@ -11567,6 +11755,9 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} @@ -11585,6 +11776,9 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -11774,17 +11968,80 @@ packages: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} - zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + zod-to-json-schema@3.24.5: + resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} + peerDependencies: + zod: ^3.24.1 - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: + '@ai-sdk/anthropic@1.2.10(zod@3.24.2)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.7(zod@3.24.2) + zod: 3.24.2 + + '@ai-sdk/openai@1.3.12(zod@3.24.2)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.7(zod@3.24.2) + zod: 3.24.2 + + '@ai-sdk/provider-utils@2.2.3(zod@3.24.2)': + dependencies: + '@ai-sdk/provider': 1.1.0 + nanoid: 3.3.11 + secure-json-parse: 2.7.0 + zod: 3.24.2 + + '@ai-sdk/provider-utils@2.2.7(zod@3.24.2)': + dependencies: + '@ai-sdk/provider': 1.1.3 + nanoid: 3.3.11 + secure-json-parse: 2.7.0 + zod: 3.24.2 + + '@ai-sdk/provider@1.1.0': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@1.1.3': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/react@1.2.5(react@18.2.0)(zod@3.24.2)': + dependencies: + '@ai-sdk/provider-utils': 2.2.3(zod@3.24.2) + '@ai-sdk/ui-utils': 1.2.4(zod@3.24.2) + react: 18.2.0 + swr: 2.3.3(react@18.2.0) + throttleit: 2.1.0 + optionalDependencies: + zod: 3.24.2 + + '@ai-sdk/react@1.2.5(react@18.3.1)(zod@3.24.2)': + dependencies: + '@ai-sdk/provider-utils': 2.2.3(zod@3.24.2) + '@ai-sdk/ui-utils': 1.2.4(zod@3.24.2) + react: 18.3.1 + swr: 2.3.3(react@18.3.1) + throttleit: 2.1.0 + optionalDependencies: + zod: 3.24.2 + + '@ai-sdk/ui-utils@1.2.4(zod@3.24.2)': + dependencies: + '@ai-sdk/provider': 1.1.0 + '@ai-sdk/provider-utils': 2.2.3(zod@3.24.2) + zod: 3.24.2 + zod-to-json-schema: 3.24.5(zod@3.24.2) + '@algolia/cache-browser-local-storage@4.24.0': dependencies: '@algolia/cache-common': 4.24.0 @@ -11887,11 +12144,6 @@ snapshots: dependencies: '@babel/highlight': 7.23.4 - '@babel/code-frame@7.23.5': - dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 - '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -11900,26 +12152,6 @@ snapshots: '@babel/compat-data@7.23.5': {} - '@babel/core@7.23.9': - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) - '@babel/helpers': 7.23.9 - '@babel/parser': 7.23.9 - '@babel/template': 7.23.9 - '@babel/traverse': 7.23.9 - '@babel/types': 7.23.9 - convert-source-map: 2.0.0 - debug: 4.3.7 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/core@7.24.5': dependencies: '@ampproject/remapping': 2.2.1 @@ -11933,20 +12165,13 @@ snapshots: '@babel/traverse': 7.26.4 '@babel/types': 7.26.3 convert-source-map: 2.0.0 - debug: 4.3.7 + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.23.6': - dependencies: - '@babel/types': 7.23.9 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 - jsesc: 2.5.2 - '@babel/generator@7.26.3': dependencies: '@babel/parser': 7.26.3 @@ -11971,19 +12196,6 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.23.10(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.23.10(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 @@ -11997,43 +12209,23 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 - '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 - optional: true - - '@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.7 - lodash.debounce: 4.0.8 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color '@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.7 + debug: 4.4.0 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: - supports-color - optional: true '@babel/helper-environment-visitor@7.22.20': {} @@ -12050,10 +12242,6 @@ snapshots: dependencies: '@babel/types': 7.26.3 - '@babel/helper-module-imports@7.22.15': - dependencies: - '@babel/types': 7.23.9 - '@babel/helper-module-imports@7.25.9': dependencies: '@babel/traverse': 7.26.4 @@ -12061,33 +12249,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - - '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - - '@babel/helper-module-transforms@7.26.0(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.4 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 @@ -12103,27 +12264,12 @@ snapshots: '@babel/helper-plugin-utils@7.22.5': {} - '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 - '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 - optional: true - - '@babel/helper-replace-supers@7.22.20(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-replace-supers@7.22.20(@babel/core@7.24.5)': dependencies: @@ -12160,14 +12306,6 @@ snapshots: '@babel/template': 7.25.9 '@babel/types': 7.26.3 - '@babel/helpers@7.23.9': - dependencies: - '@babel/template': 7.23.9 - '@babel/traverse': 7.23.9 - '@babel/types': 7.23.9 - transitivePeerDependencies: - - supports-color - '@babel/helpers@7.26.0': dependencies: '@babel/template': 7.25.9 @@ -12179,10 +12317,6 @@ snapshots: chalk: 2.4.2 js-tokens: 4.0.0 - '@babel/parser@7.23.9': - dependencies: - '@babel/types': 7.23.9 - '@babel/parser@7.24.5': dependencies: '@babel/types': 7.23.9 @@ -12191,23 +12325,10 @@ snapshots: dependencies: '@babel/types': 7.26.3 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.9) '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.24.5)': dependencies: @@ -12215,28 +12336,12 @@ snapshots: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.24.5) - optional: true - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) '@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.24.5)': dependencies: @@ -12245,13 +12350,6 @@ snapshots: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - optional: true - - '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.5)': dependencies: @@ -12259,60 +12357,30 @@ snapshots: '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-proposal-decorators@7.23.9(@babel/core@7.23.9)': + '@babel/plugin-proposal-decorators@7.23.9(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) + '@babel/core': 7.24.5 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.9) - - '@babel/plugin-proposal-export-default-from@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-default-from': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.24.5) '@babel/plugin-proposal-export-default-from@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-default-from': 7.23.3(@babel/core@7.24.5) - optional: true - - '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - optional: true - - '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - optional: true - - '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.9)': - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.9 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.5)': dependencies: @@ -12323,25 +12391,11 @@ snapshots: '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.24.5) - '@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - optional: true - - '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.24.5)': dependencies: @@ -12349,280 +12403,132 @@ snapshots: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - optional: true - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - optional: true - - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - '@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-export-default-from@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-default-from@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-flow@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-flow@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-async-generator-functions@7.23.9(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) - '@babel/plugin-transform-async-generator-functions@7.23.9(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 @@ -12630,62 +12536,31 @@ snapshots: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - optional: true - - '@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) '@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.22.15 + '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - optional: true - - '@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) '@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.24.5)': dependencies: @@ -12693,19 +12568,6 @@ snapshots: '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) - optional: true - - '@babel/plugin-transform-classes@7.23.8(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 '@babel/plugin-transform-classes@7.23.8(@babel/core@7.24.5)': dependencies: @@ -12719,96 +12581,45 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 - '@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.23.9 - '@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.23.9 - - '@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.25.9 '@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) '@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - optional: true - - '@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) '@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) - optional: true - - '@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.9) '@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.24.5)': dependencies: @@ -12816,25 +12627,12 @@ snapshots: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.24.5) - '@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-for-of@7.23.6(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-function-name@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 @@ -12842,60 +12640,28 @@ snapshots: '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - optional: true - - '@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-literals@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) - '@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - optional: true - - '@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 @@ -12903,29 +12669,13 @@ snapshots: '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color - optional: true - - '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.5) + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 - - '@babel/plugin-transform-modules-systemjs@7.23.9(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.25.9 transitivePeerDependencies: - supports-color @@ -12938,15 +12688,6 @@ snapshots: '@babel/helper-validator-identifier': 7.25.9 transitivePeerDependencies: - supports-color - optional: true - - '@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color '@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.24.5)': dependencies: @@ -12955,66 +12696,29 @@ snapshots: '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color - optional: true - - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-new-target@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) '@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - optional: true - - '@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) '@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - optional: true - - '@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.9)': - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.9 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) '@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.24.5)': dependencies: @@ -13024,13 +12728,6 @@ snapshots: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.24.5) - optional: true - - '@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) '@babel/plugin-transform-object-super@7.23.3(@babel/core@7.24.5)': dependencies: @@ -13038,25 +12735,11 @@ snapshots: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.5) - '@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - optional: true - - '@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) '@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.24.5)': dependencies: @@ -13064,38 +12747,17 @@ snapshots: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - optional: true - - '@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-parameters@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) '@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.24.5)': dependencies: @@ -13104,119 +12766,66 @@ snapshots: '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) - optional: true - - '@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.9)': + '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.9 - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.9) - - '@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.5 + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.5) + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9) - '@babel/types': 7.23.9 '@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 + '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.5) - '@babel/types': 7.23.9 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.2 - '@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.2 - optional: true - - '@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-runtime@7.23.9(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.9) - babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.23.9) - babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.9) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color '@babel/plugin-transform-runtime@7.23.9(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.22.15 + '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.22.5 babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.24.5) babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.24.5) @@ -13224,69 +12833,32 @@ snapshots: semver: 6.3.1 transitivePeerDependencies: - supports-color - optional: true - - '@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-spread@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.9) '@babel/plugin-transform-typescript@7.23.6(@babel/core@7.24.5)': dependencies: @@ -13295,143 +12867,29 @@ snapshots: '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.5) - optional: true - - '@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.22.5 - optional: true - - '@babel/preset-env@7.23.9(@babel/core@7.23.9)': - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.9 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.23.9) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.9) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-async-generator-functions': 7.23.9(@babel/core@7.23.9) - '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.23.9) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.9) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-modules-systemjs': 7.23.9(@babel/core@7.23.9) - '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.9) - '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.9) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.9) - babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.9) - babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.23.9) - babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.9) - core-js-compat: 3.36.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color '@babel/preset-env@7.23.9(@babel/core@7.24.5)': dependencies: @@ -13518,21 +12976,13 @@ snapshots: semver: 6.3.1 transitivePeerDependencies: - supports-color - optional: true - '@babel/preset-flow@7.23.3(@babel/core@7.23.9)': + '@babel/preset-flow@7.23.3(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.23.9) - - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.26.3 - esutils: 2.0.3 + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.24.5) '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.5)': dependencies: @@ -13540,30 +12990,33 @@ snapshots: '@babel/helper-plugin-utils': 7.22.5 '@babel/types': 7.26.3 esutils: 2.0.3 - optional: true - '@babel/preset-react@7.23.3(@babel/core@7.23.9)': + '@babel/preset-react@7.23.3(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.9) - '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.5) + '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.24.5) + transitivePeerDependencies: + - supports-color - '@babel/preset-typescript@7.23.3(@babel/core@7.23.9)': + '@babel/preset-typescript@7.23.3(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.9) + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.24.5) + transitivePeerDependencies: + - supports-color - '@babel/register@7.23.7(@babel/core@7.23.9)': + '@babel/register@7.23.7(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.5 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -13576,33 +13029,12 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.23.9': - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 - '@babel/template@7.25.9': dependencies: '@babel/code-frame': 7.26.2 '@babel/parser': 7.26.3 '@babel/types': 7.26.3 - '@babel/traverse@7.23.9': - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 - debug: 4.3.7 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - '@babel/traverse@7.26.4': dependencies: '@babel/code-frame': 7.26.2 @@ -13610,7 +13042,7 @@ snapshots: '@babel/parser': 7.26.3 '@babel/template': 7.25.9 '@babel/types': 7.26.3 - debug: 4.3.7 + debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -13936,7 +13368,7 @@ snapshots: mv: 2.1.1 safe-json-stringify: 1.2.0 - '@expo/cli@0.17.5(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))(expo-modules-autolinking@1.10.3)': + '@expo/cli@0.17.5(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))(expo-modules-autolinking@1.10.3)': dependencies: '@babel/runtime': 7.23.9 '@expo/code-signing-certificates': 0.0.5 @@ -13946,7 +13378,7 @@ snapshots: '@expo/env': 0.2.1 '@expo/image-utils': 0.4.1 '@expo/json-file': 8.3.0 - '@expo/metro-config': 0.17.4(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))) + '@expo/metro-config': 0.17.4(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))) '@expo/osascript': 2.1.0 '@expo/package-manager': 1.4.2 '@expo/plist': 0.1.0 @@ -13965,7 +13397,7 @@ snapshots: chalk: 4.1.2 ci-info: 3.9.0 connect: 3.7.0 - debug: 4.3.7 + debug: 4.4.0 env-editor: 0.4.2 find-yarn-workspace-root: 2.0.0 form-data: 3.0.1 @@ -14089,7 +13521,7 @@ snapshots: '@expo/env@0.2.1': dependencies: chalk: 4.1.2 - debug: 4.3.7 + debug: 4.4.0 dotenv: 16.0.3 dotenv-expand: 10.0.0 getenv: 1.0.0 @@ -14129,7 +13561,7 @@ snapshots: json5: 2.2.3 write-file-atomic: 2.4.3 - '@expo/metro-config@0.17.4(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))': + '@expo/metro-config@0.17.4(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))': dependencies: '@babel/core': 7.24.5 '@babel/generator': 7.26.3 @@ -14139,10 +13571,10 @@ snapshots: '@expo/env': 0.2.1 '@expo/json-file': 8.3.0 '@expo/spawn-async': 1.7.2 - '@react-native/babel-preset': 0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)) + '@react-native/babel-preset': 0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)) babel-preset-fbjs: 3.4.0(@babel/core@7.24.5) chalk: 4.1.2 - debug: 4.3.7 + debug: 4.4.0 find-yarn-workspace-root: 2.0.0 fs-extra: 9.1.0 getenv: 1.0.0 @@ -14188,7 +13620,7 @@ snapshots: '@expo/config-types': 50.0.0 '@expo/image-utils': 0.4.1 '@expo/json-file': 8.3.0 - debug: 4.3.7 + debug: 4.4.0 expo-modules-autolinking: 1.10.3 fs-extra: 9.1.0 resolve-from: 5.0.0 @@ -14832,10 +14264,10 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@openpanel/nextjs@1.0.5(next@15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@openpanel/nextjs@1.0.5(next@15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@openpanel/web': 1.0.1 - next: 15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -14855,10 +14287,12 @@ snapshots: '@opentelemetry/api-logs@0.51.1': dependencies: - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.9.0 '@opentelemetry/api@1.8.0': {} + '@opentelemetry/api@1.9.0': {} + '@opentelemetry/auto-instrumentations-node@0.46.1(@opentelemetry/api@1.8.0)': dependencies: '@opentelemetry/api': 1.8.0 @@ -15540,10 +14974,10 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@polar-sh/sdk@0.26.1(zod@3.23.8)': + '@polar-sh/sdk@0.26.1(zod@3.24.2)': dependencies: standardwebhooks: 1.0.0 - zod: 3.23.8 + zod: 3.24.2 '@prisma/client@5.9.1(prisma@5.9.1)': optionalDependencies: @@ -17254,68 +16688,12 @@ snapshots: '@react-native/assets-registry@0.73.1': {} - '@react-native/babel-plugin-codegen@0.73.4(@babel/preset-env@7.23.9(@babel/core@7.23.9))': - dependencies: - '@react-native/codegen': 0.73.3(@babel/preset-env@7.23.9(@babel/core@7.23.9)) - transitivePeerDependencies: - - '@babel/preset-env' - - supports-color - '@react-native/babel-plugin-codegen@0.73.4(@babel/preset-env@7.23.9(@babel/core@7.24.5))': dependencies: '@react-native/codegen': 0.73.3(@babel/preset-env@7.23.9(@babel/core@7.24.5)) transitivePeerDependencies: - '@babel/preset-env' - supports-color - optional: true - - '@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))': - dependencies: - '@babel/core': 7.23.9 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.23.9) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.9) - '@babel/plugin-proposal-export-default-from': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.9) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.9) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.9) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.23.9) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.9) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-export-default-from': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.23.9) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.9) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-runtime': 7.23.9(@babel/core@7.23.9) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.9) - '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.9) - '@babel/template': 7.23.9 - '@react-native/babel-plugin-codegen': 0.73.4(@babel/preset-env@7.23.9(@babel/core@7.23.9)) - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.23.9) - react-refresh: 0.14.0 - transitivePeerDependencies: - - '@babel/preset-env' - - supports-color '@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))': dependencies: @@ -17357,31 +16735,17 @@ snapshots: '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.24.5) '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.24.5) '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.24.5) - '@babel/template': 7.23.9 + '@babel/template': 7.25.9 '@react-native/babel-plugin-codegen': 0.73.4(@babel/preset-env@7.23.9(@babel/core@7.24.5)) babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.24.5) react-refresh: 0.14.0 transitivePeerDependencies: - '@babel/preset-env' - supports-color - optional: true - - '@react-native/codegen@0.73.3(@babel/preset-env@7.23.9(@babel/core@7.23.9))': - dependencies: - '@babel/parser': 7.23.9 - '@babel/preset-env': 7.23.9(@babel/core@7.23.9) - flow-parser: 0.206.0 - glob: 7.2.3 - invariant: 2.2.4 - jscodeshift: 0.14.0(@babel/preset-env@7.23.9(@babel/core@7.23.9)) - mkdirp: 0.5.6 - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color '@react-native/codegen@0.73.3(@babel/preset-env@7.23.9(@babel/core@7.24.5))': dependencies: - '@babel/parser': 7.23.9 + '@babel/parser': 7.26.3 '@babel/preset-env': 7.23.9(@babel/core@7.24.5) flow-parser: 0.206.0 glob: 7.2.3 @@ -17391,28 +16755,6 @@ snapshots: nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - optional: true - - '@react-native/community-cli-plugin@0.73.17(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))': - dependencies: - '@react-native-community/cli-server-api': 12.3.6 - '@react-native-community/cli-tools': 12.3.6 - '@react-native/dev-middleware': 0.73.8 - '@react-native/metro-babel-transformer': 0.73.15(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)) - chalk: 4.1.2 - execa: 5.1.1 - metro: 0.80.6 - metro-config: 0.80.6 - metro-core: 0.80.6 - node-fetch: 2.7.0 - readline: 1.3.0 - transitivePeerDependencies: - - '@babel/core' - - '@babel/preset-env' - - bufferutil - - encoding - - supports-color - - utf-8-validate '@react-native/community-cli-plugin@0.73.17(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))': dependencies: @@ -17434,7 +16776,6 @@ snapshots: - encoding - supports-color - utf-8-validate - optional: true '@react-native/debugger-frontend@0.73.3': {} @@ -17461,16 +16802,6 @@ snapshots: '@react-native/js-polyfills@0.73.1': {} - '@react-native/metro-babel-transformer@0.73.15(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))': - dependencies: - '@babel/core': 7.23.9 - '@react-native/babel-preset': 0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)) - hermes-parser: 0.15.0 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@babel/preset-env' - - supports-color - '@react-native/metro-babel-transformer@0.73.15(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))': dependencies: '@babel/core': 7.24.5 @@ -17480,18 +16811,11 @@ snapshots: transitivePeerDependencies: - '@babel/preset-env' - supports-color - optional: true '@react-native/normalize-color@2.1.0': {} '@react-native/normalize-colors@0.73.2': {} - '@react-native/virtualized-lists@0.73.4(react-native@0.73.6(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))(react@18.3.1))': - dependencies: - invariant: 2.2.4 - nullthrows: 1.1.1 - react-native: 0.73.6(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))(react@18.3.1) - '@react-native/virtualized-lists@0.73.4(react-native@0.73.6(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))(react@18.2.0))': dependencies: invariant: 2.2.4 @@ -17499,6 +16823,12 @@ snapshots: react-native: 0.73.6(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))(react@18.2.0) optional: true + '@react-native/virtualized-lists@0.73.4(react-native@0.73.6(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))(react@18.3.1))': + dependencies: + invariant: 2.2.4 + nullthrows: 1.1.1 + react-native: 0.73.6(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))(react@18.3.1) + '@react-spring/animated@9.7.3(react@18.2.0)': dependencies: '@react-spring/shared': 9.7.3(react@18.2.0) @@ -17796,16 +17126,16 @@ snapshots: '@swc/counter': 0.1.3 tslib: 2.7.0 - '@t3-oss/env-core@0.7.3(typescript@5.3.3)(zod@3.22.4)': + '@t3-oss/env-core@0.7.3(typescript@5.3.3)(zod@3.24.2)': dependencies: - zod: 3.22.4 + zod: 3.24.2 optionalDependencies: typescript: 5.3.3 - '@t3-oss/env-nextjs@0.7.3(typescript@5.3.3)(zod@3.22.4)': + '@t3-oss/env-nextjs@0.7.3(typescript@5.3.3)(zod@3.24.2)': dependencies: - '@t3-oss/env-core': 0.7.3(typescript@5.3.3)(zod@3.22.4) - zod: 3.22.4 + '@t3-oss/env-core': 0.7.3(typescript@5.3.3)(zod@3.24.2) + zod: 3.24.2 optionalDependencies: typescript: 5.3.3 @@ -18093,6 +17423,8 @@ snapshots: dependencies: '@types/ms': 0.7.34 + '@types/diff-match-patch@1.0.36': {} + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.5 @@ -18166,6 +17498,8 @@ snapshots: '@types/ms': 0.7.34 '@types/node': 20.14.8 + '@types/katex@0.16.7': {} + '@types/keygrip@1.0.6': {} '@types/koa-compose@3.2.8': @@ -18205,6 +17539,10 @@ snapshots: dependencies: '@types/unist': 3.0.2 + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.2 + '@types/mdx@2.0.13': {} '@types/memcached@2.2.10': @@ -18424,6 +17762,30 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 + ai@4.2.10(react@18.2.0)(zod@3.24.2): + dependencies: + '@ai-sdk/provider': 1.1.0 + '@ai-sdk/provider-utils': 2.2.3(zod@3.24.2) + '@ai-sdk/react': 1.2.5(react@18.2.0)(zod@3.24.2) + '@ai-sdk/ui-utils': 1.2.4(zod@3.24.2) + '@opentelemetry/api': 1.9.0 + jsondiffpatch: 0.6.0 + zod: 3.24.2 + optionalDependencies: + react: 18.2.0 + + ai@4.2.10(react@18.3.1)(zod@3.24.2): + dependencies: + '@ai-sdk/provider': 1.1.0 + '@ai-sdk/provider-utils': 2.2.3(zod@3.24.2) + '@ai-sdk/react': 1.2.5(react@18.3.1)(zod@3.24.2) + '@ai-sdk/ui-utils': 1.2.4(zod@3.24.2) + '@opentelemetry/api': 1.9.0 + jsondiffpatch: 0.6.0 + zod: 3.24.2 + optionalDependencies: + react: 18.3.1 + ajv-formats@3.0.1(ajv@8.12.0): optionalDependencies: ajv: 8.12.0 @@ -18610,18 +17972,9 @@ snapshots: transitivePeerDependencies: - debug - babel-core@7.0.0-bridge.0(@babel/core@7.23.9): + babel-core@7.0.0-bridge.0(@babel/core@7.24.5): dependencies: - '@babel/core': 7.23.9 - - babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.23.9): - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.9 - '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.9) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + '@babel/core': 7.24.5 babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.24.5): dependencies: @@ -18631,15 +17984,6 @@ snapshots: semver: 6.3.1 transitivePeerDependencies: - supports-color - optional: true - - babel-plugin-polyfill-corejs3@0.9.0(@babel/core@7.23.9): - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.9) - core-js-compat: 3.36.0 - transitivePeerDependencies: - - supports-color babel-plugin-polyfill-corejs3@0.9.0(@babel/core@7.24.5): dependencies: @@ -18648,14 +17992,6 @@ snapshots: core-js-compat: 3.36.0 transitivePeerDependencies: - supports-color - optional: true - - babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.23.9): - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.9) - transitivePeerDependencies: - - supports-color babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.24.5): dependencies: @@ -18663,34 +17999,26 @@ snapshots: '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.24.5) transitivePeerDependencies: - supports-color - optional: true babel-plugin-react-native-web@0.18.12: {} babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: {} - babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.23.9): - dependencies: - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.9) - transitivePeerDependencies: - - '@babel/core' - babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.24.5): dependencies: '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.24.5) transitivePeerDependencies: - '@babel/core' - optional: true - babel-preset-expo@10.0.1(@babel/core@7.23.9): + babel-preset-expo@10.0.1(@babel/core@7.24.5): dependencies: - '@babel/plugin-proposal-decorators': 7.23.9(@babel/core@7.23.9) - '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) - '@babel/preset-env': 7.23.9(@babel/core@7.23.9) - '@babel/preset-react': 7.23.3(@babel/core@7.23.9) - '@react-native/babel-preset': 0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)) + '@babel/plugin-proposal-decorators': 7.23.9(@babel/core@7.24.5) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.24.5) + '@babel/preset-env': 7.23.9(@babel/core@7.24.5) + '@babel/preset-react': 7.23.3(@babel/core@7.24.5) + '@react-native/babel-preset': 0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)) babel-plugin-react-native-web: 0.18.12 react-refresh: 0.14.0 transitivePeerDependencies: @@ -18727,6 +18055,8 @@ snapshots: '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.24.5) '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.24.5) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 + transitivePeerDependencies: + - supports-color bail@2.0.2: {} @@ -18965,6 +18295,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.4.1: {} + character-entities-html4@2.1.0: {} character-entities-legacy@1.1.4: {} @@ -19178,6 +18510,8 @@ snapshots: commander@7.2.0: {} + commander@8.3.0: {} + commander@9.5.0: {} commondir@1.0.1: {} @@ -19188,7 +18522,7 @@ snapshots: compressible@2.0.18: dependencies: - mime-db: 1.52.0 + mime-db: 1.54.0 compression@1.7.4: dependencies: @@ -19548,6 +18882,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.0: + dependencies: + ms: 2.1.3 + decamelize@1.2.0: {} decimal.js-light@2.5.1: {} @@ -19643,6 +18981,8 @@ snapshots: didyoumean@1.2.2: {} + diff-match-patch@1.0.5: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -20116,41 +19456,41 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - expo-application@5.3.1(expo@50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))): + expo-application@5.3.1(expo@50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))): dependencies: - expo: 50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))) + expo: 50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))) - expo-asset@9.0.2(expo@50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))): + expo-asset@9.0.2(expo@50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))): dependencies: '@react-native/assets-registry': 0.73.1 blueimp-md5: 2.19.0 - expo-constants: 15.4.5(expo@50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))) - expo-file-system: 16.0.6(expo@50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))) + expo-constants: 15.4.5(expo@50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))) + expo-file-system: 16.0.6(expo@50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))) invariant: 2.2.4 md5-file: 3.2.3 transitivePeerDependencies: - expo - supports-color - expo-constants@15.4.5(expo@50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))): + expo-constants@15.4.5(expo@50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))): dependencies: '@expo/config': 8.5.4 - expo: 50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))) + expo: 50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))) transitivePeerDependencies: - supports-color - expo-file-system@16.0.6(expo@50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))): + expo-file-system@16.0.6(expo@50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))): dependencies: - expo: 50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))) + expo: 50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))) - expo-font@11.10.3(expo@50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))): + expo-font@11.10.3(expo@50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))): dependencies: - expo: 50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))) + expo: 50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))) fontfaceobserver: 2.3.0 - expo-keep-awake@12.8.2(expo@50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))): + expo-keep-awake@12.8.2(expo@50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))): dependencies: - expo: 50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))) + expo: 50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))) expo-modules-autolinking@1.10.3: dependencies: @@ -20167,19 +19507,19 @@ snapshots: dependencies: invariant: 2.2.4 - expo@50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))): + expo@50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))): dependencies: '@babel/runtime': 7.23.9 - '@expo/cli': 0.17.5(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))(expo-modules-autolinking@1.10.3) + '@expo/cli': 0.17.5(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))(expo-modules-autolinking@1.10.3) '@expo/config': 8.5.4 '@expo/config-plugins': 7.8.4 - '@expo/metro-config': 0.17.4(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))) + '@expo/metro-config': 0.17.4(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))) '@expo/vector-icons': 14.0.0 - babel-preset-expo: 10.0.1(@babel/core@7.23.9) - expo-asset: 9.0.2(expo@50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))) - expo-file-system: 16.0.6(expo@50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))) - expo-font: 11.10.3(expo@50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))) - expo-keep-awake: 12.8.2(expo@50.0.7(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)))) + babel-preset-expo: 10.0.1(@babel/core@7.24.5) + expo-asset: 9.0.2(expo@50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))) + expo-file-system: 16.0.6(expo@50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))) + expo-font: 11.10.3(expo@50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))) + expo-keep-awake: 12.8.2(expo@50.0.7(@babel/core@7.24.5)(@react-native/babel-preset@0.73.21(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)))) expo-modules-autolinking: 1.10.3 expo-modules-core: 1.11.9 fbemitter: 3.0.0 @@ -20574,7 +19914,7 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@14.1.1(@types/react@18.3.12)(algoliasearch@4.24.0)(next@15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + fumadocs-core@14.1.1(@types/react@18.3.12)(algoliasearch@4.24.0)(next@15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@formatjs/intl-localematcher': 0.5.6 '@orama/orama': 3.0.1 @@ -20592,14 +19932,14 @@ snapshots: unist-util-visit: 5.0.0 optionalDependencies: algoliasearch: 4.24.0 - next: 15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - '@types/react' - supports-color - fumadocs-mdx@11.1.1(acorn@8.11.3)(fumadocs-core@14.1.1(@types/react@18.3.12)(algoliasearch@4.24.0)(next@15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(next@15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + fumadocs-mdx@11.1.1(acorn@8.11.3)(fumadocs-core@14.1.1(@types/react@18.3.12)(algoliasearch@4.24.0)(next@15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(next@15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: '@mdx-js/mdx': 3.1.0(acorn@8.11.3) chokidar: 4.0.1 @@ -20607,16 +19947,16 @@ snapshots: esbuild: 0.24.0 estree-util-value-to-estree: 3.1.2 fast-glob: 3.3.2 - fumadocs-core: 14.1.1(@types/react@18.3.12)(algoliasearch@4.24.0)(next@15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + fumadocs-core: 14.1.1(@types/react@18.3.12)(algoliasearch@4.24.0)(next@15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) gray-matter: 4.0.3 micromatch: 4.0.8 - next: 15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - zod: 3.22.4 + next: 15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + zod: 3.24.2 transitivePeerDependencies: - acorn - supports-color - fumadocs-ui@14.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(next@15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + fumadocs-ui@14.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(next@15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@radix-ui/react-accordion': 1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-collapsible': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -20630,8 +19970,8 @@ snapshots: '@tailwindcss/typography': 0.5.15(tailwindcss@3.4.17) class-variance-authority: 0.7.1 cmdk: 1.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - fumadocs-core: 14.1.1(@types/react@18.3.12)(algoliasearch@4.24.0)(next@15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next: 15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + fumadocs-core: 14.1.1(@types/react@18.3.12)(algoliasearch@4.24.0)(next@15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -20693,9 +20033,9 @@ snapshots: dependencies: next: 14.2.1(@babel/core@7.24.5)(@opentelemetry/api@1.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - geist@1.3.1(next@15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + geist@1.3.1(next@15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: - next: 15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) generic-pool@3.9.0: {} @@ -20852,12 +20192,49 @@ 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 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.1.2 + vfile: 6.0.1 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.0.0 + vfile: 6.0.1 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + hast-util-is-element@3.0.0: dependencies: '@types/hast': 3.0.4 hast-util-parse-selector@2.2.5: {} + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-estree@3.1.0: dependencies: '@types/estree': 1.0.5 @@ -20917,6 +20294,13 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -20929,6 +20313,14 @@ snapshots: property-information: 5.6.0 space-separated-tokens: 1.1.5 + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + hermes-estree@0.15.0: {} hermes-estree@0.19.1: {} @@ -20963,6 +20355,8 @@ snapshots: htmlparser2: 8.0.2 selderee: 0.11.0 + html-url-attributes@3.0.1: {} + html-void-elements@3.0.0: {} htmlparser2@8.0.2: @@ -21432,44 +20826,19 @@ snapshots: jsc-safe-url@0.2.4: {} - jscodeshift@0.14.0(@babel/preset-env@7.23.9(@babel/core@7.23.9)): - dependencies: - '@babel/core': 7.23.9 - '@babel/parser': 7.23.9 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.9) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.9) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.9) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) - '@babel/preset-env': 7.23.9(@babel/core@7.23.9) - '@babel/preset-flow': 7.23.3(@babel/core@7.23.9) - '@babel/preset-typescript': 7.23.3(@babel/core@7.23.9) - '@babel/register': 7.23.7(@babel/core@7.23.9) - babel-core: 7.0.0-bridge.0(@babel/core@7.23.9) - chalk: 4.1.2 - flow-parser: 0.206.0 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - neo-async: 2.6.2 - node-dir: 0.1.17 - recast: 0.21.5 - temp: 0.8.4 - write-file-atomic: 2.4.3 - transitivePeerDependencies: - - supports-color - jscodeshift@0.14.0(@babel/preset-env@7.23.9(@babel/core@7.24.5)): dependencies: - '@babel/core': 7.23.9 - '@babel/parser': 7.23.9 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.9) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.9) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.9) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) + '@babel/core': 7.24.5 + '@babel/parser': 7.26.3 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.5) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.5) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.5) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.24.5) '@babel/preset-env': 7.23.9(@babel/core@7.24.5) - '@babel/preset-flow': 7.23.3(@babel/core@7.23.9) - '@babel/preset-typescript': 7.23.3(@babel/core@7.23.9) - '@babel/register': 7.23.7(@babel/core@7.23.9) - babel-core: 7.0.0-bridge.0(@babel/core@7.23.9) + '@babel/preset-flow': 7.23.3(@babel/core@7.24.5) + '@babel/preset-typescript': 7.23.3(@babel/core@7.24.5) + '@babel/register': 7.23.7(@babel/core@7.24.5) + babel-core: 7.0.0-bridge.0(@babel/core@7.24.5) chalk: 4.1.2 flow-parser: 0.206.0 graceful-fs: 4.2.11 @@ -21481,12 +20850,9 @@ snapshots: write-file-atomic: 2.4.3 transitivePeerDependencies: - supports-color - optional: true jsesc@0.5.0: {} - jsesc@2.5.2: {} - jsesc@3.0.2: {} json-bigint@1.0.0: @@ -21512,10 +20878,18 @@ snapshots: json-schema-traverse@1.0.0: {} + json-schema@0.4.0: {} + json-stringify-safe@5.0.1: {} json5@2.2.3: {} + jsondiffpatch@0.6.0: + dependencies: + '@types/diff-match-patch': 1.0.36 + chalk: 5.4.1 + diff-match-patch: 1.0.5 + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -21550,6 +20924,10 @@ snapshots: jwa: 1.4.1 safe-buffer: 5.2.1 + katex@0.16.21: + dependencies: + commander: 8.3.0 + kind-of@6.0.3: {} kleur@3.0.3: {} @@ -21800,14 +21178,14 @@ snapshots: mdast-util-find-and-replace@3.0.1: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 mdast-util-from-markdown@2.0.2: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 '@types/unist': 3.0.2 decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -21824,7 +21202,7 @@ snapshots: mdast-util-gfm-autolink-literal@2.0.1: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 ccount: 2.0.1 devlop: 1.1.0 mdast-util-find-and-replace: 3.0.1 @@ -21832,7 +21210,7 @@ snapshots: mdast-util-gfm-footnote@2.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.1 @@ -21842,7 +21220,7 @@ snapshots: mdast-util-gfm-strikethrough@2.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.1 transitivePeerDependencies: @@ -21850,7 +21228,7 @@ snapshots: mdast-util-gfm-table@2.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.3 mdast-util-from-markdown: 2.0.2 @@ -21860,7 +21238,7 @@ snapshots: mdast-util-gfm-task-list-item@2.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.1 @@ -21879,11 +21257,23 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-math@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.1 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + mdast-util-mdx-expression@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.1 @@ -21894,7 +21284,7 @@ snapshots: dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 '@types/unist': 3.0.2 ccount: 2.0.1 devlop: 1.1.0 @@ -21921,7 +21311,7 @@ snapshots: dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.1 @@ -21930,13 +21320,13 @@ snapshots: mdast-util-phrasing@4.1.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 unist-util-is: 6.0.0 mdast-util-to-hast@13.1.0: dependencies: '@types/hast': 3.0.4 - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 '@ungap/structured-clone': 1.2.0 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.0 @@ -21947,7 +21337,7 @@ snapshots: mdast-util-to-markdown@2.1.1: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 '@types/unist': 3.0.2 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 @@ -21959,7 +21349,7 @@ snapshots: mdast-util-to-string@4.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 media-typer@0.3.0: {} @@ -22221,6 +21611,16 @@ snapshots: micromark-util-combine-extensions: 2.0.0 micromark-util-types: 2.0.0 + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.7 + devlop: 1.1.0 + katex: 0.16.21 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + micromark-extension-mdx-expression@3.0.0: dependencies: '@types/estree': 1.0.5 @@ -22422,6 +21822,8 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 @@ -22534,6 +21936,8 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 + nanoid@3.3.11: {} + nanoid@3.3.7: {} nanoid@5.0.7: {} @@ -22601,7 +22005,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@14.2.1(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.2.0))(react@18.2.0): + next@14.2.1(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.2.0))(react@18.2.0): dependencies: '@next/env': 14.2.1 '@swc/helpers': 0.5.5 @@ -22622,12 +22026,12 @@ snapshots: '@next/swc-win32-arm64-msvc': 14.2.1 '@next/swc-win32-ia32-msvc': 14.2.1 '@next/swc-win32-x64-msvc': 14.2.1 - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.9.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@15.0.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@15.0.3(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 15.0.3 '@swc/counter': 0.1.3 @@ -22647,13 +22051,13 @@ snapshots: '@next/swc-linux-x64-musl': 15.0.3 '@next/swc-win32-arm64-msvc': 15.0.3 '@next/swc-win32-x64-msvc': 15.0.3 - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.9.0 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@15.0.4(@babel/core@7.24.5)(@opentelemetry/api@1.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + next@15.0.4(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@next/env': 15.0.4 '@swc/counter': 0.1.3 @@ -22673,7 +22077,7 @@ snapshots: '@next/swc-linux-x64-musl': 15.0.4 '@next/swc-win32-arm64-msvc': 15.0.4 '@next/swc-win32-x64-msvc': 15.0.4 - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.9.0 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' @@ -23271,6 +22675,8 @@ snapshots: property-information@6.4.1: {} + property-information@7.0.0: {} + proto-list@1.2.4: {} protobufjs@7.4.0: @@ -23435,7 +22841,7 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-email@3.0.4(@opentelemetry/api@1.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-email@3.0.4(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/core': 7.24.5 '@babel/parser': 7.24.5 @@ -23447,7 +22853,7 @@ snapshots: glob: 10.3.4 log-symbols: 4.1.0 mime-types: 2.1.35 - next: 15.0.4(@babel/core@7.24.5)(@opentelemetry/api@1.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + next: 15.0.4(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) normalize-path: 3.0.0 ora: 5.4.1 socket.io: 4.8.0 @@ -23479,60 +22885,29 @@ snapshots: react-is@18.2.0: {} + react-markdown@10.1.0(@types/react@18.2.56)(react@18.2.0): + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + '@types/react': 18.2.56 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.2 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.1.0 + react: 18.2.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + react-medium-image-zoom@5.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-native@0.73.6(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))(react@18.3.1): - dependencies: - '@jest/create-cache-key-function': 29.7.0 - '@react-native-community/cli': 12.3.6 - '@react-native-community/cli-platform-android': 12.3.6 - '@react-native-community/cli-platform-ios': 12.3.6 - '@react-native/assets-registry': 0.73.1 - '@react-native/codegen': 0.73.3(@babel/preset-env@7.23.9(@babel/core@7.23.9)) - '@react-native/community-cli-plugin': 0.73.17(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9)) - '@react-native/gradle-plugin': 0.73.4 - '@react-native/js-polyfills': 0.73.1 - '@react-native/normalize-colors': 0.73.2 - '@react-native/virtualized-lists': 0.73.4(react-native@0.73.6(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))(react@18.3.1)) - abort-controller: 3.0.0 - anser: 1.4.10 - ansi-regex: 5.0.1 - base64-js: 1.5.1 - chalk: 4.1.2 - deprecated-react-native-prop-types: 5.0.0 - event-target-shim: 5.0.1 - flow-enums-runtime: 0.0.6 - invariant: 2.2.4 - jest-environment-node: 29.7.0 - jsc-android: 250231.0.0 - memoize-one: 5.2.1 - metro-runtime: 0.80.6 - metro-source-map: 0.80.6 - mkdirp: 0.5.6 - nullthrows: 1.1.1 - pretty-format: 26.6.2 - promise: 8.3.0 - react: 18.3.1 - react-devtools-core: 4.28.5 - react-refresh: 0.14.0 - react-shallow-renderer: 16.15.0(react@18.3.1) - regenerator-runtime: 0.13.11 - scheduler: 0.24.0-canary-efb381bbf-20230505 - stacktrace-parser: 0.1.10 - whatwg-fetch: 3.6.20 - ws: 6.2.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@babel/core' - - '@babel/preset-env' - - bufferutil - - encoding - - supports-color - - utf-8-validate - react-native@0.73.6(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))(react@18.2.0): dependencies: '@jest/create-cache-key-function': 29.7.0 @@ -23583,6 +22958,55 @@ snapshots: - utf-8-validate optional: true + react-native@0.73.6(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))(react@18.3.1): + dependencies: + '@jest/create-cache-key-function': 29.7.0 + '@react-native-community/cli': 12.3.6 + '@react-native-community/cli-platform-android': 12.3.6 + '@react-native-community/cli-platform-ios': 12.3.6 + '@react-native/assets-registry': 0.73.1 + '@react-native/codegen': 0.73.3(@babel/preset-env@7.23.9(@babel/core@7.24.5)) + '@react-native/community-cli-plugin': 0.73.17(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5)) + '@react-native/gradle-plugin': 0.73.4 + '@react-native/js-polyfills': 0.73.1 + '@react-native/normalize-colors': 0.73.2 + '@react-native/virtualized-lists': 0.73.4(react-native@0.73.6(@babel/core@7.24.5)(@babel/preset-env@7.23.9(@babel/core@7.24.5))(react@18.3.1)) + abort-controller: 3.0.0 + anser: 1.4.10 + ansi-regex: 5.0.1 + base64-js: 1.5.1 + chalk: 4.1.2 + deprecated-react-native-prop-types: 5.0.0 + event-target-shim: 5.0.1 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + jest-environment-node: 29.7.0 + jsc-android: 250231.0.0 + memoize-one: 5.2.1 + metro-runtime: 0.80.6 + metro-source-map: 0.80.6 + mkdirp: 0.5.6 + nullthrows: 1.1.1 + pretty-format: 26.6.2 + promise: 8.3.0 + react: 18.3.1 + react-devtools-core: 4.28.5 + react-refresh: 0.14.0 + react-shallow-renderer: 16.15.0(react@18.3.1) + regenerator-runtime: 0.13.11 + scheduler: 0.24.0-canary-efb381bbf-20230505 + stacktrace-parser: 0.1.10 + whatwg-fetch: 3.6.20 + ws: 6.2.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@babel/core' + - '@babel/preset-env' + - bufferutil + - encoding + - supports-color + - utf-8-validate + react-path-tooltip@1.0.25(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: react: 18.2.0 @@ -23949,6 +23373,16 @@ snapshots: space-separated-tokens: 2.0.2 unist-util-visit: 5.0.0 + rehype-katex@7.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.7 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.2 + katex: 0.16.21 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.1 + rehype-recma@1.0.0: dependencies: '@types/estree': 1.0.5 @@ -23961,7 +23395,7 @@ snapshots: remark-gfm@4.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 mdast-util-gfm: 3.0.0 micromark-extension-gfm: 3.0.0 remark-parse: 11.0.0 @@ -23970,6 +23404,33 @@ snapshots: transitivePeerDependencies: - supports-color + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-highlight@0.1.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-find-and-replace: 3.0.1 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + remark-math@6.0.0: + dependencies: + '@types/mdast': 4.0.3 + mdast-util-math: 3.0.0 + micromark-extension-math: 3.1.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + remark-mdx@3.1.0: dependencies: mdast-util-mdx: 3.0.0 @@ -23989,20 +23450,28 @@ snapshots: remark-rehype@11.1.1: dependencies: '@types/hast': 3.0.4 - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.1.0 + unified: 11.0.5 + vfile: 6.0.1 + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 mdast-util-to-hast: 13.1.0 unified: 11.0.5 vfile: 6.0.1 remark-stringify@11.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 mdast-util-to-markdown: 2.1.1 unified: 11.0.5 remark@15.0.1: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 remark-parse: 11.0.0 remark-stringify: 11.0.0 unified: 11.0.5 @@ -24066,10 +23535,10 @@ snapshots: dependencies: path-parse: 1.0.7 - responsive-react-email@0.0.5(react-email@3.0.4(@opentelemetry/api@1.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0): + responsive-react-email@0.0.5(react-email@3.0.4(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0): dependencies: react: 18.2.0 - react-email: 3.0.4(@opentelemetry/api@1.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-email: 3.0.4(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) restore-cursor@2.0.0: dependencies: @@ -24655,6 +24124,18 @@ snapshots: transitivePeerDependencies: - encoding + swr@2.3.3(react@18.2.0): + dependencies: + dequal: 2.0.3 + react: 18.2.0 + use-sync-external-store: 1.5.0(react@18.2.0) + + swr@2.3.3(react@18.3.1): + dependencies: + dequal: 2.0.3 + react: 18.3.1 + use-sync-external-store: 1.5.0(react@18.3.1) + tailwind-merge@1.14.0: {} tailwind-merge@2.5.4: {} @@ -24786,6 +24267,8 @@ snapshots: throat@5.0.0: {} + throttleit@2.1.0: {} + through2@2.0.5: dependencies: readable-stream: 2.3.8 @@ -25029,6 +24512,11 @@ snapshots: dependencies: crypto-random-string: 2.0.0 + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.2 @@ -25041,6 +24529,11 @@ snapshots: dependencies: '@types/unist': 3.0.2 + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.2 @@ -25126,6 +24619,14 @@ snapshots: dependencies: react: 18.2.0 + use-sync-external-store@1.5.0(react@18.2.0): + dependencies: + react: 18.2.0 + + use-sync-external-store@1.5.0(react@18.3.1): + dependencies: + react: 18.3.1 + usehooks-ts@2.14.0(react@18.2.0): dependencies: lodash.debounce: 4.0.8 @@ -25149,6 +24650,11 @@ snapshots: vary@1.1.2: {} + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.2 + vfile: 6.0.1 + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.2 @@ -25187,6 +24693,8 @@ snapshots: dependencies: defaults: 1.0.4 + web-namespaces@2.0.1: {} + web-streams-polyfill@3.3.3: {} webidl-conversions@3.0.1: {} @@ -25375,8 +24883,10 @@ snapshots: yoctocolors-cjs@2.1.2: {} - zod@3.22.4: {} + zod-to-json-schema@3.24.5(zod@3.24.2): + dependencies: + zod: 3.24.2 - zod@3.23.8: {} + zod@3.24.2: {} zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 71f1c669..73b3f4f1 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,8 @@ packages: - - 'apps/*' - - 'packages/**' - - 'tooling/*' + - "apps/*" + - "packages/**" + - "tooling/*" + +# Define a catalog of version ranges. +catalog: + zod: ^3.24.2