Feat: Activtiy to memory ingestion

This commit is contained in:
Manoj K 2025-07-11 16:01:54 +05:30 committed by Harshith Mullapudi
parent 1bbb5a0f57
commit d80bfadf9c
13 changed files with 599 additions and 238 deletions

View File

@ -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 };

View File

@ -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<string, string | string[]> = {};
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<string, string | string[]> = {};
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 });
}
}

View File

@ -13,11 +13,11 @@ import type { IntegrationDefinitionV2 } from "@core/database";
async function prepareIntegrationTrigger( async function prepareIntegrationTrigger(
integrationDefinition: IntegrationDefinitionV2, integrationDefinition: IntegrationDefinitionV2,
userId?: string, userId?: string,
workspaceId?: string,
) { ) {
logger.info(`Loading integration ${integrationDefinition.slug}`); logger.info(`Loading integration ${integrationDefinition.slug}`);
let pat = ""; let pat = "";
let patId = "";
if (userId) { if (userId) {
// Use the integration slug as the token name for uniqueness // Use the integration slug as the token name for uniqueness
const tokenResult = await getOrCreatePersonalAccessToken({ const tokenResult = await getOrCreatePersonalAccessToken({
@ -25,11 +25,13 @@ async function prepareIntegrationTrigger(
userId, userId,
}); });
pat = tokenResult.token ?? ""; pat = tokenResult.token ?? "";
patId = tokenResult.id ?? "";
} }
return { return {
integrationDefinition, integrationDefinition,
pat, pat,
patId,
}; };
} }
@ -41,13 +43,8 @@ export async function runIntegrationTriggerAsync(
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
event: any, event: any,
userId?: string, userId?: string,
workspaceId?: string,
) { ) {
const params = await prepareIntegrationTrigger( const params = await prepareIntegrationTrigger(integrationDefinition, userId);
integrationDefinition,
userId,
workspaceId,
);
return await tasks.trigger<typeof integrationRun>("integration-run", { return await tasks.trigger<typeof integrationRun>("integration-run", {
...params, ...params,
event, event,
@ -62,13 +59,8 @@ export async function runIntegrationTrigger(
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
event: any, event: any,
userId?: string, userId?: string,
workspaceId?: string,
) { ) {
const params = await prepareIntegrationTrigger( const params = await prepareIntegrationTrigger(integrationDefinition, userId);
integrationDefinition,
userId,
workspaceId,
);
const response = await tasks.triggerAndPoll<typeof integrationRun>( const response = await tasks.triggerAndPoll<typeof integrationRun>(
"integration-run", "integration-run",

View File

@ -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 * as simpleOauth2 from "simple-oauth2";
import { tasks } from "@trigger.dev/sdk/v3"; import { tasks } from "@trigger.dev/sdk/v3";
import { import {
@ -121,7 +121,7 @@ export async function callbackHandler(
const integrationAccount = await runIntegrationTrigger( const integrationAccount = await runIntegrationTrigger(
integrationDefinition, integrationDefinition,
{ {
event: IntegrationPayloadEventType.INTEGRATION_ACCOUNT_CREATED, event: IntegrationEventType.SETUP,
eventBody: { eventBody: {
oauthResponse: tokensResponse.token, oauthResponse: tokensResponse.token,
oauthParams: { oauthParams: {
@ -132,7 +132,6 @@ export async function callbackHandler(
}, },
}, },
sessionRecord.userId, sessionRecord.userId,
sessionRecord.workspaceId,
); );
await tasks.trigger<typeof scheduler>("scheduler", { await tasks.trigger<typeof scheduler>("scheduler", {

View File

@ -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<string, string | string[]>;
export type EventBody = Record<string, any>;
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();

View File

@ -1,38 +1,57 @@
// import { PrismaClient } from "@prisma/client"; import { PrismaClient } from "@prisma/client";
// import { IntegrationPayloadEventType } from "@core/types"; import { IntegrationEventType } from "@core/types";
// import { logger, schedules, tasks } from "@trigger.dev/sdk/v3"; 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({ export const integrationRunSchedule = schedules.task({
// id: "integration-run-schedule", id: "integration-run-schedule",
// run: async (payload) => { run: async (payload) => {
// const { externalId } = payload; const { externalId } = payload;
// const integrationAccount = await prisma.integrationAccount.findUnique({ if (!externalId) {
// where: { id: externalId }, logger.info("No externalId provided");
// include: { return null;
// integrationDefinition: true, }
// workspace: true,
// },
// });
// if (!integrationAccount) { const integrationAccount = await prisma.integrationAccount.findUnique({
// const deletedSchedule = await schedules.del(externalId); where: { id: externalId },
// logger.info("Deleting schedule as integration account is not there"); include: {
// return deletedSchedule; integrationDefinition: true,
// } workspace: true,
},
});
// const pat = await prisma.personalAccessToken.findFirst({ if (!integrationAccount) {
// where: { userId: integrationAccount.workspace.userId, name: "default" }, const deletedSchedule = await schedules.del(externalId);
// }); logger.info("No integration account found");
return deletedSchedule;
}
// return await tasks.trigger<typeof integrationRun>("integration-run", { if (!integrationAccount.workspace.userId) {
// event: IntegrationPayloadEventType.SCHEDULED_SYNC, logger.info("No workspace user id found");
// pat: pat.token, return null;
// integrationAccount, }
// integrationDefinition: integrationAccount.integrationDefinition,
// }); 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<typeof integrationRun>("integration-run", {
event: IntegrationEventType.SYNC,
pat: pat.token,
patId: pat.id,
integrationAccount,
integrationDefinition: integrationAccount.integrationDefinition,
});
},
});

View File

@ -1,87 +1,100 @@
// import createLoadRemoteModule, { import createLoadRemoteModule, {
// createRequires, createRequires,
// } from "@paciolan/remote-module-loader"; } from "@paciolan/remote-module-loader";
// import { logger, task } from "@trigger.dev/sdk/v3"; import { logger, task } from "@trigger.dev/sdk/v3";
// import axios from "axios"; 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) => { const fetcher = async (url: string) => {
// // Handle remote URLs with axios // Handle remote URLs with axios
// const response = await axios.get(url); const response = await axios.get(url);
// return response.data; return response.data;
// }; };
// // eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
// const loadRemoteModule = async (requires: any) => const loadRemoteModule = async (requires: any) =>
// createLoadRemoteModule({ fetcher, requires }); createLoadRemoteModule({ fetcher, requires });
// function createAxiosInstance(token: string) { function createAxiosInstance(token: string) {
// const instance = axios.create(); const instance = axios.create();
// instance.interceptors.request.use((config) => { instance.interceptors.request.use((config) => {
// // Check if URL starts with /api and doesn't have a full host // Check if URL starts with /api and doesn't have a full host
// if (config.url?.startsWith("/api")) { if (config.url?.startsWith("/api")) {
// config.url = `${process.env.BACKEND_HOST}${config.url.replace("/api/", "/")}`; config.url = `${process.env.BACKEND_HOST}${config.url.replace("/api/", "/")}`;
// } }
// if ( if (
// config.url.includes(process.env.FRONTEND_HOST) || config.url?.includes(process.env.FRONTEND_HOST || "") ||
// config.url.includes(process.env.BACKEND_HOST) config.url?.includes(process.env.BACKEND_HOST || "")
// ) { ) {
// config.headers.Authorization = `Bearer ${token}`; config.headers.Authorization = `Bearer ${token}`;
// } }
// return config; return config;
// }); });
// return instance; return instance;
// } }
// // eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
// const getRequires = (axios: any) => createRequires({ axios }); const getRequires = (axios: any) => createRequires({ axios });
// export const integrationRun = task({ export const integrationRun = task({
// id: "integration-run", id: "integration-run",
// run: async ({ run: async ({
// pat, pat,
// eventBody, patId,
// integrationAccount, eventBody,
// integrationDefinition, integrationAccount,
// event, integrationDefinition,
// }: { event,
// pat: string; }: {
// // This is the event you want to pass to the integration pat: string;
// // eslint-disable-next-line @typescript-eslint/no-explicit-any patId: string;
// event: any; // This is the event you want to pass to the integration
// // eslint-disable-next-line @typescript-eslint/no-explicit-any event: IntegrationEventType;
// eventBody?: any; // eslint-disable-next-line @typescript-eslint/no-explicit-any
// integrationDefinition: IntegrationDefinition; eventBody?: any;
// integrationAccount?: IntegrationAccount; integrationDefinition: IntegrationDefinitionV2;
// }) => { integrationAccount?: IntegrationAccount;
// const remoteModuleLoad = await loadRemoteModule( }) => {
// getRequires(createAxiosInstance(pat)), const remoteModuleLoad = await loadRemoteModule(
// ); getRequires(createAxiosInstance(pat)),
);
// logger.info( logger.info(
// `${integrationDefinition.url}/${integrationDefinition.version}/backend/index.js`, `${integrationDefinition.url}/${integrationDefinition.version}/index.cjs`,
// ); );
// const integrationFunction = await remoteModuleLoad( const integrationFunction = await remoteModuleLoad(
// `${integrationDefinition.url}/${integrationDefinition.version}/backend/index.js`, `${integrationDefinition.url}/${integrationDefinition.version}/index.cjs`,
// ); );
// // const integrationFunction = await remoteModuleLoad( // const integrationFunction = await remoteModuleLoad(
// // `${integrationDefinition.url}`, // `${integrationDefinition.url}`,
// // ); // );
// return await integrationFunction.run({ // Construct the proper IntegrationEventPayload structure
// integrationAccount, const integrationEventPayload = {
// integrationDefinition, event,
// event, eventBody: { ...eventBody, integrationDefinition },
// eventBody: { config: integrationAccount?.integrationConfiguration || {},
// ...(eventBody ? eventBody : {}), };
// },
// }); const result = await integrationFunction.run(integrationEventPayload);
// },
// }); await deletePersonalAccessToken(patId);
logger.info("Personal access token deleted");
return result;
},
});

View File

@ -1,64 +1,64 @@
// import { PrismaClient } from "@prisma/client"; import { PrismaClient } from "@prisma/client";
// import { logger, schedules, task } from "@trigger.dev/sdk/v3"; 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({ export const scheduler = task({
// id: "scheduler", id: "scheduler",
// run: async (payload: { integrationAccountId: string }) => { run: async (payload: { integrationAccountId: string }) => {
// const { integrationAccountId } = payload; const { integrationAccountId } = payload;
// const integrationAccount = await prisma.integrationAccount.findUnique({ const integrationAccount = await prisma.integrationAccount.findUnique({
// where: { id: integrationAccountId, deleted: null }, where: { id: integrationAccountId, deleted: null },
// include: { include: {
// integrationDefinition: true, integrationDefinition: true,
// workspace: true, workspace: true,
// }, },
// }); });
// if (!integrationAccount) { if (!integrationAccount) {
// logger.error("Integration account not found"); logger.error("Integration account not found");
// return null; return null;
// } }
// if (!integrationAccount.workspace) { if (!integrationAccount.workspace) {
// return null; return null;
// } }
// // eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
// const spec = integrationAccount.integrationDefinition.spec as any; const spec = integrationAccount.integrationDefinition.spec as any;
// if (spec.schedule && spec.schedule.frequency) { if (spec.schedule && spec.schedule.frequency) {
// const createdSchedule = await schedules.create({ const createdSchedule = await schedules.create({
// // The id of the scheduled task you want to attach to. // The id of the scheduled task you want to attach to.
// task: integrationRunSchedule.id, task: integrationRunSchedule.id,
// // The schedule in cron format. // The schedule in cron format.
// cron: spec.schedule.frequency, cron: spec.schedule.frequency,
// // eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
// timezone: (integrationAccount.workspace.preferences as any).timezone, // 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. // this is required, it prevents you from creating duplicate schedules. It will update the schedule if it already exists.
// deduplicationKey: integrationAccount.id, deduplicationKey: integrationAccount.id,
// externalId: integrationAccount.id, externalId: integrationAccount.id,
// }); });
// await prisma.integrationAccount.update({ await prisma.integrationAccount.update({
// where: { where: {
// id: integrationAccount.id, id: integrationAccount.id,
// }, },
// data: { data: {
// settings: { settings: {
// // eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
// ...(integrationAccount.settings as any), ...(integrationAccount.settings as any),
// scheduleId: createdSchedule.id, scheduleId: createdSchedule.id,
// }, },
// }, },
// }); });
// return createdSchedule; return createdSchedule;
// } }
// return "No schedule for this task"; return "No schedule for this task";
// }, },
// }); });

View File

@ -25,6 +25,7 @@
"@modelcontextprotocol/sdk": "1.13.2", "@modelcontextprotocol/sdk": "1.13.2",
"@nichtsam/remix-auth-email-link": "3.0.0", "@nichtsam/remix-auth-email-link": "3.0.0",
"@opentelemetry/api": "1.9.0", "@opentelemetry/api": "1.9.0",
"@paciolan/remote-module-loader": "^3.0.3",
"@prisma/client": "*", "@prisma/client": "*",
"@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-accordion": "^1.1.2",
"@radix-ui/react-alert-dialog": "^1.0.5", "@radix-ui/react-alert-dialog": "^1.0.5",
@ -55,32 +56,32 @@
"@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/postcss": "^4.1.7", "@tailwindcss/postcss": "^4.1.7",
"@tanstack/react-table": "^8.13.2", "@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": "2.11.9",
"@tiptap/extension-code-block-lowlight": "^2.11.9", "@tiptap/extension-code-block-lowlight": "^2.11.9",
"@tiptap/starter-kit": "2.11.9", "@tiptap/extension-document": "^2.11.9",
"@tiptap/react": "^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", "@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/react-hooks": "^4.0.0-v4-beta.22",
"@trigger.dev/sdk": "^4.0.0-v4-beta.22",
"ai": "4.3.14", "ai": "4.3.14",
"axios": "^1.10.0", "axios": "^1.10.0",
"bullmq": "^5.53.2", "bullmq": "^5.53.2",
"class-transformer": "0.5.1",
"class-validator": "0.14.1",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"compression": "^1.7.4", "compression": "^1.7.4",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"class-transformer": "0.5.1",
"class-validator": "0.14.1",
"d3": "^7.9.0", "d3": "^7.9.0",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"dayjs": "^1.11.10", "dayjs": "^1.11.10",
@ -96,8 +97,8 @@
"ioredis": "^5.6.1", "ioredis": "^5.6.1",
"isbot": "^4.1.0", "isbot": "^4.1.0",
"jose": "^5.2.3", "jose": "^5.2.3",
"lucide-react": "^0.511.0",
"lowlight": "^3.3.0", "lowlight": "^3.3.0",
"lucide-react": "^0.511.0",
"morgan": "^1.10.0", "morgan": "^1.10.0",
"nanoid": "3.3.8", "nanoid": "3.3.8",
"neo4j-driver": "^5.28.1", "neo4j-driver": "^5.28.1",
@ -138,10 +139,10 @@
"@types/d3": "^7.4.3", "@types/d3": "^7.4.3",
"@types/express": "^4.17.13", "@types/express": "^4.17.13",
"@types/morgan": "^1.9.3", "@types/morgan": "^1.9.3",
"@types/simple-oauth2": "^5.0.7",
"@types/react": "^18.2.20", "@types/react": "^18.2.20",
"@types/react-dom": "^18.2.7", "@types/react-dom": "^18.2.7",
"@types/react-virtualized": "^9.22.0", "@types/react-virtualized": "^9.22.0",
"@types/simple-oauth2": "^5.0.7",
"@typescript-eslint/eslint-plugin": "^6.7.4", "@typescript-eslint/eslint-plugin": "^6.7.4",
"@typescript-eslint/parser": "^6.7.4", "@typescript-eslint/parser": "^6.7.4",
"autoprefixer": "^10.4.19", "autoprefixer": "^10.4.19",

View File

@ -48,7 +48,7 @@ export const createActivityEvent = async (
const accessToken = config.access_token; 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( const permalinkResponse = await axios.get(
`https://slack.com/api/chat.getPermalink?channel=${event.channel}&message_ts=${event.ts}`, `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})`; 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( const permalinkResponse = await axios.get(
`https://slack.com/api/chat.getPermalink?channel=${channel}&message_ts=${ts}`, `https://slack.com/api/chat.getPermalink?channel=${channel}&message_ts=${ts}`,
@ -115,9 +115,9 @@ export const createActivityEvent = async (
const activity = { const activity = {
sourceURL: permalinkResponse.data.permalink, sourceURL: permalinkResponse.data.permalink,
source: 'slack',
text, text,
integrationAccountId: config.integrationAccountId, integrationAccountId: config.integrationAccountId,
taskId: null,
}; };
await axios.post('/api/v1/activity', activity); await axios.post('/api/v1/activity', activity);

View File

@ -18,12 +18,10 @@ export async function run(eventPayload: IntegrationEventPayload) {
return eventPayload.eventBody.event.user; return eventPayload.eventBody.event.user;
case IntegrationEventType.PROCESS: case IntegrationEventType.PROCESS:
return createActivityEvent(eventPayload.eventBody, eventPayload.config); return createActivityEvent(eventPayload.eventBody.eventData, eventPayload.config);
default: default:
return { return { message: `The event payload type is ${eventPayload.event}` };
message: `The event payload type is ${eventPayload.event}`,
};
} }
} }

View File

@ -28,6 +28,7 @@
}, },
"dependencies": { "dependencies": {
"@changesets/cli": "2.26.2", "@changesets/cli": "2.26.2",
"@redplanethq/sdk": "^0.1.0",
"@remix-run/changelog-github": "^0.0.5" "@remix-run/changelog-github": "^0.0.5"
}, },
"packageManager": "pnpm@9.0.0", "packageManager": "pnpm@9.0.0",

105
pnpm-lock.yaml generated
View File

@ -11,6 +11,9 @@ importers:
'@changesets/cli': '@changesets/cli':
specifier: 2.26.2 specifier: 2.26.2
version: 2.26.2 version: 2.26.2
'@redplanethq/sdk':
specifier: ^0.1.0
version: 0.1.0
'@remix-run/changelog-github': '@remix-run/changelog-github':
specifier: ^0.0.5 specifier: ^0.0.5
version: 0.0.5(encoding@0.1.13) version: 0.0.5(encoding@0.1.13)
@ -66,6 +69,9 @@ importers:
'@opentelemetry/api': '@opentelemetry/api':
specifier: 1.9.0 specifier: 1.9.0
version: 1.9.0 version: 1.9.0
'@paciolan/remote-module-loader':
specifier: ^3.0.3
version: 3.0.3
'@prisma/client': '@prisma/client':
specifier: '*' specifier: '*'
version: 5.4.1(prisma@5.4.1) version: 5.4.1(prisma@5.4.1)
@ -369,7 +375,7 @@ importers:
devDependencies: devDependencies:
'@remix-run/dev': '@remix-run/dev':
specifier: 2.16.7 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': '@remix-run/eslint-config':
specifier: 2.16.7 specifier: 2.16.7
version: 2.16.7(eslint@8.57.1)(react@18.3.1)(typescript@5.8.3) 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) version: 0.5.16(tailwindcss@4.1.7)
'@tailwindcss/vite': '@tailwindcss/vite':
specifier: ^4.1.7 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': '@trigger.dev/build':
specifier: ^4.0.0-v4-beta.22 specifier: ^4.0.0-v4-beta.22
version: 4.0.0-v4-beta.22(typescript@5.8.3) version: 4.0.0-v4-beta.22(typescript@5.8.3)
@ -480,10 +486,10 @@ importers:
version: 5.8.3 version: 5.8.3
vite: vite:
specifier: ^6.0.0 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: vite-tsconfig-paths:
specifier: ^4.2.1 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: packages/database:
dependencies: dependencies:
@ -570,7 +576,7 @@ importers:
version: 6.0.1 version: 6.0.1
tsup: tsup:
specifier: ^8.0.1 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: typescript:
specifier: ^5.3.0 specifier: ^5.3.0
version: 5.8.3 version: 5.8.3
@ -2053,6 +2059,9 @@ packages:
'@oslojs/jwt@0.2.0': '@oslojs/jwt@0.2.0':
resolution: {integrity: sha512-bLE7BtHrURedCn4Mco3ma9L4Y1GR2SMBuIvjWr7rmQ4/W/4Jy70TIAgZ+0nIlk0xHz1vNP8x8DCns45Sb2XRbg==} resolution: {integrity: sha512-bLE7BtHrURedCn4Mco3ma9L4Y1GR2SMBuIvjWr7rmQ4/W/4Jy70TIAgZ+0nIlk0xHz1vNP8x8DCns45Sb2XRbg==}
'@paciolan/remote-module-loader@3.0.3':
resolution: {integrity: sha512-gwdJcP5QQbO7OUf00FWh+A5DkF3TnIv06JB3aMpm9pbbHcdouFrjo4nEW7HtbWeIs7z3gwGEVd82clAmzVzh3Q==}
'@pkgjs/parseargs@0.11.0': '@pkgjs/parseargs@0.11.0':
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'} engines: {node: '>=14'}
@ -3064,6 +3073,10 @@ packages:
peerDependencies: peerDependencies:
react: 18.2.0 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': '@remirror/core-constants@3.0.0':
resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==}
@ -11730,6 +11743,8 @@ snapshots:
dependencies: dependencies:
'@oslojs/encoding': 0.4.1 '@oslojs/encoding': 0.4.1
'@paciolan/remote-module-loader@3.0.3': {}
'@pkgjs/parseargs@0.11.0': '@pkgjs/parseargs@0.11.0':
optional: true optional: true
@ -11814,7 +11829,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 18.2.47 '@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)': '@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: dependencies:
@ -11868,7 +11883,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 18.2.47 '@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)': '@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: dependencies:
@ -11896,7 +11911,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 18.2.47 '@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)': '@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: dependencies:
@ -11986,7 +12001,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 18.2.47 '@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)': '@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: dependencies:
@ -12037,7 +12052,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 18.2.47 '@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)': '@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: dependencies:
@ -12124,7 +12139,7 @@ snapshots:
react-remove-scroll: 2.5.7(@types/react@18.2.47)(react@18.3.1) react-remove-scroll: 2.5.7(@types/react@18.2.47)(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 18.2.47 '@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)': '@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: dependencies:
@ -12165,7 +12180,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 18.2.47 '@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)': '@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: dependencies:
@ -12193,7 +12208,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 18.2.47 '@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)': '@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: dependencies:
@ -12213,7 +12228,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 18.2.47 '@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)': '@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: dependencies:
@ -12232,7 +12247,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 18.2.47 '@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)': '@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: dependencies:
@ -12258,7 +12273,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 18.2.47 '@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)': '@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: dependencies:
@ -12418,7 +12433,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 18.2.47 '@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)': '@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: dependencies:
@ -12429,7 +12444,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 18.2.47 '@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)': '@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: dependencies:
@ -12449,7 +12464,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 18.2.47 '@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)': '@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: dependencies:
@ -12579,7 +12594,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 18.2.47 '@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)': '@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: dependencies:
@ -12716,6 +12731,10 @@ snapshots:
dependencies: dependencies:
react: 18.3.1 react: 18.3.1
'@redplanethq/sdk@0.1.0':
dependencies:
commander: 14.0.0
'@remirror/core-constants@3.0.0': {} '@remirror/core-constants@3.0.0': {}
'@remix-run/changelog-github@0.0.5(encoding@0.1.13)': '@remix-run/changelog-github@0.0.5(encoding@0.1.13)':
@ -12727,7 +12746,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- encoding - 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: dependencies:
'@babel/core': 7.27.4 '@babel/core': 7.27.4
'@babel/generator': 7.27.5 '@babel/generator': 7.27.5
@ -12744,7 +12763,7 @@ snapshots:
'@remix-run/router': 1.23.0 '@remix-run/router': 1.23.0
'@remix-run/server-runtime': 2.16.7(typescript@5.8.3) '@remix-run/server-runtime': 2.16.7(typescript@5.8.3)
'@types/mdx': 2.0.13 '@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 arg: 5.0.2
cacache: 17.1.4 cacache: 17.1.4
chalk: 4.1.2 chalk: 4.1.2
@ -12784,12 +12803,12 @@ snapshots:
tar-fs: 2.1.3 tar-fs: 2.1.3
tsconfig-paths: 4.2.0 tsconfig-paths: 4.2.0
valibot: 0.41.0(typescript@5.8.3) 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 ws: 7.5.10
optionalDependencies: optionalDependencies:
'@remix-run/serve': 2.16.7(typescript@5.8.3) '@remix-run/serve': 2.16.7(typescript@5.8.3)
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: transitivePeerDependencies:
- '@types/node' - '@types/node'
- babel-plugin-macros - babel-plugin-macros
@ -13528,12 +13547,12 @@ snapshots:
postcss-selector-parser: 6.0.10 postcss-selector-parser: 6.0.10
tailwindcss: 4.1.7 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: dependencies:
'@tailwindcss/node': 4.1.9 '@tailwindcss/node': 4.1.9
'@tailwindcss/oxide': 4.1.9 '@tailwindcss/oxide': 4.1.9
tailwindcss: 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)': '@tanstack/react-table@8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies: dependencies:
@ -14136,6 +14155,10 @@ snapshots:
'@types/range-parser@1.2.7': {} '@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)': '@types/react-dom@18.3.7(@types/react@18.2.69)':
dependencies: dependencies:
'@types/react': 18.2.69 '@types/react': 18.2.69
@ -14453,7 +14476,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- babel-plugin-macros - 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: dependencies:
'@babel/core': 7.27.4 '@babel/core': 7.27.4
'@babel/plugin-syntax-typescript': 7.27.1(@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 lodash: 4.17.21
mlly: 1.7.4 mlly: 1.7.4
outdent: 0.8.0 outdent: 0.8.0
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)
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)
transitivePeerDependencies: transitivePeerDependencies:
- '@types/node' - '@types/node'
- babel-plugin-macros - 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) '@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) '@swc/core': 1.3.101(@swc/helpers@0.5.17)
'@types/react': 18.2.47 '@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) '@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) autoprefixer: 10.4.14(postcss@8.4.38)
chalk: 4.1.2 chalk: 4.1.2
@ -20480,7 +20503,7 @@ snapshots:
tslib@2.8.1: {} 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: dependencies:
bundle-require: 5.1.0(esbuild@0.25.5) bundle-require: 5.1.0(esbuild@0.25.5)
cac: 6.7.14 cac: 6.7.14
@ -20872,13 +20895,13 @@ snapshots:
'@types/unist': 3.0.3 '@types/unist': 3.0.3
vfile-message: 4.0.2 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: dependencies:
cac: 6.7.14 cac: 6.7.14
debug: 4.4.1 debug: 4.4.1
pathe: 1.1.2 pathe: 1.1.2
picocolors: 1.1.1 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: transitivePeerDependencies:
- '@types/node' - '@types/node'
- less - less
@ -20890,13 +20913,13 @@ snapshots:
- supports-color - supports-color
- terser - 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: dependencies:
cac: 6.7.14 cac: 6.7.14
debug: 4.4.1 debug: 4.4.1
es-module-lexer: 1.7.0 es-module-lexer: 1.7.0
pathe: 2.0.3 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: transitivePeerDependencies:
- '@types/node' - '@types/node'
- jiti - jiti
@ -20911,29 +20934,29 @@ snapshots:
- tsx - tsx
- yaml - 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: dependencies:
debug: 4.4.1 debug: 4.4.1
globrex: 0.1.2 globrex: 0.1.2
tsconfck: 3.1.6(typescript@5.8.3) tsconfck: 3.1.6(typescript@5.8.3)
optionalDependencies: 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: transitivePeerDependencies:
- supports-color - supports-color
- typescript - 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: dependencies:
esbuild: 0.21.5 esbuild: 0.21.5
postcss: 8.5.5 postcss: 8.5.5
rollup: 4.43.0 rollup: 4.43.0
optionalDependencies: optionalDependencies:
'@types/node': 18.19.115 '@types/node': 24.0.0
fsevents: 2.3.3 fsevents: 2.3.3
lightningcss: 1.30.1 lightningcss: 1.30.1
terser: 5.42.0 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: dependencies:
esbuild: 0.25.5 esbuild: 0.25.5
fdir: 6.4.6(picomatch@4.0.2) fdir: 6.4.6(picomatch@4.0.2)
@ -20942,7 +20965,7 @@ snapshots:
rollup: 4.43.0 rollup: 4.43.0
tinyglobby: 0.2.14 tinyglobby: 0.2.14
optionalDependencies: optionalDependencies:
'@types/node': 18.19.115 '@types/node': 24.0.0
fsevents: 2.3.3 fsevents: 2.3.3
jiti: 2.4.2 jiti: 2.4.2
lightningcss: 1.30.1 lightningcss: 1.30.1