From 31eeaa302640e459b27bcc00fd868c082d749a5d Mon Sep 17 00:00:00 2001 From: Lewis Carhart Date: Sat, 15 Mar 2025 16:03:30 -0400 Subject: [PATCH 1/2] Update dependencies and refactor editor components; replace RichTextEditor with AdvancedEditor, implement new selectors for color, link, and math, and enhance AI functionality with new commands and icons. --- apps/app/package.json | 69 ++- .../editor/actions/update-policy.ts | 169 +++--- .../editor/components/PolicyDetails.tsx | 14 +- .../policies/all/[policyId]/layout.tsx | 1 - apps/app/src/app/api/chat/route.ts | 51 +- apps/app/src/app/api/generate/route.ts | 252 ++++---- .../src/components/editor/advanced-editor.tsx | 156 +++++ apps/app/src/components/editor/extensions.ts | 288 ++++++--- .../generative/ai-completion-command.tsx | 22 + .../generative/ai-selector-commands.tsx | 75 +++ .../editor/generative/ai-selector.tsx | 111 ++++ .../generative/generative-menu-switch.tsx | 49 ++ .../src/components/editor/headers/status.tsx | 17 - .../components/editor/icons/crazy-spinner.tsx | 11 + .../components/editor/icons/font-default.tsx | 15 + .../src/components/editor/icons/font-mono.tsx | 22 + .../components/editor/icons/font-serif.tsx | 23 + .../app/src/components/editor/icons/index.tsx | 3 + .../editor/icons/loading-circle.tsx | 20 + .../app/src/components/editor/icons/magic.tsx | 32 + .../src/components/editor/policy-editor.tsx | 6 +- .../components/editor/rich-text-editor.tsx | 221 ------- .../editor/selectors/color-selector.tsx | 175 ++++++ .../editor/selectors/link-selector.tsx | 104 ++++ .../editor/selectors/math-selector.tsx | 35 ++ .../editor/selectors/node-selector.tsx | 126 ++++ .../editor/selectors/text-buttons.tsx | 62 ++ .../src/components/editor/slash-command.tsx | 130 ++++ bun.lock | 192 +++--- packages/ui/src/editor.css | 60 +- packages/ui/src/globals.css | 2 +- yarn.lock | 554 ++++++++++-------- 32 files changed, 2081 insertions(+), 986 deletions(-) create mode 100644 apps/app/src/components/editor/advanced-editor.tsx create mode 100644 apps/app/src/components/editor/generative/ai-completion-command.tsx create mode 100644 apps/app/src/components/editor/generative/ai-selector-commands.tsx create mode 100644 apps/app/src/components/editor/generative/ai-selector.tsx create mode 100644 apps/app/src/components/editor/generative/generative-menu-switch.tsx delete mode 100644 apps/app/src/components/editor/headers/status.tsx create mode 100644 apps/app/src/components/editor/icons/crazy-spinner.tsx create mode 100644 apps/app/src/components/editor/icons/font-default.tsx create mode 100644 apps/app/src/components/editor/icons/font-mono.tsx create mode 100644 apps/app/src/components/editor/icons/font-serif.tsx create mode 100644 apps/app/src/components/editor/icons/index.tsx create mode 100644 apps/app/src/components/editor/icons/loading-circle.tsx create mode 100644 apps/app/src/components/editor/icons/magic.tsx delete mode 100644 apps/app/src/components/editor/rich-text-editor.tsx create mode 100644 apps/app/src/components/editor/selectors/color-selector.tsx create mode 100644 apps/app/src/components/editor/selectors/link-selector.tsx create mode 100644 apps/app/src/components/editor/selectors/math-selector.tsx create mode 100644 apps/app/src/components/editor/selectors/node-selector.tsx create mode 100644 apps/app/src/components/editor/selectors/text-buttons.tsx create mode 100644 apps/app/src/components/editor/slash-command.tsx diff --git a/apps/app/package.json b/apps/app/package.json index 297a0145b1..d8240430d0 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -11,20 +11,20 @@ "deploy:trigger-prod": "npx trigger.dev@latest deploy" }, "dependencies": { - "@ai-sdk/openai": "^1.1.12", - "@ai-sdk/provider": "^1.0.7", - "@ai-sdk/react": "^1.1.21", + "@ai-sdk/openai": "^1.2.5", + "@ai-sdk/provider": "^1.0.11", + "@ai-sdk/react": "^1.1.23", "@aws-sdk/client-s3": "^3.758.0", "@aws-sdk/s3-request-presigner": "^3.758.0", - "@browserbasehq/sdk": "^2.3.0", + "@browserbasehq/sdk": "^2.4.0", "@bubba/notifications": "workspace:*", "@date-fns/tz": "^1.2.0", "@hookform/resolvers": "^3.10.0", - "@nangohq/frontend": "^0.53.1", - "@novu/headless": "^2.6.5", - "@novu/react": "^2.6.5", - "@prisma/instrumentation": "^6.3.1", - "@tanstack/react-query": "^5.66.0", + "@nangohq/frontend": "^0.53.2", + "@novu/headless": "^2.6.6", + "@novu/react": "^2.6.6", + "@prisma/instrumentation": "^6.5.0", + "@tanstack/react-query": "^5.68.0", "@tanstack/react-table": "^8.21.2", "@tiptap/extension-table": "^2.11.5", "@tiptap/extension-table-cell": "^2.11.5", @@ -36,48 +36,48 @@ "@trigger.dev/react-hooks": "3.3.17", "@trigger.dev/sdk": "3.3.17", "@types/d3": "^7.4.3", - "@uploadthing/react": "^7.2.0", + "@uploadthing/react": "^7.3.0", "@upstash/ratelimit": "^2.0.5", - "ai": "^4.1.54", + "ai": "^4.1.61", "argon2": "^0.41.1", - "bun": "^1.2.2", + "bun": "^1.2.5", "crypto": "^1.0.1", "d3": "^7.9.0", "dub": "^0.46.29", - "framer-motion": "^12.4.7", + "framer-motion": "^12.5.0", "geist": "^1.3.1", "highlight.js": "^11.11.1", "ky": "^1.7.5", - "languine": "^3.0.4", + "languine": "^3.1.2", "marked": "^15.0.7", - "next": "^15.2.0", + "next": "^15.2.2", "next-auth": "^5.0.0-beta.25", "next-international": "^1.3.1", - "next-intl": "^3.26.3", - "next-safe-action": "^7.10.3", - "next-themes": "^0.4.4", + "next-intl": "^3.26.5", + "next-safe-action": "^7.10.4", + "next-themes": "^0.4.6", "novel": "^1.0.2", - "novu": "^2.6.5", - "nuqs": "^2.3.2", - "playwright-core": "^1.50.1", - "posthog-js": "^1.217.2", - "posthog-node": "^4.5.2", - "puppeteer-core": "^24.2.0", + "novu": "^2.6.6", + "nuqs": "^2.4.1", + "playwright-core": "^1.51.0", + "posthog-js": "^1.231.0", + "posthog-node": "^4.10.1", + "puppeteer-core": "^24.4.0", "react": "^19.0.0", "react-dom": "^19.0.0", "react-hook-form": "^7.54.2", "react-hotkeys-hook": "^4.6.1", - "react-intersection-observer": "^9.15.1", - "react-markdown": "^9.0.3", - "react-textarea-autosize": "^8.5.7", + "react-intersection-observer": "^9.16.0", + "react-markdown": "^9.1.0", + "react-textarea-autosize": "^8.5.8", "react-use-draggable-scroll": "^0.4.7", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "resend": "^4.1.2", "sonner": "^1.7.4", - "stripe": "^17.6.0", + "stripe": "^17.7.0", + "tiptap-markdown": "^0.8.10", "ts-pattern": "^5.6.2", - "uploadthing": "^7.5.0", "use-debounce": "^10.0.4", "use-long-press": "^3.2.0", "uuid": "^11.1.0", @@ -88,16 +88,21 @@ "devDependencies": { "@bubba/db": "workspace:*", "@trigger.dev/build": "3.3.17", - "@types/node": "^22.13.2", + "@types/node": "^22.13.10", "@types/react": "19.0.10", "@types/react-dom": "19.0.4", "@types/uuid": "^10.0.0", - "postcss": "^8.5.2", + "postcss": "^8.5.3", "tailwindcss": "^3.4.17", - "typescript": "^5.7.3" + "typescript": "^5.8.2" }, "resolutions": { "@types/react": "19.0.10", "@types/react-dom": "19.0.4" + }, + "pnpm": { + "overrides": { + "tiptap-extension-global-drag-handle": "^0.1.18" + } } } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/actions/update-policy.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/actions/update-policy.ts index 1c5e416604..9d1d23d780 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/actions/update-policy.ts +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/actions/update-policy.ts @@ -4,102 +4,101 @@ import { authActionClient } from "@/actions/safe-action"; import type { ActionResponse } from "@/actions/types"; import { auth } from "@/auth"; import { db } from "@bubba/db"; -import { revalidatePath } from "next/cache"; import { appErrors, updatePolicySchema } from "../types"; export const updatePolicy = authActionClient - .schema(updatePolicySchema) - .metadata({ - name: "update-policy", - track: { - event: "update-policy", - channel: "server", - }, - }) - .action(async ({ parsedInput }): Promise => { - const { policyId, content, status } = parsedInput; + .schema(updatePolicySchema) + .metadata({ + name: "update-policy", + track: { + event: "update-policy", + channel: "server", + }, + }) + .action(async ({ parsedInput }): Promise => { + const { policyId, content, status } = parsedInput; - const session = await auth(); - const organizationId = session?.user.organizationId; + const session = await auth(); + const organizationId = session?.user.organizationId; - if (!organizationId) { - return { - success: false, - error: appErrors.UNAUTHORIZED.message, - }; - } + if (!organizationId) { + return { + success: false, + error: appErrors.UNAUTHORIZED.message, + }; + } - try { - const existingPolicy = await db.organizationPolicy.findUnique({ - where: { - id: policyId, - organizationId, - }, - }); + try { + const existingPolicy = await db.organizationPolicy.findUnique({ + where: { + id: policyId, + organizationId, + }, + }); - if (!existingPolicy) { - return { - success: false, - error: appErrors.NOT_FOUND.message, - }; - } + if (!existingPolicy) { + return { + success: false, + error: appErrors.NOT_FOUND.message, + }; + } - const updateData: Record = {}; + const updateData: Record = {}; - if (content !== undefined) { - console.log("CONTENT TYPE:", typeof content); + if (content !== undefined) { + console.log("CONTENT TYPE:", typeof content); - if (typeof content === "object" && content !== null) { - if ( - "type" in content && - content.type === "doc" && - "content" in content && - Array.isArray(content.content) - ) { - updateData.content = content.content; - console.log("Extracted content array from TipTap doc"); - } else if (Array.isArray(content)) { - updateData.content = content; - } else { - console.log("Unknown content format - using as is"); - updateData.content = content; - } - } else { - updateData.content = content; - } - } + if (typeof content === "object" && content !== null) { + if ( + "type" in content && + content.type === "doc" && + "content" in content && + Array.isArray(content.content) + ) { + updateData.content = content.content; + console.log("Extracted content array from TipTap doc"); + } else if (Array.isArray(content)) { + updateData.content = content; + } else { + console.log("Unknown content format - using as is"); + updateData.content = content; + } + } else { + updateData.content = content; + } + } - if (status) { - updateData.status = status; - } + if (status) { + updateData.status = status; + } - if (Object.keys(updateData).length === 0) { - return { - success: true, - data: { id: policyId, status: existingPolicy.status }, - }; - } + if (Object.keys(updateData).length === 0) { + return { + success: true, + data: { id: policyId, status: existingPolicy.status }, + }; + } - const updatedPolicy = await db.organizationPolicy.update({ - where: { - id: policyId, - }, - data: updateData, - select: { - id: true, - status: true, - }, - }); + const updatedPolicy = await db.organizationPolicy.update({ + where: { + id: policyId, + }, + data: updateData, + select: { + id: true, + status: true, + }, + }); - return { - success: true, - data: updatedPolicy, - }; - } catch (error) { - console.error("Error updating policy:", error); - return { - success: false, - error: appErrors.UNEXPECTED_ERROR.message, - }; - } - }); + return { + success: true, + data: updatedPolicy, + }; + } catch (error) { + console.error("Error updating policy:", error); + return { + success: false, + error: appErrors.UNEXPECTED_ERROR.message, + }; + } + }); diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/components/PolicyDetails.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/components/PolicyDetails.tsx index a3f914f2df..666003e60d 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/components/PolicyDetails.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/components/PolicyDetails.tsx @@ -1,25 +1,19 @@ "use client"; -import { useI18n } from "@/locales/client"; import { Card, CardContent, CardHeader } from "@bubba/ui/card"; import { Skeleton } from "@bubba/ui/skeleton"; import { redirect } from "next/navigation"; -import { useState } from "react"; import { PolicyEditor } from "@/components/editor/policy-editor"; import { usePolicyDetails } from "../../../(overview)/hooks/usePolicy"; import type { JSONContent } from "@tiptap/react"; +import "@bubba/ui/editor.css"; interface PolicyDetailsProps { policyId: string; } export function PolicyDetails({ policyId }: PolicyDetailsProps) { - const t = useI18n(); - const { policy, isLoading, error, updatePolicy } = usePolicyDetails(policyId); - const [saveStatus, setSaveStatus] = useState<"Saved" | "Saving" | "Unsaved">( - "Saved", - ); - const [wordCount, setWordCount] = useState(0); + const { policy, isLoading, updatePolicy } = usePolicyDetails(policyId); if (isLoading) { return ( @@ -56,15 +50,12 @@ export function PolicyDetails({ policyId }: PolicyDetailsProps) { if (!policy) return; try { - setSaveStatus("Saving"); await updatePolicy({ ...policy, content, }); - setSaveStatus("Saved"); } catch (error) { console.error("Error saving policy:", error); - setSaveStatus("Unsaved"); throw error; } }; @@ -72,7 +63,6 @@ export function PolicyDetails({ policyId }: PolicyDetailsProps) { return (
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/layout.tsx index a7df41f9ad..0f710e56a0 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/layout.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/layout.tsx @@ -1,5 +1,4 @@ import { auth } from "@/auth"; -import { Title } from "@/components/title"; import { getI18n } from "@/locales/server"; import { db } from "@bubba/db"; import { SecondaryMenu } from "@bubba/ui/secondary-menu"; diff --git a/apps/app/src/app/api/chat/route.ts b/apps/app/src/app/api/chat/route.ts index a736dc1e6d..232fac3edb 100644 --- a/apps/app/src/app/api/chat/route.ts +++ b/apps/app/src/app/api/chat/route.ts @@ -2,35 +2,32 @@ import { openai } from "@ai-sdk/openai"; import { streamText } from "ai"; import { env } from "@/env.mjs"; -export const runtime = "nodejs"; -export const maxDuration = 30; - export async function POST(req: Request) { - const { messages } = await req.json(); + const { messages } = await req.json(); - if (!env.OPENAI_API_KEY) { - return new Response( - JSON.stringify({ error: "OpenAI API key is not configured" }), - { status: 500 } - ); - } + if (!env.OPENAI_API_KEY) { + return new Response( + JSON.stringify({ error: "OpenAI API key is not configured" }), + { status: 500 }, + ); + } - try { - const result = await streamText({ - model: openai("gpt-4o-mini"), - system: - "You are a helpful assistant. Provide concise, accurate, and helpful responses to user queries.", - messages, - }); + try { + const result = await streamText({ + model: openai("gpt-4o-mini"), + system: + "You are a helpful assistant. Provide concise, accurate, and helpful responses to user queries.", + messages, + }); - return result.toDataStreamResponse(); - } catch (error) { - console.error("Error in chat API:", error); - return new Response( - JSON.stringify({ - error: "An error occurred while processing your request", - }), - { status: 500 } - ); - } + return result.toDataStreamResponse(); + } catch (error) { + console.error("Error in chat API:", error); + return new Response( + JSON.stringify({ + error: "An error occurred while processing your request", + }), + { status: 500 }, + ); + } } diff --git a/apps/app/src/app/api/generate/route.ts b/apps/app/src/app/api/generate/route.ts index 4b0f3c8be4..879364f5cd 100644 --- a/apps/app/src/app/api/generate/route.ts +++ b/apps/app/src/app/api/generate/route.ts @@ -5,138 +5,136 @@ import { Ratelimit } from "@upstash/ratelimit"; import { streamText } from "ai"; import { match } from "ts-pattern"; -export const runtime = "nodejs"; - export async function POST(req: Request): Promise { - if (!env.OPENAI_API_KEY || env.OPENAI_API_KEY === "") { - return new Response( - "Missing OPENAI_API_KEY - make sure to add it to your .env file.", - { - status: 400, - } - ); - } + if (!env.OPENAI_API_KEY || env.OPENAI_API_KEY === "") { + return new Response( + "Missing OPENAI_API_KEY - make sure to add it to your .env file.", + { + status: 400, + }, + ); + } - if (env.UPSTASH_REDIS_REST_URL && env.UPSTASH_REDIS_REST_TOKEN) { - const ip = req.headers.get("x-forwarded-for"); - const ratelimit = new Ratelimit({ - limiter: Ratelimit.fixedWindow(100, "1 d"), - redis: client, - }); + if (env.UPSTASH_REDIS_REST_URL && env.UPSTASH_REDIS_REST_TOKEN) { + const ip = req.headers.get("x-forwarded-for"); + const ratelimit = new Ratelimit({ + limiter: Ratelimit.fixedWindow(100, "1 d"), + redis: client, + }); - const { success, limit, reset, remaining } = await ratelimit.limit( - `novel_ratelimit_${ip}` - ); + const { success, limit, reset, remaining } = await ratelimit.limit( + `novel_ratelimit_${ip}`, + ); - if (!success) { - return new Response("You have reached your request limit for the day.", { - status: 429, - headers: { - "X-RateLimit-Limit": limit.toString(), - "X-RateLimit-Remaining": remaining.toString(), - "X-RateLimit-Reset": reset.toString(), - }, - }); - } - } + if (!success) { + return new Response("You have reached your request limit for the day.", { + status: 429, + headers: { + "X-RateLimit-Limit": limit.toString(), + "X-RateLimit-Remaining": remaining.toString(), + "X-RateLimit-Reset": reset.toString(), + }, + }); + } + } - const { prompt, option, command } = await req.json(); - const messages = match(option) - .with("continue", () => [ - { - role: "system", - content: - "You are an AI writing assistant that continues existing text based on context from prior text. " + - "Give more weight/priority to the later characters than the beginning ones. " + - "Limit your response to no more than 200 characters, but make sure to construct complete sentences." + - "Output only the generated text without any introduction, explanation, or meta-commentary. " + - "Do not include any greetings or other text that is not part of the text you are generating.", - }, - { - role: "user", - content: prompt, - }, - ]) - .with("improve", () => [ - { - role: "system", - content: - "You are an AI writing assistant that improves existing text. " + - "Output only the improved text without any introduction, explanation, or meta-commentary. " + - "Limit your response to no more than 200 characters, but make sure to construct complete sentences. " + - "Output only the improved text without any introduction, explanation, or meta-commentary. " + - "Do not include any greetings or other text that is not part of the text you are generating.", - }, - { - role: "user", - content: `Improve this text without any introduction or meta-commentary: ${prompt}`, - }, - ]) - .with("shorter", () => [ - { - role: "system", - content: - "You are an AI writing assistant that shortens existing text. " + - "Output only the shortened text without any introduction, explanation, or meta-commentary. " + - "Do not include any greetings or other text that is not part of the text you are generating.", - }, - { - role: "user", - content: `Shorten this text without any introduction or meta-commentary: ${prompt}`, - }, - ]) - .with("longer", () => [ - { - role: "system", - content: - "You are an AI writing assistant that lengthens existing text. " + - "Output only the lengthened text without any introduction, explanation, or meta-commentary. " + - "Do not include any greetings or other text that is not part of the text you are generating.", - }, - { - role: "user", - content: `The existing text is: ${prompt}`, - }, - ]) - .with("fix", () => [ - { - role: "system", - content: - "You are an AI writing assistant that fixes grammar and spelling errors in existing text. " + - "Output only the corrected text without any introduction, explanation, or meta-commentary. " + - "Limit your response to no more than 200 characters, but make sure to construct complete sentences. " + - "Do not include any greetings or other text that is not part of the text you are generating. ", - }, - { - role: "user", - content: `Fix the grammar and spelling in this text without any introduction or meta-commentary: ${prompt}`, - }, - ]) - .with("zap", () => [ - { - role: "system", - content: - "You are an AI writing assistant that generates text based on a prompt. " + - "Output only the generated text without any introduction, explanation, or meta-commentary. " + - "You take an input from the user and a command for manipulating the text" + - "Do not include any greetings or other text that is not part of the text you are generating.", - }, - { - role: "user", - content: `For this text: ${prompt}. You have to respect the command: ${command}`, - }, - ]) - .run(); + const { prompt, option, command } = await req.json(); + const messages = match(option) + .with("continue", () => [ + { + role: "system", + content: + "You are an AI writing assistant that continues existing text based on context from prior text. " + + "Give more weight/priority to the later characters than the beginning ones. " + + "Limit your response to no more than 200 characters, but make sure to construct complete sentences." + + "Output only the generated text without any introduction, explanation, or meta-commentary. " + + "Do not include any greetings or other text that is not part of the text you are generating.", + }, + { + role: "user", + content: prompt, + }, + ]) + .with("improve", () => [ + { + role: "system", + content: + "You are an AI writing assistant that improves existing text. " + + "Output only the improved text without any introduction, explanation, or meta-commentary. " + + "Limit your response to no more than 200 characters, but make sure to construct complete sentences. " + + "Output only the improved text without any introduction, explanation, or meta-commentary. " + + "Do not include any greetings or other text that is not part of the text you are generating.", + }, + { + role: "user", + content: `Improve this text without any introduction or meta-commentary: ${prompt}`, + }, + ]) + .with("shorter", () => [ + { + role: "system", + content: + "You are an AI writing assistant that shortens existing text. " + + "Output only the shortened text without any introduction, explanation, or meta-commentary. " + + "Do not include any greetings or other text that is not part of the text you are generating.", + }, + { + role: "user", + content: `Shorten this text without any introduction or meta-commentary: ${prompt}`, + }, + ]) + .with("longer", () => [ + { + role: "system", + content: + "You are an AI writing assistant that lengthens existing text. " + + "Output only the lengthened text without any introduction, explanation, or meta-commentary. " + + "Do not include any greetings or other text that is not part of the text you are generating.", + }, + { + role: "user", + content: `The existing text is: ${prompt}`, + }, + ]) + .with("fix", () => [ + { + role: "system", + content: + "You are an AI writing assistant that fixes grammar and spelling errors in existing text. " + + "Output only the corrected text without any introduction, explanation, or meta-commentary. " + + "Limit your response to no more than 200 characters, but make sure to construct complete sentences. " + + "Do not include any greetings or other text that is not part of the text you are generating. ", + }, + { + role: "user", + content: `Fix the grammar and spelling in this text without any introduction or meta-commentary: ${prompt}`, + }, + ]) + .with("zap", () => [ + { + role: "system", + content: + "You are an AI writing assistant that generates text based on a prompt. " + + "Output only the generated text without any introduction, explanation, or meta-commentary. " + + "You take an input from the user and a command for manipulating the text" + + "Do not include any greetings or other text that is not part of the text you are generating.", + }, + { + role: "user", + content: `For this text: ${prompt}. You have to respect the command: ${command}`, + }, + ]) + .run(); - const result = streamText({ - prompt: messages[messages.length - 1].content, - maxTokens: 4096, - temperature: 0.7, - topP: 1, - frequencyPenalty: 0, - presencePenalty: 0, - model: openai("gpt-4o-mini"), - }); + const result = streamText({ + prompt: messages[messages.length - 1].content, + maxTokens: 4096, + temperature: 0.7, + topP: 1, + frequencyPenalty: 0, + presencePenalty: 0, + model: openai("gpt-4o-mini"), + }); - return (await result).toDataStreamResponse(); + return (await result).toDataStreamResponse(); } diff --git a/apps/app/src/components/editor/advanced-editor.tsx b/apps/app/src/components/editor/advanced-editor.tsx new file mode 100644 index 0000000000..fc3e442141 --- /dev/null +++ b/apps/app/src/components/editor/advanced-editor.tsx @@ -0,0 +1,156 @@ +"use client"; + +import { + EditorCommand, + EditorCommandEmpty, + EditorCommandItem, + EditorCommandList, + EditorContent, + EditorRoot, + type JSONContent, + handleCommandNavigation, +} from "novel"; +import { useState, useEffect } from "react"; +import { useDebouncedCallback } from "use-debounce"; +import { defaultExtensions } from "./extensions"; +import { ColorSelector } from "./selectors/color-selector"; +import { LinkSelector } from "./selectors/link-selector"; +import { MathSelector } from "./selectors/math-selector"; +import { NodeSelector } from "./selectors/node-selector"; +import { Separator } from "@bubba/ui/separator"; + +import GenerativeMenuSwitch from "./generative/generative-menu-switch"; +import { TextButtons } from "./selectors/text-buttons"; +import { slashCommand, suggestionItems } from "./slash-command"; + +const extensions = [...defaultExtensions, slashCommand]; + +interface AdvancedEditorProps { + initialContent?: JSONContent | JSONContent[]; + onUpdate?: (content: JSONContent) => void; + onSave?: (content: JSONContent) => Promise; + readOnly?: boolean; + placeholder?: string; + className?: string; + saveDebounceMs?: number; +} + +const AdvancedEditor = ({ + initialContent, + onUpdate, + onSave, + readOnly = false, + placeholder = "Start writing...", + className, + saveDebounceMs = 500, +}: AdvancedEditorProps) => { + const [saveStatus, setSaveStatus] = useState<"Saved" | "Saving" | "Unsaved">( + "Saved", + ); + const [initialLoadComplete, setInitialLoadComplete] = useState(false); + const [charsCount, setCharsCount] = useState(); + + const [openNode, setOpenNode] = useState(false); + const [openColor, setOpenColor] = useState(false); + const [openLink, setOpenLink] = useState(false); + const [openAI, setOpenAI] = useState(false); + + useEffect(() => { + setInitialLoadComplete(true); + }, []); + + const debouncedSave = useDebouncedCallback(async (content: JSONContent) => { + if (!onSave) return; + + setSaveStatus("Saving"); + + try { + await onSave(content); + setSaveStatus("Saved"); + } catch (err) { + console.error("Failed to save content:", err); + setSaveStatus("Unsaved"); + } + }, saveDebounceMs); + + if (!initialContent) return null; + + return ( +
+
+
{saveStatus}
+
+ {charsCount} Words +
+
+ + handleCommandNavigation(event), + }, + attributes: { + class: + "prose prose-lg dark:prose-invert prose-headings:font-title font-default focus:outline-none max-w-full", + }, + }} + onUpdate={({ editor }) => { + const content = editor.getJSON(); + setCharsCount(editor.storage.characterCount.words()); + + if (onUpdate) { + onUpdate(content); + } + + if (initialLoadComplete && onSave) { + setSaveStatus("Unsaved"); + debouncedSave(content); + } + }} + > + + No results + + {suggestionItems.map((item: any) => ( + item.command(val)} + className="flex w-full items-center space-x-2 px-2 py-1 text-left text-sm hover:bg-accent aria-selected:bg-accent" + key={item.title} + > +
+ {item.icon} +
+
+

{item.title}

+

{item.description}

+
+
+ ))} +
+
+ + + + + + + + + + + + + + +
+
+
+ ); +}; + +export default AdvancedEditor; \ No newline at end of file diff --git a/apps/app/src/components/editor/extensions.ts b/apps/app/src/components/editor/extensions.ts index 6c07977cf8..d332e29a81 100644 --- a/apps/app/src/components/editor/extensions.ts +++ b/apps/app/src/components/editor/extensions.ts @@ -1,90 +1,212 @@ -import Bold from "@tiptap/extension-bold"; -import BulletList from "@tiptap/extension-bullet-list"; -import Document from "@tiptap/extension-document"; -import Heading from "@tiptap/extension-heading"; -import Italic from "@tiptap/extension-italic"; -import Link from "@tiptap/extension-link"; -import ListItem from "@tiptap/extension-list-item"; -import OrderedList from "@tiptap/extension-ordered-list"; -import Paragraph from "@tiptap/extension-paragraph"; -import Strike from "@tiptap/extension-strike"; +import { + AIHighlight, + CharacterCount, + CodeBlockLowlight, + Color, + CustomKeymap, + GlobalDragHandle, + HighlightExtension, + HorizontalRule, + Mathematics, + Placeholder, + StarterKit, + TaskItem, + TaskList, + TextStyle, + TiptapImage, + TiptapLink, + TiptapUnderline, + Twitter, + UpdatedImage, + UploadImagesPlugin, + Youtube, +} from "novel"; import Table from "@tiptap/extension-table"; import TableCell from "@tiptap/extension-table-cell"; import TableHeader from "@tiptap/extension-table-header"; import TableRow from "@tiptap/extension-table-row"; -import Text from "@tiptap/extension-text"; -import Underline from "@tiptap/extension-underline"; -import StarterKit from "@tiptap/starter-kit"; -import Placeholder from "@tiptap/extension-placeholder"; -import { Blockquote } from "@tiptap/extension-blockquote"; -import { HardBreak } from "@tiptap/extension-hard-break"; -import { HorizontalRule } from "@tiptap/extension-horizontal-rule"; -import type { Extension } from "@tiptap/react"; - -/** - * Default extensions for the rich text editor with basic functionality - */ -export const defaultExtensions = [ - Document, - Paragraph, - Text, - Bold, - Italic, - Heading.configure({ - levels: [1, 2, 3, 4, 5, 6], - }), - BulletList, - OrderedList, - ListItem, - Underline, - Strike, - Link.configure({ - openOnClick: false, - }), - Placeholder.configure({ - placeholder: "Start writing…", - }), - Blockquote, - HardBreak, - HorizontalRule, - Table.configure({ - resizable: true, - allowTableNodeSelection: true, - }), - TableRow, - TableHeader, - TableCell, -]; +import { Markdown } from "tiptap-markdown"; +import { cx } from "class-variance-authority"; +import { common, createLowlight } from "lowlight"; -/** - * Extended extensions that include table support - */ -export const extendedExtensions = [ - ...defaultExtensions, - Table.configure({ - resizable: true, - allowTableNodeSelection: true, - }), - TableRow, - TableHeader, - TableCell, -]; +const aiHighlight = AIHighlight; +const placeholder = Placeholder; +const tiptapLink = TiptapLink.configure({ + HTMLAttributes: { + class: cx( + "text-muted-foreground underline underline-offset-[3px] hover:text-primary transition-colors cursor-pointer", + ), + }, +}); -/** - * A convenience extension set that uses StarterKit - * Good for simpler editors - */ -export const starterExtensions = [ - StarterKit, - Underline, - Link.configure({ - openOnClick: false, - }), -]; +const tiptapImage = TiptapImage.extend({ + addProseMirrorPlugins() { + return [ + UploadImagesPlugin({ + imageClass: cx("opacity-40 rounded-lg border border-stone-200"), + }), + ]; + }, +}).configure({ + allowBase64: true, + HTMLAttributes: { + class: cx("rounded-lg border border-muted"), + }, +}); + +const updatedImage = UpdatedImage.configure({ + HTMLAttributes: { + class: cx("rounded-lg border border-muted"), + }, +}); + +const taskList = TaskList.configure({ + HTMLAttributes: { + class: cx("not-prose pl-2 "), + }, +}); +const taskItem = TaskItem.configure({ + HTMLAttributes: { + class: cx("flex gap-2 items-start my-4"), + }, + nested: true, +}); + +const horizontalRule = HorizontalRule.configure({ + HTMLAttributes: { + class: cx("mt-4 mb-6 border-t border-muted-foreground"), + }, +}); + +const starterKit = StarterKit.configure({ + bulletList: { + HTMLAttributes: { + class: cx("list-disc list-outside leading-3 -mt-2"), + }, + }, + orderedList: { + HTMLAttributes: { + class: cx("list-decimal list-outside leading-3 -mt-2"), + }, + }, + listItem: { + HTMLAttributes: { + class: cx("leading-normal -mb-2"), + }, + }, + blockquote: { + HTMLAttributes: { + class: cx("border-l-4 border-primary"), + }, + }, + codeBlock: { + HTMLAttributes: { + class: cx( + "rounded-md bg-muted text-muted-foreground border p-5 font-mono font-medium", + ), + }, + }, + code: { + HTMLAttributes: { + class: cx("rounded-md bg-muted px-1.5 py-1 font-mono font-medium"), + spellcheck: "false", + }, + }, + horizontalRule: false, + dropcursor: { + color: "#DBEAFE", + width: 4, + }, + gapcursor: false, +}); + +const codeBlockLowlight = CodeBlockLowlight.configure({ + lowlight: createLowlight(common), +}); + +const youtube = Youtube.configure({ + HTMLAttributes: { + class: cx("rounded-lg border border-muted"), + }, + inline: false, +}); -/** - * Create a custom set of extensions by extending the default set - */ -export function createExtensions(customExtensions: Extension[] = []) { - return [...defaultExtensions, ...customExtensions]; -} +const twitter = Twitter.configure({ + HTMLAttributes: { + class: cx("not-prose"), + }, + inline: false, +}); + +const mathematics = Mathematics.configure({ + HTMLAttributes: { + class: cx("text-foreground rounded p-1 hover:bg-accent cursor-pointer"), + }, + katexOptions: { + throwOnError: false, + }, +}); + +const characterCount = CharacterCount.configure(); + +const markdownExtension = Markdown.configure({ + html: true, + tightLists: true, + tightListClass: "tight", + bulletListMarker: "-", + linkify: false, + breaks: false, + transformPastedText: false, + transformCopiedText: false, +}); + +const table = Table.configure({ + resizable: true, + HTMLAttributes: { + class: cx("border-collapse border border-muted p-2"), + }, +}); + +const tableRow = TableRow.configure({ + HTMLAttributes: { + class: cx("border-collapse border border-muted p-2"), + }, +}); + +const tableCell = TableCell.configure({ + HTMLAttributes: { + class: cx("border-collapse border border-muted p-2"), + }, +}); + +const tableHeader = TableHeader.configure({ + HTMLAttributes: { + class: cx("border-collapse border border-muted p-2"), + }, +}); + +export const defaultExtensions = [ + starterKit, + placeholder, + tiptapLink, + taskList, + taskItem, + horizontalRule, + aiHighlight, + codeBlockLowlight, + youtube, + twitter, + mathematics, + characterCount, + TiptapUnderline, + markdownExtension, + HighlightExtension, + TextStyle, + Color, + CustomKeymap, + GlobalDragHandle, + table, + tableRow, + tableCell, + tableHeader, +]; diff --git a/apps/app/src/components/editor/generative/ai-completion-command.tsx b/apps/app/src/components/editor/generative/ai-completion-command.tsx new file mode 100644 index 0000000000..28893f6918 --- /dev/null +++ b/apps/app/src/components/editor/generative/ai-completion-command.tsx @@ -0,0 +1,22 @@ +import { CommandGroup, CommandItem, CommandSeparator } from "@bubba/ui/command"; +import { TrashIcon } from "lucide-react"; + +const AICompletionCommands = ({ + onDiscard, +}: { + onDiscard: () => void; +}) => { + return ( + <> + + + + + Discard + + + + ); +}; + +export default AICompletionCommands; diff --git a/apps/app/src/components/editor/generative/ai-selector-commands.tsx b/apps/app/src/components/editor/generative/ai-selector-commands.tsx new file mode 100644 index 0000000000..3969f52f04 --- /dev/null +++ b/apps/app/src/components/editor/generative/ai-selector-commands.tsx @@ -0,0 +1,75 @@ +import { ArrowDownWideNarrow, CheckCheck, RefreshCcwDot, StepForward, WrapText } from "lucide-react"; +import { getPrevText, useEditor } from "novel"; +import { CommandGroup, CommandItem, CommandSeparator } from "@bubba/ui/command"; + +const options = [ + { + value: "improve", + label: "Improve writing", + icon: RefreshCcwDot, + }, + { + value: "fix", + label: "Fix grammar", + icon: CheckCheck, + }, + { + value: "shorter", + label: "Make shorter", + icon: ArrowDownWideNarrow, + }, + { + value: "longer", + label: "Make longer", + icon: WrapText, + }, +]; + +interface AISelectorCommandsProps { + onSelect: (value: string, option: string) => void; +} + +const AISelectorCommands = ({ onSelect }: AISelectorCommandsProps) => { + const { editor } = useEditor(); + + return ( + <> + + {options.map((option) => ( + { + if (!editor) return; + const slice = editor.state.selection.content(); + const text = editor.storage.markdown.serializer.serialize(slice.content); + onSelect(text, value); + }} + className="flex gap-2 px-4" + key={option.value} + value={option.value} + > + + {option.label} + + ))} + + + + { + if (!editor) return; + const pos = editor.state.selection.from; + const text = getPrevText(editor, pos); + onSelect(text, "continue"); + }} + value="continue" + className="gap-2 px-4" + > + + Continue writing + + + + ); +}; + +export default AISelectorCommands; diff --git a/apps/app/src/components/editor/generative/ai-selector.tsx b/apps/app/src/components/editor/generative/ai-selector.tsx new file mode 100644 index 0000000000..71b96e0fc1 --- /dev/null +++ b/apps/app/src/components/editor/generative/ai-selector.tsx @@ -0,0 +1,111 @@ +"use client"; + +import { Command, CommandInput } from "@bubba/ui/command"; + +import { useCompletion } from "@ai-sdk/react"; +import { ArrowUp } from "lucide-react"; +import { useEditor } from "novel"; +import { addAIHighlight } from "novel"; +import { useState } from "react"; +import Markdown from "react-markdown"; +import { toast } from "sonner"; +import { Button } from "@bubba/ui/button"; +import CrazySpinner from "../icons/crazy-spinner"; +import Magic from "../icons/magic"; +import { ScrollArea } from "@bubba/ui/scroll-area"; +import AICompletionCommands from "./ai-completion-command"; +import AISelectorCommands from "./ai-selector-commands"; + +interface AISelectorProps { + open: boolean; + onOpenChange: (open: boolean) => void; +} + +export function AISelector({ onOpenChange }: AISelectorProps) { + const { editor } = useEditor(); + const [inputValue, setInputValue] = useState(""); + + const { completion, complete, isLoading } = useCompletion({ + api: "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/api/generate", + onResponse: (response) => { + if (response.status === 429) { + toast.error("You have reached your request limit for the day."); + return; + } + }, + onError: (e) => { + toast.error(e.message); + }, + }); + + const hasCompletion = completion.length > 0; + + return ( + + {hasCompletion && ( +
+ +
+ {completion} +
+
+
+ )} + + {isLoading && ( +
+ + AI is thinking +
+ +
+
+ )} + {!isLoading && ( + <> +
+ { + if (editor) addAIHighlight(editor); + }} + /> + +
+ {hasCompletion ? ( + { + if (editor) editor.chain().unsetHighlight().focus().run(); + onOpenChange(false); + }} + /> + ) : ( + complete(value, { body: { option } })} /> + )} + + )} +
+ ); +} diff --git a/apps/app/src/components/editor/generative/generative-menu-switch.tsx b/apps/app/src/components/editor/generative/generative-menu-switch.tsx new file mode 100644 index 0000000000..1914de81c3 --- /dev/null +++ b/apps/app/src/components/editor/generative/generative-menu-switch.tsx @@ -0,0 +1,49 @@ +import { EditorBubble, removeAIHighlight, useEditor } from "novel"; +import { Fragment, type ReactNode, useEffect } from "react"; +import { Button } from "@bubba/ui/button"; +import Magic from "../icons/magic"; +import { AISelector } from "./ai-selector"; + +interface GenerativeMenuSwitchProps { + children: ReactNode; + open: boolean; + onOpenChange: (open: boolean) => void; +} +const GenerativeMenuSwitch = ({ children, open, onOpenChange }: GenerativeMenuSwitchProps) => { + const { editor } = useEditor(); + + useEffect(() => { + if (!open || !editor) return; + removeAIHighlight(editor); + }, [open]); + return ( + { + onOpenChange(false); + if (editor) editor.chain().unsetHighlight().run(); + }, + }} + className="flex w-fit max-w-[90vw] overflow-hidden border border-muted bg-background shadow-xl" + > + {open && } + {!open && ( + + + {children} + + )} + + ); +}; + +export default GenerativeMenuSwitch; diff --git a/apps/app/src/components/editor/headers/status.tsx b/apps/app/src/components/editor/headers/status.tsx deleted file mode 100644 index cd0f9c3f5e..0000000000 --- a/apps/app/src/components/editor/headers/status.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { Badge } from "@bubba/ui/badge"; - -interface SaveStatusProps { - saveStatus: "Saved" | "Saving" | "Unsaved"; -} - -export function SaveStatus({ saveStatus }: SaveStatusProps) { - return ( -
-
-
- {saveStatus} -
-
-
- ); -} diff --git a/apps/app/src/components/editor/icons/crazy-spinner.tsx b/apps/app/src/components/editor/icons/crazy-spinner.tsx new file mode 100644 index 0000000000..2f0e7c823d --- /dev/null +++ b/apps/app/src/components/editor/icons/crazy-spinner.tsx @@ -0,0 +1,11 @@ +const CrazySpinner = () => { + return ( +
+
+
+
+
+ ); +}; + +export default CrazySpinner; diff --git a/apps/app/src/components/editor/icons/font-default.tsx b/apps/app/src/components/editor/icons/font-default.tsx new file mode 100644 index 0000000000..bf29e4b513 --- /dev/null +++ b/apps/app/src/components/editor/icons/font-default.tsx @@ -0,0 +1,15 @@ +export default function FontDefault({ className }: { className?: string }) { + return ( + + Font Default Icon + + + + ); +} diff --git a/apps/app/src/components/editor/icons/font-mono.tsx b/apps/app/src/components/editor/icons/font-mono.tsx new file mode 100644 index 0000000000..6e7b301bf4 --- /dev/null +++ b/apps/app/src/components/editor/icons/font-mono.tsx @@ -0,0 +1,22 @@ +export default function FontMono({ className }: { className?: string }) { + return ( + + Font Mono Icon + + + + ); +} diff --git a/apps/app/src/components/editor/icons/font-serif.tsx b/apps/app/src/components/editor/icons/font-serif.tsx new file mode 100644 index 0000000000..92225a36a7 --- /dev/null +++ b/apps/app/src/components/editor/icons/font-serif.tsx @@ -0,0 +1,23 @@ +export default function FontSerif({ className }: { className?: string }) { + return ( + + Font Serif Icon + + + + + ); +} diff --git a/apps/app/src/components/editor/icons/index.tsx b/apps/app/src/components/editor/icons/index.tsx new file mode 100644 index 0000000000..5b2844627c --- /dev/null +++ b/apps/app/src/components/editor/icons/index.tsx @@ -0,0 +1,3 @@ +export { default as FontDefault } from "./font-default"; +export { default as FontSerif } from "./font-serif"; +export { default as FontMono } from "./font-mono"; diff --git a/apps/app/src/components/editor/icons/loading-circle.tsx b/apps/app/src/components/editor/icons/loading-circle.tsx new file mode 100644 index 0000000000..2a63811748 --- /dev/null +++ b/apps/app/src/components/editor/icons/loading-circle.tsx @@ -0,0 +1,20 @@ +export default function LoadingCircle({ dimensions }: { dimensions?: string }) { + return ( + + ); +} diff --git a/apps/app/src/components/editor/icons/magic.tsx b/apps/app/src/components/editor/icons/magic.tsx new file mode 100644 index 0000000000..410346f7ec --- /dev/null +++ b/apps/app/src/components/editor/icons/magic.tsx @@ -0,0 +1,32 @@ +export default function Magic({ className }: { className: string }) { + return ( + + Magic AI icon + + + + + + ); +} diff --git a/apps/app/src/components/editor/policy-editor.tsx b/apps/app/src/components/editor/policy-editor.tsx index fc4cf58ab4..3e7a842008 100644 --- a/apps/app/src/components/editor/policy-editor.tsx +++ b/apps/app/src/components/editor/policy-editor.tsx @@ -2,17 +2,15 @@ import type { JSONContent } from "@tiptap/react"; import { useState } from "react"; -import { RichTextEditor } from "./rich-text-editor"; +import AdvancedEditor from "./advanced-editor"; interface PolicyEditorProps { - policyId: string; content: JSONContent[]; readOnly?: boolean; onSave?: (content: JSONContent[]) => Promise; } export function PolicyEditor({ - policyId, content, readOnly = false, onSave, @@ -44,7 +42,7 @@ export function PolicyEditor({ }; return ( - void; - onSave?: (content: JSONContent) => Promise; - readOnly?: boolean; - placeholder?: string; - className?: string; - autofocus?: boolean; - saveDebounceMs?: number; -} - -export function RichTextEditor({ - initialContent, - onUpdate, - onSave, - readOnly = false, - placeholder = "Start writing...", - className, - autofocus = false, - saveDebounceMs = 500, -}: RichTextEditorProps) { - const [saveStatus, setSaveStatus] = useState<"Saved" | "Saving" | "Unsaved">( - "Saved", - ); - const [initialLoadComplete, setInitialLoadComplete] = useState(false); - - const formattedInitialContent = useCallback(() => { - if (!initialContent) return null; - - if (Array.isArray(initialContent)) { - return { - type: "doc", - content: initialContent, - }; - } - - if ( - initialContent.type === "doc" && - Array.isArray(initialContent.content) - ) { - return initialContent; - } - - return initialContent; - }, [initialContent]); - - const debouncedSave = useDebouncedCallback(async (content: JSONContent) => { - if (!onSave) return; - - setSaveStatus("Saving"); - - try { - await onSave(content); - setSaveStatus("Saved"); - } catch (err) { - console.error("Failed to save content:", err); - setSaveStatus("Unsaved"); - } - }, saveDebounceMs); - - const editor = useEditor({ - extensions: defaultExtensions, - content: formattedInitialContent(), - editable: !readOnly, - autofocus, - editorProps: { - attributes: { - class: - "prose dark:prose-invert focus:outline-none h-full w-full focus:outline-none text-foreground max-w-none", - "data-placeholder": placeholder, - }, - }, - onUpdate: ({ editor }) => { - const content = editor.getJSON(); - - if (onUpdate) { - onUpdate(content); - } - - if (initialLoadComplete && onSave) { - setSaveStatus("Unsaved"); - debouncedSave(content); - } - }, - }); - - useEffect(() => { - if (editor && initialContent && !initialLoadComplete) { - try { - const content = formattedInitialContent(); - - if (content) { - editor.commands.setContent(content); - } - - setInitialLoadComplete(true); - } catch (e) { - console.error("Error setting editor content:", e); - } - } - }, [editor, initialContent, initialLoadComplete, formattedInitialContent]); - - if (!editor) { - return
Loading editor...
; - } - - return ( -
- {editor && !readOnly && ( - { - return from !== to && !editor.isActive("codeBlock"); - }} - > -
- - - - - - -
-
- )} - - - -
- ); -} diff --git a/apps/app/src/components/editor/selectors/color-selector.tsx b/apps/app/src/components/editor/selectors/color-selector.tsx new file mode 100644 index 0000000000..c065fc340b --- /dev/null +++ b/apps/app/src/components/editor/selectors/color-selector.tsx @@ -0,0 +1,175 @@ +import { Check, ChevronDown } from "lucide-react"; +import { EditorBubbleItem, useEditor } from "novel"; + +import { Button } from "@bubba/ui/button"; +import { Popover, PopoverContent, PopoverTrigger } from "@bubba/ui/popover"; +export interface BubbleColorMenuItem { + name: string; + color: string; +} + +const TEXT_COLORS: BubbleColorMenuItem[] = [ + { + name: "Default", + color: "var(--novel-black)", + }, + { + name: "Purple", + color: "#9333EA", + }, + { + name: "Red", + color: "#E00000", + }, + { + name: "Yellow", + color: "#EAB308", + }, + { + name: "Blue", + color: "#2563EB", + }, + { + name: "Green", + color: "#008A00", + }, + { + name: "Orange", + color: "#FFA500", + }, + { + name: "Pink", + color: "#BA4081", + }, + { + name: "Gray", + color: "#A8A29E", + }, +]; + +const HIGHLIGHT_COLORS: BubbleColorMenuItem[] = [ + { + name: "Default", + color: "var(--novel-highlight-default)", + }, + { + name: "Purple", + color: "var(--novel-highlight-purple)", + }, + { + name: "Red", + color: "var(--novel-highlight-red)", + }, + { + name: "Yellow", + color: "var(--novel-highlight-yellow)", + }, + { + name: "Blue", + color: "var(--novel-highlight-blue)", + }, + { + name: "Green", + color: "var(--novel-highlight-green)", + }, + { + name: "Orange", + color: "var(--novel-highlight-orange)", + }, + { + name: "Pink", + color: "var(--novel-highlight-pink)", + }, + { + name: "Gray", + color: "var(--novel-highlight-gray)", + }, +]; + +interface ColorSelectorProps { + open: boolean; + onOpenChange: (open: boolean) => void; +} + +export const ColorSelector = ({ open, onOpenChange }: ColorSelectorProps) => { + const { editor } = useEditor(); + + if (!editor) return null; + const activeColorItem = TEXT_COLORS.find(({ color }) => editor.isActive("textStyle", { color })); + + const activeHighlightItem = HIGHLIGHT_COLORS.find(({ color }) => editor.isActive("highlight", { color })); + + return ( + + + + + + +
+
Color
+ {TEXT_COLORS.map(({ name, color }) => ( + { + editor.commands.unsetColor(); + name !== "Default" && + editor + .chain() + .focus() + .setColor(color || "") + .run(); + onOpenChange(false); + }} + className="flex cursor-pointer items-center justify-between px-2 py-1 text-sm hover:bg-accent" + > +
+
+ A +
+ {name} +
+
+ ))} +
+
+
Background
+ {HIGHLIGHT_COLORS.map(({ name, color }) => ( + { + editor.commands.unsetHighlight(); + name !== "Default" && editor.chain().focus().setHighlight({ color }).run(); + onOpenChange(false); + }} + className="flex cursor-pointer items-center justify-between px-2 py-1 text-sm hover:bg-accent" + > +
+
+ A +
+ {name} +
+ {editor.isActive("highlight", { color }) && } +
+ ))} +
+
+
+ ); +}; diff --git a/apps/app/src/components/editor/selectors/link-selector.tsx b/apps/app/src/components/editor/selectors/link-selector.tsx new file mode 100644 index 0000000000..ecc1371287 --- /dev/null +++ b/apps/app/src/components/editor/selectors/link-selector.tsx @@ -0,0 +1,104 @@ +import { Button } from "@bubba/ui/button"; +import { PopoverContent } from "@bubba/ui/popover"; +import { cn } from "@bubba/ui/cn"; +import { Popover, PopoverTrigger } from "@radix-ui/react-popover"; +import { Check, Trash } from "lucide-react"; +import { useEditor } from "novel"; +import { useEffect, useRef } from "react"; + +export function isValidUrl(url: string) { + try { + new URL(url); + return true; + } catch (_e) { + return false; + } +} +export function getUrlFromString(str: string) { + if (isValidUrl(str)) return str; + try { + if (str.includes(".") && !str.includes(" ")) { + return new URL(`https://${str}`).toString(); + } + } catch (_e) { + return null; + } +} +interface LinkSelectorProps { + open: boolean; + onOpenChange: (open: boolean) => void; +} + +export const LinkSelector = ({ open, onOpenChange }: LinkSelectorProps) => { + const inputRef = useRef(null); + const { editor } = useEditor(); + + // Autofocus on input by default + useEffect(() => { + inputRef.current?.focus(); + }); + if (!editor) return null; + + return ( + + + + + +
{ + const target = e.currentTarget as HTMLFormElement; + e.preventDefault(); + const input = target[0] as HTMLInputElement; + const url = getUrlFromString(input.value); + if (url) { + editor.chain().focus().setLink({ href: url }).run(); + onOpenChange(false); + } + }} + className="flex p-1 " + > + + {editor.getAttributes("link").href ? ( + + ) : ( + + )} +
+
+
+ ); +}; diff --git a/apps/app/src/components/editor/selectors/math-selector.tsx b/apps/app/src/components/editor/selectors/math-selector.tsx new file mode 100644 index 0000000000..e2f48e6ca1 --- /dev/null +++ b/apps/app/src/components/editor/selectors/math-selector.tsx @@ -0,0 +1,35 @@ +import { Button } from "@bubba/ui/button"; +import { cn } from "@bubba/ui/cn"; +import { SigmaIcon } from "lucide-react"; +import { useEditor } from "novel"; + +export const MathSelector = () => { + const { editor } = useEditor(); + + if (!editor) return null; + + return ( + + ); +}; diff --git a/apps/app/src/components/editor/selectors/node-selector.tsx b/apps/app/src/components/editor/selectors/node-selector.tsx new file mode 100644 index 0000000000..c4f0e02735 --- /dev/null +++ b/apps/app/src/components/editor/selectors/node-selector.tsx @@ -0,0 +1,126 @@ +import { + Check, + CheckSquare, + ChevronDown, + Code, + Heading1, + Heading2, + Heading3, + ListOrdered, + type LucideIcon, + TextIcon, + TextQuote, +} from "lucide-react"; +import { EditorBubbleItem, useEditor } from "novel"; + +import { Button } from "@bubba/ui/button"; +import { PopoverContent, PopoverTrigger } from "@bubba/ui/popover"; +import { Popover } from "@radix-ui/react-popover"; + +export type SelectorItem = { + name: string; + icon: LucideIcon; + command: (editor: ReturnType["editor"]) => void; + isActive: (editor: ReturnType["editor"]) => boolean; +}; + +const items: SelectorItem[] = [ + { + name: "Text", + icon: TextIcon, + command: (editor) => editor?.chain().focus().clearNodes().run(), + isActive: (editor) => + (editor?.isActive("paragraph") && !editor?.isActive("bulletList") && !editor?.isActive("orderedList")) ?? false, + }, + { + name: "Heading 1", + icon: Heading1, + command: (editor) => editor?.chain().focus().clearNodes().toggleHeading({ level: 1 }).run(), + isActive: (editor) => editor?.isActive("heading", { level: 1 }) ?? false, + }, + { + name: "Heading 2", + icon: Heading2, + command: (editor) => editor?.chain().focus().clearNodes().toggleHeading({ level: 2 }).run(), + isActive: (editor) => editor?.isActive("heading", { level: 2 }) ?? false, + }, + { + name: "Heading 3", + icon: Heading3, + command: (editor) => editor?.chain().focus().clearNodes().toggleHeading({ level: 3 }).run(), + isActive: (editor) => editor?.isActive("heading", { level: 3 }) ?? false, + }, + { + name: "To-do List", + icon: CheckSquare, + command: (editor) => editor?.chain().focus().clearNodes().toggleTaskList().run(), + isActive: (editor) => editor?.isActive("taskItem") ?? false, + }, + { + name: "Bullet List", + icon: ListOrdered, + command: (editor) => editor?.chain().focus().clearNodes().toggleBulletList().run(), + isActive: (editor) => editor?.isActive("bulletList") ?? false, + }, + { + name: "Numbered List", + icon: ListOrdered, + command: (editor) => editor?.chain().focus().clearNodes().toggleOrderedList().run(), + isActive: (editor) => editor?.isActive("orderedList") ?? false, + }, + { + name: "Quote", + icon: TextQuote, + command: (editor) => editor?.chain().focus().clearNodes().toggleBlockquote().run(), + isActive: (editor) => editor?.isActive("blockquote") ?? false, + }, + { + name: "Code", + icon: Code, + command: (editor) => editor?.chain().focus().clearNodes().toggleCodeBlock().run(), + isActive: (editor) => editor?.isActive("codeBlock") ?? false, + }, +]; +interface NodeSelectorProps { + open: boolean; + onOpenChange: (open: boolean) => void; +} + +export const NodeSelector = ({ open, onOpenChange }: NodeSelectorProps) => { + const { editor } = useEditor(); + if (!editor) return null; + const activeItem = items.filter((item) => item.isActive(editor)).pop() ?? { + name: "Multiple", + }; + + return ( + + + + + + {items.map((item) => ( + { + item.command(editor); + onOpenChange(false); + }} + className="flex cursor-pointer items-center justify-between rounded-sm px-2 py-1 text-sm hover:bg-accent" + > +
+
+ +
+ {item.name} +
+ {activeItem.name === item.name && } +
+ ))} +
+
+ ); +}; diff --git a/apps/app/src/components/editor/selectors/text-buttons.tsx b/apps/app/src/components/editor/selectors/text-buttons.tsx new file mode 100644 index 0000000000..6d5ee73d6d --- /dev/null +++ b/apps/app/src/components/editor/selectors/text-buttons.tsx @@ -0,0 +1,62 @@ +import { Button } from "@bubba/ui/button"; +import { cn } from "@bubba/ui/cn"; +import { BoldIcon, CodeIcon, ItalicIcon, StrikethroughIcon, UnderlineIcon } from "lucide-react"; +import { EditorBubbleItem, useEditor } from "novel"; +import type { SelectorItem } from "./node-selector"; + +export const TextButtons = () => { + const { editor } = useEditor(); + if (!editor) return null; + const items: SelectorItem[] = [ + { + name: "bold", + isActive: (editor) => editor?.isActive("bold") ?? false, + command: (editor) => editor?.chain().focus().toggleBold().run(), + icon: BoldIcon, + }, + { + name: "italic", + isActive: (editor) => editor?.isActive("italic") ?? false, + command: (editor) => editor?.chain().focus().toggleItalic().run(), + icon: ItalicIcon, + }, + { + name: "underline", + isActive: (editor) => editor?.isActive("underline") ?? false, + command: (editor) => editor?.chain().focus().toggleUnderline().run(), + icon: UnderlineIcon, + }, + { + name: "strike", + isActive: (editor) => editor?.isActive("strike") ?? false, + command: (editor) => editor?.chain().focus().toggleStrike().run(), + icon: StrikethroughIcon, + }, + { + name: "code", + isActive: (editor) => editor?.isActive("code") ?? false, + command: (editor) => editor?.chain().focus().toggleCode().run(), + icon: CodeIcon, + }, + ]; + return ( +
+ {items.map((item) => ( + { + item.command(editor); + }} + > + + + ))} +
+ ); +}; diff --git a/apps/app/src/components/editor/slash-command.tsx b/apps/app/src/components/editor/slash-command.tsx new file mode 100644 index 0000000000..8242afff41 --- /dev/null +++ b/apps/app/src/components/editor/slash-command.tsx @@ -0,0 +1,130 @@ +import { + CheckSquare, + Code, + Heading1, + Heading2, + Heading3, + List, + ListOrdered, + Text, + TextQuote, + Twitter, + Youtube, +} from "lucide-react"; +import { Command, createSuggestionItems, renderItems } from "novel"; + +export const suggestionItems = createSuggestionItems([ + { + title: "Text", + description: "Just start typing with plain text.", + searchTerms: ["p", "paragraph"], + icon: , + command: ({ editor, range }) => { + editor.chain().focus().deleteRange(range).toggleNode("paragraph", "paragraph").run(); + }, + }, + { + title: "To-do List", + description: "Track tasks with a to-do list.", + searchTerms: ["todo", "task", "list", "check", "checkbox"], + icon: , + command: ({ editor, range }) => { + editor.chain().focus().deleteRange(range).toggleTaskList().run(); + }, + }, + { + title: "Heading 1", + description: "Big section heading.", + searchTerms: ["title", "big", "large"], + icon: , + command: ({ editor, range }) => { + editor.chain().focus().deleteRange(range).setNode("heading", { level: 1 }).run(); + }, + }, + { + title: "Heading 2", + description: "Medium section heading.", + searchTerms: ["subtitle", "medium"], + icon: , + command: ({ editor, range }) => { + editor.chain().focus().deleteRange(range).setNode("heading", { level: 2 }).run(); + }, + }, + { + title: "Heading 3", + description: "Small section heading.", + searchTerms: ["subtitle", "small"], + icon: , + command: ({ editor, range }) => { + editor.chain().focus().deleteRange(range).setNode("heading", { level: 3 }).run(); + }, + }, + { + title: "Bullet List", + description: "Create a simple bullet list.", + searchTerms: ["unordered", "point"], + icon: , + command: ({ editor, range }) => { + editor.chain().focus().deleteRange(range).toggleBulletList().run(); + }, + }, + { + title: "Numbered List", + description: "Create a list with numbering.", + searchTerms: ["ordered"], + icon: , + command: ({ editor, range }) => { + editor.chain().focus().deleteRange(range).toggleOrderedList().run(); + }, + }, + { + title: "Quote", + description: "Capture a quote.", + searchTerms: ["blockquote"], + icon: , + command: ({ editor, range }) => + editor.chain().focus().deleteRange(range).toggleNode("paragraph", "paragraph").toggleBlockquote().run(), + }, + { + title: "Code", + description: "Capture a code snippet.", + searchTerms: ["codeblock"], + icon: , + command: ({ editor, range }) => editor.chain().focus().deleteRange(range).toggleCodeBlock().run(), + }, + { + title: "Youtube", + description: "Embed a Youtube video.", + searchTerms: ["video", "youtube", "embed"], + icon: , + command: ({ editor, range }) => { + const videoLink = prompt("Please enter Youtube Video Link"); + //From https://regexr.com/3dj5t + const ytregex = new RegExp( + /^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w\-]+\?v=|embed\/|v\/)?)([\w\-]+)(\S+)?$/, + ); + + if (videoLink && ytregex.test(videoLink)) { + editor + .chain() + .focus() + .deleteRange(range) + .setYoutubeVideo({ + src: videoLink, + }) + .run(); + } else { + if (videoLink !== null) { + alert("Please enter a correct Youtube Video Link"); + } + } + }, + }, +]); + +export const slashCommand = Command.configure({ + suggestion: { + items: () => suggestionItems, + render: renderItems, + }, +}); diff --git a/bun.lock b/bun.lock index 22c317f98a..0a89a716b7 100644 --- a/bun.lock +++ b/bun.lock @@ -28,20 +28,20 @@ "name": "comp.ai", "version": "0.1.0", "dependencies": { - "@ai-sdk/openai": "^1.1.12", - "@ai-sdk/provider": "^1.0.7", - "@ai-sdk/react": "^1.1.21", + "@ai-sdk/openai": "^1.2.5", + "@ai-sdk/provider": "^1.0.11", + "@ai-sdk/react": "^1.1.23", "@aws-sdk/client-s3": "^3.758.0", "@aws-sdk/s3-request-presigner": "^3.758.0", - "@browserbasehq/sdk": "^2.3.0", + "@browserbasehq/sdk": "^2.4.0", "@bubba/notifications": "workspace:*", "@date-fns/tz": "^1.2.0", "@hookform/resolvers": "^3.10.0", - "@nangohq/frontend": "^0.53.1", - "@novu/headless": "^2.6.5", - "@novu/react": "^2.6.5", - "@prisma/instrumentation": "^6.3.1", - "@tanstack/react-query": "^5.66.0", + "@nangohq/frontend": "^0.53.2", + "@novu/headless": "^2.6.6", + "@novu/react": "^2.6.6", + "@prisma/instrumentation": "^6.5.0", + "@tanstack/react-query": "^5.68.0", "@tanstack/react-table": "^8.21.2", "@tiptap/extension-table": "^2.11.5", "@tiptap/extension-table-cell": "^2.11.5", @@ -53,48 +53,48 @@ "@trigger.dev/react-hooks": "3.3.17", "@trigger.dev/sdk": "3.3.17", "@types/d3": "^7.4.3", - "@uploadthing/react": "^7.2.0", + "@uploadthing/react": "^7.3.0", "@upstash/ratelimit": "^2.0.5", - "ai": "^4.1.54", + "ai": "^4.1.61", "argon2": "^0.41.1", - "bun": "^1.2.2", + "bun": "^1.2.5", "crypto": "^1.0.1", "d3": "^7.9.0", "dub": "^0.46.29", - "framer-motion": "^12.4.7", + "framer-motion": "^12.5.0", "geist": "^1.3.1", "highlight.js": "^11.11.1", "ky": "^1.7.5", - "languine": "^3.0.4", + "languine": "^3.1.2", "marked": "^15.0.7", - "next": "^15.2.0", + "next": "^15.2.2", "next-auth": "^5.0.0-beta.25", "next-international": "^1.3.1", - "next-intl": "^3.26.3", - "next-safe-action": "^7.10.3", - "next-themes": "^0.4.4", + "next-intl": "^3.26.5", + "next-safe-action": "^7.10.4", + "next-themes": "^0.4.6", "novel": "^1.0.2", - "novu": "^2.6.5", - "nuqs": "^2.3.2", - "playwright-core": "^1.50.1", - "posthog-js": "^1.217.2", - "posthog-node": "^4.5.2", - "puppeteer-core": "^24.2.0", + "novu": "^2.6.6", + "nuqs": "^2.4.1", + "playwright-core": "^1.51.0", + "posthog-js": "^1.231.0", + "posthog-node": "^4.10.1", + "puppeteer-core": "^24.4.0", "react": "^19.0.0", "react-dom": "^19.0.0", "react-hook-form": "^7.54.2", "react-hotkeys-hook": "^4.6.1", - "react-intersection-observer": "^9.15.1", - "react-markdown": "^9.0.3", - "react-textarea-autosize": "^8.5.7", + "react-intersection-observer": "^9.16.0", + "react-markdown": "^9.1.0", + "react-textarea-autosize": "^8.5.8", "react-use-draggable-scroll": "^0.4.7", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "resend": "^4.1.2", "sonner": "^1.7.4", - "stripe": "^17.6.0", + "stripe": "^17.7.0", + "tiptap-markdown": "^0.8.10", "ts-pattern": "^5.6.2", - "uploadthing": "^7.5.0", "use-debounce": "^10.0.4", "use-long-press": "^3.2.0", "uuid": "^11.1.0", @@ -105,13 +105,13 @@ "devDependencies": { "@bubba/db": "workspace:*", "@trigger.dev/build": "3.3.17", - "@types/node": "^22.13.2", + "@types/node": "^22.13.10", "@types/react": "19.0.10", "@types/react-dom": "19.0.4", "@types/uuid": "^10.0.0", - "postcss": "^8.5.2", + "postcss": "^8.5.3", "tailwindcss": "^3.4.17", - "typescript": "^5.7.3", + "typescript": "^5.8.2", }, }, "apps/portal": { @@ -333,11 +333,11 @@ "packages": { "@ai-sdk/openai": ["@ai-sdk/openai@0.0.66", "", { "dependencies": { "@ai-sdk/provider": "0.0.24", "@ai-sdk/provider-utils": "1.0.20" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-V4XeDnlNl5/AY3GB3ozJUjqnBLU5pK3DacKTbCNH3zH8/MggJoH6B8wRGdLUPVFMcsMz60mtvh4DC9JsIVFrKw=="], - "@ai-sdk/provider": ["@ai-sdk/provider@1.0.10", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-pco8Zl9U0xwXI+nCLc0woMtxbvjU8hRmGTseAUiPHFLYAAL8trRPCukg69IDeinOvIeo1SmXxAIdWWPZOLb4Cg=="], + "@ai-sdk/provider": ["@ai-sdk/provider@1.0.11", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-CPyImHGiT3svyfmvPvAFTianZzWFtm0qK82XjwlQIA1C3IQ2iku/PMQXi7aFyrX0TyMh3VTkJPB03tjU2VXVrw=="], "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@1.0.22", "", { "dependencies": { "@ai-sdk/provider": "0.0.26", "eventsource-parser": "^1.1.2", "nanoid": "^3.3.7", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ=="], - "@ai-sdk/react": ["@ai-sdk/react@1.1.21", "", { "dependencies": { "@ai-sdk/provider-utils": "2.1.11", "@ai-sdk/ui-utils": "1.1.17", "swr": "^2.2.5", "throttleit": "2.1.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.0.0" }, "optionalPeers": ["react", "zod"] }, "sha512-VKgqzG5wKjyLhROiFhRdyMuDcGu5QPfdLU5J7ovqR1HecknxymL3nCXsxWbAaiZ0khm2EsST6L6zwUbriZrKgg=="], + "@ai-sdk/react": ["@ai-sdk/react@1.1.23", "", { "dependencies": { "@ai-sdk/provider-utils": "2.1.13", "@ai-sdk/ui-utils": "1.1.19", "swr": "^2.2.5", "throttleit": "2.1.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.0.0" }, "optionalPeers": ["react", "zod"] }, "sha512-R+PG9ya0GLs6orzt+1MxmjrWFuZM0gVs+l8ihBr1u+42wwkVeojY4CAtQjW4nrfGTVbdJYkl5y+r/VKfjr42aQ=="], "@ai-sdk/solid": ["@ai-sdk/solid@0.0.54", "", { "dependencies": { "@ai-sdk/provider-utils": "1.0.22", "@ai-sdk/ui-utils": "0.0.50" }, "peerDependencies": { "solid-js": "^1.7.7" }, "optionalPeers": ["solid-js"] }, "sha512-96KWTVK+opdFeRubqrgaJXoNiDP89gNxFRWUp0PJOotZW816AbhUf4EnDjBjXTLjXL1n0h8tGSE9sZsRkj9wQQ=="], @@ -493,7 +493,7 @@ "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@1.9.4", "", { "os": "win32", "cpu": "x64" }, "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA=="], - "@browserbasehq/sdk": ["@browserbasehq/sdk@2.3.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-H2nu46C6ydWgHY+7yqaP8qpfRJMJFVGxVIgsuHe1cx9HkfJHqzkuIqaK/k8mU4ZeavQgV5ZrJa0UX6MDGYiT4w=="], + "@browserbasehq/sdk": ["@browserbasehq/sdk@2.4.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-o1+6C4MQCpZ9+8je1IUF9UvWLuSzLcBjE1kPfu2sw7MgRFNFJS1NcWCiEmjZe71ke4CNojZWaU7XTNxh8z2PUw=="], "@bubba/analytics": ["@bubba/analytics@workspace:packages/analytics"], @@ -749,23 +749,23 @@ "@neondatabase/serverless": ["@neondatabase/serverless@0.10.4", "", { "dependencies": { "@types/pg": "8.11.6" } }, "sha512-2nZuh3VUO9voBauuh+IGYRhGU/MskWHt1IuZvHcJw6GLjDgtqj/KViKo7SIrLdGLdot7vFbiRRw+BgEy3wT9HA=="], - "@next/env": ["@next/env@15.2.1", "", {}, "sha512-JmY0qvnPuS2NCWOz2bbby3Pe0VzdAQ7XpEB6uLIHmtXNfAsAO0KLQLkuAoc42Bxbo3/jMC3dcn9cdf+piCcG2Q=="], + "@next/env": ["@next/env@15.2.2", "", {}, "sha512-yWgopCfA9XDR8ZH3taB5nRKtKJ1Q5fYsTOuYkzIIoS8TJ0UAUKAGF73JnGszbjk2ufAQDj6mDdgsJAFx5CLtYQ=="], - "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.2.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-aWXT+5KEREoy3K5AKtiKwioeblmOvFFjd+F3dVleLvvLiQ/mD//jOOuUcx5hzcO9ISSw4lrqtUPntTpK32uXXQ=="], + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.2.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HNBRnz+bkZ+KfyOExpUxTMR0Ow8nkkcE6IlsdEa9W/rI7gefud19+Sn1xYKwB9pdCdxIP1lPru/ZfjfA+iT8pw=="], - "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.2.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-E/w8ervu4fcG5SkLhvn1NE/2POuDCDEy5gFbfhmnYXkyONZR68qbUlJlZwuN82o7BrBVAw+tkR8nTIjGiMW1jQ=="], + "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.2.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-mJOUwp7al63tDpLpEFpKwwg5jwvtL1lhRW2fI1Aog0nYCPAhxbJsaZKdoVyPZCy8MYf/iQVNDuk/+i29iLCzIA=="], - "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gXDX5lIboebbjhiMT6kFgu4svQyjoSed6dHyjx5uZsjlvTwOAnZpn13w9XDaIMFFHw7K8CpBK7HfDKw0VZvUXQ=="], + "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-5ZZ0Zwy3SgMr7MfWtRE7cQWVssfOvxYfD9O7XHM7KM4nrf5EOeqwq67ZXDgo86LVmffgsu5tPO57EeFKRnrfSQ=="], - "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-3v0pF/adKZkBWfUffmB/ROa+QcNTrnmYG4/SS+r52HPwAK479XcWoES2I+7F7lcbqc7mTeVXrIvb4h6rR/iDKg=="], + "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-cgKWBuFMLlJ4TWcFHl1KOaVVUAF8vy4qEvX5KsNd0Yj5mhu989QFCq1WjuaEbv/tO1ZpsQI6h/0YR8bLwEi+nA=="], - "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-RbsVq2iB6KFJRZ2cHrU67jLVLKeuOIhnQB05ygu5fCNgg8oTewxweJE8XlLV+Ii6Y6u4EHwETdUiRNXIAfpBww=="], + "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-c3kWSOSsVL8rcNBBfOq1+/j2PKs2nsMwJUV4icUxRgGBwUOfppeh7YhN5s79enBQFU+8xRgVatFkhHU1QW7yUA=="], - "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-QHsMLAyAIu6/fWjHmkN/F78EFPKmhQlyX5C8pRIS2RwVA7z+t9cTb0IaYWC3EHLOTjsU7MNQW+n2xGXr11QPpg=="], + "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-PXTW9PLTxdNlVYgPJ0equojcq1kNu5NtwcNjRjHAB+/sdoKZ+X8FBu70fdJFadkxFIGekQTyRvPMFF+SOJaQjw=="], - "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.2.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-Gk42XZXo1cE89i3hPLa/9KZ8OuupTjkDmhLaMKFohjf9brOeZVEa3BQy1J9s9TWUqPhgAEbwv6B2+ciGfe54Vw=="], + "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.2.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-nG644Es5llSGEcTaXhnGWR/aThM/hIaz0jx4MDg4gWC8GfTCp8eDBWZ77CVuv2ha/uL9Ce+nPTfYkSLG67/sHg=="], - "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.2.1", "", { "os": "win32", "cpu": "x64" }, "sha512-YjqXCl8QGhVlMR8uBftWk0iTmvtntr41PhG1kvzGp0sUP/5ehTM+cwx25hKE54J0CRnHYjSGjSH3gkHEaHIN9g=="], + "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.2.2", "", { "os": "win32", "cpu": "x64" }, "sha512-52nWy65S/R6/kejz3jpvHAjZDPKIbEQu4x9jDBzmB9jJfuOy5rspjKu4u77+fI4M/WzLXrrQd57hlFGzz1ubcQ=="], "@next/third-parties": ["@next/third-parties@15.2.1", "", { "dependencies": { "third-party-capital": "1.0.20" }, "peerDependencies": { "next": "^13.0.0 || ^14.0.0 || ^15.0.0", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0" } }, "sha512-XIOqG5NptLoH7MUBuxZP58DMjgX/XeDhY2UTcLHjMMMXfvu2kckGOUYFfoueWzkLmmfKbj7e8nq03pkcN6vXUA=="], @@ -839,27 +839,27 @@ "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.25.1", "", {}, "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ=="], - "@oven/bun-darwin-aarch64": ["@oven/bun-darwin-aarch64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xBz/Q7X6AFwMg7MXtBemjjt5uB+tvEYBmi9Zbm1r8qnI2V8m/Smuhma0EARhiVfLuIAYj2EM5qjzxeAFV4TBJA=="], + "@oven/bun-darwin-aarch64": ["@oven/bun-darwin-aarch64@1.2.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ggZfdpgUJ/OiWrfcfTgHeSTHcec5HAjkGrZHL9FJ/R60sydRKPYHgAgexdIoJAGfsCVAL+x7y8NSTRIAX8J4Ng=="], - "@oven/bun-darwin-x64": ["@oven/bun-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ufyty+2754QCFDhq447H39JiqabMlFRItLn1YFp+2hdpKak7KCYLGOUuHnlr1pmImKJzDHURjnvTTq1QRlUWAA=="], + "@oven/bun-darwin-x64": ["@oven/bun-darwin-x64@1.2.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-4zqyQLJB33s99KcTxH6yQqH5EYBmF1qofQTtLsToIFbIZN1NqSp/aegYiGmxO5Kj/BuWsy8Wf8MS6vX2O0o2Lw=="], - "@oven/bun-darwin-x64-baseline": ["@oven/bun-darwin-x64-baseline@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-stsq8vBiYgfGunBGlf2M7ST7Ymyw3WnwrxEeJ04vkKmMEEE2LpX8Rkol6UPRvZawab9s9/scFIRgFi6hu9H4SQ=="], + "@oven/bun-darwin-x64-baseline": ["@oven/bun-darwin-x64-baseline@1.2.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-3W1RO3/D6Z1S79J47F/DLzmK+dgkYq5hS1ShOCSBAYTTA2b1ZuymaN8avGzSb9ed5W0QfxtyeAksfEY2xUBOqA=="], - "@oven/bun-linux-aarch64": ["@oven/bun-linux-aarch64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-OhVpzme2vvLA7w8GYeJg2SQ2h2CwJQN9oYDiGeoML4EwE+DEoYHdxgaBZsQySOwZtFIr8ufpc/8iD4hssJ50qg=="], + "@oven/bun-linux-aarch64": ["@oven/bun-linux-aarch64@1.2.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-NQFtAVyQyJhLYrhFVxKdh6cqrDNc60pBnBGLQSO8PU+oyFyiJ3e3gGXjLzMbxd6cJxNIK5FZ0JIq96WljKAhlg=="], - "@oven/bun-linux-aarch64-musl": ["@oven/bun-linux-aarch64-musl@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-+lxWF7up9MuB1ZdGxXCH3AH3XmYtdBC6soQ38+yg3+y3iOPrAlSG+wytHEkypN/UU2mGvCuaEED3cMvejrGdDw=="], + "@oven/bun-linux-aarch64-musl": ["@oven/bun-linux-aarch64-musl@1.2.5", "", { "os": "linux", "cpu": "none" }, "sha512-URlISBOE2HQi8qdru691OYywJRwChxMfXFbk26tCgdZ01LgGAKsIjAYylefuSsPuA697imDN3Pel3D7rveusmw=="], - "@oven/bun-linux-x64": ["@oven/bun-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-oof3ii92Cz2yIOZRbVFHMHmffCutRPFITIdXLZ2/rkqVuKUe0ZdqWjHPhxJFm31AL9MlJ/dSqDbPb51SaLI7tw=="], + "@oven/bun-linux-x64": ["@oven/bun-linux-x64@1.2.5", "", { "os": "linux", "cpu": "x64" }, "sha512-pa3kQ4cXNV0jk5aM8+Hdmxr+b4QoPVgeAIA454SN5l3hMGfNsHjczKpsz0ksInZ8506iMMTCPEBXpyQJcSme+Q=="], - "@oven/bun-linux-x64-baseline": ["@oven/bun-linux-x64-baseline@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-3nmDDZJH73MzhBg2sRYioj4CE8wgaz0w24OieMqj4/c44BbNr3X5RewrldsMD2cU6DtVbi52FuD5WpTw3N8nmw=="], + "@oven/bun-linux-x64-baseline": ["@oven/bun-linux-x64-baseline@1.2.5", "", { "os": "linux", "cpu": "x64" }, "sha512-fCm/qp7e3VYlaoRs6NIEsKubPqyxjzLv8/qZkxeLLOlPd7CS8L26UY4KPOSjA+wrhPT+Nxsyvl/EEJq2R/iauA=="], - "@oven/bun-linux-x64-musl": ["@oven/bun-linux-x64-musl@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-cLdMbK7srNoUbYSG3Tp4GYdPAO0+5mgUhdbU053GZs0DLQmQ8h1JQhALp+ZjrUWstmQe7ddcNu7l7EAu6E76XA=="], + "@oven/bun-linux-x64-musl": ["@oven/bun-linux-x64-musl@1.2.5", "", { "os": "linux", "cpu": "x64" }, "sha512-DuU2kQnY48g9tNWjFrZqyG+U2emCBwlhOPxbuY/TMVVNSTMAcQbE/bb3s2pZdhZH5ssjc5SH/ZyWU1TePcYB2A=="], - "@oven/bun-linux-x64-musl-baseline": ["@oven/bun-linux-x64-musl-baseline@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-qDsUvKCW0WUlVOt6Yx5eEzxgCbvzuSJBsu0sXtr6uGt8TnMKghmliRO5FmiMLQ0k/PUDA8vPJCtuv5k14bDi6g=="], + "@oven/bun-linux-x64-musl-baseline": ["@oven/bun-linux-x64-musl-baseline@1.2.5", "", { "os": "linux", "cpu": "x64" }, "sha512-H7tuJz7mZvOTPo4yLbIXIxkiDGWSGd2DbwGl4zNol/FURqGsKQVqpomv86yl9KCXsUUOm5FX2i5Ed+ro8N//Cg=="], - "@oven/bun-windows-x64": ["@oven/bun-windows-x64@1.2.4", "", { "os": "win32", "cpu": "x64" }, "sha512-4YRJd4pdaTWEM+uawYmchOeNv874RGAFpIZQubWnN4SBf6HfcDm0OMMZcm0f0I70Wd5gbPg1+rvCRtDZWVmZog=="], + "@oven/bun-windows-x64": ["@oven/bun-windows-x64@1.2.5", "", { "os": "win32", "cpu": "x64" }, "sha512-oNDdPmzsCyvCATiYgkKWgxOeEx2F7m/i2MGUba+YJAeVXJsJg9iPJrLVBtETvKoSAgkXViwoUEw2U25jRYsp4g=="], - "@oven/bun-windows-x64-baseline": ["@oven/bun-windows-x64-baseline@1.2.4", "", { "os": "win32", "cpu": "x64" }, "sha512-j/G4bnfsRAiCvpTADda40m29iSGvueIaF9Kc9hBu4jN8dTS9fEXdNNXuf8c30/z7/npxw2dhzsAn8jbc5QvD1A=="], + "@oven/bun-windows-x64-baseline": ["@oven/bun-windows-x64-baseline@1.2.5", "", { "os": "win32", "cpu": "x64" }, "sha512-j5FxI8FeKfWI6rEXA+1O3ASBMTp5CFcZ7MR+/aCpiBKrDse32wLaZMVGnvqQqs4y0YHUvR8b7eXHHTboezjL1w=="], "@panva/hkdf": ["@panva/hkdf@1.2.1", "", {}, "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw=="], @@ -903,7 +903,7 @@ "@prisma/get-platform": ["@prisma/get-platform@6.4.1", "", { "dependencies": { "@prisma/debug": "6.4.1" } }, "sha512-gXqZaDI5scDkBF8oza7fOD3Q3QMD0e0rBynlzDDZdTWbWmzjuW58PRZtj+jkvKje2+ZigCWkH8SsWZAsH6q1Yw=="], - "@prisma/instrumentation": ["@prisma/instrumentation@6.4.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0" }, "peerDependencies": { "@opentelemetry/api": "^1.8" } }, "sha512-1SeN0IvMp5zm3RLJnEr+Zn67WDqUIPP1lF/PkLbi/X64vsnFyItcXNRBrYr0/sI2qLcH9iNzJUhyd3emdGizaQ=="], + "@prisma/instrumentation": ["@prisma/instrumentation@6.5.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0" }, "peerDependencies": { "@opentelemetry/api": "^1.8" } }, "sha512-morJDtFRoAp5d/KENEm+K6Y3PQcn5bCvpJ5a9y3V3DNMrNy/ZSn2zulPGj+ld+Xj2UYVoaMJ8DpBX/o6iF6OiA=="], "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], @@ -1257,7 +1257,7 @@ "@tanstack/query-core": ["@tanstack/query-core@4.36.1", "", {}, "sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA=="], - "@tanstack/react-query": ["@tanstack/react-query@5.67.1", "", { "dependencies": { "@tanstack/query-core": "5.67.1" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-fH5u4JLwB6A+wLFdi8wWBWAYoJV5deYif2OveJ26ktAWjU499uvVFS1wPWnyEyq5LvZX1MZInvv9QRaIZANRaQ=="], + "@tanstack/react-query": ["@tanstack/react-query@5.68.0", "", { "dependencies": { "@tanstack/query-core": "5.68.0" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-mMOdGDKlwTP/WV72QqSNf4PAMeoBp/DqBHQ222wBfb51Looi8QUqnCnb9O98ZgvNISmy6fzxRGBJdZ+9IBvX2Q=="], "@tanstack/react-table": ["@tanstack/react-table@8.21.2", "", { "dependencies": { "@tanstack/table-core": "8.21.2" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-11tNlEDTdIhMJba2RBH+ecJ9l1zgS2kjmexDPAraulc8jeNA4xocSNeyzextT0XJyASil4XsCYlJmf5jEWAtYg=="], @@ -1453,15 +1453,15 @@ "@types/jsonwebtoken": ["@types/jsonwebtoken@8.5.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg=="], - "@types/linkify-it": ["@types/linkify-it@5.0.0", "", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="], + "@types/linkify-it": ["@types/linkify-it@3.0.5", "", {}, "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw=="], "@types/lodash": ["@types/lodash@4.17.16", "", {}, "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g=="], - "@types/markdown-it": ["@types/markdown-it@14.1.2", "", { "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" } }, "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog=="], + "@types/markdown-it": ["@types/markdown-it@13.0.9", "", { "dependencies": { "@types/linkify-it": "^3", "@types/mdurl": "^1" } }, "sha512-1XPwR0+MgXLWfTn9gCsZ55AHOKW1WN+P9vr0PaQh5aerR9LLQXUbjfEAFhjmEmyoYFWAyuN2Mqkn40MZ4ukjBw=="], "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], - "@types/mdurl": ["@types/mdurl@2.0.0", "", {}, "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="], + "@types/mdurl": ["@types/mdurl@1.0.5", "", {}, "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA=="], "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="], @@ -1681,7 +1681,7 @@ "builtins": ["builtins@1.0.3", "", {}, "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ=="], - "bun": ["bun@1.2.4", "", { "optionalDependencies": { "@oven/bun-darwin-aarch64": "1.2.4", "@oven/bun-darwin-x64": "1.2.4", "@oven/bun-darwin-x64-baseline": "1.2.4", "@oven/bun-linux-aarch64": "1.2.4", "@oven/bun-linux-aarch64-musl": "1.2.4", "@oven/bun-linux-x64": "1.2.4", "@oven/bun-linux-x64-baseline": "1.2.4", "@oven/bun-linux-x64-musl": "1.2.4", "@oven/bun-linux-x64-musl-baseline": "1.2.4", "@oven/bun-windows-x64": "1.2.4", "@oven/bun-windows-x64-baseline": "1.2.4" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ], "bin": { "bun": "bin/bun.exe", "bunx": "bin/bun.exe" } }, "sha512-ZY0EZ/UKqheaLeAtMsfJA6jWoWvV9HAtfFaOJSmS3LrNpFKs1Sg5fZLSsczN1h3a+Dtheo4O3p3ZYWrf40kRGw=="], + "bun": ["bun@1.2.5", "", { "optionalDependencies": { "@oven/bun-darwin-aarch64": "1.2.5", "@oven/bun-darwin-x64": "1.2.5", "@oven/bun-darwin-x64-baseline": "1.2.5", "@oven/bun-linux-aarch64": "1.2.5", "@oven/bun-linux-aarch64-musl": "1.2.5", "@oven/bun-linux-x64": "1.2.5", "@oven/bun-linux-x64-baseline": "1.2.5", "@oven/bun-linux-x64-musl": "1.2.5", "@oven/bun-linux-x64-musl-baseline": "1.2.5", "@oven/bun-windows-x64": "1.2.5", "@oven/bun-windows-x64-baseline": "1.2.5" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ], "bin": { "bun": "bin/bun.exe", "bunx": "bin/bun.exe" } }, "sha512-fbQLt+DPiGUrPKdmsHRRT7cQAlfjdxPVFvLZrsUPmKiTdv+pU50ypdx9yRJluknSbyaZchFVV7Lx2KXikXKX2Q=="], "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], @@ -2139,7 +2139,7 @@ "fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="], - "framer-motion": ["framer-motion@12.4.10", "", { "dependencies": { "motion-dom": "^12.4.10", "motion-utils": "^12.4.10", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-3Msuyjcr1Pb5hjkn4EJcRe1HumaveP0Gbv4DBMKTPKcV/1GSMkQXj+Uqgneys+9DPcZM18Hac9qY9iUEF5LZtg=="], + "framer-motion": ["framer-motion@12.5.0", "", { "dependencies": { "motion-dom": "^12.5.0", "motion-utils": "^12.5.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-buPlioFbH9/W7rDzYh1C09AuZHAk2D1xTA1BlounJ2Rb9aRg84OXexP0GLd+R83v0khURdMX7b5MKnGTaSg5iA=="], "framework-utils": ["framework-utils@1.1.0", "", {}, "sha512-KAfqli5PwpFJ8o3psRNs8svpMGyCSAe8nmGcjQ0zZBWN2H6dZDnq+ABp3N3hdUmFeMrLtjOCTXD4yplUJIWceg=="], @@ -2463,7 +2463,7 @@ "kysely": ["kysely@0.27.6", "", {}, "sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ=="], - "languine": ["languine@3.0.8", "", { "dependencies": { "@clack/prompts": "^0.10.0", "@trigger.dev/sdk": "3.3.13", "@trpc/client": "11.0.0-rc.700", "@trpc/server": "11.0.0-rc.700", "@types/xml2js": "^0.4.14", "chalk": "^5.4.1", "csv-parse": "^5.6.0", "csv-stringify": "^6.5.2", "dedent": "^1.5.3", "dotenv": "^16.4.7", "fast-glob": "^3.3.3", "fast-xml-parser": "^4.5.1", "gettext-parser": "^8.0.0", "jsdom": "^26.0.0", "json2php": "^0.0.12", "json5": "^2.2.3", "jsonrepair": "^3.11.2", "open": "^10.1.0", "php-parser": "^3.1.5", "plist": "^3.1.0", "preferred-pm": "^4.1.1", "properties": "^1.2.1", "rambda": "^9.4.2", "simple-git": "^3.27.0", "superjson": "^2.2.2", "table-layout": "^4.1.1", "xliff": "^6.2.1", "xml2js": "^0.6.2", "yaml": "^2.7.0", "zod": "^3.24.1" }, "bin": { "languine": "dist/index.js" } }, "sha512-B2qF7C7sHtjbkSAs5gqoeUCojM9c6CQOWAzZLhTqjbjjxNPAbvRyIMyEF+Yrs7UJzOWHyzH/qflWdfRHVXPlLA=="], + "languine": ["languine@3.1.2", "", { "dependencies": { "@clack/prompts": "^0.10.0", "@trigger.dev/sdk": "3.3.13", "@trpc/client": "11.0.0-rc.700", "@trpc/server": "11.0.0-rc.700", "@types/xml2js": "^0.4.14", "chalk": "^5.4.1", "csv-parse": "^5.6.0", "csv-stringify": "^6.5.2", "dedent": "^1.5.3", "dotenv": "^16.4.7", "fast-glob": "^3.3.3", "fast-xml-parser": "^4.5.1", "gettext-parser": "^8.0.0", "jsdom": "^26.0.0", "json2php": "^0.0.12", "json5": "^2.2.3", "jsonrepair": "^3.11.2", "open": "^10.1.0", "php-parser": "^3.1.5", "plist": "^3.1.0", "preferred-pm": "^4.1.1", "properties": "^1.2.1", "rambda": "^9.4.2", "simple-git": "^3.27.0", "superjson": "^2.2.2", "table-layout": "^4.1.1", "xliff": "^6.2.1", "xml2js": "^0.6.2", "yaml": "^2.7.0", "zod": "^3.24.1" }, "bin": { "languine": "dist/index.js" } }, "sha512-nh8qWsLXxBn3Ac4Z89PciUZhTsV7Lm+pQDgg1Yrki5iLLsoUlEfvXvRj5Pw7l1qM2YmUp38qR3MZypy3MqS6Dw=="], "leac": ["leac@0.6.0", "", {}, "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg=="], @@ -2547,6 +2547,8 @@ "markdown-it": ["markdown-it@14.1.0", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg=="], + "markdown-it-task-lists": ["markdown-it-task-lists@2.1.1", "", {}, "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA=="], + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], "marked": ["marked@15.0.7", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg=="], @@ -2681,9 +2683,9 @@ "motion": ["motion@11.18.2", "", { "dependencies": { "framer-motion": "^11.18.2", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-JLjvFDuFr42NFtcVoMAyC2sEjnpA8xpy6qWPyzQvCloznAyQ8FIXioxWfHiLtgYhoVpfUqSWpn1h9++skj9+Wg=="], - "motion-dom": ["motion-dom@12.4.10", "", { "dependencies": { "motion-utils": "^12.4.10" } }, "sha512-ISP5u6FTceoD6qKdLupIPU/LyXBrxGox+P2e3mBbm1+pLdlBbwv01YENJr7+1WZnW5ucVKzFScYsV1eXTCG4Xg=="], + "motion-dom": ["motion-dom@12.5.0", "", { "dependencies": { "motion-utils": "^12.5.0" } }, "sha512-uH2PETDh7m+Hjd1UQQ56yHqwn83SAwNjimNPE/kC+Kds0t4Yh7+29rfo5wezVFpPOv57U4IuWved5d1x0kNhbQ=="], - "motion-utils": ["motion-utils@12.4.10", "", {}, "sha512-NPwZd94V013SwRf++jMrk2+HEBgPkeIE2RiOzhAuuQlqxMJPkKt/LXVh6Upl+iN8oarSGD2dlY5/bqgsYXDABA=="], + "motion-utils": ["motion-utils@12.5.0", "", {}, "sha512-+hFFzvimn0sBMP9iPxBa9OtRX35ZQ3py0UHnb8U29VD+d8lQ8zH3dTygJWqK7av2v6yhg7scj9iZuvTS0f4+SA=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], @@ -2703,7 +2705,7 @@ "netmask": ["netmask@2.0.2", "", {}, "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg=="], - "next": ["next@15.2.1", "", { "dependencies": { "@next/env": "15.2.1", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.2.1", "@next/swc-darwin-x64": "15.2.1", "@next/swc-linux-arm64-gnu": "15.2.1", "@next/swc-linux-arm64-musl": "15.2.1", "@next/swc-linux-x64-gnu": "15.2.1", "@next/swc-linux-x64-musl": "15.2.1", "@next/swc-win32-arm64-msvc": "15.2.1", "@next/swc-win32-x64-msvc": "15.2.1", "sharp": "^0.33.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-zxbsdQv3OqWXybK5tMkPCBKyhIz63RstJ+NvlfkaLMc/m5MwXgz2e92k+hSKcyBpyADhMk2C31RIiaDjUZae7g=="], + "next": ["next@15.2.2", "", { "dependencies": { "@next/env": "15.2.2", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.2.2", "@next/swc-darwin-x64": "15.2.2", "@next/swc-linux-arm64-gnu": "15.2.2", "@next/swc-linux-arm64-musl": "15.2.2", "@next/swc-linux-x64-gnu": "15.2.2", "@next/swc-linux-x64-musl": "15.2.2", "@next/swc-win32-arm64-msvc": "15.2.2", "@next/swc-win32-x64-msvc": "15.2.2", "sharp": "^0.33.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-dgp8Kcx5XZRjMw2KNwBtUzhngRaURPioxoNIVl5BOyJbhi9CUgEtKDO7fx5wh8Z8vOVX1nYZ9meawJoRrlASYA=="], "next-auth": ["next-auth@5.0.0-beta.25", "", { "dependencies": { "@auth/core": "0.37.2" }, "peerDependencies": { "@simplewebauthn/browser": "^9.0.1", "@simplewebauthn/server": "^9.0.2", "next": "^14.0.0-0 || ^15.0.0-0", "nodemailer": "^6.6.5", "react": "^18.2.0 || ^19.0.0-0" }, "optionalPeers": ["@simplewebauthn/browser", "@simplewebauthn/server", "nodemailer"] }, "sha512-2dJJw1sHQl2qxCrRk+KTQbeH+izFbGFPuJj5eGgBZFYyiYYtvlrBeUw1E/OJJxTRjuxbSYGnCTkUIRsIIW0bog=="], @@ -2713,7 +2715,7 @@ "next-safe-action": ["next-safe-action@7.10.4", "", { "peerDependencies": { "@sinclair/typebox": ">= 0.33.3", "next": ">= 14.0.0", "react": ">= 18.2.0", "react-dom": ">= 18.2.0", "valibot": ">= 0.36.0", "yup": ">= 1.0.0", "zod": ">= 3.0.0" }, "optionalPeers": ["@sinclair/typebox", "valibot", "yup", "zod"] }, "sha512-rZE89DTNgiTJ8oPQBOZm+jd0Uf/pLkN+GE3PndER6vWqHGYGN7HMLvhpggkbE8W4TGp+qM7CPyrXye1wCjZLVg=="], - "next-themes": ["next-themes@0.4.4", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ=="], + "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], "next-turnstile": ["next-turnstile@1.0.2", "", { "peerDependencies": { "next": ">=12", "react": ">=16", "react-dom": ">=16" } }, "sha512-PdCDkMQgJLGeTJpBz/cmmsKcysI0z+eN8uYab/8HuxWQ3i3NbhAfufE/Gw3ubXEd/xDezve/eVp+QBX3T7shOQ=="], @@ -2863,7 +2865,7 @@ "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], - "playwright-core": ["playwright-core@1.50.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ=="], + "playwright-core": ["playwright-core@1.51.0", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-x47yPE3Zwhlil7wlNU/iktF7t2r/URR3VLbH6EknJd/04Qc/PSJ0EY3CMXipmglLG+zyRxW6HNo2EGbKLHPWMg=="], "plist": ["plist@3.1.0", "", { "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } }, "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ=="], @@ -3049,7 +3051,7 @@ "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], - "react-textarea-autosize": ["react-textarea-autosize@8.5.7", "", { "dependencies": { "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-2MqJ3p0Jh69yt9ktFIaZmORHXw4c4bxSIhCeWiFwmJ9EYKgLmuNII3e9c9b2UO+ijl4StnpZdqpxNIhTdHvqtQ=="], + "react-textarea-autosize": ["react-textarea-autosize@8.5.8", "", { "dependencies": { "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-iUiIj70JefrTuSJ4LbVFiSqWiHHss5L63L717bqaWHMgkm9sz6eEvro4vZ3uQfGJbevzwT6rHOszHKA8RkhRMg=="], "react-transition-group": ["react-transition-group@4.4.5", "", { "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" }, "peerDependencies": { "react": ">=16.6.0", "react-dom": ">=16.6.0" } }, "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="], @@ -3349,6 +3351,8 @@ "tiptap-extension-global-drag-handle": ["tiptap-extension-global-drag-handle@0.1.18", "", {}, "sha512-jwFuy1K8DP3a4bFy76Hpc63w1Sil0B7uZ3mvhQomVvUFCU787Lg2FowNhn7NFzeyok761qY2VG+PZ/FDthWUdg=="], + "tiptap-markdown": ["tiptap-markdown@0.8.10", "", { "dependencies": { "@types/markdown-it": "^13.0.7", "markdown-it": "^14.1.0", "markdown-it-task-lists": "^2.1.1", "prosemirror-markdown": "^1.11.1" }, "peerDependencies": { "@tiptap/core": "^2.0.3" } }, "sha512-iDVkR2BjAqkTDtFX0h94yVvE2AihCXlF0Q7RIXSJPRSR5I0PA1TMuAg6FHFpmqTn4tPxJ0by0CK7PUMlnFLGEQ=="], + "tldts": ["tldts@6.1.83", "", { "dependencies": { "tldts-core": "^6.1.83" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-FHxxNJJ0WNsEBPHyC1oesQb3rRoxpuho/z2g3zIIAhw1WHJeQsUzK1jYK8TI1/iClaa4fS3Z2TCA9mtxXsENSg=="], "tldts-core": ["tldts-core@6.1.83", "", {}, "sha512-I2wb9OJc6rXyh9d4aInhSNWChNI+ra6qDnFEGEwe9OoA68lE4Temw29bOkf1Uvwt8VZS079t1BFZdXVBmmB4dw=="], @@ -3599,9 +3603,9 @@ "@ai-sdk/provider-utils/nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], - "@ai-sdk/react/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.1.11", "", { "dependencies": { "@ai-sdk/provider": "1.0.10", "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-lMnXA5KaRJidzW7gQmlo/SnX6D+AKk5GxHFcQtOaGOSJNmu/qcNZc1rGaO7K5qW52OvCLXtnWudR4cc/FvMpVQ=="], + "@ai-sdk/react/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.1.13", "", { "dependencies": { "@ai-sdk/provider": "1.0.11", "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-kLjqsfOdONr6DGcGEntFYM1niXz1H05vyZNf9OAzK+KKKc64izyP4/q/9HX7W4+6g8hm6BnmKxu8vkr6FSOqDg=="], - "@ai-sdk/react/@ai-sdk/ui-utils": ["@ai-sdk/ui-utils@1.1.17", "", { "dependencies": { "@ai-sdk/provider": "1.0.10", "@ai-sdk/provider-utils": "2.1.11", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-fCnp/wntZGqPf6tiCmhuQoSDLSBhXoI5DU2JX4As96EO870+jliE6ozvYUwYOZC6Ta2OKAjjWPcSP7HeHX0b+g=="], + "@ai-sdk/react/@ai-sdk/ui-utils": ["@ai-sdk/ui-utils@1.1.19", "", { "dependencies": { "@ai-sdk/provider": "1.0.11", "@ai-sdk/provider-utils": "2.1.13", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-rDHy2uxlPMt3jjS9L6mBrsfhEInZ5BVoWevmD13fsAt2s/XWy2OwwKmgmUQkdLlY4mn/eyeYAfDGK8+5CbOAgg=="], "@ai-sdk/ui-utils/@ai-sdk/provider": ["@ai-sdk/provider@0.0.26", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-dQkfBDs2lTYpKM8389oopPdQgIU007GQyCbuPPrV+K6MtSII3HBfE0stUIMXUb44L+LK1t6GXPP7wjSzjO6uKg=="], @@ -3631,6 +3635,10 @@ "@browserbasehq/sdk/@types/node": ["@types/node@18.19.79", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-90K8Oayimbctc5zTPHPfZloc/lGVs7f3phUAAMcTgEPtg8kKquGZDERC8K4vkBYkQQh48msiYUslYtxTWvqcAg=="], + "@bubba/db/typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], + + "@bubba/notifications/typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], + "@formatjs/ecma402-abstract/@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.6.0", "", { "dependencies": { "tslib": "2" } }, "sha512-4rB4g+3hESy1bHSBG3tDFaMY2CH67iT7yne1e+0CLTsGLDcmoEWWpJjjpWVaYgYfYuohIRuo0E+N536gd2ZHZA=="], "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], @@ -3685,7 +3693,7 @@ "@tailwindcss/postcss/tailwindcss": ["tailwindcss@4.0.13", "", {}, "sha512-gbvFrB0fOsTv/OugXWi2PtflJ4S6/ctu6Mmn3bCftmLY/6xRsQVEJPgIIpABwpZ52DpONkCA3bEj5b54MHxF2Q=="], - "@tanstack/react-query/@tanstack/query-core": ["@tanstack/query-core@5.67.1", "", {}, "sha512-AkFmuukVejyqVIjEQoFhLb3q+xHl7JG8G9cANWTMe3s8iKzD9j1VBSYXgCjy6vm6xM8cUCR9zP2yqWxY9pTWOA=="], + "@tanstack/react-query/@tanstack/query-core": ["@tanstack/query-core@5.68.0", "", {}, "sha512-r8rFYYo8/sY/LNaOqX84h12w7EQev4abFXDWy4UoDVUJzJ5d9Fbmb8ayTi7ScG+V0ap44SF3vNs/45mkzDGyGw=="], "@trigger.dev/core/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@types/shimmer": "^1.0.2", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw=="], @@ -3735,9 +3743,17 @@ "cmdk/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], - "comp.ai/@ai-sdk/openai": ["@ai-sdk/openai@1.2.1", "", { "dependencies": { "@ai-sdk/provider": "1.0.10", "@ai-sdk/provider-utils": "2.1.11" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-UtVDNrmrKzb3b4T9bnpduXs4FKpWGn+sH5qaFP1mtxOPeYGUF9OoJfGilH3CNfqGAE4QdZh/LT3IV6GHacooGg=="], + "comp.ai/@ai-sdk/openai": ["@ai-sdk/openai@1.2.5", "", { "dependencies": { "@ai-sdk/provider": "1.0.11", "@ai-sdk/provider-utils": "2.1.13" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-COK7LzspgQQh5Yq070xfDdVMvp8WX592rXRaMaYNNqu1xpzahxDcM24aF9xgKYWuYH0UMoOw4UmWGwGxr6ygIg=="], + + "comp.ai/@types/node": ["@types/node@22.13.10", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw=="], + + "comp.ai/ai": ["ai@4.1.61", "", { "dependencies": { "@ai-sdk/provider": "1.0.11", "@ai-sdk/provider-utils": "2.1.13", "@ai-sdk/react": "1.1.23", "@ai-sdk/ui-utils": "1.1.19", "@opentelemetry/api": "1.9.0", "eventsource-parser": "^3.0.0", "jsondiffpatch": "0.6.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.0.0" }, "optionalPeers": ["react", "zod"] }, "sha512-Y9SAyGJEeW23F6C7PSHZXYNEvbH2cqJm0rVW2AoeFaXFT13ttx8rAqs8wz2w466C1UB329yl5PXayFcHqofSEA=="], - "comp.ai/ai": ["ai@4.1.54", "", { "dependencies": { "@ai-sdk/provider": "1.0.10", "@ai-sdk/provider-utils": "2.1.11", "@ai-sdk/react": "1.1.21", "@ai-sdk/ui-utils": "1.1.17", "@opentelemetry/api": "1.9.0", "jsondiffpatch": "0.6.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.0.0" }, "optionalPeers": ["react", "zod"] }, "sha512-VcUZhNEC9i1OpdhDaz1cF0IllgMqhwoUdqHQT1U3dKvS9KnOa9qvEtUUAilA+VHI/1LSZF4VzGhXPC7QMT9NMg=="], + "comp.ai/posthog-js": ["posthog-js@1.231.0", "", { "dependencies": { "core-js": "^3.38.1", "fflate": "^0.4.8", "preact": "^10.19.3", "web-vitals": "^4.2.4" }, "peerDependencies": { "@rrweb/types": "2.0.0-alpha.17", "rrweb-snapshot": "2.0.0-alpha.17" }, "optionalPeers": ["@rrweb/types", "rrweb-snapshot"] }, "sha512-8v3zRytQBg3KyKUPLy/9S5fw7ATeiKz3n3pLFxl1fQsV/a2mIt/MAwkIREZXTzi7mamsvtfXhSdggG7UYK/Ojw=="], + + "comp.ai/posthog-node": ["posthog-node@4.10.1", "", { "dependencies": { "axios": "^1.7.4" } }, "sha512-rEzVszfaOkUFTjEabDcRLJNRqMwTOeU1WpqKgQEDV3x82O4ODifkvkoCERaPxl/ossi1NtqKXBOZ+XnhQ19pNQ=="], + + "comp.ai/typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], "condense-newlines/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], @@ -3859,12 +3875,18 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "portal/@types/node": ["@types/node@22.13.10", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw=="], + + "portal/typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], + "postcss/nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], "postcss-nested/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + "prosemirror-markdown/@types/markdown-it": ["@types/markdown-it@14.1.2", "", { "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" } }, "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog=="], + "proxy-agent/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], "raw-body/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], @@ -3925,14 +3947,22 @@ "verror/core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], + "web/@types/node": ["@types/node@22.13.10", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw=="], + "web/framer-motion": ["framer-motion@11.18.2", "", { "dependencies": { "motion-dom": "^11.18.1", "motion-utils": "^11.18.1", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w=="], "web/lucide-react": ["lucide-react@0.469.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw=="], + "web/posthog-js": ["posthog-js@1.231.0", "", { "dependencies": { "core-js": "^3.38.1", "fflate": "^0.4.8", "preact": "^10.19.3", "web-vitals": "^4.2.4" }, "peerDependencies": { "@rrweb/types": "2.0.0-alpha.17", "rrweb-snapshot": "2.0.0-alpha.17" }, "optionalPeers": ["@rrweb/types", "rrweb-snapshot"] }, "sha512-8v3zRytQBg3KyKUPLy/9S5fw7ATeiKz3n3pLFxl1fQsV/a2mIt/MAwkIREZXTzi7mamsvtfXhSdggG7UYK/Ojw=="], + + "web/posthog-node": ["posthog-node@4.10.1", "", { "dependencies": { "axios": "^1.7.4" } }, "sha512-rEzVszfaOkUFTjEabDcRLJNRqMwTOeU1WpqKgQEDV3x82O4ODifkvkoCERaPxl/ossi1NtqKXBOZ+XnhQ19pNQ=="], + "web/tailwind-merge": ["tailwind-merge@2.6.0", "", {}, "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA=="], "web/tailwindcss": ["tailwindcss@4.0.13", "", {}, "sha512-gbvFrB0fOsTv/OugXWi2PtflJ4S6/ctu6Mmn3bCftmLY/6xRsQVEJPgIIpABwpZ52DpONkCA3bEj5b54MHxF2Q=="], + "web/typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], + "whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], "write-file-atomic/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], @@ -4019,11 +4049,13 @@ "cmdk/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], - "comp.ai/@ai-sdk/openai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.1.11", "", { "dependencies": { "@ai-sdk/provider": "1.0.10", "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-lMnXA5KaRJidzW7gQmlo/SnX6D+AKk5GxHFcQtOaGOSJNmu/qcNZc1rGaO7K5qW52OvCLXtnWudR4cc/FvMpVQ=="], + "comp.ai/@ai-sdk/openai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.1.13", "", { "dependencies": { "@ai-sdk/provider": "1.0.11", "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-kLjqsfOdONr6DGcGEntFYM1niXz1H05vyZNf9OAzK+KKKc64izyP4/q/9HX7W4+6g8hm6BnmKxu8vkr6FSOqDg=="], + + "comp.ai/ai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.1.13", "", { "dependencies": { "@ai-sdk/provider": "1.0.11", "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-kLjqsfOdONr6DGcGEntFYM1niXz1H05vyZNf9OAzK+KKKc64izyP4/q/9HX7W4+6g8hm6BnmKxu8vkr6FSOqDg=="], - "comp.ai/ai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.1.11", "", { "dependencies": { "@ai-sdk/provider": "1.0.10", "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-lMnXA5KaRJidzW7gQmlo/SnX6D+AKk5GxHFcQtOaGOSJNmu/qcNZc1rGaO7K5qW52OvCLXtnWudR4cc/FvMpVQ=="], + "comp.ai/ai/@ai-sdk/ui-utils": ["@ai-sdk/ui-utils@1.1.19", "", { "dependencies": { "@ai-sdk/provider": "1.0.11", "@ai-sdk/provider-utils": "2.1.13", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-rDHy2uxlPMt3jjS9L6mBrsfhEInZ5BVoWevmD13fsAt2s/XWy2OwwKmgmUQkdLlY4mn/eyeYAfDGK8+5CbOAgg=="], - "comp.ai/ai/@ai-sdk/ui-utils": ["@ai-sdk/ui-utils@1.1.17", "", { "dependencies": { "@ai-sdk/provider": "1.0.10", "@ai-sdk/provider-utils": "2.1.11", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-fCnp/wntZGqPf6tiCmhuQoSDLSBhXoI5DU2JX4As96EO870+jliE6ozvYUwYOZC6Ta2OKAjjWPcSP7HeHX0b+g=="], + "comp.ai/ai/eventsource-parser": ["eventsource-parser@3.0.0", "", {}, "sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA=="], "data-urls/whatwg-url/tr46": ["tr46@5.0.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g=="], @@ -4065,6 +4097,10 @@ "novu/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "prosemirror-markdown/@types/markdown-it/@types/linkify-it": ["@types/linkify-it@5.0.0", "", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="], + + "prosemirror-markdown/@types/markdown-it/@types/mdurl": ["@types/mdurl@2.0.0", "", {}, "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="], + "react-email/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.19.11", "", { "os": "aix", "cpu": "ppc64" }, "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g=="], "react-email/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.19.11", "", { "os": "android", "cpu": "arm" }, "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw=="], @@ -4171,8 +4207,6 @@ "comp.ai/@ai-sdk/openai/@ai-sdk/provider-utils/nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], - "comp.ai/ai/@ai-sdk/provider-utils/eventsource-parser": ["eventsource-parser@3.0.0", "", {}, "sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA=="], - "comp.ai/ai/@ai-sdk/provider-utils/nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], "languine/@trigger.dev/sdk/@trigger.dev/core/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@types/shimmer": "^1.0.2", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw=="], diff --git a/packages/ui/src/editor.css b/packages/ui/src/editor.css index 29b114a259..2871e7827a 100644 --- a/packages/ui/src/editor.css +++ b/packages/ui/src/editor.css @@ -70,32 +70,32 @@ pre { @apply w-full text-sm leading-normal; height: 100%; min-height: 350px; - overflow-y: auto; } .ProseMirror:focus { @apply outline-none; } + /* Typography */ .ProseMirror h1 { - @apply text-xl font-semibold mb-6 text-foreground; + @apply text-xl font-semibold text-foreground; } .ProseMirror h2 { - @apply text-lg font-semibold mb-4 text-foreground; + @apply text-lg font-semibold text-foreground; } .ProseMirror h3 { - @apply text-base font-semibold mb-3 text-foreground; + @apply text-base font-semibold text-foreground; } .ProseMirror h4 { - @apply text-sm font-semibold mb-2 text-foreground; + @apply text-sm font-semibold text-foreground; } .ProseMirror p { - @apply text-sm leading-6 mb-4 text-foreground; + @apply text-sm; } /* Lists */ @@ -131,19 +131,6 @@ pre { left: -1.5em; } -/* Tables */ -.ProseMirror table { - @apply w-full border-collapse my-4 border border-border; -} - -.ProseMirror th { - @apply bg-muted text-sm font-medium p-3 border border-border; -} - -.ProseMirror td { - @apply text-sm p-3 border border-border; -} - /* Spacing between sections */ .ProseMirror div[data-type="heading"] + p, .ProseMirror h1 + p, @@ -185,37 +172,10 @@ pre { pointer-events: none; } -/* Editor chrome */ -.tiptap { - @apply relative bg-background; - height: 100%;; -} - -/* Bubble menu */ -.tiptap .bubble-menu { - @apply flex gap-1 p-1 border border-border bg-background shadow-sm; -} - -/* Command menu */ -.tiptap .command-menu { - @apply absolute z-50 w-60 bg-background border border-border; -} - -/* Add custom scrollbar styles */ -.ProseMirror::-webkit-scrollbar { - width: 8px; - height: 8px; -} - -.ProseMirror::-webkit-scrollbar-track { - @apply bg-transparent; -} - -.ProseMirror::-webkit-scrollbar-thumb { - @apply bg-muted-foreground/20 rounded-full hover:bg-muted-foreground/30 active:bg-muted-foreground/40; +.ProseMirror table { + @apply w-full border-collapse my-4 border border-border; } -.ProseMirror { - scrollbar-width: thin; - scrollbar-color: var(--muted-foreground) transparent; +.ProseMirror th { + @apply text-sm font-medium; } \ No newline at end of file diff --git a/packages/ui/src/globals.css b/packages/ui/src/globals.css index 2738d31d9f..4f710686ee 100644 --- a/packages/ui/src/globals.css +++ b/packages/ui/src/globals.css @@ -366,4 +366,4 @@ .aria-selected\:text-accent-foreground[aria-selected='true'] { border-radius: 0px; -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 16993e44dd..fa1b44f873 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11,13 +11,13 @@ "@ai-sdk/provider" "0.0.24" "@ai-sdk/provider-utils" "1.0.20" -"@ai-sdk/openai@^1.1.12": - version "1.2.1" - resolved "https://registry.npmjs.org/@ai-sdk/openai/-/openai-1.2.1.tgz" - integrity sha512-UtVDNrmrKzb3b4T9bnpduXs4FKpWGn+sH5qaFP1mtxOPeYGUF9OoJfGilH3CNfqGAE4QdZh/LT3IV6GHacooGg== +"@ai-sdk/openai@^1.2.5": + version "1.2.5" + resolved "https://registry.npmjs.org/@ai-sdk/openai/-/openai-1.2.5.tgz" + integrity sha512-COK7LzspgQQh5Yq070xfDdVMvp8WX592rXRaMaYNNqu1xpzahxDcM24aF9xgKYWuYH0UMoOw4UmWGwGxr6ygIg== dependencies: - "@ai-sdk/provider" "1.0.10" - "@ai-sdk/provider-utils" "2.1.11" + "@ai-sdk/provider" "1.0.11" + "@ai-sdk/provider-utils" "2.1.13" "@ai-sdk/provider@0.0.24": version "0.0.24" @@ -33,10 +33,10 @@ dependencies: json-schema "^0.4.0" -"@ai-sdk/provider@1.0.10", "@ai-sdk/provider@^1.0.7": - version "1.0.10" - resolved "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.0.10.tgz" - integrity sha512-pco8Zl9U0xwXI+nCLc0woMtxbvjU8hRmGTseAUiPHFLYAAL8trRPCukg69IDeinOvIeo1SmXxAIdWWPZOLb4Cg== +"@ai-sdk/provider@1.0.11", "@ai-sdk/provider@^1.0.11": + version "1.0.11" + resolved "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.0.11.tgz" + integrity sha512-CPyImHGiT3svyfmvPvAFTianZzWFtm0qK82XjwlQIA1C3IQ2iku/PMQXi7aFyrX0TyMh3VTkJPB03tjU2VXVrw== dependencies: json-schema "^0.4.0" @@ -60,12 +60,12 @@ nanoid "^3.3.7" secure-json-parse "^2.7.0" -"@ai-sdk/provider-utils@2.1.11": - version "2.1.11" - resolved "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.1.11.tgz" - integrity sha512-lMnXA5KaRJidzW7gQmlo/SnX6D+AKk5GxHFcQtOaGOSJNmu/qcNZc1rGaO7K5qW52OvCLXtnWudR4cc/FvMpVQ== +"@ai-sdk/provider-utils@2.1.13": + version "2.1.13" + resolved "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.1.13.tgz" + integrity sha512-kLjqsfOdONr6DGcGEntFYM1niXz1H05vyZNf9OAzK+KKKc64izyP4/q/9HX7W4+6g8hm6BnmKxu8vkr6FSOqDg== dependencies: - "@ai-sdk/provider" "1.0.10" + "@ai-sdk/provider" "1.0.11" eventsource-parser "^3.0.0" nanoid "^3.3.8" secure-json-parse "^2.7.0" @@ -80,13 +80,13 @@ swr "^2.2.5" throttleit "2.1.0" -"@ai-sdk/react@1.1.21", "@ai-sdk/react@^1.1.21": - version "1.1.21" - resolved "https://registry.npmjs.org/@ai-sdk/react/-/react-1.1.21.tgz" - integrity sha512-VKgqzG5wKjyLhROiFhRdyMuDcGu5QPfdLU5J7ovqR1HecknxymL3nCXsxWbAaiZ0khm2EsST6L6zwUbriZrKgg== +"@ai-sdk/react@1.1.23", "@ai-sdk/react@^1.1.23": + version "1.1.23" + resolved "https://registry.npmjs.org/@ai-sdk/react/-/react-1.1.23.tgz" + integrity sha512-R+PG9ya0GLs6orzt+1MxmjrWFuZM0gVs+l8ihBr1u+42wwkVeojY4CAtQjW4nrfGTVbdJYkl5y+r/VKfjr42aQ== dependencies: - "@ai-sdk/provider-utils" "2.1.11" - "@ai-sdk/ui-utils" "1.1.17" + "@ai-sdk/provider-utils" "2.1.13" + "@ai-sdk/ui-utils" "1.1.19" swr "^2.2.5" throttleit "2.1.0" @@ -118,13 +118,13 @@ secure-json-parse "^2.7.0" zod-to-json-schema "^3.23.3" -"@ai-sdk/ui-utils@1.1.17": - version "1.1.17" - resolved "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.1.17.tgz" - integrity sha512-fCnp/wntZGqPf6tiCmhuQoSDLSBhXoI5DU2JX4As96EO870+jliE6ozvYUwYOZC6Ta2OKAjjWPcSP7HeHX0b+g== +"@ai-sdk/ui-utils@1.1.19": + version "1.1.19" + resolved "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.1.19.tgz" + integrity sha512-rDHy2uxlPMt3jjS9L6mBrsfhEInZ5BVoWevmD13fsAt2s/XWy2OwwKmgmUQkdLlY4mn/eyeYAfDGK8+5CbOAgg== dependencies: - "@ai-sdk/provider" "1.0.10" - "@ai-sdk/provider-utils" "2.1.11" + "@ai-sdk/provider" "1.0.11" + "@ai-sdk/provider-utils" "2.1.13" zod-to-json-schema "^3.24.1" "@ai-sdk/vue@0.0.59": @@ -1028,10 +1028,10 @@ resolved "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz" integrity sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA== -"@browserbasehq/sdk@^2.3.0": - version "2.3.0" - resolved "https://registry.npmjs.org/@browserbasehq/sdk/-/sdk-2.3.0.tgz" - integrity sha512-H2nu46C6ydWgHY+7yqaP8qpfRJMJFVGxVIgsuHe1cx9HkfJHqzkuIqaK/k8mU4ZeavQgV5ZrJa0UX6MDGYiT4w== +"@browserbasehq/sdk@^2.4.0": + version "2.4.0" + resolved "https://registry.npmjs.org/@browserbasehq/sdk/-/sdk-2.4.0.tgz" + integrity sha512-o1+6C4MQCpZ9+8je1IUF9UvWLuSzLcBjE1kPfu2sw7MgRFNFJS1NcWCiEmjZe71ke4CNojZWaU7XTNxh8z2PUw== dependencies: "@types/node" "^18.11.18" "@types/node-fetch" "^2.6.4" @@ -1053,7 +1053,6 @@ resolved "workspace:packages/db" devDependencies: "@bubba/tsconfig" "workspace:*" - devDependencies: typescript "^5.7.3" dependencies: "@auth/prisma-adapter" "^2.7.4" @@ -2065,7 +2064,7 @@ prop-types "^15.8.1" react-is "^19.0.0" -"@nangohq/frontend@^0.53.1": +"@nangohq/frontend@^0.53.2": version "0.53.2" resolved "https://registry.npmjs.org/@nangohq/frontend/-/frontend-0.53.2.tgz" integrity sha512-ZSNY9jHVuF/Qfsu8TJBK3tujsxO+Qi7dHWNFt316Mq3g4od9MwuHefTEs0EtfpUTCB18hNE05QOQWCuD8zO8Aw== @@ -2101,90 +2100,90 @@ resolved "https://registry.npmjs.org/@next/env/-/env-15.0.4.tgz" integrity sha512-WNRvtgnRVDD4oM8gbUcRc27IAhaL4eXQ/2ovGbgLnPGUvdyDr8UdXP4Q/IBDdAdojnD2eScryIDirv0YUCjUVw== -"@next/env@15.2.1": - version "15.2.1" - resolved "https://registry.npmjs.org/@next/env/-/env-15.2.1.tgz" - integrity sha512-JmY0qvnPuS2NCWOz2bbby3Pe0VzdAQ7XpEB6uLIHmtXNfAsAO0KLQLkuAoc42Bxbo3/jMC3dcn9cdf+piCcG2Q== +"@next/env@15.2.2": + version "15.2.2" + resolved "https://registry.npmjs.org/@next/env/-/env-15.2.2.tgz" + integrity sha512-yWgopCfA9XDR8ZH3taB5nRKtKJ1Q5fYsTOuYkzIIoS8TJ0UAUKAGF73JnGszbjk2ufAQDj6mDdgsJAFx5CLtYQ== "@next/swc-darwin-arm64@15.0.4": version "15.0.4" resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.0.4.tgz" integrity sha512-QecQXPD0yRHxSXWL5Ff80nD+A56sUXZG9koUsjWJwA2Z0ZgVQfuy7gd0/otjxoOovPVHR2eVEvPMHbtZP+pf9w== -"@next/swc-darwin-arm64@15.2.1": - version "15.2.1" - resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.1.tgz" - integrity sha512-aWXT+5KEREoy3K5AKtiKwioeblmOvFFjd+F3dVleLvvLiQ/mD//jOOuUcx5hzcO9ISSw4lrqtUPntTpK32uXXQ== +"@next/swc-darwin-arm64@15.2.2": + version "15.2.2" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.2.tgz" + integrity sha512-HNBRnz+bkZ+KfyOExpUxTMR0Ow8nkkcE6IlsdEa9W/rI7gefud19+Sn1xYKwB9pdCdxIP1lPru/ZfjfA+iT8pw== "@next/swc-darwin-x64@15.0.4": version "15.0.4" resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.0.4.tgz" integrity sha512-pb7Bye3y1Og3PlCtnz2oO4z+/b3pH2/HSYkLbL0hbVuTGil7fPen8/3pyyLjdiTLcFJ+ymeU3bck5hd4IPFFCA== -"@next/swc-darwin-x64@15.2.1": - version "15.2.1" - resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.1.tgz" - integrity sha512-E/w8ervu4fcG5SkLhvn1NE/2POuDCDEy5gFbfhmnYXkyONZR68qbUlJlZwuN82o7BrBVAw+tkR8nTIjGiMW1jQ== +"@next/swc-darwin-x64@15.2.2": + version "15.2.2" + resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.2.tgz" + integrity sha512-mJOUwp7al63tDpLpEFpKwwg5jwvtL1lhRW2fI1Aog0nYCPAhxbJsaZKdoVyPZCy8MYf/iQVNDuk/+i29iLCzIA== "@next/swc-linux-arm64-gnu@15.0.4": version "15.0.4" resolved "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.0.4.tgz" integrity sha512-12oSaBFjGpB227VHzoXF3gJoK2SlVGmFJMaBJSu5rbpaoT5OjP5OuCLuR9/jnyBF1BAWMs/boa6mLMoJPRriMA== -"@next/swc-linux-arm64-gnu@15.2.1": - version "15.2.1" - resolved "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.1.tgz" - integrity sha512-gXDX5lIboebbjhiMT6kFgu4svQyjoSed6dHyjx5uZsjlvTwOAnZpn13w9XDaIMFFHw7K8CpBK7HfDKw0VZvUXQ== +"@next/swc-linux-arm64-gnu@15.2.2": + version "15.2.2" + resolved "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.2.tgz" + integrity sha512-5ZZ0Zwy3SgMr7MfWtRE7cQWVssfOvxYfD9O7XHM7KM4nrf5EOeqwq67ZXDgo86LVmffgsu5tPO57EeFKRnrfSQ== "@next/swc-linux-arm64-musl@15.0.4": version "15.0.4" resolved "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.0.4.tgz" integrity sha512-QARO88fR/a+wg+OFC3dGytJVVviiYFEyjc/Zzkjn/HevUuJ7qGUUAUYy5PGVWY1YgTzeRYz78akQrVQ8r+sMjw== -"@next/swc-linux-arm64-musl@15.2.1": - version "15.2.1" - resolved "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.1.tgz" - integrity sha512-3v0pF/adKZkBWfUffmB/ROa+QcNTrnmYG4/SS+r52HPwAK479XcWoES2I+7F7lcbqc7mTeVXrIvb4h6rR/iDKg== +"@next/swc-linux-arm64-musl@15.2.2": + version "15.2.2" + resolved "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.2.tgz" + integrity sha512-cgKWBuFMLlJ4TWcFHl1KOaVVUAF8vy4qEvX5KsNd0Yj5mhu989QFCq1WjuaEbv/tO1ZpsQI6h/0YR8bLwEi+nA== "@next/swc-linux-x64-gnu@15.0.4": version "15.0.4" resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.0.4.tgz" integrity sha512-Z50b0gvYiUU1vLzfAMiChV8Y+6u/T2mdfpXPHraqpypP7yIT2UV9YBBhcwYkxujmCvGEcRTVWOj3EP7XW/wUnw== -"@next/swc-linux-x64-gnu@15.2.1": - version "15.2.1" - resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.1.tgz" - integrity sha512-RbsVq2iB6KFJRZ2cHrU67jLVLKeuOIhnQB05ygu5fCNgg8oTewxweJE8XlLV+Ii6Y6u4EHwETdUiRNXIAfpBww== +"@next/swc-linux-x64-gnu@15.2.2": + version "15.2.2" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.2.tgz" + integrity sha512-c3kWSOSsVL8rcNBBfOq1+/j2PKs2nsMwJUV4icUxRgGBwUOfppeh7YhN5s79enBQFU+8xRgVatFkhHU1QW7yUA== "@next/swc-linux-x64-musl@15.0.4": version "15.0.4" resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.0.4.tgz" integrity sha512-7H9C4FAsrTAbA/ENzvFWsVytqRYhaJYKa2B3fyQcv96TkOGVMcvyS6s+sj4jZlacxxTcn7ygaMXUPkEk7b78zw== -"@next/swc-linux-x64-musl@15.2.1": - version "15.2.1" - resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.1.tgz" - integrity sha512-QHsMLAyAIu6/fWjHmkN/F78EFPKmhQlyX5C8pRIS2RwVA7z+t9cTb0IaYWC3EHLOTjsU7MNQW+n2xGXr11QPpg== +"@next/swc-linux-x64-musl@15.2.2": + version "15.2.2" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.2.tgz" + integrity sha512-PXTW9PLTxdNlVYgPJ0equojcq1kNu5NtwcNjRjHAB+/sdoKZ+X8FBu70fdJFadkxFIGekQTyRvPMFF+SOJaQjw== "@next/swc-win32-arm64-msvc@15.0.4": version "15.0.4" resolved "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.0.4.tgz" integrity sha512-Z/v3WV5xRaeWlgJzN9r4PydWD8sXV35ywc28W63i37G2jnUgScA4OOgS8hQdiXLxE3gqfSuHTicUhr7931OXPQ== -"@next/swc-win32-arm64-msvc@15.2.1": - version "15.2.1" - resolved "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.1.tgz" - integrity sha512-Gk42XZXo1cE89i3hPLa/9KZ8OuupTjkDmhLaMKFohjf9brOeZVEa3BQy1J9s9TWUqPhgAEbwv6B2+ciGfe54Vw== +"@next/swc-win32-arm64-msvc@15.2.2": + version "15.2.2" + resolved "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.2.tgz" + integrity sha512-nG644Es5llSGEcTaXhnGWR/aThM/hIaz0jx4MDg4gWC8GfTCp8eDBWZ77CVuv2ha/uL9Ce+nPTfYkSLG67/sHg== "@next/swc-win32-x64-msvc@15.0.4": version "15.0.4" resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.0.4.tgz" integrity sha512-NGLchGruagh8lQpDr98bHLyWJXOBSmkEAfK980OiNBa7vNm6PsNoPvzTfstT78WyOeMRQphEQ455rggd7Eo+Dw== -"@next/swc-win32-x64-msvc@15.2.1": - version "15.2.1" - resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.1.tgz" - integrity sha512-YjqXCl8QGhVlMR8uBftWk0iTmvtntr41PhG1kvzGp0sUP/5ehTM+cwx25hKE54J0CRnHYjSGjSH3gkHEaHIN9g== +"@next/swc-win32-x64-msvc@15.2.2": + version "15.2.2" + resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.2.tgz" + integrity sha512-52nWy65S/R6/kejz3jpvHAjZDPKIbEQu4x9jDBzmB9jJfuOy5rspjKu4u77+fI4M/WzLXrrQd57hlFGzz1ubcQ== "@next/third-parties@^15.1.7": version "15.2.1" @@ -2231,7 +2230,7 @@ dependencies: "@novu/shared" "2.6.6" -"@novu/headless@^2.6.5": +"@novu/headless@^2.6.6": version "2.6.6" resolved "https://registry.npmjs.org/@novu/headless/-/headless-2.6.6.tgz" integrity sha512-2FBU1SwzUJQMnaIb9EItdREs8kiA7YG0Lgu3nMqcoTw2b8wpHC6PL1tA11XKkGY/H+dCDRM29ubbcm3tUYd+yA== @@ -2281,7 +2280,7 @@ ws "^8.11.0" zod "3.22.3" -"@novu/react@^2.6.5": +"@novu/react@^2.6.6": version "2.6.6" resolved "https://registry.npmjs.org/@novu/react/-/react-2.6.6.tgz" integrity sha512-CCLEPpE7AITflEx0sIH5dC6UuBaqYZHsnhumQNv+gPVYcsk+BVxz9N0/tq81KjOuTBA/bnQLxu+llbTObQ1QnQ== @@ -2524,60 +2523,60 @@ resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz" integrity sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ== -"@oven/bun-darwin-aarch64@1.2.4": - version "1.2.4" - resolved "https://registry.npmjs.org/@oven/bun-darwin-aarch64/-/bun-darwin-aarch64-1.2.4.tgz" - integrity sha512-xBz/Q7X6AFwMg7MXtBemjjt5uB+tvEYBmi9Zbm1r8qnI2V8m/Smuhma0EARhiVfLuIAYj2EM5qjzxeAFV4TBJA== +"@oven/bun-darwin-aarch64@1.2.5": + version "1.2.5" + resolved "https://registry.npmjs.org/@oven/bun-darwin-aarch64/-/bun-darwin-aarch64-1.2.5.tgz" + integrity sha512-ggZfdpgUJ/OiWrfcfTgHeSTHcec5HAjkGrZHL9FJ/R60sydRKPYHgAgexdIoJAGfsCVAL+x7y8NSTRIAX8J4Ng== -"@oven/bun-darwin-x64@1.2.4": - version "1.2.4" - resolved "https://registry.npmjs.org/@oven/bun-darwin-x64/-/bun-darwin-x64-1.2.4.tgz" - integrity sha512-ufyty+2754QCFDhq447H39JiqabMlFRItLn1YFp+2hdpKak7KCYLGOUuHnlr1pmImKJzDHURjnvTTq1QRlUWAA== +"@oven/bun-darwin-x64@1.2.5": + version "1.2.5" + resolved "https://registry.npmjs.org/@oven/bun-darwin-x64/-/bun-darwin-x64-1.2.5.tgz" + integrity sha512-4zqyQLJB33s99KcTxH6yQqH5EYBmF1qofQTtLsToIFbIZN1NqSp/aegYiGmxO5Kj/BuWsy8Wf8MS6vX2O0o2Lw== -"@oven/bun-darwin-x64-baseline@1.2.4": - version "1.2.4" - resolved "https://registry.npmjs.org/@oven/bun-darwin-x64-baseline/-/bun-darwin-x64-baseline-1.2.4.tgz" - integrity sha512-stsq8vBiYgfGunBGlf2M7ST7Ymyw3WnwrxEeJ04vkKmMEEE2LpX8Rkol6UPRvZawab9s9/scFIRgFi6hu9H4SQ== +"@oven/bun-darwin-x64-baseline@1.2.5": + version "1.2.5" + resolved "https://registry.npmjs.org/@oven/bun-darwin-x64-baseline/-/bun-darwin-x64-baseline-1.2.5.tgz" + integrity sha512-3W1RO3/D6Z1S79J47F/DLzmK+dgkYq5hS1ShOCSBAYTTA2b1ZuymaN8avGzSb9ed5W0QfxtyeAksfEY2xUBOqA== -"@oven/bun-linux-aarch64@1.2.4": - version "1.2.4" - resolved "https://registry.npmjs.org/@oven/bun-linux-aarch64/-/bun-linux-aarch64-1.2.4.tgz" - integrity sha512-OhVpzme2vvLA7w8GYeJg2SQ2h2CwJQN9oYDiGeoML4EwE+DEoYHdxgaBZsQySOwZtFIr8ufpc/8iD4hssJ50qg== +"@oven/bun-linux-aarch64@1.2.5": + version "1.2.5" + resolved "https://registry.npmjs.org/@oven/bun-linux-aarch64/-/bun-linux-aarch64-1.2.5.tgz" + integrity sha512-NQFtAVyQyJhLYrhFVxKdh6cqrDNc60pBnBGLQSO8PU+oyFyiJ3e3gGXjLzMbxd6cJxNIK5FZ0JIq96WljKAhlg== -"@oven/bun-linux-aarch64-musl@1.2.4": - version "1.2.4" - resolved "https://registry.npmjs.org/@oven/bun-linux-aarch64-musl/-/bun-linux-aarch64-musl-1.2.4.tgz" - integrity sha512-+lxWF7up9MuB1ZdGxXCH3AH3XmYtdBC6soQ38+yg3+y3iOPrAlSG+wytHEkypN/UU2mGvCuaEED3cMvejrGdDw== +"@oven/bun-linux-aarch64-musl@1.2.5": + version "1.2.5" + resolved "https://registry.npmjs.org/@oven/bun-linux-aarch64-musl/-/bun-linux-aarch64-musl-1.2.5.tgz" + integrity sha512-URlISBOE2HQi8qdru691OYywJRwChxMfXFbk26tCgdZ01LgGAKsIjAYylefuSsPuA697imDN3Pel3D7rveusmw== -"@oven/bun-linux-x64@1.2.4": - version "1.2.4" - resolved "https://registry.npmjs.org/@oven/bun-linux-x64/-/bun-linux-x64-1.2.4.tgz" - integrity sha512-oof3ii92Cz2yIOZRbVFHMHmffCutRPFITIdXLZ2/rkqVuKUe0ZdqWjHPhxJFm31AL9MlJ/dSqDbPb51SaLI7tw== +"@oven/bun-linux-x64@1.2.5": + version "1.2.5" + resolved "https://registry.npmjs.org/@oven/bun-linux-x64/-/bun-linux-x64-1.2.5.tgz" + integrity sha512-pa3kQ4cXNV0jk5aM8+Hdmxr+b4QoPVgeAIA454SN5l3hMGfNsHjczKpsz0ksInZ8506iMMTCPEBXpyQJcSme+Q== -"@oven/bun-linux-x64-baseline@1.2.4": - version "1.2.4" - resolved "https://registry.npmjs.org/@oven/bun-linux-x64-baseline/-/bun-linux-x64-baseline-1.2.4.tgz" - integrity sha512-3nmDDZJH73MzhBg2sRYioj4CE8wgaz0w24OieMqj4/c44BbNr3X5RewrldsMD2cU6DtVbi52FuD5WpTw3N8nmw== +"@oven/bun-linux-x64-baseline@1.2.5": + version "1.2.5" + resolved "https://registry.npmjs.org/@oven/bun-linux-x64-baseline/-/bun-linux-x64-baseline-1.2.5.tgz" + integrity sha512-fCm/qp7e3VYlaoRs6NIEsKubPqyxjzLv8/qZkxeLLOlPd7CS8L26UY4KPOSjA+wrhPT+Nxsyvl/EEJq2R/iauA== -"@oven/bun-linux-x64-musl@1.2.4": - version "1.2.4" - resolved "https://registry.npmjs.org/@oven/bun-linux-x64-musl/-/bun-linux-x64-musl-1.2.4.tgz" - integrity sha512-cLdMbK7srNoUbYSG3Tp4GYdPAO0+5mgUhdbU053GZs0DLQmQ8h1JQhALp+ZjrUWstmQe7ddcNu7l7EAu6E76XA== +"@oven/bun-linux-x64-musl@1.2.5": + version "1.2.5" + resolved "https://registry.npmjs.org/@oven/bun-linux-x64-musl/-/bun-linux-x64-musl-1.2.5.tgz" + integrity sha512-DuU2kQnY48g9tNWjFrZqyG+U2emCBwlhOPxbuY/TMVVNSTMAcQbE/bb3s2pZdhZH5ssjc5SH/ZyWU1TePcYB2A== -"@oven/bun-linux-x64-musl-baseline@1.2.4": - version "1.2.4" - resolved "https://registry.npmjs.org/@oven/bun-linux-x64-musl-baseline/-/bun-linux-x64-musl-baseline-1.2.4.tgz" - integrity sha512-qDsUvKCW0WUlVOt6Yx5eEzxgCbvzuSJBsu0sXtr6uGt8TnMKghmliRO5FmiMLQ0k/PUDA8vPJCtuv5k14bDi6g== +"@oven/bun-linux-x64-musl-baseline@1.2.5": + version "1.2.5" + resolved "https://registry.npmjs.org/@oven/bun-linux-x64-musl-baseline/-/bun-linux-x64-musl-baseline-1.2.5.tgz" + integrity sha512-H7tuJz7mZvOTPo4yLbIXIxkiDGWSGd2DbwGl4zNol/FURqGsKQVqpomv86yl9KCXsUUOm5FX2i5Ed+ro8N//Cg== -"@oven/bun-windows-x64@1.2.4": - version "1.2.4" - resolved "https://registry.npmjs.org/@oven/bun-windows-x64/-/bun-windows-x64-1.2.4.tgz" - integrity sha512-4YRJd4pdaTWEM+uawYmchOeNv874RGAFpIZQubWnN4SBf6HfcDm0OMMZcm0f0I70Wd5gbPg1+rvCRtDZWVmZog== +"@oven/bun-windows-x64@1.2.5": + version "1.2.5" + resolved "https://registry.npmjs.org/@oven/bun-windows-x64/-/bun-windows-x64-1.2.5.tgz" + integrity sha512-oNDdPmzsCyvCATiYgkKWgxOeEx2F7m/i2MGUba+YJAeVXJsJg9iPJrLVBtETvKoSAgkXViwoUEw2U25jRYsp4g== -"@oven/bun-windows-x64-baseline@1.2.4": - version "1.2.4" - resolved "https://registry.npmjs.org/@oven/bun-windows-x64-baseline/-/bun-windows-x64-baseline-1.2.4.tgz" - integrity sha512-j/G4bnfsRAiCvpTADda40m29iSGvueIaF9Kc9hBu4jN8dTS9fEXdNNXuf8c30/z7/npxw2dhzsAn8jbc5QvD1A== +"@oven/bun-windows-x64-baseline@1.2.5": + version "1.2.5" + resolved "https://registry.npmjs.org/@oven/bun-windows-x64-baseline/-/bun-windows-x64-baseline-1.2.5.tgz" + integrity sha512-j5FxI8FeKfWI6rEXA+1O3ASBMTp5CFcZ7MR+/aCpiBKrDse32wLaZMVGnvqQqs4y0YHUvR8b7eXHHTboezjL1w== "@panva/hkdf@^1.2.1": version "1.2.1" @@ -2729,10 +2728,10 @@ dependencies: "@prisma/debug" "6.4.1" -"@prisma/instrumentation@^6.3.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-6.4.1.tgz" - integrity sha512-1SeN0IvMp5zm3RLJnEr+Zn67WDqUIPP1lF/PkLbi/X64vsnFyItcXNRBrYr0/sI2qLcH9iNzJUhyd3emdGizaQ== +"@prisma/instrumentation@^6.5.0": + version "6.5.0" + resolved "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-6.5.0.tgz" + integrity sha512-morJDtFRoAp5d/KENEm+K6Y3PQcn5bCvpJ5a9y3V3DNMrNy/ZSn2zulPGj+ld+Xj2UYVoaMJ8DpBX/o6iF6OiA== dependencies: "@opentelemetry/instrumentation" "^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0" @@ -4496,17 +4495,17 @@ resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.36.1.tgz" integrity sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA== -"@tanstack/query-core@5.67.1": - version "5.67.1" - resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.67.1.tgz" - integrity sha512-AkFmuukVejyqVIjEQoFhLb3q+xHl7JG8G9cANWTMe3s8iKzD9j1VBSYXgCjy6vm6xM8cUCR9zP2yqWxY9pTWOA== +"@tanstack/query-core@5.68.0": + version "5.68.0" + resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.68.0.tgz" + integrity sha512-r8rFYYo8/sY/LNaOqX84h12w7EQev4abFXDWy4UoDVUJzJ5d9Fbmb8ayTi7ScG+V0ap44SF3vNs/45mkzDGyGw== -"@tanstack/react-query@^5.66.0": - version "5.67.1" - resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.67.1.tgz" - integrity sha512-fH5u4JLwB6A+wLFdi8wWBWAYoJV5deYif2OveJ26ktAWjU499uvVFS1wPWnyEyq5LvZX1MZInvv9QRaIZANRaQ== +"@tanstack/react-query@^5.68.0": + version "5.68.0" + resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.68.0.tgz" + integrity sha512-mMOdGDKlwTP/WV72QqSNf4PAMeoBp/DqBHQ222wBfb51Looi8QUqnCnb9O98ZgvNISmy6fzxRGBJdZ+9IBvX2Q== dependencies: - "@tanstack/query-core" "5.67.1" + "@tanstack/query-core" "5.68.0" "@tanstack/react-table@^8.21.2": version "8.21.2" @@ -4520,7 +4519,7 @@ resolved "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.2.tgz" integrity sha512-uvXk/U4cBiFMxt+p9/G7yUWI/UbHYbyghLCjlpWZ3mLeIZiUBSKcUnw9UnKkdRz7Z/N4UBuFLWQdJCjUe7HjvA== -"@tiptap/core@^2.11.2", "@tiptap/core@^2.11.5", "@tiptap/core@^2.7.0": +"@tiptap/core@^2.0.3", "@tiptap/core@^2.11.2", "@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" integrity sha512-jb0KTdUJaJY53JaN7ooY3XAxHQNoMYti/H6ANo707PsLXVeEqJ9o8+eBup1JU5CuwzrgnDc2dECt2WIGX9f8Jw== @@ -5233,6 +5232,11 @@ dependencies: "@types/node" "*" +"@types/linkify-it@^3": + version "3.0.5" + resolved "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz" + integrity sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw== + "@types/linkify-it@^5": version "5.0.0" resolved "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz" @@ -5243,6 +5247,14 @@ resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz" integrity sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g== +"@types/markdown-it@^13.0.7": + version "13.0.9" + resolved "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.9.tgz" + integrity sha512-1XPwR0+MgXLWfTn9gCsZ55AHOKW1WN+P9vr0PaQh5aerR9LLQXUbjfEAFhjmEmyoYFWAyuN2Mqkn40MZ4ukjBw== + dependencies: + "@types/mdurl" "^1" + "@types/linkify-it" "^3" + "@types/markdown-it@^14.0.0": version "14.1.2" resolved "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz" @@ -5258,6 +5270,11 @@ dependencies: "@types/unist" "*" +"@types/mdurl@^1": + version "1.0.5" + resolved "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz" + integrity sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA== + "@types/mdurl@^2": version "2.0.0" resolved "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz" @@ -5287,6 +5304,13 @@ dependencies: undici-types "~6.20.0" +"@types/node@^22.13.10", "@types/node@^22.13.2": + version "22.13.10" + resolved "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz" + integrity sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw== + dependencies: + undici-types "~6.20.0" + "@types/node-fetch@^2.6.4": version "2.6.12" resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz" @@ -5434,7 +5458,7 @@ resolved "https://registry.npmjs.org/@uploadthing/mime-types/-/mime-types-0.3.4.tgz" integrity sha512-EB0o0a4y++UJFMLqS8LDVhSQgXUllG6t5fwl5cbmOM0Uay8YY5Nc/JjFwzJ8wccdIKz4oYwQW7EOSfUyaMPbfw== -"@uploadthing/react@^7.2.0": +"@uploadthing/react@^7.3.0": version "7.3.0" resolved "https://registry.npmjs.org/@uploadthing/react/-/react-7.3.0.tgz" integrity sha512-rSH9BpPy2/G7nZ3SEbZQANUFHkBCS5CwWiVzmOW9fzFNoqF+buqBvi5FDweffqMSwmr+/VS8Wpyj87/GYbV0Fw== @@ -5623,16 +5647,17 @@ ai@3.4.33, ai@^3.4.33: secure-json-parse "^2.7.0" zod-to-json-schema "^3.23.3" -ai@^4.1.54: - version "4.1.54" - resolved "https://registry.npmjs.org/ai/-/ai-4.1.54.tgz" - integrity sha512-VcUZhNEC9i1OpdhDaz1cF0IllgMqhwoUdqHQT1U3dKvS9KnOa9qvEtUUAilA+VHI/1LSZF4VzGhXPC7QMT9NMg== +ai@^4.1.61: + version "4.1.61" + resolved "https://registry.npmjs.org/ai/-/ai-4.1.61.tgz" + integrity sha512-Y9SAyGJEeW23F6C7PSHZXYNEvbH2cqJm0rVW2AoeFaXFT13ttx8rAqs8wz2w466C1UB329yl5PXayFcHqofSEA== dependencies: - "@ai-sdk/provider" "1.0.10" - "@ai-sdk/provider-utils" "2.1.11" - "@ai-sdk/react" "1.1.21" - "@ai-sdk/ui-utils" "1.1.17" + "@ai-sdk/provider" "1.0.11" + "@ai-sdk/provider-utils" "2.1.13" + "@ai-sdk/react" "1.1.23" + "@ai-sdk/ui-utils" "1.1.19" "@opentelemetry/api" "1.9.0" + eventsource-parser "^3.0.0" jsondiffpatch "0.6.0" ajv@^6.12.3: @@ -6099,22 +6124,22 @@ builtins@^1.0.3: resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz" integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== -bun@^1.2.2: - version "1.2.4" - resolved "https://registry.npmjs.org/bun/-/bun-1.2.4.tgz" - integrity sha512-ZY0EZ/UKqheaLeAtMsfJA6jWoWvV9HAtfFaOJSmS3LrNpFKs1Sg5fZLSsczN1h3a+Dtheo4O3p3ZYWrf40kRGw== +bun@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/bun/-/bun-1.2.5.tgz" + integrity sha512-fbQLt+DPiGUrPKdmsHRRT7cQAlfjdxPVFvLZrsUPmKiTdv+pU50ypdx9yRJluknSbyaZchFVV7Lx2KXikXKX2Q== optionalDependencies: - "@oven/bun-darwin-aarch64" "1.2.4" - "@oven/bun-darwin-x64" "1.2.4" - "@oven/bun-darwin-x64-baseline" "1.2.4" - "@oven/bun-linux-aarch64" "1.2.4" - "@oven/bun-linux-aarch64-musl" "1.2.4" - "@oven/bun-linux-x64" "1.2.4" - "@oven/bun-linux-x64-baseline" "1.2.4" - "@oven/bun-linux-x64-musl" "1.2.4" - "@oven/bun-linux-x64-musl-baseline" "1.2.4" - "@oven/bun-windows-x64" "1.2.4" - "@oven/bun-windows-x64-baseline" "1.2.4" + "@oven/bun-darwin-aarch64" "1.2.5" + "@oven/bun-darwin-x64" "1.2.5" + "@oven/bun-darwin-x64-baseline" "1.2.5" + "@oven/bun-linux-aarch64" "1.2.5" + "@oven/bun-linux-aarch64-musl" "1.2.5" + "@oven/bun-linux-x64" "1.2.5" + "@oven/bun-linux-x64-baseline" "1.2.5" + "@oven/bun-linux-x64-musl" "1.2.5" + "@oven/bun-linux-x64-musl-baseline" "1.2.5" + "@oven/bun-windows-x64" "1.2.5" + "@oven/bun-windows-x64-baseline" "1.2.5" bundle-name@^4.1.0: version "4.1.0" @@ -6399,32 +6424,29 @@ commander@11.1.0: resolved "workspace:apps/app" devDependencies: "@bubba/db" "workspace:*" - devDependencies: "@trigger.dev/build" "3.3.17" - "@types/node" "^22.13.2" + "@types/node" "^22.13.10" "@types/react" "19.0.10" "@types/react-dom" "19.0.4" "@types/uuid" "^10.0.0" - postcss "^8.5.2" + postcss "^8.5.3" tailwindcss "^3.4.17" - typescript "^5.7.3" + typescript "^5.8.2" dependencies: - "@ai-sdk/openai" "^1.1.12" - "@ai-sdk/provider" "^1.0.7" - "@ai-sdk/react" "^1.1.21" + "@ai-sdk/openai" "^1.2.5" + "@ai-sdk/provider" "^1.0.11" + "@ai-sdk/react" "^1.1.23" "@aws-sdk/client-s3" "^3.758.0" "@aws-sdk/s3-request-presigner" "^3.758.0" - "@browserbasehq/sdk" "^2.3.0" - dependencies: + "@browserbasehq/sdk" "^2.4.0" "@bubba/notifications" "workspace:*" - dependencies: "@date-fns/tz" "^1.2.0" "@hookform/resolvers" "^3.10.0" - "@nangohq/frontend" "^0.53.1" - "@novu/headless" "^2.6.5" - "@novu/react" "^2.6.5" - "@prisma/instrumentation" "^6.3.1" - "@tanstack/react-query" "^5.66.0" + "@nangohq/frontend" "^0.53.2" + "@novu/headless" "^2.6.6" + "@novu/react" "^2.6.6" + "@prisma/instrumentation" "^6.5.0" + "@tanstack/react-query" "^5.68.0" "@tanstack/react-table" "^8.21.2" "@tiptap/extension-table" "^2.11.5" "@tiptap/extension-table-cell" "^2.11.5" @@ -6436,48 +6458,48 @@ commander@11.1.0: "@trigger.dev/react-hooks" "3.3.17" "@trigger.dev/sdk" "3.3.17" "@types/d3" "^7.4.3" - "@uploadthing/react" "^7.2.0" + "@uploadthing/react" "^7.3.0" "@upstash/ratelimit" "^2.0.5" - ai "^4.1.54" + ai "^4.1.61" argon2 "^0.41.1" - bun "^1.2.2" + bun "^1.2.5" crypto "^1.0.1" d3 "^7.9.0" dub "^0.46.29" - framer-motion "^12.4.7" + framer-motion "^12.5.0" geist "^1.3.1" highlight.js "^11.11.1" ky "^1.7.5" - languine "^3.0.4" + languine "^3.1.2" marked "^15.0.7" - next "^15.2.0" + next "^15.2.2" next-auth "^5.0.0-beta.25" next-international "^1.3.1" - next-intl "^3.26.3" - next-safe-action "^7.10.3" - next-themes "^0.4.4" + next-intl "^3.26.5" + next-safe-action "^7.10.4" + next-themes "^0.4.6" novel "^1.0.2" - novu "^2.6.5" - nuqs "^2.3.2" - playwright-core "^1.50.1" - posthog-js "^1.217.2" - posthog-node "^4.5.2" - puppeteer-core "^24.2.0" + novu "^2.6.6" + nuqs "^2.4.1" + playwright-core "^1.51.0" + posthog-js "^1.231.0" + posthog-node "^4.10.1" + puppeteer-core "^24.4.0" react "^19.0.0" react-dom "^19.0.0" react-hook-form "^7.54.2" react-hotkeys-hook "^4.6.1" - react-intersection-observer "^9.15.1" - react-markdown "^9.0.3" - react-textarea-autosize "^8.5.7" + react-intersection-observer "^9.16.0" + react-markdown "^9.1.0" + react-textarea-autosize "^8.5.8" react-use-draggable-scroll "^0.4.7" remark-gfm "^4.0.1" remark-parse "^11.0.0" resend "^4.1.2" sonner "^1.7.4" - stripe "^17.6.0" + stripe "^17.7.0" + tiptap-markdown "^0.8.10" ts-pattern "^5.6.2" - uploadthing "^7.5.0" use-debounce "^10.0.4" use-long-press "^3.2.0" uuid "^11.1.0" @@ -8048,13 +8070,13 @@ framer-motion@^11.18.2: motion-utils "^11.18.1" tslib "^2.4.0" -framer-motion@^12.4.7: - version "12.4.10" - resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-12.4.10.tgz" - integrity sha512-3Msuyjcr1Pb5hjkn4EJcRe1HumaveP0Gbv4DBMKTPKcV/1GSMkQXj+Uqgneys+9DPcZM18Hac9qY9iUEF5LZtg== +framer-motion@^12.5.0: + version "12.5.0" + resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-12.5.0.tgz" + integrity sha512-buPlioFbH9/W7rDzYh1C09AuZHAk2D1xTA1BlounJ2Rb9aRg84OXexP0GLd+R83v0khURdMX7b5MKnGTaSg5iA== dependencies: - motion-dom "^12.4.10" - motion-utils "^12.4.10" + motion-dom "^12.5.0" + motion-utils "^12.5.0" tslib "^2.4.0" framework-utils@^1.1.0: @@ -9313,10 +9335,10 @@ kysely@^0.27.4: resolved "https://registry.npmjs.org/kysely/-/kysely-0.27.6.tgz" integrity sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ== -languine@^3.0.4: - version "3.0.8" - resolved "https://registry.npmjs.org/languine/-/languine-3.0.8.tgz" - integrity sha512-B2qF7C7sHtjbkSAs5gqoeUCojM9c6CQOWAzZLhTqjbjjxNPAbvRyIMyEF+Yrs7UJzOWHyzH/qflWdfRHVXPlLA== +languine@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/languine/-/languine-3.1.2.tgz" + integrity sha512-nh8qWsLXxBn3Ac4Z89PciUZhTsV7Lm+pQDgg1Yrki5iLLsoUlEfvXvRj5Pw7l1qM2YmUp38qR3MZypy3MqS6Dw== dependencies: "@clack/prompts" "^0.10.0" "@trigger.dev/sdk" "3.3.13" @@ -9601,7 +9623,7 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" -markdown-it@^14.0.0: +markdown-it@^14.0.0, markdown-it@^14.1.0: version "14.1.0" resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz" integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== @@ -9613,6 +9635,11 @@ markdown-it@^14.0.0: punycode.js "^2.3.1" uc.micro "^2.1.0" +markdown-it-task-lists@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz" + integrity sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA== + markdown-table@^3.0.0: version "3.0.4" resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz" @@ -10236,22 +10263,22 @@ motion-dom@^11.18.1: dependencies: motion-utils "^11.18.1" -motion-dom@^12.4.10: - version "12.4.10" - resolved "https://registry.npmjs.org/motion-dom/-/motion-dom-12.4.10.tgz" - integrity sha512-ISP5u6FTceoD6qKdLupIPU/LyXBrxGox+P2e3mBbm1+pLdlBbwv01YENJr7+1WZnW5ucVKzFScYsV1eXTCG4Xg== +motion-dom@^12.5.0: + version "12.5.0" + resolved "https://registry.npmjs.org/motion-dom/-/motion-dom-12.5.0.tgz" + integrity sha512-uH2PETDh7m+Hjd1UQQ56yHqwn83SAwNjimNPE/kC+Kds0t4Yh7+29rfo5wezVFpPOv57U4IuWved5d1x0kNhbQ== dependencies: - motion-utils "^12.4.10" + motion-utils "^12.5.0" motion-utils@^11.18.1: version "11.18.1" resolved "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz" integrity sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA== -motion-utils@^12.4.10: - version "12.4.10" - resolved "https://registry.npmjs.org/motion-utils/-/motion-utils-12.4.10.tgz" - integrity sha512-NPwZd94V013SwRf++jMrk2+HEBgPkeIE2RiOzhAuuQlqxMJPkKt/LXVh6Upl+iN8oarSGD2dlY5/bqgsYXDABA== +motion-utils@^12.5.0: + version "12.5.0" + resolved "https://registry.npmjs.org/motion-utils/-/motion-utils-12.5.0.tgz" + integrity sha512-+hFFzvimn0sBMP9iPxBa9OtRX35ZQ3py0UHnb8U29VD+d8lQ8zH3dTygJWqK7av2v6yhg7scj9iZuvTS0f4+SA== ms@2.0.0: version "2.0.0" @@ -10345,22 +10372,22 @@ next@15.0.4: postcss "8.4.31" styled-jsx "5.1.6" -next@*, "next@>= 14.0.0", next@>=12, next@>=13.2.0, next@>=14.2.0, "next@^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0", "next@^13.0.0 || ^14.0.0 || ^15.0.0", "next@^14.0.0-0 || ^15.0.0-0", next@^15.2.0: - version "15.2.1" - resolved "https://registry.npmjs.org/next/-/next-15.2.1.tgz" - integrity sha512-zxbsdQv3OqWXybK5tMkPCBKyhIz63RstJ+NvlfkaLMc/m5MwXgz2e92k+hSKcyBpyADhMk2C31RIiaDjUZae7g== +next@*, "next@>= 14.0.0", next@>=12, next@>=13.2.0, next@>=14.2.0, "next@^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0", "next@^13.0.0 || ^14.0.0 || ^15.0.0", "next@^14.0.0-0 || ^15.0.0-0", next@^15.2.0, next@^15.2.2: + version "15.2.2" + resolved "https://registry.npmjs.org/next/-/next-15.2.2.tgz" + integrity sha512-dgp8Kcx5XZRjMw2KNwBtUzhngRaURPioxoNIVl5BOyJbhi9CUgEtKDO7fx5wh8Z8vOVX1nYZ9meawJoRrlASYA== optionalDependencies: - "@next/swc-darwin-arm64" "15.2.1" - "@next/swc-darwin-x64" "15.2.1" - "@next/swc-linux-arm64-gnu" "15.2.1" - "@next/swc-linux-arm64-musl" "15.2.1" - "@next/swc-linux-x64-gnu" "15.2.1" - "@next/swc-linux-x64-musl" "15.2.1" - "@next/swc-win32-arm64-msvc" "15.2.1" - "@next/swc-win32-x64-msvc" "15.2.1" + "@next/swc-darwin-arm64" "15.2.2" + "@next/swc-darwin-x64" "15.2.2" + "@next/swc-linux-arm64-gnu" "15.2.2" + "@next/swc-linux-arm64-musl" "15.2.2" + "@next/swc-linux-x64-gnu" "15.2.2" + "@next/swc-linux-x64-musl" "15.2.2" + "@next/swc-win32-arm64-msvc" "15.2.2" + "@next/swc-win32-x64-msvc" "15.2.2" sharp "^0.33.5" dependencies: - "@next/env" "15.2.1" + "@next/env" "15.2.2" "@swc/counter" "0.1.3" "@swc/helpers" "0.5.15" busboy "1.6.0" @@ -10384,7 +10411,7 @@ next-international@^1.3.1: international-types "^0.8.1" server-only "^0.0.1" -next-intl@^3.26.3: +next-intl@^3.26.5: version "3.26.5" resolved "https://registry.npmjs.org/next-intl/-/next-intl-3.26.5.tgz" integrity sha512-EQlCIfY0jOhRldiFxwSXG+ImwkQtDEfQeSOEQp6ieAGSLWGlgjdb/Ck/O7wMfC430ZHGeUKVKax8KGusTPKCgg== @@ -10393,15 +10420,15 @@ next-intl@^3.26.3: negotiator "^1.0.0" use-intl "^3.26.5" -next-safe-action@^7.10.3: +next-safe-action@^7.10.4: version "7.10.4" resolved "https://registry.npmjs.org/next-safe-action/-/next-safe-action-7.10.4.tgz" integrity sha512-rZE89DTNgiTJ8oPQBOZm+jd0Uf/pLkN+GE3PndER6vWqHGYGN7HMLvhpggkbE8W4TGp+qM7CPyrXye1wCjZLVg== -next-themes@^0.4.4: - version "0.4.4" - resolved "https://registry.npmjs.org/next-themes/-/next-themes-0.4.4.tgz" - integrity sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ== +next-themes@^0.4.6: + version "0.4.6" + resolved "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz" + integrity sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA== next-turnstile@^1.0.2: version "1.0.2" @@ -10521,7 +10548,7 @@ novel@^1.0.2: tiptap-extension-global-drag-handle "^0.1.16" tunnel-rat "^0.1.2" -novu@^2.6.5: +novu@^2.6.6: version "2.6.6" resolved "https://registry.npmjs.org/novu/-/novu-2.6.6.tgz" integrity sha512-zD644K1kxxmYSnve8e3xNUVB/haCFHRmXhaYeAmxCnI4oSTos0EAgsvIijFIWrXdiE4a8lAi6hhFsZDOjBkX7g== @@ -10572,7 +10599,7 @@ number-is-nan@^1.0.0: resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== -nuqs@^2.3.2: +nuqs@^2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/nuqs/-/nuqs-2.4.1.tgz" integrity sha512-u6sngTspqDe3jWHtcmqHQg3dl35niizCZAsm5gy7PBlgG2rwl71Dp2QUv5hwBaWKI9qz0wqILZY86TsRxq66SQ== @@ -11001,10 +11028,10 @@ pkg-types@^1.1.3, pkg-types@^1.3.0: mlly "^1.7.4" pathe "^2.0.1" -playwright-core@^1.50.1: - version "1.50.1" - resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.50.1.tgz" - integrity sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ== +playwright-core@^1.51.0: + version "1.51.0" + resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.0.tgz" + integrity sha512-x47yPE3Zwhlil7wlNU/iktF7t2r/URR3VLbH6EknJd/04Qc/PSJ0EY3CMXipmglLG+zyRxW6HNo2EGbKLHPWMg== plist@^3.1.0: version "3.1.0" @@ -11137,7 +11164,7 @@ postgres-range@^1.1.1: resolved "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz" integrity sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w== -posthog-js@^1.215.3, posthog-js@^1.217.2: +posthog-js@^1.215.3: version "1.229.0" resolved "https://registry.npmjs.org/posthog-js/-/posthog-js-1.229.0.tgz" integrity sha512-ABiTuhGrX3eeIZEVmxqTSfsI5j1fcHfjL0V5dHAk0MhAvomCjcBZai/tQsMILvD+6sC2S9G4tkxo7uiX9oq9tg== @@ -11147,13 +11174,30 @@ posthog-js@^1.215.3, posthog-js@^1.217.2: preact "^10.19.3" web-vitals "^4.2.0" -posthog-node@^4.4.1, posthog-node@^4.5.2: +posthog-js@^1.217.2, posthog-js@^1.231.0: + version "1.231.0" + resolved "https://registry.npmjs.org/posthog-js/-/posthog-js-1.231.0.tgz" + integrity sha512-8v3zRytQBg3KyKUPLy/9S5fw7ATeiKz3n3pLFxl1fQsV/a2mIt/MAwkIREZXTzi7mamsvtfXhSdggG7UYK/Ojw== + dependencies: + core-js "^3.38.1" + fflate "^0.4.8" + preact "^10.19.3" + web-vitals "^4.2.4" + +posthog-node@^4.4.1: version "4.10.0" resolved "https://registry.npmjs.org/posthog-node/-/posthog-node-4.10.0.tgz" integrity sha512-usLi2OMp/G7JP3tDY+duphJb5lmfUJPNZ+yoxpEHEoSkNDjaxR4J+pTzwqQWgl4TnELeWCXmP7K17VmzxYFt4A== dependencies: axios "^1.7.4" +posthog-node@^4.10.1, posthog-node@^4.5.2: + version "4.10.1" + resolved "https://registry.npmjs.org/posthog-node/-/posthog-node-4.10.1.tgz" + integrity sha512-rEzVszfaOkUFTjEabDcRLJNRqMwTOeU1WpqKgQEDV3x82O4ODifkvkoCERaPxl/ossi1NtqKXBOZ+XnhQ19pNQ== + dependencies: + axios "^1.7.4" + preact@10.11.3, preact@>=10: version "10.11.3" resolved "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz" @@ -11347,7 +11391,7 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.2.2: prosemirror-state "^1.0.0" w3c-keyname "^2.2.0" -prosemirror-markdown@^1.13.1: +prosemirror-markdown@^1.11.1, prosemirror-markdown@^1.13.1: version "1.13.1" resolved "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.1.tgz" integrity sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw== @@ -11508,7 +11552,7 @@ punycode.js@^2.3.1: resolved "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz" integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== -puppeteer-core@^24.2.0: +puppeteer-core@^24.4.0: version "24.4.0" resolved "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.4.0.tgz" integrity sha512-eFw66gCnWo0X8Hyf9KxxJtms7a61NJVMiSaWfItsFPzFBsjsWdmcNlBdsA1WVwln6neoHhsG+uTVesKmTREn/g== @@ -11675,7 +11719,7 @@ react-icons@^5.3.0: resolved "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz" integrity sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw== -react-intersection-observer@^9.15.1: +react-intersection-observer@^9.16.0: version "9.16.0" resolved "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.16.0.tgz" integrity sha512-w9nJSEp+DrW9KmQmeWHQyfaP6b03v+TdXynaoA964Wxt7mdR3An11z4NNCQgL4gKSK7y1ver2Fq+JKH6CWEzUA== @@ -11695,7 +11739,7 @@ react-is@^19.0.0: resolved "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz" integrity sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g== -react-markdown@^9.0.3: +react-markdown@^9.0.3, react-markdown@^9.1.0: version "9.1.0" resolved "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz" integrity sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw== @@ -11807,10 +11851,10 @@ react-style-singleton@^2.2.1, react-style-singleton@^2.2.2, react-style-singleto get-nonce "^1.0.0" tslib "^2.0.0" -react-textarea-autosize@^8.5.7: - version "8.5.7" - resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.7.tgz" - integrity sha512-2MqJ3p0Jh69yt9ktFIaZmORHXw4c4bxSIhCeWiFwmJ9EYKgLmuNII3e9c9b2UO+ijl4StnpZdqpxNIhTdHvqtQ== +react-textarea-autosize@^8.5.8: + version "8.5.8" + resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.8.tgz" + integrity sha512-iUiIj70JefrTuSJ4LbVFiSqWiHHss5L63L717bqaWHMgkm9sz6eEvro4vZ3uQfGJbevzwT6rHOszHKA8RkhRMg== dependencies: "@babel/runtime" "^7.20.13" use-composed-ref "^1.3.0" @@ -12788,7 +12832,7 @@ strip-json-comments@~2.0.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -stripe@^17.6.0: +stripe@^17.7.0: version "17.7.0" resolved "https://registry.npmjs.org/stripe/-/stripe-17.7.0.tgz" integrity sha512-aT2BU9KkizY9SATf14WhhYVv2uOapBWX0OFWF4xvcj1mPaNotlSc2CsxpS4DS46ZueSppmCF5BX1sNYBtwBvfw== @@ -13087,6 +13131,16 @@ tiptap-extension-global-drag-handle@^0.1.16: resolved "https://registry.npmjs.org/tiptap-extension-global-drag-handle/-/tiptap-extension-global-drag-handle-0.1.18.tgz" integrity sha512-jwFuy1K8DP3a4bFy76Hpc63w1Sil0B7uZ3mvhQomVvUFCU787Lg2FowNhn7NFzeyok761qY2VG+PZ/FDthWUdg== +tiptap-markdown@^0.8.10: + version "0.8.10" + resolved "https://registry.npmjs.org/tiptap-markdown/-/tiptap-markdown-0.8.10.tgz" + integrity sha512-iDVkR2BjAqkTDtFX0h94yVvE2AihCXlF0Q7RIXSJPRSR5I0PA1TMuAg6FHFpmqTn4tPxJ0by0CK7PUMlnFLGEQ== + dependencies: + "@types/markdown-it" "^13.0.7" + markdown-it "^14.1.0" + markdown-it-task-lists "^2.1.1" + prosemirror-markdown "^1.11.1" + tldts@^6.1.32: version "6.1.83" resolved "https://registry.npmjs.org/tldts/-/tldts-6.1.83.tgz" @@ -13326,11 +13380,16 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@*, typescript@5.7.3, typescript@>=5, typescript@>=5.1.0, typescript@>=5.7.2, typescript@^5.0.0, typescript@^5.5.4, typescript@^5.6.3, typescript@^5.7.2, typescript@^5.7.3: +typescript@*, typescript@5.7.3, typescript@>=5, typescript@>=5.1.0, typescript@>=5.7.2, typescript@^5.0.0, typescript@^5.5.4, typescript@^5.7.2, typescript@^5.7.3: version "5.7.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz" integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== +typescript@^5.6.3, typescript@^5.7.3, typescript@^5.8.2: + version "5.8.2" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz" + integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ== + uc.micro@^2.0.0, uc.micro@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz" @@ -13452,7 +13511,7 @@ update-browserslist-db@^1.1.1: escalade "^3.2.0" picocolors "^1.1.1" -uploadthing@^7.2.0, uploadthing@^7.5.0: +uploadthing@^7.2.0: version "7.5.2" resolved "https://registry.npmjs.org/uploadthing/-/uploadthing-7.5.2.tgz" integrity sha512-hrvsVXgu6cYYJW97UuFLd3U2+TrPGyMBtPYSkqSTVq45Orkq9qFk095qkXYIW4EA/DyvCo78VV25HfSXT3EH7w== @@ -13659,6 +13718,7 @@ wcwidth@^1.0.1: resolved "workspace:apps/web" devDependencies: "@bubba/analytics" "workspace:*" + devDependencies: "@trigger.dev/build" "^3.3.15" "@types/node" "^22.13.2" "@types/react" "^19.0.8" @@ -13699,7 +13759,7 @@ web-streams-polyfill@^3.0.3: resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz" integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== -web-vitals@^4.2.0: +web-vitals@^4.2.0, web-vitals@^4.2.4: version "4.2.4" resolved "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz" integrity sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw== From a3413f5d153ec0d20bed87bc487e9a2b6cf5b316 Mon Sep 17 00:00:00 2001 From: Lewis Carhart Date: Sat, 15 Mar 2025 16:07:24 -0400 Subject: [PATCH 2/2] Refactor integrations by removing GitHub and Gusto configurations; update middleware import for NextRequest type. --- apps/app/src/middleware.ts | 2 +- .../integrations/src/github/assets/image.png | Bin 31120 -> 0 bytes .../integrations/src/github/assets/logo.tsx | 18 ------------ packages/integrations/src/github/config.ts | 26 ------------------ .../integrations/src/gusto/assets/image.png | Bin 20523 -> 0 bytes .../integrations/src/gusto/assets/logo.tsx | 18 ------------ packages/integrations/src/gusto/config.ts | 17 ------------ packages/integrations/src/index.ts | 4 +-- 8 files changed, 2 insertions(+), 83 deletions(-) delete mode 100644 packages/integrations/src/github/assets/image.png delete mode 100644 packages/integrations/src/github/assets/logo.tsx delete mode 100644 packages/integrations/src/github/config.ts delete mode 100644 packages/integrations/src/gusto/assets/image.png delete mode 100644 packages/integrations/src/gusto/assets/logo.tsx delete mode 100644 packages/integrations/src/gusto/config.ts diff --git a/apps/app/src/middleware.ts b/apps/app/src/middleware.ts index f1d96ad4ab..2459c3854c 100644 --- a/apps/app/src/middleware.ts +++ b/apps/app/src/middleware.ts @@ -1,5 +1,5 @@ import { createI18nMiddleware } from "next-international/middleware"; -import { type NextRequest, NextResponse } from "next/server"; +import type { NextRequest } from "next/server"; const I18nMiddleware = createI18nMiddleware({ locales: ["en", "es", "fr", "no", "pt"], diff --git a/packages/integrations/src/github/assets/image.png b/packages/integrations/src/github/assets/image.png deleted file mode 100644 index c61ab9d0582e487852d3afdbf22987208123591e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31120 zcmeFYWmuHm_clC)U=ZGbqO>3&Al*ZQ(j|?QbTh=zF(|hpA|)}>AOa#KodXz%bO}R; z0}MF8&>hdl-+lky|A+tae0z`M{qPPSCfL`$)?Rz<73aCGC|zw8@~d=LArJ_;n(6~R z2!v=E0wGAdOagw%7sEQqx!8A6;60V zb&iE<<7nAgT9M z?h?v3L7o^s)w@sF_63qtBG1Z4+*U>qZdxm(LKu#^1o4YCiKmo*0tru5yx#+1ksyR9 zF;Vvtv1k(I2n@B(6)==`@f=6>Dz^~J41(VCX)y2F(P z)(m7i8?`EyNVAU&0--w`{Cp-M7mr<9m|t?hy5V=)-<`Q`z*uGPY|frFza}JxT-WZ$ zPgpH3juLrx5Pb4&buBW3Oc+6&W)CfdC$Ho@zB&+e7#%2aBF~hStNTNmk>TpKYisN_ zxhMflwCuU?JZvsHY!CeRY%*vA;*}?i|r;>6!h4~vYmB2N1VoT z4gM0TFu#A})uu^Qy)LU(M__|q!h<`V$-k&p5JH>GDW_Kw{mCIEFLc_pYe{Rm-P*#| z2?(PpOosd*@?qP&uj#HOK(0HA2nFs#Ac?Jqaq>I_kY40_3y6z54x^5j<5ms`y*t`IByxJ+$*2m10ao7gedzRR?!vBa#_sv>W~ z-?OZ|q zxM{m+B5D*TYRhOM?stQ}Ez25z`7U8}IQ8mf%fGLGaeEdYuVSKUqV$1%m93hp@v`xi zh`$BDaIz+T(5Yq*qB{H*U<0j)H&HI(Sii$`CyU*ZlY-hRQS~lG=bHuXt9RJrh19O8 zxvEa8^1j!9FFSPIIYW~J7w_IVvv9dGyo3drP!~@buk+@(^Xoz#4Yd8`FU>3O?&`fy zqEZ*Nms=#x&lXZl&H4DKw?FLz9h?!;-Nd4Get@Qd@Z8dfSk5j4>*Ef6ssTtJ|qD;hR(5pjsYhJ;!>aBStiUR@R{e#$Zz-GGjmGDs64!EHwH4+xzx~ z7OvhT*EEO5!RldnPtTA0Qzc_1ovX2uBN?t))-B`BlP59H^B-okt4E7Pcce_Dgmhm@ z(Ms7bd21wV6lk<-gf3AVHOJk@xsMvV>Czjglcht`yK6s`rk8&6OLw28`9%}QHN>^6 z?=c~`da`)nAkA2U5ub;7pfr@cd3N97m4fpNwbMtJ*y`LBPTJ){x>x!`> zy<@IV=C&wpfku2c719q$tM6X;s?Z}ls5^O)ZoP4+W_UL*y(xXFblm;tbdOAXXz{TY zUpjrK#a9`;!p_FN$uF-SOlDzv;g{`rEWf3nrK#mHib_UnHILN(XiAo(vz%XsiW@GxP#XDz^$8`+LxXXd?r{V zKs}{E&4-S;VH-aX@fVqE@$3& zOn)TM!=cGE`d93W{>!u1!(au6nkzlEmtW4QxV@}rcD|iTdl*W?#Vz!a@Aso>eYh8V z|Ndyng6Xj%Dt0rj=yikCq)V;0pJR!Oo1UBPYI=Qm{m1&J0g(p}H<46u>bqCgq87f5 zeUpj8_z+^<(u6Y>(hO4Iwq=V`?;2>AR{FZL{H0ArP2)o(p1-9+R?00#uqf*C-_ltu z^w46Y-ugTJxz59ucQNlCRn*n1OTSslG)mr+n3f7vI&ylUqwM=#_==7mPhi6BHw|pt zT1F2>XG;3Vy~cSZlQNPr^7P1^Q>uB;0(JN5bR2ki63G_=m)yJP6C=C!7uXJcwkL16 zJ=Yw}tJW*irMRid|A8mK?3P(Ty(&ue@lWAdhqK>@Y}cOM3_-_9jfCt5x=&2ZsMmF^;Z$+& zaULc6rmf}bC>Mp1ffpO(rSzLIi}Y6R>ND`%AeY_P-s;}2ULsLz(KWN4+LFnwT(P{p zpiG2Cx6x^7ab3$e$HZvsw14n6MFiswsTq9IYI6-wfUzs;Vd$>M(E79KI652p#@3~< z>3S7^o%XD_;QV0Hy@z<53moP)Ro>cKdBt5%EQU!H>baO64x30{OY^Vse9TSpMPczX z=WIbpFh+Mdx9{uJ*WTGwMBVOXoN6G?5VX~|gg4JUMT2=G0_CXGpCv~NU)QX&+V9++ z!Nyr^G<)u_?%PbV*J+f>l*y=sd7jRzmYczF_WRvy#?oc*9W9*HAbuEe zS!4&I@ZVSI>pVE78S2>^cMtsb)@c2&u4_(N1jPlEpR`Pz{w6)5{EetStFUi#pF4Qc z_N4!-DJ7obN@Uhq()n=Y{E$kI$_Se>TTEOgGc!Fo9cs(2FLA!GvXHvJE6nIT5a&~j zojv_^tkG|BGPZH;FuK3BEU;+X8(&;h4((v;U~cXUl-VpeDeapK#n%2Xyvju_0$C{QG}zABRh_{{^zj+wg}baDA8q+~3;U9-?3ev$1DUbGLT1 z*R!{_3-s!=mj+4bGiL)6xQUh~)E4H>XMHh-FTmXsTn&Lp%LRB^+q&ArS#0bbojqh& z@lCC)EY5Z^tj3~R0$QF*_D;^KLEiTILD~kkL9VuvcC2!;EYbl`FoC;0+?pl8-Oa-X z8X&{^XI?1yeDO0sE6blDa90`D{|IHGrOToO^R{OZ|W5trl>6qS?^61mSJ zBp@ipFCfV;D8efs2o;co3J9|N^I`>e^R{z<>OD~Y=U(8O4673y?g{1R_xJbb^B3lW zc{}n8N=i!d3kdNG3Gspvygq>*aO(hG4+EsyBiF?y{b$V&?7f}+?Cq4jVeTw{vDc~T^3$$v@Yi(<5$15o)Xlo-TCL$nWC&bDRMC89Pod01+|NaE5^Wx)wj|KSh z--BiE0Zx-QI5whxDZYh3Tn*J8C>R7xtWKM`rK3|fj@e(4;^g&c*oP&Pqe|{oC~}rf zbC(u+8HmPC_Jvd(uN_tsOp_71k+D4an|!uu!(0;^6p~92LcJQzNEA#oOX6Vb0Nu4V zM{7+R#84IbVbUHk2>OK#B(VDaQurCh^7*w&~bv=jZ&pRRf&)YwPAOz4qU;h~t z4q^PCgZ`cIpF#i3`0t>9X8d>1|9{*67nKb8|J1fo%sbFdrDzvwu_l-VPQSkT{8{Is zH&6LKH5rLkaPV56*>ndJbgBA;R=M z5Mt?~!^6WIiJepXt;c=-Ew*7t!`W%mP5$NP#(K4C&TocT^DWio)iY0p$!F;E-73m= z_fW<6b^Ryj!b%f7xIXkv>;^Ri0NKJxt6kB2!U6(MY$|R^ML!I6SsZymsMy%vMB9X|)o#CH?SoZU6Llri@END`^Rr4cFYaJ_d;jtP zwo4XCxFdPo$inVCt234(<4$zuHXae)eA?u_cb?ebh50_@AbX*d@JKJ*DDN;D-4V+o z-`dgV*`%efKU^>!)=PYjkvq#9uX2nF`^h-SVPBl|A<2kK$AyK7j6`X&4puH)*Hl|x z6Ww$yn9-k)D15?vd8#-%m}}c|rahFM1?iqH1z*+;a&T}MBEeIOIkno)S|tmKNlRx8 zWf4zoUu;NQ#Ne2Qt-$r1+2mOEQ8MqE;-Vr!Mn=XUh2>3tU$xnxk&%&uI>d3EZ-VNB zrV=@8qMgx7$SD`sXZ6|UNSSh9H&m!yLI zhrF+*IH-ue$)R0i+9?BsspT4RSoby{)+V zKt`&8@$n*9m6-f_$$k0r=F-x&ZD6f*badR=NggRZe>^GSj#j~a{W50X`-gS!o3E3R z_`guR!>ChM_1QV4UL-I*4z*Xad~j^k#6OuIqTlsw6_a{)b{5sr(xRg&*d%+OUEAT0 z3nmCk=IMUxI*Ohh8M(2(w&wo&0c(FJc1=tkAO8+_>yy|R+tlt7pAw`?Xq7I*)z2cB z$K1o!_4qDR9B#~)v0pY(lf$v|0};IuY*ZaJK47rwV(_@ZW;{i`*s+?%ZIDSavB<#1 z+RpCVf_HJ!##&XM-{j7D=#&mfF(2BzQ5n~Lz4Ng~Q46>}N4&K~NU zZ)qYGhwqn1qIOMI{tkx5S}-T|bO|<$&(6wCpwa%?vXs%$c0Zqz7mL@aqQ*IPmx>Dx zSoD!G_e&3Soe8qKNdg)dFr<2Y=JlTQRctD;Z#9s7?jJD)pASDrkoNXvN|`NST=iPq z@i5uoRc>B+{!*uRPY->$T8C}#b@12Rj${6~9#oQm8)QRcw)cXjoXbDc=?7Bws8e?D z1Zk>DmXixQN5-g0xjoIhLI{^OC-;%EExV!hskpc}zphT4ChCFZn|^+cKno(@uk~9o zMvl?iErqGONGU0)LQOBD6R{g{9p&WYt zQmZ>f`h{hKXM_Y$CUvkE^mo$)@mHQJKIU@yJ_RFE{GM#gu|_h=p05-;-U4hdz{+a& z%Hav_8ZF=JghvFU$lkWbmVFeyrc?9-rLceMq{S4E?`2(QiI_9((CfvNI~@6fl6J4U z6+GxFdt)lspf8-t$w?l&r++uhB~Vy7SP3-^u3lNlW$qSx-BtTuYxDE9xt}<}`&jR~ z=F?m*3T&}|TmL9-lYSy2CAjTP^;f>{HWjYbt@7cqq{V9M8OhVeDT0WHviOuC+gH=C zT*l2}>-VY^#((byW#d;@@AqC4n4Oq7nzZeR?d>9GwYr3LE+xM=WskLAiE8vy8gc*G zW5t)MN%#F1#w!6=Qd?M9Xi2#1xL{jIo{^DLZBkO!ys5{L*kE#x=B$345I(*XG`@#j zjd=B;p~Hp##s?9rDD8VkC2mT(wf0XTj1;Xv+kCEOJCpXlNz_i|=_JmPYe{}4Reg+i z*Z2wH*K=&wjC#9fT!fc`-JgHJbemo7W7KGpav{N|^}e(aYgfz32+R82tJ6g08W#%< z4ol%^98z9sCcj_sA~F(rD>|;@VOhoFhEY1VC)jUu_pEMyLc4uY`Y^d#Gl~BenJVdX zOi&QbLq&lVstf*ftI#seTPG)2>heIvccYiRsx600>Aolws?_h)ySIK_ynQ{?dhZQp ze8+4CG`dX(WNLC{YH}buOE8ZTT}zD0M6*$Q84^A)=Mby|`G5w2g7c_f zN9MD=y5P$LkI1zQF{{K0mT`OyoXe;`$0(#mPr0(Nkdx}_^Drl(ZAYz&XxnfZ15uGD znWF7ia;|Di^1By=q;u^pI8l;BNG(W@^iLFjb=4@kW1)Z3d|B+bo%Te#49|J?IIz-A z;34a|_%sSJF6R;;D&47y^}XuZeXTWn4ZBZ7=`Xu|OhCBv+d()fOMEt@s-~`PKT7rP zJKG*n`Pq(&;t9xUK|i)>#k)a>LW2LRx24!56C-~LAzYuK|F|uYI;E8UJe7AMFQ*E4 zbxeS?tf+{{`_w(t?;j(SZ^x*|GV3N_g(3gBK_k4qMfcuLLCCI!PjJCw1LoelR+Pkq z#xhL(HqWz>3X=R*iQ8MjVgl&(wKPGr$10^1QLV#ljpIx0lcW>`1_PFp3zn0(b%>dt zw^mZVaQMW_CdS31qLjYAzB1^^$tGc{sAanH#xlEjlmTjJ1jnYi_h?Tpj7oPL(;otP7%7OWy}GvH)2ikkCg=X;R(gQOkz z&P}tN327p5>!cXS|FIb_&_4d@QTts99ZCv{z6_b*(bunE8~h3^QrPxiXg<-9-OWIxNG#pa}8p)JN>?Xw>=jt&SnxptbSe%HWG-0rBq zpI^|I`Hg)w}u5Mk(E?Q4S=};utQGcKUD?aV9&nrpm zeIvk9tTQlBzU3$?iBU{Ee`YjEH%#@h zm^BwpM6l(jqpG-^M?-$npwF^qfvEe(7Sq$yW(y1>Wed=yW)*dfOY7nmBTwScxJ=+D zo7erCbed21CMWu3`nfIv2?^mPYNkug?GAnCkx8^;!s#gvy)d-~F8i-&x$L)ZH?#qQ zlK;7!%b|}aG*GVh{r(SF)|=Tgv%u_yB*H&?v0m)vR^HL~s+1abTCTTO;V)Jr$(4N^ z(&B~ePM%%f_L*%7<&BAnfigeK%H~h&y5%1x*GLguce0dvdc1EX7reLH^W(=4A=^Pv zp#py&%uPQ@fBCs$<7>K9pL=V+WN%z1-lDq858F9x@W;=jIEj3;?f0j5?1{{wyq*<5 zd$QHmCJ*0VpJry3^uF6+a#6}&&%tD!gdyAkm{gyarxcNW-cHkz0kiIRdwhwj0S*ln zPEgg%l=Alo3<(Kg>({Bv$d2(2Yhh(>wdeMkI-FjHuJ~>p`+u{kKv|aWSJlmi9lzq* z(*!ev#BkG|nwol7UtfPVr4G6-&C%X%IsUVnaxaM(TSr1l>f_j-CEBPtMw0bsPN)7} zWzzM2C|8p`JzsaNCe=mB-R5k*`fS%&Ump`R|D2X?4?laZZflFN>N19@2F9MYuB`m+ zi3Zh!N*uFXOO8dQxXn~`tjuhMZDhi>@I5THcq@5t!^v;%%q{*MddzY>#b}yiS`0|n z#`PmdjzmjKE9>dgr;d$HO|A4X%DxV(H=p_3k_v8`Tw_A|*nJ(9&m>JyT~H|)3w`T_)ooll{LsC4)Pvo2 zA3MT=gr#vITZ3@7v_QhyI#FrAPm%6Qa7buk z6)v;s?!h?I)#pJA#mM}FG2u@_1@&i#5+S>GAQ4io#hgPars{D18tCp^0_xleodb^v1Ti&CQPSsS7vXZ4UM{k>jrDSo+G6` z9)#`9)m`q`O7?Sy+4MiT!RRl`M=<$}81|g}gpuyP^80EdwalDiwq>Ho(t>A3>i0&j z0T+CK*JuEmtNU4@kpv5MW8qp{dVYn40d-07)E$HD)ivtmJj=5!51~Jw)A|fI+#`1h> zlqjawKq*sqBI||vM3y-pIzv6*5?LpgR5?u}ysW+aOSY7t@njEENq)|bZ=It8oeeDV zMf{?CE6Q?G<)27sg7t-8#O>S+lQ;*Did5v5<~1eXgY+0QZE7SuN^@%UUX09a z9W1-GqGHo*%P@{ho2)~km$c4~$T+k&ebORH1NQ)l+{!6-Ff`>0#y>W6F-A3t&zam9 zTG>hBtMFT&YFH&HM_8V7})SXukXHdcPd4tP!i^Y6j z$F|E|`)JT+Syd0K8lb6v<&n%3=8DW*(#+|BP1;m^a{ce3^M3fy#MgR>zrR(s=9?DAG(byb-Cs{{0_*(+a@ zUOW-F6>nSL&a;ZZ*B~5MMjU5hf|PY`GhGXwiHV8X%yMBNWrU-0R=JotU+Ly%lnb}x zP-A2+7EP;HHtur)dV+2DYcTIiSI@8QoTSZvFvjMe|GA+c3Z||$#$rzNc@tDuQF$tH z4v{ZjR4)1XNy9w+-T6@|jn&A;I%H!bvat}Ef_SV!yPsD1#L~*Osj;y+l7eyT0qb8D zH+8ChTXSjcy(P()zLRg-HB1?pA?n$@;@8xXo|eYVQH9$K5PB*<_o5kP{V`ADpz9Wb z3thbM6m0fI1TnmM^X7@3U-x9FUY1>4iCxQZ!B|beo%G(=nAfjE1cil#Z6aE?AfYY+ z0b|YEeNxJVyX2>Xn*mdBIQ*?l@ZK%@Z%ESRqmPueS=S2n<3Lb>f*^e83{4i1J^h6}N@w6x_9^9H?IXIt$uP)jvg5!nYJ zE&UdJw735gJ7FZ9c9j6z!o6{st^PdjP)KmVoZrm9=yRpHoJl4K?&0L5O0>Vlw|>p< zyfo>mM63gV;Y388@3*|E(V2)OhentcMK=|KI(dB{SE&VL+!h!my?1(9Lha+nySst< zJ@vEEB+a%!KaCw2(~_i!0?b?-gQSh@!CXWt2wdqECiiWbr6ok=(UHt(Zl{zGpf(Ua zP^x*Y1)#3+11ZJq<;bsT3b4t)n{uBJjoXQ(qu3Q@dQ($V<;EbV`*b;!l$5mGca+Wy zQ;^8s#cpJGD|hLYFqM>G!-DCt9P?o9=A81+Pd+L2MHgP6B|mWW{=FZ&J-W^m_J&FE zEyo@` z-|RsZ;>?BkM0o?6FR?bC*azE4A0HpL%9alF{@s<#V_@{pnFHBT49Jf7(`{ZN zzW1!&4beL6gpY|!OHb#ot*-9*lQ@M#P_NV=dDD}FDX3+`=u_62Gq0TdsA5 z3a9s;x!Bn)R0m-*{f9=f1QEK$LaWiW65kIF0u(6L-Z5b1Is?x%%F)FbobUZ06j9%! zweig?MvPptcA?~*KMAO1uZV_3_T>C$>u zR#woJpT3f%j_(7C1AMTWUgOo#<8FJi>~n|h;COaq3h+p^WDU8ki^FCz)|QtKbo+Kc zW#DEvf>6_29lZthVnO+)s)fS{)w@)3az0Bvrjl|Ul5&4!Z;>Q?dt|_!uko=a{nt0E z5p|?)6Zc|$l0MZ&2povL0OTf1-TrM%r@W-b0=WSY8u9%3rPd@^msw_klDD)k?^pH_}frhlE^pwMSPSh^o;3%`M0 zI_v~Ci;xQ3T8Jl>mW(}Hs=3c+)zT~=Cgzu$muFi6fFb3w2ua{ghiN$Dw%ywLhddad zL{pw(>8EuG2?%6a@a-L2u5-S{shypjd=P^8{wwoeQo+Fy#J`~m z=B~+?u)nWyIl3!v)!E&B)EBFkO;1mMY?jrnH3`ZjJo2v9C{EuSZoad;nVYHzfOUUL=aVH?N(RU1Oton z(>NlBYx?9m9jean5FDls7wW_%Bz!}SX&w!Yjg6JY#>Sd~;!f=c+86{W1Hb`Ml%tPd zqhwDC>hGGNOphgeEri?^UiEz|n-*VMXl6ieZ*}$b^puOpGcz$U&7TneM|PwpN8Q49 zAi1nagr)Jr^a6`WQJ=GHl{ltMhfJT6%^(v~PE=8mTGb@p-`6)ZY>ELsTHM1sxMXt?vxnDSP_wh$k7@nB$JfcH>Z>pKIu4e@fi$@uD8%)Dp4 zQp=HYGVwCB%wH^1o05|%irTR+AGd>0{+eZPdmWI<%F2}>h|~GvI{gj1cJ;z#rKLj>x2gWz$>fn(@G&T3=>*%? zn`#U{IdALnX?V(tNJs=&5WVey3eRACi3s=vb3%&z7IB?_t;IBmPS(m##Ed zftB}CkdxalR`IR)tI+xjE&bV+j_jJ++EHLo0e5xLb0Mxb*7(=@a?sdQoX*K^9%a&Gx#cu$gApH#edmBGsEN(R72n(54}Aq z)e*$g{plhivdEuLz!}yO3xb4}xwxQ$QyX)0PmWf{t4jR;Fw?}#$wdWA{fV0CnjHF8 z_h{f8F1ILhl=AMIW%-TMU{40$6$_P; z(f&LPtL|XEJW#x)SX7FVQESTBmT0_`d~|q+4$(G9 zGluRq(uFU3PVkB?eK2J#7@ITK_?}`){?m78`fDVm@CqM6kniKikA=3kw-I6QKox*u zXQ05{g0KBr_t_{|2^#TPfgkBaJ+N7rYVh%SEknA&0t%r$ZW|Q{#FMsI=vUgM@~X{< zmY~((I`TG|MlyF844(pQ)9Kuem!Q$1&o}U~MT(!c6~I@Qer+Boj#t*?qaV`$zzNl+ z+6kqy4{L|7OEj2!EUqM4njp^i5wMo?Q+)8dL8oZ1vm^hC zCkR+a7U#-DY)yUl*oRjONfpMR*OeuMZjLYV>--`SDaHLvIYbtQ43ZQ2^XL0csm#1C z{`@kK7UtH~p=qNYd=b0FPdT7eOt_P#vK!oNS-t|0{Lr2Why~HEtC&3V2m}QnOP_`~ zZD8)s8!b=H(@lkN#LG7jpBv2i*1Aj+wF`Y`Md%$t+CIp~mp$g&j|C9;&EhO#ITL4!6aoZpg~-xeb-q61f+0Qi zSt|q7=k)fyi0!70F+^)p1v)&`Qe8RB>|<*yqOrUj_KjqXSv9KrbeCk`m~iJ6HXtjKg!8F0l_|pu(FJWP;su zNy^U5qH4$YSl03!wY>5RlOY!BO-b^X%#CHu=(^8y?hl83C0Rb2luJ0q**CPts!6F= ztrY>QWzEwLw~T7uBSD|MrOU+`p;bFoJ;QuFJw4MZu=ULDQ;gC91FKUF`plZAz5=&a z0Sl#-97g^FW)9%l>{T32ikmk_ z-&H2U_9f`f5Lq-TvD?gx66ex4qfZ~l!t`SKc{MH+Ayz*dU)f<<=rMWoLv>1R_n9nt zk8j2*?0qxmu74%fZ@lO#tb7$;TG`sl#@yb*>X$Ym}YUS)9S*hA6MyU$Qgv=sMlicUH+v z>}MvYq(s0EHs%R$`x5S`=aDaSx_Noi`iF9#wl6F!WXCeg$x1?@T?y?nz;g$I7hV4R zAXvP5*M8;qDo;*=!ojb zT*{NO$u8!9%xtm>WI?|{{x2(?Zuc5W5R|_$M&dglAr(WqpmhZ%Jl=`+OLyh0MuKf$@mTgx<97T>#9 zu>9+F@RJGDM!I*1Tmq(8cnDMsbvS&yIemH8WN0m)xB79}%nZy=<50eK{*_y_wp)7f z#_2R`t0D7?W(N;S&JT8?d$RBM3(*U8aou7kT{ImWdAD*L0bDwC;=3vE1X;-Bu3xEh_ z0EtUd@T?c=-uvk&bQ=}uKbAA(T-`l7TuE*{p3)gfK45JBLuP5_w)eF0Uy~c-F7zGw z{R(|0D$2pa?numWGs7&2AE~Fx>2wbIMf0>Z?oQ#reMCele_kay!FbA{I_1EkILSiY z?|O_og_PmWRDfF8@x$>K`wiafPWyESe_+|SvZ@HvE*?Eg@piYsQ;spx{LaP4C`B9PhZ3vOc*+bVdos z;9z`KDm%F)UGad+-q3p?O?UNq?F1=N%LqZU*BNnQa!@SyW74+FF0^tVJ(itzt9E_w zw&RWfx9@HLv>}N@I=)n?<?Byy@_4;?YAHYD9 zBjqcHzV*Viw7_&bbdMpV*X=}eHMz|eljCk#?r-Mk=$KgcfI6;&AB3b8fvVe?x^WdN zpz7B~roT;1HI?LA3{CVpyT3kB8p?Y8@`4N#r7`8`(A+(K?U@&(98Vj9pFGL2@6VEf zk|2k_s-LHS!e2+JwUJ( zl$Yb>7PgPSe*LQPT8mTO%HOQcLsafCN;}LYWUHn9Gr4D|VwzUrusBuJx1S9@*p!Zr z4#~E;@1eB$yAiVim>73}o=k&I9Q4s>g(JTgbby7V?KJY#e773KY%M<3RCIUo3P{o) zI64-_>RY8sy#wZ;D9w~D?fct60qHgRfb;SIv!wg`^PNIDi*bI?L*&0jU0srNP#t5XbBwV z=;&_nC5lJa8(xpO(U(n@OnSVM`Tm21unm(-y%MUg9*xF{W@ct~d(<7D0`kV}xPiX{ z5Yp)51)nWqx-^CCq-ze9MMYfQ^Tg{~O?LTuT$v(;qn1+PY|nhS0xRM{n~d1xcbr&v zEiwheDo+~Tq0!WM{(L67pr9aygM%ZC4UZk?1>3GbztWiTO#9~iLg&1Z&@vwqcP+cW z?uYfIb?QZ$tKT_TEWW2!ZQ1w?1snKCFvK!Scs@Bl+{Tu}3Swq!T#X;pS_C&QcU`sA zCWQo)h*%Ca1knLdqw07cZzTar`$IrFw>CFxn!SRYCg3Ssxf}*u8Jii?9=)x6ew#kL z#`+h7L=@lVKERny=iA!a#D`a^9r(n$h2Y&`t*zR%7MwmKxm-PsWRSS*8J}7;ixb8M z%IR0_Hp7vW%uK0SSpe(-8_FJfwOph4`Rl6eAGqgU`d#GuJq1LNkNC6cyH8ybMP6Ax z@rOXfSJa16@t^Qlb$p88>P9EiXk=9B47& z;)HRwcU_oLD@9@duQJo^Kr?Q!h^+2K!Xks;>05hRT;=M4LsRR&Jiri|9OPcd`=mJg z*;B>6`SOKRU%!jz9=PKR%uPfN0j6?qX@lKQuic6aY`we1Iwd8y;DIoZs zrD{6FHJ>IVAtlyES0%aJEAbBY%$9#Tk>#InX&m|iE_D~E6XCtLI_~xTT{(GoNoXKq znTo(Na-DwdYU#8JoN-6JPtld~5~Kf&3qp8Q+i^5{%!lS;KORgNxyLBy^;43OiB$1H z368$5#<>8R%#m9n!s8XCLYn4gCmqx4$#p5prVDGj!C>sZd3@?#VY0fozP@f0sB;W9 z@af1HwfTmfDtGhcp3A;QZ=X8ESmKGFyGXvxohU8E!#}AbxU7Fk*O-@Q#4G!gf%g@=j z!(`;D;k@`Eh`xE$@bJtfehYM3TzJtre*nq|0z#yxzdt>neW?!EDgskJI!^$#9UyqN z<02!*XC|Qy36BxuTuezS)+@+=t(KbnCP@hPs+$S<#xXD$?>#AR7_n)jzq*IAP&erE zF>GnwvHnIq=(Mx)^eMrt20zN~Y@Ye-v!;$tx;bCR_=E5;D{cHQZ4$ zGoQBJr(4SHXr-+v55kLY$Zn_C%4egJ+iHQmcy~#*TJ+v_lm*r!3C)&A0pF`{B znI&9@^eL;$f2dwXKG6CX8A&z_2Af^l4Px6nF5sSwOCv7bKR(szu&GE<%$;*_a=I4} zRAuEFk6W1Sy9J*k2#{u?zD%r+(rI2zcttTFTsx=)n*0OI%QS8$cw2U1!H#A#$^?l> ziin7~;x(cj)-0x~_FA(Ogq(@?H1vKqHa4bFFhZ+A&&z6Zf4SO<&`7Gp026WP3Veb` zA?W*}H?J^BCImIX%qI{nwE_9w(a{TlX)QppjLgiO<)U#T_VRRE702V=<2AdV&<@T$ zsnktQ{F5(~i^2jKT3ZWNXGh07nS{p zV%;KWV52s*v}|Gje8^hJNDx#*y8K#!lqq~Fq&I<0rKdfbwj7Ws%UF=+WPA9l2Y#1M zi?qmZt1Y{~;jb5Od9|ITv&Dp zvn*gNN^^7X^ulp(y+b9MK~@lxqM~))_xZB|`A^IcQ)>L)ONUV_cKC{tstD>rR99J`K>*1^Q5hH&`wb1R1Ta0)1Ztt5kAUI zEdAE)+YLg(!rNwlv?v$!L-UXb=tT_4ZzX1HYby){OxXM3xV8Jfn*Qogm`M_vR;wbo zet7aQ?ZZ8-S4e^O&11lk{+^q%y`})&fV}Cn^8i))JAkETXIKfv)khzfSu{<6sOz@-|}MbhdPJF1l!T3&QRC^rL!E(`_r6MNAjUiidp;w$<@hU^CEWvW1GK7 zKlQ@?WjJYcPCKCOc9ms3y4iejqosDBCDq^EwoNTDqg3PxXpSjolnXmK9UL4?&)|iG zbLU`sIf3?6fcCJ!IouA*xV?Q`tzsm!GTH;E&tMp8*T|XGjJ!|kbrrSOMDzyzbH(}8 z=g*(>@{q?6`m|Ez82g8Z)$K#XOaOZoF}b!k;X15_#&+RHW4`o3$lnwUG0q%V=GDJ`eG{n)2rY7|&`G8q(?L!DzB91h&Z zhi^>@{aD`y^BM}2nCng*PR#Qz0mM+TYN!fO+QJ=i%-PJ0jHN%AQ?(0`{TY&ppv$J! z6$V3m$L;>6TjAHZA^~r8-D~v#+DOPgS>SABYEIbChym8dm=hdRm3`4<1BuIYnTkSWTA{js?WcvEYTO-#_sH#Jl}fZujFY6*_V z*(>~-_pHndVj{B!jkp6-hrnm%0#wT7dRi)EbUQ|F_?iXa$bpuiuN{5 zug5KxrbtG1@P_F#X!L(_CEPhCSq_Y3?uVL5)PiyHH;Rgj(~*Fa>(@wyZxlG`RgB*> zin=4;TA0Rta0>UjSn$XA4h$DD;nTptV5P3t5#pdV4|>)-C_r*b0q3kwbQth4^n54o z=>{|#{#!^^wk70fXC=SAz1$mS-gu@T4`M!gsq@-2AIOM8eOCw65BkUp&i zx5^3PoqSVg-|3c>tJPgAXzYsj<@@@H50d`C*<$C?AR4`26yn=HWm(qa?4>avpvFLO zL`MiG@2j#GM{rudk${Xz@AIIH^W9SG_DftS4MZiZD)$?dCqLz(Z-r|Wg1QIe*W}9! zFD#2JtLVCE_R{R~0Df|=bL^MT9Qmv}{rwoA=MOGN0)aw+;?7XL%h!pkM>!e>v#H>R zHNslu7-Ezs7i;uoaa-j8(F{Hbg677xYAJ_Ao!x}gS8ENohoZ|YbSTKknr}w8!@YAIz%xzhJF)`SuQW;} zMI+X$p4UHzoVE}gJ>yk~WYR(8>N@q<2_=WQxsutE5X|9*JZ3HqPZXvj?&9!d&S=sj zG!=Wp&i53uUfh6$oI+<8y+@8hWcwW^ zJ*OSU{lwR9LDEMK4(cUCkKpsa+M|V6;6XFFUeS?|Oh_p2Q_MTwONAZ}MCf)w9vVQ& zB<%#wEzc(B@B7WBKu4gS{#^Q)GPLh=`mZ}2C~DgQ{Cfi1iJKj<&fCYQF;K6*6kaoz zI7TU>dictaH~Xn9vRf3heJGn$r=t<2Htw>{kl2#dTK9y9u-v*CbXh?dKDf#3xLH|Q zP1Jg2-dYa2GH_)8uhIcaYOLp%JgFDU*DK=n-sCfys0Girbjq`AXqY7|*QX-aU}ZJ4 zrN-fwzaKMKQeL8ySOjNf&H(7`Qr%?f+Ubzcp!PLCQ7`4V$KdF9O@WRlQUYStFNh)KHDJ=>KW&yWiPf(W0uusF|uw zQPo-h_wAD-)a{N!@o z?tDJ?e7|4g9fQ=ON^WBgaS$Z!{AhN|IcNrn2PS=L!uZ7z?1{DYY@3O&>K|Jq|G>#O z(euR@+V;49@0&(~!v>?tz7yvWN*|IUGJ@(h>W>zROcHB*bG^nnz}a=Gp0K{M0`;s1 zciqxR@y6 z(LEo$=v;vLk|==VtGx9k^U&c}->PO$(9_cgGq7Bh0Ib9nL(ndh5@)1x0#IGxx)S3K z{`ow?G$6zG_d^oMY0RINnLu@QqZ_KK;v?Ap{b&HV5f8_3p}D+}4W9zZyy*F#8e_?t zD3Vv*mGVO8 z-)48V4s(NjRKN`(-2ve>x^+=bJV}dA?J{VcFDQqLn_%Pbm5mn{W>E{ne7j)VnUES@ zlWnPKu9y+c7puYj<`_B1ulLtMn*5TLs2)HScN|{GMDX?`Th+96uzSM}EJjq^l-y_U z39WoSrZEjs->Uc0l9jD)+ylXQgg!m2J(HM*5yRU{+`WCf?-+Nu^k2)i4q8#DGU%;s ztf|r2(b17DL@^^uX@n{8+w#Q1?migQQ78Z%WY;Ln1PelG%6wQ=_#BD1c zFbdc_FbWOzR+!+iW0Xz-$odTr)hm{C)=4EWOAc!2(KbklU#+jZ2CSe7Z;wYY$|$*Q zYQ7YFyk}23E=4dgE`=r}&E6VQ=`DZG&C#(F5CH%#V4Pni3~Rp7w@gk>b_6QQ{P}WIJG_74+UvPV;7Y^ zJT*Z%qvqA|vD&j!&?{no$FNjEE_}Zi=r#Zxd+qBV$@tgJ%}F-%REd{WgKcRVa{v{y zCe~VPD`x0c5HmDQ^IvH9dk0j^Y#iAMv+dgfVY&KrgKR(ejIeD$dX3-zoCy_lqMy=$ zP5M}f9X}ew2Rnsyt!sbPy1su3qKHa|@u4OsM@PYL|9)H&7;&KtoSRs$IUS5{N1s0A z-A#=!4B!0xJTy-?BOU9%IXC1jr(pAixU3TqHv(WmL@DCvFwe^W$0-n?w$L6==#_iK zPyKs2fR34Ee$zq*S}@5Hv(i^g0JRtgzKujcp)Cb2EkC&Nh~teVGyg}so*K1myaF8^ zovtRHeMNTm_yy>e?&`~B#8u8K^ylu%x?i{)9?J4T2@`E03KxadKLc9Dn2?YV4}(?G zVH~r2nil`ZpA%(E3})u${D8IQ=hsP1M2^VYl^;Klo@ox%6;N3gtoi%e9tU*;_BFp` z&6nmZUo%lSK-^|K>AEW!kaD~29n+VG6>;3a4TuH2pBrE7pPhiQ5H*g~L`jT|Tc=6} z1qFm*>=|hT+3zel=@}a%6Sf!v8dTnwK-o$Xv}3noMpmdEznh`r<;XeN}Smk z5e}48nDoD|Su?T%TUuRBWqH$rjc%Ve07GK(=Z%It(E;u?B8e{)a2)awO1^WH5O>6O_Lb%G#>Q^Uu~Q|wK!H@H zOz&b~?Xr`6W^B%5b_1f#D(wU&is5)@q*C^e4SNsw9P{GxP=m%}4-d2AL@d$LGh<_> zoaf#seQ2MLebx_3u01{7*K~5}>o{1lBCqZ%&wqk{5I0Wjf0<{8V-F8So;~k0I5=22 z>)W98siuBm+~RN7EW7@yhW%aCf%dJ7<0^byVGnBz09g0nPSVaI2>SvWhGe{AYQgfI z{-}(lW8Y!0hI=VN+-jf!%9>7pyXO8n+jsSZGJ3>GPF{WmczGB${exElyA<)P|G74t zx5Ds`VE^@-dYWOCVi&|9CtUQ>sk>5FquVQMYEnY>e>recWev1SWL=pk-Q8Nh26UBR z9qDc}n5mQD%I927TNs_N*Vs-x4=Z_9B3_R(-diLM)N-ru&8U3tiw3h=14dBFrDY6> zBQ|wBiwU9+BWIqui3Q;O*N}hhH#gU|MDX^H`QI^KX5fRVsj6-%?T_Kua*DclU&#wS zD8m0IoQ1DBuN$vAubY3_vCEo3P3#tptP}%NjWbZ99s#c>KM;2EE$lyZDB`?Bx;HeC zX_3*t&vHdZ4~U?~;yDX?duVB*-}>U1FP(km&KJ8`E*};IkT)M7mirAPJDbF01;6o= z9vm_k0UB&~NVYoivHkvYhB`IlVQnngSgLAUQJ2U1?q!q;Hut$>yj!(mYe3sY@#P~m z;1qg}I3yyb`Px1{Vz_D&=`n4x9#4qQ!slC+1RxcwM)G!P@~y6VnBV+}BT~UIESz`e z27(`?Cdxa}Wl+Y;Q---u9Bd7_%S?+^P7S^j?P-7C7!Fk~>RwFmc*Zv!xKiw=?ZM|4 zsmJ*xc%a3s(Q?B85G=Z*E{CT{Ml-m$gYju zH&4n;wm~>*0lck3_OR2LSsabfYMIT$+R-D17w2@7!P+Vs|>{=btV>;6rklv0a()e>9=6jcM-QIP0JoJ+vkb$X6Y`Q>lei7 za`dpjQM9M|QWx4WMrnITTkq@S1~T4HKq54LTtHyQq-c=gdGg1Pz9->aQlx{48$_$T z#t;q7Yy&!Pf!ONl696NI<_#o?!+R}y>?()^yRD>|4MhKXmm}gJ`{|mwvzR5irm3Q$ zqUT~eHh6q^H~|Q-wpCPA9QKNs{ke>@lE}=aYE8Mh-+;h7&aY+UP`s+acg+!;>E<%A zWwgvojUqZsu0DZ7Fh)j3ZYX}tVo^5dUfU2v_6_}#kQYonh*V%ATx~dh2?@MPYwuT> z^&E{s=1v6TsnSW(`wKeWP~MNoS2&vVJbXwv70P0HNQSxAnB^pMiyL>j7x zK;*-t*>DzDW+tW&-+LZpJbCp&eB@g2WsZDA`$c4G3iGS`?*Nk{1g--_<)yR|cEnSE zf0>H&Nj}HAiUXjC)3jO^Ml$!)*bi)0rgn^G(pMTZWRfH+#4~UkT70o1r~972FM67) z7!2h;sR%%0LnSdWF}R?!%YuHx{S!H|4r-;YUVon?21a#+hzRXgX`zlxWREO75BI=B z`>skmyRWw{WGbp_jo$|tCG~uoVNH7$VsqHsE$tIJz4E!Ef9%?Ok?IFK;ox#G0+&O6 zN8JfQhunR!hVP}l= zpPCpQO&rA{jsgnc{qeVJv<18l7gO9`=fKV<__kRZXmx)btAyKr?+y960C>QvE+0() z;$uPiqh!KCkYO)Yny^Cr;AQ;DtkUD3ORtZw@$BLL{uoDB*HGPQSLwFRC7WNJnx)g$ zklK+Q$%|)u0F|0Yp-?L4QpDQC_{W(QZNuXO_GjQdP4G-uwQ}7ETTQV^)!-PzspRYE zn&%H-w=eH>VW;d7(YV8-$~#VT-`+Dj-h;b%JfSl~XB?{%IWJ#c`q1`d6Koq@LrUs} zuY5&TsRx5v+_?y2WO;lbpD0v zmS=M1UmQ1hHqEBiyHGL`H|Pb?%-(wgq}Gf;aS{%6+Dne-*zYWVeJ$+|UUO^JmZC@H zEr4Sn6BGO1Jgj5<8CJ;h2!j&Gxy+BL zZs_lO)%Fun#^dATC0%<7pvFVL=qMv+{3A$Ls&wbx?#omJ!sR{7n{?0Lp;jNaUg3x- zA6>f3Z-C5Y>*F?WUpYDT#3>917jclkL zDQ|dWqsdV!ZP$~f2_^_0;uQDs z%0aF!soD;9-67&S-6-70F4ZBtm&(Nb*ibA254eDp_oweJ@ZUo`Gm3nuWc&VUD!Ie) zWs?_<)2$#vu5@fEJU>oEr`O#97Y`H?yA0q~sQTeP%K5KE0#-GV+w@G(m5KWvbuPd9 z{^L$geVnj{f&m!)Qz;r50T;=gusZ~~yRJ|W-(mmN#x3#G;u7alCDH2mw@uFniX4X~ zvb;1MaJX}_8Ly-_(5KCsM_FuD~p4vRE@FAEz}hwbgy0zGHb?Z1XhRS zhp(<~GMUk>Gxb5c*bG&|N_<|}NmLc?S5&75+_`d2>E_6hNP%%>UevHiM754744YUk zhibGmO~U3D7CJ%Q+|WQcZU0wEVSQ!N6KP^%al4reN(y-Yn<_Q&uChm!$kFy(nSKAs zX=2GlH|0g0SA14~U(ZnC#i6*S1QwjdGE9(Y+mwn7m4(Q!w$P?+&&CUmqw6zR0oa!T z(#>F3Z|}<5ij|cP0Iw?r+CIhe1ES*fld?pq$37>{50BI9>33$zhp^@~;J>v+ks4!h?=-j@q~>-t<5>$@!-;8=Wg3647V70`_ta(rkj#rIJZ08}~LQtZG444Dd7r<_$zdMC?iw4HYlM8KHQ1 zeCt(RO0ayKw#r4*N$|7{QJkr5dTu;Xeq((0^!Qe{W~-$|({&e4Jj#&M6XoN5u$Q(j{X{(xsks-9*yT=ZgAJeDj>PKDu(u z&?d%~HgJ40^k)E;rfIsmXJ;eupHTW?#|YCZIlVE#hk-rXWBWmSbjw?Y?=^Sj6*8bg z=i?Jj4AV5VVT{D5xREO)(jkv+$qsL`EG?zp(ZRvg+0_+u!_7w+RCY;xpnw7eYlAGIM5)m0pMi0J4t*wSn)_1_!S^PlWf;d#&f`?o@=`TKbSkn|GMYq z=KLi%(#ZSL53BT?uEG)=Q4wDT3(-JKBIUF=2OQ5Qm+qB?nkG^){L5O%tW~fKX zM3P4)YpEvQxLqR_umBZa#9nR9w6=3~EaeT+dJe)Ae70I%8=}(~csevb)95J`4YB~F zT%b<5r(6vq)uUc(P;hZ-qRiP}#NIlQe@kClTZ2oo*e8D2v{w4g z(x2{nQl!NJ<(L5+0auP0=5=!5j6|D7)> zQz@tJox-2_F{dvbsm|3lx-EGv9CNj}onY&=w`D61+&C4$FO38!88blG0BGiyGWQ`% zf-g)PsN8!RfckraTp-Y^`>5TL_G)5Rwawkv&r|}a<=4nv@GT?$q9N1IoMS>XQi-DS zyZeCf-bLk%ayd0L+obWtb{x#k&c2Le0UEg=VDpwYe}bb)8GljCSSburGBip;TzV~0 zUSz!f;hSStOizHUfA_D`t$-lD(hyD)q9PK}g@i!T?*?qmgY-I0Vm(K|uIF_B^B%M1 zdJ8XrPm8+wP&`~8e{HF0L|*hOb;ZgV#ySCB=6 zkQ!&|eHJbnP7S14Qa@@4R33;0l?QBp0aUQlW<)ImkcS)9piWVM53SWx@4FO(RW55U zAc3-y3!&^x&doi!!4YXm-luZC_Nb(}3i~s5M18D9ECm%yIrWtuZ+Vv+h(a+zTMHd! zLdGSfYQt~O?u*?r=T?wZPzce)P%`vIE8t;0=G;u@&gEWs*P0(J>F{1RiFWqU5M&$l zgbJlCeeQjEh5Xiu6cmo8r>ED2&S^-?og<(5#ab$xGq79-GQ3t`q1*uX ztrZZ|@-wq&)84J85XuK38&GPwG3ip;cJ6Bhx>=9M%KEQ?S`-1CW*s>8pu<^vCfBfX zElN&L&XJYAMC`YIy03g0TQck_OScL3_xIl!n4COt3fM0Z@MWY6Q!~VNYf`gf zA2}x3M$?$6u?u7@wYsy;Sd9G53&xcEQF-QG;kO*CDNuusevz@+`u5E9G-d+u*#ql* zC++~-H!(Gz6&$;VNAQj5^f|dLx+rONrlk|%f3d|tB8F`?14pK-BE#2u+H4(#N*Z$n z13I%0X|PM|`#rx3<2zM;8XRQi2v$YSui8mBWVWfR#zeB6Xd?;zoSk}B2*656CvNw9 zS$Lu0j$LP07aA<{t?|?oKbmTOe*@fO)c5FrM4K2M(it;+r3c?^5P`X|X{$Ha#l4`` zu<-lUe6bi!xf(aF;c|34LRv;Q>ZY1nXjGxac^cCX5Q?Su6fsLBO048`m@o%&ek7*i zAR6=eJsc+;#lCapnK-Ei$dDnDQc{-S(tjr^DA+J-Cl{Y zZEC#)E7-1`j}*J5MM*Rnr0B)RZEIHux99KZA|TX(8DC%Db5|9EM>Vo~KlUE5l?$w)L7LM#?T}FH|x-!IDNLzAmAV@WIY{Fo%i)5E~`r+Jt2t7xrc8T zrQW?n^GpcyK_hq%vWG{=PhSrI2i37>D%<;Atb;Hrab7kQB1X9IPDEM)j-Ncm*$zf@ z+czLuLP|;%Fd5$Rt(-sHWrq9uZeIj)Rh|r|)zN?c7P{=^*$qss=a(PDq95E)BW&Zr z!Q=Hoi>+kVbO(=r6jIny1*UjLT>%{zSmHrph}zAj8}$#yAGQj-gG>lx4kDrGPN8{0 zmtGX|saez+sGYa%APXUXuHQNEMG2?K%KT?gCawUs%YUU}c}#HRDdiXYa$acv*w|j( zjxKUJBPR1wyft4_eZ85VWz*>7x4ynr8wSi!?wJuk&#m6at$Ct=EBC6b_x2Ecp|3d~8$YihihI5MK)+$fKq(>A5dq?_ zvs44tovit_t@N|M`b$Ztf4Al4@@Y@10#EM)6_u8O&wA<^`~!Zeqzc=+n2+47!*3se zB22%*^$twUczRSGC|(l*a15OIjlHJ0i<%+a+}zk=aw7^wxKJ=-jtWJav}YwuFj&OyiG!@#TqHP0ohagvOej5D@;b2ikv(28E6k12&mz<9i;ww(8E zIWH!&WlAhtQJ8xoB_#z1lO@Erj-}7qY<2h{GFw+ibc*l zl=Qw{>MrIBPxIV~jE>&L9v$x2cQ`Gi`AwUK?h%m2bq`oxVaR-Z9eY{T*#Oi_F5T5c z1n74Lg~$0#dGDcNfj5mNvF4t^g47`^D8eVRsVO8W$&1zdvYRSw=2eI}$7l*D?Q|@X zsQ)||53sQoUx%S8C(7iP-Y>@Pgsarz*r(GdKid)ZZG3ZcvlH+b>n3OJ{`!?J8~odS z^?dY$lJQSy?*!RT#F-yafudZE0YND(je{$-gHFY}2)=d$(Izu`mMB_*b*o2*hiq0x zE__rlRkf|imkP0%c9b#c<>~XgLyJq>y#vD~8A#tI-Ekl7KHOE1A`<4Km3#>V!uo7; zcrS&f>y+8LXMw2bvcfw6Z$(9&^CNWry>>zC&l~T{3TznYPq*hZ9=(DpO+SK%*mfS& zIAmyY<1SZBjVpl+`ff+MI?qz=8*83MuvMi0x$NNTx(>EVNLES7I#IMq?3>VVQhPQk za!XQHr_)2{#Dr{!)ic1J_kK|2#(&rgJQIlNKfhfIBMzM?oRN!FeT6zC6HeNpHk6{az)~>~Md1&GK zkKZ@M2)wVo5g-2m=Ub)iZt>pq-HZxfLE}!#5`HR+AUU}zIhn)Q+`RA%g^Ow{umR6$ zv_b}X{)5^*<=;Z-47%07lHjpcLlP%uXzX1D4plg)O5{B$o?ZUQ9T}PsU~~ef2h@Zb z1_rTGl|&cSrt82h8B>CrSSp(EZU5$(G9_cL5P?vIN*G>p;PmujX1KfDmX)x$ zrQEeogX{uzI8K3$GkenB2@kt871zf;r~NQ2ENrWFHp2RqKH=lO;4R{1Mvp`Z^Lbsv zbZZ7D#s9t|sFYq=({}K9E&`+c1UWCl+DkGWEG~W-q23UxGfob57*VS64RL7l1(wZv zKujamd7c3Fydpk6zA!p}GQm}U(xj?Bk&zW|?`@W$pyV<4GFAzmu$vRND*)DqrIIOp z5DhkW2jzQ1akm?!zq|yOj8oskxKf9ez7uciW7?Bs`IX!0%Fq8ZL?StcG_`^V)C=L{ zZdJAi`%1NEVkUM|MJ%FD}Nefc7o zmd4dFa1M>(yLDs6#tZ{(yth)duJD-~t=@F_fJ7$hqf=mkstThE1%1oc9_X)EB#cGI z?Y=zV9LHOF@9n)WD7MTpD>@T68S^68;$fDp>%-33tc12J?;-V&&P%LTs;j235S`si zo(F)cmQ3_Bje>fn#yq_@PA=>(QA5E-c-J=@s#XA5ydKV?=pHl6bIb$P5z~WQ#}txj zhl+++!pFX-pXd0n(M0zgu?-Gk~79YMX zEG2AB2@v+P;x<0-*v`A$=UMW%o)#yK_kGK;>4SG$0HXstqg1kl)XSD1a83@6U!YQM zq+WeNY7`r(f;7Q}`!VVEw8?%XpriK~-_4acEq&vYI#zNq@GA247-8%Cd~0j#eSrJ> z>`{++2y^ZFqL$vve_xs?R>rk8Usv< zlZ%YoDAQN*Us4P(u8OYSR}!c5#Em>t7;egO^6m!QBq&@bP^%Au>i=14w5SmjS|P}$ z{-oz}QrHo>N(8YOBt9Xb_mcU~p$*{~7#!;zs|{1ws^lf1WJ8bi*IvgpK1bYSCr#&Z>2}Opod!Aym7A%2DkL>q=Ya z@>&a>@Yy>u*!XN^X7>IHkil0%bz=^`ql}dlggKMZ)Y1k?M>ueEZKrVIDLnk)y>7pbjZB!!*G$>FmdoJm-uw+g?&=mzC1X0*vUIg?5~x3LipVnH=p=z`bs1u zxi+;5?$hA%*Me;X1afy_VasOV!@_&sISxPig;4E@v$X+EM_9iGOLKF10C{-z&vo~1 z)V?0GJb|`##?xPl(wtiUBqx#5Mv>t?vO^9jPhn@_>@MV%C6*;qV`=a2lIz1xAvGtd z^5X{7{EBu8%zI?FJ?CH}cIzk=iYvm})BW{I>K%%Diz`^}$FR|BEdY_LCH!1yJ4TjM$4#-@0pof$5-PuG$+s{LUmy0e zc;G{?yX5&ZWq6i(BH+#lymJG5Z$JPUIIg>ZYbjh`bP;9o!8AO_HhXeCK$J(M*-k=3 zNg25^Ei@96W1*8BlE40m~kxIy+eA$epEKIL+sut{q^yYE#uG-Hu+%A`!W z*k5mEbvtYAhkJcR#kP1I?gD2MPJh}*)yc4PpSjMJ%X8|6<%@Lpx*8Uh()YaTeLigK z+h`1hG^}dGx*)XI>mk4x>#1l{<}ldl_noj*-jO^Lnw~lcU2JvV*t7A)HmZ#O`<(N%E7+bdCAyc5+(psctpa zzw^NB_W3;2Mh0U;>jpbEOsB)68GY@Q_M8Nc%ySM___`yF))DqW;*-U&o*^|?qvFOD zKdAOKjev~!Ek#iRjJs`cKBtYpy<#!Cwt3|KyUJL8-CRo$ej=^d+It`Z8oWy&AvK>I zXWiWb`-=(dOOk@8fbSpd`Ip zuif`>-t~y#uX)pF3c|Vf%xa1(9;?^om#e~4e6D)hF5ABw89f>4pj8qCwpfhCZjR7> z%aGxy8J&Xm24~*Zt57)~$yNj3>8Es%y5Udh)q%O@+*TEVd1sp64mGHQkUVaZ7*K~3 zGOc$tU#MTp*U?S;4eqSs6Z>=qflFck3{Fl?z9^yZqkZ!vYoA43ZOjn-n8^R_>nG}g z8`?*j&6TitY05^a%jzs>Sm2}0*W?&B9~#fDA#uq?2cwjea`_Dq-S_w$-XC(c+2Uwv zo?eT1nQS-XB%f(kzdG0^m_2=0XwGDUX5G+=iPOk{+rRu5!!-QZM=&$%OF=#zz!hMb|A zmqQhqm|}GW^B77lSx3HWo}KLSk6hn*F8s^~Fr_gTHL@$C*L6qFo`!okj-GS2v^X<9 zI4J&w)#|k{CUuK-hhGG<8e3a#JO`~y4gcGpU}>?r&uA`AImL2NXcoLV-{Yyef3>I^ z?=LRu0q?f!^r=eh{XHEgBi@*_)=>NyYBKYr{wrzzOB=rKgz!;;VtL&DBQ#8;=46P~ z$4qFz3>sHt-e9&qY{X4jTVX@PdW4U5#c###(0dp)dSd57&UH3?Yp;#-N)yPa+`7uM zWQ=NzUc8Sm@`Cg<&oZAA3&$*if@6fW-{cF^tngBRex~5^(?OA-Cw+o(wnYvwcYJy!} zcO18KMFHTX2MrsThJ&_CR>Fa_>nXhJz+3h13CDM3<-vLV!tfd4wpdDoHpxw$v>{rU zO}XM0&-~A_tTRH%e@N>Uveb<%$7XAJC*!9aON0^p1?5s1MaqV(9lQBOx-2iKUvtamcXL<0JjF zDpa!~yQHg2g)G8r@htiPT_fODnswu{_gVV%7wtwjEsuPg>C-A3SDq#g=ug8Nw+^)x zK5bpaz1qScjzV|wYTR`rR*19{c8SWntJ6&rO`yVf2^x*gM~6q{EPL@=qMByL1~nP= zCD|%p+`GuL6z`|eM?L?Gb$9I(IVkcLpRkFD>0gX7qyUJrRk^C19jz8Z%7v%_alqyQ zjaMD4!M9HDZRGkVX|jw1v*#e|f)>j1g=K@z3(VTpGlAcWMY6U0&(t5C{$78E67r3W z#Pu;{lXsc-%*vSr&yl(++OOA?XMXT5B~hPW%l$3n|KdSghAflaS+|MvJWCb6S|$@p zc8K(Az1N^?U$E$bLD(U(`=r9Hqh{Bi&0mf5)@uT(vmd2@S3XhNH4Z;{hT?*@;w-~G z{UtwDiA@-jkeM>md)WMl{l7LU zTAK!)!o-pN)6k#YMn4%DH16NHX>&SZlmbV*3nH0*1?t-IAEvk!0TB^x1veD@n$^mt z9C=q6SqqQ)wU2wmH(Y>7f=>`KE$ zlc*3DqgD}wvAk|-GhbC<=pHtMcRjR$w4w2_5n5-}d+X?sb$7@DvH|j&5)4MshyKj5 zI+BJ)HvIbiKfkE|`?Wwc|NWik->(G { - return ( - - - - ); -}; diff --git a/packages/integrations/src/github/config.ts b/packages/integrations/src/github/config.ts deleted file mode 100644 index 1a10c8d618..0000000000 --- a/packages/integrations/src/github/config.ts +++ /dev/null @@ -1,26 +0,0 @@ -import image from "./assets/image.png"; -import { Logo } from "./assets/logo"; - -export default { - name: "GitHub", - id: "github", - active: true, - logo: image, - short_description: - "Connect your GitHub account to Bubba to automate evidence collection for cloud resources", - description: - "Integrating with GitHub allows you to automate evidence collection for any GitHub repositories you may have, we'll run a daily read-only scan of your repositories and store the results in Bubba.", - images: [image], - settings: [ - { - id: "api_key", - label: "API Key", - description: "The API key for your GitHub account", - type: "text", - required: false, - value: "", - }, - ], - config: {}, - category: "Code", -}; diff --git a/packages/integrations/src/gusto/assets/image.png b/packages/integrations/src/gusto/assets/image.png deleted file mode 100644 index 6865358ae6996473e76a1078dd07a7ac002bacac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20523 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 Hr{Vtx2uAg1 diff --git a/packages/integrations/src/gusto/assets/logo.tsx b/packages/integrations/src/gusto/assets/logo.tsx deleted file mode 100644 index f263ff7ebe..0000000000 --- a/packages/integrations/src/gusto/assets/logo.tsx +++ /dev/null @@ -1,18 +0,0 @@ -export const Logo = () => { - return ( - - - - ); -}; diff --git a/packages/integrations/src/gusto/config.ts b/packages/integrations/src/gusto/config.ts deleted file mode 100644 index d6122502f3..0000000000 --- a/packages/integrations/src/gusto/config.ts +++ /dev/null @@ -1,17 +0,0 @@ -import image from "./assets/image.png"; -import { Logo } from "./assets/logo"; - -export default { - name: "Gusto", - id: "gusto-demo", - active: true, - logo: image, - short_description: - "Connect your Gusto account to Bubba to automate evidence collection for HR resources", - description: - "Integrating with Gusto allows you to automate evidence collection for employees, we'll run a daily read-only scan of your resources and store the results in Bubba.", - images: [image], - settings: [], - config: {}, - category: "HR", -}; diff --git a/packages/integrations/src/index.ts b/packages/integrations/src/index.ts index ae43c1728f..24a57028ea 100644 --- a/packages/integrations/src/index.ts +++ b/packages/integrations/src/index.ts @@ -1,6 +1,4 @@ -import GitHub from "./github/config"; -import Gusto from "./gusto/config"; import Aws from "./aws/config"; import Deel from "./deel/config"; -export const integrations = [GitHub, Gusto, Aws, Deel]; +export const integrations = [Aws, Deel];