From d80bfadf9c2da7e23a12f2d0bb33d34926954d5c Mon Sep 17 00:00:00 2001 From: Manoj K Date: Fri, 11 Jul 2025 16:01:54 +0530 Subject: [PATCH] Feat: Activtiy to memory ingestion --- apps/webapp/app/routes/api.v1.activity.tsx | 93 +++++++++++ .../webapp/app/routes/webhook.$sourceName.tsx | 99 +++++++++++ .../webapp/app/services/integration.server.ts | 18 +- .../webapp/app/services/oauth/oauth.server.ts | 5 +- apps/webapp/app/services/webhook.server.ts | 123 ++++++++++++++ .../integrations/integration-run-schedule.ts | 83 +++++---- .../trigger/integrations/integration-run.ts | 157 ++++++++++-------- .../app/trigger/integrations/scheduler.ts | 106 ++++++------ apps/webapp/package.json | 35 ++-- integrations/slack/src/create-activity.ts | 6 +- integrations/slack/src/index.ts | 6 +- package.json | 1 + pnpm-lock.yaml | 105 +++++++----- 13 files changed, 599 insertions(+), 238 deletions(-) create mode 100644 apps/webapp/app/routes/api.v1.activity.tsx create mode 100644 apps/webapp/app/routes/webhook.$sourceName.tsx create mode 100644 apps/webapp/app/services/webhook.server.ts diff --git a/apps/webapp/app/routes/api.v1.activity.tsx b/apps/webapp/app/routes/api.v1.activity.tsx new file mode 100644 index 0000000..18e5357 --- /dev/null +++ b/apps/webapp/app/routes/api.v1.activity.tsx @@ -0,0 +1,93 @@ +import { json } from "@remix-run/node"; +import { z } from "zod"; + +import { createActionApiRoute } from "~/services/routeBuilders/apiBuilder.server"; +import { addToQueue } from "~/lib/ingest.server"; +import { prisma } from "~/db.server"; +import { logger } from "~/services/logger.service"; + +const ActivityCreateSchema = z.object({ + text: z.string().min(1, "Text is required"), + source: z.string().min(1, "Source is required"), + sourceURL: z.string().url().optional(), + integrationAccountId: z.string().optional(), + taskId: z.string().optional(), +}); + +const { action, loader } = createActionApiRoute( + { + body: ActivityCreateSchema, + allowJWT: true, + authorization: { + action: "create", + }, + corsStrategy: "all", + }, + async ({ body, authentication }) => { + try { + logger.log("Creating activity", { body, userId: authentication.userId }); + + const user = await prisma.user.findUnique({ + where: { + id: authentication.userId, + }, + include: { + Workspace: true, + }, + }); + + if (!user) { + throw new Error("User not found"); + } + + + // Create the activity record + const activity = await prisma.activity.create({ + data: { + text: body.text, + sourceURL: body.sourceURL, + integrationAccountId: body.integrationAccountId, + workspaceId: user.Workspace?.id || "", + }, + }); + + // Add activity to knowledge graph ingestion queue + const ingestData = { + episodeBody: body.text, + referenceTime: new Date().toISOString(), + source: body.source, + metadata: { + activityId: activity.id, + integrationAccountId: body.integrationAccountId || "", + taskId: body.taskId || "", + type: "activity", + }, + }; + + const queueResponse = await addToQueue(ingestData, authentication.userId); + + logger.log("Activity created and queued for ingestion", { + activityId: activity.id, + queueId: queueResponse.id, + }); + + return json({ + success: true, + activity: { + id: activity.id, + text: activity.text, + sourceURL: activity.sourceURL, + createdAt: activity.createdAt, + }, + ingestion: { + queueId: queueResponse.id, + }, + }); + } catch (error) { + logger.error("Failed to create activity", { error, body }); + throw error; + } + }, +); + +export { action, loader }; \ No newline at end of file diff --git a/apps/webapp/app/routes/webhook.$sourceName.tsx b/apps/webapp/app/routes/webhook.$sourceName.tsx new file mode 100644 index 0000000..117c052 --- /dev/null +++ b/apps/webapp/app/routes/webhook.$sourceName.tsx @@ -0,0 +1,99 @@ +import { json } from "@remix-run/node"; +import { type ActionFunctionArgs, type LoaderFunctionArgs } from "@remix-run/server-runtime"; +import { z } from "zod"; +import { webhookService } from "~/services/webhook.server"; +import { logger } from "~/services/logger.service"; + +const ParamsSchema = z.object({ + sourceName: z.string(), +}); + +const SearchParamsSchema = z.object({ + integrationAccountId: z.string().optional(), +}); + +export async function action({ request, params }: ActionFunctionArgs) { + try { + const { sourceName } = ParamsSchema.parse(params); + const url = new URL(request.url); + const { integrationAccountId } = SearchParamsSchema.parse( + Object.fromEntries(url.searchParams) + ); + + // Extract headers + const eventHeaders: Record = {}; + request.headers.forEach((value, key) => { + eventHeaders[key] = value; + }); + + // Parse body + const eventBody = await request.json(); + + logger.log(`Webhook received for ${sourceName}`, { + integrationAccountId, + eventBody: typeof eventBody === 'object' ? JSON.stringify(eventBody).substring(0, 200) : eventBody, + }); + + const result = await webhookService.handleEvents( + sourceName, + integrationAccountId, + eventHeaders, + eventBody + ); + + // Handle URL verification challenge (returns different response) + if (result.challenge) { + return json({ challenge: result.challenge }); + } + + return json({ status: result.status }); + } catch (error) { + logger.error('Webhook processing failed', { error, params }); + + // Still return 200 to acknowledge receipt + return json({ status: 'error', message: 'Webhook processing failed' }, { status: 200 }); + } +} + +export async function loader({ request, params }: LoaderFunctionArgs) { + try { + const { sourceName } = ParamsSchema.parse(params); + const url = new URL(request.url); + const { integrationAccountId } = SearchParamsSchema.parse( + Object.fromEntries(url.searchParams) + ); + + // Extract headers + const eventHeaders: Record = {}; + request.headers.forEach((value, key) => { + eventHeaders[key] = value; + }); + + // For GET requests, parse query parameters as event body + const eventBody = Object.fromEntries(url.searchParams); + + logger.log(`Webhook GET request for ${sourceName}`, { + integrationAccountId, + eventBody: JSON.stringify(eventBody).substring(0, 200), + }); + + const result = await webhookService.handleEvents( + sourceName, + integrationAccountId, + eventHeaders, + eventBody + ); + + // Handle URL verification challenge (returns different response) + if (result.challenge) { + return json({ challenge: result.challenge }); + } + + return json({ status: result.status }); + } catch (error) { + logger.error('Webhook GET processing failed', { error, params }); + + // Still return 200 to acknowledge receipt + return json({ status: 'error', message: 'Webhook processing failed' }, { status: 200 }); + } +} \ No newline at end of file diff --git a/apps/webapp/app/services/integration.server.ts b/apps/webapp/app/services/integration.server.ts index c12c29d..9280202 100644 --- a/apps/webapp/app/services/integration.server.ts +++ b/apps/webapp/app/services/integration.server.ts @@ -13,11 +13,11 @@ import type { IntegrationDefinitionV2 } from "@core/database"; async function prepareIntegrationTrigger( integrationDefinition: IntegrationDefinitionV2, userId?: string, - workspaceId?: string, ) { logger.info(`Loading integration ${integrationDefinition.slug}`); let pat = ""; + let patId = ""; if (userId) { // Use the integration slug as the token name for uniqueness const tokenResult = await getOrCreatePersonalAccessToken({ @@ -25,11 +25,13 @@ async function prepareIntegrationTrigger( userId, }); pat = tokenResult.token ?? ""; + patId = tokenResult.id ?? ""; } return { integrationDefinition, pat, + patId, }; } @@ -41,13 +43,8 @@ export async function runIntegrationTriggerAsync( // eslint-disable-next-line @typescript-eslint/no-explicit-any event: any, userId?: string, - workspaceId?: string, ) { - const params = await prepareIntegrationTrigger( - integrationDefinition, - userId, - workspaceId, - ); + const params = await prepareIntegrationTrigger(integrationDefinition, userId); return await tasks.trigger("integration-run", { ...params, event, @@ -62,13 +59,8 @@ export async function runIntegrationTrigger( // eslint-disable-next-line @typescript-eslint/no-explicit-any event: any, userId?: string, - workspaceId?: string, ) { - const params = await prepareIntegrationTrigger( - integrationDefinition, - userId, - workspaceId, - ); + const params = await prepareIntegrationTrigger(integrationDefinition, userId); const response = await tasks.triggerAndPoll( "integration-run", diff --git a/apps/webapp/app/services/oauth/oauth.server.ts b/apps/webapp/app/services/oauth/oauth.server.ts index 82d4e54..f906661 100644 --- a/apps/webapp/app/services/oauth/oauth.server.ts +++ b/apps/webapp/app/services/oauth/oauth.server.ts @@ -1,4 +1,4 @@ -import { IntegrationPayloadEventType, type OAuth2Params } from "@core/types"; +import { IntegrationEventType, type OAuth2Params } from "@core/types"; import * as simpleOauth2 from "simple-oauth2"; import { tasks } from "@trigger.dev/sdk/v3"; import { @@ -121,7 +121,7 @@ export async function callbackHandler( const integrationAccount = await runIntegrationTrigger( integrationDefinition, { - event: IntegrationPayloadEventType.INTEGRATION_ACCOUNT_CREATED, + event: IntegrationEventType.SETUP, eventBody: { oauthResponse: tokensResponse.token, oauthParams: { @@ -132,7 +132,6 @@ export async function callbackHandler( }, }, sessionRecord.userId, - sessionRecord.workspaceId, ); await tasks.trigger("scheduler", { diff --git a/apps/webapp/app/services/webhook.server.ts b/apps/webapp/app/services/webhook.server.ts new file mode 100644 index 0000000..b6dd22d --- /dev/null +++ b/apps/webapp/app/services/webhook.server.ts @@ -0,0 +1,123 @@ +import { + type IntegrationDefinitionV2, + type IntegrationAccount, +} from "@core/database"; +import { IntegrationEventType } from "@redplanethq/sdk"; +import { prisma } from "~/db.server"; +import { logger } from "./logger.service"; +import { runIntegrationTrigger } from "./integration.server"; + +export type EventHeaders = Record; +export type EventBody = Record; + +export class WebhookService { + async handleEvents( + sourceName: string, + integrationAccountId: string | undefined, + eventHeaders: EventHeaders, + eventBody: EventBody, + ): Promise<{ challenge?: string; status: string }> { + logger.log(`Received webhook ${sourceName}`, { + where: "WebhookService.handleEvents", + }); + + // Check if the event is a URL verification challenge (Slack) + if (eventBody.type === "url_verification") { + logger.log("Responding to Slack URL verification challenge"); + return { challenge: eventBody.challenge, status: "verified" }; + } + + let integrationAccount: + | (IntegrationAccount & { + integrationDefinition: IntegrationDefinitionV2; + }) + | null = null; + + if (!integrationAccountId) { + // Find integration account by identifying the webhook account + const integrationDefinition = + await prisma.integrationDefinitionV2.findFirst({ + where: { slug: sourceName, deleted: null }, + }); + + if (integrationDefinition) { + try { + const accountIdResponse = await runIntegrationTrigger( + integrationDefinition, + { + event: IntegrationEventType.IDENTIFY, + eventBody: { + eventHeaders, + event: { ...eventBody }, + }, + }, + ); + + let accountId: string | undefined; + + if ( + accountIdResponse?.message?.startsWith("The event payload type is") + ) { + accountId = undefined; + } else { + accountId = accountIdResponse; + } + + if (accountId) { + integrationAccount = await prisma.integrationAccount.findFirst({ + where: { accountId }, + include: { integrationDefinition: true }, + }); + } + } catch (error) { + logger.error("Failed to identify integration account", { + error, + sourceName, + }); + } + } + } else { + integrationAccount = await prisma.integrationAccount.findUnique({ + where: { id: integrationAccountId }, + include: { integrationDefinition: true }, + }); + } + + if (integrationAccount) { + try { + await runIntegrationTrigger( + integrationAccount.integrationDefinition, + { + event: IntegrationEventType.PROCESS, + integrationAccount, + eventBody: { + eventHeaders, + eventData: { ...eventBody }, + }, + }, + integrationAccount.integratedById, + ); + + logger.log(`Successfully processed webhook for ${sourceName}`, { + integrationAccountId: integrationAccount.id, + }); + } catch (error) { + logger.error(`Failed to process webhook for ${sourceName}`, { + error, + integrationAccountId: integrationAccount.id, + }); + } + } else { + logger.log( + `Could not find integration account for webhook ${sourceName}`, + { + where: "WebhookService.handleEvents", + }, + ); + } + + return { status: "acknowledged" }; + } +} + +export const webhookService = new WebhookService(); diff --git a/apps/webapp/app/trigger/integrations/integration-run-schedule.ts b/apps/webapp/app/trigger/integrations/integration-run-schedule.ts index c2fb7a9..acf5801 100644 --- a/apps/webapp/app/trigger/integrations/integration-run-schedule.ts +++ b/apps/webapp/app/trigger/integrations/integration-run-schedule.ts @@ -1,38 +1,57 @@ -// import { PrismaClient } from "@prisma/client"; -// import { IntegrationPayloadEventType } from "@core/types"; -// import { logger, schedules, tasks } from "@trigger.dev/sdk/v3"; +import { PrismaClient } from "@prisma/client"; +import { IntegrationEventType } from "@core/types"; +import { logger, schedules, tasks } from "@trigger.dev/sdk/v3"; -// import { integrationRun } from "./integration-run"; +import { type integrationRun } from "./integration-run"; +import { getOrCreatePersonalAccessToken } from "../utils/utils"; +import { nanoid } from "nanoid"; -// 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; + if (!externalId) { + logger.info("No externalId provided"); + return null; + } -// if (!integrationAccount) { -// const deletedSchedule = await schedules.del(externalId); -// logger.info("Deleting schedule as integration account is not there"); -// return deletedSchedule; -// } + const integrationAccount = await prisma.integrationAccount.findUnique({ + where: { id: externalId }, + include: { + integrationDefinition: true, + workspace: true, + }, + }); -// const pat = await prisma.personalAccessToken.findFirst({ -// where: { userId: integrationAccount.workspace.userId, name: "default" }, -// }); + if (!integrationAccount) { + const deletedSchedule = await schedules.del(externalId); + logger.info("No integration account found"); + return deletedSchedule; + } -// return await tasks.trigger("integration-run", { -// event: IntegrationPayloadEventType.SCHEDULED_SYNC, -// pat: pat.token, -// integrationAccount, -// integrationDefinition: integrationAccount.integrationDefinition, -// }); -// }, -// }); + if (!integrationAccount.workspace.userId) { + logger.info("No workspace user id found"); + return null; + } + + const pat = await getOrCreatePersonalAccessToken({ + name: `integration_scheduled_${nanoid(10)}`, + userId: integrationAccount.workspace.userId as string, + }); + + if (!pat || !pat.token) { + logger.info("No pat token found"); + return null; + } + + return await tasks.trigger("integration-run", { + event: IntegrationEventType.SYNC, + pat: pat.token, + patId: pat.id, + 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 e3b49e0..5d2454d 100644 --- a/apps/webapp/app/trigger/integrations/integration-run.ts +++ b/apps/webapp/app/trigger/integrations/integration-run.ts @@ -1,87 +1,100 @@ -// import createLoadRemoteModule, { -// createRequires, -// } from "@paciolan/remote-module-loader"; +import createLoadRemoteModule, { + createRequires, +} from "@paciolan/remote-module-loader"; -// import { logger, task } from "@trigger.dev/sdk/v3"; -// import axios from "axios"; +import { logger, task } from "@trigger.dev/sdk/v3"; +import axios from "axios"; +import { + type IntegrationDefinitionV2, + type IntegrationAccount, +} from "@core/database"; +import { deletePersonalAccessToken } from "../utils/utils"; +import { type IntegrationEventType } from "@core/types"; -// const fetcher = async (url: string) => { -// // Handle remote URLs with axios -// const response = await axios.get(url); +const fetcher = async (url: string) => { + // Handle remote URLs with axios + const response = await axios.get(url); -// return response.data; -// }; + return response.data; +}; -// // eslint-disable-next-line @typescript-eslint/no-explicit-any -// const loadRemoteModule = async (requires: any) => -// createLoadRemoteModule({ fetcher, requires }); +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const loadRemoteModule = async (requires: any) => + createLoadRemoteModule({ fetcher, requires }); -// function createAxiosInstance(token: string) { -// const instance = axios.create(); +function createAxiosInstance(token: string) { + const instance = axios.create(); -// 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/", "/")}`; -// } + 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/", "/")}`; + } -// if ( -// config.url.includes(process.env.FRONTEND_HOST) || -// config.url.includes(process.env.BACKEND_HOST) -// ) { -// config.headers.Authorization = `Bearer ${token}`; -// } + if ( + config.url?.includes(process.env.FRONTEND_HOST || "") || + config.url?.includes(process.env.BACKEND_HOST || "") + ) { + config.headers.Authorization = `Bearer ${token}`; + } -// return config; -// }); + return config; + }); -// return instance; -// } + return instance; +} -// // eslint-disable-next-line @typescript-eslint/no-explicit-any -// const getRequires = (axios: any) => createRequires({ axios }); +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const getRequires = (axios: any) => createRequires({ axios }); -// 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)), -// ); +export const integrationRun = task({ + id: "integration-run", + run: async ({ + pat, + patId, + eventBody, + integrationAccount, + integrationDefinition, + event, + }: { + pat: string; + patId: string; + // This is the event you want to pass to the integration + event: IntegrationEventType; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + eventBody?: any; + integrationDefinition: IntegrationDefinitionV2; + integrationAccount?: IntegrationAccount; + }) => { + const remoteModuleLoad = await loadRemoteModule( + getRequires(createAxiosInstance(pat)), + ); -// logger.info( -// `${integrationDefinition.url}/${integrationDefinition.version}/backend/index.js`, -// ); + logger.info( + `${integrationDefinition.url}/${integrationDefinition.version}/index.cjs`, + ); -// const integrationFunction = await remoteModuleLoad( -// `${integrationDefinition.url}/${integrationDefinition.version}/backend/index.js`, -// ); + const integrationFunction = await remoteModuleLoad( + `${integrationDefinition.url}/${integrationDefinition.version}/index.cjs`, + ); -// // const integrationFunction = await remoteModuleLoad( -// // `${integrationDefinition.url}`, -// // ); + // const integrationFunction = await remoteModuleLoad( + // `${integrationDefinition.url}`, + // ); -// return await integrationFunction.run({ -// integrationAccount, -// integrationDefinition, -// event, -// eventBody: { -// ...(eventBody ? eventBody : {}), -// }, -// }); -// }, -// }); + // Construct the proper IntegrationEventPayload structure + const integrationEventPayload = { + event, + eventBody: { ...eventBody, integrationDefinition }, + config: integrationAccount?.integrationConfiguration || {}, + }; + + const result = await integrationFunction.run(integrationEventPayload); + + await deletePersonalAccessToken(patId); + + logger.info("Personal access token deleted"); + + return result; + }, +}); diff --git a/apps/webapp/app/trigger/integrations/scheduler.ts b/apps/webapp/app/trigger/integrations/scheduler.ts index 90b8eef..5fca7de 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 be1500a..87b4bf4 100644 --- a/apps/webapp/package.json +++ b/apps/webapp/package.json @@ -25,6 +25,7 @@ "@modelcontextprotocol/sdk": "1.13.2", "@nichtsam/remix-auth-email-link": "3.0.0", "@opentelemetry/api": "1.9.0", + "@paciolan/remote-module-loader": "^3.0.3", "@prisma/client": "*", "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-alert-dialog": "^1.0.5", @@ -55,32 +56,32 @@ "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/postcss": "^4.1.7", "@tanstack/react-table": "^8.13.2", - "@tiptap/extension-document": "^2.11.9", - "@tiptap/extension-hard-break": "^2.11.9", - "@tiptap/extension-history": "^2.11.9", - "@tiptap/extension-paragraph": "^2.11.9", - "@tiptap/extension-text": "^2.11.9", - "@tiptap/extension-table": "2.11.9", - "@tiptap/extension-table-cell": "2.11.9", - "@tiptap/extension-heading": "2.11.9", - "@tiptap/extension-table-header": "2.11.9", - "@tiptap/extension-table-row": "2.11.9", "@tiptap/extension-code-block": "2.11.9", "@tiptap/extension-code-block-lowlight": "^2.11.9", - "@tiptap/starter-kit": "2.11.9", - "@tiptap/react": "^2.11.9", + "@tiptap/extension-document": "^2.11.9", + "@tiptap/extension-hard-break": "^2.11.9", + "@tiptap/extension-heading": "2.11.9", + "@tiptap/extension-history": "^2.11.9", + "@tiptap/extension-paragraph": "^2.11.9", + "@tiptap/extension-table": "2.11.9", + "@tiptap/extension-table-cell": "2.11.9", + "@tiptap/extension-table-header": "2.11.9", + "@tiptap/extension-table-row": "2.11.9", + "@tiptap/extension-text": "^2.11.9", "@tiptap/pm": "^2.11.9", - "@trigger.dev/sdk": "^4.0.0-v4-beta.22", + "@tiptap/react": "^2.11.9", + "@tiptap/starter-kit": "2.11.9", "@trigger.dev/react-hooks": "^4.0.0-v4-beta.22", + "@trigger.dev/sdk": "^4.0.0-v4-beta.22", "ai": "4.3.14", "axios": "^1.10.0", "bullmq": "^5.53.2", + "class-transformer": "0.5.1", + "class-validator": "0.14.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "compression": "^1.7.4", "cross-env": "^7.0.3", - "class-transformer": "0.5.1", - "class-validator": "0.14.1", "d3": "^7.9.0", "date-fns": "^4.1.0", "dayjs": "^1.11.10", @@ -96,8 +97,8 @@ "ioredis": "^5.6.1", "isbot": "^4.1.0", "jose": "^5.2.3", - "lucide-react": "^0.511.0", "lowlight": "^3.3.0", + "lucide-react": "^0.511.0", "morgan": "^1.10.0", "nanoid": "3.3.8", "neo4j-driver": "^5.28.1", @@ -138,10 +139,10 @@ "@types/d3": "^7.4.3", "@types/express": "^4.17.13", "@types/morgan": "^1.9.3", - "@types/simple-oauth2": "^5.0.7", "@types/react": "^18.2.20", "@types/react-dom": "^18.2.7", "@types/react-virtualized": "^9.22.0", + "@types/simple-oauth2": "^5.0.7", "@typescript-eslint/eslint-plugin": "^6.7.4", "@typescript-eslint/parser": "^6.7.4", "autoprefixer": "^10.4.19", diff --git a/integrations/slack/src/create-activity.ts b/integrations/slack/src/create-activity.ts index 78bf7d3..2aa57d4 100644 --- a/integrations/slack/src/create-activity.ts +++ b/integrations/slack/src/create-activity.ts @@ -48,7 +48,7 @@ export const createActivityEvent = async ( const accessToken = config.access_token; - const text = `DM with Sigma channel Content: '${event.text}'`; + const text = `DM with SOL channel Content: '${event.text}'`; const permalinkResponse = await axios.get( `https://slack.com/api/chat.getPermalink?channel=${event.channel}&message_ts=${event.ts}`, @@ -104,7 +104,7 @@ export const createActivityEvent = async ( conversationContext = `channel ${conversationInfo.name}(${conversationInfo.id})`; } - const text = `Message from user ${userIdMap.get(eventMessage.user)?.real_name}(${eventMessage.user}) in ${conversationContext} at ${eventMessage.ts}. Content: '${eventMessageText}'`; + const text = `Message to User from ${userIdMap.get(eventMessage.user)?.real_name}(${eventMessage.user}) in ${conversationContext} at ${eventMessage.ts}. Content: '${eventMessageText}'`; const permalinkResponse = await axios.get( `https://slack.com/api/chat.getPermalink?channel=${channel}&message_ts=${ts}`, @@ -115,9 +115,9 @@ export const createActivityEvent = async ( const activity = { sourceURL: permalinkResponse.data.permalink, + source: 'slack', text, integrationAccountId: config.integrationAccountId, - taskId: null, }; await axios.post('/api/v1/activity', activity); diff --git a/integrations/slack/src/index.ts b/integrations/slack/src/index.ts index 8e5f84d..5bf6361 100644 --- a/integrations/slack/src/index.ts +++ b/integrations/slack/src/index.ts @@ -18,12 +18,10 @@ export async function run(eventPayload: IntegrationEventPayload) { return eventPayload.eventBody.event.user; case IntegrationEventType.PROCESS: - return createActivityEvent(eventPayload.eventBody, eventPayload.config); + return createActivityEvent(eventPayload.eventBody.eventData, eventPayload.config); default: - return { - message: `The event payload type is ${eventPayload.event}`, - }; + return { message: `The event payload type is ${eventPayload.event}` }; } } diff --git a/package.json b/package.json index ba522b4..ccacfef 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ }, "dependencies": { "@changesets/cli": "2.26.2", + "@redplanethq/sdk": "^0.1.0", "@remix-run/changelog-github": "^0.0.5" }, "packageManager": "pnpm@9.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8355be4..a9ea7ad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@changesets/cli': specifier: 2.26.2 version: 2.26.2 + '@redplanethq/sdk': + specifier: ^0.1.0 + version: 0.1.0 '@remix-run/changelog-github': specifier: ^0.0.5 version: 0.0.5(encoding@0.1.13) @@ -66,6 +69,9 @@ importers: '@opentelemetry/api': specifier: 1.9.0 version: 1.9.0 + '@paciolan/remote-module-loader': + specifier: ^3.0.3 + version: 3.0.3 '@prisma/client': specifier: '*' version: 5.4.1(prisma@5.4.1) @@ -369,7 +375,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@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) + 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) '@remix-run/eslint-config': specifier: 2.16.7 version: 2.16.7(eslint@8.57.1)(react@18.3.1)(typescript@5.8.3) @@ -384,7 +390,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@18.19.115)(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@24.0.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0)) '@trigger.dev/build': specifier: ^4.0.0-v4-beta.22 version: 4.0.0-v4-beta.22(typescript@5.8.3) @@ -480,10 +486,10 @@ importers: version: 5.8.3 vite: specifier: ^6.0.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) + 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) vite-tsconfig-paths: specifier: ^4.2.1 - 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)) + 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)) packages/database: dependencies: @@ -570,7 +576,7 @@ importers: version: 6.0.1 tsup: specifier: ^8.0.1 - version: 8.5.0(@swc/core@1.3.101(@swc/helpers@0.5.17))(jiti@2.4.2)(postcss@8.5.5)(typescript@5.8.3)(yaml@2.8.0) + version: 8.5.0(@swc/core@1.3.101)(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 @@ -2053,6 +2059,9 @@ packages: '@oslojs/jwt@0.2.0': resolution: {integrity: sha512-bLE7BtHrURedCn4Mco3ma9L4Y1GR2SMBuIvjWr7rmQ4/W/4Jy70TIAgZ+0nIlk0xHz1vNP8x8DCns45Sb2XRbg==} + '@paciolan/remote-module-loader@3.0.3': + resolution: {integrity: sha512-gwdJcP5QQbO7OUf00FWh+A5DkF3TnIv06JB3aMpm9pbbHcdouFrjo4nEW7HtbWeIs7z3gwGEVd82clAmzVzh3Q==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -3064,6 +3073,10 @@ packages: peerDependencies: react: 18.2.0 + '@redplanethq/sdk@0.1.0': + resolution: {integrity: sha512-RmPfT9XESjTSMLlAMkolZEF28PvGo5hlwrG75JQy1tAZkvaTHzC7A2mEAMbsBvOMrJuUztL3NtCmVF//C/C/+A==} + engines: {node: '>=18.0.0'} + '@remirror/core-constants@3.0.0': resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} @@ -11730,6 +11743,8 @@ snapshots: dependencies: '@oslojs/encoding': 0.4.1 + '@paciolan/remote-module-loader@3.0.3': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -11814,7 +11829,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@radix-ui/react-arrow@1.1.7(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -11868,7 +11883,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@radix-ui/react-collapsible@1.1.11(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -11896,7 +11911,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@radix-ui/react-collection@1.1.7(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -11986,7 +12001,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -12037,7 +12052,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -12124,7 +12139,7 @@ snapshots: react-remove-scroll: 2.5.7(@types/react@18.2.47)(react@18.3.1) optionalDependencies: '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@radix-ui/react-popover@1.1.14(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -12165,7 +12180,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@radix-ui/react-popper@1.2.7(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -12193,7 +12208,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -12213,7 +12228,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@radix-ui/react-presence@1.1.4(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -12232,7 +12247,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -12258,7 +12273,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@radix-ui/react-roving-focus@1.1.10(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -12418,7 +12433,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@radix-ui/react-toggle@1.1.0(@types/react-dom@18.3.7(@types/react@18.2.47))(@types/react@18.2.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -12429,7 +12444,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@radix-ui/react-tooltip@1.1.1(@types/react-dom@18.3.7(@types/react@18.2.47))(@types/react@18.2.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -12449,7 +12464,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@radix-ui/react-tooltip@1.2.7(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -12579,7 +12594,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -12716,6 +12731,10 @@ snapshots: dependencies: react: 18.3.1 + '@redplanethq/sdk@0.1.0': + dependencies: + commander: 14.0.0 + '@remirror/core-constants@3.0.0': {} '@remix-run/changelog-github@0.0.5(encoding@0.1.13)': @@ -12727,7 +12746,7 @@ snapshots: 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@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/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)': dependencies: '@babel/core': 7.27.4 '@babel/generator': 7.27.5 @@ -12744,7 +12763,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@18.19.115)(lightningcss@1.30.1)(terser@5.42.0) + '@vanilla-extract/integration': 6.5.0(@types/node@24.0.0)(lightningcss@1.30.1)(terser@5.42.0) arg: 5.0.2 cacache: 17.1.4 chalk: 4.1.2 @@ -12784,12 +12803,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@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.0) + 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) 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@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.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) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -13528,12 +13547,12 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.1.7 - '@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))': + '@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))': dependencies: '@tailwindcss/node': 4.1.9 '@tailwindcss/oxide': 4.1.9 tailwindcss: 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) + 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) '@tanstack/react-table@8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -14136,6 +14155,10 @@ snapshots: '@types/range-parser@1.2.7': {} + '@types/react-dom@18.3.7(@types/react@18.2.47)': + dependencies: + '@types/react': 18.2.47 + '@types/react-dom@18.3.7(@types/react@18.2.69)': dependencies: '@types/react': 18.2.69 @@ -14453,7 +14476,7 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - '@vanilla-extract/integration@6.5.0(@types/node@18.19.115)(lightningcss@1.30.1)(terser@5.42.0)': + '@vanilla-extract/integration@6.5.0(@types/node@24.0.0)(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) @@ -14466,8 +14489,8 @@ snapshots: lodash: 4.17.21 mlly: 1.7.4 outdent: 0.8.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) + 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) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -19217,7 +19240,7 @@ snapshots: '@radix-ui/react-tooltip': 1.1.1(@types/react-dom@18.3.7(@types/react@18.2.47))(@types/react@18.2.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@swc/core': 1.3.101(@swc/helpers@0.5.17) '@types/react': 18.2.47 - '@types/react-dom': 18.3.7(@types/react@18.2.69) + '@types/react-dom': 18.3.7(@types/react@18.2.47) '@types/webpack': 5.28.5(@swc/core@1.3.101(@swc/helpers@0.5.17))(esbuild@0.19.11) autoprefixer: 10.4.14(postcss@8.4.38) chalk: 4.1.2 @@ -20480,7 +20503,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.0(@swc/core@1.3.101(@swc/helpers@0.5.17))(jiti@2.4.2)(postcss@8.5.5)(typescript@5.8.3)(yaml@2.8.0): + tsup@8.5.0(@swc/core@1.3.101)(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 @@ -20872,13 +20895,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@1.6.1(@types/node@18.19.115)(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): dependencies: cac: 6.7.14 debug: 4.4.1 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.19(@types/node@18.19.115)(lightningcss@1.30.1)(terser@5.42.0) + vite: 5.4.19(@types/node@24.0.0)(lightningcss@1.30.1)(terser@5.42.0) transitivePeerDependencies: - '@types/node' - less @@ -20890,13 +20913,13 @@ snapshots: - supports-color - terser - 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): + 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): 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@18.19.115)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(yaml@2.8.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) transitivePeerDependencies: - '@types/node' - jiti @@ -20911,29 +20934,29 @@ snapshots: - tsx - yaml - 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)): + 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)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - 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) + 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) transitivePeerDependencies: - supports-color - typescript - vite@5.4.19(@types/node@18.19.115)(lightningcss@1.30.1)(terser@5.42.0): + vite@5.4.19(@types/node@24.0.0)(lightningcss@1.30.1)(terser@5.42.0): dependencies: esbuild: 0.21.5 postcss: 8.5.5 rollup: 4.43.0 optionalDependencies: - '@types/node': 18.19.115 + '@types/node': 24.0.0 fsevents: 2.3.3 lightningcss: 1.30.1 terser: 5.42.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): + 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): dependencies: esbuild: 0.25.5 fdir: 6.4.6(picomatch@4.0.2) @@ -20942,7 +20965,7 @@ snapshots: rollup: 4.43.0 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 18.19.115 + '@types/node': 24.0.0 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1