-
- Thinking...
-
+
diff --git a/components/custom/multimodal-input.tsx b/components/custom/multimodal-input.tsx
index 5966154..c4d9741 100644
--- a/components/custom/multimodal-input.tsx
+++ b/components/custom/multimodal-input.tsx
@@ -1,111 +1,53 @@
"use client";
import cx from "classnames";
-import { motion } from "framer-motion";
-import { X } from "lucide-react";
-import React, {
- useRef,
- useEffect,
- useState,
- useCallback,
- Dispatch,
- SetStateAction,
- ChangeEvent,
-} from "react";
+import React, { useRef, useCallback } from "react";
import { toast } from "sonner";
-import { useLocalStorage, useWindowSize } from "usehooks-ts";
+import { useLocalStorage } from "usehooks-ts";
+import { useAccount } from 'wagmi';
+import {
+ IoArrowUpOutline,
+ IoAttachOutline,
+ IoStopOutline,
+ IoGlobeOutline,
+ IoWalletOutline,
+ IoSquareOutline,
+} from "react-icons/io5";
import { useWalletState } from "@/hooks/useWalletState";
-import { createClient } from "@/lib/supabase/client";
-import { sanitizeUIMessages } from "@/lib/utils";
-
-import { ArrowUpIcon, PaperclipIcon, StopIcon } from "./icons";
-import { PreviewAttachment } from "./preview-attachment";
import { Button } from "../ui/button";
import { Textarea } from "../ui/textarea";
-import { ChatSkeleton } from "./chat-skeleton";
-
-import type { Attachment as SupabaseAttachment } from "@/types/supabase";
-import type {
- Attachment,
- ChatRequestOptions,
- CreateMessage,
- Message,
-} from "ai";
+import type { MultimodalInputProps } from "@/types/chat";
+import { useDatabase } from '@/hooks/useDatabase';
-const suggestedActions = [
+const SUGGESTED_ACTIONS = [
{
title: "Create a new document",
- label: 'with the title "My New Document"',
+ label: "with title",
action: 'Create a new document with the title "My New Document"',
},
- {
- title: "Update an existing document",
- label: 'with the description "Add more details"',
- action:
- 'Update the document with ID "123" with the description "Add more details"',
- },
- {
- title: "Request suggestions for a document",
- label: 'with ID "123"',
- action: 'Request suggestions for the document with ID "123"',
- },
- {
- title: "Get the current weather",
- label: "in San Francisco",
- action: "Get the current weather in San Francisco",
- },
{
title: "Check wallet balance",
- label: "for my connected wallet",
+ label: "for connected wallet",
action: "Check the balance of my connected wallet",
},
{
- title: "Check wallet state",
- label: "for my connected wallet",
- action: "Check the state of my connected wallet",
+ title: "Web search",
+ label: "search the web for information",
+ action: "Search the web for latest blockchain news",
},
-];
-// Add type for temp attachments
-type TempAttachment = {
- url: string;
- name: string;
- contentType: string;
- path?: string;
-};
-
-// Add type for staged files
-interface StagedFile {
- id: string;
- file: File;
- previewUrl: string;
- status: "staging" | "uploading" | "complete" | "error";
-}
-
-interface MultimodalInputProps {
- input: string;
- setInput: (value: string) => void;
- isLoading: boolean;
- stop: () => void;
- attachments: Attachment[];
- setAttachments: Dispatch
>;
- messages: Message[];
- setMessages: Dispatch>;
- append: (
- message: Message | CreateMessage,
- chatRequestOptions?: ChatRequestOptions,
- ) => Promise;
- handleSubmit: (
- event?: { preventDefault?: () => void },
- chatRequestOptions?: ChatRequestOptions,
- ) => void;
- className?: string;
- chatId: string;
-}
+ {
+ title: "Smart contract interaction",
+ label: "interact with contracts",
+ action: "Show me how to interact with a smart contract",
+ },
+] as const;
export function MultimodalInput({
+ chatId,
input,
setInput,
+ handleSubmit: formSubmit,
isLoading,
stop,
attachments,
@@ -113,503 +55,243 @@ export function MultimodalInput({
messages,
setMessages,
append,
- handleSubmit,
className,
- chatId,
+ webSearchEnabled = true,
}: MultimodalInputProps) {
const textareaRef = useRef(null);
- const { width } = useWindowSize();
- const supabase = createClient();
- const { address, isConnected, chainId, networkInfo, isCorrectNetwork } =
- useWalletState();
-
- const [uploadProgress, setUploadProgress] = useState(0);
- const [stagedFiles, setStagedFiles] = useState([]);
- const [expectingText, setExpectingText] = useState(false);
- const stagedFileNames = useRef>(new Set());
-
- useEffect(() => {
- if (textareaRef.current) {
- adjustHeight();
+ const fileInputRef = useRef(null);
+ const [localInput, setLocalInput] = useLocalStorage("chat-input", "");
+ const { isConnected, isCorrectNetwork } = useWalletState();
+ const { address } = useAccount();
+ const { getAuthenticatedClient } = useDatabase();
+
+ // Web search handler with better formatting
+ const handleWebSearch = useCallback(async () => {
+ const searchText = input.trim();
+ if (!searchText) {
+ toast.error("Please enter a search query");
+ return;
}
- }, []);
- const adjustHeight = () => {
- if (textareaRef.current) {
- textareaRef.current.style.height = "auto";
- textareaRef.current.style.height = `${textareaRef.current.scrollHeight + 2}px`;
- }
- };
+ try {
+ const response = await fetch(
+ `/api/search?query=${encodeURIComponent(searchText)}`
+ );
+
+ if (!response.ok) {
+ throw new Error("Search failed");
+ }
- const [localStorageInput, setLocalStorageInput] = useLocalStorage(
- "input",
- "",
- );
+ const data = await response.json();
+
+ // Improved formatting for search results
+ const formattedResults = data.results
+ .map((result: any, index: number) => (
+ `${index + 1}. ${result.Text}\n${result.FirstURL ? ` Link: ${result.FirstURL}\n` : ''}`
+ ))
+ .join('\n');
- useEffect(() => {
- if (textareaRef.current) {
- const domValue = textareaRef.current.value;
- // Prefer DOM value over localStorage to handle hydration
- const finalValue = domValue || localStorageInput || "";
- setInput(finalValue);
- adjustHeight();
- }
- // Only run once after hydration
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, []);
+ const searchMessage = `🔍 **Web Search Results**\n\nQuery: "${searchText}"\n\n${formattedResults}\n\n---\nResults powered by DuckDuckGo`;
- useEffect(() => {
- setLocalStorageInput(input);
- }, [input, setLocalStorageInput]);
+ // Append search results to chat
+ await append(
+ {
+ role: "assistant",
+ content: searchMessage,
+ }
+ );
- const handleInput = (event: React.ChangeEvent) => {
- setInput(event.target.value);
- adjustHeight();
- };
+ // Also append the user's query
+ await append(
+ {
+ role: "user",
+ content: `Search: ${searchText}`,
+ }
+ );
- const fileInputRef = useRef(null);
+ setInput("");
+ setLocalInput("");
+ } catch (error) {
+ console.error("Search error:", error);
+ toast.error("Failed to perform web search");
+ }
+ }, [input, append, setInput, setLocalInput]);
- // Create blob URLs for file previews
- const createStagedFile = useCallback((file: File): StagedFile => {
- return {
- id: crypto.randomUUID(),
- file,
- previewUrl: URL.createObjectURL(file),
- status: "staging",
- };
- }, []);
+ // Add balance check handler
+ const handleBalanceCheck = useCallback(async () => {
+ if (!address) {
+ toast.error("Please connect your wallet first");
+ return;
+ }
- // Clean up blob URLs when files are removed
- const removeStagedFile = useCallback((fileId: string) => {
- setStagedFiles((prev) => {
- const file = prev.find((f) => f.id === fileId);
- if (file) {
- URL.revokeObjectURL(file.previewUrl);
- }
- const updatedFiles = prev.filter((f) => f.id !== fileId);
- if (file) {
- stagedFileNames.current.delete(file.file.name);
+ try {
+ // Fetch both basic balance and DeBankAPI data
+ const [ethResponse, debankResponse] = await Promise.all([
+ fetch(`/api/wallet/balance?address=${address}&network=base-sepolia`),
+ fetch(`/api/wallet/debank?address=${address}`),
+ ]);
+
+ if (!ethResponse.ok || !debankResponse.ok) {
+ throw new Error("Balance check failed");
}
- return updatedFiles;
- });
- }, []);
- // Clean up all blob URLs on unmount
- useEffect(() => {
- return () => {
- stagedFiles.forEach((file) => {
- URL.revokeObjectURL(file.previewUrl);
- });
- };
- }, [stagedFiles]);
+ const [ethData, debankData] = await Promise.all([
+ ethResponse.json(),
+ debankResponse.json(),
+ ]);
+
+ // Format the balance message with both ETH and token balances
+ const tokenList = debankData.tokens
+ .filter((token: any) => token.usd_value > 1) // Only show tokens worth more than $1
+ .map((token: any) =>
+ `- ${token.symbol}: ${Number(token.balance).toFixed(4)} (${token.chain}) ≈ $${token.usd_value.toFixed(2)}`
+ )
+ .join('\n');
+
+ const balanceMessage = `💰 **Wallet Balance**\n\n` +
+ `Address: \`${address}\`\n` +
+ `Network: Base Sepolia\n` +
+ `ETH Balance: ${Number(ethData.balance).toFixed(4)} ETH\n\n` +
+ `**Total Portfolio Value:** $${debankData.totalBalance.total_usd_value.toFixed(2)}\n\n` +
+ `**Token Balances:**\n${tokenList}\n\n` +
+ `---\nLast updated: ${new Date().toLocaleString()}`;
+
+ // Append balance info to chat
+ await append(
+ {
+ role: "assistant",
+ content: balanceMessage,
+ }
+ );
- const submitForm = useCallback(async () => {
- if (!input && attachments.length === 0) return;
+ } catch (error) {
+ console.error("Balance check error:", error);
+ toast.error("Failed to check wallet balance");
+ }
+ }, [address, append]);
+
+ // Update submit handler to include balance check
+ const onSubmit = useCallback(async () => {
+ const searchText = input.trim();
+ if (!searchText && attachments.length === 0) {
+ toast.error("Please enter a message or add an attachment");
+ return;
+ }
- const isWalletQuery =
- input.toLowerCase().includes("wallet") ||
- input.toLowerCase().includes("balance");
+ const isWalletQuery = searchText.toLowerCase().includes("wallet") ||
+ searchText.toLowerCase().includes("balance");
+ const isWebSearch = searchText.toLowerCase().includes("search");
- // Set expecting text based on input type
- setExpectingText(true);
+ if (isWalletQuery && (!isConnected || !isCorrectNetwork)) {
+ toast.error("Please connect your wallet and ensure correct network");
+ return;
+ }
- if (isWalletQuery) {
- if (!isConnected) {
- toast.error("Please connect your wallet first");
+ try {
+ if (isWalletQuery) {
+ await handleBalanceCheck();
return;
}
- if (!isCorrectNetwork) {
- toast.error("Please switch to Base Mainnet or Base Sepolia");
+
+ if (isWebSearch && webSearchEnabled) {
+ await handleWebSearch();
return;
}
- }
- const messageContent = isWalletQuery
- ? {
- text: input,
- attachments: attachments.map((att) => ({
- url: att.url,
- name: att.name,
- type: att.contentType,
- })),
- walletAddress: address,
- chainId,
- network: networkInfo?.name,
- isWalletConnected: isConnected,
- isCorrectNetwork,
- }
- : {
- text: input,
- attachments: attachments.map((att) => ({
- url: att.url,
- name: att.name,
- type: att.contentType,
- })),
- };
-
- try {
await append(
{
- role: "user",
- content: JSON.stringify(messageContent),
- },
- {
- experimental_attachments: attachments,
+ role: "user",
+ content: searchText,
},
+ { experimental_attachments: attachments }
);
setInput("");
setAttachments([]);
- setLocalStorageInput("");
+ setLocalInput("");
} catch (error) {
- console.error("Error sending message:", error);
toast.error("Failed to send message");
- } finally {
- // Reset expectingText when response is received
- setExpectingText(false);
}
}, [
input,
attachments,
append,
- setInput,
- setLocalStorageInput,
- address,
- chainId,
- setAttachments,
isConnected,
isCorrectNetwork,
- networkInfo,
+ handleWebSearch,
+ handleBalanceCheck,
+ webSearchEnabled,
+ setInput,
+ setAttachments,
+ setLocalInput,
]);
- const handleSuggestedAction = useCallback(
- (action: string) => {
- const isWalletAction =
- action.toLowerCase().includes("wallet") ||
- action.toLowerCase().includes("balance");
-
- if (isWalletAction) {
- if (!isConnected) {
- toast.error("Please connect your wallet first");
- return;
- }
- if (!isCorrectNetwork) {
- toast.error("Please switch to Base Mainnet or Base Sepolia");
- return;
- }
- }
-
- setInput(action);
- submitForm();
- },
- [isConnected, isCorrectNetwork, setInput, submitForm],
- );
-
- const handleFileChange = useCallback(
- async (event: ChangeEvent) => {
- const files = Array.from(event.target.files || []);
-
- // Create staged files with blob URLs
- const newStagedFiles = files
- .filter((file) => !stagedFileNames.current.has(file.name))
- .map((file) => {
- stagedFileNames.current.add(file.name);
- return createStagedFile(file);
- });
- setStagedFiles((prev) => [...prev, ...newStagedFiles]);
-
- try {
- // Upload each file
- for (const stagedFile of newStagedFiles) {
- setStagedFiles((prev) =>
- prev.map((f) =>
- f.id === stagedFile.id ? { ...f, status: "uploading" } : f,
- ),
- );
-
- const formData = new FormData();
- formData.append("file", stagedFile.file);
- formData.append("chatId", chatId);
-
- const response = await fetch("/api/files/upload", {
- method: "POST",
- body: formData,
- });
-
- if (!response.ok) throw new Error("Upload failed");
-
- const data = await response.json();
-
- // Add to attachments on successful upload
- setAttachments((current) => [
- ...current,
- {
- url: data.url,
- name: stagedFile.file.name,
- contentType: stagedFile.file.type,
- path: data.path,
- },
- ]);
-
- // Mark as complete and remove from staged files
- setStagedFiles((prev) =>
- prev.map((f) =>
- f.id === stagedFile.id ? { ...f, status: "complete" } : f,
- ),
- );
- removeStagedFile(stagedFile.id);
- }
-
- toast.success("Files uploaded successfully");
- } catch (error) {
- console.error("Error uploading files:", error);
- toast.error("Failed to upload one or more files");
-
- // Mark failed files
- newStagedFiles.forEach((file) => {
- setStagedFiles((prev) =>
- prev.map((f) => (f.id === file.id ? { ...f, status: "error" } : f)),
- );
- });
- } finally {
- if (fileInputRef.current) {
- fileInputRef.current.value = "";
- }
- }
- },
- [chatId, createStagedFile, removeStagedFile, setAttachments],
- );
-
- // Focus management
- useEffect(() => {
- if (textareaRef.current) {
- textareaRef.current.focus();
- }
- }, [messages.length]); // Refocus after new message
-
- // Auto-focus on mount
- useEffect(() => {
- const timer = setTimeout(() => {
- textareaRef.current?.focus();
- }, 100);
- return () => clearTimeout(timer);
- }, []);
-
- const handlePaste = useCallback(
- async (e: React.ClipboardEvent) => {
- console.log("🔍 Paste event detected");
-
- const clipboardData = e.clipboardData;
- if (!clipboardData) return;
-
- // Check for images in clipboard
- const items = Array.from(clipboardData.items);
- const imageItems = items.filter(
- (item) => item.kind === "file" && item.type.startsWith("image/"),
- );
-
- if (imageItems.length > 0) {
- e.preventDefault();
- console.log("📸 Found image in clipboard");
-
- // Convert clipboard items to files
- const files = imageItems
- .map((item) => item.getAsFile())
- .filter((file): file is File => file !== null)
- .map(
- (file) =>
- new File(
- [file],
- `screenshot-${Date.now()}.${file.type.split("/")[1] || "png"}`,
- { type: file.type },
- ),
- );
-
- // Create staged files with blob URLs
- const newStagedFiles = files.map(createStagedFile);
- setStagedFiles((prev) => [...prev, ...newStagedFiles]);
-
- try {
- // Upload each file using existing upload logic
- for (const stagedFile of newStagedFiles) {
- setStagedFiles((prev) =>
- prev.map((f) =>
- f.id === stagedFile.id ? { ...f, status: "uploading" } : f,
- ),
- );
-
- const formData = new FormData();
- formData.append("file", stagedFile.file);
- formData.append("chatId", chatId);
-
- const response = await fetch("/api/files/upload", {
- method: "POST",
- body: formData,
- });
-
- if (!response.ok) throw new Error("Upload failed");
-
- const data = await response.json();
-
- // Add to attachments on successful upload
- setAttachments((current) => [
- ...current,
- {
- url: data.url,
- name: stagedFile.file.name,
- contentType: stagedFile.file.type,
- path: data.path,
- },
- ]);
-
- // Mark as complete and remove from staged files
- setStagedFiles((prev) =>
- prev.map((f) =>
- f.id === stagedFile.id ? { ...f, status: "complete" } : f,
- ),
- );
- removeStagedFile(stagedFile.id);
- }
-
- toast.success("Files uploaded successfully");
- } catch (error) {
- console.error("Error uploading files:", error);
- toast.error("Failed to upload one or more files");
-
- // Mark failed files
- newStagedFiles.forEach((file) => {
- setStagedFiles((prev) =>
- prev.map((f) =>
- f.id === file.id ? { ...f, status: "error" } : f,
- ),
- );
- });
- }
- }
- },
- [chatId, createStagedFile, removeStagedFile, setAttachments],
- );
-
return (
- {isLoading && expectingText && (
-
- )}
-
- {messages.length === 0 &&
- attachments.length === 0 &&
- stagedFiles.length === 0 && (
-
- {suggestedActions.map((suggestedAction, index) => (
- 1 ? "hidden sm:block" : "block")}
- >
-
-
- ))}
-
- )}
-
-
-
- {(attachments.length > 0 || stagedFiles.length > 0) && (
-
- {stagedFiles.map((stagedFile) => (
-
-
removeStagedFile(stagedFile.id)}
- />
- {stagedFile.status === "error" && (
-
-
- Upload failed
-
-
- )}
-
- ))}
-
- {attachments.map((attachment) => (
-
-
- setAttachments((current) =>
- current.filter((a) => a.url !== attachment.url)
- )
- }
- />
-
+ {/* Suggested Actions */}
+ {messages.length === 0 && (
+
+ {SUGGESTED_ACTIONS.map((action) => (
+
))}
)}
+ {/* Input Area */}
diff --git a/components/custom/overview.tsx b/components/custom/overview.tsx
index ac7f693..1a75b13 100644
--- a/components/custom/overview.tsx
+++ b/components/custom/overview.tsx
@@ -1,60 +1,61 @@
+"use client";
+
import { motion } from "framer-motion";
import Link from "next/link";
import Image from "next/image";
import { useEffect, useState } from "react";
-const quotes = [
- "Building bridges in the Web3 ecosystem, one transaction at a time",
- "Empowering developers with seamless blockchain integration",
- "Simplifying complexity in the world of decentralized applications",
+const QUOTES = [
"Where innovation meets blockchain technology",
"Your trusted companion in the blockchain journey",
+ "Empowering Web3 development with AI",
+ "Building the future of decentralized applications",
+ "Seamlessly connecting AI and blockchain",
+ "Your gateway to Base ecosystem development",
+ "Making blockchain development accessible",
+ "Bridging traditional and decentralized finance",
+ "Powering the next generation of dApps",
+ "Simplifying smart contract interactions",
];
+const LINKS = {
+ chainable: "https://chainable.co",
+ base: "https://base.org",
+ supabase: "https://supabase.com",
+} as const;
+
export const Overview = () => {
- const [currentQuote, setCurrentQuote] = useState("");
+ const [quote, setQuote] = useState(QUOTES[0]);
useEffect(() => {
- const updateQuote = () => {
- const randomIndex = Math.floor(Math.random() * quotes.length);
- setCurrentQuote(quotes[randomIndex]);
- };
-
- updateQuote();
- const interval = setInterval(updateQuote, 5 * 60 * 60 * 1000);
-
- return () => clearInterval(interval);
+ setQuote(QUOTES[Math.floor(Math.random() * QUOTES.length)]);
}, []);
return (
-
-
-
-
-
-
-
Elron
+
+
+
+
+
Elron
Powered by{" "}
chainable.co
@@ -63,15 +64,13 @@ export const Overview = () => {
- “{currentQuote}”
+ “{quote}”
-
+
Welcome to Chainable Chat Bot - your AI-powered Web3 assistant.
- Built with Next.js and the latest Web3 technologies, this chatbot
- helps you interact with blockchain data and perform crypto
- operations seamlessly.
+ Built with Next.js and the latest Web3 technologies.
Connect your wallet to access personalized features like balance
@@ -80,19 +79,17 @@ export const Overview = () => {
Powered by{" "}
Base
{" "}
and secured with{" "}
Supabase
@@ -100,16 +97,15 @@ export const Overview = () => {
diff --git a/components/custom/preview-attachment.tsx b/components/custom/preview-attachment.tsx
index 0f13a1c..48695ca 100644
--- a/components/custom/preview-attachment.tsx
+++ b/components/custom/preview-attachment.tsx
@@ -1,16 +1,15 @@
import { X } from "lucide-react";
import { formatFileName } from "@/lib/utils/format-filename";
import { Button } from "../ui/button";
-
-interface Attachment {
- url: string;
- name: string;
- contentType: string;
- path?: string;
-}
+import type { Attachment } from "@/types/attachments";
interface PreviewAttachmentProps {
- attachment: Attachment;
+ attachment: {
+ url: string;
+ name: string;
+ contentType: string;
+ path?: string;
+ };
isUploading?: boolean;
onRemove?: () => void;
}
diff --git a/components/custom/sidebar-history.tsx b/components/custom/sidebar-history.tsx
index a4c9dc9..1e85843 100644
--- a/components/custom/sidebar-history.tsx
+++ b/components/custom/sidebar-history.tsx
@@ -25,16 +25,6 @@ import {
DropdownMenuItem,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
-import {
- SidebarGroup,
- SidebarGroupContent,
- SidebarMenu,
- SidebarMenuAction,
- SidebarMenuButton,
- SidebarMenuItem,
- useSidebar,
-} from "@/components/ui/sidebar";
-import { getChatsByUserIdQuery } from "@/db/queries";
import { createClient } from "@/lib/supabase/client";
import { Database } from "@/lib/supabase/types";
@@ -121,7 +111,7 @@ const ChatItem = ({
export function SidebarHistory({ user }: { user: User | undefined }) {
const { setOpenMobile } = useSidebar();
- const { id } = useParams();
+ const { id } = useParams() as { id: string };
const pathname = usePathname();
const {
data: history,
diff --git a/components/custom/sidebar-toggle.tsx b/components/custom/sidebar-toggle.tsx
index 227d824..84ac650 100644
--- a/components/custom/sidebar-toggle.tsx
+++ b/components/custom/sidebar-toggle.tsx
@@ -1,25 +1,26 @@
-import { ComponentProps } from "react";
+'use client'
-import { SidebarTrigger, useSidebar } from "@/components/ui/sidebar";
-import { BetterTooltip } from "@/components/ui/tooltip";
+import { Button } from '@/components/ui/button'
+import { BetterTooltip } from '@/components/ui/tooltip'
+import { Menu } from 'lucide-react'
+import { useSidebar } from '@/hooks/use-sidebar'
-import { SidebarLeftIcon } from "./icons";
-import { Button } from "../ui/button";
-
-export function SidebarToggle({
- className,
-}: ComponentProps
) {
- const { toggleSidebar } = useSidebar();
+export function SidebarToggle() {
+ const { toggle } = useSidebar()
return (
-
+
- );
+ )
}
diff --git a/components/custom/toolbar.tsx b/components/custom/toolbar.tsx
index 9bc6616..ceb285a 100644
--- a/components/custom/toolbar.tsx
+++ b/components/custom/toolbar.tsx
@@ -8,25 +8,33 @@ import {
useMotionValue,
useTransform,
} from "framer-motion";
-import { Dispatch, SetStateAction, useEffect, useRef, useState } from "react";
+import React, { useEffect, useRef, useState } from "react";
+import { useAgentState } from "../../hooks/useAgentState";
+import AgentModal from "./agentModal";
+import { Dispatch, SetStateAction } from "react";
import { useOnClickOutside } from "usehooks-ts";
import {
Tooltip,
- TooltipContent,
+ BetterTooltip,
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip";
import { sanitizeUIMessages } from "@/lib/utils";
-import {
- ArrowUpIcon,
- MessageIcon,
- PenIcon,
- StopIcon,
- SummarizeIcon,
-} from "./icons";
-import { Button } from "../ui/button";
+import {
+ IoArrowUpOutline,
+ IoStopOutline,
+ IoPencilOutline,
+ IoChatboxOutline,
+ IoTextOutline,
+} from "react-icons/io5";
+
+const ArrowUpIcon = () => ;
+const StopIcon = () => ;
+const PenIcon = () => ;
+const MessageIcon = () => ;
+const SummarizeIcon = () => ;
type ToolProps = {
type: "final-polish" | "request-suggestions" | "adjust-reading-level";
@@ -104,7 +112,7 @@ const Tool = ({
{
setIsHovered(true);
@@ -129,17 +137,14 @@ const Tool = ({
onClick={() => {
handleSelect();
}}
+ role="button"
+ tabIndex={0}
+ aria-label={description}
>
{selectedTool === type ? : icon}
-
- {description}
-
+
);
};
@@ -240,13 +245,7 @@ const ReadingLevelSelector = ({
{currentLevel === 2 ? : }
-
- {LEVELS[currentLevel]}
-
+
@@ -319,7 +318,8 @@ export const Tools = ({
);
};
-export const Toolbar = ({
+
+const ToolbarComponent = ({
isToolbarVisible,
setIsToolbarVisible,
append,
@@ -340,6 +340,9 @@ export const Toolbar = ({
const toolbarRef = useRef
(null);
const timeoutRef = useRef();
+ const [isModalOpen, setModalOpen] = useState(false);
+ const agentState = useAgentState("ws://localhost:8080");
+
const [selectedTool, setSelectedTool] = useState(null);
const [isAnimating, setIsAnimating] = useState(false);
@@ -380,83 +383,93 @@ export const Toolbar = ({
}, [isLoading, setIsToolbarVisible]);
return (
-
- {
- if (isLoading) return;
-
- cancelCloseTimer();
- setIsToolbarVisible(true);
- }}
- onHoverEnd={() => {
- if (isLoading) return;
-
- startCloseTimer();
- }}
- onAnimationStart={() => {
- setIsAnimating(true);
- }}
- onAnimationComplete={() => {
- setIsAnimating(false);
- }}
- ref={toolbarRef}
- >
- {isLoading ? (
- {
- stop();
- setMessages((messages) => sanitizeUIMessages(messages));
- }}
- >
-
-
- ) : selectedTool === "adjust-reading-level" ? (
-
- ) : (
-
- )}
-
-
+
+
+
setModalOpen(false)}
+ agentState={agentState}
+ />
+
+ {
+ if (isLoading) return;
+
+ cancelCloseTimer();
+ setIsToolbarVisible(true);
+ }}
+ onHoverEnd={() => {
+ if (isLoading) return;
+
+ startCloseTimer();
+ }}
+ onAnimationStart={() => {
+ setIsAnimating(true);
+ }}
+ onAnimationComplete={() => {
+ setIsAnimating(false);
+ }}
+ ref={toolbarRef}
+ >
+ {isLoading ? (
+ {
+ stop();
+ setMessages((messages) => sanitizeUIMessages(messages));
+ }}
+ >
+
+
+ ) : selectedTool === "adjust-reading-level" ? (
+
+ ) : (
+
+ )}
+
+
+
);
};
+
+export default ToolbarComponent;
diff --git a/components/portfolio-view.tsx b/components/portfolio-view.tsx
new file mode 100644
index 0000000..6654c52
--- /dev/null
+++ b/components/portfolio-view.tsx
@@ -0,0 +1,35 @@
+'use client'
+
+import { useDebank } from '@/hooks/use-debank'
+import { useEffect, useState } from 'react'
+
+interface PortfolioProps {
+ address: string
+}
+
+export function PortfolioView({ address }: PortfolioProps) {
+ const { getPortfolio, isLoading, error } = useDebank()
+ const [portfolio, setPortfolio] = useState(null)
+
+ useEffect(() => {
+ async function fetchPortfolio() {
+ const data = await getPortfolio(address)
+ setPortfolio(data)
+ }
+
+ if (address) {
+ fetchPortfolio()
+ }
+ }, [address, getPortfolio])
+
+ if (isLoading) return Loading...
+ if (error) return Error: {error.message}
+ if (!portfolio) return null
+
+ return (
+
+
Portfolio Value: ${portfolio.totalValue.toFixed(2)}
+ {/* Render balances and tokens */}
+
+ )
+}
\ No newline at end of file
diff --git a/components/providers/client-providers.tsx b/components/providers/client-providers.tsx
index aa69141..b945c9f 100644
--- a/components/providers/client-providers.tsx
+++ b/components/providers/client-providers.tsx
@@ -1,49 +1,51 @@
"use client";
-import "@rainbow-me/rainbowkit/styles.css";
-import {
- RainbowKitProvider,
- darkTheme,
- lightTheme,
-} from "@rainbow-me/rainbowkit";
-import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
-import { WagmiProvider } from "wagmi";
-import { ThemeProvider } from "next-themes";
-import Disclaimer from "@/components/custom/disclaimer";
-import { config } from "@/lib/wallet/config";
+import { RainbowKitProvider, darkTheme, lightTheme } from '@rainbow-me/rainbowkit'
+import { WagmiConfig } from 'wagmi'
+import { ThemeProvider } from 'next-themes'
+import { chains, config } from '@/lib/wagmi'
+import { useEffect, useState } from 'react'
+import { Toaster } from 'sonner'
+import { base } from 'wagmi/chains'
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
-const queryClient = new QueryClient();
+const themeConfig = {
+ accentColor: '#7b3fe4',
+ accentColorForeground: 'white',
+ radius: 'medium' as const,
+ fontStack: 'system' as const
+}
+
+const queryClient = new QueryClient()
export function ClientProviders({ children }: { children: React.ReactNode }) {
+ const [mounted, setMounted] = useState(false)
+
+ useEffect(() => {
+ setMounted(true)
+ }, [])
+
return (
-
-
-
-
- {children}
-
-
-
-
- );
+
+
+ {mounted ? (
+
+
+ {children}
+
+
+ ) : (
+ {children}
+ )}
+
+
+
+ )
}
diff --git a/components/providers/rainbow-provider.tsx b/components/providers/rainbow-provider.tsx
new file mode 100644
index 0000000..e215610
--- /dev/null
+++ b/components/providers/rainbow-provider.tsx
@@ -0,0 +1,40 @@
+'use client'
+
+import { RainbowKitProvider, darkTheme, lightTheme } from '@rainbow-me/rainbowkit'
+import { useTheme } from 'next-themes'
+import { WagmiConfig } from 'wagmi'
+import { chains, config } from '@/lib/wagmi'
+import { useEffect, useState } from 'react'
+import { base } from 'wagmi/chains'
+
+const themeConfig = {
+ accentColor: '#7b3fe4',
+ accentColorForeground: 'white',
+ borderRadius: 'medium',
+ fontStack: 'system'
+}
+
+export function RainbowProvider({ children }: { children: React.ReactNode }) {
+ const [mounted, setMounted] = useState(false)
+ const { resolvedTheme } = useTheme()
+
+ useEffect(() => {
+ setMounted(true)
+ }, [])
+
+ if (!mounted) {
+ return {children}
+ }
+
+ return (
+
+
+ {children}
+
+
+ )
+}
diff --git a/components/providers/root-provider.tsx b/components/providers/root-provider.tsx
index daf0e39..e69de29 100644
--- a/components/providers/root-provider.tsx
+++ b/components/providers/root-provider.tsx
@@ -1,30 +0,0 @@
-"use client";
-
-import dynamic from "next/dynamic";
-
-import { ThemeProvider } from "@/components/custom/theme-provider";
-import { Toaster } from "@/components/ui/toast";
-
-const ClientProviders = dynamic(
- () =>
- import("@/components/providers/client-providers").then(
- (mod) => mod.ClientProviders,
- ),
- { ssr: false },
-);
-
-export function RootProvider({ children }: { children: React.ReactNode }) {
- return (
-
-
- {children}
-
-
-
- );
-}
diff --git a/components/providers/sidebar-provider.tsx b/components/providers/sidebar-provider.tsx
new file mode 100644
index 0000000..87ef38a
--- /dev/null
+++ b/components/providers/sidebar-provider.tsx
@@ -0,0 +1,28 @@
+"use client";
+
+import { createContext, useContext, useState, ReactNode } from 'react';
+
+interface SidebarContextType {
+ collapsed: boolean;
+ setCollapsed: (collapsed: boolean) => void;
+}
+
+const SidebarContext = createContext(undefined);
+
+export function SidebarProvider({ children }: { children: ReactNode }) {
+ const [collapsed, setCollapsed] = useState(false);
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useSidebar() {
+ const context = useContext(SidebarContext);
+ if (context === undefined) {
+ throw new Error('useSidebar must be used within a SidebarProvider');
+ }
+ return context;
+}
\ No newline at end of file
diff --git a/components/ui/hover-card.tsx b/components/ui/hover-card.tsx
new file mode 100644
index 0000000..e54d91c
--- /dev/null
+++ b/components/ui/hover-card.tsx
@@ -0,0 +1,29 @@
+"use client"
+
+import * as React from "react"
+import * as HoverCardPrimitive from "@radix-ui/react-hover-card"
+
+import { cn } from "@/lib/utils"
+
+const HoverCard = HoverCardPrimitive.Root
+
+const HoverCardTrigger = HoverCardPrimitive.Trigger
+
+const HoverCardContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
+
+))
+HoverCardContent.displayName = HoverCardPrimitive.Content.displayName
+
+export { HoverCard, HoverCardTrigger, HoverCardContent }
diff --git a/components/ui/icons.tsx b/components/ui/icons.tsx
new file mode 100644
index 0000000..d4759ed
--- /dev/null
+++ b/components/ui/icons.tsx
@@ -0,0 +1,11 @@
+"use client";
+
+import { IoChevronForward, IoAddOutline } from "react-icons/io5";
+
+export function IconSidebar({ className }: { className?: string }) {
+ return ;
+}
+
+export function IconChevron({ className }: { className?: string }) {
+ return ;
+}
\ No newline at end of file
diff --git a/components/ui/sidebar.tsx b/components/ui/sidebar.tsx
index 728e47b..2864f9b 100644
--- a/components/ui/sidebar.tsx
+++ b/components/ui/sidebar.tsx
@@ -1,780 +1,70 @@
"use client";
-import * as React from "react";
-import { Slot } from "@radix-ui/react-slot";
-import { VariantProps, cva } from "class-variance-authority";
-import { PanelLeft } from "lucide-react";
-
-import { useIsMobile } from "@/hooks/use-mobile";
-import { cn } from "@/lib/utils";
-import { Button } from "@/components/ui/button";
-import { Input } from "@/components/ui/input";
-import { Separator } from "@/components/ui/separator";
-import {
- Sheet,
- SheetContent,
- SheetDescription,
- SheetTitle,
-} from "@/components/ui/sheet";
-import { Skeleton } from "@/components/ui/skeleton";
-import {
- Tooltip,
- TooltipContent,
- TooltipProvider,
- TooltipTrigger,
-} from "@/components/ui/tooltip";
-
-const SIDEBAR_COOKIE_NAME = "sidebar:state";
-const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
-const SIDEBAR_WIDTH = "16rem";
-const SIDEBAR_WIDTH_MOBILE = "18rem";
-const SIDEBAR_WIDTH_ICON = "3rem";
-const SIDEBAR_KEYBOARD_SHORTCUT = "b";
-
-type SidebarContext = {
- state: "expanded" | "collapsed";
- open: boolean;
- setOpen: (open: boolean) => void;
- openMobile: boolean;
- setOpenMobile: (open: boolean) => void;
- isMobile: boolean;
- toggleSidebar: () => void;
-};
-
-const SidebarContext = React.createContext(null);
-
-function useSidebar() {
- const context = React.useContext(SidebarContext);
- if (!context) {
- throw new Error("useSidebar must be used within a SidebarProvider.");
- }
-
- return context;
+import { useEffect, useState } from 'react'
+import { usePathname } from 'next/navigation'
+import { useAuth } from '@clerk/nextjs'
+import { createClientComponentClient } from '@supabase/auth-helpers-nextjs'
+import { toast } from 'sonner'
+import { type Database } from '@/lib/supabase/types'
+
+interface Chat {
+ id: string
+ title: string
+ created_at: string
}
-const SidebarProvider = React.forwardRef<
- HTMLDivElement,
- React.ComponentProps<"div"> & {
- defaultOpen?: boolean;
- open?: boolean;
- onOpenChange?: (open: boolean) => void;
- }
->(
- (
- {
- defaultOpen = true,
- open: openProp,
- onOpenChange: setOpenProp,
- className,
- style,
- children,
- ...props
- },
- ref,
- ) => {
- const isMobile = useIsMobile();
- const [openMobile, setOpenMobile] = React.useState(false);
-
- // This is the internal state of the sidebar.
- // We use openProp and setOpenProp for control from outside the component.
- const [_open, _setOpen] = React.useState(defaultOpen);
- const open = openProp ?? _open;
- const setOpen = React.useCallback(
- (value: boolean | ((value: boolean) => boolean)) => {
- const openState = typeof value === "function" ? value(open) : value;
- if (setOpenProp) {
- setOpenProp(openState);
- } else {
- _setOpen(openState);
- }
-
- // This sets the cookie to keep the sidebar state.
- document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
- },
- [setOpenProp, open],
- );
-
- // Helper to toggle the sidebar.
- const toggleSidebar = React.useCallback(() => {
- return isMobile
- ? setOpenMobile((open) => !open)
- : setOpen((open) => !open);
- }, [isMobile, setOpen, setOpenMobile]);
-
- // Adds a keyboard shortcut to toggle the sidebar.
- React.useEffect(() => {
- const handleKeyDown = (event: KeyboardEvent) => {
- if (
- event.key === SIDEBAR_KEYBOARD_SHORTCUT &&
- (event.metaKey || event.ctrlKey)
- ) {
- event.preventDefault();
- toggleSidebar();
- }
- };
-
- window.addEventListener("keydown", handleKeyDown);
- return () => window.removeEventListener("keydown", handleKeyDown);
- }, [toggleSidebar]);
-
- // We add a state so that we can do data-state="expanded" or "collapsed".
- // This makes it easier to style the sidebar with Tailwind classes.
- const state = open ? "expanded" : "collapsed";
-
- const contextValue = React.useMemo(
- () => ({
- state,
- open,
- setOpen,
- isMobile,
- openMobile,
- setOpenMobile,
- toggleSidebar,
- }),
- [
- state,
- open,
- setOpen,
- isMobile,
- openMobile,
- setOpenMobile,
- toggleSidebar,
- ],
- );
-
- return (
-
-
-
- {children}
-
-
-
- );
- },
-);
-SidebarProvider.displayName = "SidebarProvider";
-
-const Sidebar = React.forwardRef<
- HTMLDivElement,
- React.ComponentProps<"div"> & {
- side?: "left" | "right";
- variant?: "sidebar" | "floating" | "inset";
- collapsible?: "offcanvas" | "icon" | "none";
- }
->(
- (
- {
- side = "left",
- variant = "sidebar",
- collapsible = "offcanvas",
- className,
- children,
- ...props
- },
- ref,
- ) => {
- const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
-
- if (collapsible === "none") {
- return (
-
- {children}
-
- );
+export function Sidebar({ defaultCollapsed = false }) {
+ const [chats, setChats] = useState([])
+ const pathname = usePathname()
+ const { userId } = useAuth()
+ const supabase = createClientComponentClient()
+
+ useEffect(() => {
+ if (!userId) return
+
+ const fetchChats = async () => {
+ try {
+ const { data, error } = await supabase
+ .from('chats')
+ .select('*')
+ .eq('user_id', userId)
+ .order('created_at', { ascending: false })
+
+ if (error) throw error
+
+ setChats(data || [])
+ } catch (error) {
+ console.error('Error fetching chats:', error)
+ toast.error('Failed to load chat history')
+ }
}
- if (isMobile) {
- return (
-
- Sidebar
-
- Mobile sidebar
-
-
- {children}
-
-
- );
- }
-
- return (
-
- {/* This is what handles the sidebar gap on desktop */}
-
-
-
- );
- },
-);
-Sidebar.displayName = "Sidebar";
-
-const SidebarTrigger = React.forwardRef<
- React.ElementRef,
- React.ComponentProps
->(({ onClick, ...props }, ref) => {
- const { toggleSidebar } = useSidebar();
-
- return (
-
- );
-});
-SidebarTrigger.displayName = "SidebarTrigger";
-
-const SidebarRail = React.forwardRef<
- HTMLButtonElement,
- React.ComponentProps<"button">
->(({ className, ...props }, ref) => {
- const { toggleSidebar } = useSidebar();
-
- return (
-
- );
-});
-SidebarRail.displayName = "SidebarRail";
-
-const SidebarInset = React.forwardRef<
- HTMLDivElement,
- React.ComponentProps<"main">
->(({ className, ...props }, ref) => {
- return (
-
- );
-});
-SidebarInset.displayName = "SidebarInset";
-
-const SidebarInput = React.forwardRef<
- React.ElementRef,
- React.ComponentProps
->(({ className, ...props }, ref) => {
- return (
-
- );
-});
-SidebarInput.displayName = "SidebarInput";
-
-const SidebarHeader = React.forwardRef<
- HTMLDivElement,
- React.ComponentProps<"div">
->(({ className, ...props }, ref) => {
- return (
-
- );
-});
-SidebarHeader.displayName = "SidebarHeader";
-
-const SidebarFooter = React.forwardRef<
- HTMLDivElement,
- React.ComponentProps<"div">
->(({ className, ...props }, ref) => {
- return (
-
- );
-});
-SidebarFooter.displayName = "SidebarFooter";
-
-const SidebarSeparator = React.forwardRef<
- React.ElementRef,
- React.ComponentProps
->(({ className, ...props }, ref) => {
- return (
-
- );
-});
-SidebarSeparator.displayName = "SidebarSeparator";
-
-const SidebarContent = React.forwardRef<
- HTMLDivElement,
- React.ComponentProps<"div">
->(({ className, ...props }, ref) => {
- return (
-
- );
-});
-SidebarContent.displayName = "SidebarContent";
-
-const SidebarGroup = React.forwardRef<
- HTMLDivElement,
- React.ComponentProps<"div">
->(({ className, ...props }, ref) => {
- return (
-
- );
-});
-SidebarGroup.displayName = "SidebarGroup";
-
-const SidebarGroupLabel = React.forwardRef<
- HTMLDivElement,
- React.ComponentProps<"div"> & { asChild?: boolean }
->(({ className, asChild = false, ...props }, ref) => {
- const Comp = asChild ? Slot : "div";
-
- return (
- svg]:size-4 [&>svg]:shrink-0",
- "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
- className,
- )}
- {...props}
- />
- );
-});
-SidebarGroupLabel.displayName = "SidebarGroupLabel";
-
-const SidebarGroupAction = React.forwardRef<
- HTMLButtonElement,
- React.ComponentProps<"button"> & { asChild?: boolean }
->(({ className, asChild = false, ...props }, ref) => {
- const Comp = asChild ? Slot : "button";
-
- return (
- svg]:size-4 [&>svg]:shrink-0",
- // Increases the hit area of the button on mobile.
- "after:absolute after:-inset-2 after:md:hidden",
- "group-data-[collapsible=icon]:hidden",
- className,
- )}
- {...props}
- />
- );
-});
-SidebarGroupAction.displayName = "SidebarGroupAction";
-
-const SidebarGroupContent = React.forwardRef<
- HTMLDivElement,
- React.ComponentProps<"div">
->(({ className, ...props }, ref) => (
-
-));
-SidebarGroupContent.displayName = "SidebarGroupContent";
-
-const SidebarMenu = React.forwardRef<
- HTMLUListElement,
- React.ComponentProps<"ul">
->(({ className, ...props }, ref) => (
-
-));
-SidebarMenu.displayName = "SidebarMenu";
-
-const SidebarMenuItem = React.forwardRef<
- HTMLLIElement,
- React.ComponentProps<"li">
->(({ className, ...props }, ref) => (
-
-));
-SidebarMenuItem.displayName = "SidebarMenuItem";
-
-const sidebarMenuButtonVariants = cva(
- "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
- {
- variants: {
- variant: {
- default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
- outline:
- "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]",
- },
- size: {
- default: "h-8 text-sm",
- sm: "h-7 text-xs",
- lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0",
- },
- },
- defaultVariants: {
- variant: "default",
- size: "default",
- },
- },
-);
-
-const SidebarMenuButton = React.forwardRef<
- HTMLButtonElement,
- React.ComponentProps<"button"> & {
- asChild?: boolean;
- isActive?: boolean;
- tooltip?: string | React.ComponentProps;
- } & VariantProps
->(
- (
- {
- asChild = false,
- isActive = false,
- variant = "default",
- size = "default",
- tooltip,
- className,
- ...props
- },
- ref,
- ) => {
- const Comp = asChild ? Slot : "button";
- const { isMobile, state } = useSidebar();
-
- const button = (
-
- );
-
- if (!tooltip) {
- return button;
- }
+ fetchChats()
+
+ // Subscribe to changes
+ const channel = supabase
+ .channel('chats')
+ .on('postgres_changes',
+ {
+ event: '*',
+ schema: 'public',
+ table: 'chats',
+ filter: `user_id=eq.${userId}`
+ },
+ (payload) => {
+ fetchChats()
+ }
+ )
+ .subscribe()
- if (typeof tooltip === "string") {
- tooltip = {
- children: tooltip,
- };
+ return () => {
+ supabase.removeChannel(channel)
}
-
- return (
-
- {button}
-
-
- );
- },
-);
-SidebarMenuButton.displayName = "SidebarMenuButton";
-
-const SidebarMenuAction = React.forwardRef<
- HTMLButtonElement,
- React.ComponentProps<"button"> & {
- asChild?: boolean;
- showOnHover?: boolean;
- }
->(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
- const Comp = asChild ? Slot : "button";
-
- return (
- svg]:size-4 [&>svg]:shrink-0",
- // Increases the hit area of the button on mobile.
- "after:absolute after:-inset-2 after:md:hidden",
- "peer-data-[size=sm]/menu-button:top-1",
- "peer-data-[size=default]/menu-button:top-1.5",
- "peer-data-[size=lg]/menu-button:top-2.5",
- "group-data-[collapsible=icon]:hidden",
- showOnHover &&
- "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0",
- className,
- )}
- {...props}
- />
- );
-});
-SidebarMenuAction.displayName = "SidebarMenuAction";
-
-const SidebarMenuBadge = React.forwardRef<
- HTMLDivElement,
- React.ComponentProps<"div">
->(({ className, ...props }, ref) => (
-
-));
-SidebarMenuBadge.displayName = "SidebarMenuBadge";
-
-const SidebarMenuSkeleton = React.forwardRef<
- HTMLDivElement,
- React.ComponentProps<"div"> & {
- showIcon?: boolean;
- }
->(({ className, showIcon = false, ...props }, ref) => {
- // Random width between 50 to 90%.
- const width = React.useMemo(() => {
- return `${Math.floor(Math.random() * 40) + 50}%`;
- }, []);
+ }, [userId, supabase])
return (
-
- {showIcon && (
-
- )}
-
+
+ {/* Sidebar content */}
- );
-});
-SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton";
-
-const SidebarMenuSub = React.forwardRef<
- HTMLUListElement,
- React.ComponentProps<"ul">
->(({ className, ...props }, ref) => (
-
-));
-SidebarMenuSub.displayName = "SidebarMenuSub";
-
-const SidebarMenuSubItem = React.forwardRef<
- HTMLLIElement,
- React.ComponentProps<"li">
->(({ ...props }, ref) =>
);
-SidebarMenuSubItem.displayName = "SidebarMenuSubItem";
-
-const SidebarMenuSubButton = React.forwardRef<
- HTMLAnchorElement,
- React.ComponentProps<"a"> & {
- asChild?: boolean;
- size?: "sm" | "md";
- isActive?: boolean;
- }
->(({ asChild = false, size = "md", isActive, className, ...props }, ref) => {
- const Comp = asChild ? Slot : "a";
-
- return (
-
span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",
- "data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
- size === "sm" && "text-xs",
- size === "md" && "text-sm",
- "group-data-[collapsible=icon]:hidden",
- className,
- )}
- {...props}
- />
- );
-});
-SidebarMenuSubButton.displayName = "SidebarMenuSubButton";
-
-export {
- Sidebar,
- SidebarContent,
- SidebarFooter,
- SidebarGroup,
- SidebarGroupAction,
- SidebarGroupContent,
- SidebarGroupLabel,
- SidebarHeader,
- SidebarInput,
- SidebarInset,
- SidebarMenu,
- SidebarMenuAction,
- SidebarMenuBadge,
- SidebarMenuButton,
- SidebarMenuItem,
- SidebarMenuSkeleton,
- SidebarMenuSub,
- SidebarMenuSubButton,
- SidebarMenuSubItem,
- SidebarProvider,
- SidebarRail,
- SidebarSeparator,
- SidebarTrigger,
- useSidebar,
-};
+ )
+}
diff --git a/components/ui/sidebar/context.tsx b/components/ui/sidebar/context.tsx
new file mode 100644
index 0000000..8dd732e
--- /dev/null
+++ b/components/ui/sidebar/context.tsx
@@ -0,0 +1,37 @@
+'use client'
+
+import { createContext, useContext, useState } from 'react'
+
+interface SidebarContextType {
+ isOpen: boolean
+ setIsOpen: (open: boolean) => void
+ toggle: () => void
+}
+
+const SidebarContext = createContext(undefined)
+
+export function SidebarProvider({
+ children,
+ defaultOpen = true
+}: {
+ children: React.ReactNode
+ defaultOpen?: boolean
+}) {
+ const [isOpen, setIsOpen] = useState(defaultOpen)
+
+ const toggle = () => setIsOpen(!isOpen)
+
+ return (
+
+ {children}
+
+ )
+}
+
+export function useSidebar() {
+ const context = useContext(SidebarContext)
+ if (!context) {
+ throw new Error('useSidebar must be used within SidebarProvider')
+ }
+ return context
+}
\ No newline at end of file
diff --git a/components/ui/sidebar/index.tsx b/components/ui/sidebar/index.tsx
new file mode 100644
index 0000000..9d87586
--- /dev/null
+++ b/components/ui/sidebar/index.tsx
@@ -0,0 +1,97 @@
+'use client'
+
+import { useEffect, useState } from 'react'
+import { usePathname } from 'next/navigation'
+import { useAuth } from '@clerk/nextjs'
+import { createClientComponentClient } from '@supabase/auth-helpers-nextjs'
+import { toast } from 'sonner'
+import { type Database } from '@/lib/supabase/types'
+import { useSidebar } from '@/hooks/use-sidebar'
+import { cn } from '@/lib/utils'
+
+interface Chat {
+ id: string
+ title: string
+ created_at: string
+}
+
+export function Sidebar({ defaultCollapsed = false }) {
+ const [chats, setChats] = useState([])
+ const pathname = usePathname()
+ const { userId } = useAuth()
+ const supabase = createClientComponentClient()
+ const { isOpen, width, isResizing } = useSidebar()
+
+ useEffect(() => {
+ if (!userId) {
+ setChats([])
+ return
+ }
+
+ const fetchChats = async () => {
+ try {
+ const { data, error } = await supabase
+ .from('chats')
+ .select('id, title, created_at')
+ .eq('user_id', userId)
+ .order('created_at', { ascending: false })
+
+ if (error) throw error
+ setChats(data || [])
+ } catch (error) {
+ console.error('Error fetching chats:', error)
+ toast.error('Failed to load chat history')
+ }
+ }
+
+ fetchChats()
+
+ const channel = supabase
+ .channel('chats')
+ .on('postgres_changes',
+ {
+ event: '*',
+ schema: 'public',
+ table: 'chats',
+ filter: `user_id=eq.${userId}`
+ },
+ () => {
+ fetchChats()
+ }
+ )
+ .subscribe()
+
+ return () => {
+ supabase.removeChannel(channel)
+ }
+ }, [userId, supabase])
+
+ return (
+
+ )
+}
+
+export { useSidebar }
\ No newline at end of file
diff --git a/components/ui/sidebar/sidebar-context.tsx b/components/ui/sidebar/sidebar-context.tsx
new file mode 100644
index 0000000..17c7236
--- /dev/null
+++ b/components/ui/sidebar/sidebar-context.tsx
@@ -0,0 +1,37 @@
+'use client'
+
+import { createContext, useContext, useState } from 'react'
+
+interface SidebarContextType {
+ open: boolean
+ setOpen: (open: boolean) => void
+ toggle: () => void
+}
+
+const SidebarContext = createContext(undefined)
+
+export function SidebarProvider({
+ children,
+ defaultOpen = true
+}: {
+ children: React.ReactNode
+ defaultOpen?: boolean
+}) {
+ const [open, setOpen] = useState(defaultOpen)
+
+ const toggle = () => setOpen(!open)
+
+ return (
+
+ {children}
+
+ )
+}
+
+export function useSidebar() {
+ const context = useContext(SidebarContext)
+ if (context === undefined) {
+ throw new Error('useSidebar must be used within a SidebarProvider')
+ }
+ return context
+}
\ No newline at end of file
diff --git a/components/ui/sidebar/toggle.tsx b/components/ui/sidebar/toggle.tsx
new file mode 100644
index 0000000..697cff3
--- /dev/null
+++ b/components/ui/sidebar/toggle.tsx
@@ -0,0 +1,20 @@
+'use client'
+
+import { Button } from '@/components/ui/button'
+import { useSidebar } from './context'
+import { Menu } from 'lucide-react'
+
+export function SidebarToggle() {
+ const { toggle } = useSidebar()
+
+ return (
+
+ )
+}
\ No newline at end of file
diff --git a/components/ui/skeleton-layout.tsx b/components/ui/skeleton-layout.tsx
new file mode 100644
index 0000000..1a7d976
--- /dev/null
+++ b/components/ui/skeleton-layout.tsx
@@ -0,0 +1,46 @@
+"use client";
+
+import { Skeleton } from "@/components/ui/skeleton";
+
+export function SkeletonLayout() {
+ return (
+
+ {/* Sidebar Skeleton */}
+
+
+
+
+ {Array.from({ length: 5 }).map((_, i) => (
+
+ ))}
+
+
+
+
+ {/* Main Content Skeleton */}
+
+
+ {/* Chat Messages Skeleton */}
+
+ {Array.from({ length: 3 }).map((_, i) => (
+
+ ))}
+
+
+ {/* Input Skeleton */}
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/ui/tooltip.tsx b/components/ui/tooltip.tsx
index 70f9966..fd6568a 100644
--- a/components/ui/tooltip.tsx
+++ b/components/ui/tooltip.tsx
@@ -1,49 +1,59 @@
-"use client";
+"use client"
-import * as React from "react";
-import * as TooltipPrimitive from "@radix-ui/react-tooltip";
-
-import { cn } from "@/lib/utils";
-
-const TooltipProvider = TooltipPrimitive.Provider;
-
-const Tooltip = TooltipPrimitive.Root;
-
-const TooltipTrigger = TooltipPrimitive.Trigger;
+import * as React from "react"
+import * as TooltipPrimitive from "@radix-ui/react-tooltip"
+import { cn } from "@/lib/utils"
+const TooltipProvider = TooltipPrimitive.Provider
+const TooltipRoot = TooltipPrimitive.Root
+const TooltipTrigger = TooltipPrimitive.Trigger
const TooltipContent = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
>(({ className, sideOffset = 4, ...props }, ref) => (
-
-));
-TooltipContent.displayName = TooltipPrimitive.Content.displayName;
-
-export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
-
-export const BetterTooltip = ({
- content,
- children,
- align = "center",
- ...props
-}: React.ComponentPropsWithoutRef & {
- content: JSX.Element | string;
- align?: "center" | "end" | "start";
-}) => {
- return (
-
-
- {children}
- {content}
-
-
- );
-};
+
+))
+TooltipContent.displayName = TooltipPrimitive.Content.displayName
+
+export interface BetterTooltipProps {
+ content: React.ReactNode
+ children: React.ReactNode
+ delayDuration?: number
+ side?: "top" | "right" | "bottom" | "left"
+ align?: "start" | "center" | "end"
+ className?: string
+ contentClassName?: string
+}
+
+export function BetterTooltip({
+ content,
+ children,
+ delayDuration = 200,
+ side = "top",
+ align = "center",
+ className,
+ contentClassName,
+}: BetterTooltipProps) {
+ return (
+
+
+
+ {children}
+
+
+ {content}
+
+
+
+ )
+}
+
+export { TooltipProvider, TooltipRoot, TooltipTrigger, TooltipContent }
diff --git a/components/ui/vote-button.tsx b/components/ui/vote-button.tsx
new file mode 100644
index 0000000..01181db
--- /dev/null
+++ b/components/ui/vote-button.tsx
@@ -0,0 +1,44 @@
+'use client'
+
+import { Button } from '@/components/ui/button'
+import { ThumbsUp, ThumbsDown } from 'lucide-react'
+import { useVotes } from '@/hooks/use-votes'
+import { useEffect } from 'react'
+import { cn } from '@/lib/utils'
+
+interface VoteButtonProps {
+ chatId: string
+ type: 'up' | 'down'
+ className?: string
+}
+
+export function VoteButton({ chatId, type, className }: VoteButtonProps) {
+ const { votes, isLoading, vote, fetchVotes } = useVotes(chatId)
+
+ useEffect(() => {
+ fetchVotes()
+ }, [fetchVotes])
+
+ const userVote = votes.find(v => v.value === (type === 'up' ? 1 : -1))
+ const isActive = Boolean(userVote)
+
+ return (
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/providers/settings-provider.tsx b/hooks/use-cdp.ts
similarity index 100%
rename from src/components/providers/settings-provider.tsx
rename to hooks/use-cdp.ts
diff --git a/hooks/use-debank.ts b/hooks/use-debank.ts
new file mode 100644
index 0000000..fa245dd
--- /dev/null
+++ b/hooks/use-debank.ts
@@ -0,0 +1,115 @@
+import { useState, useCallback } from 'react'
+import { toast } from 'sonner'
+
+interface DebankBalance {
+ chain: string
+ symbol: string
+ amount: string
+ price: number
+ value: number
+}
+
+interface DebankToken {
+ chain: string
+ symbol: string
+ address: string
+ decimals: number
+ name: string
+ logo_url: string
+}
+
+export function useDebank() {
+ const [isLoading, setIsLoading] = useState(false)
+ const [error, setError] = useState(null)
+
+ const getBalances = useCallback(async (address: string): Promise => {
+ setIsLoading(true)
+ setError(null)
+
+ try {
+ const response = await fetch(`/api/debank/balances?address=${address}`, {
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ })
+
+ if (!response.ok) {
+ throw new Error('Failed to fetch balances')
+ }
+
+ const data = await response.json()
+ return data.balances
+ } catch (err) {
+ const error = err as Error
+ setError(error)
+ toast.error('Failed to fetch balances')
+ return []
+ } finally {
+ setIsLoading(false)
+ }
+ }, [])
+
+ const getTokens = useCallback(async (address: string): Promise => {
+ setIsLoading(true)
+ setError(null)
+
+ try {
+ const response = await fetch(`/api/debank/tokens?address=${address}`, {
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ })
+
+ if (!response.ok) {
+ throw new Error('Failed to fetch tokens')
+ }
+
+ const data = await response.json()
+ return data.tokens
+ } catch (err) {
+ const error = err as Error
+ setError(error)
+ toast.error('Failed to fetch tokens')
+ return []
+ } finally {
+ setIsLoading(false)
+ }
+ }, [])
+
+ const getPortfolio = useCallback(async (address: string) => {
+ setIsLoading(true)
+ setError(null)
+
+ try {
+ const [balances, tokens] = await Promise.all([
+ getBalances(address),
+ getTokens(address)
+ ])
+
+ return {
+ balances,
+ tokens,
+ totalValue: balances.reduce((acc, b) => acc + b.value, 0)
+ }
+ } catch (err) {
+ const error = err as Error
+ setError(error)
+ toast.error('Failed to fetch portfolio')
+ return {
+ balances: [],
+ tokens: [],
+ totalValue: 0
+ }
+ } finally {
+ setIsLoading(false)
+ }
+ }, [getBalances, getTokens])
+
+ return {
+ getBalances,
+ getTokens,
+ getPortfolio,
+ isLoading,
+ error
+ }
+}
\ No newline at end of file
diff --git a/hooks/use-sidebar.ts b/hooks/use-sidebar.ts
new file mode 100644
index 0000000..9d8a28d
--- /dev/null
+++ b/hooks/use-sidebar.ts
@@ -0,0 +1,61 @@
+'use client'
+
+import { create } from 'zustand'
+import { persist } from 'zustand/middleware'
+
+interface SidebarState {
+ isOpen: boolean
+ defaultWidth: number
+ width: number
+ isResizing: boolean
+ setWidth: (width: number) => void
+ setIsResizing: (isResizing: boolean) => void
+ toggle: () => void
+ setIsOpen: (isOpen: boolean) => void
+}
+
+export const useSidebar = create()(
+ persist(
+ (set) => ({
+ isOpen: true,
+ defaultWidth: 260,
+ width: 260,
+ isResizing: false,
+ setWidth: (width) => set({ width }),
+ setIsResizing: (isResizing) => set({ isResizing }),
+ toggle: () => set((state) => ({ isOpen: !state.isOpen })),
+ setIsOpen: (isOpen) => set({ isOpen })
+ }),
+ {
+ name: 'sidebar-storage',
+ skipHydration: true,
+ }
+ )
+)
+
+// Helper hook for responsive behavior
+export function useResponsiveSidebar() {
+ const { isOpen, toggle, setIsOpen, width, defaultWidth } = useSidebar()
+
+ // Close sidebar on mobile when clicking outside
+ const handleOutsideClick = () => {
+ if (window.innerWidth < 768) {
+ setIsOpen(false)
+ }
+ }
+
+ // Reset width to default
+ const resetWidth = () => {
+ useSidebar.setState({ width: defaultWidth })
+ }
+
+ return {
+ isOpen,
+ toggle,
+ setIsOpen,
+ width,
+ defaultWidth,
+ handleOutsideClick,
+ resetWidth
+ }
+}
\ No newline at end of file
diff --git a/hooks/use-supabase.ts b/hooks/use-supabase.ts
new file mode 100644
index 0000000..e69de29
diff --git a/hooks/use-votes.ts b/hooks/use-votes.ts
new file mode 100644
index 0000000..4048ed2
--- /dev/null
+++ b/hooks/use-votes.ts
@@ -0,0 +1,63 @@
+import { useState, useCallback } from 'react'
+import { useAuth } from '@clerk/nextjs'
+import { toast } from 'sonner'
+
+interface Vote {
+ id: string
+ chat_id: string
+ user_id: string
+ value: number
+ created_at: string
+ updated_at: string
+}
+
+export function useVotes(chatId: string) {
+ const [votes, setVotes] = useState([])
+ const [isLoading, setIsLoading] = useState(false)
+ const { userId } = useAuth()
+
+ const fetchVotes = useCallback(async () => {
+ if (!chatId) return
+
+ setIsLoading(true)
+ try {
+ const response = await fetch(`/api/vote?chatId=${chatId}`)
+ if (!response.ok) throw new Error('Failed to fetch votes')
+
+ const data = await response.json()
+ setVotes(data.votes)
+ } catch (error) {
+ console.error('Error fetching votes:', error)
+ toast.error('Failed to load votes')
+ } finally {
+ setIsLoading(false)
+ }
+ }, [chatId])
+
+ const vote = useCallback(async (value: number) => {
+ if (!chatId || !userId) return
+
+ try {
+ const response = await fetch('/api/vote', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ chatId, value })
+ })
+
+ if (!response.ok) throw new Error('Failed to vote')
+
+ await fetchVotes()
+ toast.success('Vote recorded')
+ } catch (error) {
+ console.error('Error voting:', error)
+ toast.error('Failed to record vote')
+ }
+ }, [chatId, userId, fetchVotes])
+
+ return {
+ votes,
+ isLoading,
+ vote,
+ fetchVotes
+ }
+}
\ No newline at end of file
diff --git a/hooks/use-window-size.ts b/hooks/use-window-size.ts
new file mode 100644
index 0000000..7be862a
--- /dev/null
+++ b/hooks/use-window-size.ts
@@ -0,0 +1,37 @@
+'use client'
+
+import { useState, useEffect } from 'react'
+
+interface WindowSize {
+ width: number
+ height: number
+}
+
+export function useWindowSize(): WindowSize {
+ const [windowSize, setWindowSize] = useState({
+ width: typeof window !== 'undefined' ? window.innerWidth : 0,
+ height: typeof window !== 'undefined' ? window.innerHeight : 0,
+ })
+
+ useEffect(() => {
+ function handleResize() {
+ setWindowSize({
+ width: window.innerWidth,
+ height: window.innerHeight,
+ })
+ }
+
+ if (typeof window !== 'undefined') {
+ window.addEventListener('resize', handleResize)
+ handleResize()
+ }
+
+ return () => {
+ if (typeof window !== 'undefined') {
+ window.removeEventListener('resize', handleResize)
+ }
+ }
+ }, [])
+
+ return windowSize
+}
\ No newline at end of file
diff --git a/hooks/useAgentState.ts b/hooks/useAgentState.ts
new file mode 100644
index 0000000..224890d
--- /dev/null
+++ b/hooks/useAgentState.ts
@@ -0,0 +1,33 @@
+import { useState, useEffect } from "react";
+
+export interface AgentState {
+ thoughts: string[];
+ actions: string[];
+ plan: string[];
+}
+
+const initialState: AgentState = {
+ thoughts: [],
+ actions: [],
+ plan: [],
+};
+
+export const useAgentState = (url: string): AgentState => {
+ const [state, setState] = useState(initialState);
+
+ useEffect(() => {
+ const ws = new WebSocket(url);
+
+ ws.onmessage = (event) => {
+ const message = JSON.parse(event.data);
+ setState((prev) => ({
+ ...prev,
+ [message.type]: [...prev[message.type], message.content],
+ }));
+ };
+
+ return () => ws.close();
+ }, [url]);
+
+ return state;
+};
diff --git a/hooks/useDatabase.ts b/hooks/useDatabase.ts
new file mode 100644
index 0000000..bfe72e0
--- /dev/null
+++ b/hooks/useDatabase.ts
@@ -0,0 +1,30 @@
+import { useCallback, useMemo } from 'react';
+import { createClientComponentClient } from '@supabase/auth-helpers-nextjs';
+import { useAuth } from '@clerk/nextjs';
+import type { SupabaseClient } from '@supabase/supabase-js';
+import type { Database } from '@/types/supabase';
+
+export function useDatabase() {
+ const client = useMemo(() => createClientComponentClient(), []);
+ const { userId } = useAuth();
+
+ const getAuthenticatedClient = useCallback(async () => {
+ if (!userId) {
+ throw new Error('Not authenticated');
+ }
+
+ const { data: { session } } = await client.auth.getSession();
+ if (!session) {
+ throw new Error('No authenticated session');
+ }
+ return client;
+ }, [client, userId]);
+
+ return {
+ client,
+ getAuthenticatedClient,
+ isAuthorized: Boolean(userId)
+ } as const;
+}
+
+export type DatabaseClient = SupabaseClient;
\ No newline at end of file
diff --git a/hooks/useParams.ts b/hooks/useParams.ts
new file mode 100644
index 0000000..a213bfd
--- /dev/null
+++ b/hooks/useParams.ts
@@ -0,0 +1,11 @@
+import { useParams as useNextParams } from "next/navigation";
+
+interface Params {
+ id: string;
+ [key: string]: string | string[];
+}
+
+export function useParams() {
+ const params = useNextParams();
+ return params as Params;
+}
\ No newline at end of file
diff --git a/hooks/useWalletState.ts b/hooks/useWalletState.ts
index b8e154a..81c9e2b 100644
--- a/hooks/useWalletState.ts
+++ b/hooks/useWalletState.ts
@@ -1,48 +1,19 @@
-import { useAccount, useChainId, useWalletClient } from "wagmi";
-import { useEffect, useMemo } from "react";
-import { toast } from "sonner";
+import { useAccount, useChainId } from 'wagmi';
+import { useAuth } from '@clerk/nextjs';
export function useWalletState() {
const { address, isConnected } = useAccount();
const chainId = useChainId();
- const { data: walletClient } = useWalletClient();
+ const { userId } = useAuth();
- // Memoize network info
- const networkInfo = useMemo(() => {
- if (!chainId) return null;
-
- return {
- name:
- chainId === 8453
- ? "Base Mainnet"
- : chainId === 84532
- ? "Base Sepolia"
- : "Unsupported Network",
- isSupported: [8453, 84532].includes(chainId),
- };
- }, [chainId]);
-
- // Watch for wallet state changes
- useEffect(() => {
- if (isConnected && address) {
- if (networkInfo?.isSupported) {
- console.log("Wallet connected:", {
- address,
- chainId,
- network: networkInfo.name,
- });
- } else {
- toast.error("Please switch to Base Mainnet or Base Sepolia");
- }
- }
- }, [isConnected, address, chainId, networkInfo]);
+ const isCorrectNetwork = chainId === Number(process.env.NEXT_PUBLIC_CHAIN_ID);
+ const isAuthorized = Boolean(userId);
return {
address,
isConnected,
+ isCorrectNetwork,
+ isAuthorized,
chainId,
- walletClient,
- networkInfo,
- isCorrectNetwork: networkInfo?.isSupported ?? false,
};
}
diff --git a/lib/animation-variants.ts b/lib/animation-variants.ts
new file mode 100644
index 0000000..d5d0456
--- /dev/null
+++ b/lib/animation-variants.ts
@@ -0,0 +1,36 @@
+export const messageAnimationVariants = {
+ initial: {
+ opacity: 0,
+ y: 20,
+ scale: 0.95
+ },
+ animate: {
+ opacity: 1,
+ y: 0,
+ scale: 1,
+ transition: {
+ duration: 0.4,
+ ease: [0.4, 0, 0.2, 1]
+ }
+ },
+ exit: {
+ opacity: 0,
+ y: -20,
+ transition: {
+ duration: 0.3,
+ ease: [0.4, 0, 1, 1]
+ }
+ }
+};
+
+export const containerAnimationVariants = {
+ initial: { opacity: 0 },
+ animate: {
+ opacity: 1,
+ transition: {
+ staggerChildren: 0.1,
+ delayChildren: 0.1
+ }
+ },
+ exit: { opacity: 0 }
+};
\ No newline at end of file
diff --git a/lib/auth/clerk-config.ts b/lib/auth/clerk-config.ts
new file mode 100644
index 0000000..b9117f2
--- /dev/null
+++ b/lib/auth/clerk-config.ts
@@ -0,0 +1,16 @@
+import { clerkClient } from "@clerk/nextjs";
+
+// Configure Clerk to use Supabase JWT template
+await clerkClient.jwksList.createJwkList({
+ applicationId: process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY!.split('_')[0],
+ template: "supabase",
+ jwks: {
+ keys: [
+ {
+ use: "sig",
+ kty: "RSA",
+ // Add your Supabase JWT configuration here
+ }
+ ]
+ }
+});
\ No newline at end of file
diff --git a/lib/auth/clerk-supabase.ts b/lib/auth/clerk-supabase.ts
new file mode 100644
index 0000000..76fece9
--- /dev/null
+++ b/lib/auth/clerk-supabase.ts
@@ -0,0 +1,39 @@
+import { createMiddlewareClient } from "@supabase/auth-helpers-nextjs";
+import { NextResponse } from "next/server";
+import { authMiddleware } from "@clerk/nextjs";
+
+export const createClerkSupabaseMiddleware = () => {
+ return authMiddleware({
+ publicRoutes: [
+ "/",
+ "/login",
+ "/register",
+ "/api/webhook",
+ "/api/auth/callback",
+ ],
+ async afterAuth(auth, req) {
+ const res = NextResponse.next();
+ const supabase = createMiddlewareClient({ req, res });
+
+ try {
+ if (auth.userId) {
+ const clerkToken = await auth.getToken({
+ template: "supabase", // Use Supabase JWT template
+ });
+
+ if (clerkToken) {
+ await supabase.auth.setSession({
+ access_token: clerkToken,
+ refresh_token: "",
+ });
+ }
+ }
+
+ return res;
+ } catch (error) {
+ console.error("Auth middleware error:", error);
+ return res;
+ }
+ },
+ });
+};
\ No newline at end of file
diff --git a/lib/auth/migration.ts b/lib/auth/migration.ts
new file mode 100644
index 0000000..869e068
--- /dev/null
+++ b/lib/auth/migration.ts
@@ -0,0 +1,30 @@
+import { createServerComponentClient } from '@supabase/auth-helpers-nextjs';
+import { cookies } from 'next/headers';
+
+export async function migrateUserAuth(userId: string) {
+ const supabase = createServerComponentClient({ cookies });
+
+ try {
+ // Create a secure one-time migration token
+ const migrationToken = crypto.randomUUID();
+
+ // Store the migration token with expiry
+ await supabase
+ .from('auth_migrations')
+ .insert({
+ user_id: userId,
+ migration_token: migrationToken,
+ expires_at: new Date(Date.now() + 1000 * 60 * 15) // 15 minutes
+ });
+
+ // Send migration email to user
+ await supabase.auth.resetPasswordForEmail(email, {
+ redirectTo: `/auth/migrate?token=${migrationToken}`,
+ });
+
+ return { success: true };
+ } catch (error) {
+ console.error('Migration error:', error);
+ return { success: false, error };
+ }
+}
\ No newline at end of file
diff --git a/lib/auth/session-sync.ts b/lib/auth/session-sync.ts
new file mode 100644
index 0000000..6441ddf
--- /dev/null
+++ b/lib/auth/session-sync.ts
@@ -0,0 +1,93 @@
+import { createClient } from '@supabase/supabase-js';
+import { auth } from '@clerk/nextjs';
+import { createServerComponentClient } from '@supabase/auth-helpers-nextjs';
+import { cookies } from 'next/headers';
+import { clerkClient } from '@clerk/nextjs';
+import { createHash } from 'crypto';
+
+const supabase = createClient(
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
+);
+
+export async function syncSupabaseSession() {
+ const { getToken } = auth();
+ const token = await getToken({ template: 'supabase' });
+
+ if (token) {
+ await supabase.auth.setSession({
+ access_token: token,
+ refresh_token: '',
+ });
+ }
+
+ return supabase;
+}
+
+export async function getSupabaseClient() {
+ return await syncSupabaseSession();
+}
+
+export async function migrateUserToClerk(email: string) {
+ const cookieStore = cookies();
+ const supabase = createServerComponentClient({ cookies: () => cookieStore });
+
+ try {
+ // Find existing Supabase user
+ const { data: existingUser } = await supabase
+ .from('users')
+ .select('*')
+ .eq('email', email)
+ .single();
+
+ if (!existingUser) {
+ throw new Error('User not found');
+ }
+
+ // Create secure migration token
+ const migrationToken = createHash('sha256')
+ .update(`${existingUser.id}-${Date.now()}`)
+ .digest('hex');
+
+ // Store migration token with expiry
+ await supabase
+ .from('auth_migrations')
+ .insert({
+ user_id: existingUser.id,
+ migration_token: migrationToken,
+ email: email,
+ expires_at: new Date(Date.now() + 1000 * 60 * 15) // 15 minutes
+ });
+
+ // Create or update Clerk user
+ const clerkUser = await clerkClient.users.createUser({
+ emailAddress: [email],
+ password: null, // Force OAuth or magic link
+ publicMetadata: {
+ supabaseId: existingUser.id,
+ migrationToken
+ }
+ });
+
+ // Update Supabase user with Clerk ID
+ await supabase
+ .from('users')
+ .update({
+ clerk_id: clerkUser.id,
+ updated_at: new Date().toISOString()
+ })
+ .eq('id', existingUser.id);
+
+ return {
+ success: true,
+ message: 'Migration initiated. Please check your email to complete the process.'
+ };
+
+ } catch (error) {
+ console.error('Migration error:', error);
+ return {
+ success: false,
+ error: 'Failed to migrate user'
+ };
+ }
+}
\ No newline at end of file
diff --git a/lib/cdp.ts b/lib/cdp.ts
new file mode 100644
index 0000000..ba63214
--- /dev/null
+++ b/lib/cdp.ts
@@ -0,0 +1,106 @@
+import { Cdp, Wallet } from 'cdp'
+
+// Type for network IDs
+export type NetworkId = 'base-mainnet' | 'base-sepolia'
+
+// Configuration interface
+interface CdpConfig {
+ apiKey: string
+ apiKeyName: string
+ apiKeyPrivateKey: string
+ networks: {
+ mainnet: {
+ rpc: string
+ chainId: number
+ usdcAddress: string
+ }
+ sepolia: {
+ rpc: string
+ chainId: number
+ usdcAddress: string
+ }
+ }
+}
+
+// CDP configuration using environment variables
+const cdpConfig: CdpConfig = {
+ apiKey: process.env.NEXT_PUBLIC_CDP_API_KEY!,
+ apiKeyName: process.env.NEXT_PUBLIC_CDP_API_KEY_NAME!,
+ apiKeyPrivateKey: process.env.NEXT_PUBLIC_CDP_API_KEY_PRIVATE_KEY!,
+ networks: {
+ mainnet: {
+ rpc: process.env.NEXT_PUBLIC_BASE_MAINNET_RPC!,
+ chainId: Number(process.env.NEXT_PUBLIC_BASE_MAINNET_CHAIN_ID),
+ usdcAddress: process.env.NEXT_PUBLIC_USDC_MAINNET!
+ },
+ sepolia: {
+ rpc: process.env.NEXT_PUBLIC_BASE_SEPOLIA_RPC!,
+ chainId: Number(process.env.NEXT_PUBLIC_BASE_SEPOLIA_CHAIN_ID),
+ usdcAddress: process.env.NEXT_PUBLIC_USDC_SEPOLIA!
+ }
+ }
+}
+
+// CDP client class
+export class CdpClient {
+ private static instance: CdpClient
+ private wallet: Wallet | null = null
+
+ private constructor() {
+ // Configure CDP with API credentials
+ Cdp.configure(cdpConfig.apiKeyName, cdpConfig.apiKeyPrivateKey)
+ }
+
+ public static getInstance(): CdpClient {
+ if (!CdpClient.instance) {
+ CdpClient.instance = new CdpClient()
+ }
+ return CdpClient.instance
+ }
+
+ // Create or get wallet
+ public async getWallet(networkId: NetworkId = 'base-sepolia'): Promise {
+ if (!this.wallet) {
+ this.wallet = await Wallet.create(networkId)
+ }
+ return this.wallet
+ }
+
+ // Get USDC address for network
+ public getUsdcAddress(networkId: NetworkId): string {
+ return networkId === 'base-mainnet'
+ ? cdpConfig.networks.mainnet.usdcAddress
+ : cdpConfig.networks.sepolia.usdcAddress
+ }
+
+ // Transfer tokens
+ public async transfer(
+ amount: number,
+ assetId: string,
+ destination: string,
+ networkId: NetworkId = 'base-sepolia',
+ gasless: boolean = false
+ ) {
+ const wallet = await this.getWallet(networkId)
+ const transfer = await wallet.transfer(amount, assetId, destination, gasless)
+ return transfer.wait()
+ }
+
+ // Get balance
+ public async getBalance(
+ assetId: string,
+ networkId: NetworkId = 'base-sepolia'
+ ) {
+ const wallet = await this.getWallet(networkId)
+ return wallet.balance(assetId)
+ }
+
+ // Get all balances
+ public async getBalances(networkId: NetworkId = 'base-sepolia') {
+ const wallet = await this.getWallet(networkId)
+ return wallet.balances()
+ }
+}
+
+// Export singleton instance
+export const cdpClient = CdpClient.getInstance()
\ No newline at end of file
diff --git a/lib/db/client.ts b/lib/db/client.ts
new file mode 100644
index 0000000..9320d01
--- /dev/null
+++ b/lib/db/client.ts
@@ -0,0 +1,42 @@
+import { createClient } from '@supabase/supabase-js';
+import { auth } from '@clerk/nextjs';
+import { Database } from '@/types/supabase';
+
+// Create a single instance for the server
+const serverClient = createClient(
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
+);
+
+// Function to get authenticated client
+export async function getAuthenticatedClient() {
+ const { getToken } = auth();
+ const supabaseAccessToken = await getToken({ template: 'supabase' });
+
+ if (supabaseAccessToken) {
+ return createClient(
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
+ {
+ global: {
+ headers: {
+ Authorization: `Bearer ${supabaseAccessToken}`
+ }
+ }
+ }
+ );
+ }
+
+ return serverClient;
+}
+
+// For client components
+export function createDatabaseClient() {
+ return createClient(
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
+ );
+}
+
+// For server components
+export { serverClient as databaseClient };
\ No newline at end of file
diff --git a/lib/db/server.ts b/lib/db/server.ts
new file mode 100644
index 0000000..2be961b
--- /dev/null
+++ b/lib/db/server.ts
@@ -0,0 +1,13 @@
+import { cookies } from 'next/headers';
+import { createServerComponentClient } from '@supabase/auth-helpers-nextjs';
+import { getAuthenticatedClient } from './client';
+import type { Database } from '@/types/supabase';
+
+export async function getServerDatabase() {
+ try {
+ return await getAuthenticatedClient();
+ } catch (error) {
+ // Fallback to anonymous client if auth fails
+ return createServerComponentClient({ cookies });
+ }
+}
\ No newline at end of file
diff --git a/lib/rate-limit.ts b/lib/rate-limit.ts
new file mode 100644
index 0000000..63a7e82
--- /dev/null
+++ b/lib/rate-limit.ts
@@ -0,0 +1,30 @@
+import { LRUCache } from 'lru-cache';
+
+type Options = {
+ uniqueTokenPerInterval?: number;
+ interval?: number;
+};
+
+export function rateLimit(options?: Options) {
+ const tokenCache = new LRUCache({
+ max: options?.uniqueTokenPerInterval || 500,
+ ttl: options?.interval || 60000,
+ });
+
+ return {
+ check: async (request: Request, limit: number) => {
+ const ip = request.headers.get('x-forwarded-for') || 'anonymous';
+ const tokenCount = (tokenCache.get(ip) as number[]) || [0];
+
+ if (tokenCount[0] === 0) {
+ tokenCache.set(ip, [1]);
+ } else if (tokenCount[0] === limit) {
+ throw new Error('Rate limit exceeded');
+ } else {
+ tokenCache.set(ip, [tokenCount[0] + 1]);
+ }
+
+ return true;
+ },
+ };
+}
\ No newline at end of file
diff --git a/lib/supabase/client.ts b/lib/supabase/client.ts
index b7af712..450328d 100644
--- a/lib/supabase/client.ts
+++ b/lib/supabase/client.ts
@@ -1,9 +1,79 @@
-import { createBrowserClient } from "@supabase/ssr";
+import { createClientComponentClient } from '@supabase/auth-helpers-nextjs'
+import { type Database } from './types'
-import type { Database } from "./types";
+export const createClient = () => {
+ return createClientComponentClient()
+}
-export const createClient = () =>
- createBrowserClient(
- process.env.NEXT_PUBLIC_SUPABASE_URL!,
- process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
- );
+// Utility functions for wallet management
+export const walletQueries = {
+ async createWallet(
+ userId: string,
+ walletAddress: string,
+ networkId: string
+ ) {
+ try {
+ const supabase = createClient()
+ const { data, error } = await supabase.from('user_wallets').insert({
+ user_id: userId,
+ wallet_address: walletAddress,
+ network_id: networkId
+ })
+
+ if (error) throw error
+ return data
+ } catch (error) {
+ console.error('Error creating wallet:', error)
+ throw error
+ }
+ },
+
+ async getUserWallets(userId: string) {
+ try {
+ const supabase = createClient()
+ const { data, error } = await supabase
+ .from('user_wallets')
+ .select('*')
+ .eq('user_id', userId)
+ .order('created_at', { ascending: false })
+
+ if (error) throw error
+ return data || []
+ } catch (error) {
+ console.error('Error getting wallets:', error)
+ return []
+ }
+ },
+
+ async trackTransaction({
+ userId,
+ walletAddress,
+ networkId,
+ txHash,
+ txType
+ }: {
+ userId: string
+ walletAddress: string
+ networkId: string
+ txHash: string
+ txType: 'transfer' | 'trade'
+ }) {
+ try {
+ const supabase = createClient()
+ const { data, error } = await supabase.from('transactions').insert({
+ user_id: userId,
+ wallet_address: walletAddress,
+ network_id: networkId,
+ tx_hash: txHash,
+ tx_type: txType,
+ status: 'pending'
+ })
+
+ if (error) throw error
+ return data
+ } catch (error) {
+ console.error('Error tracking transaction:', error)
+ throw error
+ }
+ }
+}
diff --git a/lib/supabase/middleware.ts b/lib/supabase/middleware.ts
index b0c4d1e..ba92db3 100644
--- a/lib/supabase/middleware.ts
+++ b/lib/supabase/middleware.ts
@@ -1,59 +1,59 @@
-import { createServerClient } from "@supabase/ssr";
-import { NextResponse, type NextRequest } from "next/server";
+import { createServerClient } from '@supabase/ssr';
+import { NextResponse, type NextRequest } from 'next/server';
export const updateSession = async (request: NextRequest) => {
- try {
- let response = NextResponse.next({
- request: {
- headers: request.headers,
- },
- });
+ try {
+ let response = NextResponse.next({
+ request: {
+ headers: request.headers,
+ },
+ });
- const supabase = createServerClient(
- process.env.NEXT_PUBLIC_SUPABASE_URL!,
- process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
- {
- cookies: {
- getAll() {
- return request.cookies.getAll();
- },
- setAll(cookiesToSet) {
- cookiesToSet.forEach(({ name, value }) =>
- request.cookies.set(name, value),
- );
- response = NextResponse.next({
- request,
- });
- cookiesToSet.forEach(({ name, value, options }) =>
- response.cookies.set(name, value, options),
- );
- },
- },
- },
- );
+ const supabase = createServerClient(
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
+ {
+ cookies: {
+ getAll() {
+ return request.cookies.getAll();
+ },
+ setAll(cookiesToSet) {
+ cookiesToSet.forEach(({ name, value }) =>
+ request.cookies.set(name, value)
+ );
+ response = NextResponse.next({
+ request,
+ });
+ cookiesToSet.forEach(({ name, value, options }) =>
+ response.cookies.set(name, value, options)
+ );
+ },
+ },
+ }
+ );
- const user = await supabase.auth.getUser();
+ const user = await supabase.auth.getUser();
- // Protected routes
- if (request.nextUrl.pathname === "/" && user.error) {
- return NextResponse.redirect(new URL("/register", request.url));
- }
+ // Protected routes
+ if (request.nextUrl.pathname.startsWith('/chat') && user.error) {
+ return NextResponse.redirect(new URL('/login', request.url));
+ }
- // Redirect logged in users from auth pages
- if (
- (request.nextUrl.pathname === "/login" ||
- request.nextUrl.pathname === "/register") &&
- !user.error
- ) {
- return NextResponse.redirect(new URL("/", request.url));
- }
+ // Redirect logged in users from auth pages
+ if (
+ (request.nextUrl.pathname === '/login' ||
+ request.nextUrl.pathname === '/register') &&
+ !user.error
+ ) {
+ return NextResponse.redirect(new URL('/', request.url));
+ }
- return response;
- } catch (e) {
- return NextResponse.next({
- request: {
- headers: request.headers,
- },
- });
- }
+ return response;
+ } catch (e) {
+ return NextResponse.next({
+ request: {
+ headers: request.headers,
+ },
+ });
+ }
};
diff --git a/lib/supabase/server.ts b/lib/supabase/server.ts
index 03eaf52..c7d8c48 100644
--- a/lib/supabase/server.ts
+++ b/lib/supabase/server.ts
@@ -1,20 +1,80 @@
-import { createServerClient } from "@supabase/ssr";
-import { cookies } from "next/headers";
-
-import { Database } from "./types";
-
-export const createClient = async () => {
- const cookieStore = await cookies();
-
- return createServerClient(
- process.env.NEXT_PUBLIC_SUPABASE_URL!,
- process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
- {
- cookies: {
- get(name: string) {
- return cookieStore.get(name)?.value;
- },
- },
- },
- );
-};
+import { createServerComponentClient } from '@supabase/auth-helpers-nextjs'
+import { cookies } from 'next/headers'
+import { Database } from './types'
+import { cache } from 'react'
+
+// Create a cached server component client to avoid duplicates
+export const createServerClient = cache(async () => {
+ const cookieStore = cookies()
+ return createServerComponentClient({
+ cookies: () => cookieStore,
+ })
+})
+
+// Helper function to get votes
+export async function getVotes(chatId: string) {
+ try {
+ const supabase = await createServerClient()
+ const { data, error } = await supabase
+ .from('votes')
+ .select('*')
+ .eq('chat_id', chatId)
+
+ if (error) {
+ console.error('Error fetching votes:', error)
+ return []
+ }
+
+ return data || []
+ } catch (error) {
+ console.error('Error:', error)
+ return []
+ }
+}
+
+// Helper function to create vote
+export async function createVote(chatId: string, userId: string, value: number) {
+ try {
+ const supabase = await createServerClient()
+ const { data, error } = await supabase
+ .from('votes')
+ .insert([
+ { chat_id: chatId, user_id: userId, value }
+ ])
+ .select()
+ .single()
+
+ if (error) {
+ console.error('Error creating vote:', error)
+ return null
+ }
+
+ return data
+ } catch (error) {
+ console.error('Error:', error)
+ return null
+ }
+}
+
+// Helper function to update vote
+export async function updateVote(id: string, value: number) {
+ try {
+ const supabase = await createServerClient()
+ const { data, error } = await supabase
+ .from('votes')
+ .update({ value })
+ .eq('id', id)
+ .select()
+ .single()
+
+ if (error) {
+ console.error('Error updating vote:', error)
+ return null
+ }
+
+ return data
+ } catch (error) {
+ console.error('Error:', error)
+ return null
+ }
+}
diff --git a/lib/supabase/types.ts b/lib/supabase/types.ts
index c795246..2e104a6 100644
--- a/lib/supabase/types.ts
+++ b/lib/supabase/types.ts
@@ -1,610 +1,129 @@
-import { SupabaseClient } from "@supabase/supabase-js";
-
export type Json =
- | string
- | number
- | boolean
- | null
- | { [key: string]: Json | undefined }
- | Json[];
-
-export type Database = {
- public: {
- Tables: {
- chats: {
- Row: {
- created_at: string;
- id: string;
- title: string | null;
- updated_at: string;
- user_id: string;
- };
- Insert: {
- created_at?: string;
- id?: string;
- title?: string | null;
- updated_at?: string;
- user_id: string;
- };
- Update: {
- created_at?: string;
- id?: string;
- title?: string | null;
- updated_at?: string;
- user_id?: string;
- };
- Relationships: [
- {
- foreignKeyName: "chats_user_id_fkey";
- columns: ["user_id"];
- isOneToOne: false;
- referencedRelation: "users";
- referencedColumns: ["id"];
- },
- ];
- };
- documents: {
- Row: {
- content: string | null;
- created_at: string;
- id: string;
- title: string;
- user_id: string;
- };
- Insert: {
- content?: string | null;
- created_at?: string;
- id?: string;
- title: string;
- user_id: string;
- };
- Update: {
- content?: string | null;
- created_at?: string;
- id?: string;
- title?: string;
- user_id?: string;
- };
- Relationships: [
- {
- foreignKeyName: "documents_user_id_fkey";
- columns: ["user_id"];
- isOneToOne: false;
- referencedRelation: "users";
- referencedColumns: ["id"];
- },
- ];
- };
- file_uploads: {
- Row: {
- id: string;
- user_id: string;
- chat_id: string | null;
- bucket_id: string;
- storage_path: string;
- filename: string;
- original_name: string;
- content_type: string;
- size: number;
- url: string;
- version: number;
- created_at: string;
- updated_at: string;
- };
- Insert: {
- user_id: string;
- chat_id?: string | null;
- bucket_id: string;
- storage_path: string;
- filename: string;
- original_name: string;
- content_type: string;
- size: number;
- url: string;
- version?: number;
- };
- Update: {
- bucket_id?: string;
- chat_id?: string;
- content_type?: string;
- created_at?: string;
- filename?: string;
- id?: string;
- original_name?: string;
- size?: number;
- storage_path?: string;
- url?: string;
- user_id?: string;
- version?: number;
- };
- Relationships: [
- {
- foreignKeyName: "file_uploads_chat_id_fkey";
- columns: ["chat_id"];
- isOneToOne: false;
- referencedRelation: "chats";
- referencedColumns: ["id"];
- },
- ];
- };
- messages: {
- Row: {
- chat_id: string;
- content: Json;
- created_at: string;
- id: string;
- role: string;
- updated_at: string;
- };
- Insert: {
- chat_id: string;
- content: Json;
- created_at?: string;
- id?: string;
- role: string;
- updated_at?: string;
- };
- Update: {
- chat_id?: string;
- content?: Json;
- created_at?: string;
- id?: string;
- role?: string;
- updated_at?: string;
- };
- Relationships: [
- {
- foreignKeyName: "messages_chat_id_fkey";
- columns: ["chat_id"];
- isOneToOne: false;
- referencedRelation: "chats";
- referencedColumns: ["id"];
- },
- ];
- };
- suggestions: {
- Row: {
- created_at: string;
- description: string | null;
- document_created_at: string;
- document_id: string;
- id: string;
- is_resolved: boolean;
- original_text: string;
- suggested_text: string;
- user_id: string;
- };
- Insert: {
- created_at?: string;
- description?: string | null;
- document_created_at: string;
- document_id: string;
- id?: string;
- is_resolved?: boolean;
- original_text: string;
- suggested_text: string;
- user_id: string;
- };
- Update: {
- created_at?: string;
- description?: string | null;
- document_created_at?: string;
- document_id?: string;
- id?: string;
- is_resolved?: boolean;
- original_text?: string;
- suggested_text?: string;
- user_id?: string;
- };
- Relationships: [
- {
- foreignKeyName: "suggestions_document_id_document_created_at_fkey";
- columns: ["document_id", "document_created_at"];
- isOneToOne: false;
- referencedRelation: "documents";
- referencedColumns: ["id", "created_at"];
- },
- {
- foreignKeyName: "suggestions_user_id_fkey";
- columns: ["user_id"];
- isOneToOne: false;
- referencedRelation: "users";
- referencedColumns: ["id"];
- },
- ];
- };
- users: {
- Row: {
- created_at: string;
- email: string;
- id: string;
- updated_at: string;
- };
- Insert: {
- created_at?: string;
- email: string;
- id?: string;
- updated_at?: string;
- };
- Update: {
- created_at?: string;
- email?: string;
- id?: string;
- updated_at?: string;
- };
- Relationships: [];
- };
- votes: {
- Row: {
- chat_id: string;
- is_upvoted: boolean;
- message_id: string;
- };
- Insert: {
- chat_id: string;
- is_upvoted: boolean;
- message_id: string;
- };
- Update: {
- chat_id?: string;
- is_upvoted?: boolean;
- message_id?: string;
- };
- Relationships: [
- {
- foreignKeyName: "votes_chat_id_fkey";
- columns: ["chat_id"];
- isOneToOne: false;
- referencedRelation: "chats";
- referencedColumns: ["id"];
- },
- {
- foreignKeyName: "votes_message_id_fkey";
- columns: ["message_id"];
- isOneToOne: false;
- referencedRelation: "messages";
- referencedColumns: ["id"];
- },
- ];
- };
- };
- Views: {
- [_ in never]: never;
- };
- Functions: {
- get_document_latest_version: {
- Args: {
- doc_id: string;
- };
- Returns: string;
- };
- get_latest_document: {
- Args: {
- doc_id: string;
- auth_user_id: string;
- };
- Returns: {
- id: string;
- user_id: string;
- title: string;
- content: string;
- created_at: string;
- }[];
- };
- get_next_file_version: {
- Args: {
- p_bucket_id: string;
- p_storage_path: string;
- };
- Returns: number;
- };
- gtrgm_compress: {
- Args: {
- "": unknown;
- };
- Returns: unknown;
- };
- gtrgm_decompress: {
- Args: {
- "": unknown;
- };
- Returns: unknown;
- };
- gtrgm_in: {
- Args: {
- "": unknown;
- };
- Returns: unknown;
- };
- gtrgm_options: {
- Args: {
- "": unknown;
- };
- Returns: undefined;
- };
- gtrgm_out: {
- Args: {
- "": unknown;
- };
- Returns: unknown;
- };
- set_limit: {
- Args: {
- "": number;
- };
- Returns: number;
- };
- show_limit: {
- Args: Record;
- Returns: number;
- };
- show_trgm: {
- Args: {
- "": string;
- };
- Returns: string[];
- };
- };
- Enums: {
- [_ in never]: never;
- };
- CompositeTypes: {
- [_ in never]: never;
- };
- };
-};
-
-type PublicSchema = Database[Extract];
+ | string
+ | number
+ | boolean
+ | null
+ | { [key: string]: Json | undefined }
+ | Json[]
+
+export interface Database {
+ public: {
+ Tables: {
+ user_settings: {
+ Row: {
+ id: string
+ user_id: string
+ sidebar_collapsed: boolean
+ created_at: string
+ updated_at: string
+ }
+ Insert: {
+ id?: string
+ user_id: string
+ sidebar_collapsed?: boolean
+ created_at?: string
+ updated_at?: string
+ }
+ Update: {
+ sidebar_collapsed?: boolean
+ updated_at?: string
+ }
+ }
+ user_wallets: {
+ Row: {
+ id: string
+ user_id: string
+ wallet_address: string
+ network_id: string
+ created_at: string
+ updated_at: string
+ }
+ Insert: {
+ id?: string
+ user_id: string
+ wallet_address: string
+ network_id: string
+ created_at?: string
+ updated_at?: string
+ }
+ Update: {
+ wallet_address?: string
+ network_id?: string
+ updated_at?: string
+ }
+ }
+ transactions: {
+ Row: {
+ id: string
+ user_id: string
+ wallet_address: string
+ network_id: string
+ tx_hash: string
+ tx_type: 'transfer' | 'trade'
+ status: 'pending' | 'completed' | 'failed'
+ created_at: string
+ updated_at: string
+ }
+ Insert: {
+ id?: string
+ user_id: string
+ wallet_address: string
+ network_id: string
+ tx_hash: string
+ tx_type: 'transfer' | 'trade'
+ status?: 'pending' | 'completed' | 'failed'
+ created_at?: string
+ updated_at?: string
+ }
+ Update: {
+ status?: 'pending' | 'completed' | 'failed'
+ updated_at?: string
+ }
+ }
+ votes: {
+ Row: {
+ id: string
+ chat_id: string
+ user_id: string
+ value: number
+ created_at: string
+ updated_at: string
+ }
+ Insert: {
+ id?: string
+ chat_id: string
+ user_id: string
+ value: number
+ created_at?: string
+ updated_at?: string
+ }
+ Update: {
+ value?: number
+ updated_at?: string
+ }
+ }
+ }
+ Views: {
+ [_ in never]: never
+ }
+ Functions: {
+ [_ in never]: never
+ }
+ Enums: {
+ [_ in never]: never
+ }
+ }
+}
export type Tables<
- PublicTableNameOrOptions extends
- | keyof (PublicSchema["Tables"] & PublicSchema["Views"])
- | { schema: keyof Database },
- TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
- ? keyof (Database[PublicTableNameOrOptions["schema"]]["Tables"] &
- Database[PublicTableNameOrOptions["schema"]]["Views"])
- : never = never,
-> = PublicTableNameOrOptions extends { schema: keyof Database }
- ? (Database[PublicTableNameOrOptions["schema"]]["Tables"] &
- Database[PublicTableNameOrOptions["schema"]]["Views"])[TableName] extends {
- Row: infer R;
- }
- ? R
- : never
- : PublicTableNameOrOptions extends keyof (PublicSchema["Tables"] &
- PublicSchema["Views"])
- ? (PublicSchema["Tables"] &
- PublicSchema["Views"])[PublicTableNameOrOptions] extends {
- Row: infer R;
- }
- ? R
- : never
- : never;
-
-export type TablesInsert<
- PublicTableNameOrOptions extends
- | keyof PublicSchema["Tables"]
- | { schema: keyof Database },
- TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
- ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"]
- : never = never,
+ PublicTableNameOrOptions extends
+ | keyof Database['public']['Tables']
+ | { schema: keyof Database },
+ TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
+ ? keyof Database[PublicTableNameOrOptions['schema']]['Tables']
+ : never = never
> = PublicTableNameOrOptions extends { schema: keyof Database }
- ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends {
- Insert: infer I;
- }
- ? I
- : never
- : PublicTableNameOrOptions extends keyof PublicSchema["Tables"]
- ? PublicSchema["Tables"][PublicTableNameOrOptions] extends {
- Insert: infer I;
- }
- ? I
- : never
- : never;
-
-export type TablesUpdate<
- PublicTableNameOrOptions extends
- | keyof PublicSchema["Tables"]
- | { schema: keyof Database },
- TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
- ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"]
- : never = never,
-> = PublicTableNameOrOptions extends { schema: keyof Database }
- ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends {
- Update: infer U;
- }
- ? U
- : never
- : PublicTableNameOrOptions extends keyof PublicSchema["Tables"]
- ? PublicSchema["Tables"][PublicTableNameOrOptions] extends {
- Update: infer U;
- }
- ? U
- : never
- : never;
-
-export type Enums<
- PublicEnumNameOrOptions extends
- | keyof PublicSchema["Enums"]
- | { schema: keyof Database },
- EnumName extends PublicEnumNameOrOptions extends { schema: keyof Database }
- ? keyof Database[PublicEnumNameOrOptions["schema"]]["Enums"]
- : never = never,
-> = PublicEnumNameOrOptions extends { schema: keyof Database }
- ? Database[PublicEnumNameOrOptions["schema"]]["Enums"][EnumName]
- : PublicEnumNameOrOptions extends keyof PublicSchema["Enums"]
- ? PublicSchema["Enums"][PublicEnumNameOrOptions]
- : never;
-
-export type CompositeTypes<
- PublicCompositeTypeNameOrOptions extends
- | keyof PublicSchema["CompositeTypes"]
- | { schema: keyof Database },
- CompositeTypeName extends PublicCompositeTypeNameOrOptions extends {
- schema: keyof Database;
- }
- ? keyof Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"]
- : never = never,
-> = PublicCompositeTypeNameOrOptions extends { schema: keyof Database }
- ? Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"][CompositeTypeName]
- : PublicCompositeTypeNameOrOptions extends keyof PublicSchema["CompositeTypes"]
- ? PublicSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions]
- : never;
-
-export type Client = SupabaseClient;
-
-export type MessageRole = "user" | "assistant" | "system" | "tool";
-
-// Add types for tool invocations and annotations
-export interface ToolInvocation {
- state: "call" | "result";
- toolCallId: string;
- toolName: string;
- args?: any;
- result?: any;
-}
-
-export interface MessageAnnotation {
- messageIdFromServer?: string;
-}
-
-// Update Message interface to match AI library format
-export interface Message {
- id: string;
- chat_id: string;
- role: MessageRole;
- content: string | Record;
- created_at: string;
- toolInvocations?: ToolInvocation[];
- annotations?: MessageAnnotation[];
-}
-
-export interface PostgrestError {
- code: string;
- message: string;
- details: string | null;
- hint: string | null;
-}
-
-export function handleDatabaseError(error: PostgrestError | null) {
- if (!error) return null;
-
- console.error("Database error:", error);
-
- switch (error.code) {
- case "23505": // Unique violation
- if (error.message.includes("messages_pkey")) {
- throw new Error("Message ID already exists");
- }
- if (error.message.includes("chats_pkey")) {
- throw new Error("Chat ID already exists");
- }
- throw new Error("Unique constraint violation");
- case "23503": // Foreign key violation
- throw new Error("Referenced record does not exist");
- case "42501": // RLS violation
- throw new Error("Unauthorized access");
- case "PGRST116": // Not found
- return null;
- case "PGRST204": // Column not found
- throw new Error("Invalid column name");
- default:
- throw error;
- }
-}
-
-// Add Document type
-export type Document = Database["public"]["Tables"]["documents"]["Row"];
-export type Vote = Database["public"]["Tables"]["votes"]["Row"];
-export type Chat = Database["public"]["Tables"]["chats"]["Row"];
-
-export type Suggestion = Database["public"]["Tables"]["suggestions"]["Row"];
-
-// Add DatabaseMessage type to match the database schema
-export interface DatabaseMessage {
- id: string;
- chat_id: string;
- role: string;
- content: string; // Always stored as string in database
- created_at: string;
-}
-
-// Helper function to convert between formats
-export function convertToDBMessage(message: Message): DatabaseMessage {
- let content = message.content;
-
- // Convert content to string if it's an object
- if (typeof content === "object") {
- const messageData: any = { content };
-
- // Add tool invocations if present
- if (message.toolInvocations?.length) {
- messageData.toolInvocations = message.toolInvocations;
- }
-
- // Add annotations if present
- if (message.annotations?.length) {
- messageData.annotations = message.annotations;
- }
-
- content = JSON.stringify(messageData);
- }
-
- return {
- id: message.id,
- chat_id: message.chat_id,
- role: message.role,
- content: content as string,
- created_at: message.created_at,
- };
-}
-
-// Helper function to parse database message
-export function parseDBMessage(dbMessage: DatabaseMessage): Message {
- try {
- const content = JSON.parse(dbMessage.content);
-
- // Check if content is a message data object
- if (content && typeof content === "object" && "content" in content) {
- return {
- ...dbMessage,
- content: content.content,
- toolInvocations: content.toolInvocations,
- annotations: content.annotations,
- role: dbMessage.role as MessageRole,
- };
- }
-
- // If not a special format, return as is
- return {
- ...dbMessage,
- content: dbMessage.content,
- role: dbMessage.role as MessageRole,
- };
- } catch {
- // If not valid JSON, return as plain text
- return {
- ...dbMessage,
- content: dbMessage.content,
- role: dbMessage.role as MessageRole,
- };
- }
-}
-
-// Add these types to your existing types file
-
-export interface FileUpload {
- id: string;
- created_at: string;
- chat_id: string;
- file_path: string;
- file_name: string;
- file_type: string;
- file_size: number;
- public_url: string;
-}
-
-export interface StorageError {
- message: string;
- statusCode: string;
-}
+ ? Database[PublicTableNameOrOptions['schema']]['Tables'][TableName]
+ : PublicTableNameOrOptions extends keyof Database['public']['Tables']
+ ? Database['public']['Tables'][PublicTableNameOrOptions]
+ : never
diff --git a/lib/wagmi.ts b/lib/wagmi.ts
new file mode 100644
index 0000000..c0b9254
--- /dev/null
+++ b/lib/wagmi.ts
@@ -0,0 +1,18 @@
+import { getDefaultConfig } from '@rainbow-me/rainbowkit'
+import { base, baseSepolia } from 'wagmi/chains'
+import { http } from 'viem'
+
+const walletConnectProjectId = process.env.NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID!
+
+export const chains = [base, baseSepolia]
+
+export const config = getDefaultConfig({
+ appName: 'AI Chat',
+ projectId: walletConnectProjectId,
+ chains,
+ transports: {
+ [base.id]: http(process.env.NEXT_PUBLIC_BASE_MAINNET_RPC),
+ [baseSepolia.id]: http(process.env.NEXT_PUBLIC_BASE_SEPOLIA_RPC),
+ },
+ ssr: true
+})
\ No newline at end of file
diff --git a/lib/wallet/config.ts b/lib/wallet/config.ts
index a17b692..1fe2407 100644
--- a/lib/wallet/config.ts
+++ b/lib/wallet/config.ts
@@ -1,28 +1,21 @@
-import "@rainbow-me/rainbowkit/styles.css";
-import { getDefaultWallets } from "@rainbow-me/rainbowkit";
+import { getDefaultConfig } from "@rainbow-me/rainbowkit";
import { http } from "viem";
import { base, baseSepolia } from "viem/chains";
-import { createConfig, type Config } from "wagmi";
if (!process.env.NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID) {
throw new Error("Missing NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID");
}
+export const chains = [base, baseSepolia] as const;
const projectId = process.env.NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID;
-const supportedChains = [base, baseSepolia] as const;
-const { connectors } = getDefaultWallets({
- appName: "AI Chat",
+// Create wagmi config using RainbowKit's getDefaultConfig
+export const wagmiConfig = getDefaultConfig({
+ appName: "Chainable AI",
projectId,
-});
-
-export const config = createConfig({
- chains: supportedChains,
+ chains,
transports: {
[base.id]: http(),
[baseSepolia.id]: http(),
},
- connectors,
});
-
-export type WagmiConfig = typeof config;
diff --git a/middleware.ts b/middleware.ts
index 114bf59..bb8a655 100644
--- a/middleware.ts
+++ b/middleware.ts
@@ -1,20 +1,41 @@
-import { NextRequest } from "next/server";
+import { authMiddleware } from "@clerk/nextjs/server";
+import { NextResponse } from "next/server";
+import { createMiddlewareClient } from "@supabase/auth-helpers-nextjs";
-import { updateSession } from "@/lib/supabase/middleware";
+export default authMiddleware({
+ publicRoutes: ["/", "/login", "/register", "/api/webhook"],
+ async afterAuth(auth, req) {
+ const res = NextResponse.next();
+
+ try {
+ // Create Supabase client
+ const supabase = createMiddlewareClient({ req, res });
-export async function middleware(request: NextRequest) {
- return await updateSession(request);
-}
+ if (auth.userId) {
+ // Get session from Clerk
+ const session = await auth.session;
+ if (session) {
+ // Set Supabase session using session ID
+ await supabase.auth.setSession({
+ access_token: session.id,
+ refresh_token: ""
+ });
+ }
+ }
+ return res;
+ } catch (error) {
+ console.error("Middleware error:", error);
+ return res;
+ }
+ }
+});
+
+// Ensure matcher includes all paths that need auth
export const config = {
- matcher: [
- /*
- * Match all request paths except for the ones starting with:
- * - _next/static (static files)
- * - _next/image (image optimization files)
- * - favicon.ico (favicon file)
- * Feel free to modify this pattern to include more paths.
- */
- "/((?!_next/static|_next/image|favicon.ico).*)",
- ],
+ matcher: [
+ "/((?!.+\\.[\\w]+$|_next).*)", // Match all paths except static files
+ "/", // Include root path
+ "/(api|trpc)/(.*)", // Include API routes
+ ]
};
diff --git a/next-env.d.ts b/next-env.d.ts
index 1b3be08..40c3d68 100644
--- a/next-env.d.ts
+++ b/next-env.d.ts
@@ -2,4 +2,4 @@
///
// NOTE: This file should not be edited
-// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
+// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information.
diff --git a/next.config.js b/next.config.js
index d516d01..38ae246 100644
--- a/next.config.js
+++ b/next.config.js
@@ -1,187 +1,37 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
- images: {
- domains: [
- "avatar.vercel.sh",
- "chainable.guru",
- "avatars.githubusercontent.com",
- "img.clerk.com",
- ],
- remotePatterns: [
- {
- protocol: "https",
- hostname: "**.public.blob.vercel-storage.com",
- pathname: "/**",
- },
- {
- protocol: "https",
- hostname: "**.vercel-storage.com",
- pathname: "/**",
- },
- {
- protocol: "https",
- hostname: "avatar.vercel.sh",
- pathname: "/**",
- },
- {
- protocol: "https",
- hostname: "avatars.githubusercontent.com",
- pathname: "/**",
- },
- {
- protocol: "https",
- hostname: "img.clerk.com",
- pathname: "/**",
- },
- {
- protocol: "https",
- hostname: "**.vercel.app",
- pathname: "/**",
- },
- // Add blockchain-specific patterns
- {
- protocol: "https",
- hostname: "**.opensea.io",
- pathname: "/**",
- },
- {
- protocol: "https",
- hostname: "**.nftstorage.link",
- pathname: "/**",
- },
- {
- protocol: "https",
- hostname: "ipfs.io",
- pathname: "/**",
- },
- ],
- // Configure local image handling
- dangerouslyAllowSVG: true,
- contentDispositionType: "attachment",
- contentSecurityPolicy: "default-src 'self'; script-src 'none'; sandbox;",
- // Optimize images
- deviceSizes: [640, 750, 828, 1080, 1200, 1920],
- imageSizes: [16, 32, 48, 64, 96, 128, 256],
- formats: ["image/webp", "image/avif"],
- minimumCacheTTL: 60 * 60 * 24 * 30, // 30 days
- // Allow local logos
- loader: "default",
- loaderFile: undefined,
- path: "/_next/image",
- disableStaticImages: false,
- unoptimized: process.env.NODE_ENV === "production",
- },
- // Other config
- typescript: {
- ignoreBuildErrors: true,
- },
- experimental: {
- serverActions: {
- allowedOrigins: ["localhost:3000", "chainable.guru"],
- bodySizeLimit: "2mb",
- },
- },
- // Add webpack configuration for handling local images
- webpack(config) {
- config.module.rules.push({
- test: /\.(png|jpe?g|gif|svg|webp|avif)$/i,
- issuer: /\.[jt]sx?$/,
- use: [
- {
- loader: "url-loader",
- options: {
- limit: 10000,
- name: "static/media/[name].[hash:8].[ext]",
- publicPath: "/_next",
- },
- },
- ],
- });
-
- return config;
- },
- // Add public directory handling
- async rewrites() {
- return [
- {
- source: "/favicon.ico",
- destination: "/public/favicon.ico",
- },
- {
- source: "/logos/:path*",
- destination: "/public/logos/:path*",
- },
- {
- source: "/api/search/:path*",
- destination: "https://api.duckduckgo.com/:path*",
- },
- {
- source: "/api/opensearch/:path*",
- destination: "https://api.bing.microsoft.com/:path*",
- },
- ];
- },
- // Add headers for cache control
async headers() {
return [
{
- source: "/favicon.ico",
+ source: '/:path*',
headers: [
{
- key: "Cache-Control",
- value: "public, max-age=31536000, immutable",
+ key: 'Cross-Origin-Opener-Policy',
+ value: 'same-origin-allow-popups'
},
- ],
- },
- {
- source: "/icon.svg",
- headers: [
{
- key: "Cache-Control",
- value: "public, max-age=31536000, immutable",
+ key: 'Cross-Origin-Embedder-Policy',
+ value: 'credentialless'
},
- ],
- },
- {
- source: "/api/search/:path*",
- headers: [
{
- key: "Access-Control-Allow-Origin",
- value: "*",
- },
+ key: 'Cross-Origin-Resource-Policy',
+ value: 'cross-origin'
+ }
],
},
+ ]
+ },
+ images: {
+ remotePatterns: [
{
- source: "/(.*).(jpg|jpeg|png|webp|avif|ico|svg)",
- headers: [
- {
- key: "Cache-Control",
- value: "public, max-age=31536000, immutable",
- },
- ],
+ protocol: 'https',
+ hostname: '**',
},
- ];
- },
- // Add webpack configuration for static files
- webpack(config) {
- config.module.rules.push({
- test: /\.(ico|png|jpe?g|gif|svg|webp|avif)$/i,
- issuer: /\.[jt]sx?$/,
- use: [
- {
- loader: "url-loader",
- options: {
- limit: 10000,
- name: "static/media/[name].[hash:8].[ext]",
- publicPath: "/_next",
- fallback: "file-loader",
- },
- },
- ],
- });
-
- return config;
+ ],
},
-};
+ experimental: {
+ optimizePackageImports: ['@rainbow-me/rainbowkit'],
+ }
+}
-module.exports = nextConfig;
+module.exports = nextConfig
diff --git a/package.json b/package.json
index b898209..1cf6aec 100644
--- a/package.json
+++ b/package.json
@@ -4,24 +4,30 @@
"private": true,
"scripts": {
"dev": "next dev",
- "build": "pnpm setup-favicons && next build",
+ "build": "pnpm run setup-favicons && pnpm run optimize-images && next build",
"start": "next start",
"lint": "next lint",
"test": "vitest run",
"setup-favicons": "pnpm optimize-images && tsx scripts/setup-favicons.ts",
"optimize-images": "tsx scripts/optimize-images.ts",
- "biome:clean": "npx biome format --write && npx biome lint --fix"
+ "biome:clean": "npx biome format --write && npx biome lint --fix",
+ "clean": "rimraf dist .next"
},
"dependencies": {
"@ai-sdk/openai": "^0.0.60",
+ "@ai-sdk/ui-utils": "^1.0.2",
+ "@clerk/nextjs": "5.0.0-beta.35",
"@coinbase/coinbase-sdk": "^0.10.0",
+ "@hookform/resolvers": "^3.9.1",
"@radix-ui/react-alert-dialog": "^1.1.2",
"@radix-ui/react-avatar": "^1.1.1",
"@radix-ui/react-dialog": "^1.1.2",
"@radix-ui/react-dropdown-menu": "^2.1.2",
+ "@radix-ui/react-hover-card": "^1.1.2",
"@radix-ui/react-icons": "^1.3.2",
"@radix-ui/react-label": "^2.1.0",
"@radix-ui/react-progress": "^1.1.0",
+ "@radix-ui/react-scroll-area": "^1.2.1",
"@radix-ui/react-select": "^2.1.2",
"@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slot": "^1.1.0",
@@ -29,14 +35,16 @@
"@radix-ui/react-tooltip": "^1.1.4",
"@radix-ui/react-visually-hidden": "^1.1.0",
"@rainbow-me/rainbowkit": "^2.2.0",
+ "@supabase/auth-helpers-nextjs": "^0.10.0",
"@supabase/ssr": "^0.5.2",
"@supabase/supabase-js": "^2.46.1",
- "@tanstack/react-query": "^5.61.0",
+ "@tanstack/react-query": "^5.61.3",
+ "@types/uuid": "^10.0.0",
"@vercel/analytics": "^1.4.1",
"@vercel/blob": "^0.26.0",
"@vercel/kv": "^3.0.0",
"@web3modal/wagmi": "^5.1.11",
- "ai": "3.4.33",
+ "ai": "4.0.3",
"chalk": "^5.3.0",
"class-variance-authority": "^0.7.0",
"classnames": "^2.5.1",
@@ -49,9 +57,10 @@
"framer-motion": "^11.11.17",
"geist": "^1.3.1",
"gpt3-tokenizer": "^1.1.5",
- "lucide-react": "^0.446.0",
+ "lru-cache": "^11.0.2",
+ "lucide-react": "^0.460.0",
"nanoid": "^5.0.8",
- "next": "15.0.4-canary.15",
+ "next": "15.0.3",
"next-themes": "^0.3.0",
"orderedmap": "^2.1.1",
"prosemirror-example-setup": "^1.2.3",
@@ -61,18 +70,23 @@
"prosemirror-schema-basic": "^1.2.3",
"prosemirror-schema-list": "^1.4.1",
"prosemirror-state": "^1.4.3",
- "prosemirror-view": "^1.36.0",
+ "prosemirror-view": "^1.37.0",
"react": "18.2.0",
"react-dom": "18.2.0",
+ "react-hook-form": "^7.53.2",
+ "react-icons": "^5.3.0",
+ "react-intersection-observer": "^9.13.1",
"react-markdown": "^9.0.1",
"remark-gfm": "^4.0.0",
+ "rimraf": "^6.0.1",
"server-only": "^0.0.1",
"sonner": "^1.7.0",
"swr": "^2.2.5",
- "tailwind-merge": "^2.5.4",
+ "tailwind-merge": "^2.5.5",
"tailwindcss-animate": "^1.0.7",
"usehooks-ts": "^3.1.0",
- "viem": "^2.21.49",
+ "uuid": "^11.0.3",
+ "viem": "^2.21.50",
"wagmi": "^2.13.0",
"zod": "^3.23.8",
"zustand": "^5.0.1"
@@ -85,16 +99,20 @@
"@testing-library/react": "^16.0.1",
"@testing-library/user-event": "^14.5.2",
"@types/chalk": "^2.2.4",
+ "@types/classnames": "^2.3.4",
"@types/d3-scale": "^4.0.8",
"@types/jest": "^29.5.14",
- "@types/node": "^20.17.6",
+ "@types/node": "^22.9.3",
"@types/pdf-parse": "^1.1.4",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@types/testing-library__jest-dom": "^6.0.0",
+ "@typescript-eslint/eslint-plugin": "^8.15.0",
+ "@typescript-eslint/parser": "^8.15.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitest/coverage-v8": "^0.34.6",
"@vitest/ui": "^2.1.5",
+ "autoprefixer": "^10.4.20",
"encoding": "^0.1.13",
"eslint": "^8.57.1",
"eslint-config-next": "14.2.5",
@@ -106,11 +124,12 @@
"pino-pretty": "^13.0.0",
"postcss": "^8.4.49",
"prettier": "^3.3.3",
+ "prettier-plugin-tailwindcss": "^0.6.9",
"react-error-boundary": "^4.1.2",
"sharp": "^0.32.6",
"tailwindcss": "^3.4.15",
"tsx": "^4.19.2",
- "typescript": "^5.6.3",
+ "typescript": "^5.7.2",
"vite-tsconfig-paths": "^4.3.2",
"vitest": "^2.1.5"
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c5fa35b..3b059bc 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -11,9 +11,18 @@ importers:
'@ai-sdk/openai':
specifier: ^0.0.60
version: 0.0.60(zod@3.23.8)
+ '@ai-sdk/ui-utils':
+ specifier: ^1.0.2
+ version: 1.0.2(zod@3.23.8)
+ '@clerk/nextjs':
+ specifier: 5.0.0-beta.35
+ version: 5.0.0-beta.35(eslint@8.57.1)(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.7.2)
'@coinbase/coinbase-sdk':
specifier: ^0.10.0
- version: 0.10.0(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ version: 0.10.0(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
+ '@hookform/resolvers':
+ specifier: ^3.9.1
+ version: 3.9.1(react-hook-form@7.53.2(react@18.2.0))
'@radix-ui/react-alert-dialog':
specifier: ^1.1.2
version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
@@ -26,6 +35,9 @@ importers:
'@radix-ui/react-dropdown-menu':
specifier: ^2.1.2
version: 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@radix-ui/react-hover-card':
+ specifier: ^1.1.2
+ version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-icons':
specifier: ^1.3.2
version: 1.3.2(react@18.2.0)
@@ -35,6 +47,9 @@ importers:
'@radix-ui/react-progress':
specifier: ^1.1.0
version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@radix-ui/react-scroll-area':
+ specifier: ^1.2.1
+ version: 1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-select':
specifier: ^2.1.2
version: 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
@@ -55,7 +70,10 @@ importers:
version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@rainbow-me/rainbowkit':
specifier: ^2.2.0
- version: 2.2.0(@tanstack/react-query@5.61.0(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.13.0(@tanstack/query-core@5.60.6)(@tanstack/react-query@5.61.0(react@18.2.0))(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))
+ version: 2.2.0(@tanstack/react-query@5.61.3(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.13.0(@tanstack/query-core@5.60.6)(@tanstack/react-query@5.61.3(react@18.2.0))(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))
+ '@supabase/auth-helpers-nextjs':
+ specifier: ^0.10.0
+ version: 0.10.0(@supabase/supabase-js@2.46.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))
'@supabase/ssr':
specifier: ^0.5.2
version: 0.5.2(@supabase/supabase-js@2.46.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))
@@ -63,11 +81,14 @@ importers:
specifier: ^2.46.1
version: 2.46.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)
'@tanstack/react-query':
- specifier: ^5.61.0
- version: 5.61.0(react@18.2.0)
+ specifier: ^5.61.3
+ version: 5.61.3(react@18.2.0)
+ '@types/uuid':
+ specifier: ^10.0.0
+ version: 10.0.0
'@vercel/analytics':
specifier: ^1.4.1
- version: 1.4.1(next@15.0.4-canary.15(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)(svelte@5.2.3)(vue@3.5.13(typescript@5.6.3))
+ version: 1.4.1(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)(svelte@5.2.3)(vue@3.5.13(typescript@5.7.2))
'@vercel/blob':
specifier: ^0.26.0
version: 0.26.0
@@ -76,10 +97,10 @@ importers:
version: 3.0.0
'@web3modal/wagmi':
specifier: ^5.1.11
- version: 5.1.11(aaf5leqjl3fvobyhzmbv555pdm)
+ version: 5.1.11(khz7a4tilad7asw4ut42zuqh3y)
ai:
- specifier: 3.4.33
- version: 3.4.33(react@18.2.0)(sswr@2.1.0(svelte@5.2.3))(svelte@5.2.3)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8)
+ specifier: 4.0.3
+ version: 4.0.3(react@18.2.0)(zod@3.23.8)
chalk:
specifier: ^5.3.0
version: 5.3.0
@@ -112,19 +133,22 @@ importers:
version: 11.11.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
geist:
specifier: ^1.3.1
- version: 1.3.1(next@15.0.4-canary.15(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))
+ version: 1.3.1(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))
gpt3-tokenizer:
specifier: ^1.1.5
version: 1.1.5
+ lru-cache:
+ specifier: ^11.0.2
+ version: 11.0.2
lucide-react:
- specifier: ^0.446.0
- version: 0.446.0(react@18.2.0)
+ specifier: ^0.460.0
+ version: 0.460.0(react@18.2.0)
nanoid:
specifier: ^5.0.8
version: 5.0.8
next:
- specifier: 15.0.4-canary.15
- version: 15.0.4-canary.15(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ specifier: 15.0.3
+ version: 15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
next-themes:
specifier: ^0.3.0
version: 0.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
@@ -153,20 +177,32 @@ importers:
specifier: ^1.4.3
version: 1.4.3
prosemirror-view:
- specifier: ^1.36.0
- version: 1.36.0
+ specifier: ^1.37.0
+ version: 1.37.0
react:
specifier: 18.2.0
version: 18.2.0
react-dom:
specifier: 18.2.0
version: 18.2.0(react@18.2.0)
+ react-hook-form:
+ specifier: ^7.53.2
+ version: 7.53.2(react@18.2.0)
+ react-icons:
+ specifier: ^5.3.0
+ version: 5.3.0(react@18.2.0)
+ react-intersection-observer:
+ specifier: ^9.13.1
+ version: 9.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react-markdown:
specifier: ^9.0.1
version: 9.0.1(@types/react@18.3.12)(react@18.2.0)
remark-gfm:
specifier: ^4.0.0
version: 4.0.0
+ rimraf:
+ specifier: ^6.0.1
+ version: 6.0.1
server-only:
specifier: ^0.0.1
version: 0.0.1
@@ -177,20 +213,23 @@ importers:
specifier: ^2.2.5
version: 2.2.5(react@18.2.0)
tailwind-merge:
- specifier: ^2.5.4
- version: 2.5.4
+ specifier: ^2.5.5
+ version: 2.5.5
tailwindcss-animate:
specifier: ^1.0.7
version: 1.0.7(tailwindcss@3.4.15)
usehooks-ts:
specifier: ^3.1.0
version: 3.1.0(react@18.2.0)
+ uuid:
+ specifier: ^11.0.3
+ version: 11.0.3
viem:
- specifier: ^2.21.49
- version: 2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ specifier: ^2.21.50
+ version: 2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
wagmi:
specifier: ^2.13.0
- version: 2.13.0(@tanstack/query-core@5.60.6)(@tanstack/react-query@5.61.0(react@18.2.0))(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
+ version: 2.13.0(@tanstack/query-core@5.60.6)(@tanstack/react-query@5.61.3(react@18.2.0))(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
zod:
specifier: ^3.23.8
version: 3.23.8
@@ -203,7 +242,7 @@ importers:
version: 1.9.4
'@svgr/webpack':
specifier: ^8.1.0
- version: 8.1.0(typescript@5.6.3)
+ version: 8.1.0(typescript@5.7.2)
'@tailwindcss/typography':
specifier: ^0.5.15
version: 0.5.15(tailwindcss@3.4.15)
@@ -219,6 +258,9 @@ importers:
'@types/chalk':
specifier: ^2.2.4
version: 2.2.4
+ '@types/classnames':
+ specifier: ^2.3.4
+ version: 2.3.4
'@types/d3-scale':
specifier: ^4.0.8
version: 4.0.8
@@ -226,8 +268,8 @@ importers:
specifier: ^29.5.14
version: 29.5.14
'@types/node':
- specifier: ^20.17.6
- version: 20.17.6
+ specifier: ^22.9.3
+ version: 22.9.3
'@types/pdf-parse':
specifier: ^1.1.4
version: 1.1.4
@@ -240,15 +282,24 @@ importers:
'@types/testing-library__jest-dom':
specifier: ^6.0.0
version: 6.0.0
+ '@typescript-eslint/eslint-plugin':
+ specifier: ^8.15.0
+ version: 8.15.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)
+ '@typescript-eslint/parser':
+ specifier: ^8.15.0
+ version: 8.15.0(eslint@8.57.1)(typescript@5.7.2)
'@vitejs/plugin-react':
specifier: ^4.3.3
- version: 4.3.3(vite@5.4.11(@types/node@20.17.6)(terser@5.36.0))
+ version: 4.3.3(vite@5.4.11(@types/node@22.9.3)(terser@5.36.0))
'@vitest/coverage-v8':
specifier: ^0.34.6
version: 0.34.6(vitest@2.1.5)
'@vitest/ui':
specifier: ^2.1.5
version: 2.1.5(vitest@2.1.5)
+ autoprefixer:
+ specifier: ^10.4.20
+ version: 10.4.20(postcss@8.4.49)
encoding:
specifier: ^0.1.13
version: 0.1.13
@@ -257,16 +308,16 @@ importers:
version: 8.57.1
eslint-config-next:
specifier: 14.2.5
- version: 14.2.5(eslint@8.57.1)(typescript@5.6.3)
+ version: 14.2.5(eslint@8.57.1)(typescript@5.7.2)
eslint-config-prettier:
specifier: ^9.1.0
version: 9.1.0(eslint@8.57.1)
eslint-import-resolver-typescript:
specifier: ^3.6.3
- version: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ version: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1)
eslint-plugin-import:
specifier: ^2.31.0
- version: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ version: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
eslint-plugin-tailwindcss:
specifier: ^3.17.5
version: 3.17.5(tailwindcss@3.4.15)
@@ -282,6 +333,9 @@ importers:
prettier:
specifier: ^3.3.3
version: 3.3.3
+ prettier-plugin-tailwindcss:
+ specifier: ^0.6.9
+ version: 0.6.9(prettier@3.3.3)
react-error-boundary:
specifier: ^4.1.2
version: 4.1.2(react@18.2.0)
@@ -295,14 +349,14 @@ importers:
specifier: ^4.19.2
version: 4.19.2
typescript:
- specifier: ^5.6.3
- version: 5.6.3
+ specifier: ^5.7.2
+ version: 5.7.2
vite-tsconfig-paths:
specifier: ^4.3.2
- version: 4.3.2(typescript@5.6.3)(vite@5.4.11(@types/node@20.17.6)(terser@5.36.0))
+ version: 4.3.2(typescript@5.7.2)(vite@5.4.11(@types/node@22.9.3)(terser@5.36.0))
vitest:
specifier: ^2.1.5
- version: 2.1.5(@types/node@20.17.6)(@vitest/ui@2.1.5)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.36.0)
+ version: 2.1.5(@types/node@22.9.3)(@vitest/ui@2.1.5)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.36.0)
packages:
@@ -330,8 +384,8 @@ packages:
zod:
optional: true
- '@ai-sdk/provider-utils@1.0.22':
- resolution: {integrity: sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ==}
+ '@ai-sdk/provider-utils@2.0.2':
+ resolution: {integrity: sha512-IAvhKhdlXqiSmvx/D4uNlFYCl8dWT+M9K+IuEcSgnE2Aj27GWu8sDIpAf4r4Voc+wOUkOECVKQhFo8g9pozdjA==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.0.0
@@ -343,12 +397,12 @@ packages:
resolution: {integrity: sha512-oAc49O5+xypVrKM7EUU5P/Y4DUL4JZUWVxhejoAVOTOl3WZUEWsMbP3QZR+TrimQIsS0WR/n9UuF6U0jPdp0tQ==}
engines: {node: '>=18'}
- '@ai-sdk/provider@0.0.26':
- resolution: {integrity: sha512-dQkfBDs2lTYpKM8389oopPdQgIU007GQyCbuPPrV+K6MtSII3HBfE0stUIMXUb44L+LK1t6GXPP7wjSzjO6uKg==}
+ '@ai-sdk/provider@1.0.1':
+ resolution: {integrity: sha512-mV+3iNDkzUsZ0pR2jG0sVzU6xtQY5DtSCBy3JFycLp6PwjyLw/iodfL3MwdmMCRJWgs3dadcHejRnMvF9nGTBg==}
engines: {node: '>=18'}
- '@ai-sdk/react@0.0.70':
- resolution: {integrity: sha512-GnwbtjW4/4z7MleLiW+TOZC2M29eCg1tOUpuEiYFMmFNZK8mkrqM0PFZMo6UsYeUYMWqEOOcPOU9OQVJMJh7IQ==}
+ '@ai-sdk/react@1.0.2':
+ resolution: {integrity: sha512-VQfQ6PMiUz4hDquAfjih0DIw4gsQvRFk91SFg2xWirDO4swMZByJzqGGcILPQKbww5ndCo48iZj9S1mLKZo5Dg==}
engines: {node: '>=18'}
peerDependencies:
react: ^18 || ^19 || ^19.0.0-rc
@@ -359,26 +413,8 @@ packages:
zod:
optional: true
- '@ai-sdk/solid@0.0.54':
- resolution: {integrity: sha512-96KWTVK+opdFeRubqrgaJXoNiDP89gNxFRWUp0PJOotZW816AbhUf4EnDjBjXTLjXL1n0h8tGSE9sZsRkj9wQQ==}
- engines: {node: '>=18'}
- peerDependencies:
- solid-js: ^1.7.7
- peerDependenciesMeta:
- solid-js:
- optional: true
-
- '@ai-sdk/svelte@0.0.57':
- resolution: {integrity: sha512-SyF9ItIR9ALP9yDNAD+2/5Vl1IT6kchgyDH8xkmhysfJI6WrvJbtO1wdQ0nylvPLcsPoYu+cAlz1krU4lFHcYw==}
- engines: {node: '>=18'}
- peerDependencies:
- svelte: ^3.0.0 || ^4.0.0 || ^5.0.0
- peerDependenciesMeta:
- svelte:
- optional: true
-
- '@ai-sdk/ui-utils@0.0.50':
- resolution: {integrity: sha512-Z5QYJVW+5XpSaJ4jYCCAVG7zIAuKOOdikhgpksneNmKvx61ACFaf98pmOd+xnjahl0pIlc/QIe6O4yVaJ1sEaw==}
+ '@ai-sdk/ui-utils@1.0.2':
+ resolution: {integrity: sha512-hHrUdeThGHu/rsGZBWQ9PjrAU9Htxgbo9MFyR5B/aWoNbBeXn1HLMY1+uMEnXL5pRPlmyVRjgIavWg7UgeNDOw==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.0.0
@@ -386,15 +422,6 @@ packages:
zod:
optional: true
- '@ai-sdk/vue@0.0.59':
- resolution: {integrity: sha512-+ofYlnqdc8c4F6tM0IKF0+7NagZRAiqBJpGDJ+6EYhDW8FHLUP/JFBgu32SjxSxC6IKFZxEnl68ZoP/Z38EMlw==}
- engines: {node: '>=18'}
- peerDependencies:
- vue: ^3.3.4
- peerDependenciesMeta:
- vue:
- optional: true
-
'@alloc/quick-lru@5.2.0':
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
@@ -1165,6 +1192,41 @@ packages:
cpu: [x64]
os: [win32]
+ '@clerk/backend@1.0.0-beta.29':
+ resolution: {integrity: sha512-sa+Sg1kvEE2uJsQm/LwDLJ5uXlJIW6MH+NeXJd5umB+vzZaZ6JAvaZjMROrMVn6CWKyUj/JpGvBmXBTKul4Xsg==}
+ engines: {node: '>=18.17.0'}
+
+ '@clerk/clerk-react@5.0.0-beta.31':
+ resolution: {integrity: sha512-pjwudUQ81AbZGVpruSPgGoLaomJAHyLK1rJ/hdGpoYoPtIuh5v2M+wAQ/nmXrh53UpqlwH6MRCOeEdo2p/pdZw==}
+ engines: {node: '>=18.17.0'}
+ peerDependencies:
+ react: '>=18'
+ react-dom: '>=18'
+
+ '@clerk/nextjs@5.0.0-beta.35':
+ resolution: {integrity: sha512-t88owhvwVE3TmjtuQlcWqhtibEMjGO3tIlqTCsx+mLPA5H1OXEtBu9R0rZ6gc8jqUqCCElN5osYnV5bhX+N8sw==}
+ engines: {node: '>=18.17.0'}
+ peerDependencies:
+ next: ^13.5.4 || ^14.0.3
+ react: '>=18'
+ react-dom: '>=18'
+
+ '@clerk/shared@2.0.0-beta.19':
+ resolution: {integrity: sha512-YC/qTHli/FTlreI8LHAFa+gK5YYw9ilv1Ey6BM1TMXCj1reJTHtRcZp3xNUYSWwVH3HOLz9Eayonv1Z7uNyi7Q==}
+ engines: {node: '>=18.17.0'}
+ peerDependencies:
+ react: '>=18'
+ react-dom: '>=18'
+ peerDependenciesMeta:
+ react:
+ optional: true
+ react-dom:
+ optional: true
+
+ '@clerk/types@4.0.0-beta.21':
+ resolution: {integrity: sha512-q3VWFkmU43r41yqX2YciIIObvLk5BqOVcz1rrko4uslOJPnb/tXOP02VEb/xRi6Kz/OqnHrM7nqY1OBrJ+3uog==}
+ engines: {node: '>=18.17.0'}
+
'@coinbase/coinbase-sdk@0.10.0':
resolution: {integrity: sha512-sqLH7dE/0XSn5jHddjVrC1PR77sQUEytYcQAlH2d8STqRARcvddxVAByECUIL32MpbdJY7Wca3KfSa6qo811Mg==}
@@ -1521,6 +1583,11 @@ packages:
'@floating-ui/utils@0.2.8':
resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
+ '@hookform/resolvers@3.9.1':
+ resolution: {integrity: sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==}
+ peerDependencies:
+ react-hook-form: ^7.0.0
+
'@humanwhocodes/config-array@0.13.0':
resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==}
engines: {node: '>=10.10.0'}
@@ -1827,62 +1894,65 @@ packages:
resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==}
deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion
- '@next/env@15.0.4-canary.15':
- resolution: {integrity: sha512-BtgsRAzmBB/z8T1gxIRJ7nIBHqmyBuxC8icrxiq8yEuxBv5kC1Tp/cZhv8Xtmjn50yUnXV6Ef4owcNij3xOIWg==}
+ '@next/env@15.0.3':
+ resolution: {integrity: sha512-t9Xy32pjNOvVn2AS+Utt6VmyrshbpfUMhIjFO60gI58deSo/KgLOp31XZ4O+kY/Is8WAGYwA5gR7kOb1eORDBA==}
+
+ '@next/eslint-plugin-next@12.3.4':
+ resolution: {integrity: sha512-BFwj8ykJY+zc1/jWANsDprDIu2MgwPOIKxNVnrKvPs+f5TPegrVnem8uScND+1veT4B7F6VeqgaNLFW1Hzl9Og==}
'@next/eslint-plugin-next@14.2.5':
resolution: {integrity: sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==}
- '@next/swc-darwin-arm64@15.0.4-canary.15':
- resolution: {integrity: sha512-Jvsp87MQS7iXVuB/9kwOZD6gyRehsMadnii+Gm29TZ5+h4Ma3rDm2bQ4obG6Drqcq/fJqxD7G3FSFRfsAQmNMw==}
+ '@next/swc-darwin-arm64@15.0.3':
+ resolution: {integrity: sha512-s3Q/NOorCsLYdCKvQlWU+a+GeAd3C8Rb3L1YnetsgwXzhc3UTWrtQpB/3eCjFOdGUj5QmXfRak12uocd1ZiiQw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@15.0.4-canary.15':
- resolution: {integrity: sha512-NGZsh2yoCLa0vOerPRIEBWOx9CQuWlQ+bojvIls9HdYqq5vlHwSAwL3P0Pk+6RMcSSJOqftif9T8hSSMQ3VkYA==}
+ '@next/swc-darwin-x64@15.0.3':
+ resolution: {integrity: sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@next/swc-linux-arm64-gnu@15.0.4-canary.15':
- resolution: {integrity: sha512-LJvQocH6z4aYK/GpaJPo/yFTdmcp22sTc2KWcBY52Py8BDSbFNcfcNH0CfbpCfahNHE3fi5P0kRdYGXHf17peg==}
+ '@next/swc-linux-arm64-gnu@15.0.3':
+ resolution: {integrity: sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-arm64-musl@15.0.4-canary.15':
- resolution: {integrity: sha512-RFrifoe6/Fhg6EEbMHne4kwUwnMIx4Y4kzx/t+WtZ7fXWfX2AGxLWPvt38hl+52W1rQG081ojZTdjnUseu3i+g==}
+ '@next/swc-linux-arm64-musl@15.0.3':
+ resolution: {integrity: sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-x64-gnu@15.0.4-canary.15':
- resolution: {integrity: sha512-6yJ7NqpgBJo1+ce2Z9NJNLnK6dyZ/d5GFi9ywh19y1GnkVp45DgqhceN+emiAVwrloGxG9+HrroHhqhjck5g0Q==}
+ '@next/swc-linux-x64-gnu@15.0.3':
+ resolution: {integrity: sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-linux-x64-musl@15.0.4-canary.15':
- resolution: {integrity: sha512-ggqoXBngdE4UwstjiZHpFqtQQAjad94MjX5SsMG6yZd46HcYYbDaJruxu0pi4sHadBRUMk2a0Iow7CKHo1xxfw==}
+ '@next/swc-linux-x64-musl@15.0.3':
+ resolution: {integrity: sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-win32-arm64-msvc@15.0.4-canary.15':
- resolution: {integrity: sha512-fPy50XiFBtVykSLYtewdMrrBSrQWOhB0y6+94Jc0S9yVCScS5TpiMtgvPtEWQuNI3+D3GfTzMNo0O6YDP/wg+w==}
+ '@next/swc-win32-arm64-msvc@15.0.3':
+ resolution: {integrity: sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@next/swc-win32-x64-msvc@15.0.4-canary.15':
- resolution: {integrity: sha512-wYaYlBtvEmddtccbnSVQSw+JoxYm2JaQ+sjCs/hTY1z+Qg3n6ssE4LX4af49IU0bBREaOHIXAGsRIjJgIv94sw==}
+ '@next/swc-win32-x64-msvc@15.0.3':
+ resolution: {integrity: sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
- '@noble/ciphers@1.0.0':
- resolution: {integrity: sha512-wH5EHOmLi0rEazphPbecAzmjd12I6/Yv/SiHdkA9LSycsQk7RuuTp7am5/o62qYr0RScE7Pc9icXGBbsr6cesA==}
+ '@noble/ciphers@1.1.0':
+ resolution: {integrity: sha512-gwcX7IKSuCtlepJVa6sDLMB2EDaoLguFL6HxagKeFIzWGRfFE3mwcHs8mjx4yQY+rV736XGBhfl6Lw80YrTDTw==}
engines: {node: ^14.21.3 || >=16}
'@noble/curves@1.2.0':
@@ -1895,6 +1965,10 @@ packages:
resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==}
engines: {node: ^14.21.3 || >=16}
+ '@noble/curves@1.7.0':
+ resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==}
+ engines: {node: ^14.21.3 || >=16}
+
'@noble/hashes@1.3.2':
resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==}
engines: {node: '>= 16'}
@@ -1907,6 +1981,14 @@ packages:
resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==}
engines: {node: ^14.21.3 || >=16}
+ '@noble/hashes@1.6.0':
+ resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==}
+ engines: {node: ^14.21.3 || >=16}
+
+ '@noble/hashes@1.6.1':
+ resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==}
+ engines: {node: ^14.21.3 || >=16}
+
'@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -2177,6 +2259,19 @@ packages:
'@types/react-dom':
optional: true
+ '@radix-ui/react-hover-card@1.1.2':
+ resolution: {integrity: sha512-Y5w0qGhysvmqsIy6nQxaPa6mXNKznfoGjOfBgzOjocLxr2XlSjqBMYQQL+FfyogsMuX+m8cZyQGYhJxvxUzO4w==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@radix-ui/react-icons@1.3.2':
resolution: {integrity: sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==}
peerDependencies:
@@ -2295,6 +2390,19 @@ packages:
'@types/react-dom':
optional: true
+ '@radix-ui/react-scroll-area@1.2.1':
+ resolution: {integrity: sha512-FnM1fHfCtEZ1JkyfH/1oMiTcFBQvHKl4vD9WnpwkLgtF+UmnXMCad6ECPTaAjcDjam+ndOEJWgHyKDGNteWSHw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@radix-ui/react-select@2.1.2':
resolution: {integrity: sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==}
peerDependencies:
@@ -2510,93 +2618,93 @@ packages:
'@types/react':
optional: true
- '@rollup/rollup-android-arm-eabi@4.27.3':
- resolution: {integrity: sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==}
+ '@rollup/rollup-android-arm-eabi@4.27.4':
+ resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==}
cpu: [arm]
os: [android]
- '@rollup/rollup-android-arm64@4.27.3':
- resolution: {integrity: sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==}
+ '@rollup/rollup-android-arm64@4.27.4':
+ resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==}
cpu: [arm64]
os: [android]
- '@rollup/rollup-darwin-arm64@4.27.3':
- resolution: {integrity: sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==}
+ '@rollup/rollup-darwin-arm64@4.27.4':
+ resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.27.3':
- resolution: {integrity: sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==}
+ '@rollup/rollup-darwin-x64@4.27.4':
+ resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-freebsd-arm64@4.27.3':
- resolution: {integrity: sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==}
+ '@rollup/rollup-freebsd-arm64@4.27.4':
+ resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==}
cpu: [arm64]
os: [freebsd]
- '@rollup/rollup-freebsd-x64@4.27.3':
- resolution: {integrity: sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==}
+ '@rollup/rollup-freebsd-x64@4.27.4':
+ resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==}
cpu: [x64]
os: [freebsd]
- '@rollup/rollup-linux-arm-gnueabihf@4.27.3':
- resolution: {integrity: sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==}
+ '@rollup/rollup-linux-arm-gnueabihf@4.27.4':
+ resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm-musleabihf@4.27.3':
- resolution: {integrity: sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==}
+ '@rollup/rollup-linux-arm-musleabihf@4.27.4':
+ resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm64-gnu@4.27.3':
- resolution: {integrity: sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==}
+ '@rollup/rollup-linux-arm64-gnu@4.27.4':
+ resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-arm64-musl@4.27.3':
- resolution: {integrity: sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==}
+ '@rollup/rollup-linux-arm64-musl@4.27.4':
+ resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-powerpc64le-gnu@4.27.3':
- resolution: {integrity: sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==}
+ '@rollup/rollup-linux-powerpc64le-gnu@4.27.4':
+ resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==}
cpu: [ppc64]
os: [linux]
- '@rollup/rollup-linux-riscv64-gnu@4.27.3':
- resolution: {integrity: sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==}
+ '@rollup/rollup-linux-riscv64-gnu@4.27.4':
+ resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==}
cpu: [riscv64]
os: [linux]
- '@rollup/rollup-linux-s390x-gnu@4.27.3':
- resolution: {integrity: sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==}
+ '@rollup/rollup-linux-s390x-gnu@4.27.4':
+ resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==}
cpu: [s390x]
os: [linux]
- '@rollup/rollup-linux-x64-gnu@4.27.3':
- resolution: {integrity: sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==}
+ '@rollup/rollup-linux-x64-gnu@4.27.4':
+ resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-linux-x64-musl@4.27.3':
- resolution: {integrity: sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==}
+ '@rollup/rollup-linux-x64-musl@4.27.4':
+ resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-win32-arm64-msvc@4.27.3':
- resolution: {integrity: sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==}
+ '@rollup/rollup-win32-arm64-msvc@4.27.4':
+ resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==}
cpu: [arm64]
os: [win32]
- '@rollup/rollup-win32-ia32-msvc@4.27.3':
- resolution: {integrity: sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==}
+ '@rollup/rollup-win32-ia32-msvc@4.27.4':
+ resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==}
cpu: [ia32]
os: [win32]
- '@rollup/rollup-win32-x64-msvc@4.27.3':
- resolution: {integrity: sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==}
+ '@rollup/rollup-win32-x64-msvc@4.27.4':
+ resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==}
cpu: [x64]
os: [win32]
@@ -2612,19 +2720,25 @@ packages:
'@safe-global/safe-apps-sdk@9.1.0':
resolution: {integrity: sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==}
- '@safe-global/safe-gateway-typescript-sdk@3.22.3':
- resolution: {integrity: sha512-aDb/FpkJMZ2IvP5KULHXnCRVVYOhEEY4BAwrGfsuTXqp8g8s2oAsBoBYJfaN9rWI/QDkd5Wn3GTC0ZeOLW1NiQ==}
+ '@safe-global/safe-gateway-typescript-sdk@3.22.4':
+ resolution: {integrity: sha512-Z7Z8w3GEJdJ/paF+NK23VN4AwqWPadq0AeRYjYLjIBiPWpRB2UO/FKq7ONABEq0YFgNPklazIV4IExQU1gavXA==}
engines: {node: '>=16'}
'@scure/base@1.1.9':
resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==}
+ '@scure/base@1.2.1':
+ resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==}
+
'@scure/bip32@1.4.0':
resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==}
'@scure/bip32@1.5.0':
resolution: {integrity: sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==}
+ '@scure/bip32@1.6.0':
+ resolution: {integrity: sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA==}
+
'@scure/bip39@1.3.0':
resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==}
@@ -2697,6 +2811,16 @@ packages:
'@stablelib/x25519@1.0.3':
resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==}
+ '@supabase/auth-helpers-nextjs@0.10.0':
+ resolution: {integrity: sha512-2dfOGsM4yZt0oS4TPiE7bD4vf7EVz7NRz/IJrV6vLg0GP7sMUx8wndv2euLGq4BjN9lUCpu6DG/uCC8j+ylwPg==}
+ peerDependencies:
+ '@supabase/supabase-js': ^2.39.8
+
+ '@supabase/auth-helpers-shared@0.7.0':
+ resolution: {integrity: sha512-FBFf2ei2R7QC+B/5wWkthMha8Ca2bWHAndN+syfuEUUfufv4mLcAgBCcgNg5nJR8L0gZfyuaxgubtOc9aW3Cpg==}
+ peerDependencies:
+ '@supabase/supabase-js': ^2.39.8
+
'@supabase/auth-js@2.65.1':
resolution: {integrity: sha512-IA7i2Xq2SWNCNMKxwmPlHafBQda0qtnFr8QnyyBr+KaSxoXXqEzFCnQ1dGTy6bsZjVBgXu++o3qrDypTspaAPw==}
@@ -2816,8 +2940,8 @@ packages:
'@tanstack/query-core@5.60.6':
resolution: {integrity: sha512-tI+k0KyCo1EBJ54vxK1kY24LWj673ujTydCZmzEZKAew4NqZzTaVQJEuaG1qKj2M03kUHN46rchLRd+TxVq/zQ==}
- '@tanstack/react-query@5.61.0':
- resolution: {integrity: sha512-SBzV27XAeCRBOQ8QcC94w2H1Md0+LI0gTWwc3qRJoaGuewKn5FNW4LSqwPFJZVEItfhMfGT7RpZuSFXjTi12pQ==}
+ '@tanstack/react-query@5.61.3':
+ resolution: {integrity: sha512-c3Oz9KaCBapGkRewu7AJLhxE9BVqpMcHsd3KtFxSd7FSCu2qGwqfIN37zbSGoyk6Ix9LGZBNHQDPI6GpWABnmA==}
peerDependencies:
react: ^18 || ^19
@@ -2873,6 +2997,10 @@ packages:
resolution: {integrity: sha512-pb/QoGqtCpH2famSp72qEsXkNzcErlVmiXlQ/ww+5AddD8TmmYS7EWg5T20YiNCAiTgs8pMf2G8SJG5h/ER1ZQ==}
deprecated: This is a stub types definition. chalk provides its own type definitions, so you do not need this installed.
+ '@types/classnames@2.3.4':
+ resolution: {integrity: sha512-dwmfrMMQb9ujX1uYGvB5ERDlOzBNywnZAZBtOe107/hORWP05ESgU4QyaanZMWYYfd2BzrG78y13/Bju8IQcMQ==}
+ deprecated: This is a stub types definition. classnames provides its own type definitions, so you do not need this installed.
+
'@types/cookie@0.6.0':
resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
@@ -2933,12 +3061,12 @@ packages:
'@types/node-forge@1.3.11':
resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
- '@types/node@20.17.6':
- resolution: {integrity: sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==}
-
'@types/node@22.7.5':
resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==}
+ '@types/node@22.9.3':
+ resolution: {integrity: sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw==}
+
'@types/pdf-parse@1.1.4':
resolution: {integrity: sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg==}
@@ -2970,6 +3098,9 @@ packages:
'@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+ '@types/uuid@10.0.0':
+ resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==}
+
'@types/ws@8.5.13':
resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==}
@@ -2979,6 +3110,27 @@ packages:
'@types/yargs@17.0.33':
resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==}
+ '@typescript-eslint/eslint-plugin@8.15.0':
+ resolution: {integrity: sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/parser@5.62.0':
+ resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
'@typescript-eslint/parser@7.2.0':
resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==}
engines: {node: ^16.0.0 || >=18.0.0}
@@ -2989,14 +3141,59 @@ packages:
typescript:
optional: true
+ '@typescript-eslint/parser@8.15.0':
+ resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/scope-manager@5.62.0':
+ resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
'@typescript-eslint/scope-manager@7.2.0':
resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==}
engines: {node: ^16.0.0 || >=18.0.0}
+ '@typescript-eslint/scope-manager@8.15.0':
+ resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/type-utils@8.15.0':
+ resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/types@5.62.0':
+ resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
'@typescript-eslint/types@7.2.0':
resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==}
engines: {node: ^16.0.0 || >=18.0.0}
+ '@typescript-eslint/types@8.15.0':
+ resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@5.62.0':
+ resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
'@typescript-eslint/typescript-estree@7.2.0':
resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==}
engines: {node: ^16.0.0 || >=18.0.0}
@@ -3006,10 +3203,37 @@ packages:
typescript:
optional: true
+ '@typescript-eslint/typescript-estree@8.15.0':
+ resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/utils@8.15.0':
+ resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/visitor-keys@5.62.0':
+ resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
'@typescript-eslint/visitor-keys@7.2.0':
resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==}
engines: {node: ^16.0.0 || >=18.0.0}
+ '@typescript-eslint/visitor-keys@8.15.0':
+ resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
'@ungap/structured-clone@1.2.0':
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
@@ -3356,24 +3580,15 @@ packages:
resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
engines: {node: '>= 14'}
- ai@3.4.33:
- resolution: {integrity: sha512-plBlrVZKwPoRTmM8+D1sJac9Bq8eaa2jiZlHLZIWekKWI1yMWYZvCCEezY9ASPwRhULYDJB2VhKOBUUeg3S5JQ==}
+ ai@4.0.3:
+ resolution: {integrity: sha512-nx5cNMldOQ72hwxL60NLtRnsmQd5Bo887Wznvxt8F5xnmjdeXRpz4ixp+0xGA88X7wiCn6c+xrhGEb9fesi/Tw==}
engines: {node: '>=18'}
peerDependencies:
- openai: ^4.42.0
react: ^18 || ^19 || ^19.0.0-rc
- sswr: ^2.1.0
- svelte: ^3.0.0 || ^4.0.0 || ^5.0.0
zod: ^3.0.0
peerDependenciesMeta:
- openai:
- optional: true
react:
optional: true
- sswr:
- optional: true
- svelte:
- optional: true
zod:
optional: true
@@ -3499,6 +3714,13 @@ packages:
resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
engines: {node: '>=8.0.0'}
+ autoprefixer@10.4.20:
+ resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+
available-typed-arrays@1.0.7:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
@@ -3599,8 +3821,8 @@ packages:
bare-path@2.1.3:
resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==}
- bare-stream@2.4.0:
- resolution: {integrity: sha512-sd96/aZ8LjF1uJbEHzIo1LrERPKRFPEy1nZ1eOILftBxrVsFDAQkimHIIq87xrHcubzjNeETsD9PwN0wp+vLiQ==}
+ bare-stream@2.4.2:
+ resolution: {integrity: sha512-XZ4ln/KV4KT+PXdIWTKjsLY+quqCaEtqqtgGJVPw9AoM73By03ij64YjepK0aQvHSWDb6AfAZwqKaFu68qkrdA==}
base-x@3.0.10:
resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==}
@@ -3734,8 +3956,8 @@ packages:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'}
- caniuse-lite@1.0.30001683:
- resolution: {integrity: sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==}
+ caniuse-lite@1.0.30001684:
+ resolution: {integrity: sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==}
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
@@ -3899,6 +4121,10 @@ packages:
cookie-es@1.2.2:
resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==}
+ cookie@0.5.0:
+ resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
+ engines: {node: '>= 0.6'}
+
cookie@0.7.2:
resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
engines: {node: '>= 0.6'}
@@ -3984,6 +4210,9 @@ packages:
resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==}
engines: {node: '>=18'}
+ csstype@3.1.1:
+ resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==}
+
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
@@ -4322,6 +4551,18 @@ packages:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
+ eslint-config-custom@0.0.0:
+ resolution: {integrity: sha512-kwCw78yisbgKdJBJ5qooPmpBYDphDfM2oxSROmtfOwBXBwXuRiSV3suO01W3mVLEFpmQZxMWd/qajKpJhkKSug==}
+
+ eslint-config-next@12.3.4:
+ resolution: {integrity: sha512-WuT3gvgi7Bwz00AOmKGhOeqnyA5P29Cdyr0iVjLyfDbk+FANQKcOjFUTZIdyYfe5Tq1x4TGcmoe4CwctGvFjHQ==}
+ peerDependencies:
+ eslint: ^7.23.0 || ^8.0.0
+ typescript: '>=3.3.1'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
eslint-config-next@14.2.5:
resolution: {integrity: sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==}
peerDependencies:
@@ -4331,6 +4572,12 @@ packages:
typescript:
optional: true
+ eslint-config-prettier@8.10.0:
+ resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==}
+ hasBin: true
+ peerDependencies:
+ eslint: '>=7.0.0'
+
eslint-config-prettier@9.1.0:
resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==}
hasBin: true
@@ -4340,6 +4587,13 @@ packages:
eslint-import-resolver-node@0.3.9:
resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+ eslint-import-resolver-typescript@2.7.1:
+ resolution: {integrity: sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: '*'
+ eslint-plugin-import: '*'
+
eslint-import-resolver-typescript@3.6.3:
resolution: {integrity: sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==}
engines: {node: ^14.18.0 || >=16.0.0}
@@ -4390,12 +4644,24 @@ packages:
peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
+ eslint-plugin-react-hooks@4.6.2:
+ resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+
eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705:
resolution: {integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==}
engines: {node: '>=10'}
peerDependencies:
eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+ eslint-plugin-react@7.28.0:
+ resolution: {integrity: sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+
eslint-plugin-react@7.37.2:
resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==}
engines: {node: '>=4'}
@@ -4416,6 +4682,10 @@ packages:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ eslint-visitor-keys@4.2.0:
+ resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
eslint@8.57.1:
resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -4505,6 +4775,10 @@ packages:
resolution: {integrity: sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==}
engines: {node: '>=14.18'}
+ eventsource-parser@3.0.0:
+ resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==}
+ engines: {node: '>=18.0.0'}
+
execa@5.1.1:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'}
@@ -4620,8 +4894,8 @@ packages:
flow-enums-runtime@0.0.6:
resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==}
- flow-parser@0.254.1:
- resolution: {integrity: sha512-dyUrQD6ZyI4PVQppj8PP5kj6BVThK8FprAcPCnJNLIZM7zcAL6/xGS1EE1haWv2HcO/dHy7GSwOAO59uaffjYw==}
+ flow-parser@0.254.2:
+ resolution: {integrity: sha512-18xCQaVdKNCY0TAEhwUdk1HmRdgsPSraWwu0Zifqo5M4Ubi9LjWTAdlfBFb07Os+fQ9TmzxlyZN6OxK0m9xrBw==}
engines: {node: '>=0.4.0'}
follow-redirects@1.15.9:
@@ -4644,6 +4918,9 @@ packages:
resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
engines: {node: '>= 6'}
+ fraction.js@4.3.7:
+ resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+
framer-motion@11.11.17:
resolution: {integrity: sha512-O8QzvoKiuzI5HSAHbcYuL6xU+ZLXbrH7C8Akaato4JzQbX2ULNeniqC2Vo5eiCtFktX9XsJ+7nUhxcl2E2IjpA==}
peerDependencies:
@@ -4737,6 +5014,9 @@ packages:
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
engines: {node: '>=10.13.0'}
+ glob-to-regexp@0.4.1:
+ resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+
glob@10.3.10:
resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -4746,6 +5026,15 @@ packages:
resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
hasBin: true
+ glob@11.0.0:
+ resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==}
+ engines: {node: 20 || >=22}
+ hasBin: true
+
+ glob@7.1.7:
+ resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
+ deprecated: Glob versions prior to v9 are no longer supported
+
glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
deprecated: Glob versions prior to v9 are no longer supported
@@ -5031,8 +5320,9 @@ packages:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
- is-finalizationregistry@1.0.2:
- resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==}
+ is-finalizationregistry@1.1.0:
+ resolution: {integrity: sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==}
+ engines: {node: '>= 0.4'}
is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
@@ -5199,6 +5489,10 @@ packages:
jackspeak@3.4.3:
resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+ jackspeak@4.0.2:
+ resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==}
+ engines: {node: 20 || >=22}
+
jest-diff@29.7.0:
resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -5251,10 +5545,17 @@ packages:
resolution: {integrity: sha512-H5UpaUI+aHOqZXlYOaFP/8AzKsg+guWu+Pr3Y8i7+Y3zr1aXAvCvTAQ1RxSc6oVD8R8c7brgNtTVP91E7upH/g==}
hasBin: true
+ jose@4.15.9:
+ resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==}
+
joycon@3.1.1:
resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
engines: {node: '>=10'}
+ js-cookie@3.0.1:
+ resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==}
+ engines: {node: '>=12'}
+
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -5458,11 +5759,15 @@ packages:
lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+ lru-cache@11.0.2:
+ resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==}
+ engines: {node: 20 || >=22}
+
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
- lucide-react@0.446.0:
- resolution: {integrity: sha512-BU7gy8MfBMqvEdDPH79VhOXSEgyG8TSPOKWaExWGCQVqnGH7wGgDngPbofu+KdtVjPQBWbEmnfMTq90CTiiDRg==}
+ lucide-react@0.460.0:
+ resolution: {integrity: sha512-BVtq/DykVeIvRTJvRAgCsOwaGL8Un3Bxh8MbDxMhEWlZay3T4IpEKDEpwt5KZ0KJMHzgm6jrltxlT5eXOWXDHg==}
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc
@@ -5484,6 +5789,10 @@ packages:
makeerror@1.0.12:
resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+ map-obj@4.3.0:
+ resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==}
+ engines: {node: '>=8'}
+
markdown-it@14.1.0:
resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==}
hasBin: true
@@ -5753,6 +6062,10 @@ packages:
minimalistic-crypto-utils@1.0.1:
resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==}
+ minimatch@10.0.1:
+ resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==}
+ engines: {node: 20 || >=22}
+
minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@@ -5850,16 +6163,16 @@ packages:
react: ^16.8 || ^17 || ^18
react-dom: ^16.8 || ^17 || ^18
- next@15.0.4-canary.15:
- resolution: {integrity: sha512-EF8zlGvC7lV27bKPCFjAYjBWMcCj6UvVstiTvCTXHCls/cYKGBj3mQT2qdC3Vo5O0L6LxquQTZZ7RtlAy/vsbw==}
+ next@15.0.3:
+ resolution: {integrity: sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
hasBin: true
peerDependencies:
'@opentelemetry/api': ^1.1.0
'@playwright/test': ^1.41.2
babel-plugin-react-compiler: '*'
- react: ^18.2.0 || 19.0.0-rc-380f5d67-20241113
- react-dom: ^18.2.0 || 19.0.0-rc-380f5d67-20241113
+ react: ^18.2.0 || 19.0.0-rc-66855b96-20241106
+ react-dom: ^18.2.0 || 19.0.0-rc-66855b96-20241106
sass: ^1.3.0
peerDependenciesMeta:
'@opentelemetry/api':
@@ -5930,6 +6243,10 @@ packages:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
+ normalize-range@0.1.2:
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+ engines: {node: '>=0.10.0'}
+
npm-run-path@4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
@@ -5986,6 +6303,10 @@ packages:
resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
engines: {node: '>= 0.4'}
+ object.hasown@1.1.4:
+ resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==}
+ engines: {node: '>= 0.4'}
+
object.values@1.2.0:
resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
engines: {node: '>= 0.4'}
@@ -6120,6 +6441,13 @@ packages:
resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
engines: {node: '>=16 || 14 >=14.18'}
+ path-scurry@2.0.0:
+ resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==}
+ engines: {node: 20 || >=22}
+
+ path-to-regexp@6.2.1:
+ resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==}
+
path-type@4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
@@ -6250,8 +6578,8 @@ packages:
resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
engines: {node: ^10 || ^12 || >=14}
- preact@10.24.3:
- resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==}
+ preact@10.25.0:
+ resolution: {integrity: sha512-6bYnzlLxXV3OSpUxLdaxBmE7PMOu0aR3pG6lryK/0jmvcDFPlcXGQAt5DpK3RITWiDrfYZRI0druyaK/S9kYLg==}
prebuild-install@7.1.2:
resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==}
@@ -6262,6 +6590,61 @@ packages:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
+ prettier-plugin-tailwindcss@0.6.9:
+ resolution: {integrity: sha512-r0i3uhaZAXYP0At5xGfJH876W3HHGHDp+LCRUJrs57PBeQ6mYHMwr25KH8NPX44F2yGTvdnH7OqCshlQx183Eg==}
+ engines: {node: '>=14.21.3'}
+ peerDependencies:
+ '@ianvs/prettier-plugin-sort-imports': '*'
+ '@prettier/plugin-pug': '*'
+ '@shopify/prettier-plugin-liquid': '*'
+ '@trivago/prettier-plugin-sort-imports': '*'
+ '@zackad/prettier-plugin-twig-melody': '*'
+ prettier: ^3.0
+ prettier-plugin-astro: '*'
+ prettier-plugin-css-order: '*'
+ prettier-plugin-import-sort: '*'
+ prettier-plugin-jsdoc: '*'
+ prettier-plugin-marko: '*'
+ prettier-plugin-multiline-arrays: '*'
+ prettier-plugin-organize-attributes: '*'
+ prettier-plugin-organize-imports: '*'
+ prettier-plugin-sort-imports: '*'
+ prettier-plugin-style-order: '*'
+ prettier-plugin-svelte: '*'
+ peerDependenciesMeta:
+ '@ianvs/prettier-plugin-sort-imports':
+ optional: true
+ '@prettier/plugin-pug':
+ optional: true
+ '@shopify/prettier-plugin-liquid':
+ optional: true
+ '@trivago/prettier-plugin-sort-imports':
+ optional: true
+ '@zackad/prettier-plugin-twig-melody':
+ optional: true
+ prettier-plugin-astro:
+ optional: true
+ prettier-plugin-css-order:
+ optional: true
+ prettier-plugin-import-sort:
+ optional: true
+ prettier-plugin-jsdoc:
+ optional: true
+ prettier-plugin-marko:
+ optional: true
+ prettier-plugin-multiline-arrays:
+ optional: true
+ prettier-plugin-organize-attributes:
+ optional: true
+ prettier-plugin-organize-imports:
+ optional: true
+ prettier-plugin-sort-imports:
+ optional: true
+ prettier-plugin-style-order:
+ optional: true
+ prettier-plugin-svelte:
+ optional: true
+
prettier@3.3.3:
resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==}
engines: {node: '>=14'}
@@ -6336,8 +6719,8 @@ packages:
prosemirror-transform@1.10.2:
resolution: {integrity: sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==}
- prosemirror-view@1.36.0:
- resolution: {integrity: sha512-U0GQd5yFvV5qUtT41X1zCQfbw14vkbbKwLlQXhdylEmgpYVHkefXYcC4HHwWOfZa3x6Y8wxDLUBv7dxN5XQ3nA==}
+ prosemirror-view@1.37.0:
+ resolution: {integrity: sha512-z2nkKI1sJzyi7T47Ji/ewBPuIma1RNvQCCYVdV+MqWBV7o4Sa1n94UJCJJ1aQRF/xRkFfyqLGlGFWitIcCOtbg==}
proxy-compare@2.5.1:
resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==}
@@ -6417,6 +6800,26 @@ packages:
peerDependencies:
react: '>=16.13.1'
+ react-hook-form@7.53.2:
+ resolution: {integrity: sha512-YVel6fW5sOeedd1524pltpHX+jgU2u3DSDtXEaBORNdqiNrsX/nUI/iGXONegttg0mJVnfrIkiV0cmTU6Oo2xw==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ react: ^16.8.0 || ^17 || ^18 || ^19
+
+ react-icons@5.3.0:
+ resolution: {integrity: sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==}
+ peerDependencies:
+ react: '*'
+
+ react-intersection-observer@9.13.1:
+ resolution: {integrity: sha512-tSzDaTy0qwNPLJHg8XZhlyHTgGW6drFKTtvjdL+p6um12rcnp8Z5XstE+QNBJ7c64n5o0Lj4ilUleA41bmDoMw==}
+ peerDependencies:
+ react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
@@ -6516,8 +6919,8 @@ packages:
resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
engines: {node: '>=8'}
- reflect.getprototypeof@1.0.6:
- resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==}
+ reflect.getprototypeof@1.0.7:
+ resolution: {integrity: sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==}
engines: {node: '>= 0.4'}
regenerate-unicode-properties@10.2.0:
@@ -6611,11 +7014,16 @@ packages:
deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true
+ rimraf@6.0.1:
+ resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==}
+ engines: {node: 20 || >=22}
+ hasBin: true
+
ripemd160@2.0.2:
resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
- rollup@4.27.3:
- resolution: {integrity: sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==}
+ rollup@4.27.4:
+ resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@@ -6701,6 +7109,9 @@ packages:
set-blocking@2.0.0:
resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+ set-cookie-parser@2.7.1:
+ resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
+
set-function-length@1.2.2:
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
engines: {node: '>= 0.4'}
@@ -6773,6 +7184,10 @@ packages:
snake-case@3.0.4:
resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+ snakecase-keys@5.4.4:
+ resolution: {integrity: sha512-YTywJG93yxwHLgrYLZjlC75moVEX04LZM4FHfihjHe1FCXm+QaLOFfSf535aXOAd0ArVQMWUAe8ZPm4VtWyXaA==}
+ engines: {node: '>=12'}
+
socket.io-client@4.8.1:
resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==}
engines: {node: '>=10.0.0'}
@@ -6822,11 +7237,6 @@ packages:
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
- sswr@2.1.0:
- resolution: {integrity: sha512-Cqc355SYlTAaUt8iDPaC/4DPPXK925PePLMxyBKuWd5kKc5mwsG3nT9+Mq2tyguL5s7b4Jg+IRMpTRsNTAfpSQ==}
- peerDependencies:
- svelte: ^4.0.0 || ^5.0.0-next.0
-
stack-utils@2.0.6:
resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
engines: {node: '>=10'}
@@ -6986,18 +7396,15 @@ packages:
engines: {node: '>=14.0.0'}
hasBin: true
- swr@2.2.5:
- resolution: {integrity: sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==}
+ swr@2.2.0:
+ resolution: {integrity: sha512-AjqHOv2lAhkuUdIiBu9xbuettzAzWXmCEcLONNKJRba87WAefz8Ca9d6ds/SzrPc235n1IxWYdhJ2zF3MNUaoQ==}
peerDependencies:
react: ^16.11.0 || ^17.0.0 || ^18.0.0
- swrev@4.0.0:
- resolution: {integrity: sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA==}
-
- swrv@1.0.4:
- resolution: {integrity: sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==}
+ swr@2.2.5:
+ resolution: {integrity: sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==}
peerDependencies:
- vue: '>=3.2.26 < 4'
+ react: ^16.11.0 || ^17.0.0 || ^18.0.0
symbol-tree@3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
@@ -7006,8 +7413,8 @@ packages:
resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==}
engines: {node: '>=18'}
- tailwind-merge@2.5.4:
- resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==}
+ tailwind-merge@2.5.5:
+ resolution: {integrity: sha512-0LXunzzAZzo0tEPxV3I297ffKZPlKDrjj7NXphC8V5ak9yHC5zRmxnOe2m/Rd/7ivsOMJe3JZ2JVocoDdQTRBA==}
tailwindcss-animate@1.0.7:
resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
@@ -7100,11 +7507,11 @@ packages:
resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
engines: {node: '>=14.0.0'}
- tldts-core@6.1.63:
- resolution: {integrity: sha512-H1XCt54xY+QPbwhTgmxLkepX0MVHu3USfMmejiCOdkMbRcP22Pn2FVF127r/GWXVDmXTRezyF3Ckvhn4Fs6j7Q==}
+ tldts-core@6.1.64:
+ resolution: {integrity: sha512-uqnl8vGV16KsyflHOzqrYjjArjfXaU6rMPXYy2/ZWoRKCkXtghgB4VwTDXUG+t0OTGeSewNAG31/x1gCTfLt+Q==}
- tldts@6.1.63:
- resolution: {integrity: sha512-YWwhsjyn9sB/1rOkSRYxvkN/wl5LFM1QDv6F2pVR+pb/jFne4EOBxHfkKVWvDIBEAw9iGOwwubHtQTm0WRT5sQ==}
+ tldts@6.1.64:
+ resolution: {integrity: sha512-ph4AE5BXWIOsSy9stpoeo7bYe/Cy7VfpciIH4RhVZUPItCJmhqWCN0EVzxd8BOHiyNb42vuJc6NWTjJkg91Tuw==}
hasBin: true
tmpl@1.0.5:
@@ -7139,8 +7546,8 @@ packages:
trough@2.2.0:
resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
- ts-api-utils@1.4.0:
- resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==}
+ ts-api-utils@1.4.1:
+ resolution: {integrity: sha512-5RU2/lxTA3YUZxju61HO2U6EoZLvBLtmV2mbTvqyu4a/7s7RmJPT+1YekhMVsQhznRWk/czIwDUg+V8Q9ZuG4w==}
engines: {node: '>=16'}
peerDependencies:
typescript: '>=4.2.0'
@@ -7164,12 +7571,21 @@ packages:
tslib@1.14.1:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+ tslib@2.4.1:
+ resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==}
+
tslib@2.7.0:
resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+ tsutils@3.21.0:
+ resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+ engines: {node: '>= 6'}
+ peerDependencies:
+ typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+
tsx@4.19.2:
resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==}
engines: {node: '>=18.0.0'}
@@ -7194,6 +7610,10 @@ packages:
resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==}
engines: {node: '>=8'}
+ type-fest@2.19.0:
+ resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+ engines: {node: '>=12.20'}
+
typed-array-buffer@1.0.2:
resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
engines: {node: '>= 0.4'}
@@ -7206,15 +7626,15 @@ packages:
resolution: {integrity: sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==}
engines: {node: '>= 0.4'}
- typed-array-length@1.0.6:
- resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
+ typed-array-length@1.0.7:
+ resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
engines: {node: '>= 0.4'}
typeforce@1.18.0:
resolution: {integrity: sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==}
- typescript@5.6.3:
- resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
+ typescript@5.7.2:
+ resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==}
engines: {node: '>=14.17'}
hasBin: true
@@ -7395,6 +7815,10 @@ packages:
resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
engines: {node: '>= 0.4.0'}
+ uuid@11.0.3:
+ resolution: {integrity: sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==}
+ hasBin: true
+
uuid@8.3.2:
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
hasBin: true
@@ -7425,8 +7849,8 @@ packages:
vfile@6.0.3:
resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
- viem@2.21.49:
- resolution: {integrity: sha512-NNItYfTv4+yGE5DDKc+S/g2S7KeJn047GwgEYG60FAJlK0FzwuP6lQKSeQ8k7Y4VasfuKPqiT+XiilcCtTRiDQ==}
+ viem@2.21.50:
+ resolution: {integrity: sha512-WHB8NmkaForODuSALb0Ai3E296aEigzYSE+pzB9Y0cTNJeiZT8rpkdxxUFYfjwFMnPkz2tivqrSpuw3hO5TH6w==}
peerDependencies:
typescript: '>=5.0.4'
peerDependenciesMeta:
@@ -7568,8 +7992,8 @@ packages:
which-boxed-primitive@1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
- which-builtin-type@1.1.4:
- resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==}
+ which-builtin-type@1.2.0:
+ resolution: {integrity: sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==}
engines: {node: '>= 0.4'}
which-collection@1.0.2:
@@ -7795,10 +8219,10 @@ snapshots:
optionalDependencies:
zod: 3.23.8
- '@ai-sdk/provider-utils@1.0.22(zod@3.23.8)':
+ '@ai-sdk/provider-utils@2.0.2(zod@3.23.8)':
dependencies:
- '@ai-sdk/provider': 0.0.26
- eventsource-parser: 1.1.2
+ '@ai-sdk/provider': 1.0.1
+ eventsource-parser: 3.0.0
nanoid: 3.3.7
secure-json-parse: 2.7.0
optionalDependencies:
@@ -7808,56 +8232,27 @@ snapshots:
dependencies:
json-schema: 0.4.0
- '@ai-sdk/provider@0.0.26':
+ '@ai-sdk/provider@1.0.1':
dependencies:
json-schema: 0.4.0
- '@ai-sdk/react@0.0.70(react@18.2.0)(zod@3.23.8)':
+ '@ai-sdk/react@1.0.2(react@18.2.0)(zod@3.23.8)':
dependencies:
- '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8)
- '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8)
+ '@ai-sdk/provider-utils': 2.0.2(zod@3.23.8)
+ '@ai-sdk/ui-utils': 1.0.2(zod@3.23.8)
swr: 2.2.5(react@18.2.0)
throttleit: 2.1.0
optionalDependencies:
react: 18.2.0
zod: 3.23.8
- '@ai-sdk/solid@0.0.54(zod@3.23.8)':
- dependencies:
- '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8)
- '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8)
- transitivePeerDependencies:
- - zod
-
- '@ai-sdk/svelte@0.0.57(svelte@5.2.3)(zod@3.23.8)':
+ '@ai-sdk/ui-utils@1.0.2(zod@3.23.8)':
dependencies:
- '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8)
- '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8)
- sswr: 2.1.0(svelte@5.2.3)
+ '@ai-sdk/provider': 1.0.1
+ '@ai-sdk/provider-utils': 2.0.2(zod@3.23.8)
+ zod-to-json-schema: 3.23.5(zod@3.23.8)
optionalDependencies:
- svelte: 5.2.3
- transitivePeerDependencies:
- - zod
-
- '@ai-sdk/ui-utils@0.0.50(zod@3.23.8)':
- dependencies:
- '@ai-sdk/provider': 0.0.26
- '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8)
- json-schema: 0.4.0
- secure-json-parse: 2.7.0
- zod-to-json-schema: 3.23.5(zod@3.23.8)
- optionalDependencies:
- zod: 3.23.8
-
- '@ai-sdk/vue@0.0.59(vue@3.5.13(typescript@5.6.3))(zod@3.23.8)':
- dependencies:
- '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8)
- '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8)
- swrv: 1.0.4(vue@3.5.13(typescript@5.6.3))
- optionalDependencies:
- vue: 3.5.13(typescript@5.6.3)
- transitivePeerDependencies:
- - zod
+ zod: 3.23.8
'@alloc/quick-lru@5.2.0': {}
@@ -8795,10 +9190,64 @@ snapshots:
'@biomejs/cli-win32-x64@1.9.4':
optional: true
- '@coinbase/coinbase-sdk@0.10.0(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)':
+ '@clerk/backend@1.0.0-beta.29(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@scure/bip32': 1.5.0
- abitype: 1.0.6(typescript@5.6.3)(zod@3.23.8)
+ '@clerk/shared': 2.0.0-beta.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ cookie: 0.5.0
+ snakecase-keys: 5.4.4
+ tslib: 2.4.1
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
+ '@clerk/clerk-react@5.0.0-beta.31(eslint@8.57.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.7.2)':
+ dependencies:
+ '@clerk/shared': 2.0.0-beta.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@clerk/types': 4.0.0-beta.21
+ eslint-config-custom: 0.0.0(eslint@8.57.1)(typescript@5.7.2)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.4.1
+ transitivePeerDependencies:
+ - eslint
+ - eslint-import-resolver-webpack
+ - supports-color
+ - typescript
+
+ '@clerk/nextjs@5.0.0-beta.35(eslint@8.57.1)(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.7.2)':
+ dependencies:
+ '@clerk/backend': 1.0.0-beta.29(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@clerk/clerk-react': 5.0.0-beta.31(eslint@8.57.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.7.2)
+ '@clerk/shared': 2.0.0-beta.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ next: 15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ path-to-regexp: 6.2.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.4.1
+ transitivePeerDependencies:
+ - eslint
+ - eslint-import-resolver-webpack
+ - supports-color
+ - typescript
+
+ '@clerk/shared@2.0.0-beta.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ dependencies:
+ glob-to-regexp: 0.4.1
+ js-cookie: 3.0.1
+ std-env: 3.8.0
+ swr: 2.2.0(react@18.2.0)
+ optionalDependencies:
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+
+ '@clerk/types@4.0.0-beta.21':
+ dependencies:
+ csstype: 3.1.1
+
+ '@coinbase/coinbase-sdk@0.10.0(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)':
+ dependencies:
+ '@scure/bip32': 1.6.0
+ abitype: 1.0.6(typescript@5.7.2)(zod@3.23.8)
axios: 1.7.7
axios-mock-adapter: 1.22.0(axios@1.7.7)
axios-retry: 4.5.0(axios@1.7.7)
@@ -8809,7 +9258,7 @@ snapshots:
ethers: 6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)
node-jose: 2.2.0
secp256k1: 5.0.1
- viem: 2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ viem: 2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
transitivePeerDependencies:
- bufferutil
- debug
@@ -8826,21 +9275,21 @@ snapshots:
eth-json-rpc-filters: 6.0.1
eventemitter3: 5.0.1
keccak: 3.0.4
- preact: 10.24.3
+ preact: 10.25.0
sha.js: 2.4.11
transitivePeerDependencies:
- supports-color
'@coinbase/wallet-sdk@4.2.3':
dependencies:
- '@noble/hashes': 1.5.0
+ '@noble/hashes': 1.6.1
clsx: 1.2.1
eventemitter3: 5.0.1
- preact: 10.24.3
+ preact: 10.25.0
- '@ecies/ciphers@0.2.1(@noble/ciphers@1.0.0)':
+ '@ecies/ciphers@0.2.1(@noble/ciphers@1.1.0)':
dependencies:
- '@noble/ciphers': 1.0.0
+ '@noble/ciphers': 1.1.0
'@emnapi/runtime@1.3.1':
dependencies:
@@ -9052,6 +9501,10 @@ snapshots:
'@floating-ui/utils@0.2.8': {}
+ '@hookform/resolvers@3.9.1(react-hook-form@7.53.2(react@18.2.0))':
+ dependencies:
+ react-hook-form: 7.53.2(react@18.2.0)
+
'@humanwhocodes/config-array@0.13.0':
dependencies:
'@humanwhocodes/object-schema': 2.0.3
@@ -9168,7 +9621,7 @@ snapshots:
dependencies:
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.17.6
+ '@types/node': 22.9.3
jest-mock: 29.7.0
'@jest/expect-utils@29.7.0':
@@ -9179,7 +9632,7 @@ snapshots:
dependencies:
'@jest/types': 29.6.3
'@sinonjs/fake-timers': 10.3.0
- '@types/node': 20.17.6
+ '@types/node': 22.9.3
jest-message-util: 29.7.0
jest-mock: 29.7.0
jest-util: 29.7.0
@@ -9213,7 +9666,7 @@ snapshots:
'@jest/schemas': 29.6.3
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4
- '@types/node': 20.17.6
+ '@types/node': 22.9.3
'@types/yargs': 17.0.33
chalk: 4.1.2
@@ -9391,8 +9844,8 @@ snapshots:
dependencies:
'@ethereumjs/tx': 4.2.0
'@metamask/superstruct': 3.1.0
- '@noble/hashes': 1.5.0
- '@scure/base': 1.1.9
+ '@noble/hashes': 1.6.1
+ '@scure/base': 1.2.1
'@types/debug': 4.1.12
debug: 4.3.7
pony-cause: 2.1.11
@@ -9405,8 +9858,8 @@ snapshots:
dependencies:
'@ethereumjs/tx': 4.2.0
'@metamask/superstruct': 3.1.0
- '@noble/hashes': 1.5.0
- '@scure/base': 1.1.9
+ '@noble/hashes': 1.6.1
+ '@scure/base': 1.2.1
'@types/debug': 4.1.12
debug: 4.3.7
pony-cause: 2.1.11
@@ -9460,37 +9913,41 @@ snapshots:
'@motionone/dom': 10.18.0
tslib: 2.8.1
- '@next/env@15.0.4-canary.15': {}
+ '@next/env@15.0.3': {}
+
+ '@next/eslint-plugin-next@12.3.4':
+ dependencies:
+ glob: 7.1.7
'@next/eslint-plugin-next@14.2.5':
dependencies:
glob: 10.3.10
- '@next/swc-darwin-arm64@15.0.4-canary.15':
+ '@next/swc-darwin-arm64@15.0.3':
optional: true
- '@next/swc-darwin-x64@15.0.4-canary.15':
+ '@next/swc-darwin-x64@15.0.3':
optional: true
- '@next/swc-linux-arm64-gnu@15.0.4-canary.15':
+ '@next/swc-linux-arm64-gnu@15.0.3':
optional: true
- '@next/swc-linux-arm64-musl@15.0.4-canary.15':
+ '@next/swc-linux-arm64-musl@15.0.3':
optional: true
- '@next/swc-linux-x64-gnu@15.0.4-canary.15':
+ '@next/swc-linux-x64-gnu@15.0.3':
optional: true
- '@next/swc-linux-x64-musl@15.0.4-canary.15':
+ '@next/swc-linux-x64-musl@15.0.3':
optional: true
- '@next/swc-win32-arm64-msvc@15.0.4-canary.15':
+ '@next/swc-win32-arm64-msvc@15.0.3':
optional: true
- '@next/swc-win32-x64-msvc@15.0.4-canary.15':
+ '@next/swc-win32-x64-msvc@15.0.3':
optional: true
- '@noble/ciphers@1.0.0': {}
+ '@noble/ciphers@1.1.0': {}
'@noble/curves@1.2.0':
dependencies:
@@ -9504,12 +9961,20 @@ snapshots:
dependencies:
'@noble/hashes': 1.5.0
+ '@noble/curves@1.7.0':
+ dependencies:
+ '@noble/hashes': 1.6.0
+
'@noble/hashes@1.3.2': {}
'@noble/hashes@1.4.0': {}
'@noble/hashes@1.5.0': {}
+ '@noble/hashes@1.6.0': {}
+
+ '@noble/hashes@1.6.1': {}
+
'@nodelib/fs.scandir@2.1.5':
dependencies:
'@nodelib/fs.stat': 2.0.5
@@ -9738,6 +10203,23 @@ snapshots:
'@types/react': 18.3.12
'@types/react-dom': 18.3.1
+ '@radix-ui/react-hover-card@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.2.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
'@radix-ui/react-icons@1.3.2(react@18.2.0)':
dependencies:
react: 18.2.0
@@ -9858,6 +10340,23 @@ snapshots:
'@types/react': 18.3.12
'@types/react-dom': 18.3.1
+ '@radix-ui/react-scroll-area@1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ dependencies:
+ '@radix-ui/number': 1.1.0
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.2.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.2.0)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.2.0)
+ '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
'@radix-ui/react-select@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@radix-ui/number': 1.1.0
@@ -9995,9 +10494,9 @@ snapshots:
'@radix-ui/rect@1.1.0': {}
- '@rainbow-me/rainbowkit@2.2.0(@tanstack/react-query@5.61.0(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.13.0(@tanstack/query-core@5.60.6)(@tanstack/react-query@5.61.0(react@18.2.0))(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))':
+ '@rainbow-me/rainbowkit@2.2.0(@tanstack/react-query@5.61.3(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.13.0(@tanstack/query-core@5.60.6)(@tanstack/react-query@5.61.3(react@18.2.0))(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))':
dependencies:
- '@tanstack/react-query': 5.61.0(react@18.2.0)
+ '@tanstack/react-query': 5.61.3(react@18.2.0)
'@vanilla-extract/css': 1.15.5
'@vanilla-extract/dynamic': 2.1.2
'@vanilla-extract/sprinkles': 1.6.3(@vanilla-extract/css@1.15.5)
@@ -10007,8 +10506,8 @@ snapshots:
react-dom: 18.2.0(react@18.2.0)
react-remove-scroll: 2.6.0(@types/react@18.3.12)(react@18.2.0)
ua-parser-js: 1.0.39
- viem: 2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
- wagmi: 2.13.0(@tanstack/query-core@5.60.6)(@tanstack/react-query@5.61.0(react@18.2.0))(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
+ viem: 2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
+ wagmi: 2.13.0(@tanstack/query-core@5.60.6)(@tanstack/react-query@5.61.3(react@18.2.0))(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
transitivePeerDependencies:
- '@types/react'
- babel-plugin-macros
@@ -10153,67 +10652,67 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.12
- '@rollup/rollup-android-arm-eabi@4.27.3':
+ '@rollup/rollup-android-arm-eabi@4.27.4':
optional: true
- '@rollup/rollup-android-arm64@4.27.3':
+ '@rollup/rollup-android-arm64@4.27.4':
optional: true
- '@rollup/rollup-darwin-arm64@4.27.3':
+ '@rollup/rollup-darwin-arm64@4.27.4':
optional: true
- '@rollup/rollup-darwin-x64@4.27.3':
+ '@rollup/rollup-darwin-x64@4.27.4':
optional: true
- '@rollup/rollup-freebsd-arm64@4.27.3':
+ '@rollup/rollup-freebsd-arm64@4.27.4':
optional: true
- '@rollup/rollup-freebsd-x64@4.27.3':
+ '@rollup/rollup-freebsd-x64@4.27.4':
optional: true
- '@rollup/rollup-linux-arm-gnueabihf@4.27.3':
+ '@rollup/rollup-linux-arm-gnueabihf@4.27.4':
optional: true
- '@rollup/rollup-linux-arm-musleabihf@4.27.3':
+ '@rollup/rollup-linux-arm-musleabihf@4.27.4':
optional: true
- '@rollup/rollup-linux-arm64-gnu@4.27.3':
+ '@rollup/rollup-linux-arm64-gnu@4.27.4':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.27.3':
+ '@rollup/rollup-linux-arm64-musl@4.27.4':
optional: true
- '@rollup/rollup-linux-powerpc64le-gnu@4.27.3':
+ '@rollup/rollup-linux-powerpc64le-gnu@4.27.4':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.27.3':
+ '@rollup/rollup-linux-riscv64-gnu@4.27.4':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.27.3':
+ '@rollup/rollup-linux-s390x-gnu@4.27.4':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.27.3':
+ '@rollup/rollup-linux-x64-gnu@4.27.4':
optional: true
- '@rollup/rollup-linux-x64-musl@4.27.3':
+ '@rollup/rollup-linux-x64-musl@4.27.4':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.27.3':
+ '@rollup/rollup-win32-arm64-msvc@4.27.4':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.27.3':
+ '@rollup/rollup-win32-ia32-msvc@4.27.4':
optional: true
- '@rollup/rollup-win32-x64-msvc@4.27.3':
+ '@rollup/rollup-win32-x64-msvc@4.27.4':
optional: true
'@rtsao/scc@1.1.0': {}
'@rushstack/eslint-patch@1.10.4': {}
- '@safe-global/safe-apps-provider@0.18.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)':
+ '@safe-global/safe-apps-provider@0.18.4(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)':
dependencies:
- '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
events: 3.3.0
transitivePeerDependencies:
- bufferutil
@@ -10221,20 +10720,22 @@ snapshots:
- utf-8-validate
- zod
- '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)':
+ '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)':
dependencies:
- '@safe-global/safe-gateway-typescript-sdk': 3.22.3
- viem: 2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ '@safe-global/safe-gateway-typescript-sdk': 3.22.4
+ viem: 2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
transitivePeerDependencies:
- bufferutil
- typescript
- utf-8-validate
- zod
- '@safe-global/safe-gateway-typescript-sdk@3.22.3': {}
+ '@safe-global/safe-gateway-typescript-sdk@3.22.4': {}
'@scure/base@1.1.9': {}
+ '@scure/base@1.2.1': {}
+
'@scure/bip32@1.4.0':
dependencies:
'@noble/curves': 1.4.2
@@ -10247,6 +10748,12 @@ snapshots:
'@noble/hashes': 1.5.0
'@scure/base': 1.1.9
+ '@scure/bip32@1.6.0':
+ dependencies:
+ '@noble/curves': 1.7.0
+ '@noble/hashes': 1.6.1
+ '@scure/base': 1.2.1
+
'@scure/bip39@1.3.0':
dependencies:
'@noble/hashes': 1.4.0
@@ -10349,6 +10856,17 @@ snapshots:
'@stablelib/random': 1.0.2
'@stablelib/wipe': 1.0.1
+ '@supabase/auth-helpers-nextjs@0.10.0(@supabase/supabase-js@2.46.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))':
+ dependencies:
+ '@supabase/auth-helpers-shared': 0.7.0(@supabase/supabase-js@2.46.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))
+ '@supabase/supabase-js': 2.46.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+ set-cookie-parser: 2.7.1
+
+ '@supabase/auth-helpers-shared@0.7.0(@supabase/supabase-js@2.46.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))':
+ dependencies:
+ '@supabase/supabase-js': 2.46.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+ jose: 4.15.9
+
'@supabase/auth-js@2.65.1':
dependencies:
'@supabase/node-fetch': 2.6.15
@@ -10441,12 +10959,12 @@ snapshots:
'@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.26.0)
'@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.26.0)
- '@svgr/core@8.1.0(typescript@5.6.3)':
+ '@svgr/core@8.1.0(typescript@5.7.2)':
dependencies:
'@babel/core': 7.26.0
'@svgr/babel-preset': 8.1.0(@babel/core@7.26.0)
camelcase: 6.3.0
- cosmiconfig: 8.3.6(typescript@5.6.3)
+ cosmiconfig: 8.3.6(typescript@5.7.2)
snake-case: 3.0.4
transitivePeerDependencies:
- supports-color
@@ -10457,35 +10975,35 @@ snapshots:
'@babel/types': 7.26.0
entities: 4.5.0
- '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.6.3))':
+ '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.7.2))':
dependencies:
'@babel/core': 7.26.0
'@svgr/babel-preset': 8.1.0(@babel/core@7.26.0)
- '@svgr/core': 8.1.0(typescript@5.6.3)
+ '@svgr/core': 8.1.0(typescript@5.7.2)
'@svgr/hast-util-to-babel-ast': 8.0.0
svg-parser: 2.0.4
transitivePeerDependencies:
- supports-color
- '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.6.3))(typescript@5.6.3)':
+ '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.7.2))(typescript@5.7.2)':
dependencies:
- '@svgr/core': 8.1.0(typescript@5.6.3)
- cosmiconfig: 8.3.6(typescript@5.6.3)
+ '@svgr/core': 8.1.0(typescript@5.7.2)
+ cosmiconfig: 8.3.6(typescript@5.7.2)
deepmerge: 4.3.1
svgo: 3.3.2
transitivePeerDependencies:
- typescript
- '@svgr/webpack@8.1.0(typescript@5.6.3)':
+ '@svgr/webpack@8.1.0(typescript@5.7.2)':
dependencies:
'@babel/core': 7.26.0
'@babel/plugin-transform-react-constant-elements': 7.25.9(@babel/core@7.26.0)
'@babel/preset-env': 7.26.0(@babel/core@7.26.0)
'@babel/preset-react': 7.25.9(@babel/core@7.26.0)
'@babel/preset-typescript': 7.26.0(@babel/core@7.26.0)
- '@svgr/core': 8.1.0(typescript@5.6.3)
- '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3))
- '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3))(typescript@5.6.3)
+ '@svgr/core': 8.1.0(typescript@5.7.2)
+ '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.7.2))
+ '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.7.2))(typescript@5.7.2)
transitivePeerDependencies:
- supports-color
- typescript
@@ -10506,7 +11024,7 @@ snapshots:
'@tanstack/query-core@5.60.6': {}
- '@tanstack/react-query@5.61.0(react@18.2.0)':
+ '@tanstack/react-query@5.61.3(react@18.2.0)':
dependencies:
'@tanstack/query-core': 5.60.6
react: 18.2.0
@@ -10575,6 +11093,10 @@ snapshots:
dependencies:
chalk: 5.3.0
+ '@types/classnames@2.3.4':
+ dependencies:
+ classnames: 2.5.1
+
'@types/cookie@0.6.0': {}
'@types/d3-scale@4.0.8':
@@ -10597,7 +11119,7 @@ snapshots:
'@types/graceful-fs@4.1.9':
dependencies:
- '@types/node': 20.17.6
+ '@types/node': 22.9.3
'@types/hast@3.0.4':
dependencies:
@@ -10637,13 +11159,13 @@ snapshots:
'@types/node-forge@1.3.11':
dependencies:
- '@types/node': 20.17.6
+ '@types/node': 22.9.3
- '@types/node@20.17.6':
+ '@types/node@22.7.5':
dependencies:
undici-types: 6.19.8
- '@types/node@22.7.5':
+ '@types/node@22.9.3':
dependencies:
undici-types: 6.19.8
@@ -10674,9 +11196,11 @@ snapshots:
'@types/unist@3.0.3': {}
+ '@types/uuid@10.0.0': {}
+
'@types/ws@8.5.13':
dependencies:
- '@types/node': 20.17.6
+ '@types/node': 22.9.3
'@types/yargs-parser@21.0.3': {}
@@ -10684,27 +11208,110 @@ snapshots:
dependencies:
'@types/yargs-parser': 21.0.3
- '@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3)':
+ '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.7.2)
+ '@typescript-eslint/scope-manager': 8.15.0
+ '@typescript-eslint/type-utils': 8.15.0(eslint@8.57.1)(typescript@5.7.2)
+ '@typescript-eslint/utils': 8.15.0(eslint@8.57.1)(typescript@5.7.2)
+ '@typescript-eslint/visitor-keys': 8.15.0
+ eslint: 8.57.1
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ natural-compare: 1.4.0
+ ts-api-utils: 1.4.1(typescript@5.7.2)
+ optionalDependencies:
+ typescript: 5.7.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.2)
+ debug: 4.3.7
+ eslint: 8.57.1
+ optionalDependencies:
+ typescript: 5.7.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.7.2)':
dependencies:
'@typescript-eslint/scope-manager': 7.2.0
'@typescript-eslint/types': 7.2.0
- '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.6.3)
+ '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.7.2)
'@typescript-eslint/visitor-keys': 7.2.0
debug: 4.3.7
eslint: 8.57.1
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.7.2
transitivePeerDependencies:
- supports-color
+ '@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.15.0
+ '@typescript-eslint/types': 8.15.0
+ '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.7.2)
+ '@typescript-eslint/visitor-keys': 8.15.0
+ debug: 4.3.7
+ eslint: 8.57.1
+ optionalDependencies:
+ typescript: 5.7.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@5.62.0':
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/visitor-keys': 5.62.0
+
'@typescript-eslint/scope-manager@7.2.0':
dependencies:
'@typescript-eslint/types': 7.2.0
'@typescript-eslint/visitor-keys': 7.2.0
+ '@typescript-eslint/scope-manager@8.15.0':
+ dependencies:
+ '@typescript-eslint/types': 8.15.0
+ '@typescript-eslint/visitor-keys': 8.15.0
+
+ '@typescript-eslint/type-utils@8.15.0(eslint@8.57.1)(typescript@5.7.2)':
+ dependencies:
+ '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.7.2)
+ '@typescript-eslint/utils': 8.15.0(eslint@8.57.1)(typescript@5.7.2)
+ debug: 4.3.7
+ eslint: 8.57.1
+ ts-api-utils: 1.4.1(typescript@5.7.2)
+ optionalDependencies:
+ typescript: 5.7.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@5.62.0': {}
+
'@typescript-eslint/types@7.2.0': {}
- '@typescript-eslint/typescript-estree@7.2.0(typescript@5.6.3)':
+ '@typescript-eslint/types@8.15.0': {}
+
+ '@typescript-eslint/typescript-estree@5.62.0(typescript@5.7.2)':
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/visitor-keys': 5.62.0
+ debug: 4.3.7
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.6.3
+ tsutils: 3.21.0(typescript@5.7.2)
+ optionalDependencies:
+ typescript: 5.7.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/typescript-estree@7.2.0(typescript@5.7.2)':
dependencies:
'@typescript-eslint/types': 7.2.0
'@typescript-eslint/visitor-keys': 7.2.0
@@ -10713,17 +11320,54 @@ snapshots:
is-glob: 4.0.3
minimatch: 9.0.3
semver: 7.6.3
- ts-api-utils: 1.4.0(typescript@5.6.3)
+ ts-api-utils: 1.4.1(typescript@5.7.2)
+ optionalDependencies:
+ typescript: 5.7.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/typescript-estree@8.15.0(typescript@5.7.2)':
+ dependencies:
+ '@typescript-eslint/types': 8.15.0
+ '@typescript-eslint/visitor-keys': 8.15.0
+ debug: 4.3.7
+ fast-glob: 3.3.2
+ is-glob: 4.0.3
+ minimatch: 9.0.5
+ semver: 7.6.3
+ ts-api-utils: 1.4.1(typescript@5.7.2)
+ optionalDependencies:
+ typescript: 5.7.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.15.0(eslint@8.57.1)(typescript@5.7.2)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
+ '@typescript-eslint/scope-manager': 8.15.0
+ '@typescript-eslint/types': 8.15.0
+ '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.7.2)
+ eslint: 8.57.1
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.7.2
transitivePeerDependencies:
- supports-color
+ '@typescript-eslint/visitor-keys@5.62.0':
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ eslint-visitor-keys: 3.4.3
+
'@typescript-eslint/visitor-keys@7.2.0':
dependencies:
'@typescript-eslint/types': 7.2.0
eslint-visitor-keys: 3.4.3
+ '@typescript-eslint/visitor-keys@8.15.0':
+ dependencies:
+ '@typescript-eslint/types': 8.15.0
+ eslint-visitor-keys: 4.2.0
+
'@ungap/structured-clone@1.2.0': {}
'@upstash/redis@1.34.3':
@@ -10757,12 +11401,12 @@ snapshots:
dependencies:
'@vanilla-extract/css': 1.15.5
- '@vercel/analytics@1.4.1(next@15.0.4-canary.15(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)(svelte@5.2.3)(vue@3.5.13(typescript@5.6.3))':
+ '@vercel/analytics@1.4.1(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)(svelte@5.2.3)(vue@3.5.13(typescript@5.7.2))':
optionalDependencies:
- next: 15.0.4-canary.15(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ next: 15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
svelte: 5.2.3
- vue: 3.5.13(typescript@5.6.3)
+ vue: 3.5.13(typescript@5.7.2)
'@vercel/blob@0.26.0':
dependencies:
@@ -10777,14 +11421,14 @@ snapshots:
dependencies:
'@upstash/redis': 1.34.3
- '@vitejs/plugin-react@4.3.3(vite@5.4.11(@types/node@20.17.6)(terser@5.36.0))':
+ '@vitejs/plugin-react@4.3.3(vite@5.4.11(@types/node@22.9.3)(terser@5.36.0))':
dependencies:
'@babel/core': 7.26.0
'@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0)
'@types/babel__core': 7.20.5
react-refresh: 0.14.2
- vite: 5.4.11(@types/node@20.17.6)(terser@5.36.0)
+ vite: 5.4.11(@types/node@22.9.3)(terser@5.36.0)
transitivePeerDependencies:
- supports-color
@@ -10801,7 +11445,7 @@ snapshots:
std-env: 3.8.0
test-exclude: 6.0.0
v8-to-istanbul: 9.3.0
- vitest: 2.1.5(@types/node@20.17.6)(@vitest/ui@2.1.5)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.36.0)
+ vitest: 2.1.5(@types/node@22.9.3)(@vitest/ui@2.1.5)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.36.0)
transitivePeerDependencies:
- supports-color
@@ -10812,13 +11456,13 @@ snapshots:
chai: 5.1.2
tinyrainbow: 1.2.0
- '@vitest/mocker@2.1.5(vite@5.4.11(@types/node@20.17.6)(terser@5.36.0))':
+ '@vitest/mocker@2.1.5(vite@5.4.11(@types/node@22.9.3)(terser@5.36.0))':
dependencies:
'@vitest/spy': 2.1.5
estree-walker: 3.0.3
magic-string: 0.30.13
optionalDependencies:
- vite: 5.4.11(@types/node@20.17.6)(terser@5.36.0)
+ vite: 5.4.11(@types/node@22.9.3)(terser@5.36.0)
'@vitest/pretty-format@2.1.5':
dependencies:
@@ -10848,7 +11492,7 @@ snapshots:
sirv: 3.0.0
tinyglobby: 0.2.10
tinyrainbow: 1.2.0
- vitest: 2.1.5(@types/node@20.17.6)(@vitest/ui@2.1.5)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.36.0)
+ vitest: 2.1.5(@types/node@22.9.3)(@vitest/ui@2.1.5)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.36.0)
'@vitest/utils@2.1.5':
dependencies:
@@ -10863,11 +11507,13 @@ snapshots:
entities: 4.5.0
estree-walker: 2.0.2
source-map-js: 1.2.1
+ optional: true
'@vue/compiler-dom@3.5.13':
dependencies:
'@vue/compiler-core': 3.5.13
'@vue/shared': 3.5.13
+ optional: true
'@vue/compiler-sfc@3.5.13':
dependencies:
@@ -10880,20 +11526,24 @@ snapshots:
magic-string: 0.30.13
postcss: 8.4.49
source-map-js: 1.2.1
+ optional: true
'@vue/compiler-ssr@3.5.13':
dependencies:
'@vue/compiler-dom': 3.5.13
'@vue/shared': 3.5.13
+ optional: true
'@vue/reactivity@3.5.13':
dependencies:
'@vue/shared': 3.5.13
+ optional: true
'@vue/runtime-core@3.5.13':
dependencies:
'@vue/reactivity': 3.5.13
'@vue/shared': 3.5.13
+ optional: true
'@vue/runtime-dom@3.5.13':
dependencies:
@@ -10901,27 +11551,30 @@ snapshots:
'@vue/runtime-core': 3.5.13
'@vue/shared': 3.5.13
csstype: 3.1.3
+ optional: true
- '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.6.3))':
+ '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.2))':
dependencies:
'@vue/compiler-ssr': 3.5.13
'@vue/shared': 3.5.13
- vue: 3.5.13(typescript@5.6.3)
+ vue: 3.5.13(typescript@5.7.2)
+ optional: true
- '@vue/shared@3.5.13': {}
+ '@vue/shared@3.5.13':
+ optional: true
- '@wagmi/connectors@5.5.0(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(@wagmi/core@2.15.0(@tanstack/query-core@5.60.6)(@types/react@18.3.12)(react@18.2.0)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.2.0))(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)':
+ '@wagmi/connectors@5.5.0(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(@wagmi/core@2.15.0(@tanstack/query-core@5.60.6)(@types/react@18.3.12)(react@18.2.0)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.2.0))(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)':
dependencies:
'@coinbase/wallet-sdk': 4.2.3
'@metamask/sdk': 0.30.1(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(utf-8-validate@5.0.10)
- '@safe-global/safe-apps-provider': 0.18.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
- '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
- '@wagmi/core': 2.15.0(@tanstack/query-core@5.60.6)(@types/react@18.3.12)(react@18.2.0)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.2.0))(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8))
+ '@safe-global/safe-apps-provider': 0.18.4(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
+ '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
+ '@wagmi/core': 2.15.0(@tanstack/query-core@5.60.6)(@types/react@18.3.12)(react@18.2.0)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.2.0))(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))
'@walletconnect/ethereum-provider': 2.17.0(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)
cbw-sdk: '@coinbase/wallet-sdk@3.9.3'
- viem: 2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ viem: 2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.7.2
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
@@ -10946,15 +11599,15 @@ snapshots:
- utf-8-validate
- zod
- '@wagmi/core@2.15.0(@tanstack/query-core@5.60.6)(@types/react@18.3.12)(react@18.2.0)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.2.0))(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8))':
+ '@wagmi/core@2.15.0(@tanstack/query-core@5.60.6)(@types/react@18.3.12)(react@18.2.0)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.2.0))(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))':
dependencies:
eventemitter3: 5.0.1
- mipd: 0.0.7(typescript@5.6.3)
- viem: 2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ mipd: 0.0.7(typescript@5.7.2)
+ viem: 2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
zustand: 5.0.0(@types/react@18.3.12)(react@18.2.0)(use-sync-external-store@1.2.0(react@18.2.0))
optionalDependencies:
'@tanstack/query-core': 5.60.6
- typescript: 5.6.3
+ typescript: 5.7.2
transitivePeerDependencies:
- '@types/react'
- immer
@@ -11594,10 +12247,10 @@ snapshots:
lit: 3.1.0
qrcode: 1.5.3
- '@web3modal/wagmi@5.1.11(aaf5leqjl3fvobyhzmbv555pdm)':
+ '@web3modal/wagmi@5.1.11(khz7a4tilad7asw4ut42zuqh3y)':
dependencies:
- '@wagmi/connectors': 5.5.0(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(@wagmi/core@2.15.0(@tanstack/query-core@5.60.6)(@types/react@18.3.12)(react@18.2.0)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.2.0))(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
- '@wagmi/core': 2.15.0(@tanstack/query-core@5.60.6)(@types/react@18.3.12)(react@18.2.0)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.2.0))(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8))
+ '@wagmi/connectors': 5.5.0(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(@wagmi/core@2.15.0(@tanstack/query-core@5.60.6)(@types/react@18.3.12)(react@18.2.0)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.2.0))(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
+ '@wagmi/core': 2.15.0(@tanstack/query-core@5.60.6)(@types/react@18.3.12)(react@18.2.0)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.2.0))(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))
'@walletconnect/ethereum-provider': 2.16.1(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)
'@walletconnect/utils': 2.16.1(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)
'@web3modal/base': 5.1.11(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(react@18.2.0)
@@ -11606,12 +12259,12 @@ snapshots:
'@web3modal/scaffold-utils': 5.1.11(@types/react@18.3.12)(react@18.2.0)
'@web3modal/siwe': 5.1.11(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(react@18.2.0)
'@web3modal/wallet': 5.1.11
- viem: 2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
- wagmi: 2.13.0(@tanstack/query-core@5.60.6)(@tanstack/react-query@5.61.0(react@18.2.0))(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
+ viem: 2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
+ wagmi: 2.13.0(@tanstack/query-core@5.60.6)(@tanstack/react-query@5.61.3(react@18.2.0))(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
optionalDependencies:
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- vue: 3.5.13(typescript@5.6.3)
+ vue: 3.5.13(typescript@5.7.2)
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
@@ -11638,9 +12291,9 @@ snapshots:
'@web3modal/polyfills': 5.1.11
zod: 3.22.4
- abitype@1.0.6(typescript@5.6.3)(zod@3.23.8):
+ abitype@1.0.6(typescript@5.7.2)(zod@3.23.8):
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.7.2
zod: 3.23.8
abort-controller@3.0.0:
@@ -11659,6 +12312,7 @@ snapshots:
acorn-typescript@1.4.13(acorn@8.14.0):
dependencies:
acorn: 8.14.0
+ optional: true
acorn@8.14.0: {}
@@ -11670,29 +12324,18 @@ snapshots:
transitivePeerDependencies:
- supports-color
- ai@3.4.33(react@18.2.0)(sswr@2.1.0(svelte@5.2.3))(svelte@5.2.3)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8):
+ ai@4.0.3(react@18.2.0)(zod@3.23.8):
dependencies:
- '@ai-sdk/provider': 0.0.26
- '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8)
- '@ai-sdk/react': 0.0.70(react@18.2.0)(zod@3.23.8)
- '@ai-sdk/solid': 0.0.54(zod@3.23.8)
- '@ai-sdk/svelte': 0.0.57(svelte@5.2.3)(zod@3.23.8)
- '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8)
- '@ai-sdk/vue': 0.0.59(vue@3.5.13(typescript@5.6.3))(zod@3.23.8)
+ '@ai-sdk/provider': 1.0.1
+ '@ai-sdk/provider-utils': 2.0.2(zod@3.23.8)
+ '@ai-sdk/react': 1.0.2(react@18.2.0)(zod@3.23.8)
+ '@ai-sdk/ui-utils': 1.0.2(zod@3.23.8)
'@opentelemetry/api': 1.9.0
- eventsource-parser: 1.1.2
- json-schema: 0.4.0
jsondiffpatch: 0.6.0
- secure-json-parse: 2.7.0
zod-to-json-schema: 3.23.5(zod@3.23.8)
optionalDependencies:
react: 18.2.0
- sswr: 2.1.0(svelte@5.2.3)
- svelte: 5.2.3
zod: 3.23.8
- transitivePeerDependencies:
- - solid-js
- - vue
ajv@6.12.6:
dependencies:
@@ -11833,6 +12476,16 @@ snapshots:
atomic-sleep@1.0.0: {}
+ autoprefixer@10.4.20(postcss@8.4.49):
+ dependencies:
+ browserslist: 4.24.2
+ caniuse-lite: 1.0.30001684
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ picocolors: 1.1.1
+ postcss: 8.4.49
+ postcss-value-parser: 4.2.0
+
available-typed-arrays@1.0.7:
dependencies:
possible-typed-array-names: 1.0.0
@@ -11970,7 +12623,7 @@ snapshots:
dependencies:
bare-events: 2.5.0
bare-path: 2.1.3
- bare-stream: 2.4.0
+ bare-stream: 2.4.2
optional: true
bare-os@2.4.4:
@@ -11981,7 +12634,7 @@ snapshots:
bare-os: 2.4.4
optional: true
- bare-stream@2.4.0:
+ bare-stream@2.4.2:
dependencies:
streamx: 2.20.2
optional: true
@@ -12003,14 +12656,14 @@ snapshots:
bip32@4.0.0:
dependencies:
- '@noble/hashes': 1.5.0
- '@scure/base': 1.1.9
+ '@noble/hashes': 1.6.1
+ '@scure/base': 1.2.1
typeforce: 1.18.0
wif: 2.0.6
bip39@3.1.0:
dependencies:
- '@noble/hashes': 1.5.0
+ '@noble/hashes': 1.6.1
bl@4.1.0:
dependencies:
@@ -12050,7 +12703,7 @@ snapshots:
browserslist@4.24.2:
dependencies:
- caniuse-lite: 1.0.30001683
+ caniuse-lite: 1.0.30001684
electron-to-chromium: 1.5.64
node-releases: 2.0.18
update-browserslist-db: 1.1.1(browserslist@4.24.2)
@@ -12124,7 +12777,7 @@ snapshots:
camelcase@6.3.0: {}
- caniuse-lite@1.0.30001683: {}
+ caniuse-lite@1.0.30001684: {}
ccount@2.0.1: {}
@@ -12174,7 +12827,7 @@ snapshots:
chrome-launcher@0.15.2:
dependencies:
- '@types/node': 20.17.6
+ '@types/node': 22.9.3
escape-string-regexp: 4.0.0
is-wsl: 2.2.0
lighthouse-logger: 1.4.2
@@ -12183,7 +12836,7 @@ snapshots:
chromium-edge-launcher@0.2.0:
dependencies:
- '@types/node': 20.17.6
+ '@types/node': 22.9.3
escape-string-regexp: 4.0.0
is-wsl: 2.2.0
lighthouse-logger: 1.4.2
@@ -12296,6 +12949,8 @@ snapshots:
cookie-es@1.2.2: {}
+ cookie@0.5.0: {}
+
cookie@0.7.2: {}
core-js-compat@3.39.0:
@@ -12311,14 +12966,14 @@ snapshots:
js-yaml: 3.14.1
parse-json: 4.0.0
- cosmiconfig@8.3.6(typescript@5.6.3):
+ cosmiconfig@8.3.6(typescript@5.7.2):
dependencies:
import-fresh: 3.3.0
js-yaml: 4.1.0
parse-json: 5.2.0
path-type: 4.0.0
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.7.2
crc-32@1.2.2: {}
@@ -12398,6 +13053,8 @@ snapshots:
dependencies:
rrweb-cssom: 0.7.1
+ csstype@3.1.1: {}
+
csstype@3.1.3: {}
damerau-levenshtein@1.0.8: {}
@@ -12573,10 +13230,10 @@ snapshots:
eciesjs@0.4.12:
dependencies:
- '@ecies/ciphers': 0.2.1(@noble/ciphers@1.0.0)
- '@noble/ciphers': 1.0.0
- '@noble/curves': 1.6.0
- '@noble/hashes': 1.5.0
+ '@ecies/ciphers': 0.2.1(@noble/ciphers@1.1.0)
+ '@noble/ciphers': 1.1.0
+ '@noble/curves': 1.7.0
+ '@noble/hashes': 1.6.1
ee-first@1.1.1: {}
@@ -12684,7 +13341,7 @@ snapshots:
typed-array-buffer: 1.0.2
typed-array-byte-length: 1.0.1
typed-array-byte-offset: 1.0.3
- typed-array-length: 1.0.6
+ typed-array-length: 1.0.7
unbox-primitive: 1.0.2
which-typed-array: 1.1.15
@@ -12799,25 +13456,58 @@ snapshots:
escape-string-regexp@5.0.0: {}
- eslint-config-next@14.2.5(eslint@8.57.1)(typescript@5.6.3):
+ eslint-config-custom@0.0.0(eslint@8.57.1)(typescript@5.7.2):
+ dependencies:
+ eslint-config-next: 12.3.4(eslint@8.57.1)(typescript@5.7.2)
+ eslint-config-prettier: 8.10.0(eslint@8.57.1)
+ eslint-plugin-react: 7.28.0(eslint@8.57.1)
+ transitivePeerDependencies:
+ - eslint
+ - eslint-import-resolver-webpack
+ - supports-color
+ - typescript
+
+ eslint-config-next@12.3.4(eslint@8.57.1)(typescript@5.7.2):
+ dependencies:
+ '@next/eslint-plugin-next': 12.3.4
+ '@rushstack/eslint-patch': 1.10.4
+ '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2)
+ eslint: 8.57.1
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1)
+ eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1)
+ eslint-plugin-react: 7.37.2(eslint@8.57.1)
+ eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1)
+ optionalDependencies:
+ typescript: 5.7.2
+ transitivePeerDependencies:
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-config-next@14.2.5(eslint@8.57.1)(typescript@5.7.2):
dependencies:
'@next/eslint-plugin-next': 14.2.5
'@rushstack/eslint-patch': 1.10.4
- '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.3)
+ '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.7.2)
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1)
- eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1)
eslint-plugin-react: 7.37.2(eslint@8.57.1)
eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1)
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.7.2
transitivePeerDependencies:
- eslint-import-resolver-webpack
- eslint-plugin-import-x
- supports-color
+ eslint-config-prettier@8.10.0(eslint@8.57.1):
+ dependencies:
+ eslint: 8.57.1
+
eslint-config-prettier@9.1.0(eslint@8.57.1):
dependencies:
eslint: 8.57.1
@@ -12830,37 +13520,100 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1):
+ eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.31.0)(eslint@8.57.1):
+ dependencies:
+ debug: 4.3.7
+ eslint: 8.57.1
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ glob: 7.2.3
+ is-glob: 4.0.3
+ resolve: 1.22.8
+ tsconfig-paths: 3.15.0
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1):
+ dependencies:
+ '@nolyfill/is-core-module': 1.0.39
+ debug: 4.3.7
+ enhanced-resolve: 5.17.1
+ eslint: 8.57.1
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ fast-glob: 3.3.2
+ get-tsconfig: 4.8.1
+ is-bun-module: 1.2.1
+ is-glob: 4.0.3
+ optionalDependencies:
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ transitivePeerDependencies:
+ - '@typescript-eslint/parser'
+ - eslint-import-resolver-node
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.3.7
enhanced-resolve: 5.17.1
eslint: 8.57.1
- eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
fast-glob: 3.3.2
get-tsconfig: 4.8.1
is-bun-module: 1.2.1
is-glob: 4.0.3
optionalDependencies:
- eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
transitivePeerDependencies:
- '@typescript-eslint/parser'
- eslint-import-resolver-node
- eslint-import-resolver-webpack
- supports-color
- eslint-module-utils@2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1):
+ dependencies:
+ debug: 3.2.7
+ optionalDependencies:
+ '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2)
+ eslint: 8.57.1
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
dependencies:
debug: 3.2.7
optionalDependencies:
- '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.3)
+ '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.7.2)
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1)
transitivePeerDependencies:
- supports-color
- eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
+ dependencies:
+ debug: 3.2.7
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.7.2)
+ eslint: 8.57.1
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
+ dependencies:
+ debug: 3.2.7
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.7.2)
+ eslint: 8.57.1
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.8
@@ -12871,7 +13624,7 @@ snapshots:
doctrine: 2.1.0
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1)
hasown: 2.0.2
is-core-module: 2.15.1
is-glob: 4.0.3
@@ -12883,7 +13636,65 @@ snapshots:
string.prototype.trimend: 1.0.8
tsconfig-paths: 3.15.0
optionalDependencies:
- '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.3)
+ '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2)
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
+ dependencies:
+ '@rtsao/scc': 1.1.0
+ array-includes: 3.1.8
+ array.prototype.findlastindex: 1.2.5
+ array.prototype.flat: 1.3.2
+ array.prototype.flatmap: 1.3.2
+ debug: 3.2.7
+ doctrine: 2.1.0
+ eslint: 8.57.1
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ hasown: 2.0.2
+ is-core-module: 2.15.1
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.0
+ semver: 6.3.1
+ string.prototype.trimend: 1.0.8
+ tsconfig-paths: 3.15.0
+ optionalDependencies:
+ '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.7.2)
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
+ dependencies:
+ '@rtsao/scc': 1.1.0
+ array-includes: 3.1.8
+ array.prototype.findlastindex: 1.2.5
+ array.prototype.flat: 1.3.2
+ array.prototype.flatmap: 1.3.2
+ debug: 3.2.7
+ doctrine: 2.1.0
+ eslint: 8.57.1
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ hasown: 2.0.2
+ is-core-module: 2.15.1
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.0
+ semver: 6.3.1
+ string.prototype.trimend: 1.0.8
+ tsconfig-paths: 3.15.0
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.7.2)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
@@ -12908,10 +13719,32 @@ snapshots:
safe-regex-test: 1.0.3
string.prototype.includes: 2.0.1
+ eslint-plugin-react-hooks@4.6.2(eslint@8.57.1):
+ dependencies:
+ eslint: 8.57.1
+
eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1):
dependencies:
eslint: 8.57.1
+ eslint-plugin-react@7.28.0(eslint@8.57.1):
+ dependencies:
+ array-includes: 3.1.8
+ array.prototype.flatmap: 1.3.2
+ doctrine: 2.1.0
+ eslint: 8.57.1
+ estraverse: 5.3.0
+ jsx-ast-utils: 3.3.5
+ minimatch: 3.1.2
+ object.entries: 1.1.8
+ object.fromentries: 2.0.8
+ object.hasown: 1.1.4
+ object.values: 1.2.0
+ prop-types: 15.8.1
+ resolve: 2.0.0-next.5
+ semver: 6.3.1
+ string.prototype.matchall: 4.0.11
+
eslint-plugin-react@7.37.2(eslint@8.57.1):
dependencies:
array-includes: 3.1.8
@@ -12947,6 +13780,8 @@ snapshots:
eslint-visitor-keys@3.4.3: {}
+ eslint-visitor-keys@4.2.0: {}
+
eslint@8.57.1:
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
@@ -12990,7 +13825,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
- esm-env@1.1.4: {}
+ esm-env@1.1.4:
+ optional: true
espree@9.6.1:
dependencies:
@@ -13008,6 +13844,7 @@ snapshots:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
'@types/estree': 1.0.6
+ optional: true
esrecurse@4.3.0:
dependencies:
@@ -13017,7 +13854,8 @@ snapshots:
estree-util-is-identifier-name@3.0.0: {}
- estree-walker@2.0.2: {}
+ estree-walker@2.0.2:
+ optional: true
estree-walker@3.0.3:
dependencies:
@@ -13084,6 +13922,8 @@ snapshots:
eventsource-parser@1.1.2: {}
+ eventsource-parser@3.0.0: {}
+
execa@5.1.1:
dependencies:
cross-spawn: 7.0.6
@@ -13217,7 +14057,7 @@ snapshots:
flow-enums-runtime@0.0.6: {}
- flow-parser@0.254.1: {}
+ flow-parser@0.254.2: {}
follow-redirects@1.15.9: {}
@@ -13236,6 +14076,8 @@ snapshots:
combined-stream: 1.0.8
mime-types: 2.1.35
+ fraction.js@4.3.7: {}
+
framer-motion@11.11.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
tslib: 2.8.1
@@ -13263,9 +14105,9 @@ snapshots:
functions-have-names@1.2.3: {}
- geist@1.3.1(next@15.0.4-canary.15(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)):
+ geist@1.3.1(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)):
dependencies:
- next: 15.0.4-canary.15(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ next: 15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
gensync@1.0.0-beta.2: {}
@@ -13309,6 +14151,8 @@ snapshots:
dependencies:
is-glob: 4.0.3
+ glob-to-regexp@0.4.1: {}
+
glob@10.3.10:
dependencies:
foreground-child: 3.3.0
@@ -13326,6 +14170,24 @@ snapshots:
package-json-from-dist: 1.0.1
path-scurry: 1.11.1
+ glob@11.0.0:
+ dependencies:
+ foreground-child: 3.3.0
+ jackspeak: 4.0.2
+ minimatch: 10.0.1
+ minipass: 7.1.2
+ package-json-from-dist: 1.0.1
+ path-scurry: 2.0.0
+
+ glob@7.1.7:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
glob@7.2.3:
dependencies:
fs.realpath: 1.0.0
@@ -13635,7 +14497,7 @@ snapshots:
is-extglob@2.1.1: {}
- is-finalizationregistry@1.0.2:
+ is-finalizationregistry@1.1.0:
dependencies:
call-bind: 1.0.7
@@ -13680,6 +14542,7 @@ snapshots:
is-reference@3.0.3:
dependencies:
'@types/estree': 1.0.6
+ optional: true
is-regex@1.1.4:
dependencies:
@@ -13781,7 +14644,7 @@ snapshots:
define-properties: 1.2.1
get-intrinsic: 1.2.4
has-symbols: 1.0.3
- reflect.getprototypeof: 1.0.6
+ reflect.getprototypeof: 1.0.7
set-function-name: 2.0.2
jackspeak@2.3.6:
@@ -13796,6 +14659,10 @@ snapshots:
optionalDependencies:
'@pkgjs/parseargs': 0.11.0
+ jackspeak@4.0.2:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+
jest-diff@29.7.0:
dependencies:
chalk: 4.1.2
@@ -13808,7 +14675,7 @@ snapshots:
'@jest/environment': 29.7.0
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.17.6
+ '@types/node': 22.9.3
jest-mock: 29.7.0
jest-util: 29.7.0
@@ -13818,7 +14685,7 @@ snapshots:
dependencies:
'@jest/types': 29.6.3
'@types/graceful-fs': 4.1.9
- '@types/node': 20.17.6
+ '@types/node': 22.9.3
anymatch: 3.1.3
fb-watchman: 2.0.2
graceful-fs: 4.2.11
@@ -13852,7 +14719,7 @@ snapshots:
jest-mock@29.7.0:
dependencies:
'@jest/types': 29.6.3
- '@types/node': 20.17.6
+ '@types/node': 22.9.3
jest-util: 29.7.0
jest-regex-util@29.6.3: {}
@@ -13860,7 +14727,7 @@ snapshots:
jest-util@29.7.0:
dependencies:
'@jest/types': 29.6.3
- '@types/node': 20.17.6
+ '@types/node': 22.9.3
chalk: 4.1.2
ci-info: 3.9.0
graceful-fs: 4.2.11
@@ -13877,7 +14744,7 @@ snapshots:
jest-worker@29.7.0:
dependencies:
- '@types/node': 20.17.6
+ '@types/node': 22.9.3
jest-util: 29.7.0
merge-stream: 2.0.0
supports-color: 8.1.1
@@ -13886,8 +14753,12 @@ snapshots:
jiti@2.4.0: {}
+ jose@4.15.9: {}
+
joycon@3.1.1: {}
+ js-cookie@3.0.1: {}
+
js-tokens@4.0.0: {}
js-yaml@3.14.1:
@@ -13917,7 +14788,7 @@ snapshots:
'@babel/register': 7.25.9(@babel/core@7.26.0)
babel-core: 7.0.0-bridge.0(@babel/core@7.26.0)
chalk: 4.1.2
- flow-parser: 0.254.1
+ flow-parser: 0.254.2
graceful-fs: 4.2.11
micromatch: 4.0.8
neo-async: 2.6.2
@@ -14093,7 +14964,8 @@ snapshots:
lit-element: 4.1.1
lit-html: 3.2.1
- locate-character@3.0.0: {}
+ locate-character@3.0.0:
+ optional: true
locate-path@3.0.0:
dependencies:
@@ -14138,11 +15010,13 @@ snapshots:
lru-cache@10.4.3: {}
+ lru-cache@11.0.2: {}
+
lru-cache@5.1.1:
dependencies:
yallist: 3.1.1
- lucide-react@0.446.0(react@18.2.0):
+ lucide-react@0.460.0(react@18.2.0):
dependencies:
react: 18.2.0
@@ -14165,6 +15039,8 @@ snapshots:
dependencies:
tmpl: 1.0.5
+ map-obj@4.3.0: {}
+
markdown-it@14.1.0:
dependencies:
argparse: 2.0.1
@@ -14752,6 +15628,10 @@ snapshots:
minimalistic-crypto-utils@1.0.1: {}
+ minimatch@10.0.1:
+ dependencies:
+ brace-expansion: 2.0.1
+
minimatch@3.1.2:
dependencies:
brace-expansion: 1.1.11
@@ -14768,9 +15648,9 @@ snapshots:
minipass@7.1.2: {}
- mipd@0.0.7(typescript@5.6.3):
+ mipd@0.0.7(typescript@5.7.2):
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.7.2
mkdirp-classic@0.5.3: {}
@@ -14831,26 +15711,26 @@ snapshots:
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- next@15.0.4-canary.15(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@next/env': 15.0.4-canary.15
+ '@next/env': 15.0.3
'@swc/counter': 0.1.3
'@swc/helpers': 0.5.13
busboy: 1.6.0
- caniuse-lite: 1.0.30001683
+ caniuse-lite: 1.0.30001684
postcss: 8.4.31
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
styled-jsx: 5.1.6(@babel/core@7.26.0)(react@18.2.0)
optionalDependencies:
- '@next/swc-darwin-arm64': 15.0.4-canary.15
- '@next/swc-darwin-x64': 15.0.4-canary.15
- '@next/swc-linux-arm64-gnu': 15.0.4-canary.15
- '@next/swc-linux-arm64-musl': 15.0.4-canary.15
- '@next/swc-linux-x64-gnu': 15.0.4-canary.15
- '@next/swc-linux-x64-musl': 15.0.4-canary.15
- '@next/swc-win32-arm64-msvc': 15.0.4-canary.15
- '@next/swc-win32-x64-msvc': 15.0.4-canary.15
+ '@next/swc-darwin-arm64': 15.0.3
+ '@next/swc-darwin-x64': 15.0.3
+ '@next/swc-linux-arm64-gnu': 15.0.3
+ '@next/swc-linux-arm64-musl': 15.0.3
+ '@next/swc-linux-x64-gnu': 15.0.3
+ '@next/swc-linux-x64-musl': 15.0.3
+ '@next/swc-win32-arm64-msvc': 15.0.3
+ '@next/swc-win32-x64-msvc': 15.0.3
'@opentelemetry/api': 1.9.0
sharp: 0.33.5
transitivePeerDependencies:
@@ -14910,6 +15790,8 @@ snapshots:
normalize-path@3.0.0: {}
+ normalize-range@0.1.2: {}
+
npm-run-path@4.0.1:
dependencies:
path-key: 3.1.1
@@ -14970,6 +15852,12 @@ snapshots:
define-properties: 1.2.1
es-abstract: 1.23.5
+ object.hasown@1.1.4:
+ dependencies:
+ define-properties: 1.2.1
+ es-abstract: 1.23.5
+ es-object-atoms: 1.0.0
+
object.values@1.2.0:
dependencies:
call-bind: 1.0.7
@@ -15024,17 +15912,17 @@ snapshots:
orderedmap@2.1.1: {}
- ox@0.1.2(typescript@5.6.3)(zod@3.23.8):
+ ox@0.1.2(typescript@5.7.2)(zod@3.23.8):
dependencies:
'@adraffy/ens-normalize': 1.11.0
'@noble/curves': 1.6.0
'@noble/hashes': 1.5.0
'@scure/bip32': 1.5.0
'@scure/bip39': 1.4.0
- abitype: 1.0.6(typescript@5.6.3)(zod@3.23.8)
+ abitype: 1.0.6(typescript@5.7.2)(zod@3.23.8)
eventemitter3: 5.0.1
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.7.2
transitivePeerDependencies:
- zod
@@ -15114,6 +16002,13 @@ snapshots:
lru-cache: 10.4.3
minipass: 7.1.2
+ path-scurry@2.0.0:
+ dependencies:
+ lru-cache: 11.0.2
+ minipass: 7.1.2
+
+ path-to-regexp@6.2.1: {}
+
path-type@4.0.0: {}
pathe@1.1.2: {}
@@ -15243,7 +16138,7 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
- preact@10.24.3: {}
+ preact@10.25.0: {}
prebuild-install@7.1.2:
dependencies:
@@ -15262,6 +16157,10 @@ snapshots:
prelude-ls@1.2.1: {}
+ prettier-plugin-tailwindcss@0.6.9(prettier@3.3.3):
+ dependencies:
+ prettier: 3.3.3
+
prettier@3.3.3: {}
pretty-format@27.5.1:
@@ -15304,7 +16203,7 @@ snapshots:
dependencies:
prosemirror-state: 1.4.3
prosemirror-transform: 1.10.2
- prosemirror-view: 1.36.0
+ prosemirror-view: 1.37.0
prosemirror-example-setup@1.2.3:
dependencies:
@@ -15323,13 +16222,13 @@ snapshots:
prosemirror-keymap: 1.2.2
prosemirror-model: 1.23.0
prosemirror-state: 1.4.3
- prosemirror-view: 1.36.0
+ prosemirror-view: 1.37.0
prosemirror-history@1.4.1:
dependencies:
prosemirror-state: 1.4.3
prosemirror-transform: 1.10.2
- prosemirror-view: 1.36.0
+ prosemirror-view: 1.37.0
rope-sequence: 1.3.4
prosemirror-inputrules@1.4.0:
@@ -15373,13 +16272,13 @@ snapshots:
dependencies:
prosemirror-model: 1.23.0
prosemirror-transform: 1.10.2
- prosemirror-view: 1.36.0
+ prosemirror-view: 1.37.0
prosemirror-transform@1.10.2:
dependencies:
prosemirror-model: 1.23.0
- prosemirror-view@1.36.0:
+ prosemirror-view@1.37.0:
dependencies:
prosemirror-model: 1.23.0
prosemirror-state: 1.4.3
@@ -15466,6 +16365,20 @@ snapshots:
'@babel/runtime': 7.26.0
react: 18.2.0
+ react-hook-form@7.53.2(react@18.2.0):
+ dependencies:
+ react: 18.2.0
+
+ react-icons@5.3.0(react@18.2.0):
+ dependencies:
+ react: 18.2.0
+
+ react-intersection-observer@9.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ dependencies:
+ react: 18.2.0
+ optionalDependencies:
+ react-dom: 18.2.0(react@18.2.0)
+
react-is@16.13.1: {}
react-is@17.0.2: {}
@@ -15622,15 +16535,15 @@ snapshots:
indent-string: 4.0.0
strip-indent: 3.0.0
- reflect.getprototypeof@1.0.6:
+ reflect.getprototypeof@1.0.7:
dependencies:
call-bind: 1.0.7
define-properties: 1.2.1
es-abstract: 1.23.5
es-errors: 1.3.0
get-intrinsic: 1.2.4
- globalthis: 1.0.4
- which-builtin-type: 1.1.4
+ gopd: 1.0.1
+ which-builtin-type: 1.2.0
regenerate-unicode-properties@10.2.0:
dependencies:
@@ -15738,33 +16651,38 @@ snapshots:
dependencies:
glob: 7.2.3
+ rimraf@6.0.1:
+ dependencies:
+ glob: 11.0.0
+ package-json-from-dist: 1.0.1
+
ripemd160@2.0.2:
dependencies:
hash-base: 3.1.0
inherits: 2.0.4
- rollup@4.27.3:
+ rollup@4.27.4:
dependencies:
'@types/estree': 1.0.6
optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.27.3
- '@rollup/rollup-android-arm64': 4.27.3
- '@rollup/rollup-darwin-arm64': 4.27.3
- '@rollup/rollup-darwin-x64': 4.27.3
- '@rollup/rollup-freebsd-arm64': 4.27.3
- '@rollup/rollup-freebsd-x64': 4.27.3
- '@rollup/rollup-linux-arm-gnueabihf': 4.27.3
- '@rollup/rollup-linux-arm-musleabihf': 4.27.3
- '@rollup/rollup-linux-arm64-gnu': 4.27.3
- '@rollup/rollup-linux-arm64-musl': 4.27.3
- '@rollup/rollup-linux-powerpc64le-gnu': 4.27.3
- '@rollup/rollup-linux-riscv64-gnu': 4.27.3
- '@rollup/rollup-linux-s390x-gnu': 4.27.3
- '@rollup/rollup-linux-x64-gnu': 4.27.3
- '@rollup/rollup-linux-x64-musl': 4.27.3
- '@rollup/rollup-win32-arm64-msvc': 4.27.3
- '@rollup/rollup-win32-ia32-msvc': 4.27.3
- '@rollup/rollup-win32-x64-msvc': 4.27.3
+ '@rollup/rollup-android-arm-eabi': 4.27.4
+ '@rollup/rollup-android-arm64': 4.27.4
+ '@rollup/rollup-darwin-arm64': 4.27.4
+ '@rollup/rollup-darwin-x64': 4.27.4
+ '@rollup/rollup-freebsd-arm64': 4.27.4
+ '@rollup/rollup-freebsd-x64': 4.27.4
+ '@rollup/rollup-linux-arm-gnueabihf': 4.27.4
+ '@rollup/rollup-linux-arm-musleabihf': 4.27.4
+ '@rollup/rollup-linux-arm64-gnu': 4.27.4
+ '@rollup/rollup-linux-arm64-musl': 4.27.4
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.27.4
+ '@rollup/rollup-linux-riscv64-gnu': 4.27.4
+ '@rollup/rollup-linux-s390x-gnu': 4.27.4
+ '@rollup/rollup-linux-x64-gnu': 4.27.4
+ '@rollup/rollup-linux-x64-musl': 4.27.4
+ '@rollup/rollup-win32-arm64-msvc': 4.27.4
+ '@rollup/rollup-win32-ia32-msvc': 4.27.4
+ '@rollup/rollup-win32-x64-msvc': 4.27.4
fsevents: 2.3.3
rope-sequence@1.3.4: {}
@@ -15860,6 +16778,8 @@ snapshots:
set-blocking@2.0.0: {}
+ set-cookie-parser@2.7.1: {}
+
set-function-length@1.2.2:
dependencies:
define-data-property: 1.1.4
@@ -15971,6 +16891,12 @@ snapshots:
dot-case: 3.0.4
tslib: 2.8.1
+ snakecase-keys@5.4.4:
+ dependencies:
+ map-obj: 4.3.0
+ snake-case: 3.0.4
+ type-fest: 2.19.0
+
socket.io-client@4.8.1(bufferutil@4.0.8)(utf-8-validate@5.0.10):
dependencies:
'@socket.io/component-emitter': 3.1.2
@@ -16021,11 +16947,6 @@ snapshots:
sprintf-js@1.0.3: {}
- sswr@2.1.0(svelte@5.2.3):
- dependencies:
- svelte: 5.2.3
- swrev: 4.0.0
-
stack-utils@2.0.6:
dependencies:
escape-string-regexp: 2.0.0
@@ -16198,6 +17119,7 @@ snapshots:
locate-character: 3.0.0
magic-string: 0.30.13
zimmerframe: 1.1.2
+ optional: true
svg-parser@2.0.4: {}
@@ -16211,23 +17133,22 @@ snapshots:
csso: 5.0.5
picocolors: 1.1.1
- swr@2.2.5(react@18.2.0):
+ swr@2.2.0(react@18.2.0):
dependencies:
- client-only: 0.0.1
react: 18.2.0
use-sync-external-store: 1.2.2(react@18.2.0)
- swrev@4.0.0: {}
-
- swrv@1.0.4(vue@3.5.13(typescript@5.6.3)):
+ swr@2.2.5(react@18.2.0):
dependencies:
- vue: 3.5.13(typescript@5.6.3)
+ client-only: 0.0.1
+ react: 18.2.0
+ use-sync-external-store: 1.2.2(react@18.2.0)
symbol-tree@3.2.4: {}
system-architecture@0.1.0: {}
- tailwind-merge@2.5.4: {}
+ tailwind-merge@2.5.5: {}
tailwindcss-animate@1.0.7(tailwindcss@3.4.15):
dependencies:
@@ -16351,11 +17272,11 @@ snapshots:
tinyspy@3.0.2: {}
- tldts-core@6.1.63: {}
+ tldts-core@6.1.64: {}
- tldts@6.1.63:
+ tldts@6.1.64:
dependencies:
- tldts-core: 6.1.63
+ tldts-core: 6.1.64
tmpl@1.0.5: {}
@@ -16369,7 +17290,7 @@ snapshots:
tough-cookie@5.0.0:
dependencies:
- tldts: 6.1.63
+ tldts: 6.1.64
tr46@0.0.3: {}
@@ -16381,15 +17302,15 @@ snapshots:
trough@2.2.0: {}
- ts-api-utils@1.4.0(typescript@5.6.3):
+ ts-api-utils@1.4.1(typescript@5.7.2):
dependencies:
- typescript: 5.6.3
+ typescript: 5.7.2
ts-interface-checker@0.1.13: {}
- tsconfck@3.1.4(typescript@5.6.3):
+ tsconfck@3.1.4(typescript@5.7.2):
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.7.2
tsconfig-paths@3.15.0:
dependencies:
@@ -16400,10 +17321,17 @@ snapshots:
tslib@1.14.1: {}
+ tslib@2.4.1: {}
+
tslib@2.7.0: {}
tslib@2.8.1: {}
+ tsutils@3.21.0(typescript@5.7.2):
+ dependencies:
+ tslib: 1.14.1
+ typescript: 5.7.2
+
tsx@4.19.2:
dependencies:
esbuild: 0.23.1
@@ -16425,6 +17353,8 @@ snapshots:
type-fest@0.7.1: {}
+ type-fest@2.19.0: {}
+
typed-array-buffer@1.0.2:
dependencies:
call-bind: 1.0.7
@@ -16447,20 +17377,20 @@ snapshots:
gopd: 1.0.1
has-proto: 1.0.3
is-typed-array: 1.1.13
- reflect.getprototypeof: 1.0.6
+ reflect.getprototypeof: 1.0.7
- typed-array-length@1.0.6:
+ typed-array-length@1.0.7:
dependencies:
call-bind: 1.0.7
for-each: 0.3.3
gopd: 1.0.1
- has-proto: 1.0.3
is-typed-array: 1.1.13
possible-typed-array-names: 1.0.0
+ reflect.getprototypeof: 1.0.7
typeforce@1.18.0: {}
- typescript@5.6.3: {}
+ typescript@5.7.2: {}
ua-parser-js@1.0.39: {}
@@ -16620,6 +17550,8 @@ snapshots:
utils-merge@1.0.1: {}
+ uuid@11.0.3: {}
+
uuid@8.3.2: {}
uuid@9.0.1: {}
@@ -16648,31 +17580,31 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.2
- viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8):
+ viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8):
dependencies:
'@noble/curves': 1.6.0
'@noble/hashes': 1.5.0
'@scure/bip32': 1.5.0
'@scure/bip39': 1.4.0
- abitype: 1.0.6(typescript@5.6.3)(zod@3.23.8)
+ abitype: 1.0.6(typescript@5.7.2)(zod@3.23.8)
isows: 1.0.6(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))
- ox: 0.1.2(typescript@5.6.3)(zod@3.23.8)
+ ox: 0.1.2(typescript@5.7.2)(zod@3.23.8)
webauthn-p256: 0.0.10
ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.7.2
transitivePeerDependencies:
- bufferutil
- utf-8-validate
- zod
- vite-node@2.1.5(@types/node@20.17.6)(terser@5.36.0):
+ vite-node@2.1.5(@types/node@22.9.3)(terser@5.36.0):
dependencies:
cac: 6.7.14
debug: 4.3.7
es-module-lexer: 1.5.4
pathe: 1.1.2
- vite: 5.4.11(@types/node@20.17.6)(terser@5.36.0)
+ vite: 5.4.11(@types/node@22.9.3)(terser@5.36.0)
transitivePeerDependencies:
- '@types/node'
- less
@@ -16684,31 +17616,31 @@ snapshots:
- supports-color
- terser
- vite-tsconfig-paths@4.3.2(typescript@5.6.3)(vite@5.4.11(@types/node@20.17.6)(terser@5.36.0)):
+ vite-tsconfig-paths@4.3.2(typescript@5.7.2)(vite@5.4.11(@types/node@22.9.3)(terser@5.36.0)):
dependencies:
debug: 4.3.7
globrex: 0.1.2
- tsconfck: 3.1.4(typescript@5.6.3)
+ tsconfck: 3.1.4(typescript@5.7.2)
optionalDependencies:
- vite: 5.4.11(@types/node@20.17.6)(terser@5.36.0)
+ vite: 5.4.11(@types/node@22.9.3)(terser@5.36.0)
transitivePeerDependencies:
- supports-color
- typescript
- vite@5.4.11(@types/node@20.17.6)(terser@5.36.0):
+ vite@5.4.11(@types/node@22.9.3)(terser@5.36.0):
dependencies:
esbuild: 0.21.5
postcss: 8.4.49
- rollup: 4.27.3
+ rollup: 4.27.4
optionalDependencies:
- '@types/node': 20.17.6
+ '@types/node': 22.9.3
fsevents: 2.3.3
terser: 5.36.0
- vitest@2.1.5(@types/node@20.17.6)(@vitest/ui@2.1.5)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.36.0):
+ vitest@2.1.5(@types/node@22.9.3)(@vitest/ui@2.1.5)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.36.0):
dependencies:
'@vitest/expect': 2.1.5
- '@vitest/mocker': 2.1.5(vite@5.4.11(@types/node@20.17.6)(terser@5.36.0))
+ '@vitest/mocker': 2.1.5(vite@5.4.11(@types/node@22.9.3)(terser@5.36.0))
'@vitest/pretty-format': 2.1.5
'@vitest/runner': 2.1.5
'@vitest/snapshot': 2.1.5
@@ -16724,11 +17656,11 @@ snapshots:
tinyexec: 0.3.1
tinypool: 1.0.2
tinyrainbow: 1.2.0
- vite: 5.4.11(@types/node@20.17.6)(terser@5.36.0)
- vite-node: 2.1.5(@types/node@20.17.6)(terser@5.36.0)
+ vite: 5.4.11(@types/node@22.9.3)(terser@5.36.0)
+ vite-node: 2.1.5(@types/node@22.9.3)(terser@5.36.0)
why-is-node-running: 2.3.0
optionalDependencies:
- '@types/node': 20.17.6
+ '@types/node': 22.9.3
'@vitest/ui': 2.1.5(vitest@2.1.5)
jsdom: 25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)
transitivePeerDependencies:
@@ -16744,15 +17676,16 @@ snapshots:
vlq@1.0.1: {}
- vue@3.5.13(typescript@5.6.3):
+ vue@3.5.13(typescript@5.7.2):
dependencies:
'@vue/compiler-dom': 3.5.13
'@vue/compiler-sfc': 3.5.13
'@vue/runtime-dom': 3.5.13
- '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.6.3))
+ '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.2))
'@vue/shared': 3.5.13
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.7.2
+ optional: true
w3c-keyname@2.2.8: {}
@@ -16760,16 +17693,16 @@ snapshots:
dependencies:
xml-name-validator: 5.0.0
- wagmi@2.13.0(@tanstack/query-core@5.60.6)(@tanstack/react-query@5.61.0(react@18.2.0))(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8):
+ wagmi@2.13.0(@tanstack/query-core@5.60.6)(@tanstack/react-query@5.61.3(react@18.2.0))(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8):
dependencies:
- '@tanstack/react-query': 5.61.0(react@18.2.0)
- '@wagmi/connectors': 5.5.0(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(@wagmi/core@2.15.0(@tanstack/query-core@5.60.6)(@types/react@18.3.12)(react@18.2.0)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.2.0))(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
- '@wagmi/core': 2.15.0(@tanstack/query-core@5.60.6)(@types/react@18.3.12)(react@18.2.0)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.2.0))(viem@2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8))
+ '@tanstack/react-query': 5.61.3(react@18.2.0)
+ '@wagmi/connectors': 5.5.0(@types/react@18.3.12)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(@wagmi/core@2.15.0(@tanstack/query-core@5.60.6)(@types/react@18.3.12)(react@18.2.0)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.2.0))(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
+ '@wagmi/core': 2.15.0(@tanstack/query-core@5.60.6)(@types/react@18.3.12)(react@18.2.0)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.2.0))(viem@2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))
react: 18.2.0
use-sync-external-store: 1.2.0(react@18.2.0)
- viem: 2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ viem: 2.21.50(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.7.2
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
@@ -16836,13 +17769,14 @@ snapshots:
is-string: 1.0.7
is-symbol: 1.0.4
- which-builtin-type@1.1.4:
+ which-builtin-type@1.2.0:
dependencies:
+ call-bind: 1.0.7
function.prototype.name: 1.1.6
has-tostringtag: 1.0.2
is-async-function: 2.0.0
is-date-object: 1.0.5
- is-finalizationregistry: 1.0.2
+ is-finalizationregistry: 1.1.0
is-generator-function: 1.0.10
is-regex: 1.1.4
is-weakref: 1.0.2
@@ -16985,7 +17919,8 @@ snapshots:
yocto-queue@0.1.0: {}
- zimmerframe@1.1.2: {}
+ zimmerframe@1.1.2:
+ optional: true
zod-to-json-schema@3.23.5(zod@3.23.8):
dependencies:
diff --git a/supabase/migrations/20240101000000_create_tables.sql b/supabase/migrations/20240101000000_create_tables.sql
new file mode 100644
index 0000000..c292dd2
--- /dev/null
+++ b/supabase/migrations/20240101000000_create_tables.sql
@@ -0,0 +1,64 @@
+-- Enable UUID extension
+CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
+
+-- Create user_wallets table
+CREATE TABLE IF NOT EXISTS user_wallets (
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
+ user_id TEXT NOT NULL,
+ wallet_address TEXT NOT NULL,
+ network_id TEXT NOT NULL,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+);
+
+-- Create transactions table
+CREATE TABLE IF NOT EXISTS transactions (
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
+ user_id TEXT NOT NULL,
+ wallet_address TEXT NOT NULL,
+ network_id TEXT NOT NULL,
+ tx_hash TEXT NOT NULL,
+ tx_type TEXT NOT NULL,
+ status TEXT NOT NULL DEFAULT 'pending',
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+);
+
+-- Create user_settings table
+CREATE TABLE IF NOT EXISTS user_settings (
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
+ user_id TEXT NOT NULL UNIQUE,
+ sidebar_collapsed BOOLEAN DEFAULT false,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+);
+
+-- Create indexes
+CREATE INDEX idx_user_wallets_user_id ON user_wallets(user_id);
+CREATE INDEX idx_transactions_user_id ON transactions(user_id);
+CREATE INDEX idx_transactions_tx_hash ON transactions(tx_hash);
+
+-- Create updated_at trigger function
+CREATE OR REPLACE FUNCTION update_updated_at_column()
+RETURNS TRIGGER AS $$
+BEGIN
+ NEW.updated_at = NOW();
+ RETURN NEW;
+END;
+$$ language 'plpgsql';
+
+-- Create triggers
+CREATE TRIGGER update_user_wallets_updated_at
+ BEFORE UPDATE ON user_wallets
+ FOR EACH ROW
+ EXECUTE FUNCTION update_updated_at_column();
+
+CREATE TRIGGER update_transactions_updated_at
+ BEFORE UPDATE ON transactions
+ FOR EACH ROW
+ EXECUTE FUNCTION update_updated_at_column();
+
+CREATE TRIGGER update_user_settings_updated_at
+ BEFORE UPDATE ON user_settings
+ FOR EACH ROW
+ EXECUTE FUNCTION update_updated_at_column();
\ No newline at end of file
diff --git a/supabase/migrations/20240315000000_create_votes_table.sql b/supabase/migrations/20240315000000_create_votes_table.sql
new file mode 100644
index 0000000..2ea2e9d
--- /dev/null
+++ b/supabase/migrations/20240315000000_create_votes_table.sql
@@ -0,0 +1,20 @@
+-- Create votes table
+CREATE TABLE IF NOT EXISTS votes (
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
+ chat_id TEXT NOT NULL,
+ user_id TEXT NOT NULL,
+ value INTEGER NOT NULL CHECK (value IN (-1, 1)),
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ UNIQUE(chat_id, user_id)
+);
+
+-- Create indexes
+CREATE INDEX idx_votes_chat_id ON votes(chat_id);
+CREATE INDEX idx_votes_user_id ON votes(user_id);
+
+-- Add trigger for updated_at
+CREATE TRIGGER update_votes_updated_at
+ BEFORE UPDATE ON votes
+ FOR EACH ROW
+ EXECUTE FUNCTION update_updated_at_column();
\ No newline at end of file
diff --git a/tests/components/custom/multimodal-input.test.tsx b/tests/components/custom/multimodal-input.test.tsx
new file mode 100644
index 0000000..5875e6b
--- /dev/null
+++ b/tests/components/custom/multimodal-input.test.tsx
@@ -0,0 +1,87 @@
+import React from 'react';
+import { render, screen, fireEvent } from '@testing-library/react';
+import { MultimodalInput } from '@/components/custom/multimodal-input';
+
+describe('MultimodalInput Component', () => {
+ const defaultProps = {
+ chatId: 'test-chat',
+ input: '',
+ setInput: jest.fn(),
+ handleSubmit: jest.fn(),
+ isLoading: false,
+ stop: jest.fn(),
+ attachments: [],
+ setAttachments: jest.fn(),
+ messages: [],
+ setMessages: jest.fn(),
+ append: jest.fn(),
+ webSearchEnabled: true,
+ };
+
+ it('renders without crashing', () => {
+ render();
+ expect(screen.getByPlaceholderText('Send a message...')).toBeInTheDocument();
+ });
+
+ it('calls setInput on input change', () => {
+ render();
+ const inputElement = screen.getByPlaceholderText('Send a message...');
+ fireEvent.change(inputElement, { target: { value: 'Hello' } });
+ expect(defaultProps.setInput).toHaveBeenCalledWith('Hello');
+ });
+
+ it('displays attachments info when attachments are present', () => {
+ const propsWithAttachments = {
+ ...defaultProps,
+ attachments: [{ name: 'file1.png' }],
+ };
+ render();
+ expect(screen.getByText('📎 1 attachment included')).toBeInTheDocument();
+ });
+
+ it('toggles web search mode correctly', () => {
+ render();
+ const button = screen.getByRole('button', { name: /globe/i });
+ fireEvent.click(button);
+ expect(defaultProps.setInput).toHaveBeenCalledWith('Search: ');
+ fireEvent.click(button);
+ expect(defaultProps.setInput).toHaveBeenCalledWith('');
+ });
+
+ it('handles file upload correctly', () => {
+ const file = new File(['hello'], 'hello.png', { type: 'image/png' });
+ render();
+ const input = screen.getByLabelText('Upload file');
+ fireEvent.change(input, { target: { files: [file] } });
+ expect(defaultProps.setAttachments).toHaveBeenCalledWith([file]);
+ });
+
+ it('displays correct placeholder in web search mode', () => {
+ render();
+ const button = screen.getByRole('button', { name: /globe/i });
+ fireEvent.click(button);
+ const inputElement = screen.getByPlaceholderText('Enter your search query...');
+ expect(inputElement).toBeInTheDocument();
+ });
+
+ it('displays correct placeholder in chat mode', () => {
+ render();
+ const inputElement = screen.getByPlaceholderText('Send a message...');
+ expect(inputElement).toBeInTheDocument();
+ });
+it('toggles web search mode correctly', () => {
+ render();
+ const button = screen.getByRole('button', { name: /globe/i });
+ fireEvent.click(button);
+ expect(defaultProps.setInput).toHaveBeenCalledWith('Search: ');
+ fireEvent.click(button);
+ expect(defaultProps.setInput).toHaveBeenCalledWith('');
+});
+
+it('handles file upload correctly', () => {
+ const file = new File(['hello'], 'hello.png', { type: 'image/png' });
+ render();
+ const input = screen.getByLabelText('Upload file');
+ fireEvent.change(input, { target: { files: [file] } });
+ expect(defaultProps.setAttachments).toHaveBeenCalledWith([file]);
+});
diff --git a/tsconfig.json b/tsconfig.json
index 2eb129b..70cca74 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -29,8 +29,42 @@
"@/components/custom/*": ["./components/custom/*"],
"@/ai/*": ["./ai/*"],
"@/db/*": ["./db/*"],
+ "@/public/*": ["./public/*"],
+ "@/types/*": ["./types/*"],
"@/actions/*": ["./actions/*"],
- "@/public/*": ["./public/*"]
+ "@/lib/supabase/*": ["./lib/supabase/*"],
+ "@/lib/supabase/hooks/*": ["./lib/supabase/hooks/*"],
+ "@/lib/supabase/utils/*": ["./lib/supabase/utils/*"],
+ "@/lib/supabase/types/*": ["./lib/supabase/types/*"],
+ "@/lib/supabase/actions/*": ["./lib/supabase/actions/*"],
+ "@/lib/supabase/db/*": ["./lib/supabase/db/*"],
+ "@/lib/supabase/ai/*": ["./lib/supabase/ai/*"],
+ "@/lib/supabase/components/*": ["./lib/supabase/components/*"],
+ "@/lib/supabase/components/custom/*": ["./lib/supabase/components/custom/*"],
+ "@/lib/supabase/tests/*": ["./lib/supabase/__tests__/*"],
+ "@/lib/supabase/public/*": ["./lib/supabase/public/*"],
+ "@/lib/supabase/lib/*": ["./lib/supabase/lib/*"],
+ "@/lib/supabase/lib/supabase/*": ["./lib/supabase/lib/supabase/*"],
+ "@/lib/supabase/lib/supabase/hooks/*": ["./lib/supabase/lib/supabase/hooks/*"],
+ "@/lib/supabase/lib/supabase/utils/*": ["./lib/supabase/lib/supabase/utils/*"],
+ "@/lib/supabase/lib/supabase/types/*": ["./lib/supabase/lib/supabase/types/*"],
+ "@/lib/supabase/lib/supabase/actions/*": ["./lib/supabase/lib/supabase/actions/*"],
+ "@/lib/supabase/lib/supabase/db/*": ["./lib/supabase/lib/supabase/db/*"],
+ "@/lib/supabase/lib/supabase/ai/*": ["./lib/supabase/lib/supabase/ai/*"],
+
+
+ "@/lib/supabase/lib/supabase/components/*": ["./lib/supabase/lib/supabase/components/*"],
+ "@/lib/supabase/lib/supabase/components/custom/*": ["./lib/supabase/lib/supabase/components/custom/*"],
+ "@/lib/supabase/lib/supabase/tests/*": ["./lib/supabase/lib/supabase/__tests__/*"],
+ "@/lib/supabase/lib/supabase/public/*": ["./lib/supabase/lib/supabase/public/*"],
+ "@/lib/supabase/lib/supabase/lib/*": ["./lib/supabase/lib/supabase/lib/*"],
+ "@/lib/supabase/lib/supabase/lib/supabase/*": ["./lib/supabase/lib/supabase/lib/supabase/*"],
+
+
+ "@/lib/supabase/lib/supabase/lib/supabase/hooks/*": ["./lib/supabase/lib/supabase/lib/supabase/hooks/*"],
+
+
+
},
"types": [
"node",
@@ -54,6 +88,10 @@
"coverage",
"dist",
"__test__",
- "**/__tests__/**"
+ "**/__tests__/**",
+ "**/*.test.ts",
+ "**/*.test.tsx",
+ "**/*.spec.ts",
+ "**/*.spec.tsx"
]
}
diff --git a/types/attachments.ts b/types/attachments.ts
new file mode 100644
index 0000000..23ba466
--- /dev/null
+++ b/types/attachments.ts
@@ -0,0 +1,14 @@
+import type { Attachment as AIAttachment } from 'ai';
+
+export interface Attachment {
+ url: string;
+ name: string;
+ contentType: string;
+ path?: string;
+}
+
+export type { AIAttachment };
+
+export interface ChatAttachment {
+ experimental_attachments?: Attachment[];
+}
diff --git a/types/chat.ts b/types/chat.ts
new file mode 100644
index 0000000..361f486
--- /dev/null
+++ b/types/chat.ts
@@ -0,0 +1,53 @@
+import type { Message, CreateMessage, ChatRequestOptions } from 'ai';
+import type { Attachment, AIAttachment } from './attachments';
+
+export interface ChatProps {
+ id: string;
+ initialMessages: Message[];
+ selectedModelId: string;
+}
+
+export interface MultimodalInputProps {
+ chatId: string;
+ input: string;
+ setInput: (value: string) => void;
+ handleSubmit: (e: React.FormEvent) => void;
+ isLoading: boolean;
+ stop: () => void;
+ attachments: AIAttachment[];
+ setAttachments: React.Dispatch>;
+ messages: Message[];
+ setMessages: React.Dispatch>;
+ append: (
+ message: CreateMessage,
+ options?: ChatRequestOptions
+ ) => Promise;
+ className?: string;
+ webSearchEnabled?: boolean;
+}
+
+export interface FileUploadState {
+ progress: number;
+ uploading: boolean;
+ error: string | null;
+}
+
+export interface AppendOptions extends ChatRequestOptions {
+ experimental_attachments?: AIAttachment[];
+}
+
+export type AppendFunction = (
+ message: CreateMessage,
+ options?: AppendOptions
+) => Promise;
+
+//find the chat type and return the chat type
+export function findChatType(chat: Chat): ChatType {
+ if (chat.type === "group") {
+ return "group";
+ } else if (chat.type === "direct") {
+ return "direct";
+ } else {
+ return "unknown";
+ }
+}