diff --git a/apps/app/src/actions/organization/create-organization-action.ts b/apps/app/src/actions/organization/create-organization-action.ts
index 78bee2c03b..8bf579a056 100644
--- a/apps/app/src/actions/organization/create-organization-action.ts
+++ b/apps/app/src/actions/organization/create-organization-action.ts
@@ -32,7 +32,7 @@ export const createOrganizationAction = authActionClient
const hasVercelConfig = Boolean(
process.env.NEXT_PUBLIC_VERCEL_URL &&
- process.env.VERCEL_AUTH_TOKEN &&
+ process.env.VERCEL_ACCESS_TOKEN &&
process.env.VERCEL_TEAM_ID &&
process.env.VERCEL_PROJECT_ID
);
diff --git a/apps/app/src/components/header.tsx b/apps/app/src/components/header.tsx
index 66d085c55a..8de627a235 100644
--- a/apps/app/src/components/header.tsx
+++ b/apps/app/src/components/header.tsx
@@ -3,8 +3,6 @@ import { getI18n } from "@/locales/server";
import { Button } from "@bubba/ui/button";
import { Icons } from "@bubba/ui/icons";
import { Skeleton } from "@bubba/ui/skeleton";
-import { Inbox } from "@novu/react";
-import { useSession } from "next-auth/react";
import Link from "next/link";
import { Suspense } from "react";
import { AssistantButton } from "./assistant/button";
diff --git a/apps/app/src/components/notification-center.tsx b/apps/app/src/components/notification-center.tsx
index 006553e766..075cad31db 100644
--- a/apps/app/src/components/notification-center.tsx
+++ b/apps/app/src/components/notification-center.tsx
@@ -28,70 +28,73 @@ function NotificationItem({
description,
createdAt,
recordId,
+ from,
+ to,
markMessageAsRead,
+ type,
}: {
id: string;
setOpen: (open: boolean) => void;
- description: string;
+ description: string | undefined;
createdAt: string;
- recordId?: string;
- from?: string;
- to?: string;
+ recordId: string | undefined;
+ from: string | undefined;
+ to: string | undefined;
markMessageAsRead: (id: string) => void;
- type?: string;
+ type: string | undefined;
}) {
- return (
-
-
setOpen(false)}
- href={recordId ? `/tasks/${recordId}` : "#"}
- >
-
-
-
{description}
-
- {formatDistanceToNow(new Date(createdAt))} ago
-
-
-
- {markMessageAsRead && (
-
-
- );
+ );
+ default:
+ return null;
+ }
}
export function NotificationCenter() {
const t = useI18n();
const [isOpen, setOpen] = useState(false);
-
const {
hasUnseenNotifications,
notifications,
markMessageAsRead,
markAllMessagesAsSeen,
markAllMessagesAsRead,
- subscriberId,
} = useNotifications();
- console.log(subscriberId);
- console.log(notifications);
-
const unreadNotifications = notifications.filter(
(notification) => !notification.read,
);
@@ -164,9 +167,12 @@ export function NotificationCenter() {
id={notification.id}
markMessageAsRead={markMessageAsRead}
setOpen={setOpen}
- description={notification.payload.description || ""}
+ description={notification.payload.description}
createdAt={notification.createdAt}
recordId={notification.payload.recordId}
+ type={notification.payload.type}
+ from={notification.payload?.from}
+ to={notification.payload?.to}
/>
);
})}
@@ -203,9 +209,12 @@ export function NotificationCenter() {
key={notification.id}
id={notification.id}
setOpen={setOpen}
- description={notification.payload.description || ""}
+ description={notification.payload.description}
createdAt={notification.createdAt}
recordId={notification.payload.recordId}
+ type={notification.payload.type}
+ from={notification.payload?.from}
+ to={notification.payload?.to}
markMessageAsRead={markMessageAsRead}
/>
);
diff --git a/apps/app/src/env.mjs b/apps/app/src/env.mjs
index 7273fdb6fb..f433ea6be6 100644
--- a/apps/app/src/env.mjs
+++ b/apps/app/src/env.mjs
@@ -17,7 +17,7 @@ export const env = createEnv({
UPLOADTHING_SECRET: z.string(),
DISCORD_WEBHOOK_URL: z.string(),
TRIGGER_SECRET_KEY: z.string(),
- VERCEL_AUTH_TOKEN: z.string().optional(),
+ VERCEL_ACCESS_TOKEN: z.string().optional(),
VERCEL_TEAM_ID: z.string().optional(),
VERCEL_PROJECT_ID: z.string().optional(),
},
@@ -46,7 +46,7 @@ export const env = createEnv({
TRIGGER_SECRET_KEY: process.env.TRIGGER_SECRET_KEY,
NEXT_PUBLIC_POSTHOG_KEY: process.env.NEXT_PUBLIC_POSTHOG_KEY,
NEXT_PUBLIC_POSTHOG_HOST: process.env.NEXT_PUBLIC_POSTHOG_HOST,
- VERCEL_AUTH_TOKEN: process.env.VERCEL_AUTH_TOKEN,
+ VERCEL_ACCESS_TOKEN: process.env.VERCEL_ACCESS_TOKEN,
VERCEL_TEAM_ID: process.env.VERCEL_TEAM_ID,
VERCEL_PROJECT_ID: process.env.VERCEL_PROJECT_ID,
NEXT_PUBLIC_VERCEL_URL: process.env.NEXT_PUBLIC_VERCEL_URL,
diff --git a/apps/app/src/jobs/tasks/notifications/risk-task-notifications.ts b/apps/app/src/jobs/tasks/notifications/risk-task-notifications.ts
new file mode 100644
index 0000000000..47b3dd4d26
--- /dev/null
+++ b/apps/app/src/jobs/tasks/notifications/risk-task-notifications.ts
@@ -0,0 +1,95 @@
+import { db } from "@bubba/db";
+import {
+ NotificationTypes,
+ TriggerEvents,
+ trigger,
+} from "@bubba/notifications";
+import { logger, schedules } from "@trigger.dev/sdk/v3";
+import { formatDistance } from "date-fns";
+
+export const sendRiskTaskNotifications = schedules.task({
+ id: "send-risk-task-notifications",
+ run: async () => {
+ const now = new Date();
+ const upcomingThreshold = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);
+
+ logger.info(
+ `Sending risk task notifications from now: ${now} to ${upcomingThreshold}`,
+ );
+
+ const tasks = await db.riskMitigationTask.findMany({
+ where: {
+ dueDate: { gte: now, lte: upcomingThreshold },
+ status: { in: ["open", "pending"] },
+ notifiedAt: null,
+ },
+ select: {
+ id: true,
+ dueDate: true,
+ notifiedAt: true,
+ riskId: true,
+ title: true,
+ owner: {
+ select: {
+ id: true,
+ email: true,
+ name: true,
+ image: true,
+ organizationId: true,
+ },
+ },
+ },
+ });
+
+ const notifiedTasks = [];
+
+ for (const task of tasks) {
+ const owner = task.owner;
+
+ const timeUntilDue = task.dueDate
+ ? formatDistance(task.dueDate, new Date(), {
+ addSuffix: true,
+ })
+ : "soon";
+
+ try {
+ if (!owner || !owner.email || !owner.organizationId) {
+ logger.warn(`Skipping task ${task.id} - owner ${owner?.id} missing email or organizationId`);
+ continue;
+ }
+
+ await db.riskMitigationTask.update({
+ where: { id: task.id },
+ data: { notifiedAt: new Date() },
+ });
+
+ await trigger({
+ name: TriggerEvents.TaskReminderInApp,
+ user: {
+ subscriberId: `${owner.organizationId}_${owner.id}`,
+ email: owner.email,
+ fullName: owner.name,
+ image: owner.image,
+ organizationId: owner.organizationId,
+ },
+ payload: {
+ description: `${task.title} is due ${timeUntilDue}`,
+ recordId: `/risk/${task.riskId}/tasks/${task.id}`,
+ type: NotificationTypes.Task,
+ },
+ });
+
+
+ notifiedTasks.push(task.id);
+ } catch (error) {
+ logger.error(
+ `Error processing task ${task.id} for ${owner?.email}: ${error}`,
+ );
+ }
+ }
+
+ if (notifiedTasks.length) {
+ logger.info(`Sent notifications for tasks: ${notifiedTasks.join(", ")}`);
+ }
+ },
+});
\ No newline at end of file
diff --git a/apps/app/src/jobs/tasks/notifications/utils/task-email-notification.tsx b/apps/app/src/jobs/tasks/notifications/utils/task-email-notification.tsx
new file mode 100644
index 0000000000..767bf8912d
--- /dev/null
+++ b/apps/app/src/jobs/tasks/notifications/utils/task-email-notification.tsx
@@ -0,0 +1,49 @@
+import TaskReminderEmail from "@bubba/email/emails/reminders/task-reminder";
+import { TriggerEvents, trigger } from "@bubba/notifications";
+import { render } from "@react-email/render";
+
+interface Props {
+ owner: {
+ id: string;
+ fullName?: string;
+ email: string;
+ organizationId: string;
+ };
+ task: {
+ recordId: string;
+ dueDate: string;
+ };
+}
+
+export async function sendTaskEmailNotification({ owner, task }: Props) {
+ try {
+ const html = await render(
+
,
+ );
+
+ const triggerData = {
+ name: TriggerEvents.TaskReminderEmail,
+ payload: {
+ subject: "Task Reminder",
+ html,
+ },
+ replyTo: owner.email,
+ user: {
+ subscriberId: `${owner.organizationId}_${owner.id}`,
+ organizationId: owner.organizationId,
+ email: owner.email,
+ fullName: owner.fullName,
+ },
+ };
+
+ await trigger(triggerData);
+ } catch (error) {
+ console.error("Failed to send task email notification: ", error);
+ throw error;
+ }
+}
diff --git a/apps/app/src/lib/domains.ts b/apps/app/src/lib/domains.ts
index db62848dae..9a25b8f37f 100644
--- a/apps/app/src/lib/domains.ts
+++ b/apps/app/src/lib/domains.ts
@@ -12,7 +12,7 @@ export const addDomainToVercel = async (domain: string) => {
{
method: "POST",
headers: {
- Authorization: `Bearer ${process.env.VERCEL_AUTH_TOKEN}`,
+ Authorization: `Bearer ${process.env.VERCEL_ACCESS_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
@@ -29,7 +29,7 @@ export const removeDomainFromVercelProject = async (domain: string) => {
}`,
{
headers: {
- Authorization: `Bearer ${process.env.VERCEL_AUTH_TOKEN}`,
+ Authorization: `Bearer ${process.env.VERCEL_ACCESS_TOKEN}`,
},
method: "DELETE",
},
@@ -42,7 +42,7 @@ export const removeDomainFromVercelTeam = async (domain: string) => {
}`,
{
headers: {
- Authorization: `Bearer ${process.env.VERCEL_AUTH_TOKEN}`,
+ Authorization: `Bearer ${process.env.VERCEL_ACCESS_TOKEN}`,
},
method: "DELETE",
},
@@ -59,7 +59,7 @@ export const getDomainResponse = async (
{
method: "GET",
headers: {
- Authorization: `Bearer ${process.env.VERCEL_AUTH_TOKEN}`,
+ Authorization: `Bearer ${process.env.VERCEL_ACCESS_TOKEN}`,
"Content-Type": "application/json",
},
},
@@ -77,7 +77,7 @@ export const getConfigResponse = async (
{
method: "GET",
headers: {
- Authorization: `Bearer ${process.env.VERCEL_AUTH_TOKEN}`,
+ Authorization: `Bearer ${process.env.VERCEL_ACCESS_TOKEN}`,
"Content-Type": "application/json",
},
},
@@ -94,7 +94,7 @@ export const verifyDomain = async (
{
method: "POST",
headers: {
- Authorization: `Bearer ${process.env.VERCEL_AUTH_TOKEN}`,
+ Authorization: `Bearer ${process.env.VERCEL_ACCESS_TOKEN}`,
"Content-Type": "application/json",
},
},
diff --git a/apps/app/trigger.config.ts b/apps/app/trigger.config.ts
index f633ce6dd6..dc475f0515 100644
--- a/apps/app/trigger.config.ts
+++ b/apps/app/trigger.config.ts
@@ -1,4 +1,5 @@
import { PrismaInstrumentation } from "@prisma/instrumentation";
+import { syncVercelEnvVars } from "@trigger.dev/build/extensions/core";
import { prismaExtension } from "@trigger.dev/build/extensions/prisma";
import { puppeteer } from "@trigger.dev/build/extensions/puppeteer";
import { defineConfig } from "@trigger.dev/sdk/v3";
@@ -15,6 +16,7 @@ export default defineConfig({
schema: "../../packages/db/prisma/schema.prisma",
}),
puppeteer(),
+ syncVercelEnvVars(),
],
},
retries: {
diff --git a/bun.lockb b/bun.lockb
index 338ee6ab69..abdc0556d9 100755
Binary files a/bun.lockb and b/bun.lockb differ
diff --git a/package.json b/package.json
index f00f715880..763d29863c 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,7 @@
},
"devDependencies": {
"@biomejs/biome": "1.9.4",
- "turbo": "^2.3.4",
+ "turbo": "^2.4.1",
"typescript": "5.7.2"
},
"engines": {
diff --git a/packages/db/prisma/schema.prisma b/packages/db/prisma/schema.prisma
index fb88ae0eae..8c57bdf6a2 100644
--- a/packages/db/prisma/schema.prisma
+++ b/packages/db/prisma/schema.prisma
@@ -418,6 +418,7 @@ model RiskMitigationTask {
description String
status RiskTaskStatus @default(open)
dueDate DateTime?
+ notifiedAt DateTime?
completedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
diff --git a/packages/email/emails/reminders/task-reminder.tsx b/packages/email/emails/reminders/task-reminder.tsx
new file mode 100644
index 0000000000..ad86abd63c
--- /dev/null
+++ b/packages/email/emails/reminders/task-reminder.tsx
@@ -0,0 +1,109 @@
+import {
+ Body,
+ Button,
+ Container,
+ Font,
+ Heading,
+ Html,
+ Link,
+ Preview,
+ Section,
+ Tailwind,
+ Text,
+} from "@react-email/components";
+import { Footer } from "../../components/footer";
+import { Logo } from "../../components/logo";
+
+interface Props {
+ email: string;
+ name: string;
+ dueDate: string;
+ recordId: string;
+}
+
+export const TaskReminderEmail = ({
+ email,
+ name,
+ dueDate,
+ recordId,
+}: Props) => {
+ const link = `${process.env.NEXT_PUBLIC_APP_URL ?? "https://app.trycomp.ai"}${recordId}`;
+
+ return (
+
+
+
+
+
+
+
+
+ Comp AI - Task Reminder
+
+
+
+
+
+ Task Reminder
+
+
+
+ Hey {name}, you're assigned to a task that is due soon ({dueDate}
+ ).
+
+
+
+
+ or copy and paste this URL into your browser{" "}
+
+ {link}
+
+
+
+
+
+
+ this notification was intended for{" "}
+ {email}.{" "}
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default TaskReminderEmail;
diff --git a/packages/notifications/src/index.ts b/packages/notifications/src/index.ts
index 5a54b3c5c5..73bd3946f9 100644
--- a/packages/notifications/src/index.ts
+++ b/packages/notifications/src/index.ts
@@ -1,12 +1,12 @@
import { Novu } from "@novu/node";
import ky from "ky";
-import { nanoid } from "nanoid";
const novu = new Novu(process.env.NOVU_API_KEY!);
const novu_api = "https://api.novu.co/v1";
export enum TriggerEvents {
TaskReminderInApp = "task-reminder-inapp",
+ TaskReminderEmail = "task-reminder-email",
}
export enum NotificationTypes {
@@ -16,8 +16,8 @@ export enum NotificationTypes {
type TriggerUser = {
subscriberId: string;
email: string;
- fullName: string;
- image: string;
+ fullName?: string | null;
+ image?: string | null;
organizationId: string;
}
@@ -26,7 +26,6 @@ type TriggerPayload = {
payload: any;
user: TriggerUser;
replyTo?: string;
- tenant?: string; // organization_id + user_id
}
type GetSubscriberPreferencesParams = {
@@ -44,23 +43,13 @@ type UpdateSubscriberPreferencesParams = {
export async function trigger(data: TriggerPayload) {
try {
- const subscriberId = `${data.user.organizationId}_${data.user.subscriberId}`;
+ const subscriberId = data.user.subscriberId;
await novu.trigger(data.name, {
to: {
- ...data.user,
subscriberId
},
payload: data.payload,
- tenant: data.tenant,
- overrides: {
- email: {
- replyTo: data.replyTo,
- headers: {
- "X-Entity-Ref-ID": nanoid(),
- }
- }
- }
});
} catch (error: any) {
console.error('Novu trigger error:', {
diff --git a/yarn.lock b/yarn.lock
index d92df5a4c4..b830c53737 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1,6 +1,6 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
-# bun ./bun.lockb --hash: E3588BF47FA0E20B-abcd9cbbd126aa0d-23D6C38DF3A8DD19-ad81e27570f355aa
+# bun ./bun.lockb --hash: 93AF3FBD30471429-7ea0b1120e9d1f26-67E299B5FDE557AD-2f3928e3b43097ff
"@ai-sdk/anthropic@^1.1.6":
@@ -448,8 +448,8 @@
"@types/react-dom" "^19.0.0"
typescript "^5.7.2"
dependencies:
- "@bubba/ui" "packages/ui"
- "@bubba/utils" "packages/utils"
+ "@bubba/ui" "workspace:*"
+ "@bubba/utils" "workspace:*"
"@react-email/components" "0.0.31"
"@react-email/render" "0.0.10"
"@react-email/tailwind" "1.0.4"
@@ -492,7 +492,7 @@
version "workspace:packages/tsconfig"
resolved "workspace:packages/tsconfig"
-"@bubba/ui@packages/ui":
+"@bubba/ui@packages/ui", "@bubba/ui@workspace:*":
version "workspace:packages/ui"
resolved "workspace:packages/ui"
devDependencies:
@@ -555,7 +555,7 @@
use-callback-ref "^1.3.3"
vaul "^1.0.0"
-"@bubba/utils@packages/utils":
+"@bubba/utils@packages/utils", "@bubba/utils@workspace:*":
version "workspace:packages/utils"
resolved "workspace:packages/utils"
devDependencies:
@@ -3108,11 +3108,6 @@
resolved "https://registry.npmjs.org/@tiptap/core/-/core-2.11.2.tgz"
integrity sha512-Z437c/sQg31yrRVgLJVkQuih+7Og5tjRx6FE/zE47QgEayqQ9yXH0LrTAbPiY6IfY1X+f2A0h3e5Y/WGD6rC3Q==
-"@tiptap/core@^2.11.3", "@tiptap/core@^2.7.0":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/core/-/core-2.11.3.tgz"
- integrity sha512-ibfi6U1gMRLo319Re6olv8uAuxtUpK343ygcVoZrJ8O4sqRnU9CEqPAM+n7YAKlOks1+Di0sTheIxZRak7Pj4g==
-
"@tiptap/core@^2.11.5", "@tiptap/core@^2.7.0":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/core/-/core-2.11.5.tgz"
@@ -3123,11 +3118,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.11.2.tgz"
integrity sha512-5XeU1o5UfjMCFX3AwgeErwDKlpUr5YPhta2tQqNsQUQ7QvumIdK/3apNT15/d8pySAjdAphDWEd/CZ2di5hq6A==
-"@tiptap/extension-blockquote@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.11.3.tgz"
- integrity sha512-UmKBmk7USY5Ufd7jcOI1W//nmRwRWdKLEYVLQ/L/nelpa7LXhDI/T3k4Oa4JlNQCEgUqI5Wz8TbVJYaFcyV/jA==
-
"@tiptap/extension-blockquote@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.11.5.tgz"
@@ -3138,12 +3128,7 @@
resolved "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.11.2.tgz"
integrity sha512-pSls6UnKiPMm2c0m1viuZ0aFexxUmTRm17vDA2Gy5PhRm5qSsnHlSxyEuEcKNOi/rIx+oJehvG1oO4uI+kmCKg==
-"@tiptap/extension-bold@^2.11.3", "@tiptap/extension-bold@^2.9.1":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.11.3.tgz"
- integrity sha512-YafJ+BavtzQBir81HoM62G0cik1ww7zNcElkg35sQWtVFnT99s+fLEuSurixtmiLdgmSSb/YsPrCmNp/R75zOw==
-
-"@tiptap/extension-bold@^2.11.5":
+"@tiptap/extension-bold@^2.11.5", "@tiptap/extension-bold@^2.9.1":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.11.5.tgz"
integrity sha512-OAq03MHEbl7MtYCUzGuwb0VpOPnM0k5ekMbEaRILFU5ZC7cEAQ36XmPIw1dQayrcuE8GZL35BKub2qtRxyC9iA==
@@ -3155,13 +3140,6 @@
dependencies:
tippy.js "^6.3.7"
-"@tiptap/extension-bubble-menu@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.11.3.tgz"
- integrity sha512-KOAy9zCzqssJO7cGIwZNgv2hFyxrZ2AHoWptICPA79nVZrHQQw2ZP1/FDTR8cDEZzLQMbpgGqQhUhjZcAs3/zQ==
- dependencies:
- tippy.js "^6.3.7"
-
"@tiptap/extension-bubble-menu@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.11.5.tgz"
@@ -3174,11 +3152,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.11.2.tgz"
integrity sha512-zqZYT7lmmivEDEO+6w5bl5kV3UP1L2dw5mksyMGtxpvoDgbFHZ85+ron6SeHee8C7vJc6aIptc1p6NxIS5/l0A==
-"@tiptap/extension-bullet-list@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.11.3.tgz"
- integrity sha512-Q6ukkuD+Bt4UcJ5Pt0ZcF3ZzE6akC5l7gaXsTIZ4rqRS6Bmol13h5BshTNhhZhxFqJKwyt6MWHG60j7agtRoHQ==
-
"@tiptap/extension-bullet-list@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.11.5.tgz"
@@ -3194,11 +3167,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.11.2.tgz"
integrity sha512-G8vvb17QAYQij3haz9RoDvArK1LSOZHqGzQ2dJ3/d0W5oqOyUrTnseN66fRZjWhBT3pns0VL2erwe/NBIqLOIw==
-"@tiptap/extension-code@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.11.3.tgz"
- integrity sha512-w36Pb4DlB/cQZwsIpd5pSDwYuLBBSGh6dwGc9TVUdv+hdh8vIsnkGCjynapXgUrT2RFEJwObRYK+r5Gw84uGSA==
-
"@tiptap/extension-code@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.11.5.tgz"
@@ -3209,11 +3177,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.11.2.tgz"
integrity sha512-O6gVfql3uFZNq9yaUDa98VgV58BqaUSeOUnhZwLzpB/4VlqzTyW6/kvFxhKcSp7f+GmrMQaV4PXRs+tZcq6EFw==
-"@tiptap/extension-code-block@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.11.3.tgz"
- integrity sha512-7VsufXUJt1Aq0UjQ2gQg6+boYsHdCi3+OBabbSMcf5TUWBmPlZnHAsDaocw2c/ZnOeu8Gmg6yrtBxbwjaiIO6g==
-
"@tiptap/extension-code-block@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.11.5.tgz"
@@ -3234,11 +3197,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.11.2.tgz"
integrity sha512-/EZhIAN1x7DYgGM0xv7y7wo5ceBmHb0+rOIPuBerVFeTn+VcC3tST/Q64bdvcxgNe2E59Ti0CUdYEA51wc2u5Q==
-"@tiptap/extension-document@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.11.3.tgz"
- integrity sha512-utY1JZgxRLt0/oFPPUH8OT8Ltu3nmdycM2EwkM85vil83MnM5kuEYHF1l1q2xhnJ52wdU3afx+e7dFgvMDuunA==
-
"@tiptap/extension-document@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.11.5.tgz"
@@ -3249,11 +3207,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.11.2.tgz"
integrity sha512-HbXC9cMVZUY3kyKwbDtVH452CY1qlyLbIvTaN0+dxkFgcVeQZZtfIxU7DwMmqCDmDnsh0CdDqUgUvcXS2UQTwA==
-"@tiptap/extension-dropcursor@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.11.3.tgz"
- integrity sha512-Ppw46/1Vt9PlTT6TMloL1KjO2W89QUjRRptk5OtDvAGoOahLWwLji2k7dHyPeeCsG1J2KpHIPxngs922uhOEMw==
-
"@tiptap/extension-dropcursor@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.11.5.tgz"
@@ -3266,13 +3219,6 @@
dependencies:
tippy.js "^6.3.7"
-"@tiptap/extension-floating-menu@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.11.3.tgz"
- integrity sha512-Za1x475cvv+URegCsoDr8rZI5GIoC4N6rHg/xqmozY4bA326Ko1cMrUbwpVF6p17nerDGAMCIstZM7SSUQdNSA==
- dependencies:
- tippy.js "^6.3.7"
-
"@tiptap/extension-floating-menu@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.11.5.tgz"
@@ -3285,11 +3231,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.11.2.tgz"
integrity sha512-ssJOrcc8dzlo5/Qq3+EixASDHTj3mqCyAv7Ohed1QYEYr+TsSpsTbjR0eMLjWHlgbt24TXL2Wr0ldjYCU8T1ZA==
-"@tiptap/extension-gapcursor@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.11.3.tgz"
- integrity sha512-QNVoMNvsinnpvIBAADCbPXMAxY6nv38dxLY3mmPBF0j51H1ggGRX2MdD8VsSBM+AP5az9vTa1+rO+0wBfDwDWw==
-
"@tiptap/extension-gapcursor@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.11.5.tgz"
@@ -3300,11 +3241,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.11.2.tgz"
integrity sha512-FNcXemfuwkiP4drZ9m90BC6GD4nyikfYHYEUyYuVd74Mm6w5vXpueWXus3mUcdT78xTs1XpQVibDorilLu7X8w==
-"@tiptap/extension-hard-break@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.11.3.tgz"
- integrity sha512-Jsz1qV/h4GFZiBtcrJ2yAF1Euw25IXgx5m4EBr/33TV6gT5+zRUr4e0y6h3jHicyInviZeXd9HXELCcQCEtHRg==
-
"@tiptap/extension-hard-break@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.11.5.tgz"
@@ -3315,11 +3251,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.11.2.tgz"
integrity sha512-y/wAEXYB0a8y5WmSYGCIXAhus1ydudn0pokKIzT/OD00XutAVh14qOB5h/+m8iXwGU/UYMP7SUCtK82txZqwKA==
-"@tiptap/extension-heading@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.11.3.tgz"
- integrity sha512-PuScgMuVxD/dUcizLCfQ1G4lI8ie2Wg5UCcixKefN2feFJneZdsIW6gUYYcjyH285VSjj+A76mwHzNdJGlGU2w==
-
"@tiptap/extension-heading@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.11.5.tgz"
@@ -3335,11 +3266,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.11.2.tgz"
integrity sha512-BamS6YjKsETgP7msmm0oIpqmNSLJWbivm3XurR3uSUqJZYrQo1Fv+No4HAR7eAACxoOnYGcDmYsrombRVs9lxw==
-"@tiptap/extension-history@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.11.3.tgz"
- integrity sha512-dxJeuGuLEn9V4iGfsvMOBcTwufcw971NoBdsyW1TOzYvucDkYHgIlOVE4DEWIVuOkfIjKEiCGl8IdZLaHWU8Sg==
-
"@tiptap/extension-history@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.11.5.tgz"
@@ -3350,11 +3276,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.11.2.tgz"
integrity sha512-R7MkTQzxkBy0bXJfq6L+6ax01/hmTEUvPPoyjwDSfU1Ktc1ihBJGUdTNtohT1KoQGQYt2d9khBohVspsXoCmFw==
-"@tiptap/extension-horizontal-rule@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.11.3.tgz"
- integrity sha512-+O6W6EbD4TLsUF8t0ApgZWLpcwn3tajRZtBU6u0SuwHtvhMTrQYySUTH5j06KfTDbw6JAqKKPCpKhPgH2Z6eFg==
-
"@tiptap/extension-horizontal-rule@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.11.5.tgz"
@@ -3370,11 +3291,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.11.2.tgz"
integrity sha512-652oTa+iDiR7sMtmePSy+303HSNJxvxmV/6IvQoMdffJU0oPiWcWnCCL0qrWgtHh15dplj36EtB/znENWbvVOw==
-"@tiptap/extension-italic@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.11.3.tgz"
- integrity sha512-GpeQh2tMb6ys/ft7xqitoXeWO7uM8z4hvLEhD92ACuk6VpcHUhksUwnv4G4Qc/cZ9i+qk3GYEsRha0JaHp3GVw==
-
"@tiptap/extension-italic@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.11.5.tgz"
@@ -3392,11 +3308,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.11.2.tgz"
integrity sha512-cxysDCvw45bem53qLZtTCkle1pttO4Y/FGqYm1hl66ol3cZsuLbjpOb4aDB6wRhyd701Ws6MjOYM+cZsmtTNpw==
-"@tiptap/extension-list-item@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.11.3.tgz"
- integrity sha512-wUBuxoIN3XZQfesZqhgktJkJfcUaHUzUSzoCvQsDpaMsShpoFeptqs3DznHny9fRzrACkREds2dg6JV455+hLg==
-
"@tiptap/extension-list-item@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.11.5.tgz"
@@ -3407,11 +3318,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.11.2.tgz"
integrity sha512-TR8OqwKkQ0OCp40V9hcRJUcO1PSzCYWXy0mvW351lOYO8D6uE+1ouVkEV9qjXBC30sVCnQykSp/FR9UjsIuiVw==
-"@tiptap/extension-ordered-list@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.11.3.tgz"
- integrity sha512-jRO3O6u0/el3l437pXFKsMv3YJuEfHUaEQHPUg5t1Dj8T+20X1LDg7tBKEbylBVLcgqB07aUbnFBqoQ4unwdsQ==
-
"@tiptap/extension-ordered-list@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.11.5.tgz"
@@ -3422,11 +3328,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.11.2.tgz"
integrity sha512-iydTjeZbPJuqctOaAx7QebLPvz9J/hBxPptuhe4GZmqInknAk7+SFJagYeGNb14wfXKOvDZ9DMqv6mBiqSA90Q==
-"@tiptap/extension-paragraph@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.11.3.tgz"
- integrity sha512-snH9aIRJGpHCLm0zzuBwhXpRYMyZvyNBlF5MulJKxkwremFhD9fVP26UtQEneL/CnwpNs3q1QOQGTRlqFP2hbg==
-
"@tiptap/extension-paragraph@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.11.5.tgz"
@@ -3442,11 +3343,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.11.2.tgz"
integrity sha512-n/rznmhqFlENGSlFY9t3pWnWzSmvDpUj3sjVhdpYteis+OCzabN9+c5KdQTBPMjtwRuRleQiKWnHmxvif0heEg==
-"@tiptap/extension-strike@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.11.3.tgz"
- integrity sha512-Ei4rGEqytwXSj4Th1CN8EZFHnYmM5lAp8YUj1V3wWGX7EtRtnq1YG3+b7q68NKmdPSMFOjEz6pHtBzO+p+0aWw==
-
"@tiptap/extension-strike@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.11.5.tgz"
@@ -3487,11 +3383,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.11.2.tgz"
integrity sha512-fJZeKYM5jeJ7NpS3FWLnC/NAvg+mZNbcTaRgXMo5ljBCgiMcYHhYg9p/RHk4SeICZBBpR9WSSZXHMACd9CbJiA==
-"@tiptap/extension-text@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.11.3.tgz"
- integrity sha512-DhrwR9tmDU2U4yjqdaX6odrnOYaE/Ai2ERs2bU4Sgm0ZF5QCyO31Cflg1OQ4erTi0IiqD5ilDPRXqFuu6FGzOQ==
-
"@tiptap/extension-text@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.11.5.tgz"
@@ -3502,11 +3393,6 @@
resolved "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.11.2.tgz"
integrity sha512-RAa7BTwEOJRZN3EB2lg03KXyu7JC/Ce96cerh3D0Fo78yrtKOArPaiVHoTki6ZEIG43ccHEit1PPjMYxivPPeg==
-"@tiptap/extension-text-style@^2.11.3":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.11.3.tgz"
- integrity sha512-kF4pxThvsN7KAb4Ry+ifMGm/To97PeCtosOyjSIvlAnXdc+XvTf6+dkyCsq6smnOhqLw2NErn1gQ4eFbji8YQQ==
-
"@tiptap/extension-text-style@^2.11.5":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.11.5.tgz"
@@ -3553,7 +3439,7 @@
prosemirror-transform "^1.10.2"
prosemirror-view "^1.37.0"
-"@tiptap/pm@^2.11.3", "@tiptap/pm@^2.7.0", "@tiptap/pm@^2.9.1":
+"@tiptap/pm@^2.7.0":
version "2.11.3"
resolved "https://registry.npmjs.org/@tiptap/pm/-/pm-2.11.3.tgz"
integrity sha512-AEpiWvYmXdELpuGGhX6lS2aU155ANwS7WbQ/+/SFqH3YIYHjgUzP8UnY6KSiEBI7a7kX4TWhG84mWrzPA3dPaw==
@@ -3577,7 +3463,7 @@
prosemirror-transform "^1.10.2"
prosemirror-view "^1.37.0"
-"@tiptap/pm@^2.11.5", "@tiptap/pm@^2.7.0":
+"@tiptap/pm@^2.11.5", "@tiptap/pm@^2.7.0", "@tiptap/pm@^2.9.1":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/pm/-/pm-2.11.5.tgz"
integrity sha512-z9JFtqc5ZOsdQLd9vRnXfTCQ8v5ADAfRt9Nm7SqP6FUHII8E1hs38ACzf5xursmth/VonJYb5+73Pqxk1hGIPw==
@@ -3612,18 +3498,7 @@
fast-deep-equal "^3"
use-sync-external-store "^1"
-"@tiptap/react@^2.9.1":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/react/-/react-2.11.3.tgz"
- integrity sha512-tNY/xJ7swV1Ffc6W5CSEWJnBo3grDapkZnd2udSTJ7/zYMUe+vSN2bcdKga2Zo2rAC0WFuLUl27iUhrZ29FFuQ==
- dependencies:
- "@tiptap/extension-bubble-menu" "^2.11.3"
- "@tiptap/extension-floating-menu" "^2.11.3"
- "@types/use-sync-external-store" "^0.0.6"
- fast-deep-equal "^3"
- use-sync-external-store "^1"
-
-"@tiptap/react@^2.11.5":
+"@tiptap/react@^2.11.5", "@tiptap/react@^2.9.1":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/react/-/react-2.11.5.tgz"
integrity sha512-Dp8eHL1G+R/C4+QzAczyb3t1ovexEIZx9ln7SGEM+cT1KHKAw9XGPRgsp92+NQaYI+EdEb/YqoBOSzQcd18/OQ==
@@ -3661,34 +3536,7 @@
"@tiptap/extension-text-style" "^2.11.2"
"@tiptap/pm" "^2.11.2"
-"@tiptap/starter-kit@^2.9.1":
- version "2.11.3"
- resolved "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.11.3.tgz"
- integrity sha512-UGKS6+TA/7yMGqHBK5S/Kxis6iy3Tw0gvVg1EkYHUmkApLJypE87wUMkIeLeD9dd5+2WkxWcYMhC9R3ByjulBg==
- dependencies:
- "@tiptap/core" "^2.11.3"
- "@tiptap/extension-blockquote" "^2.11.3"
- "@tiptap/extension-bold" "^2.11.3"
- "@tiptap/extension-bullet-list" "^2.11.3"
- "@tiptap/extension-code" "^2.11.3"
- "@tiptap/extension-code-block" "^2.11.3"
- "@tiptap/extension-document" "^2.11.3"
- "@tiptap/extension-dropcursor" "^2.11.3"
- "@tiptap/extension-gapcursor" "^2.11.3"
- "@tiptap/extension-hard-break" "^2.11.3"
- "@tiptap/extension-heading" "^2.11.3"
- "@tiptap/extension-history" "^2.11.3"
- "@tiptap/extension-horizontal-rule" "^2.11.3"
- "@tiptap/extension-italic" "^2.11.3"
- "@tiptap/extension-list-item" "^2.11.3"
- "@tiptap/extension-ordered-list" "^2.11.3"
- "@tiptap/extension-paragraph" "^2.11.3"
- "@tiptap/extension-strike" "^2.11.3"
- "@tiptap/extension-text" "^2.11.3"
- "@tiptap/extension-text-style" "^2.11.3"
- "@tiptap/pm" "^2.11.3"
-
-"@tiptap/starter-kit@^2.11.5":
+"@tiptap/starter-kit@^2.11.5", "@tiptap/starter-kit@^2.9.1":
version "2.11.5"
resolved "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.11.5.tgz"
integrity sha512-SLI7Aj2ruU1t//6Mk8f+fqW+18uTqpdfLUJYgwu0CkqBckrkRZYZh6GVLk/02k3H2ki7QkFxiFbZrdbZdng0JA==
@@ -4031,14 +3879,14 @@
dependencies:
undici-types "~6.20.0"
-"@types/node@*", "@types/node@^22.7.4":
+"@types/node@*":
version "22.12.0"
resolved "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz"
integrity sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==
dependencies:
undici-types "~6.20.0"
-"@types/node@>=8.1.0", "@types/node@^22.12.0", "@types/node@^22.13.0":
+"@types/node@>=8.1.0", "@types/node@^22.12.0", "@types/node@^22.13.0", "@types/node@^22.7.4":
version "22.13.0"
resolved "https://registry.npmjs.org/@types/node/-/node-22.13.0.tgz"
integrity sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==
@@ -11427,46 +11275,46 @@ tunnel-rat@^0.1.2:
zustand "^4.3.2"
turbo@^2.3.4:
- version "2.3.4"
- resolved "https://registry.npmjs.org/turbo/-/turbo-2.3.4.tgz"
- integrity sha512-1kiLO5C0Okh5ay1DbHsxkPsw9Sjsbjzm6cF85CpWjR0BIyBFNDbKqtUyqGADRS1dbbZoQanJZVj4MS5kk8J42Q==
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/turbo/-/turbo-2.4.1.tgz"
+ integrity sha512-XIIHXAhvD3sv34WLaN/969WTHCHYmm3zf0XQ+CrEP1A7ffIQG50cwNcp7Gh96CaGyjEXMh9odoHyggoZQ3Prvw==
optionalDependencies:
- turbo-linux-64 "2.3.4"
- turbo-darwin-64 "2.3.4"
- turbo-windows-64 "2.3.4"
- turbo-linux-arm64 "2.3.4"
- turbo-darwin-arm64 "2.3.4"
- turbo-windows-arm64 "2.3.4"
-
-turbo-darwin-64@2.3.4:
- version "2.3.4"
- resolved "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.3.4.tgz"
- integrity sha512-uOi/cUIGQI7uakZygH+cZQ5D4w+aMLlVCN2KTGot+cmefatps2ZmRRufuHrEM0Rl63opdKD8/JIu+54s25qkfg==
-
-turbo-darwin-arm64@2.3.4:
- version "2.3.4"
- resolved "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.3.4.tgz"
- integrity sha512-IIM1Lq5R+EGMtM1YFGl4x8Xkr0MWb4HvyU8N4LNoQ1Be5aycrOE+VVfH+cDg/Q4csn+8bxCOxhRp5KmUflrVTQ==
-
-turbo-linux-64@2.3.4:
- version "2.3.4"
- resolved "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.3.4.tgz"
- integrity sha512-1aD2EfR7NfjFXNH3mYU5gybLJEFi2IGOoKwoPLchAFRQ6OEJQj201/oNo9CDL75IIrQo64/NpEgVyZtoPlfhfA==
-
-turbo-linux-arm64@2.3.4:
- version "2.3.4"
- resolved "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.3.4.tgz"
- integrity sha512-MxTpdKwxCaA5IlybPxgGLu54fT2svdqTIxRd0TQmpRJIjM0s4kbM+7YiLk0mOh6dGqlWPUsxz/A0Mkn8Xr5o7Q==
-
-turbo-windows-64@2.3.4:
- version "2.3.4"
- resolved "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.3.4.tgz"
- integrity sha512-yyCrWqcRGu1AOOlrYzRnizEtdkqi+qKP0MW9dbk9OsMDXaOI5jlWtTY/AtWMkLw/czVJ7yS9Ex1vi9DB6YsFvw==
-
-turbo-windows-arm64@2.3.4:
- version "2.3.4"
- resolved "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.3.4.tgz"
- integrity sha512-PggC3qH+njPfn1PDVwKrQvvQby8X09ufbqZ2Ha4uSu+5TvPorHHkAbZVHKYj2Y+tvVzxRzi4Sv6NdHXBS9Be5w==
+ turbo-darwin-64 "2.4.1"
+ turbo-darwin-arm64 "2.4.1"
+ turbo-linux-64 "2.4.1"
+ turbo-linux-arm64 "2.4.1"
+ turbo-windows-64 "2.4.1"
+ turbo-windows-arm64 "2.4.1"
+
+turbo-darwin-64@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.4.1.tgz"
+ integrity sha512-oos3Gz5N6ol2/7+ys0wPENhl7ZzeVKIumn2BR7X2oE5dEPxNPDMOpKBwreU9ToCxM94e+uFTzKgjcUJpBqpTHA==
+
+turbo-darwin-arm64@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.4.1.tgz"
+ integrity sha512-NoIQsSSvCJDTShgX+v+doSP/g0kAhHhq5p2fpsEAlougs2wcQvwv/LndeqojzkHbxB39lOQmqBYHJcki46Q3oQ==
+
+turbo-linux-64@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.4.1.tgz"
+ integrity sha512-iXIeG8YhluaJF/5KQEudRf8ECBWND8X0yxXDrFIq2wmLLCg4A7gSSzVcBq30rYYeyyU4xMj/sm3HbsAaao3jjg==
+
+turbo-linux-arm64@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.4.1.tgz"
+ integrity sha512-jd5apBV7lBGn3CnkQN/hEMbwazNgZcrwLt6DIkWy/TSi5xfSQEqcR3k9HxviQ7hKMcr1Q1hN6FHWm8Vw90Ej4A==
+
+turbo-windows-64@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.4.1.tgz"
+ integrity sha512-4RYRAijohyQ7uetZY4SSikSgGccq+7tmnljdm/XezpK9t0+3gldKA2vHF0++yLZeZr+CFgqmBeGSFi7B+vhc2g==
+
+turbo-windows-arm64@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.4.1.tgz"
+ integrity sha512-4lZB0+AxWB01Adx5xHZhO746FgaHR0T3qzEDF2nf/nx8LAUtN3iwaZQgAsTsblaAKjiM7lxWDI0s/Q3fektsPg==
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"