From 158d26f7c2ae3309273ef3328c16e69be867682a Mon Sep 17 00:00:00 2001 From: Harshith Mullapudi Date: Tue, 8 Jul 2025 10:36:14 +0530 Subject: [PATCH] Feat: add conversation API --- apps/webapp/app/components/graph/graph.tsx | 1 - ...i.v1.conversation.$conversationId.read.tsx | 39 ++ ...pi.v1.conversation.$conversationId.run.tsx | 44 ++ ...i.v1.conversation.$conversationId.stop.tsx | 40 ++ .../api.v1.conversation.$conversationId.tsx | 50 ++ .../app/routes/api.v1.conversation._index.tsx | 37 ++ .../app/services/conversation.server.ts | 228 +++++++ .../routeBuilders/apiBuilder.server.ts | 2 - apps/webapp/app/trigger/chat/chat-utils.ts | 2 +- .../conversation/create-conversation-title.ts | 62 ++ .../webapp/app/trigger/conversation/prompt.ts | 28 + .../integrations/integration-run-schedule.ts | 64 +- .../trigger/integrations/integration-run.ts | 149 +++-- .../app/trigger/integrations/scheduler.ts | 106 ++-- apps/webapp/package.json | 4 +- apps/webapp/trigger.config.ts | 3 +- package.json | 3 +- packages/sdk/.eslintrc.js | 9 + packages/sdk/.prettierrc.json | 4 + packages/sdk/package.json | 49 ++ packages/sdk/src/index.ts | 1 + packages/sdk/tsconfig.json | 38 ++ packages/sdk/tsup.config.ts | 22 + packages/types/src/index.ts | 1 + packages/types/src/user/index.ts | 5 + pnpm-lock.yaml | 564 ++++++++++++++++-- turbo.json | 3 + 27 files changed, 1349 insertions(+), 209 deletions(-) create mode 100644 apps/webapp/app/routes/api.v1.conversation.$conversationId.read.tsx create mode 100644 apps/webapp/app/routes/api.v1.conversation.$conversationId.run.tsx create mode 100644 apps/webapp/app/routes/api.v1.conversation.$conversationId.stop.tsx create mode 100644 apps/webapp/app/routes/api.v1.conversation.$conversationId.tsx create mode 100644 apps/webapp/app/routes/api.v1.conversation._index.tsx create mode 100644 apps/webapp/app/services/conversation.server.ts create mode 100644 apps/webapp/app/trigger/conversation/create-conversation-title.ts create mode 100644 apps/webapp/app/trigger/conversation/prompt.ts create mode 100644 packages/sdk/.eslintrc.js create mode 100644 packages/sdk/.prettierrc.json create mode 100644 packages/sdk/package.json create mode 100644 packages/sdk/src/index.ts create mode 100644 packages/sdk/tsconfig.json create mode 100644 packages/sdk/tsup.config.ts create mode 100644 packages/types/src/user/index.ts diff --git a/apps/webapp/app/components/graph/graph.tsx b/apps/webapp/app/components/graph/graph.tsx index 54d772b..f179c28 100644 --- a/apps/webapp/app/components/graph/graph.tsx +++ b/apps/webapp/app/components/graph/graph.tsx @@ -382,7 +382,6 @@ export const Graph = forwardRef( // Node click handler sigma.on("clickNode", (event) => { - console.log(event); const { node } = event; // resetHighlights(); if (onNodeClick) { diff --git a/apps/webapp/app/routes/api.v1.conversation.$conversationId.read.tsx b/apps/webapp/app/routes/api.v1.conversation.$conversationId.read.tsx new file mode 100644 index 0000000..a03d341 --- /dev/null +++ b/apps/webapp/app/routes/api.v1.conversation.$conversationId.read.tsx @@ -0,0 +1,39 @@ +import { json } from "@remix-run/node"; +import { createActionApiRoute } from "~/services/routeBuilders/apiBuilder.server"; + +import { getWorkspaceByUser } from "~/models/workspace.server"; +import { + createConversation, + CreateConversationSchema, + readConversation, +} from "~/services/conversation.server"; +import { z } from "zod"; + +export const ConversationIdSchema = z.object({ + conversationId: z.string(), +}); + +const { action, loader } = createActionApiRoute( + { + params: ConversationIdSchema, + allowJWT: true, + authorization: { + action: "oauth", + }, + corsStrategy: "all", + }, + async ({ authentication, params }) => { + const workspace = await getWorkspaceByUser(authentication.userId); + + if (!workspace) { + throw new Error("No workspace found"); + } + + // Call the service to get the redirect URL + const read = await readConversation(params.conversationId); + + return json(read); + }, +); + +export { action, loader }; diff --git a/apps/webapp/app/routes/api.v1.conversation.$conversationId.run.tsx b/apps/webapp/app/routes/api.v1.conversation.$conversationId.run.tsx new file mode 100644 index 0000000..9adee5c --- /dev/null +++ b/apps/webapp/app/routes/api.v1.conversation.$conversationId.run.tsx @@ -0,0 +1,44 @@ +import { json } from "@remix-run/node"; +import { createActionApiRoute } from "~/services/routeBuilders/apiBuilder.server"; + +import { getWorkspaceByUser } from "~/models/workspace.server"; +import { + createConversation, + CreateConversationSchema, + getCurrentConversationRun, + readConversation, + stopConversation, +} from "~/services/conversation.server"; +import { z } from "zod"; + +export const ConversationIdSchema = z.object({ + conversationId: z.string(), +}); + +const { action, loader } = createActionApiRoute( + { + params: ConversationIdSchema, + allowJWT: true, + authorization: { + action: "oauth", + }, + corsStrategy: "all", + }, + async ({ authentication, params }) => { + const workspace = await getWorkspaceByUser(authentication.userId); + + if (!workspace) { + throw new Error("No workspace found"); + } + + // Call the service to get the redirect URL + const run = await getCurrentConversationRun( + params.conversationId, + workspace?.id, + ); + + return json(run); + }, +); + +export { action, loader }; diff --git a/apps/webapp/app/routes/api.v1.conversation.$conversationId.stop.tsx b/apps/webapp/app/routes/api.v1.conversation.$conversationId.stop.tsx new file mode 100644 index 0000000..e469908 --- /dev/null +++ b/apps/webapp/app/routes/api.v1.conversation.$conversationId.stop.tsx @@ -0,0 +1,40 @@ +import { json } from "@remix-run/node"; +import { createActionApiRoute } from "~/services/routeBuilders/apiBuilder.server"; + +import { getWorkspaceByUser } from "~/models/workspace.server"; +import { + createConversation, + CreateConversationSchema, + readConversation, + stopConversation, +} from "~/services/conversation.server"; +import { z } from "zod"; + +export const ConversationIdSchema = z.object({ + conversationId: z.string(), +}); + +const { action, loader } = createActionApiRoute( + { + params: ConversationIdSchema, + allowJWT: true, + authorization: { + action: "oauth", + }, + corsStrategy: "all", + }, + async ({ authentication, params }) => { + const workspace = await getWorkspaceByUser(authentication.userId); + + if (!workspace) { + throw new Error("No workspace found"); + } + + // Call the service to get the redirect URL + const stop = await stopConversation(params.conversationId, workspace?.id); + + return json(stop); + }, +); + +export { action, loader }; diff --git a/apps/webapp/app/routes/api.v1.conversation.$conversationId.tsx b/apps/webapp/app/routes/api.v1.conversation.$conversationId.tsx new file mode 100644 index 0000000..b49e3e3 --- /dev/null +++ b/apps/webapp/app/routes/api.v1.conversation.$conversationId.tsx @@ -0,0 +1,50 @@ +import { json } from "@remix-run/node"; +import { createActionApiRoute } from "~/services/routeBuilders/apiBuilder.server"; + +import { getWorkspaceByUser } from "~/models/workspace.server"; +import { + getConversation, + deleteConversation, +} from "~/services/conversation.server"; +import { z } from "zod"; + +export const ConversationIdSchema = z.object({ + conversationId: z.string(), +}); + +const { action, loader } = createActionApiRoute( + { + params: ConversationIdSchema, + allowJWT: true, + authorization: { + action: "oauth", + }, + corsStrategy: "all", + }, + async ({ params, authentication, request }) => { + const workspace = await getWorkspaceByUser(authentication.userId); + + if (!workspace) { + throw new Error("No workspace found"); + } + + const method = request.method; + + if (method === "GET") { + // Get a conversation by ID + const conversation = await getConversation(params.conversationId); + return json(conversation); + } + + if (method === "DELETE") { + // Soft delete a conversation + const deleted = await deleteConversation(params.conversationId); + return json(deleted); + } + + // Method not allowed + return new Response("Method Not Allowed", { status: 405 }); + }, +); + +export { action, loader }; diff --git a/apps/webapp/app/routes/api.v1.conversation._index.tsx b/apps/webapp/app/routes/api.v1.conversation._index.tsx new file mode 100644 index 0000000..70e6793 --- /dev/null +++ b/apps/webapp/app/routes/api.v1.conversation._index.tsx @@ -0,0 +1,37 @@ +import { json } from "@remix-run/node"; +import { createActionApiRoute } from "~/services/routeBuilders/apiBuilder.server"; + +import { getWorkspaceByUser } from "~/models/workspace.server"; +import { + createConversation, + CreateConversationSchema, +} from "~/services/conversation.server"; + +const { action, loader } = createActionApiRoute( + { + body: CreateConversationSchema, + allowJWT: true, + authorization: { + action: "oauth", + }, + corsStrategy: "all", + }, + async ({ body, authentication }) => { + const workspace = await getWorkspaceByUser(authentication.userId); + + if (!workspace) { + throw new Error("No workspace found"); + } + + // Call the service to get the redirect URL + const conversation = await createConversation( + workspace?.id, + authentication.userId, + body, + ); + + return json(conversation); + }, +); + +export { action, loader }; diff --git a/apps/webapp/app/services/conversation.server.ts b/apps/webapp/app/services/conversation.server.ts new file mode 100644 index 0000000..910897c --- /dev/null +++ b/apps/webapp/app/services/conversation.server.ts @@ -0,0 +1,228 @@ +import { UserTypeEnum } from "@core/types"; + +import { auth, runs, tasks } from "@trigger.dev/sdk/v3"; +import { prisma } from "~/db.server"; +import { getOrCreatePersonalAccessToken } from "./personalAccessToken.server"; +import { createConversationTitle } from "~/trigger/conversation/create-conversation-title"; + +import { z } from "zod"; + +export const CreateConversationSchema = z.object({ + message: z.string(), + title: z.string().optional(), + conversationId: z.string().optional(), +}); + +export type CreateConversationDto = z.infer; + +// Create a new conversation +export async function createConversation( + workspaceId: string, + userId: string, + conversationData: CreateConversationDto, +) { + const { title, conversationId, ...otherData } = conversationData; + // Ensure PAT exists for the user + await getOrCreatePersonalAccessToken({ name: "trigger", userId }); + + if (conversationId) { + // Add a new message to an existing conversation + const conversationHistory = await prisma.conversationHistory.create({ + data: { + ...otherData, + userType: UserTypeEnum.User, + ...(userId && { + user: { + connect: { id: userId }, + }, + }), + conversation: { + connect: { id: conversationId }, + }, + }, + include: { + conversation: true, + }, + }); + + // No context logic here + const handler = await tasks.trigger( + "chat", + { + conversationHistoryId: conversationHistory.id, + conversationId: conversationHistory.conversation.id, + }, + { tags: [conversationHistory.id, workspaceId, conversationId] }, + ); + + return { + id: handler.id, + token: handler.publicAccessToken, + conversationId: conversationHistory.conversation.id, + conversationHistoryId: conversationHistory.id, + }; + } + + // Create a new conversation and its first message + const conversation = await prisma.conversation.create({ + data: { + workspaceId, + userId, + title: + title?.substring(0, 100) ?? conversationData.message.substring(0, 100), + ConversationHistory: { + create: { + userId, + userType: UserTypeEnum.User, + ...otherData, + }, + }, + }, + include: { + ConversationHistory: true, + }, + }); + + const conversationHistory = conversation.ConversationHistory[0]; + + // Trigger conversation title task + await tasks.trigger( + createConversationTitle.id, + { + conversationId: conversation.id, + message: conversationData.message, + }, + { tags: [conversation.id, workspaceId] }, + ); + + const handler = await tasks.trigger( + "chat", + { + conversationHistoryId: conversationHistory.id, + conversationId: conversation.id, + }, + { tags: [conversationHistory.id, workspaceId, conversation.id] }, + ); + + return { + id: handler.id, + token: handler.publicAccessToken, + conversationId: conversation.id, + conversationHistoryId: conversationHistory.id, + }; +} + +// Get a conversation by ID +export async function getConversation(conversationId: string) { + return prisma.conversation.findUnique({ + where: { id: conversationId }, + }); +} + +// Delete a conversation (soft delete) +export async function deleteConversation(conversationId: string) { + return prisma.conversation.update({ + where: { id: conversationId }, + data: { + deleted: new Date().toISOString(), + }, + }); +} + +// Mark a conversation as read +export async function readConversation(conversationId: string) { + return prisma.conversation.update({ + where: { id: conversationId }, + data: { unread: false }, + }); +} + +export async function getCurrentConversationRun( + conversationId: string, + workspaceId: string, +) { + const conversationHistory = await prisma.conversationHistory.findFirst({ + where: { + conversationId, + conversation: { + workspaceId, + }, + }, + orderBy: { + updatedAt: "desc", + }, + }); + + if (!conversationHistory) { + throw new Error("No run found"); + } + + const response = await runs.list({ + tag: [conversationId, conversationHistory.id], + status: ["QUEUED", "EXECUTING"], + limit: 1, + }); + + const run = response.data[0]; + if (!run) { + return undefined; + } + + const publicToken = await auth.createPublicToken({ + scopes: { + read: { + runs: [run.id], + }, + }, + }); + + return { + id: run.id, + token: publicToken, + conversationId, + conversationHistoryId: conversationHistory.id, + }; +} + +export async function stopConversation( + conversationId: string, + workspaceId: string, +) { + const conversationHistory = await prisma.conversationHistory.findFirst({ + where: { + conversationId, + conversation: { + workspaceId, + }, + }, + orderBy: { + updatedAt: "desc", + }, + }); + + if (!conversationHistory) { + throw new Error("No run found"); + } + + const response = await runs.list({ + tag: [conversationId, conversationHistory.id], + status: ["QUEUED", "EXECUTING"], + limit: 1, + }); + + const run = response.data[0]; + if (!run) { + await prisma.conversation.update({ + where: { + id: conversationId, + }, + data: { + status: "failed", + }, + }); + + return undefined; + } + + return await runs.cancel(run.id); +} diff --git a/apps/webapp/app/services/routeBuilders/apiBuilder.server.ts b/apps/webapp/app/services/routeBuilders/apiBuilder.server.ts index 4bd8718..f922700 100644 --- a/apps/webapp/app/services/routeBuilders/apiBuilder.server.ts +++ b/apps/webapp/app/services/routeBuilders/apiBuilder.server.ts @@ -397,8 +397,6 @@ export function createActionApiRoute< maxContentLength, } = options; - console.log(options); - async function loader({ request, params }: LoaderFunctionArgs) { if (corsStrategy !== "none" && request.method.toUpperCase() === "OPTIONS") { return apiCors(request, json({})); diff --git a/apps/webapp/app/trigger/chat/chat-utils.ts b/apps/webapp/app/trigger/chat/chat-utils.ts index b0c33b0..573a653 100644 --- a/apps/webapp/app/trigger/chat/chat-utils.ts +++ b/apps/webapp/app/trigger/chat/chat-utils.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { ActionStatusEnum, LLMMappings } from "@core/types"; +import { ActionStatusEnum } from "@core/types"; import { logger } from "@trigger.dev/sdk/v3"; import { type CoreMessage, diff --git a/apps/webapp/app/trigger/conversation/create-conversation-title.ts b/apps/webapp/app/trigger/conversation/create-conversation-title.ts new file mode 100644 index 0000000..ed66966 --- /dev/null +++ b/apps/webapp/app/trigger/conversation/create-conversation-title.ts @@ -0,0 +1,62 @@ +import { PrismaClient } from "@prisma/client"; +import { LLMMappings } from "@core/types"; +import { logger, task } from "@trigger.dev/sdk/v3"; +import { generate } from "../chat/stream-utils"; +import { conversationTitlePrompt } from "./prompt"; + +const prisma = new PrismaClient(); +export const createConversationTitle = task({ + id: "create-conversation-title", + run: async (payload: { conversationId: string; message: string }) => { + let conversationTitleResponse = ""; + const gen = generate( + [ + { + role: "user", + content: conversationTitlePrompt.replace( + "{{message}}", + payload.message, + ), + }, + ], + false, + () => {}, + undefined, + "", + LLMMappings.CLAUDESONNET, + ); + + for await (const chunk of gen) { + if (typeof chunk === "string") { + conversationTitleResponse += chunk; + } else if (chunk && typeof chunk === "object" && chunk.message) { + conversationTitleResponse += chunk.message; + } + } + + const outputMatch = conversationTitleResponse.match( + /(.*?)<\/output>/s, + ); + + logger.info(`Conversation title data: ${JSON.stringify(outputMatch)}`); + + if (!outputMatch) { + logger.error("No output found in recurrence response"); + throw new Error("Invalid response format from AI"); + } + + const jsonStr = outputMatch[1].trim(); + const conversationTitleData = JSON.parse(jsonStr); + + if (conversationTitleData) { + await prisma.conversation.update({ + where: { + id: payload.conversationId, + }, + data: { + title: conversationTitleData.title, + }, + }); + } + }, +}); diff --git a/apps/webapp/app/trigger/conversation/prompt.ts b/apps/webapp/app/trigger/conversation/prompt.ts new file mode 100644 index 0000000..f5a7e98 --- /dev/null +++ b/apps/webapp/app/trigger/conversation/prompt.ts @@ -0,0 +1,28 @@ +export const conversationTitlePrompt = `You are an AI assistant specialized in generating concise and informative conversation titles. Your task is to analyze the given message and context to create an appropriate title. + +Here is the message: + +{{message}} + + +Please follow these steps: + - Extract the core topic/intent from the message + - Create a clear, concise title + - Focus on the main subject or action + - Avoid unnecessary words + - Maximum length: 60 characters + +Before providing output, analyze in tags: +- Key elements from message +- Main topic/action +- Relevant actors/context +- Your title formation process + +Provide final output in this format: + +{ + "title": "Your generated title" +} + + +If message is empty or contains no meaningful content, return {"title": "New Conversation"}`; diff --git a/apps/webapp/app/trigger/integrations/integration-run-schedule.ts b/apps/webapp/app/trigger/integrations/integration-run-schedule.ts index 5ba4847..c2fb7a9 100644 --- a/apps/webapp/app/trigger/integrations/integration-run-schedule.ts +++ b/apps/webapp/app/trigger/integrations/integration-run-schedule.ts @@ -1,38 +1,38 @@ -import { PrismaClient } from '@prisma/client'; -import { IntegrationPayloadEventType } from '@redplanethq/sol-sdk'; -import { logger, schedules, tasks } from '@trigger.dev/sdk/v3'; +// import { PrismaClient } from "@prisma/client"; +// import { IntegrationPayloadEventType } from "@core/types"; +// import { logger, schedules, tasks } from "@trigger.dev/sdk/v3"; -import { integrationRun } from './integration-run'; +// import { integrationRun } from "./integration-run"; -const prisma = new PrismaClient(); +// const prisma = new PrismaClient(); -export const integrationRunSchedule = schedules.task({ - id: 'integration-run-schedule', - run: async (payload) => { - const { externalId } = payload; - const integrationAccount = await prisma.integrationAccount.findUnique({ - where: { id: externalId }, - include: { - integrationDefinition: true, - workspace: true, - }, - }); +// export const integrationRunSchedule = schedules.task({ +// id: "integration-run-schedule", +// run: async (payload) => { +// const { externalId } = payload; +// const integrationAccount = await prisma.integrationAccount.findUnique({ +// where: { id: externalId }, +// include: { +// integrationDefinition: true, +// workspace: true, +// }, +// }); - if (!integrationAccount) { - const deletedSchedule = await schedules.del(externalId); - logger.info('Deleting schedule as integration account is not there'); - return deletedSchedule; - } +// if (!integrationAccount) { +// const deletedSchedule = await schedules.del(externalId); +// logger.info("Deleting schedule as integration account is not there"); +// return deletedSchedule; +// } - const pat = await prisma.personalAccessToken.findFirst({ - where: { userId: integrationAccount.workspace.userId, name: 'default' }, - }); +// const pat = await prisma.personalAccessToken.findFirst({ +// where: { userId: integrationAccount.workspace.userId, name: "default" }, +// }); - return await tasks.trigger('integration-run', { - event: IntegrationPayloadEventType.SCHEDULED_SYNC, - pat: pat.token, - integrationAccount, - integrationDefinition: integrationAccount.integrationDefinition, - }); - }, -}); +// return await tasks.trigger("integration-run", { +// event: IntegrationPayloadEventType.SCHEDULED_SYNC, +// pat: pat.token, +// integrationAccount, +// integrationDefinition: integrationAccount.integrationDefinition, +// }); +// }, +// }); diff --git a/apps/webapp/app/trigger/integrations/integration-run.ts b/apps/webapp/app/trigger/integrations/integration-run.ts index 9d14e2d..e3b49e0 100644 --- a/apps/webapp/app/trigger/integrations/integration-run.ts +++ b/apps/webapp/app/trigger/integrations/integration-run.ts @@ -1,90 +1,87 @@ -import createLoadRemoteModule, { - createRequires, -} from '@paciolan/remote-module-loader'; -import { - IntegrationAccount, - IntegrationDefinition, -} from '@redplanethq/sol-sdk'; -import { logger, task } from '@trigger.dev/sdk/v3'; -import axios from 'axios'; +// import createLoadRemoteModule, { +// createRequires, +// } from "@paciolan/remote-module-loader"; -const fetcher = async (url: string) => { - // Handle remote URLs with axios - const response = await axios.get(url); +// import { logger, task } from "@trigger.dev/sdk/v3"; +// import axios from "axios"; - return response.data; -}; +// const fetcher = async (url: string) => { +// // Handle remote URLs with axios +// const response = await axios.get(url); -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const loadRemoteModule = async (requires: any) => - createLoadRemoteModule({ fetcher, requires }); +// return response.data; +// }; -function createAxiosInstance(token: string) { - const instance = axios.create(); +// // eslint-disable-next-line @typescript-eslint/no-explicit-any +// const loadRemoteModule = async (requires: any) => +// createLoadRemoteModule({ fetcher, requires }); - instance.interceptors.request.use((config) => { - // Check if URL starts with /api and doesn't have a full host - if (config.url?.startsWith('/api')) { - config.url = `${process.env.BACKEND_HOST}${config.url.replace('/api/', '/')}`; - } +// function createAxiosInstance(token: string) { +// const instance = axios.create(); - if ( - config.url.includes(process.env.FRONTEND_HOST) || - config.url.includes(process.env.BACKEND_HOST) - ) { - config.headers.Authorization = `Bearer ${token}`; - } +// instance.interceptors.request.use((config) => { +// // Check if URL starts with /api and doesn't have a full host +// if (config.url?.startsWith("/api")) { +// config.url = `${process.env.BACKEND_HOST}${config.url.replace("/api/", "/")}`; +// } - return config; - }); +// if ( +// config.url.includes(process.env.FRONTEND_HOST) || +// config.url.includes(process.env.BACKEND_HOST) +// ) { +// config.headers.Authorization = `Bearer ${token}`; +// } - return instance; -} +// return config; +// }); -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const getRequires = (axios: any) => createRequires({ axios }); +// return instance; +// } -export const integrationRun = task({ - id: 'integration-run', - run: async ({ - pat, - eventBody, - integrationAccount, - integrationDefinition, - event, - }: { - pat: string; - // This is the event you want to pass to the integration - // eslint-disable-next-line @typescript-eslint/no-explicit-any - event: any; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - eventBody?: any; - integrationDefinition: IntegrationDefinition; - integrationAccount?: IntegrationAccount; - }) => { - const remoteModuleLoad = await loadRemoteModule( - getRequires(createAxiosInstance(pat)), - ); +// // eslint-disable-next-line @typescript-eslint/no-explicit-any +// const getRequires = (axios: any) => createRequires({ axios }); - logger.info( - `${integrationDefinition.url}/${integrationDefinition.version}/backend/index.js`, - ); +// export const integrationRun = task({ +// id: "integration-run", +// run: async ({ +// pat, +// eventBody, +// integrationAccount, +// integrationDefinition, +// event, +// }: { +// pat: string; +// // This is the event you want to pass to the integration +// // eslint-disable-next-line @typescript-eslint/no-explicit-any +// event: any; +// // eslint-disable-next-line @typescript-eslint/no-explicit-any +// eventBody?: any; +// integrationDefinition: IntegrationDefinition; +// integrationAccount?: IntegrationAccount; +// }) => { +// const remoteModuleLoad = await loadRemoteModule( +// getRequires(createAxiosInstance(pat)), +// ); - const integrationFunction = await remoteModuleLoad( - `${integrationDefinition.url}/${integrationDefinition.version}/backend/index.js`, - ); +// logger.info( +// `${integrationDefinition.url}/${integrationDefinition.version}/backend/index.js`, +// ); - // const integrationFunction = await remoteModuleLoad( - // `${integrationDefinition.url}`, - // ); +// const integrationFunction = await remoteModuleLoad( +// `${integrationDefinition.url}/${integrationDefinition.version}/backend/index.js`, +// ); - return await integrationFunction.run({ - integrationAccount, - integrationDefinition, - event, - eventBody: { - ...(eventBody ? eventBody : {}), - }, - }); - }, -}); +// // const integrationFunction = await remoteModuleLoad( +// // `${integrationDefinition.url}`, +// // ); + +// return await integrationFunction.run({ +// integrationAccount, +// integrationDefinition, +// event, +// eventBody: { +// ...(eventBody ? eventBody : {}), +// }, +// }); +// }, +// }); diff --git a/apps/webapp/app/trigger/integrations/scheduler.ts b/apps/webapp/app/trigger/integrations/scheduler.ts index 2ca81a9..90b8eef 100644 --- a/apps/webapp/app/trigger/integrations/scheduler.ts +++ b/apps/webapp/app/trigger/integrations/scheduler.ts @@ -1,64 +1,64 @@ -import { PrismaClient } from "@prisma/client"; -import { logger, schedules, task } from "@trigger.dev/sdk/v3"; +// import { PrismaClient } from "@prisma/client"; +// import { logger, schedules, task } from "@trigger.dev/sdk/v3"; -import { integrationRunSchedule } from "./integration-run-schedule"; +// import { integrationRunSchedule } from "./integration-run-schedule"; -const prisma = new PrismaClient(); +// const prisma = new PrismaClient(); -export const scheduler = task({ - id: "scheduler", - run: async (payload: { integrationAccountId: string }) => { - const { integrationAccountId } = payload; +// export const scheduler = task({ +// id: "scheduler", +// run: async (payload: { integrationAccountId: string }) => { +// const { integrationAccountId } = payload; - const integrationAccount = await prisma.integrationAccount.findUnique({ - where: { id: integrationAccountId, deleted: null }, - include: { - integrationDefinition: true, - workspace: true, - }, - }); +// const integrationAccount = await prisma.integrationAccount.findUnique({ +// where: { id: integrationAccountId, deleted: null }, +// include: { +// integrationDefinition: true, +// workspace: true, +// }, +// }); - if (!integrationAccount) { - logger.error("Integration account not found"); - return null; - } +// if (!integrationAccount) { +// logger.error("Integration account not found"); +// return null; +// } - if (!integrationAccount.workspace) { - return null; - } +// if (!integrationAccount.workspace) { +// return null; +// } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const spec = integrationAccount.integrationDefinition.spec as any; +// // eslint-disable-next-line @typescript-eslint/no-explicit-any +// const spec = integrationAccount.integrationDefinition.spec as any; - if (spec.schedule && spec.schedule.frequency) { - const createdSchedule = await schedules.create({ - // The id of the scheduled task you want to attach to. - task: integrationRunSchedule.id, - // The schedule in cron format. - cron: spec.schedule.frequency, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - timezone: (integrationAccount.workspace.preferences as any).timezone, - // this is required, it prevents you from creating duplicate schedules. It will update the schedule if it already exists. - deduplicationKey: integrationAccount.id, - externalId: integrationAccount.id, - }); +// if (spec.schedule && spec.schedule.frequency) { +// const createdSchedule = await schedules.create({ +// // The id of the scheduled task you want to attach to. +// task: integrationRunSchedule.id, +// // The schedule in cron format. +// cron: spec.schedule.frequency, +// // eslint-disable-next-line @typescript-eslint/no-explicit-any +// timezone: (integrationAccount.workspace.preferences as any).timezone, +// // this is required, it prevents you from creating duplicate schedules. It will update the schedule if it already exists. +// deduplicationKey: integrationAccount.id, +// externalId: integrationAccount.id, +// }); - await prisma.integrationAccount.update({ - where: { - id: integrationAccount.id, - }, - data: { - settings: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ...(integrationAccount.settings as any), - scheduleId: createdSchedule.id, - }, - }, - }); +// await prisma.integrationAccount.update({ +// where: { +// id: integrationAccount.id, +// }, +// data: { +// settings: { +// // eslint-disable-next-line @typescript-eslint/no-explicit-any +// ...(integrationAccount.settings as any), +// scheduleId: createdSchedule.id, +// }, +// }, +// }); - return createdSchedule; - } +// return createdSchedule; +// } - return "No schedule for this task"; - }, -}); +// return "No schedule for this task"; +// }, +// }); diff --git a/apps/webapp/package.json b/apps/webapp/package.json index 37a6ff5..de9ac5d 100644 --- a/apps/webapp/package.json +++ b/apps/webapp/package.json @@ -8,7 +8,8 @@ "dev": "node ./server.mjs", "lint": "eslint --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint .", "start": "remix-serve ./build/server/index.js", - "typecheck": "tsc" + "typecheck": "tsc", + "trigger:dev": "npx trigger.dev@latest dev" }, "dependencies": { "@ai-sdk/anthropic": "^1.2.12", @@ -20,6 +21,7 @@ "@core/database": "workspace:*", "@core/types": "workspace:*", "@mjackson/headers": "0.11.1", + "@modelcontextprotocol/sdk": "1.13.2", "@nichtsam/remix-auth-email-link": "3.0.0", "@opentelemetry/api": "1.9.0", "@prisma/client": "*", diff --git a/apps/webapp/trigger.config.ts b/apps/webapp/trigger.config.ts index 49f7d21..e262170 100644 --- a/apps/webapp/trigger.config.ts +++ b/apps/webapp/trigger.config.ts @@ -1,8 +1,7 @@ import { defineConfig } from "@trigger.dev/sdk/v3"; -import { env } from "~/env.server"; export default defineConfig({ - project: env.TRIGGER_PROJECT_ID, + project: process.env.TRIGGER_PROJECT_ID as string, runtime: "node", logLevel: "log", // The max compute seconds a task is allowed to run. If the task run exceeds this duration, it will be stopped. diff --git a/package.json b/package.json index 8432232..ba522b4 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,8 @@ "db:seed": "dotenv -- turbo run db:seed", "db:studio": "dotenv -- turbo run db:studio", "db:populate": "dotenv -- turbo run db:populate", - "generate": "dotenv -- turbo run generate" + "generate": "dotenv -- turbo run generate", + "trigger:dev": "dotenv -- turbo run trigger:dev" }, "devDependencies": { "dotenv-cli": "^7.4.4", diff --git a/packages/sdk/.eslintrc.js b/packages/sdk/.eslintrc.js new file mode 100644 index 0000000..bd58927 --- /dev/null +++ b/packages/sdk/.eslintrc.js @@ -0,0 +1,9 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + root: true, + extends: ['@redplanethq/eslint-config/internal.js'], + parser: '@typescript-eslint/parser', + rules: { + 'no-redeclare': 'off', + }, +}; diff --git a/packages/sdk/.prettierrc.json b/packages/sdk/.prettierrc.json new file mode 100644 index 0000000..dcb7279 --- /dev/null +++ b/packages/sdk/.prettierrc.json @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "trailingComma": "all" +} \ No newline at end of file diff --git a/packages/sdk/package.json b/packages/sdk/package.json new file mode 100644 index 0000000..fed7b69 --- /dev/null +++ b/packages/sdk/package.json @@ -0,0 +1,49 @@ +{ + "name": "@redplanethq/sol-sdk", + "version": "0.2.18", + "description": "Sol Node.JS SDK", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "module": "./dist/index.mjs", + "publishConfig": { + "access": "public" + }, + "files": [ + "dist" + ], + "exports": { + ".": { + "import": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + }, + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + }, + "./package.json": "./package.json" + }, + "scripts": { + "clean": "rimraf dist", + "build": "npm run clean && npm run build:tsup", + "build:tsup": "tsup --dts-resolve", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + }, + "devDependencies": { + "@core/types": "workspace:*", + "@types/configstore": "^6.0.2", + "@types/debug": "^4.1.7", + "@types/node": "18", + "@types/slug": "^5.0.3", + "@types/uuid": "^9.0.0", + "encoding": "^0.1.13", + "rimraf": "^6.0.1", + "tsup": "^8.0.1", + "typescript": "^5.3.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "packageManager": "pnpm@10.3.0" +} \ No newline at end of file diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts new file mode 100644 index 0000000..d33aaa0 --- /dev/null +++ b/packages/sdk/src/index.ts @@ -0,0 +1 @@ +export * from '@core/types'; diff --git a/packages/sdk/tsconfig.json b/packages/sdk/tsconfig.json new file mode 100644 index 0000000..baa0f20 --- /dev/null +++ b/packages/sdk/tsconfig.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "include": ["./src/**/*.ts", "tsup.config.ts"], + "compilerOptions": { + "baseUrl": "src", + + "moduleResolution": "node", + + "strictNullChecks": false, + "preserveConstEnums": true, + "noUnusedParameters": true, + "noUnusedLocals": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noImplicitAny": true, + "noFallthroughCasesInSwitch": true, + "useUnknownInCatchVariables": false, + + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "sourceMap": true, + + "removeComments": true, + "module": "commonjs", + "target": "ES2022", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "lib": ["DOM", "DOM.Iterable"], + "declaration": false, + "declarationMap": false, + "stripInternal": true + }, + "exclude": ["node_modules", "dist"] +} diff --git a/packages/sdk/tsup.config.ts b/packages/sdk/tsup.config.ts new file mode 100644 index 0000000..81352e3 --- /dev/null +++ b/packages/sdk/tsup.config.ts @@ -0,0 +1,22 @@ +import { Options, defineConfig as defineConfigTSUP } from 'tsup'; + +const options: Options = { + name: 'main', + config: 'tsconfig.json', + entry: ['./src/index.ts'], + outDir: './dist', + platform: 'node', + format: ['cjs', 'esm'], + legacyOutput: false, + sourcemap: true, + clean: true, + bundle: true, + splitting: false, + dts: true, + treeshake: { + preset: 'recommended', + }, + external: ['axios'], +}; + +export default defineConfigTSUP(options); diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index f4e22e9..6ce7200 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -3,3 +3,4 @@ export * from "./graph"; export * from "./conversation-execution-step"; export * from "./oauth"; export * from "./integration"; +export * from "./user"; diff --git a/packages/types/src/user/index.ts b/packages/types/src/user/index.ts new file mode 100644 index 0000000..406fb3a --- /dev/null +++ b/packages/types/src/user/index.ts @@ -0,0 +1,5 @@ +export enum UserTypeEnum { + Agent = "Agent", + User = "User", + System = "System", +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8c7f422..682b4a0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 2.26.2 '@remix-run/changelog-github': specifier: ^0.0.5 - version: 0.0.5 + version: 0.0.5(encoding@0.1.13) devDependencies: dotenv-cli: specifier: ^7.4.4 @@ -57,6 +57,9 @@ importers: '@mjackson/headers': specifier: 0.11.1 version: 0.11.1 + '@modelcontextprotocol/sdk': + specifier: 1.13.2 + version: 1.13.2 '@nichtsam/remix-auth-email-link': specifier: 3.0.0 version: 3.0.0(remix-auth@4.2.0) @@ -309,7 +312,7 @@ importers: devDependencies: '@remix-run/dev': specifier: 2.16.7 - version: 2.16.7(@remix-run/react@2.16.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3))(@remix-run/serve@2.16.7(typescript@5.8.3))(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0))(yaml@2.8.0) + version: 2.16.7(@remix-run/react@2.16.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3))(@remix-run/serve@2.16.7(typescript@5.8.3))(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(typescript@5.8.3)(vite@6.3.5(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0))(yaml@2.8.0) '@remix-run/eslint-config': specifier: 2.16.7 version: 2.16.7(eslint@8.57.1)(react@18.3.1)(typescript@5.8.3) @@ -324,7 +327,7 @@ importers: version: 0.5.16(tailwindcss@4.1.7) '@tailwindcss/vite': specifier: ^4.1.7 - version: 4.1.9(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0)) + version: 4.1.9(vite@6.3.5(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0)) '@trigger.dev/build': specifier: ^3.3.17 version: 3.3.17(typescript@5.8.3) @@ -417,10 +420,10 @@ importers: version: 5.8.3 vite: specifier: ^6.0.0 - version: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0) + version: 6.3.5(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0)) + version: 4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0)) core/types: devDependencies: @@ -481,6 +484,39 @@ importers: specifier: 18.2.69 version: 18.2.69 + packages/sdk: + devDependencies: + '@core/types': + specifier: workspace:* + version: link:../types + '@types/configstore': + specifier: ^6.0.2 + version: 6.0.2 + '@types/debug': + specifier: ^4.1.7 + version: 4.1.12 + '@types/node': + specifier: '18' + version: 18.19.115 + '@types/slug': + specifier: ^5.0.3 + version: 5.0.9 + '@types/uuid': + specifier: ^9.0.0 + version: 9.0.8 + encoding: + specifier: ^0.1.13 + version: 0.1.13 + rimraf: + specifier: ^6.0.1 + version: 6.0.1 + tsup: + specifier: ^8.0.1 + version: 8.5.0(@swc/core@1.3.101(@swc/helpers@0.5.2))(jiti@2.4.2)(postcss@8.5.5)(typescript@5.8.3)(yaml@2.8.0) + typescript: + specifier: ^5.3.0 + version: 5.8.3 + packages/types: dependencies: '@prisma/client': @@ -1647,6 +1683,10 @@ packages: '@mjackson/headers@0.9.0': resolution: {integrity: sha512-1WFCu2iRaqbez9hcYYI611vcH1V25R+fDfOge/CyKc8sdbzniGfy/FRhNd3DgvFF4ZEEX2ayBrvFHLtOpfvadw==} + '@modelcontextprotocol/sdk@1.13.2': + resolution: {integrity: sha512-Vx7qOcmoKkR3qhaQ9qf3GxiVKCEu+zfJddHv6x3dY/9P6+uIwJnmuAur5aB+4FDXf41rRrDnOEGkviX5oYZ67w==} + engines: {node: '>=18'} + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} cpu: [arm64] @@ -3632,6 +3672,9 @@ packages: '@types/compression@1.8.1': resolution: {integrity: sha512-kCFuWS0ebDbmxs0AXYn6e2r2nrGAb5KwQhknjSPSPgJcGd8+HVSILlUyFhGqML2gk39HcG7D1ydW9/qpYkN00Q==} + '@types/configstore@6.0.2': + resolution: {integrity: sha512-OS//b51j9uyR3zvwD04Kfs5kHpve2qalQ18JhY/ho3voGYUTPLEG90/ocfKPI48hyHH8T04f7KEEbK6Ue60oZQ==} + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -3803,6 +3846,9 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@18.19.115': + resolution: {integrity: sha512-kNrFiTgG4a9JAn1LMQeLOv3MvXIPokzXziohMrMsvpYgLpdEt/mMiVYc4sGKtDfyxM5gIDF4VgrPRyCw4fHOYg==} + '@types/node@24.0.0': resolution: {integrity: sha512-yZQa2zm87aRVcqDyH5+4Hv9KYgSdgwX1rFnGvpbzMaC7YAljmhBET93TPiTd3ObwTL+gSpIzPKg5BqVxdCvxKg==} @@ -3853,9 +3899,15 @@ packages: '@types/simple-oauth2@5.0.7': resolution: {integrity: sha512-8JbWVJbiTSBQP/7eiyGKyXWAqp3dKQZpaA+pdW16FCi32ujkzRMG8JfjoAzdWt6W8U591ZNdHcPtP2D7ILTKuA==} + '@types/slug@5.0.9': + resolution: {integrity: sha512-6Yp8BSplP35Esa/wOG1wLNKiqXevpQTEF/RcL/NV6BBQaMmZh4YlDwCgrrFSoUE4xAGvnKd5c+lkQJmPrBAzfQ==} + '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + '@types/validator@13.15.2': resolution: {integrity: sha512-y7pa/oEJJ4iGYBxOpfAKn5b9+xuihvzDVnC/OSvlVnGxVg0pOqmjiMafiJ1KVNQEaPZf9HsEp5icEwGg8uIe5Q==} @@ -4157,6 +4209,10 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: @@ -4405,6 +4461,10 @@ packages: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} @@ -4445,6 +4505,12 @@ packages: bullmq@5.53.2: resolution: {integrity: sha512-xHgxrP/yNJHD7VCw1h+eRBh+2TCPBCM39uC9gCyksYc6ufcJP+HTZ/A2lzB2x7qMFWrvsX7tM40AT2BmdkYL/Q==} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -4530,6 +4596,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -4672,10 +4742,18 @@ packages: config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -5170,6 +5248,9 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -5545,10 +5626,20 @@ packages: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} + express-rate-limit@7.5.1: + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + express@4.21.2: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + exsolve@1.0.5: resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} @@ -5618,6 +5709,10 @@ packages: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -5629,6 +5724,9 @@ packages: find-yarn-workspace-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -5683,6 +5781,10 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -6146,6 +6248,9 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} @@ -6266,6 +6371,10 @@ packages: jose@5.10.0: resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-beautify@1.15.4: resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} engines: {node: '>=14'} @@ -6447,6 +6556,10 @@ packages: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} @@ -6492,6 +6605,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -6611,6 +6727,10 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} @@ -6622,6 +6742,10 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -6736,6 +6860,10 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} @@ -6901,6 +7029,10 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -7222,6 +7354,10 @@ packages: path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} @@ -7285,6 +7421,10 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + engines: {node: '>=16.20.0'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -7341,6 +7481,24 @@ packages: ts-node: optional: true + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + postcss-loader@8.1.1: resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} engines: {node: '>= 18.12.0'} @@ -7619,6 +7777,10 @@ packages: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} @@ -7640,6 +7802,10 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + react-dom@18.2.0: resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -7774,6 +7940,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -7953,6 +8123,10 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + run-exclusive@2.2.19: resolution: {integrity: sha512-K3mdoAi7tjJ/qT7Flj90L7QyPozwUaAG+CVhkdDje4HLKXUYC3N/Jzkau3flHVDLQVhiHBtcimVodMjN9egYbA==} @@ -8020,6 +8194,10 @@ packages: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -8027,6 +8205,10 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -8159,6 +8341,10 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -8460,6 +8646,9 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} @@ -8482,6 +8671,13 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -8537,6 +8733,25 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsup@8.5.0: + resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + tsutils@3.21.0: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -8621,6 +8836,10 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -8671,6 +8890,9 @@ packages: uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@7.8.0: resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} @@ -8923,6 +9145,9 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + webpack-sources@3.3.2: resolution: {integrity: sha512-ykKKus8lqlgXX/1WjudpIEjqsafjOTcOJqxnAbMLAu/KCsDCJ6GBtvscewvTkrn24HsnvFwrSCbenFrhtcCsAA==} engines: {node: '>=10.13.0'} @@ -8940,6 +9165,9 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -9873,10 +10101,10 @@ snapshots: fs-extra: 7.0.1 semver: 7.7.2 - '@changesets/get-github-info@0.5.2': + '@changesets/get-github-info@0.5.2(encoding@0.1.13)': dependencies: dataloader: 1.4.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -10445,6 +10673,22 @@ snapshots: '@mjackson/headers@0.9.0': {} + '@modelcontextprotocol/sdk@1.13.2': + dependencies: + ajv: 6.12.6 + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + express: 5.1.0 + express-rate-limit: 7.5.1(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.0 + zod: 3.23.8 + zod-to-json-schema: 3.24.5(zod@3.23.8) + transitivePeerDependencies: + - supports-color + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': optional: true @@ -11726,16 +11970,16 @@ snapshots: dependencies: react: 18.3.1 - '@remix-run/changelog-github@0.0.5': + '@remix-run/changelog-github@0.0.5(encoding@0.1.13)': dependencies: '@changesets/errors': 0.1.4 - '@changesets/get-github-info': 0.5.2 + '@changesets/get-github-info': 0.5.2(encoding@0.1.13) '@changesets/types': 5.2.1 dotenv: 8.6.0 transitivePeerDependencies: - encoding - '@remix-run/dev@2.16.7(@remix-run/react@2.16.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3))(@remix-run/serve@2.16.7(typescript@5.8.3))(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0))(yaml@2.8.0)': + '@remix-run/dev@2.16.7(@remix-run/react@2.16.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3))(@remix-run/serve@2.16.7(typescript@5.8.3))(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(typescript@5.8.3)(vite@6.3.5(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0))(yaml@2.8.0)': dependencies: '@babel/core': 7.27.4 '@babel/generator': 7.27.5 @@ -11752,7 +11996,7 @@ snapshots: '@remix-run/router': 1.23.0 '@remix-run/server-runtime': 2.16.7(typescript@5.8.3) '@types/mdx': 2.0.13 - '@vanilla-extract/integration': 6.5.0(@types/node@24.0.0)(lightningcss@1.30.1)(terser@5.42.0) + '@vanilla-extract/integration': 6.5.0(@types/node@18.19.115)(lightningcss@1.30.1)(terser@5.42.0) arg: 5.0.2 cacache: 17.1.4 chalk: 4.1.2 @@ -11792,12 +12036,12 @@ snapshots: tar-fs: 2.1.3 tsconfig-paths: 4.2.0 valibot: 0.41.0(typescript@5.8.3) - vite-node: 3.2.3(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0) + vite-node: 3.2.3(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0) ws: 7.5.10 optionalDependencies: '@remix-run/serve': 2.16.7(typescript@5.8.3) typescript: 5.8.3 - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0) + vite: 6.3.5(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -12519,12 +12763,12 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.1.7 - '@tailwindcss/vite@4.1.9(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0))': + '@tailwindcss/vite@4.1.9(vite@6.3.5(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0))': dependencies: '@tailwindcss/node': 4.1.9 '@tailwindcss/oxide': 4.1.9 tailwindcss: 4.1.9 - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0) + vite: 6.3.5(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0) '@tanstack/react-table@8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -12626,16 +12870,18 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.0.0 + '@types/node': 18.19.115 '@types/compression@1.8.1': dependencies: '@types/express': 4.17.23 '@types/node': 24.0.0 + '@types/configstore@6.0.2': {} + '@types/connect@3.4.38': dependencies: - '@types/node': 24.0.0 + '@types/node': 18.19.115 '@types/cookie@0.4.1': {} @@ -12643,7 +12889,7 @@ snapshots: '@types/cors@2.8.19': dependencies: - '@types/node': 24.0.0 + '@types/node': 18.19.115 '@types/d3-array@3.2.1': {} @@ -12788,7 +13034,7 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 24.0.0 + '@types/node': 18.19.115 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -12834,6 +13080,10 @@ snapshots: '@types/node@12.20.55': {} + '@types/node@18.19.115': + dependencies: + undici-types: 5.26.5 + '@types/node@24.0.0': dependencies: undici-types: 7.8.0 @@ -12875,25 +13125,29 @@ snapshots: '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.0.0 + '@types/node': 18.19.115 '@types/serve-static@1.15.8': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 24.0.0 + '@types/node': 18.19.115 '@types/send': 0.17.5 '@types/shimmer@1.2.0': {} '@types/simple-oauth2@5.0.7': {} + '@types/slug@5.0.9': {} + '@types/unist@2.0.11': {} + '@types/uuid@9.0.8': {} + '@types/validator@13.15.2': {} '@types/webpack@5.28.5(@swc/core@1.3.101(@swc/helpers@0.5.2))(esbuild@0.19.11)': dependencies: - '@types/node': 24.0.0 + '@types/node': 18.19.115 tapable: 2.2.2 webpack: 5.99.9(@swc/core@1.3.101(@swc/helpers@0.5.2))(esbuild@0.19.11) transitivePeerDependencies: @@ -13156,7 +13410,7 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - '@vanilla-extract/integration@6.5.0(@types/node@24.0.0)(lightningcss@1.30.1)(terser@5.42.0)': + '@vanilla-extract/integration@6.5.0(@types/node@18.19.115)(lightningcss@1.30.1)(terser@5.42.0)': dependencies: '@babel/core': 7.27.4 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) @@ -13169,8 +13423,8 @@ snapshots: lodash: 4.17.21 mlly: 1.7.4 outdent: 0.8.0 - vite: 5.4.19(@types/node@24.0.0)(lightningcss@1.30.1)(terser@5.42.0) - vite-node: 1.6.1(@types/node@24.0.0)(lightningcss@1.30.1)(terser@5.42.0) + vite: 5.4.19(@types/node@18.19.115)(lightningcss@1.30.1)(terser@5.42.0) + vite-node: 1.6.1(@types/node@18.19.115)(lightningcss@1.30.1)(terser@5.42.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -13281,6 +13535,11 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + acorn-import-attributes@1.9.5(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -13564,6 +13823,20 @@ snapshots: transitivePeerDependencies: - supports-color + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.1 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + bowser@2.11.0: {} brace-expansion@1.1.12: @@ -13622,6 +13895,11 @@ snapshots: transitivePeerDependencies: - supports-color + bundle-require@5.1.0(esbuild@0.25.5): + dependencies: + esbuild: 0.25.5 + load-tsconfig: 0.2.5 + busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -13725,6 +14003,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + chownr@1.1.4: {} chownr@2.0.0: {} @@ -13848,10 +14130,16 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 + consola@3.4.2: {} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + content-type@1.0.5: {} convert-source-map@2.0.0: {} @@ -14330,6 +14618,10 @@ snapshots: encodeurl@2.0.0: {} + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -14352,7 +14644,7 @@ snapshots: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.19 - '@types/node': 24.0.0 + '@types/node': 18.19.115 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 @@ -14963,7 +15255,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 24.0.0 + '@types/node': 18.19.115 require-like: 0.1.2 event-target-shim@5.0.1: {} @@ -15023,6 +15315,10 @@ snapshots: exit-hook@2.2.1: {} + express-rate-limit@7.5.1(express@5.1.0): + dependencies: + express: 5.1.0 + express@4.21.2: dependencies: accepts: 1.3.8 @@ -15059,6 +15355,38 @@ snapshots: transitivePeerDependencies: - supports-color + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.1 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + exsolve@1.0.5: {} extend@3.0.2: {} @@ -15131,6 +15459,17 @@ snapshots: transitivePeerDependencies: - supports-color + finalhandler@2.1.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -15146,6 +15485,12 @@ snapshots: micromatch: 4.0.8 pkg-dir: 4.2.0 + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.17 + mlly: 1.7.4 + rollup: 4.43.0 + flat-cache@3.2.0: dependencies: flatted: 3.3.3 @@ -15189,6 +15534,8 @@ snapshots: fresh@0.5.2: {} + fresh@2.0.0: {} + fs-constants@1.0.0: {} fs-extra@10.1.0: @@ -15677,6 +16024,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-promise@4.0.0: {} + is-reference@3.0.3: dependencies: '@types/estree': 1.0.8 @@ -15775,7 +16124,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 24.0.0 + '@types/node': 18.19.115 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -15793,6 +16142,8 @@ snapshots: jose@5.10.0: {} + joycon@3.1.1: {} + js-beautify@1.15.4: dependencies: config-chain: 1.1.13 @@ -15942,6 +16293,8 @@ snapshots: pify: 3.0.0 strip-bom: 3.0.0 + load-tsconfig@0.2.5: {} + load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 @@ -15981,6 +16334,8 @@ snapshots: lodash.merge@4.6.2: {} + lodash.sortby@4.7.0: {} + lodash.startcase@4.4.0: {} lodash@4.17.21: {} @@ -16153,6 +16508,8 @@ snapshots: media-typer@0.3.0: {} + media-typer@1.1.0: {} + memorystream@0.3.1: {} meow@6.1.1: @@ -16171,6 +16528,8 @@ snapshots: merge-descriptors@1.0.3: {} + merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -16403,6 +16762,10 @@ snapshots: dependencies: mime-db: 1.52.0 + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + mime@1.6.0: {} mimic-fn@2.1.0: {} @@ -16545,6 +16908,8 @@ snapshots: negotiator@0.6.4: {} + negotiator@1.0.0: {} + neo-async@2.6.2: {} neo4j-driver-bolt-connection@5.28.1: @@ -16595,9 +16960,11 @@ snapshots: dependencies: lodash: 4.17.21 - node-fetch@2.7.0: + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 node-gyp-build-optional-packages@5.2.2: dependencies: @@ -16890,6 +17257,8 @@ snapshots: path-to-regexp@0.1.12: {} + path-to-regexp@8.2.0: {} + path-type@3.0.0: dependencies: pify: 3.0.0 @@ -16934,6 +17303,8 @@ snapshots: pirates@4.0.7: {} + pkce-challenge@5.0.0: {} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -17001,6 +17372,14 @@ snapshots: optionalDependencies: postcss: 8.5.5 + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 2.4.2 + postcss: 8.5.5 + yaml: 2.8.0 + postcss-loader@8.1.1(postcss@8.5.5)(typescript@5.8.3)(webpack@5.99.9(esbuild@0.25.5)): dependencies: cosmiconfig: 9.0.0(typescript@5.8.3) @@ -17202,7 +17581,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 24.0.0 + '@types/node': 18.19.115 long: 5.3.2 proxy-addr@2.0.7: @@ -17243,6 +17622,10 @@ snapshots: dependencies: side-channel: 1.1.0 + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + quansync@0.2.10: {} queue-microtask@1.2.3: {} @@ -17262,6 +17645,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + react-dom@18.2.0(react@18.2.0): dependencies: loose-envify: 1.4.0 @@ -17481,6 +17871,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.1.2: {} + redent@3.0.0: dependencies: indent-string: 4.0.0 @@ -17677,6 +18069,16 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.43.0 fsevents: 2.3.3 + router@2.2.0: + dependencies: + debug: 4.4.1 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + run-exclusive@2.2.19: dependencies: minimal-polyfills: 2.2.3 @@ -17761,6 +18163,22 @@ snapshots: transitivePeerDependencies: - supports-color + send@1.2.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -17774,6 +18192,15 @@ snapshots: transitivePeerDependencies: - supports-color + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + set-blocking@2.0.0: {} set-cookie-parser@2.7.1: {} @@ -17953,6 +18380,10 @@ snapshots: source-map@0.7.4: {} + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + space-separated-tokens@2.0.2: {} spawndamnit@2.0.0: @@ -18340,6 +18771,8 @@ snapshots: tiny-invariant@1.3.3: {} + tinyexec@0.3.2: {} + tinyglobby@0.2.14: dependencies: fdir: 6.4.6(picomatch@4.0.2) @@ -18359,6 +18792,12 @@ snapshots: tr46@0.0.3: {} + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + trim-lines@3.0.1: {} trim-newlines@3.0.1: {} @@ -18398,6 +18837,35 @@ snapshots: tslib@2.8.1: {} + tsup@8.5.0(@swc/core@1.3.101(@swc/helpers@0.5.2))(jiti@2.4.2)(postcss@8.5.5)(typescript@5.8.3)(yaml@2.8.0): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.5) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.1 + esbuild: 0.25.5 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0) + resolve-from: 5.0.0 + rollup: 4.43.0 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tree-kill: 1.2.2 + optionalDependencies: + '@swc/core': 1.3.101(@swc/helpers@0.5.2) + postcss: 8.5.5 + typescript: 5.8.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + tsutils@3.21.0(typescript@5.8.3): dependencies: tslib: 1.14.1 @@ -18465,6 +18933,12 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -18520,6 +18994,8 @@ snapshots: uncrypto@0.1.3: {} + undici-types@5.26.5: {} + undici-types@7.8.0: {} undici@6.21.3: {} @@ -18700,13 +19176,13 @@ snapshots: unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 - vite-node@1.6.1(@types/node@24.0.0)(lightningcss@1.30.1)(terser@5.42.0): + vite-node@1.6.1(@types/node@18.19.115)(lightningcss@1.30.1)(terser@5.42.0): dependencies: cac: 6.7.14 debug: 4.4.1 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.19(@types/node@24.0.0)(lightningcss@1.30.1)(terser@5.42.0) + vite: 5.4.19(@types/node@18.19.115)(lightningcss@1.30.1)(terser@5.42.0) transitivePeerDependencies: - '@types/node' - less @@ -18718,13 +19194,13 @@ snapshots: - supports-color - terser - vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0): + vite-node@3.2.3(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0) + vite: 6.3.5(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -18739,29 +19215,29 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0)): + vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0) + vite: 6.3.5(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@5.4.19(@types/node@24.0.0)(lightningcss@1.30.1)(terser@5.42.0): + vite@5.4.19(@types/node@18.19.115)(lightningcss@1.30.1)(terser@5.42.0): dependencies: esbuild: 0.21.5 postcss: 8.5.5 rollup: 4.43.0 optionalDependencies: - '@types/node': 24.0.0 + '@types/node': 18.19.115 fsevents: 2.3.3 lightningcss: 1.30.1 terser: 5.42.0 - vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0): + vite@6.3.5(@types/node@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0): dependencies: esbuild: 0.25.5 fdir: 6.4.6(picomatch@4.0.2) @@ -18770,7 +19246,7 @@ snapshots: rollup: 4.43.0 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 24.0.0 + '@types/node': 18.19.115 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 @@ -18798,6 +19274,8 @@ snapshots: webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + webpack-sources@3.3.2: {} webpack@5.99.9(@swc/core@1.3.101(@swc/helpers@0.5.2))(esbuild@0.19.11): @@ -18868,6 +19346,12 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 diff --git a/turbo.json b/turbo.json index b34e407..252e703 100644 --- a/turbo.json +++ b/turbo.json @@ -32,6 +32,9 @@ }, "generate": { "dependsOn": [ "^generate" ] + }, + "trigger:dev": { + } }, "globalDependencies": [ ".env" ],