From c8522c1406490dbdb3706a9ccca3574387439853 Mon Sep 17 00:00:00 2001 From: Aman Srivastava Date: Tue, 14 Oct 2025 15:38:23 +0530 Subject: [PATCH 01/21] Added new dashboard for session analytics --- web/src/components/layouts/routes.tsx | 6 + .../project/[projectId]/juspay-dashboard.tsx | 1405 +++++++++++++++++ 2 files changed, 1411 insertions(+) create mode 100644 web/src/pages/project/[projectId]/juspay-dashboard.tsx diff --git a/web/src/components/layouts/routes.tsx b/web/src/components/layouts/routes.tsx index d152c094df70..769b93dd27b5 100644 --- a/web/src/components/layouts/routes.tsx +++ b/web/src/components/layouts/routes.tsx @@ -88,6 +88,12 @@ export const ROUTES: Route[] = [ icon: Home, section: RouteSection.Main, }, + { + title: "Session Analytics v2", + pathname: `/project/[projectId]/juspay-dashboard`, + icon: LayoutDashboard, + section: RouteSection.Main, + }, { title: "Dashboards", pathname: `/project/[projectId]/dashboards`, diff --git a/web/src/pages/project/[projectId]/juspay-dashboard.tsx b/web/src/pages/project/[projectId]/juspay-dashboard.tsx new file mode 100644 index 000000000000..ed8acc8b2e14 --- /dev/null +++ b/web/src/pages/project/[projectId]/juspay-dashboard.tsx @@ -0,0 +1,1405 @@ +import React, { useState } from "react"; +import { useRouter } from "next/router"; +import Page from "@/src/components/layouts/page"; +import { api } from "@/src/utils/api"; +import { Card } from "@/src/components/ui/card"; +import { Badge } from "@/src/components/ui/badge"; +import { Input } from "@/src/components/ui/input"; +import { ScrollArea } from "@/src/components/ui/scroll-area"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/src/components/ui/select"; +import { + User, + Search, + Filter, + CheckCircle2, + XCircle, + Clock, + Calendar +} from "lucide-react"; +import { cn } from "@/src/utils/tailwind"; +import { Skeleton } from "@/src/components/ui/skeleton"; +import { Button } from "@/src/components/ui/button"; +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "@/src/components/ui/collapsible"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/src/components/ui/popover"; +import { Calendar as CalendarComponent } from "@/src/components/ui/calendar"; +import { MarkdownJsonView } from "@/src/components/ui/MarkdownJsonView"; +import { PrettyJsonView } from "@/src/components/ui/PrettyJsonView"; +import { toast } from "sonner"; + +export default function JuspayDashboard() { + const router = useRouter(); + const projectId = router.query.projectId as string; + const sessionIdFromUrl = router.query.sessionId as string | undefined; + const [selectedSessionId, setSelectedSessionId] = useState(sessionIdFromUrl || null); + const [searchQuery, setSearchQuery] = useState(""); + const [selectedToolCall, setSelectedToolCall] = useState(null); + const [showFilters, setShowFilters] = useState(true); + const [showOnlyMerchant, setShowOnlyMerchant] = useState(false); + const [selectedTag, setSelectedTag] = useState("all"); + const [dateRange, setDateRange] = useState<{ from: Date; to: Date }>({ + from: new Date(new Date().setHours(0, 0, 0, 0)), + to: new Date(new Date().setHours(23, 59, 59, 999)), + }); + const [showDatePicker, setShowDatePicker] = useState(false); + const [filterCorrect, setFilterCorrect] = useState(false); + const [filterIncorrect, setFilterIncorrect] = useState(false); + + // Sync selectedSessionId with URL on mount and when URL changes + React.useEffect(() => { + if (sessionIdFromUrl && sessionIdFromUrl !== selectedSessionId) { + setSelectedSessionId(sessionIdFromUrl); + } + }, [sessionIdFromUrl]); + + // Clear selected tool call when session changes + React.useEffect(() => { + setSelectedToolCall(null); + setSelectedTraceForDetails(null); + }, [selectedSessionId]); + + // Update URL when session is selected + const handleSessionSelect = (sessionId: string) => { + setSelectedSessionId(sessionId); + router.push( + { + pathname: router.pathname, + query: { ...router.query, sessionId }, + }, + undefined, + { shallow: true } + ); + }; + + // Fetch sessions + const sessions = api.sessions.all.useQuery( + { + projectId, + filter: [], + page: 0, + limit: 100, + orderBy: { column: "createdAt", order: "DESC" }, + }, + { + enabled: !!projectId, + } + ); + + // Fetch all tags for filtering (no limit issues!) + const traceFilterOptions = api.traces.filterOptions.useQuery( + { + projectId, + timestampFilter: { + column: "timestamp", + type: "datetime", + operator: ">=", + value: dateRange.from, + }, + }, + { + enabled: !!projectId, + } + ); + + // Fetch traces for all sessions to get scores (within date range) + const allSessionsTraces = api.traces.all.useQuery( + { + projectId, + filter: [ + { + column: "timestamp", + type: "datetime", + operator: ">=", + value: dateRange.from, + }, + { + column: "timestamp", + type: "datetime", + operator: "<=", + value: dateRange.to, + }, + ], + searchQuery: null, + searchType: [], + page: 0, + limit: 100, // API maximum limit + orderBy: { column: "timestamp", order: "DESC" }, + }, + { + enabled: !!projectId && !!sessions.data?.sessions, + } + ); + + // Fetch scores for all traces to calculate statistics (within date range) + const allScores = api.scores.all.useQuery( + { + projectId, + filter: [ + { + column: "name", + type: "string", + operator: "=", + value: "genius-feedback", + }, + { + column: "timestamp", + type: "datetime", + operator: ">=", + value: dateRange.from, + }, + { + column: "timestamp", + type: "datetime", + operator: "<=", + value: dateRange.to, + }, + ], + page: 0, + limit: 100, // API maximum limit + orderBy: { column: "timestamp", order: "DESC" }, + }, + { + enabled: !!projectId && !!allSessionsTraces.data?.traces, + } + ); + + // Create a map of session IDs to their evaluation status (correct/incorrect) + const sessionEvaluationMap = React.useMemo(() => { + if (!allScores.data?.scores || !allSessionsTraces.data?.traces) { + return new Map(); + } + + const map = new Map(); + + // Group scores by session + const sessionScores = new Map(); + allScores.data.scores.forEach((score: any) => { + const trace = allSessionsTraces.data.traces.find((t) => t.id === score.traceId); + if (trace?.sessionId) { + if (!sessionScores.has(trace.sessionId)) { + sessionScores.set(trace.sessionId, []); + } + sessionScores.get(trace.sessionId)!.push(score.value); + } + }); + + // Determine session evaluation status + sessionScores.forEach((scores, sessionId) => { + const hasCorrect = scores.some((v) => v === 1); + const hasIncorrect = scores.some((v) => v === 0); + + if (hasCorrect && hasIncorrect) { + map.set(sessionId, "mixed"); + } else if (hasCorrect) { + map.set(sessionId, "correct"); + } else if (hasIncorrect) { + map.set(sessionId, "incorrect"); + } + }); + + return map; + }, [allScores.data?.scores, allSessionsTraces.data?.traces]); + + // Create a map of session IDs to their tags + const sessionToTagsMap = React.useMemo(() => { + if (!allSessionsTraces.data?.traces) return new Map(); + + const map = new Map(); + allSessionsTraces.data.traces.forEach((trace) => { + if (trace.sessionId && trace.tags && trace.tags.length > 0) { + // Store all tags for each session + if (!map.has(trace.sessionId)) { + map.set(trace.sessionId, trace.tags); + } else { + // Merge tags if session already exists + const existingTags = map.get(trace.sessionId) || []; + map.set(trace.sessionId, [...new Set([...existingTags, ...trace.tags])]); + } + } + }); + return map; + }, [allSessionsTraces.data?.traces]); + + // Get unique tags from filterOptions API (no 100-trace limit!) + const uniqueTags = React.useMemo(() => { + if (!traceFilterOptions.data?.tags) return []; + return traceFilterOptions.data.tags.map((t) => t.value).sort(); + }, [traceFilterOptions.data?.tags]); + + // Fetch traces for selected session + const sessionTraces = api.traces.all.useQuery( + { + projectId, + filter: selectedSessionId + ? [ + { + column: "sessionId", + type: "string", + operator: "=", + value: selectedSessionId, + }, + ] + : [], + searchQuery: null, + searchType: [], + page: 0, + limit: 100, + orderBy: { column: "timestamp", order: "ASC" }, + }, + { + enabled: !!projectId && !!selectedSessionId, + } + ); + + // Fetch full trace details for input/output + const [selectedTraceForDetails, setSelectedTraceForDetails] = useState<{ + traceId: string; + timestamp: Date; + } | null>(null); + + const traceDetails = api.traces.byIdWithObservationsAndScores.useQuery( + { + traceId: selectedTraceForDetails?.traceId ?? "", + projectId, + timestamp: selectedTraceForDetails?.timestamp ?? new Date(), + }, + { + enabled: !!selectedTraceForDetails && !!projectId, + } + ); + + // Get observations (tool calls) from trace details - filter out GENERATION type (llm-call) and sort by startTime + const observations = (traceDetails.data?.observations || []) + .filter((obs: any) => { + // Filter out llm-call observations by checking the name + const name = obs.name || ""; + return !name.toLowerCase().includes("llm-call"); + }) + .sort((a: any, b: any) => a.startTime.getTime() - b.startTime.getTime()); // Sort chronologically (earliest first) + + // Fetch metrics for traces to get level information + const traceMetrics = api.traces.metrics.useQuery( + { + projectId, + filter: selectedSessionId + ? [ + { + column: "sessionId", + type: "string", + operator: "=", + value: selectedSessionId, + }, + ] + : [], + traceIds: sessionTraces.data?.traces.map((t) => t.id) ?? [], + }, + { + enabled: !!projectId && !!selectedSessionId && !!sessionTraces.data?.traces, + } + ); + + const filteredSessions = React.useMemo(() => { + return sessions.data?.sessions.filter((session) => { + // Date range filter + const sessionDate = new Date(session.createdAt); + const matchesDateRange = sessionDate >= dateRange.from && sessionDate <= dateRange.to; + + if (!matchesDateRange) return false; + + // Search filter + const matchesSearch = searchQuery + ? session.id.toLowerCase().includes(searchQuery.toLowerCase()) || + session.userIds?.some((uid) => + uid.toLowerCase().includes(searchQuery.toLowerCase()) + ) + : true; + + if (!matchesSearch) return false; + + // Show only merchant data filter + // Hide sessions where user_id contains "@juspay" (internal users) + // Show only actual merchant/customer sessions + if (showOnlyMerchant) { + const hasJuspayUser = session.userIds?.some((uid) => + uid.toLowerCase().includes("@juspay") + ); + if (hasJuspayUser) return false; + } + + // Tag filter + if (selectedTag !== "all") { + const sessionTags = sessionToTagsMap.get(session.id); + if (!sessionTags || !sessionTags.includes(selectedTag)) return false; + } + + // Correct/Incorrect filter + if (filterCorrect || filterIncorrect) { + const evaluation = sessionEvaluationMap.get(session.id); + + // If both filters are checked, show sessions that match either + if (filterCorrect && filterIncorrect) { + if (!evaluation) return false; + } + // If only correct is checked + else if (filterCorrect) { + if (evaluation !== "correct") return false; + } + // If only incorrect is checked + else if (filterIncorrect) { + if (evaluation !== "incorrect" && evaluation !== "mixed") return false; + } + } + + return true; + }); + }, [sessions.data?.sessions, dateRange, searchQuery, showOnlyMerchant, selectedTag, filterCorrect, filterIncorrect, sessionToTagsMap, sessionEvaluationMap]); + + // Calculate statistics based on queries (traces) not sessions + const statistics = React.useMemo(() => { + if (!allSessionsTraces.data?.traces) { + return { totalQueries: 0, correctQueries: 0, incorrectQueries: 0, correctPercentage: 0, totalSessions: 0 }; + } + + // Total queries = all traces in the date range + const totalQueries = allSessionsTraces.data.traces.length; + + // Count correct/incorrect queries from genius-feedback scores + let correctQueries = 0; + let incorrectQueries = 0; + + if (allScores.data?.scores) { + allScores.data.scores.forEach((score: any) => { + if (score.value === 1) { + correctQueries++; + } else if (score.value === 0) { + incorrectQueries++; + } + }); + } + + const correctPercentage = totalQueries > 0 ? Math.round((correctQueries / totalQueries) * 100) : 0; + const totalSessions = filteredSessions?.length || 0; + + return { totalQueries, correctQueries, incorrectQueries, correctPercentage, totalSessions }; + }, [allScores.data?.scores, allSessionsTraces.data?.traces, filteredSessions]); + + // Extract agent name from the first trace's tags (since we can't access input from list query) + const selectedSessionAgentName = React.useMemo(() => { + if (!sessionTraces.data?.traces || sessionTraces.data.traces.length === 0) { + return null; + } + + // Get the first trace's tags + const firstTrace = sessionTraces.data.traces[0]; + if (!firstTrace?.tags || firstTrace.tags.length === 0) return null; + + // Return the first tag as the agent name + return firstTrace.tags[0]; + }, [sessionTraces.data?.traces]); + + return ( + +
+ {/* Left Sidebar - Sessions List */} +
+
+ {/* Date Range Filter */} +
+ + + + + + +
+
Quick select
+
+ + + + + + + {/* Custom Date Picker */} + + + + + + { + if (range?.from) { + setDateRange({ + from: new Date(range.from.setHours(0, 0, 0, 0)), + to: range.to + ? new Date(range.to.setHours(23, 59, 59, 999)) + : new Date(range.from.setHours(23, 59, 59, 999)), + }); + } + }} + numberOfMonths={2} + /> + + +
+
+
+
+
+
+ + {/* Statistics Section */} +
+ {sessions.isLoading ? ( + + ) : ( +
+
+ 📊 + + {filteredSessions?.length || 0} + + sessions +
+ +
+
+ + {statistics.incorrectQueries} + + incorrect +
+ +
+ / + + {statistics.totalQueries} + + total +
+ +
+ + ({statistics.correctPercentage}% + + correct) +
+
+
+ )} +
+ + {/* Search and Filters */} +
+
+ + setSearchQuery(e.target.value)} + className="pl-9" + /> +
+ + + + + + +
+ + + {/* Tag Filter - Using Shadcn Select for controlled dropdown direction */} +
+ + +
+ + {/* Correct/Incorrect Filters */} +
+ +
+ + +
+
+
+
+
+ +
+ Showing: {filteredSessions?.length || 0} of {sessions.data?.sessions.length || 0} sessions +
+
+ + {/* Sessions List */} + + {sessions.isLoading ? ( +
+ {[...Array(5)].map((_, i) => ( + + ))} +
+ ) : ( +
+ {filteredSessions?.map((session) => { + // Get the most recent trace timestamp for this session + const sessionTraceTimestamp = allSessionsTraces.data?.traces + .filter((trace) => trace.sessionId === session.id) + .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())[0]?.timestamp; + + const displayTime = sessionTraceTimestamp || session.createdAt; + + return ( + handleSessionSelect(session.id)} + > +
+
+
+ + + {session.userIds?.[0] || "Unknown User"} + +
+ + {session.countTraces} traces + +
+ +
+ Session: {session.id.slice(0, 16)}... +
+ +
+ + {new Date(displayTime).toLocaleString()} +
+
+
+ ); + })} +
+ )} +
+
+
+ + {/* Middle Section - Conversation Flow */} +
+ {selectedSessionId ? ( + <> + {/* Session Header */} +
+
+
+

+ Session: {selectedSessionId} +

+

+ {sessionTraces.data?.traces.length || 0} messages +

+
+ {selectedSessionAgentName && ( + + Agent: {selectedSessionAgentName} + + )} +
+
+ + {/* Conversation Messages */} + + {sessionTraces.isLoading ? ( +
+ {[...Array(3)].map((_, i) => ( + + ))} +
+ ) : ( +
+ {sessionTraces.data?.traces.map((trace, index) => { + const traceMetric = traceMetrics.data?.find((m) => m.id === trace.id); + return ( + { + setSelectedTraceForDetails({ traceId, timestamp }); + setSelectedToolCall({ ...trace, metric: traceMetric }); + }} + /> + ); + })} +
+ )} +
+ + ) : ( +
+
+ +

Select a session to view conversation

+
+
+ )} +
+ + {/* Right Sidebar - Tool Call Details */} +
+
+
+

+ {selectedToolCall ? "Tool Call Details" : "Response Details"} +

+
+ + + {selectedToolCall ? ( +
+ {/* Show all tool calls/observations */} + {traceDetails.isLoading ? ( +
Loading tool calls...
+ ) : ( + <> + {observations && observations.length > 0 ? ( + observations.map((obs: any, index: number) => ( + + + +
+
+
+ {index + 1} +
+ + Tool call {index + 1} + + + {obs.name || obs.type} + +
+
+
+ +
+ +
+
+
+
+ )) + ) : ( +
No tool calls found for this trace
+ )} + + {/* Final Response Section - Green Highlighted */} + {traceDetails.data && ( + + )} + + )} +
+ ) : ( +
+ Click on a message to view details +
+ )} +
+
+
+
+
+ ); +} + +// Observation Details Component - Fetches full observation with input/output +function ObservationDetails({ + observationId, + traceId, + projectId, + startTime, + name, +}: { + observationId: string; + traceId: string; + projectId: string; + startTime: Date; + name: string; +}) { + const observation = api.observations.byId.useQuery( + { + observationId, + traceId, + projectId, + startTime, + truncated: false, + }, + { + enabled: !!observationId && !!projectId, + } + ); + + // Extract arguments from input - return as object for PrettyJsonView + const inputArguments = (() => { + if (!observation.data?.input) return null; + + try { + const parsed = typeof observation.data.input === "string" + ? JSON.parse(observation.data.input) + : observation.data.input; + + // Extract only the arguments field + if (parsed.arguments) { + return parsed.arguments; + } + return parsed; + } catch { + return null; + } + })(); + + // Extract only the nested result.result from output - return as object for rendering + const outputResult = (() => { + if (!observation.data?.output) return null; + + try { + let parsed: any = observation.data.output; + + // If it's a string, parse it + if (typeof parsed === "string") { + parsed = JSON.parse(parsed); + } + + // If result is a string, parse it again (double-stringified) + if (parsed.result && typeof parsed.result === "string") { + parsed.result = JSON.parse(parsed.result); + } + + // Extract result.result (the nested result field) + if (parsed.result && parsed.result.result) { + return parsed.result.result; + } + + // Fallback to just result if nested result doesn't exist + if (parsed.result) { + return parsed.result; + } + + return parsed; + } catch (e) { + console.error("Error parsing output:", e); + return null; + } + })(); + + if (observation.isLoading) { + return
Loading...
; + } + + return ( +
+ {/* Request/Input - Light Blue Border */} +
+
+ Req → {name} +
+ +
+ + {/* Response/Output - Purple Border */} +
+
+
+ Res +
+ + Response ({name}) + +
+
+ {name}_jaf +
+ +
+
+ ); +} + +// Final Response Section Component - Shows the final output with green highlight +function FinalResponseSection({ + trace, + projectId, +}: { + trace: any; + projectId: string; +}) { + // Fetch the trace data the same way TraceMessage does + const traceData = api.traces.byId.useQuery( + { + traceId: trace.id, + projectId, + timestamp: trace.timestamp, + truncated: false, + }, + { + enabled: !!trace.id && !!projectId, + staleTime: 60 * 1000, + } + ); + + // Use the EXACT same extraction logic as TraceMessage component + const finalOutputText = (() => { + if (!traceData.data?.output) return null; + + try { + let parsed: any = traceData.data.output; + + // Parse if it's a string + if (typeof parsed === "string") { + parsed = JSON.parse(parsed); + } + + let text = ""; + + // Extract outcome.output.text + if (parsed.outcome?.output?.text) { + text = parsed.outcome.output.text; + } + // Fallback: try output.text + else if (parsed.output?.text) { + text = parsed.output.text; + } + // Fallback: try just output + else if (parsed.output) { + text = typeof parsed.output === "string" ? parsed.output : JSON.stringify(parsed.output); + } + // Last resort: stringify the whole thing + else { + text = typeof parsed === "string" ? parsed : JSON.stringify(parsed); + } + + // Replace placeholders with actual values from replacements + if (parsed.outcome?.output?.replacements) { + const replacements = parsed.outcome.output.replacements; + Object.entries(replacements).forEach(([key, value]) => { + // Replace {key} with the actual value + const placeholder = `{${key}}`; + text = text.replace(new RegExp(placeholder.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'), String(value)); + }); + } + + return text; + } catch (e) { + console.error("Error parsing final output:", e); + return null; + } + })(); + + if (traceData.isLoading) { + return ( + +
+
Loading final response...
+
+
+ ); + } + + if (!finalOutputText) return null; + + return ( + +
+
+ + Final Response + +
+
+ +
+
+
+ ); +} + +// Trace Message Component +function TraceMessage({ + trace, + traceMetric, + projectId, + isSelected, + onSelect, +}: { + trace: any; + traceMetric: any; + projectId: string; + isSelected: boolean; + onSelect: (traceId: string, timestamp: Date) => void; +}) { + const [selectedRating, setSelectedRating] = React.useState(null); + + const traceData = api.traces.byId.useQuery( + { + traceId: trace.id, + projectId, + timestamp: trace.timestamp, + truncated: false, // Get full output, not truncated + }, + { + enabled: !!trace.id && !!projectId, + staleTime: 60 * 1000, + } + ); + + // Fetch scores for this trace to get LLM eval feedback + const traceWithScores = api.traces.byIdWithObservationsAndScores.useQuery( + { + traceId: trace.id, + projectId, + timestamp: trace.timestamp, + }, + { + enabled: !!trace.id && !!projectId, + // Poll every 5 seconds if we don't have a genius-feedback score yet + refetchInterval: (query) => { + if (!query.state.data) return false; + const hasGeniusFeedback = query.state.data.scores?.some( + (score: any) => score.name === "genius-feedback" + ); + return hasGeniusFeedback ? false : 5000; + }, + } + ); + + // Extract genius-feedback score + const geniusFeedbackScore = React.useMemo(() => { + if (!traceWithScores.data?.scores) return null; + return traceWithScores.data.scores.find( + (score: any) => score.name === "genius-feedback" + ); + }, [traceWithScores.data?.scores]); + + // Extract user_query from input + const inputText = (() => { + if (!traceData.data?.input) return trace.name || "Query"; + + if (typeof traceData.data.input === "string") { + try { + const parsed = JSON.parse(traceData.data.input); + return parsed.user_query || traceData.data.input; + } catch { + return traceData.data.input; + } + } + + // If it's already an object + return (traceData.data.input as any).user_query || JSON.stringify(traceData.data.input); + })(); + + // Extract only the text from outcome.output.text and replace placeholders + const outputText = (() => { + if (!traceData.data?.output) return "Response"; + + try { + let parsed: any = traceData.data.output; + + // Parse if it's a string + if (typeof parsed === "string") { + parsed = JSON.parse(parsed); + } + + let text = ""; + + // Extract outcome.output.text + if (parsed.outcome?.output?.text) { + text = parsed.outcome.output.text; + } + // Fallback: try output.text + else if (parsed.output?.text) { + text = parsed.output.text; + } + // Fallback: try just output + else if (parsed.output) { + text = typeof parsed.output === "string" ? parsed.output : JSON.stringify(parsed.output); + } + // Last resort: stringify the whole thing + else { + text = typeof parsed === "string" ? parsed : JSON.stringify(parsed); + } + + // Replace placeholders with actual values from replacements + if (parsed.outcome?.output?.replacements) { + const replacements = parsed.outcome.output.replacements; + Object.entries(replacements).forEach(([key, value]) => { + // Replace {key} with the actual value + const placeholder = `{${key}}`; + text = text.replace(new RegExp(placeholder.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'), String(value)); + }); + } + + return text; + } catch (e) { + console.error("Error parsing output:", e); + return typeof traceData.data.output === "string" + ? traceData.data.output + : JSON.stringify(traceData.data.output); + } + })(); + + return ( +
+ {/* User Query */} +
+ +
+ +
+
+ User Q • {new Date(trace.timestamp).toLocaleTimeString()} +
+
+ {inputText} +
+
+
+
+
+ + {/* Assistant Response */} +
+ onSelect(trace.id, trace.timestamp)} + > +
+
+ AI +
+
+
+ Assistant Ans + + {new Date(trace.timestamp).toLocaleTimeString()} + + {traceMetric?.level === "ERROR" && ( + + Error + + )} +
+
+ +
+ + {/* Rate Buttons */} +
+ Rate: + + + + {selectedRating && ( + + )} +
+ + {/* LLM Eval Section - Shows when genius-feedback score is available */} + {geniusFeedbackScore && ( +
+
+
+ âš¡ +
+ + LLM Eval + +
+ +
+ {/* Judge Response */} +
+
+ Judge Response: +
+
+ + {geniusFeedbackScore.value === 1 ? "CORRECT" : "INCORRECT"} + +
+
+ + {/* Judgement Reason */} + {geniusFeedbackScore.comment && ( +
+
+ Judgement Reason: +
+
+
+ {geniusFeedbackScore.comment} +
+
+
+ )} +
+
+ )} + +
+ Click to view tool calls → +
+
+
+
+
+
+ ); +} From e25743a7726a529115aa3e504385a7f02ad6eab2 Mon Sep 17 00:00:00 2001 From: Aman Srivastava Date: Tue, 21 Oct 2025 20:43:15 +0530 Subject: [PATCH 02/21] fix filter issue and some bugs --- .../project/[projectId]/juspay-dashboard.tsx | 827 ++++++++++++------ 1 file changed, 545 insertions(+), 282 deletions(-) diff --git a/web/src/pages/project/[projectId]/juspay-dashboard.tsx b/web/src/pages/project/[projectId]/juspay-dashboard.tsx index ed8acc8b2e14..65982f6f502e 100644 --- a/web/src/pages/project/[projectId]/juspay-dashboard.tsx +++ b/web/src/pages/project/[projectId]/juspay-dashboard.tsx @@ -57,6 +57,7 @@ export default function JuspayDashboard() { const [showDatePicker, setShowDatePicker] = useState(false); const [filterCorrect, setFilterCorrect] = useState(false); const [filterIncorrect, setFilterIncorrect] = useState(false); + const [hideUnknownUser, setHideUnknownUser] = useState(true); // Sync selectedSessionId with URL on mount and when URL changes React.useEffect(() => { @@ -115,6 +116,11 @@ export default function JuspayDashboard() { ); // Fetch traces for all sessions to get scores (within date range) + // Using pagination to fetch all traces without hitting limits + const [allTraces, setAllTraces] = React.useState([]); + const [currentPage, setCurrentPage] = React.useState(0); + const [hasMoreTraces, setHasMoreTraces] = React.useState(true); + const allSessionsTraces = api.traces.all.useQuery( { projectId, @@ -134,17 +140,59 @@ export default function JuspayDashboard() { ], searchQuery: null, searchType: [], - page: 0, + page: currentPage, limit: 100, // API maximum limit orderBy: { column: "timestamp", order: "DESC" }, }, { - enabled: !!projectId && !!sessions.data?.sessions, + enabled: !!projectId && !!sessions.data?.sessions && hasMoreTraces, + }, + ); + + // Accumulate traces from pagination + React.useEffect(() => { + if (allSessionsTraces.data?.traces) { + const newTraces = allSessionsTraces.data.traces; + + if (currentPage === 0) { + // First page - replace all traces + setAllTraces(newTraces); + } else { + // Subsequent pages - append traces + setAllTraces((prev) => [...prev, ...newTraces]); + } + + // Check if there are more traces to fetch + if (newTraces.length < 100) { + setHasMoreTraces(false); + } else { + // Fetch next page + setCurrentPage((prev) => prev + 1); + } } + }, [allSessionsTraces.data?.traces, currentPage]); + + // Reset pagination when date range changes + React.useEffect(() => { + setAllTraces([]); + setCurrentPage(0); + setHasMoreTraces(true); + }, [dateRange.from, dateRange.to]); + + // Create a wrapper object that mimics the original structure + const allSessionsTracesData = React.useMemo( + () => ({ + traces: allTraces, + }), + [allTraces], ); - // Fetch scores for all traces to calculate statistics (within date range) - const allScores = api.scores.all.useQuery( + // Fetch scores using pagination (same pattern as traces) + const [allScores, setAllScores] = React.useState([]); + const [currentScorePage, setCurrentScorePage] = React.useState(0); + const [hasMoreScores, setHasMoreScores] = React.useState(true); + + const scoresQuery = api.scores.all.useQuery( { projectId, filter: [ @@ -154,40 +202,64 @@ export default function JuspayDashboard() { operator: "=", value: "genius-feedback", }, - { - column: "timestamp", - type: "datetime", - operator: ">=", - value: dateRange.from, - }, - { - column: "timestamp", - type: "datetime", - operator: "<=", - value: dateRange.to, - }, ], - page: 0, + page: currentScorePage, limit: 100, // API maximum limit orderBy: { column: "timestamp", order: "DESC" }, }, { - enabled: !!projectId && !!allSessionsTraces.data?.traces, + enabled: !!projectId && allTraces.length > 0 && hasMoreScores, + }, + ); + + // Accumulate scores from pagination + React.useEffect(() => { + if (scoresQuery.data?.scores) { + const newScores = scoresQuery.data.scores; + + if (currentScorePage === 0) { + setAllScores(newScores); + } else { + setAllScores((prev) => [...prev, ...newScores]); + } + + if (newScores.length < 100) { + setHasMoreScores(false); + } else { + setCurrentScorePage((prev) => prev + 1); + } } + }, [scoresQuery.data?.scores, currentScorePage]); + + // Reset score pagination when traces change + React.useEffect(() => { + setAllScores([]); + setCurrentScorePage(0); + setHasMoreScores(true); + }, [allTraces.length]); + + // Create wrapper for scores + const allScoresData = React.useMemo( + () => ({ + scores: allScores, + }), + [allScores], ); // Create a map of session IDs to their evaluation status (correct/incorrect) const sessionEvaluationMap = React.useMemo(() => { - if (!allScores.data?.scores || !allSessionsTraces.data?.traces) { + if (!allScoresData.scores.length || !allSessionsTracesData.traces.length) { return new Map(); } const map = new Map(); - + // Group scores by session const sessionScores = new Map(); - allScores.data.scores.forEach((score: any) => { - const trace = allSessionsTraces.data.traces.find((t) => t.id === score.traceId); + allScoresData.scores.forEach((score: any) => { + const trace = allSessionsTracesData.traces.find( + (t) => t.id === score.traceId, + ); if (trace?.sessionId) { if (!sessionScores.has(trace.sessionId)) { sessionScores.set(trace.sessionId, []); @@ -200,7 +272,7 @@ export default function JuspayDashboard() { sessionScores.forEach((scores, sessionId) => { const hasCorrect = scores.some((v) => v === 1); const hasIncorrect = scores.some((v) => v === 0); - + if (hasCorrect && hasIncorrect) { map.set(sessionId, "mixed"); } else if (hasCorrect) { @@ -211,14 +283,15 @@ export default function JuspayDashboard() { }); return map; - }, [allScores.data?.scores, allSessionsTraces.data?.traces]); + }, [allScoresData.scores, allSessionsTracesData.traces]); // Create a map of session IDs to their tags const sessionToTagsMap = React.useMemo(() => { - if (!allSessionsTraces.data?.traces) return new Map(); - + if (!allSessionsTracesData.traces.length) + return new Map(); + const map = new Map(); - allSessionsTraces.data.traces.forEach((trace) => { + allSessionsTracesData.traces.forEach((trace) => { if (trace.sessionId && trace.tags && trace.tags.length > 0) { // Store all tags for each session if (!map.has(trace.sessionId)) { @@ -226,12 +299,14 @@ export default function JuspayDashboard() { } else { // Merge tags if session already exists const existingTags = map.get(trace.sessionId) || []; - map.set(trace.sessionId, [...new Set([...existingTags, ...trace.tags])]); + map.set(trace.sessionId, [ + ...new Set([...existingTags, ...trace.tags]), + ]); } } }); return map; - }, [allSessionsTraces.data?.traces]); + }, [allSessionsTracesData.traces]); // Get unique tags from filterOptions API (no 100-trace limit!) const uniqueTags = React.useMemo(() => { @@ -269,7 +344,7 @@ export default function JuspayDashboard() { traceId: string; timestamp: Date; } | null>(null); - + const traceDetails = api.traces.byIdWithObservationsAndScores.useQuery( { traceId: selectedTraceForDetails?.traceId ?? "", @@ -307,94 +382,152 @@ export default function JuspayDashboard() { traceIds: sessionTraces.data?.traces.map((t) => t.id) ?? [], }, { - enabled: !!projectId && !!selectedSessionId && !!sessionTraces.data?.traces, - } + enabled: + !!projectId && !!selectedSessionId && !!sessionTraces.data?.traces, + }, ); const filteredSessions = React.useMemo(() => { return sessions.data?.sessions.filter((session) => { - // Date range filter - const sessionDate = new Date(session.createdAt); - const matchesDateRange = sessionDate >= dateRange.from && sessionDate <= dateRange.to; - - if (!matchesDateRange) return false; - - // Search filter - const matchesSearch = searchQuery - ? session.id.toLowerCase().includes(searchQuery.toLowerCase()) || - session.userIds?.some((uid) => - uid.toLowerCase().includes(searchQuery.toLowerCase()) - ) - : true; - - if (!matchesSearch) return false; - - // Show only merchant data filter - // Hide sessions where user_id contains "@juspay" (internal users) - // Show only actual merchant/customer sessions - if (showOnlyMerchant) { - const hasJuspayUser = session.userIds?.some((uid) => - uid.toLowerCase().includes("@juspay") - ); - if (hasJuspayUser) return false; - } - - // Tag filter - if (selectedTag !== "all") { - const sessionTags = sessionToTagsMap.get(session.id); - if (!sessionTags || !sessionTags.includes(selectedTag)) return false; - } - - // Correct/Incorrect filter - if (filterCorrect || filterIncorrect) { - const evaluation = sessionEvaluationMap.get(session.id); - - // If both filters are checked, show sessions that match either - if (filterCorrect && filterIncorrect) { - if (!evaluation) return false; + // Date range filter + const sessionDate = new Date(session.createdAt); + const matchesDateRange = + sessionDate >= dateRange.from && sessionDate <= dateRange.to; + + if (!matchesDateRange) return false; + + // Search filter + const matchesSearch = searchQuery + ? session.id.toLowerCase().includes(searchQuery.toLowerCase()) || + session.userIds?.some((uid) => + uid.toLowerCase().includes(searchQuery.toLowerCase()), + ) + : true; + + if (!matchesSearch) return false; + + // Show only merchant data filter + // Hide sessions where user_id contains "@juspay" (internal users) + // Show only actual merchant/customer sessions + if (showOnlyMerchant) { + const hasJuspayUser = session.userIds?.some((uid) => + uid.toLowerCase().includes("@juspay"), + ); + if (hasJuspayUser) return false; } - // If only correct is checked - else if (filterCorrect) { - if (evaluation !== "correct") return false; + + // Tag filter + if (selectedTag !== "all") { + const sessionTags = sessionToTagsMap.get(session.id); + if (!sessionTags || !sessionTags.includes(selectedTag)) return false; } - // If only incorrect is checked - else if (filterIncorrect) { - if (evaluation !== "incorrect" && evaluation !== "mixed") return false; + + // Correct/Incorrect filter + if (filterCorrect || filterIncorrect) { + const evaluation = sessionEvaluationMap.get(session.id); + + // If both filters are checked, show sessions that match either + if (filterCorrect && filterIncorrect) { + if (!evaluation) return false; + } + // If only correct is checked + else if (filterCorrect) { + if (evaluation !== "correct") return false; + } + // If only incorrect is checked + else if (filterIncorrect) { + if (evaluation !== "incorrect" && evaluation !== "mixed") + return false; + } } - } - - return true; + + // Hide Unknown User filter + if (hideUnknownUser) { + const isUnknownUser = + !session.userIds || + session.userIds.length === 0 || + session.userIds[0] === "Unknown User"; + if (isUnknownUser) return false; + } + + return true; }); - }, [sessions.data?.sessions, dateRange, searchQuery, showOnlyMerchant, selectedTag, filterCorrect, filterIncorrect, sessionToTagsMap, sessionEvaluationMap]); + }, [ + sessions.data?.sessions, + dateRange, + searchQuery, + showOnlyMerchant, + selectedTag, + filterCorrect, + filterIncorrect, + hideUnknownUser, + sessionToTagsMap, + sessionEvaluationMap, + ]); // Calculate statistics based on queries (traces) not sessions const statistics = React.useMemo(() => { - if (!allSessionsTraces.data?.traces) { - return { totalQueries: 0, correctQueries: 0, incorrectQueries: 0, correctPercentage: 0, totalSessions: 0 }; + if (!allSessionsTracesData.traces.length) { + return { + totalQueries: 0, + correctQueries: 0, + incorrectQueries: 0, + correctPercentage: 0, + totalSessions: 0, + }; } - // Total queries = all traces in the date range - const totalQueries = allSessionsTraces.data.traces.length; + // Filter traces based on current filters (tag filter) + const filteredTraces = allSessionsTracesData.traces.filter((trace) => { + // Apply tag filter if selected + if (selectedTag !== "all") { + if (!trace.tags || !trace.tags.includes(selectedTag)) return false; + } + return true; + }); + + // Total queries = filtered traces + const totalQueries = filteredTraces.length; - // Count correct/incorrect queries from genius-feedback scores + // Count correct/incorrect queries from genius-feedback scores (only for filtered traces) let correctQueries = 0; let incorrectQueries = 0; - if (allScores.data?.scores) { - allScores.data.scores.forEach((score: any) => { - if (score.value === 1) { - correctQueries++; - } else if (score.value === 0) { - incorrectQueries++; + if (allScoresData.scores.length > 0) { + allScoresData.scores.forEach((score: any) => { + // Check if this score belongs to a filtered trace + const trace = filteredTraces.find((t) => t.id === score.traceId); + if (trace) { + if (score.value === 1) { + correctQueries++; + } else if (score.value === 0) { + incorrectQueries++; + } } }); } - const correctPercentage = totalQueries > 0 ? Math.round((correctQueries / totalQueries) * 100) : 0; + // Calculate percentage based on evaluated queries only (correct + incorrect) + const evaluatedQueries = correctQueries + incorrectQueries; + const correctPercentage = + evaluatedQueries > 0 + ? Math.round((correctQueries / evaluatedQueries) * 100) + : 0; const totalSessions = filteredSessions?.length || 0; - return { totalQueries, correctQueries, incorrectQueries, correctPercentage, totalSessions }; - }, [allScores.data?.scores, allSessionsTraces.data?.traces, filteredSessions]); + return { + totalQueries, + correctQueries, + incorrectQueries, + correctPercentage, + totalSessions, + }; + }, [ + allScoresData.scores, + allSessionsTracesData.traces, + filteredSessions, + selectedTag, + ]); // Extract agent name from the first trace's tags (since we can't access input from list query) const selectedSessionAgentName = React.useMemo(() => { @@ -415,24 +548,35 @@ export default function JuspayDashboard() { headerProps={{ title: "Session Analytics v2", help: { - description: "Session-based conversation view with detailed trace analysis.", + description: + "Session-based conversation view with detailed trace analysis.", }, }} >
{/* Left Sidebar - Sessions List */} -
-
+
+
{/* Date Range Filter */} -
- +
+ - @@ -440,7 +584,9 @@ export default function JuspayDashboard() {
-
Quick select
+
+ Quick select +
- + {/* Custom Date Picker */} @@ -541,10 +687,16 @@ export default function JuspayDashboard() { onSelect={(range: any) => { if (range?.from) { setDateRange({ - from: new Date(range.from.setHours(0, 0, 0, 0)), - to: range.to - ? new Date(range.to.setHours(23, 59, 59, 999)) - : new Date(range.from.setHours(23, 59, 59, 999)), + from: new Date( + range.from.setHours(0, 0, 0, 0), + ), + to: range.to + ? new Date( + range.to.setHours(23, 59, 59, 999), + ) + : new Date( + range.from.setHours(23, 59, 59, 999), + ), }); } }} @@ -560,25 +712,29 @@ export default function JuspayDashboard() {
{/* Statistics Section */} -
+
{sessions.isLoading ? ( ) : ( -
-
+
+
📊 {filteredSessions?.length || 0} - sessions + + sessions +
- +
{statistics.incorrectQueries} - incorrect + + incorrect +
@@ -586,14 +742,18 @@ export default function JuspayDashboard() { {statistics.totalQueries} - total + + total +
- +
({statistics.correctPercentage}% - correct) + + correct) +
@@ -601,7 +761,7 @@ export default function JuspayDashboard() {
{/* Search and Filters */} -
+
- + - +
-
{/* Sessions List */} {sessions.isLoading ? ( -
+
{[...Array(5)].map((_, i) => ( ))} @@ -696,18 +882,22 @@ export default function JuspayDashboard() {
{filteredSessions?.map((session) => { // Get the most recent trace timestamp for this session - const sessionTraceTimestamp = allSessionsTraces.data?.traces + const sessionTraceTimestamp = allSessionsTracesData.traces .filter((trace) => trace.sessionId === session.id) - .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())[0]?.timestamp; - - const displayTime = sessionTraceTimestamp || session.createdAt; - + .sort( + (a, b) => b.timestamp.getTime() - a.timestamp.getTime(), + )[0]?.timestamp; + + const displayTime = + sessionTraceTimestamp || session.createdAt; + return ( handleSessionSelect(session.id)} > @@ -715,7 +905,7 @@ export default function JuspayDashboard() {
- + {session.userIds?.[0] || "Unknown User"}
@@ -723,11 +913,11 @@ export default function JuspayDashboard() { {session.countTraces} traces
- +
Session: {session.id.slice(0, 16)}...
- +
{new Date(displayTime).toLocaleString()} @@ -743,11 +933,11 @@ export default function JuspayDashboard() {
{/* Middle Section - Conversation Flow */} -
+
{selectedSessionId ? ( <> {/* Session Header */} -
+

@@ -774,9 +964,11 @@ export default function JuspayDashboard() { ))}

) : ( -
+
{sessionTraces.data?.traces.map((trace, index) => { - const traceMetric = traceMetrics.data?.find((m) => m.id === trace.id); + const traceMetric = traceMetrics.data?.find( + (m) => m.id === trace.id, + ); return ( { setSelectedTraceForDetails({ traceId, timestamp }); - setSelectedToolCall({ ...trace, metric: traceMetric }); + setSelectedToolCall({ + ...trace, + metric: traceMetric, + }); }} /> ); @@ -796,9 +991,9 @@ export default function JuspayDashboard() { ) : ( -
+
- +

Select a session to view conversation

@@ -806,46 +1001,53 @@ export default function JuspayDashboard() {
{/* Right Sidebar - Tool Call Details */} -
-
-
+
+
+

{selectedToolCall ? "Tool Call Details" : "Response Details"}

- + {selectedToolCall ? (
{/* Show all tool calls/observations */} {traceDetails.isLoading ? ( -
Loading tool calls...
+
+ Loading tool calls... +
) : ( <> {observations && observations.length > 0 ? ( observations.map((obs: any, index: number) => ( - +
-
+
{index + 1}
Tool call {index + 1} - + {obs.name || obs.type}
-
+
)) ) : ( -
No tool calls found for this trace
+
+ No tool calls found for this trace +
)} - + {/* Final Response Section - Green Highlighted */} {traceDetails.data && ( ) : ( -
+
Click on a message to view details
)} @@ -906,18 +1110,19 @@ function ObservationDetails({ }, { enabled: !!observationId && !!projectId, - } + }, ); // Extract arguments from input - return as object for PrettyJsonView const inputArguments = (() => { if (!observation.data?.input) return null; - + try { - const parsed = typeof observation.data.input === "string" - ? JSON.parse(observation.data.input) - : observation.data.input; - + const parsed = + typeof observation.data.input === "string" + ? JSON.parse(observation.data.input) + : observation.data.input; + // Extract only the arguments field if (parsed.arguments) { return parsed.arguments; @@ -931,30 +1136,30 @@ function ObservationDetails({ // Extract only the nested result.result from output - return as object for rendering const outputResult = (() => { if (!observation.data?.output) return null; - + try { let parsed: any = observation.data.output; - + // If it's a string, parse it if (typeof parsed === "string") { parsed = JSON.parse(parsed); } - + // If result is a string, parse it again (double-stringified) if (parsed.result && typeof parsed.result === "string") { parsed.result = JSON.parse(parsed.result); } - + // Extract result.result (the nested result field) if (parsed.result && parsed.result.result) { return parsed.result.result; } - + // Fallback to just result if nested result doesn't exist if (parsed.result) { return parsed.result; } - + return parsed; } catch (e) { console.error("Error parsing output:", e); @@ -967,22 +1172,24 @@ function ObservationDetails({ } return ( -
+
{/* Request/Input - Light Blue Border */} -
-
+
+
Req → {name}
- +
+ +
{/* Response/Output - Purple Border */} -
-
+
+
Res
@@ -990,14 +1197,16 @@ function ObservationDetails({ Response ({name})
-
+
{name}_jaf
- +
+ +
); @@ -1022,23 +1231,23 @@ function FinalResponseSection({ { enabled: !!trace.id && !!projectId, staleTime: 60 * 1000, - } + }, ); // Use the EXACT same extraction logic as TraceMessage component const finalOutputText = (() => { if (!traceData.data?.output) return null; - + try { let parsed: any = traceData.data.output; - + // Parse if it's a string if (typeof parsed === "string") { parsed = JSON.parse(parsed); } - + let text = ""; - + // Extract outcome.output.text if (parsed.outcome?.output?.text) { text = parsed.outcome.output.text; @@ -1049,23 +1258,29 @@ function FinalResponseSection({ } // Fallback: try just output else if (parsed.output) { - text = typeof parsed.output === "string" ? parsed.output : JSON.stringify(parsed.output); + text = + typeof parsed.output === "string" + ? parsed.output + : JSON.stringify(parsed.output); } // Last resort: stringify the whole thing else { text = typeof parsed === "string" ? parsed : JSON.stringify(parsed); } - + // Replace placeholders with actual values from replacements if (parsed.outcome?.output?.replacements) { const replacements = parsed.outcome.output.replacements; Object.entries(replacements).forEach(([key, value]) => { // Replace {key} with the actual value const placeholder = `{${key}}`; - text = text.replace(new RegExp(placeholder.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'), String(value)); + text = text.replace( + new RegExp(placeholder.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), + String(value), + ); }); } - + return text; } catch (e) { console.error("Error parsing final output:", e); @@ -1077,7 +1292,9 @@ function FinalResponseSection({ return (
-
Loading final response...
+
+ Loading final response... +
); @@ -1088,8 +1305,8 @@ function FinalResponseSection({ return (
-
- +
+ Final Response
@@ -1118,7 +1335,9 @@ function TraceMessage({ isSelected: boolean; onSelect: (traceId: string, timestamp: Date) => void; }) { - const [selectedRating, setSelectedRating] = React.useState(null); + const [selectedRating, setSelectedRating] = React.useState( + null, + ); const traceData = api.traces.byId.useQuery( { @@ -1130,7 +1349,7 @@ function TraceMessage({ { enabled: !!trace.id && !!projectId, staleTime: 60 * 1000, - } + }, ); // Fetch scores for this trace to get LLM eval feedback @@ -1146,85 +1365,100 @@ function TraceMessage({ refetchInterval: (query) => { if (!query.state.data) return false; const hasGeniusFeedback = query.state.data.scores?.some( - (score: any) => score.name === "genius-feedback" + (score: any) => score.name === "genius-feedback", ); return hasGeniusFeedback ? false : 5000; }, - } + }, ); // Extract genius-feedback score const geniusFeedbackScore = React.useMemo(() => { if (!traceWithScores.data?.scores) return null; return traceWithScores.data.scores.find( - (score: any) => score.name === "genius-feedback" + (score: any) => score.name === "genius-feedback", ); }, [traceWithScores.data?.scores]); - // Extract user_query from input - const inputText = (() => { - if (!traceData.data?.input) return trace.name || "Query"; - + // Extract user_query from input, or return formatted JSON + const inputContent = (() => { + if (!traceData.data?.input) + return { text: trace.name || "Query", isJson: false }; + if (typeof traceData.data.input === "string") { try { const parsed = JSON.parse(traceData.data.input); - return parsed.user_query || traceData.data.input; + // If user_query exists, return it as text + if (parsed.user_query) { + return { text: parsed.user_query, isJson: false }; + } + // Otherwise return the whole object as JSON + return { json: parsed, isJson: true }; } catch { - return traceData.data.input; + return { text: traceData.data.input, isJson: false }; } } - + // If it's already an object - return (traceData.data.input as any).user_query || JSON.stringify(traceData.data.input); + const input = traceData.data.input as any; + if (input.user_query) { + return { text: input.user_query, isJson: false }; + } + return { json: input, isJson: true }; })(); - // Extract only the text from outcome.output.text and replace placeholders - const outputText = (() => { - if (!traceData.data?.output) return "Response"; - + // Extract output text or return formatted JSON + const outputContent = (() => { + if (!traceData.data?.output) return { text: "Response", isJson: false }; + try { let parsed: any = traceData.data.output; - + // Parse if it's a string if (typeof parsed === "string") { parsed = JSON.parse(parsed); } - + let text = ""; - + // Extract outcome.output.text if (parsed.outcome?.output?.text) { text = parsed.outcome.output.text; + + // Replace placeholders with actual values from replacements + if (parsed.outcome?.output?.replacements) { + const replacements = parsed.outcome.output.replacements; + Object.entries(replacements).forEach(([key, value]) => { + const placeholder = `{${key}}`; + text = text.replace( + new RegExp( + placeholder.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), + "g", + ), + String(value), + ); + }); + } + + return { text, isJson: false }; } // Fallback: try output.text else if (parsed.output?.text) { - text = parsed.output.text; + return { text: parsed.output.text, isJson: false }; } - // Fallback: try just output - else if (parsed.output) { - text = typeof parsed.output === "string" ? parsed.output : JSON.stringify(parsed.output); - } - // Last resort: stringify the whole thing + // If no text field found, return the whole object as JSON else { - text = typeof parsed === "string" ? parsed : JSON.stringify(parsed); + return { json: parsed, isJson: true }; } - - // Replace placeholders with actual values from replacements - if (parsed.outcome?.output?.replacements) { - const replacements = parsed.outcome.output.replacements; - Object.entries(replacements).forEach(([key, value]) => { - // Replace {key} with the actual value - const placeholder = `{${key}}`; - text = text.replace(new RegExp(placeholder.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'), String(value)); - }); - } - - return text; } catch (e) { console.error("Error parsing output:", e); - return typeof traceData.data.output === "string" - ? traceData.data.output - : JSON.stringify(traceData.data.output); + return { + text: + typeof traceData.data.output === "string" + ? traceData.data.output + : JSON.stringify(traceData.data.output), + isJson: false, + }; } })(); @@ -1232,16 +1466,26 @@ function TraceMessage({
{/* User Query */}
- +
- +
-
+
User Q • {new Date(trace.timestamp).toLocaleTimeString()}
-
- {inputText} -
+ {inputContent.isJson ? ( +
+ +
+ ) : ( +
+ {inputContent.text} +
+ )}
@@ -1251,17 +1495,17 @@ function TraceMessage({
onSelect(trace.id, trace.timestamp)} >
-
+
AI
-
+
Assistant Ans {new Date(trace.timestamp).toLocaleTimeString()} @@ -1272,22 +1516,33 @@ function TraceMessage({ )}
-
- -
+ {outputContent.isJson ? ( +
+ +
+ ) : ( +
+ +
+ )} {/* Rate Buttons */} -
+
Rate: +
+ )} + + {/* Mobile Overlay */} + {isMobile && isMobileMenuOpen && ( +
setIsMobileMenuOpen(false)} + /> + )} + {/* Left Sidebar - Sessions List */} -
+
- {/* Date Range Filter */} -
+ {/* Mobile Close Button - Inside sidebar */} + {isMobile && ( +
+

Filters

+ +
+ )} + + {/* Date Range Filter - Always visible */} +
- + )} +
@@ -1365,6 +1637,7 @@ export default function JuspayDashboard() {
+ )}
); From 6ad5f92851bb9f96cf9779f0f0ad43e4b24c03df Mon Sep 17 00:00:00 2001 From: Aman Srivastava Date: Thu, 6 Nov 2025 16:26:25 +0530 Subject: [PATCH 09/21] Made statistics cards clickable filters and added userEmail based fitering --- .../project/[projectId]/juspay-dashboard.tsx | 705 ++++++++++++++++-- 1 file changed, 635 insertions(+), 70 deletions(-) diff --git a/web/src/pages/project/[projectId]/juspay-dashboard.tsx b/web/src/pages/project/[projectId]/juspay-dashboard.tsx index 455e061e74c4..b4795cc7c6e1 100644 --- a/web/src/pages/project/[projectId]/juspay-dashboard.tsx +++ b/web/src/pages/project/[projectId]/juspay-dashboard.tsx @@ -64,6 +64,31 @@ export default function JuspayDashboard() { defaultRelativeAggregation: "last1Day", }); + // Auto-update URL with default date range on initial load + React.useEffect(() => { + if (router.isReady && timeRange && typeof window !== "undefined") { + const params = new URLSearchParams(window.location.search); + + // Check if there's no existing dateRange parameter in URL + if (!params.has('dateRange')) { + // Convert timeRange to the format expected by the URL + const absoluteRange = toAbsoluteTimeRange(timeRange); + if (absoluteRange) { + const fromTimestamp = absoluteRange.from.getTime(); + const toTimestamp = absoluteRange.to.getTime(); + const dateRangeParam = `${fromTimestamp}-${toTimestamp}`; + + params.set('dateRange', dateRangeParam); + + // Update URL without navigation + const newUrl = `${window.location.pathname}?${params.toString()}`; + window.history.replaceState({}, "", newUrl); + console.log("🔗 Auto-updated URL with default date range:", newUrl); + } + } + } + }, [router.isReady, timeRange]); + // Convert timeRange to absolute date range for compatibility const tableDateRange = React.useMemo(() => { return toAbsoluteTimeRange(timeRange) ?? undefined; @@ -88,18 +113,24 @@ export default function JuspayDashboard() { // Get other URL parameters (not date range - that's handled by useTableDateRange) const sessionIdFromUrl = router.query.sessionId as string | undefined; const merchantFilterUrl = router.query.merchantOnly as string | undefined; + const teamFilterUrl = router.query.teamOnly as string | undefined; + const juspayOthersFilterUrl = router.query.juspayOthersOnly as string | undefined; const tagFilterUrl = router.query.tag as string | undefined; const correctFilterUrl = router.query.correct as string | undefined; const incorrectFilterUrl = router.query.incorrect as string | undefined; const hideUnknownUrl = router.query.hideUnknown as string | undefined; + const teamEmailsFromUrl = router.query.teamEmails as string | undefined; // Check if URL has any filter parameters (shared link) const hasUrlFilters = !!( merchantFilterUrl || + teamFilterUrl || + juspayOthersFilterUrl || tagFilterUrl || correctFilterUrl || incorrectFilterUrl || - hideUnknownUrl + hideUnknownUrl || + teamEmailsFromUrl ); // Load filters from localStorage @@ -139,6 +170,18 @@ export default function JuspayDashboard() { params.delete("merchantOnly"); } + if (filters.showOnlyTeam) { + params.set("teamOnly", "true"); + } else { + params.delete("teamOnly"); + } + + if (filters.showOnlyJuspayOthers) { + params.set("juspayOthersOnly", "true"); + } else { + params.delete("juspayOthersOnly"); + } + if (filters.selectedTag && filters.selectedTag !== "all") { params.set("tag", filters.selectedTag); } else { @@ -163,6 +206,13 @@ export default function JuspayDashboard() { params.delete("hideUnknown"); } + // Add team emails to URL for sharing + if (filters.teamEmails && filters.teamEmails.length > 0) { + params.set("teamEmails", encodeURIComponent(JSON.stringify(filters.teamEmails))); + } else { + params.delete("teamEmails"); + } + // Update URL without navigation const newUrl = `${window.location.pathname}?${params.toString()}`; window.history.replaceState({}, "", newUrl); @@ -175,6 +225,7 @@ export default function JuspayDashboard() { const [searchQuery, setSearchQuery] = useState(""); const [selectedToolCall, setSelectedToolCall] = useState(null); const [showFilters, setShowFilters] = useState(true); + const [showAdvancedFilters, setShowAdvancedFilters] = useState(false); const [showOnlyMerchant, setShowOnlyMerchant] = useState(() => { if (hasUrlFilters && merchantFilterUrl !== undefined) @@ -183,6 +234,20 @@ export default function JuspayDashboard() { return stored?.showOnlyMerchant ?? false; }); + const [showOnlyTeam, setShowOnlyTeam] = useState(() => { + if (hasUrlFilters && teamFilterUrl !== undefined) + return teamFilterUrl === "true"; + const stored = loadFiltersFromStorage(); + return stored?.showOnlyTeam ?? false; + }); + + const [showOnlyJuspayOthers, setShowOnlyJuspayOthers] = useState(() => { + if (hasUrlFilters && juspayOthersFilterUrl !== undefined) + return juspayOthersFilterUrl === "true"; + const stored = loadFiltersFromStorage(); + return stored?.showOnlyJuspayOthers ?? false; + }); + const [selectedTag, setSelectedTag] = useState(() => { if (hasUrlFilters && tagFilterUrl !== undefined) return tagFilterUrl; const stored = loadFiltersFromStorage(); @@ -210,6 +275,22 @@ export default function JuspayDashboard() { return stored?.hideUnknownUser ?? true; }); + // Team whitelist state + const [teamEmails, setTeamEmails] = useState(() => { + // If URL has team emails, use those (for shared links) + if (hasUrlFilters && teamEmailsFromUrl !== undefined) { + try { + return JSON.parse(decodeURIComponent(teamEmailsFromUrl)); + } catch { + return []; + } + } + // Otherwise use localStorage + const stored = loadFiltersFromStorage(); + return stored?.teamEmails ?? []; + }); + const [newEmailInput, setNewEmailInput] = useState(""); + const [showDatePicker, setShowDatePicker] = useState(false); const [sessionPage, setSessionPage] = useState(0); @@ -253,14 +334,25 @@ export default function JuspayDashboard() { setHideUnknownUser(value); }; + const handleShowOnlyTeamChange = (value: boolean) => { + setShowOnlyTeam(value); + }; + + const handleShowOnlyJuspayOthersChange = (value: boolean) => { + setShowOnlyJuspayOthers(value); + }; + // Save filters to localStorage AND update URL for sharing whenever they change React.useEffect(() => { const filters = { showOnlyMerchant, + showOnlyTeam, + showOnlyJuspayOthers, selectedTag, filterCorrect, filterIncorrect, hideUnknownUser, + teamEmails, }; // Save to localStorage for personal persistence @@ -272,10 +364,13 @@ export default function JuspayDashboard() { } }, [ showOnlyMerchant, + showOnlyTeam, + showOnlyJuspayOthers, selectedTag, filterCorrect, filterIncorrect, hideUnknownUser, + teamEmails, router.isReady, updateUrlForSharing, saveFiltersToStorage, @@ -691,14 +786,66 @@ export default function JuspayDashboard() { if (!matchesSearch) return false; - // Show only merchant data filter - // Hide sessions where user_id contains "@juspay" (internal users) - // Show only actual merchant/customer sessions - if (showOnlyMerchant) { - const hasJuspayUser = session.userIds?.some((uid: string) => - uid.toLowerCase().includes("@juspay"), - ); - if (hasJuspayUser) return false; + // Helper function to categorize user for filtering + const categorizeUserForFilter = (userIds: string[] | undefined) => { + if (!userIds || userIds.length === 0 || userIds[0] === "Unknown User") { + return "unknown"; + } + + const userId = userIds[0]; + + // Check if user is in team whitelist - more flexible matching + if (teamEmails.some(email => { + const emailLower = email.toLowerCase().trim(); + const userIdLower = userId.toLowerCase().trim(); + + // Try exact match first + if (userIdLower === emailLower) return true; + + // Try contains match (user ID contains the email) + if (userIdLower.includes(emailLower)) return true; + + // Try email contains user ID (for partial email matches) + if (emailLower.includes(userIdLower)) return true; + + // Try domain matching if email has @ symbol + if (emailLower.includes('@')) { + const emailDomain = emailLower.split('@')[1]; + const emailUsername = emailLower.split('@')[0]; + + // Check if user ID matches username part + if (userIdLower === emailUsername) return true; + + // Check if user ID contains username + if (userIdLower.includes(emailUsername)) return true; + } + + return false; + })) { + return "team"; + } + + // Check if user is juspay internal (contains @juspay) + if (userId.toLowerCase().includes("@juspay")) { + return "juspay-genius-merchant"; + } + + // Otherwise it's a merchant + return "merchant"; + }; + + const userCategory = categorizeUserForFilter(session.userIds); + + // Category filters - if any are checked, show only those categories + if (showOnlyMerchant || showOnlyTeam || showOnlyJuspayOthers) { + const matchesSelectedCategories = + (showOnlyMerchant && userCategory === "merchant") || + (showOnlyTeam && userCategory === "team") || + (showOnlyJuspayOthers && userCategory === "juspay-genius-merchant"); + + if (!matchesSelectedCategories) { + return false; + } } // Tag filter @@ -741,19 +888,25 @@ export default function JuspayDashboard() { allSessionsData.sessions, searchQuery, showOnlyMerchant, + showOnlyTeam, + showOnlyJuspayOthers, selectedTag, filterCorrect, filterIncorrect, hideUnknownUser, sessionToTagsMap, sessionEvaluationMap, + teamEmails, ]); - // Calculate statistics based on filtered sessions and their traces + // Enhanced statistics with three categories const statistics = React.useMemo(() => { if (!allSessionsTracesData.traces.length) { return { totalQueries: 0, + merchantQueries: 0, + geniusTeamQueries: 0, + juspayGeniusMerchantQueries: 0, correctQueries: 0, incorrectQueries: 0, correctPercentage: 0, @@ -761,6 +914,54 @@ export default function JuspayDashboard() { }; } + // Helper function to categorize user + const categorizeUser = (userIds: string[] | undefined) => { + if (!userIds || userIds.length === 0 || userIds[0] === "Unknown User") { + return "unknown"; + } + + const userId = userIds[0]; + + // Check if user is in team whitelist - more flexible matching + if (teamEmails.some(email => { + const emailLower = email.toLowerCase().trim(); + const userIdLower = userId.toLowerCase().trim(); + + // Try exact match first + if (userIdLower === emailLower) return true; + + // Try contains match (user ID contains the email) + if (userIdLower.includes(emailLower)) return true; + + // Try email contains user ID (for partial email matches) + if (emailLower.includes(userIdLower)) return true; + + // Try domain matching if email has @ symbol + if (emailLower.includes('@')) { + const emailDomain = emailLower.split('@')[1]; + const emailUsername = emailLower.split('@')[0]; + + // Check if user ID matches username part + if (userIdLower === emailUsername) return true; + + // Check if user ID contains username + if (userIdLower.includes(emailUsername)) return true; + } + + return false; + })) { + return "team"; + } + + // Check if user is juspay internal (contains @juspay) + if (userId.toLowerCase().includes("@juspay")) { + return "juspay-genius-merchant"; + } + + // Otherwise it's a merchant + return "merchant"; + }; + // Filter sessions for statistics const sessionsForStats = allSessionsData.sessions.filter((session) => { // Search filter @@ -773,12 +974,66 @@ export default function JuspayDashboard() { if (!matchesSearch) return false; - // Show only merchant data filter - if (showOnlyMerchant) { - const hasJuspayUser = session.userIds?.some((uid: string) => - uid.toLowerCase().includes("@juspay"), - ); - if (hasJuspayUser) return false; + // Helper function to categorize user for statistics filtering + const categorizeUserForStats = (userIds: string[] | undefined) => { + if (!userIds || userIds.length === 0 || userIds[0] === "Unknown User") { + return "unknown"; + } + + const userId = userIds[0]; + + // Check if user is in team whitelist - more flexible matching + if (teamEmails.some(email => { + const emailLower = email.toLowerCase().trim(); + const userIdLower = userId.toLowerCase().trim(); + + // Try exact match first + if (userIdLower === emailLower) return true; + + // Try contains match (user ID contains the email) + if (userIdLower.includes(emailLower)) return true; + + // Try email contains user ID (for partial email matches) + if (emailLower.includes(userIdLower)) return true; + + // Try domain matching if email has @ symbol + if (emailLower.includes('@')) { + const emailDomain = emailLower.split('@')[1]; + const emailUsername = emailLower.split('@')[0]; + + // Check if user ID matches username part + if (userIdLower === emailUsername) return true; + + // Check if user ID contains username + if (userIdLower.includes(emailUsername)) return true; + } + + return false; + })) { + return "team"; + } + + // Check if user is juspay internal (contains @juspay) + if (userId.toLowerCase().includes("@juspay")) { + return "juspay-genius-merchant"; + } + + // Otherwise it's a merchant + return "merchant"; + }; + + const userCategory = categorizeUserForStats(session.userIds); + + // Category filters - if any are checked, show only those categories + if (showOnlyMerchant || showOnlyTeam || showOnlyJuspayOthers) { + const matchesSelectedCategories = + (showOnlyMerchant && userCategory === "merchant") || + (showOnlyTeam && userCategory === "team") || + (showOnlyJuspayOthers && userCategory === "juspay-genius-merchant"); + + if (!matchesSelectedCategories) { + return false; + } } // Tag filter @@ -789,11 +1044,8 @@ export default function JuspayDashboard() { // Hide Unknown User filter if (hideUnknownUser) { - const isUnknownUser = - !session.userIds || - session.userIds.length === 0 || - session.userIds[0] === "Unknown User"; - if (isUnknownUser) return false; + const userCategory = categorizeUser(session.userIds); + if (userCategory === "unknown") return false; } // NOTE: We deliberately exclude filterCorrect and filterIncorrect here @@ -819,10 +1071,33 @@ export default function JuspayDashboard() { return true; }); + // Categorize queries by user type + let merchantQueries = 0; + let geniusTeamQueries = 0; + let juspayGeniusMerchantQueries = 0; + + tracesForStats.forEach((trace) => { + const session = allSessionsData.sessions.find(s => s.id === trace.sessionId); + if (session) { + const userCategory = categorizeUser(session.userIds); + switch (userCategory) { + case "merchant": + merchantQueries++; + break; + case "team": + geniusTeamQueries++; + break; + case "juspay-genius-merchant": + juspayGeniusMerchantQueries++; + break; + } + } + }); + // Total queries = traces for statistics const totalQueries = tracesForStats.length; - // Count correct/incorrect queries from genius-feedback scores (only for traces for statistics) + // Count correct/incorrect queries from genius-feedback scores let correctQueries = 0; let incorrectQueries = 0; @@ -850,6 +1125,9 @@ export default function JuspayDashboard() { return { totalQueries, + merchantQueries, + geniusTeamQueries, + juspayGeniusMerchantQueries, correctQueries, incorrectQueries, correctPercentage, @@ -862,9 +1140,12 @@ export default function JuspayDashboard() { filteredSessions, searchQuery, showOnlyMerchant, + showOnlyTeam, + showOnlyJuspayOthers, selectedTag, hideUnknownUser, sessionToTagsMap, + teamEmails, ]); // Extract agent name from the first trace's tags (since we can't access input from list query) @@ -1199,54 +1480,156 @@ export default function JuspayDashboard() {
- {/* Statistics Section */} + {/* Enhanced Statistics Section */}
{sessions.isLoading ? ( - + ) : ( -
-
- 📊 - - {filteredSessions && filteredSessions.length > 100 - ? "100+" - : filteredSessions?.length || 0} - - - sessions - -
- -
-
- - {statistics.incorrectQueries} +
+ {/* Main Stats Card */} +
+
+ 📊 + + {filteredSessions && filteredSessions.length > 100 + ? "100+" + : filteredSessions?.length || 0} - incorrect + sessions
-
- / - - {statistics.totalQueries} - - - total - +
+
+ + {statistics.incorrectQueries} + + + incorrect + +
+ +
+ / + + {statistics.totalQueries} + + + total + +
+ +
+ + ({statistics.correctPercentage}% + + + correct) + +
+
-
- - ({statistics.correctPercentage}% - - - correct) - + {/* Query Categories - Now Clickable Filter Buttons */} +
+ {/* Merchant Queries - Clickable */} +
handleShowOnlyMerchantChange(!showOnlyMerchant)} + > +
+ {statistics.merchantQueries > 9999 ? "9999+" : statistics.merchantQueries} + {showOnlyMerchant && ( +
+ ✓ +
+ )} +
+
+ Merchant +
+
+ + {/* Genius Team Queries - Clickable */} +
handleShowOnlyTeamChange(!showOnlyTeam)} + > +
+ {statistics.geniusTeamQueries > 9999 ? "9999+" : statistics.geniusTeamQueries} + {showOnlyTeam && ( +
+ ✓ +
+ )} +
+
+ Team +
+
+ + {/* Juspay-Genius-Merchant Queries - Clickable */} +
handleShowOnlyJuspayOthersChange(!showOnlyJuspayOthers)} + > +
+ {statistics.juspayGeniusMerchantQueries > 9999 ? "9999+" : statistics.juspayGeniusMerchantQueries} + {showOnlyJuspayOthers && ( +
+ ✓ +
+ )} +
+
+ Other +
@@ -1277,18 +1660,6 @@ export default function JuspayDashboard() {
- - {/* Tag Filter */}
+ + {/* Show More Filters Button */} +
+ {/* Advanced Filters Overlay */} + {showAdvancedFilters && ( + <> + {/* Overlay Background */} +
setShowAdvancedFilters(false)} + /> + + {/* Advanced Filters Modal */} +
+ +
+

Advanced Filters

+ +
+ +
+ {/* Team Email Selection with Dropdown */} +
+ +
+ {/* Email Dropdown with Search */} + + + + + +
+
Select Team Members
+ + {/* Search Input */} +
+ + setNewEmailInput(e.target.value)} + className="text-xs pl-7" + /> +
+ + {/* Available Emails List */} + +
+ {(() => { + // Get unique user emails from current date range + const uniqueEmails = new Set(); + allSessionsData.sessions.forEach(session => { + if (session.userIds && session.userIds.length > 0) { + const userId = session.userIds[0]; + if (userId && + userId !== "Unknown User" && + (userId.includes("@") || userId.includes("."))) { + uniqueEmails.add(userId); + } + } + }); + + // Filter emails based on search + const filteredEmails = Array.from(uniqueEmails) + .filter(email => + newEmailInput === "" || + email.toLowerCase().includes(newEmailInput.toLowerCase()) + ) + .sort(); + + return filteredEmails.map((email) => ( + + )); + })()} +
+
+ + + {/* Quick Actions */} +
+ + +
+
+
+
+ + {/* Selected Emails Display */} + {teamEmails.length > 0 && ( +
+ {teamEmails.map((email, index) => ( + { + setTeamEmails(prev => prev.filter((_, i) => i !== index)); + }} + > + {email} × + + ))} +
+ )} +
+
+
+ +
+ +
+
+
+ + )} +
Showing: {filteredSessions?.length || 0} of{" "} {allSessionsData.sessions.length || 0} sessions From 60207205ebc0d256c041f3d2e522171071ce9d18 Mon Sep 17 00:00:00 2001 From: Aman Srivastava Date: Thu, 6 Nov 2025 16:53:07 +0530 Subject: [PATCH 10/21] fixed some bugs --- .../project/[projectId]/juspay-dashboard.tsx | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/web/src/pages/project/[projectId]/juspay-dashboard.tsx b/web/src/pages/project/[projectId]/juspay-dashboard.tsx index b4795cc7c6e1..e1f749ec82ce 100644 --- a/web/src/pages/project/[projectId]/juspay-dashboard.tsx +++ b/web/src/pages/project/[projectId]/juspay-dashboard.tsx @@ -94,18 +94,15 @@ export default function JuspayDashboard() { return toAbsoluteTimeRange(timeRange) ?? undefined; }, [timeRange]); - // Use tableDateRange as our dateRange - wrapped in useMemo for performance - const dateRange = React.useMemo(() => { - if (tableDateRange) { - return tableDateRange; - } + // Use tableDateRange as our dateRange + const dateRange = tableDateRange ?? (() => { // Create fallback date range without mutation const today = new Date(); return { from: new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0, 0), to: new Date(today.getFullYear(), today.getMonth(), today.getDate(), 23, 59, 59, 999), }; - }, [tableDateRange]); + })(); // Filter persistence using localStorage (same approach as before but simpler) const filterStorageKey = `juspay-dashboard-filters-${projectId}`; @@ -305,13 +302,11 @@ export default function JuspayDashboard() { console.log("📅 Date range changed:", { from: newDateRange.from.toISOString(), to: newDateRange.to.toISOString(), - previousFrom: dateRange.from.toISOString(), - previousTo: dateRange.to.toISOString(), }); // Use the same approach as traces page setTimeRange({ from: newDateRange.from, to: newDateRange.to }); }, - [dateRange, setTimeRange], + [setTimeRange], ); const handleShowOnlyMerchantChange = (value: boolean) => { @@ -1459,8 +1454,8 @@ export default function JuspayDashboard() { }} onSelect={(range: any) => { if (range?.from) { - const fromDate = new Date(range.from); - const toDate = range.to ? new Date(range.to) : new Date(range.from); + const fromDate = new Date(range.from.getTime()); + const toDate = range.to ? new Date(range.to.getTime()) : new Date(range.from.getTime()); const newRange = { from: new Date(fromDate.getFullYear(), fromDate.getMonth(), fromDate.getDate(), 0, 0, 0, 0), From 0210f0db27c10fb4d98f3aee2e3899243a14b17b Mon Sep 17 00:00:00 2001 From: Aman Srivastava Date: Mon, 10 Nov 2025 18:02:41 +0530 Subject: [PATCH 11/21] minor bug fix after rebase --- .../pages/project/[projectId]/juspay-dashboard.tsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/web/src/pages/project/[projectId]/juspay-dashboard.tsx b/web/src/pages/project/[projectId]/juspay-dashboard.tsx index e1f749ec82ce..3f4590098797 100644 --- a/web/src/pages/project/[projectId]/juspay-dashboard.tsx +++ b/web/src/pages/project/[projectId]/juspay-dashboard.tsx @@ -474,12 +474,14 @@ export default function JuspayDashboard() { const traceFilterOptions = api.traces.filterOptions.useQuery( { projectId, - timestampFilter: { - column: "timestamp", - type: "datetime", - operator: ">=", - value: dateRange.from, - }, + timestampFilter: [ + { + column: "timestamp", + type: "datetime", + operator: ">=", + value: dateRange.from, + }, + ], }, { enabled: !!projectId, From cb7d595266196a732c81a31c193fd5ec6cb6f56b Mon Sep 17 00:00:00 2001 From: Aman Srivastava Date: Thu, 13 Nov 2025 18:18:39 +0530 Subject: [PATCH 12/21] Added manual feedback/rating suppprt along with summary statstics pannel --- .../project/[projectId]/juspay-dashboard.tsx | 1416 +++++++++++++---- web/src/server/api/routers/scores.ts | 190 +++ 2 files changed, 1320 insertions(+), 286 deletions(-) diff --git a/web/src/pages/project/[projectId]/juspay-dashboard.tsx b/web/src/pages/project/[projectId]/juspay-dashboard.tsx index 3f4590098797..b2e31462e943 100644 --- a/web/src/pages/project/[projectId]/juspay-dashboard.tsx +++ b/web/src/pages/project/[projectId]/juspay-dashboard.tsx @@ -24,6 +24,7 @@ import { GripVertical, Menu, X, + BarChart3, } from "lucide-react"; import { cn } from "@/src/utils/tailwind"; import { Skeleton } from "@/src/components/ui/skeleton"; @@ -38,6 +39,21 @@ import { PopoverContent, PopoverTrigger, } from "@/src/components/ui/popover"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/src/components/ui/dialog"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/src/components/ui/table"; import { Calendar as CalendarComponent } from "@/src/components/ui/calendar"; import { MarkdownJsonView } from "@/src/components/ui/MarkdownJsonView"; import { PrettyJsonView } from "@/src/components/ui/PrettyJsonView"; @@ -64,45 +80,39 @@ export default function JuspayDashboard() { defaultRelativeAggregation: "last1Day", }); - // Auto-update URL with default date range on initial load + // Ensure URL is updated with default date range on first visit (for sharing) React.useEffect(() => { - if (router.isReady && timeRange && typeof window !== "undefined") { + if (router.isReady && typeof window !== "undefined") { const params = new URLSearchParams(window.location.search); - // Check if there's no existing dateRange parameter in URL + // If no dateRange parameter exists in URL, ensure it gets set if (!params.has('dateRange')) { - // Convert timeRange to the format expected by the URL - const absoluteRange = toAbsoluteTimeRange(timeRange); - if (absoluteRange) { - const fromTimestamp = absoluteRange.from.getTime(); - const toTimestamp = absoluteRange.to.getTime(); - const dateRangeParam = `${fromTimestamp}-${toTimestamp}`; - - params.set('dateRange', dateRangeParam); - - // Update URL without navigation - const newUrl = `${window.location.pathname}?${params.toString()}`; - window.history.replaceState({}, "", newUrl); - console.log("🔗 Auto-updated URL with default date range:", newUrl); + // The hook should handle this, but let's ensure it happens + // by triggering a setTimeRange with the current timeRange + if (timeRange) { + setTimeRange(timeRange); } } } - }, [router.isReady, timeRange]); + }, [router.isReady, timeRange, setTimeRange]); // Convert timeRange to absolute date range for compatibility const tableDateRange = React.useMemo(() => { - return toAbsoluteTimeRange(timeRange) ?? undefined; + return toAbsoluteTimeRange(timeRange); }, [timeRange]); - // Use tableDateRange as our dateRange - const dateRange = tableDateRange ?? (() => { - // Create fallback date range without mutation + // Use tableDateRange as our dateRange with proper fallback + const dateRange = React.useMemo(() => { + if (tableDateRange) { + return tableDateRange; + } + // Create fallback date range const today = new Date(); return { from: new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0, 0), to: new Date(today.getFullYear(), today.getMonth(), today.getDate(), 23, 59, 59, 999), }; - })(); + }, [tableDateRange]); // Filter persistence using localStorage (same approach as before but simpler) const filterStorageKey = `juspay-dashboard-filters-${projectId}`; @@ -221,7 +231,7 @@ export default function JuspayDashboard() { ); const [searchQuery, setSearchQuery] = useState(""); const [selectedToolCall, setSelectedToolCall] = useState(null); - const [showFilters, setShowFilters] = useState(true); + const [showFilters, setShowFilters] = useState(false); const [showAdvancedFilters, setShowAdvancedFilters] = useState(false); const [showOnlyMerchant, setShowOnlyMerchant] = useState(() => { @@ -288,6 +298,154 @@ export default function JuspayDashboard() { }); const [newEmailInput, setNewEmailInput] = useState(""); + // Fetch traces for all sessions within date range with pagination + const [allTraces, setAllTraces] = React.useState([]); + const [currentPage, setCurrentPage] = React.useState(0); + const [hasMoreTraces, setHasMoreTraces] = React.useState(true); + + const allSessionsTraces = api.traces.all.useQuery( + { + projectId, + filter: [ + { + column: "timestamp", + type: "datetime", + operator: ">=", + value: dateRange.from, + }, + { + column: "timestamp", + type: "datetime", + operator: "<=", + value: dateRange.to, + }, + ], + searchQuery: null, + searchType: [], + page: currentPage, + limit: 99, + orderBy: { column: "timestamp", order: "DESC" }, + }, + { + enabled: !!projectId && hasMoreTraces, + }, + ); + + // Accumulate traces from pagination + React.useEffect(() => { + if (allSessionsTraces.data?.traces) { + const newTraces = allSessionsTraces.data.traces; + if (currentPage === 0) { + setAllTraces(newTraces); + } else { + setAllTraces((prev) => [...prev, ...newTraces]); + } + + if (newTraces.length < 99) { + setHasMoreTraces(false); + } + } + }, [allSessionsTraces.data?.traces, currentPage]); + + // Auto-load more traces when there are more available + React.useEffect(() => { + if ( + hasMoreTraces && + !allSessionsTraces.isLoading && + allSessionsTraces.data?.traces + ) { + setCurrentPage((prev) => prev + 1); + } + }, [ + hasMoreTraces, + allSessionsTraces.isLoading, + allSessionsTraces.data?.traces, + ]); + + // Reset trace pagination when date range changes + React.useEffect(() => { + if (dateRange?.from && dateRange?.to) { + setAllTraces([]); + setCurrentPage(0); + setHasMoreTraces(true); + } + }, [dateRange?.from, dateRange?.to]); + + // Create a wrapper object + const allSessionsTracesData = React.useMemo( + () => ({ + traces: allTraces, + }), + [allTraces], + ); + + // Fetch manual ratings from database + const manualRatingsQuery = api.scores.getManualRatings.useQuery( + { + projectId, + traceIds: allSessionsTracesData.traces.map(t => t.id), + }, + { + enabled: !!projectId && allSessionsTracesData.traces.length > 0, + }, + ); + + // Create manual ratings mutation + const createManualRatingMutation = api.scores.createManualRating.useMutation({ + onSuccess: () => { + // Refetch manual ratings after successful creation + manualRatingsQuery.refetch(); + }, + onError: (error) => { + console.error("Failed to create manual rating:", error); + toast.error("Failed to save rating"); + }, + }); + + // Delete manual rating mutation + const deleteManualRatingMutation = api.scores.deleteManualRating.useMutation({ + onSuccess: () => { + // Refetch manual ratings after successful deletion + manualRatingsQuery.refetch(); + }, + onError: (error) => { + console.error("Failed to delete manual rating:", error); + toast.error("Failed to clear rating"); + }, + }); + + // Convert manual ratings data to Map for easier access + const manualRatings = React.useMemo(() => { + const ratingsMap = new Map(); + if (manualRatingsQuery.data) { + manualRatingsQuery.data.forEach(rating => { + ratingsMap.set(rating.traceId, rating.rating); + }); + } + return ratingsMap; + }, [manualRatingsQuery.data]); + + // Function to update manual rating for a trace + const updateManualRating = React.useCallback( + (traceId: string, rating: string | null) => { + if (rating === null) { + // Delete the rating + deleteManualRatingMutation.mutate({ + projectId, + traceId, + }); + } else { + // Create or update the rating + createManualRatingMutation.mutate({ + projectId, + traceId, + rating: rating as "correct" | "needs-work" | "wrong", + }); + } + }, + [projectId, createManualRatingMutation, deleteManualRatingMutation], + ); + const [showDatePicker, setShowDatePicker] = useState(false); const [sessionPage, setSessionPage] = useState(0); @@ -296,6 +454,9 @@ export default function JuspayDashboard() { const [isResizing, setIsResizing] = useState<'right' | null>(null); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [isMobileRightPanelOpen, setIsMobileRightPanelOpen] = useState(false); + const [showStatsModal, setShowStatsModal] = useState(false); + const [showManualRatingsModal, setShowManualRatingsModal] = useState(false); + const [isLoadingData, setIsLoadingData] = useState(false); const handleDateRangeChange = React.useCallback( (newDateRange: { from: Date; to: Date }) => { @@ -303,7 +464,24 @@ export default function JuspayDashboard() { from: newDateRange.from.toISOString(), to: newDateRange.to.toISOString(), }); - // Use the same approach as traces page + + // Cancel previous loading and start new one immediately + setIsLoadingData(true); + + // Clear existing data immediately to show loading state + setAllSessions([]); + setAllTraces([]); + setAllScores([]); + + // Reset pagination + setSessionPage(0); + setCurrentPage(0); + setScoresPage(0); + setHasMoreSessions(true); + setHasMoreTraces(true); + setHasMoreScores(true); + + // Set new date range (this will trigger new API calls) setTimeRange({ from: newDateRange.from, to: newDateRange.to }); }, [setTimeRange], @@ -417,7 +595,7 @@ export default function JuspayDashboard() { orderBy: { column: "createdAt", order: "DESC" }, }, { - enabled: !!projectId, + enabled: !!projectId && !!dateRange?.from && !!dateRange?.to, }, ); @@ -447,12 +625,22 @@ export default function JuspayDashboard() { } }, [hasMoreSessions, sessions.isLoading, sessions.data?.sessions]); - // Reset session pagination when date range changes + // Reset session pagination when date range changes with loading state React.useEffect(() => { - setAllSessions([]); - setSessionPage(0); - setHasMoreSessions(true); - }, [projectId, dateRange.from, dateRange.to]); + if (dateRange?.from && dateRange?.to) { + setIsLoadingData(true); + setAllSessions([]); + setSessionPage(0); + setHasMoreSessions(true); + + // Clear loading state after a short delay to prevent race conditions + const timer = setTimeout(() => { + setIsLoadingData(false); + }, 100); + + return () => clearTimeout(timer); + } + }, [projectId, dateRange?.from, dateRange?.to]); // Create wrapper for sessions const allSessionsData = React.useMemo( @@ -464,11 +652,13 @@ export default function JuspayDashboard() { // Reset when date range changes React.useEffect(() => { - console.log("🔄 SESSIONS - Date range changed, will refetch:", { - from: dateRange.from.toISOString(), - to: dateRange.to.toISOString(), - }); - }, [dateRange.from, dateRange.to]); + if (dateRange?.from && dateRange?.to) { + console.log("🔄 SESSIONS - Date range changed, will refetch:", { + from: dateRange.from.toISOString(), + to: dateRange.to.toISOString(), + }); + } + }, [dateRange?.from, dateRange?.to]); // Fetch all tags for filtering (no limit issues!) const traceFilterOptions = api.traces.filterOptions.useQuery( @@ -488,85 +678,6 @@ export default function JuspayDashboard() { }, ); - // Fetch traces for all sessions within date range with pagination - const [allTraces, setAllTraces] = React.useState([]); - const [currentPage, setCurrentPage] = React.useState(0); - const [hasMoreTraces, setHasMoreTraces] = React.useState(true); - - const allSessionsTraces = api.traces.all.useQuery( - { - projectId, - filter: [ - { - column: "timestamp", - type: "datetime", - operator: ">=", - value: dateRange.from, - }, - { - column: "timestamp", - type: "datetime", - operator: "<=", - value: dateRange.to, - }, - ], - searchQuery: null, - searchType: [], - page: currentPage, - limit: 99, - orderBy: { column: "timestamp", order: "DESC" }, - }, - { - enabled: !!projectId && !!allSessions.length && hasMoreTraces, - }, - ); - - // Accumulate traces from pagination - React.useEffect(() => { - if (allSessionsTraces.data?.traces) { - const newTraces = allSessionsTraces.data.traces; - if (currentPage === 0) { - setAllTraces(newTraces); - } else { - setAllTraces((prev) => [...prev, ...newTraces]); - } - - if (newTraces.length < 99) { - setHasMoreTraces(false); - } - } - }, [allSessionsTraces.data?.traces, currentPage]); - - // Auto-load more traces when there are more available - React.useEffect(() => { - if ( - hasMoreTraces && - !allSessionsTraces.isLoading && - allSessionsTraces.data?.traces - ) { - setCurrentPage((prev) => prev + 1); - } - }, [ - hasMoreTraces, - allSessionsTraces.isLoading, - allSessionsTraces.data?.traces, - ]); - - // Reset trace pagination when date range changes - React.useEffect(() => { - setAllTraces([]); - setCurrentPage(0); - setHasMoreTraces(true); - }, [dateRange.from, dateRange.to]); - - // Create a wrapper object - const allSessionsTracesData = React.useMemo( - () => ({ - traces: allTraces, - }), - [allTraces], - ); - // Fetch scores with pagination const [allScores, setAllScores] = React.useState([]); const [scoresPage, setScoresPage] = React.useState(0); @@ -617,10 +728,12 @@ export default function JuspayDashboard() { // Reset scores pagination when date range changes React.useEffect(() => { - setAllScores([]); - setScoresPage(0); - setHasMoreScores(true); - }, [dateRange.from, dateRange.to]); + if (dateRange?.from && dateRange?.to) { + setAllScores([]); + setScoresPage(0); + setHasMoreScores(true); + } + }, [dateRange?.from, dateRange?.to]); // Simple scores data wrapper const allScoresData = React.useMemo( @@ -971,55 +1084,7 @@ export default function JuspayDashboard() { if (!matchesSearch) return false; - // Helper function to categorize user for statistics filtering - const categorizeUserForStats = (userIds: string[] | undefined) => { - if (!userIds || userIds.length === 0 || userIds[0] === "Unknown User") { - return "unknown"; - } - - const userId = userIds[0]; - - // Check if user is in team whitelist - more flexible matching - if (teamEmails.some(email => { - const emailLower = email.toLowerCase().trim(); - const userIdLower = userId.toLowerCase().trim(); - - // Try exact match first - if (userIdLower === emailLower) return true; - - // Try contains match (user ID contains the email) - if (userIdLower.includes(emailLower)) return true; - - // Try email contains user ID (for partial email matches) - if (emailLower.includes(userIdLower)) return true; - - // Try domain matching if email has @ symbol - if (emailLower.includes('@')) { - const emailDomain = emailLower.split('@')[1]; - const emailUsername = emailLower.split('@')[0]; - - // Check if user ID matches username part - if (userIdLower === emailUsername) return true; - - // Check if user ID contains username - if (userIdLower.includes(emailUsername)) return true; - } - - return false; - })) { - return "team"; - } - - // Check if user is juspay internal (contains @juspay) - if (userId.toLowerCase().includes("@juspay")) { - return "juspay-genius-merchant"; - } - - // Otherwise it's a merchant - return "merchant"; - }; - - const userCategory = categorizeUserForStats(session.userIds); + const userCategory = categorizeUser(session.userIds); // Category filters - if any are checked, show only those categories if (showOnlyMerchant || showOnlyTeam || showOnlyJuspayOthers) { @@ -1068,29 +1133,6 @@ export default function JuspayDashboard() { return true; }); - // Categorize queries by user type - let merchantQueries = 0; - let geniusTeamQueries = 0; - let juspayGeniusMerchantQueries = 0; - - tracesForStats.forEach((trace) => { - const session = allSessionsData.sessions.find(s => s.id === trace.sessionId); - if (session) { - const userCategory = categorizeUser(session.userIds); - switch (userCategory) { - case "merchant": - merchantQueries++; - break; - case "team": - geniusTeamQueries++; - break; - case "juspay-genius-merchant": - juspayGeniusMerchantQueries++; - break; - } - } - }); - // Total queries = traces for statistics const totalQueries = tracesForStats.length; @@ -1121,24 +1163,169 @@ export default function JuspayDashboard() { const totalSessions = filteredSessions?.length || 0; return { - totalQueries, + totalQueries, + merchantQueries: 0, // Will be calculated separately + geniusTeamQueries: 0, // Will be calculated separately + juspayGeniusMerchantQueries: 0, // Will be calculated separately + correctQueries, + incorrectQueries, + correctPercentage, + totalSessions, + }; + }, [ + allScoresData.scores, + allSessionsTracesData.traces, + allSessionsData.sessions, + filteredSessions, + searchQuery, + showOnlyMerchant, + showOnlyTeam, + showOnlyJuspayOthers, + selectedTag, + hideUnknownUser, + sessionToTagsMap, + teamEmails, + ]); + + // Separate statistics for filter cards - always show total counts regardless of category filters + const cardStatistics = React.useMemo(() => { + if (!allSessionsTracesData.traces.length) { + return { + merchantQueries: 0, + geniusTeamQueries: 0, + juspayGeniusMerchantQueries: 0, + }; + } + + // Helper function to categorize user + const categorizeUser = (userIds: string[] | undefined) => { + if (!userIds || userIds.length === 0 || userIds[0] === "Unknown User") { + return "unknown"; + } + + const userId = userIds[0]; + + // Check if user is in team whitelist - more flexible matching + if (teamEmails.some(email => { + const emailLower = email.toLowerCase().trim(); + const userIdLower = userId.toLowerCase().trim(); + + // Try exact match first + if (userIdLower === emailLower) return true; + + // Try contains match (user ID contains the email) + if (userIdLower.includes(emailLower)) return true; + + // Try email contains user ID (for partial email matches) + if (emailLower.includes(userIdLower)) return true; + + // Try domain matching if email has @ symbol + if (emailLower.includes('@')) { + const emailDomain = emailLower.split('@')[1]; + const emailUsername = emailLower.split('@')[0]; + + // Check if user ID matches username part + if (userIdLower === emailUsername) return true; + + // Check if user ID contains username + if (userIdLower.includes(emailUsername)) return true; + } + + return false; + })) { + return "team"; + } + + // Check if user is juspay internal (contains @juspay) + if (userId.toLowerCase().includes("@juspay")) { + return "juspay-genius-merchant"; + } + + // Otherwise it's a merchant + return "merchant"; + }; + + // Filter sessions for card statistics - exclude category filters but include other filters + const sessionsForCardStats = allSessionsData.sessions.filter((session) => { + // Search filter + const matchesSearch = searchQuery + ? session.id.toLowerCase().includes(searchQuery.toLowerCase()) || + session.userIds?.some((uid: string) => + uid.toLowerCase().includes(searchQuery.toLowerCase()), + ) + : true; + + if (!matchesSearch) return false; + + const userCategory = categorizeUser(session.userIds); + + // Tag filter + if (selectedTag !== "all") { + const sessionTags = sessionToTagsMap.get(session.id); + if (!sessionTags || !sessionTags.includes(selectedTag)) return false; + } + + // Hide Unknown User filter + if (hideUnknownUser) { + if (userCategory === "unknown") return false; + } + + // NOTE: We deliberately exclude category filters (showOnlyMerchant, showOnlyTeam, showOnlyJuspayOthers) + // and evaluation filters (filterCorrect, filterIncorrect) here + // so card statistics always show total counts + + return true; + }); + + // Get session IDs from sessions for card statistics + const sessionIdsForCardStats = new Set(sessionsForCardStats.map(session => session.id)); + + // Filter traces to only include those from sessions for card statistics + const tracesForCardStats = allSessionsTracesData.traces.filter((trace) => { + // Only include traces from sessions for card statistics + if (!trace.sessionId || !sessionIdsForCardStats.has(trace.sessionId)) { + return false; + } + + // Apply tag filter if selected + if (selectedTag !== "all") { + if (!trace.tags || !trace.tags.includes(selectedTag)) return false; + } + return true; + }); + + // Categorize queries by user type for cards + let merchantQueries = 0; + let geniusTeamQueries = 0; + let juspayGeniusMerchantQueries = 0; + + tracesForCardStats.forEach((trace) => { + const session = allSessionsData.sessions.find(s => s.id === trace.sessionId); + if (session) { + const userCategory = categorizeUser(session.userIds); + switch (userCategory) { + case "merchant": + merchantQueries++; + break; + case "team": + geniusTeamQueries++; + break; + case "juspay-genius-merchant": + juspayGeniusMerchantQueries++; + break; + } + } + }); + + return { merchantQueries, geniusTeamQueries, juspayGeniusMerchantQueries, - correctQueries, - incorrectQueries, - correctPercentage, - totalSessions, }; }, [ - allScoresData.scores, allSessionsTracesData.traces, allSessionsData.sessions, - filteredSessions, searchQuery, - showOnlyMerchant, - showOnlyTeam, - showOnlyJuspayOthers, selectedTag, hideUnknownUser, sessionToTagsMap, @@ -1254,6 +1441,130 @@ export default function JuspayDashboard() { const isTablet = windowWidth >= 768 && windowWidth < 1024; const isDesktop = windowWidth >= 1024; + // Calculate detailed statistics for the table + const detailedStatistics = React.useMemo(() => { + if (!allSessionsTracesData.traces.length) { + return { + merchant: { totalSessions: 0, totalQueries: 0, incorrectQueries: 0, accuracy: 0 }, + team: { totalSessions: 0, totalQueries: 0, incorrectQueries: 0, accuracy: 0 }, + other: { totalSessions: 0, totalQueries: 0, incorrectQueries: 0, accuracy: 0 }, + }; + } + + // Helper function to categorize user + const categorizeUser = (userIds: string[] | undefined) => { + if (!userIds || userIds.length === 0 || userIds[0] === "Unknown User") { + return "unknown"; + } + + const userId = userIds[0]; + + // Check if user is in team whitelist + if (teamEmails.some(email => { + const emailLower = email.toLowerCase().trim(); + const userIdLower = userId.toLowerCase().trim(); + + return userIdLower === emailLower || + userIdLower.includes(emailLower) || + emailLower.includes(userIdLower) || + (emailLower.includes('@') && userIdLower === emailLower.split('@')[0]); + })) { + return "team"; + } + + // Check if user is juspay internal + if (userId.toLowerCase().includes("@juspay")) { + return "juspay-genius-merchant"; + } + + return "merchant"; + }; + + // Filter sessions based on current filters (excluding correct/incorrect filters) + const sessionsForStats = allSessionsData.sessions.filter((session) => { + const matchesSearch = searchQuery + ? session.id.toLowerCase().includes(searchQuery.toLowerCase()) || + session.userIds?.some((uid: string) => + uid.toLowerCase().includes(searchQuery.toLowerCase()), + ) + : true; + + if (!matchesSearch) return false; + + const userCategory = categorizeUser(session.userIds); + + if (showOnlyMerchant || showOnlyTeam || showOnlyJuspayOthers) { + const matchesSelectedCategories = + (showOnlyMerchant && userCategory === "merchant") || + (showOnlyTeam && userCategory === "team") || + (showOnlyJuspayOthers && userCategory === "juspay-genius-merchant"); + + if (!matchesSelectedCategories) return false; + } + + if (selectedTag !== "all") { + const sessionTags = sessionToTagsMap.get(session.id); + if (!sessionTags || !sessionTags.includes(selectedTag)) return false; + } + + if (hideUnknownUser && userCategory === "unknown") return false; + + return true; + }); + + // Group sessions by category + const sessionsByCategory = { + merchant: sessionsForStats.filter(s => categorizeUser(s.userIds) === "merchant"), + team: sessionsForStats.filter(s => categorizeUser(s.userIds) === "team"), + other: sessionsForStats.filter(s => categorizeUser(s.userIds) === "juspay-genius-merchant"), + }; + + // Calculate stats for each category + const calculateCategoryStats = (sessions: any[], category: string) => { + const sessionIds = new Set(sessions.map(s => s.id)); + + // Get traces for these sessions + const categoryTraces = allSessionsTracesData.traces.filter(trace => + trace.sessionId && sessionIds.has(trace.sessionId) + ); + + // Get scores for these traces + const categoryScores = allScoresData.scores.filter(score => + categoryTraces.some(trace => trace.id === score.traceId) + ); + + const correctQueries = categoryScores.filter(score => score.value === 1).length; + const incorrectQueries = categoryScores.filter(score => score.value === 0).length; + const totalEvaluated = correctQueries + incorrectQueries; + const accuracy = totalEvaluated > 0 ? Math.round((correctQueries / totalEvaluated) * 100) : 0; + + return { + totalSessions: sessions.length, + totalQueries: categoryTraces.length, + incorrectQueries, + accuracy, + }; + }; + + return { + merchant: calculateCategoryStats(sessionsByCategory.merchant, "merchant"), + team: calculateCategoryStats(sessionsByCategory.team, "team"), + other: calculateCategoryStats(sessionsByCategory.other, "other"), + }; + }, [ + allSessionsTracesData.traces, + allSessionsData.sessions, + allScoresData.scores, + searchQuery, + showOnlyMerchant, + showOnlyTeam, + showOnlyJuspayOthers, + selectedTag, + hideUnknownUser, + sessionToTagsMap, + teamEmails, + ]); + return (
- {statistics.merchantQueries > 9999 ? "9999+" : statistics.merchantQueries} + {cardStatistics.merchantQueries > 9999 ? "9999+" : cardStatistics.merchantQueries} {showOnlyMerchant && (
✓ @@ -1577,12 +1888,12 @@ export default function JuspayDashboard() { >
- {statistics.geniusTeamQueries > 9999 ? "9999+" : statistics.geniusTeamQueries} + {cardStatistics.geniusTeamQueries > 9999 ? "9999+" : cardStatistics.geniusTeamQueries} {showOnlyTeam && (
✓ @@ -1609,12 +1920,12 @@ export default function JuspayDashboard() { >
- {statistics.juspayGeniusMerchantQueries > 9999 ? "9999+" : statistics.juspayGeniusMerchantQueries} + {cardStatistics.juspayGeniusMerchantQueries > 9999 ? "9999+" : cardStatistics.juspayGeniusMerchantQueries} {showOnlyJuspayOthers && (
✓ @@ -1911,15 +2222,78 @@ export default function JuspayDashboard() { )}
-
- -
- + + {/* Apply Filters Button - For Team Email Settings */} +
+ +
+ + {/* Manual Ratings Section */} +
+ + +
+
+ + + Rate Assistant Responses + +
+ +

+ Click the button below to open the manual ratings interface +

+ + + + {/* Show rating statistics if any ratings exist */} + {manualRatings.size > 0 && ( +
+
+ Current Ratings: +
+
+
+
+ {Array.from(manualRatings.values()).filter(r => r === "correct").length} +
+
Correct
+
+
+
+ {Array.from(manualRatings.values()).filter(r => r === "needs-work").length} +
+
Needs Work
+
+
+
+ {Array.from(manualRatings.values()).filter(r => r === "wrong").length} +
+
Wrong
+
+
+
+ )} +
+
+
@@ -1934,11 +2308,16 @@ export default function JuspayDashboard() { {/* Sessions List */} - {sessions.isLoading ? ( + {sessions.isLoading || isLoadingData ? (
{[...Array(5)].map((_, i) => ( ))} + {isLoadingData && ( +
+ Loading data for new date range... +
+ )}
) : (
@@ -1999,7 +2378,7 @@ export default function JuspayDashboard() { {/* Middle Section - Conversation Flow */}
@@ -2045,6 +2424,8 @@ export default function JuspayDashboard() { traceMetric={traceMetric} projectId={projectId} isSelected={selectedToolCall?.id === trace.id} + manualRating={manualRatings.get(trace.id)} + onManualRatingChange={updateManualRating} onSelect={(traceId, timestamp) => { setSelectedTraceForDetails({ traceId, timestamp }); setSelectedToolCall({ @@ -2071,6 +2452,236 @@ export default function JuspayDashboard() {
)} + + + {/* Manual Ratings Modal */} + + + + + + Manual Ratings Management + + + +
+ { + handleSessionSelect(sessionId); + setShowManualRatingsModal(false); + }} + /> +
+
+
+ + {/* Total Stats Button - Positioned in Middle Section */} + + + + + + + + + Total Statistics Overview + + + +
+ +
+ {/* Summary Cards */} +
+ +
+
+ {statistics.totalSessions} +
+
Total Sessions
+
+
+ + +
+
+ {statistics.totalQueries} +
+
Total Queries
+
+
+ + +
+
+ {statistics.correctPercentage}% +
+
Overall Accuracy
+
+
+
+ + {/* Detailed Statistics Table */} + +
+

Detailed Breakdown by User Category

+

+ Statistics filtered by current date range and applied filters +

+
+ + + + + Category + Total Sessions + Total Queries + Incorrect Queries + Accuracy + + + + + +
+
+ Merchant +
+
+ + {detailedStatistics.merchant.totalSessions} + + + {detailedStatistics.merchant.totalQueries} + + + + {detailedStatistics.merchant.incorrectQueries} + + + + = 80 ? "default" : "destructive"} + className={cn( + "font-semibold", + detailedStatistics.merchant.accuracy >= 80 + ? "bg-green-600 hover:bg-green-700" + : "" + )} + > + {detailedStatistics.merchant.accuracy}% + + +
+ + + +
+
+ Team +
+
+ + {detailedStatistics.team.totalSessions} + + + {detailedStatistics.team.totalQueries} + + + + {detailedStatistics.team.incorrectQueries} + + + + = 80 ? "default" : "destructive"} + className={cn( + "font-semibold", + detailedStatistics.team.accuracy >= 80 + ? "bg-green-600 hover:bg-green-700" + : "" + )} + > + {detailedStatistics.team.accuracy}% + + +
+ + + +
+
+ Other +
+
+ + {detailedStatistics.other.totalSessions} + + + {detailedStatistics.other.totalQueries} + + + + {detailedStatistics.other.incorrectQueries} + + + + = 80 ? "default" : "destructive"} + className={cn( + "font-semibold", + detailedStatistics.other.accuracy >= 80 + ? "bg-green-600 hover:bg-green-700" + : "" + )} + > + {detailedStatistics.other.accuracy}% + + +
+
+
+
+ + {/* Additional Insights */} + +

Current Filters Applied:

+
+ + Date: {dateRange.from.toLocaleDateString()} - {dateRange.to.toLocaleDateString()} + + {selectedTag !== "all" && ( + Agent: {selectedTag} + )} + {showOnlyMerchant && Merchant Only} + {showOnlyTeam && Team Only} + {showOnlyJuspayOthers && Other Only} + {filterCorrect && Correct Only} + {filterIncorrect && Incorrect Only} + {hideUnknownUser && Hide Unknown} + {teamEmails.length > 0 && ( + Team Emails: {teamEmails.length} + )} +
+
+
+
+
+
{/* Right Resizer Handle */} @@ -2200,11 +2811,236 @@ export default function JuspayDashboard() {
)} +
); } +// Manual Ratings Content Component +function ManualRatingsContent({ + manualRatings, + allTraces, + allSessions, + onUpdateRating, + onNavigateToSession, +}: { + manualRatings: Map; + allTraces: any[]; + allSessions: any[]; + onUpdateRating: (traceId: string, rating: string | null) => void; + onNavigateToSession: (sessionId: string) => void; +}) { + const [filterRating, setFilterRating] = useState("all"); + + // Get all rated traces with their details + const ratedTraces = React.useMemo(() => { + const traces = Array.from(manualRatings.entries()).map(([traceId, rating]) => { + const trace = allTraces.find(t => t.id === traceId); + if (!trace) return null; + + const session = allSessions.find(s => s.id === trace.sessionId); + return { + traceId, + rating, + trace, + session, + timestamp: trace.timestamp, + }; + }).filter((item): item is NonNullable => item !== null); + + // Filter by rating type + if (filterRating !== "all") { + return traces.filter(item => item.rating === filterRating); + } + + // Sort by timestamp (newest first) + return traces.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()); + }, [manualRatings, allTraces, allSessions, filterRating]); + + // Statistics + const stats = React.useMemo(() => { + const total = manualRatings.size; + const correct = Array.from(manualRatings.values()).filter(r => r === "correct").length; + const needsWork = Array.from(manualRatings.values()).filter(r => r === "needs-work").length; + const wrong = Array.from(manualRatings.values()).filter(r => r === "wrong").length; + + return { total, correct, needsWork, wrong }; + }, [manualRatings]); + + const getRatingIcon = (rating: string) => { + switch (rating) { + case "correct": + return ; + case "needs-work": + return ; + case "wrong": + return ; + default: + return null; + } + }; + + const getRatingColor = (rating: string) => { + switch (rating) { + case "correct": + return "text-green-600 bg-green-50 border-green-200"; + case "needs-work": + return "text-yellow-600 bg-yellow-50 border-yellow-200"; + case "wrong": + return "text-red-600 bg-red-50 border-red-200"; + default: + return "text-gray-600 bg-gray-50 border-gray-200"; + } + }; + + if (manualRatings.size === 0) { + return ( +
+ +

No Manual Ratings Yet

+

+ Start rating responses by clicking the "Correct", "Needs Work", or "Wrong" buttons on any assistant response. +

+
+ ); + } + + return ( +
+ {/* Statistics Cards */} +
+ +
{stats.total}
+
Total Rated
+
+ +
{stats.correct}
+
Correct
+
+ +
{stats.needsWork}
+
Needs Work
+
+ +
{stats.wrong}
+
Wrong
+
+
+ + {/* Filter Controls */} +
+ + + +
+ + {/* Ratings Table */} + + + + + Rating + Session + User + Timestamp + Actions + + + + {ratedTraces.map((item) => ( + + +
+ {getRatingIcon(item.rating)} + {item.rating === "needs-work" ? "Needs Work" : + item.rating.charAt(0).toUpperCase() + item.rating.slice(1)} +
+
+ +
+ {item.session?.id.slice(0, 8)}... +
+
+ +
+ {item.session?.userIds?.[0] || "Unknown User"} +
+
+ +
+ {new Date(item.timestamp).toLocaleString()} +
+
+ +
+ + +
+
+
+ ))} +
+
+
+ + {ratedTraces.length === 0 && filterRating !== "all" && ( +
+

+ No ratings found for "{filterRating === "needs-work" ? "Needs Work" : filterRating}" filter. +

+
+ )} +
+ ); +} + // Observation Details Component - Fetches full observation with input/output function ObservationDetails({ observationId, @@ -2447,16 +3283,19 @@ function TraceMessage({ projectId, isSelected, onSelect, + manualRating, + onManualRatingChange, }: { trace: any; traceMetric: any; projectId: string; isSelected: boolean; onSelect: (traceId: string, timestamp: Date) => void; + manualRating?: string; + onManualRatingChange: (traceId: string, rating: string | null) => void; }) { - const [selectedRating, setSelectedRating] = React.useState( - null, - ); + // Use the manual rating from props instead of local state + const selectedRating = manualRating || null; const traceData = api.traces.byId.useQuery( { @@ -2538,11 +3377,9 @@ function TraceMessage({ parsed = JSON.parse(parsed); } - let text = ""; - - // Extract outcome.output.text + // Try 1: Extract outcome.output.text with replacements FIRST if (parsed.outcome?.output?.text) { - text = parsed.outcome.output.text; + let text = parsed.outcome.output.text; // Replace placeholders with actual values from replacements if (parsed.outcome?.output?.replacements) { @@ -2561,11 +3398,18 @@ function TraceMessage({ return { text, isJson: false }; } - // Fallback: try output.text - else if (parsed.output?.text) { - return { text: parsed.output.text, isJson: false }; + // Try 2: Check if outcome.output exists (for cases without .text) + else if (parsed.outcome?.output !== undefined) { + // If outcome.output is a string, return it directly + if (typeof parsed.outcome.output === "string") { + return { text: parsed.outcome.output, isJson: false }; + } + // If outcome.output is an object, return as JSON + else { + return { json: parsed.outcome.output, isJson: true }; + } } - // If no text field found, return the whole object as JSON + // Final fallback: show the whole parsed object as JSON else { return { json: parsed, isJson: true }; } @@ -2661,11 +3505,11 @@ function TraceMessage({ className={cn( "h-7 text-xs", selectedRating === "correct" && - "bg-black text-white hover:bg-black/90", + "bg-green-600 text-white hover:bg-green-700 dark:bg-green-500 dark:hover:bg-green-600 border-green-600 dark:border-green-500", )} onClick={(e) => { e.stopPropagation(); - setSelectedRating("correct"); + onManualRatingChange(trace.id, selectedRating === "correct" ? null : "correct"); toast.success("Response marked as correct"); }} > @@ -2680,11 +3524,11 @@ function TraceMessage({ className={cn( "h-7 text-xs", selectedRating === "needs-work" && - "bg-black text-white hover:bg-black/90", + "bg-orange-600 text-white hover:bg-orange-700 dark:bg-orange-600 dark:hover:bg-orange-600 border-orange-600 dark:border-orange-500", )} onClick={(e) => { e.stopPropagation(); - setSelectedRating("needs-work"); + onManualRatingChange(trace.id, selectedRating === "needs-work" ? null : "needs-work"); toast.success("Response marked as needs improvement"); }} > @@ -2697,11 +3541,11 @@ function TraceMessage({ className={cn( "h-7 text-xs", selectedRating === "wrong" && - "bg-black text-white hover:bg-black/90", + "bg-red-600 text-white hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600 border-red-600 dark:border-red-500", )} onClick={(e) => { e.stopPropagation(); - setSelectedRating("wrong"); + onManualRatingChange(trace.id, selectedRating === "wrong" ? null : "wrong"); toast.success("Response marked as wrong"); }} > @@ -2715,69 +3559,69 @@ function TraceMessage({ className="h-7 text-xs" onClick={(e) => { e.stopPropagation(); - setSelectedRating(null); + onManualRatingChange(trace.id, null); toast.info("Rating cleared"); }} > - Clear - - )} -
+ Clear + + )} +
+ + {/* LLM Eval Section - Shows when genius-feedback score is available */} + {geniusFeedbackScore && ( +
+
+
+ âš¡ +
+ + LLM Eval + +
- {/* LLM Eval Section - Shows when genius-feedback score is available */} - {geniusFeedbackScore && ( -
-
-
- âš¡ +
+ {/* Judge Response */} +
+
+ Judge Response: +
+
+ + {geniusFeedbackScore.value === 1 + ? "CORRECT" + : "INCORRECT"} +
- - LLM Eval -
-
- {/* Judge Response */} + {/* Judgement Reason */} + {geniusFeedbackScore.comment && (
- Judge Response: + Judgement Reason:
-
- - {geniusFeedbackScore.value === 1 - ? "CORRECT" - : "INCORRECT"} - -
-
- - {/* Judgement Reason */} - {geniusFeedbackScore.comment && ( -
-
- Judgement Reason: -
-
-
- {geniusFeedbackScore.comment} -
+
+
+ {geniusFeedbackScore.comment}
- )} -
+
+ )}
- )} - -
- Click to view tool calls →
+ )} + +
+ Click to view tool calls → +
diff --git a/web/src/server/api/routers/scores.ts b/web/src/server/api/routers/scores.ts index 525dcce808d2..3fa32559dab5 100644 --- a/web/src/server/api/routers/scores.ts +++ b/web/src/server/api/routers/scores.ts @@ -744,4 +744,194 @@ export const scoresRouter = createTRPCRouter({ .query(async ({ input }) => { return (await getScoreMetadataById(input.projectId, input.id)) ?? null; }), + + // Manual rating endpoints for Juspay Dashboard + createManualRating: protectedProjectProcedure + .input( + z.object({ + projectId: z.string(), + traceId: z.string(), + rating: z.enum(["correct", "needs-work", "wrong"]), + comment: z.string().optional(), + }), + ) + .mutation(async ({ input, ctx }) => { + throwIfNoProjectAccess({ + session: ctx.session, + projectId: input.projectId, + scope: "scores:CUD", + }); + + // Check if trace exists + const clickhouseTrace = await getTraceById({ + traceId: input.traceId, + projectId: input.projectId, + clickhouseFeatureTag: "manual-rating", + }); + + if (!clickhouseTrace) { + throw new LangfuseNotFoundError( + `No trace with id ${input.traceId} in project ${input.projectId}`, + ); + } + + // Check if manual rating already exists for this trace + const existingScore = await searchExistingAnnotationScore( + input.projectId, + null, // observationId + input.traceId, + null, // sessionId + "manual-rating", + undefined, // configId + "CATEGORICAL", + ); + + const scoreId = existingScore?.id ?? v4(); + const now = new Date(); + + await upsertScore({ + id: scoreId, + timestamp: convertDateToClickhouseDateTime(now), + project_id: input.projectId, + environment: "default", + trace_id: input.traceId, + observation_id: null, + session_id: null, + name: "manual-rating", + value: undefined, + source: ScoreSource.ANNOTATION, + comment: input.comment || `Manual rating: ${input.rating}`, + author_user_id: ctx.session.user.id, + config_id: null, + data_type: "CATEGORICAL", + string_value: input.rating, + queue_id: null, + }); + + await auditLog({ + session: ctx.session, + resourceType: "score", + resourceId: scoreId, + action: existingScore ? "update" : "create", + after: { + id: scoreId, + projectId: input.projectId, + traceId: input.traceId, + name: "manual-rating", + stringValue: input.rating, + comment: input.comment || `Manual rating: ${input.rating}`, + authorUserId: ctx.session.user.id, + source: ScoreSource.ANNOTATION, + dataType: "CATEGORICAL", + timestamp: now, + }, + }); + + return { success: true, scoreId }; + }), + + getManualRatings: protectedProjectProcedure + .input( + z.object({ + projectId: z.string(), + traceIds: z.array(z.string()).optional(), + }), + ) + .query(async ({ input }) => { + const filters: any[] = [ + { + column: "name", + type: "string", + operator: "=", + value: "manual-rating", + }, + ]; + + if (input.traceIds && input.traceIds.length > 0) { + filters.push({ + column: "traceId", + type: "stringOptions", + operator: "any of", + value: input.traceIds, + }); + } + + const scores = await getScoresUiTable({ + projectId: input.projectId, + filter: filters, + orderBy: { column: "timestamp", order: "DESC" as const }, + limit: 1000, + offset: 0, + excludeMetadata: true, + includeHasMetadataFlag: false, + }); + + return scores.map((score) => ({ + traceId: score.traceId!, + rating: score.stringValue!, + comment: score.comment, + authorUserId: score.authorUserId, + timestamp: score.timestamp, + scoreId: score.id, + })); + }), + + deleteManualRating: protectedProjectProcedure + .input( + z.object({ + projectId: z.string(), + traceId: z.string(), + }), + ) + .mutation(async ({ input, ctx }) => { + throwIfNoProjectAccess({ + session: ctx.session, + projectId: input.projectId, + scope: "scores:CUD", + }); + + // Find the manual rating score for this trace + const scores = await getScoresUiTable({ + projectId: input.projectId, + filter: [ + { + column: "name", + type: "string", + operator: "=", + value: "manual-rating", + }, + { + column: "traceId", + type: "string", + operator: "=", + value: input.traceId, + }, + ], + orderBy: { column: "timestamp", order: "DESC" as const }, + limit: 1, + offset: 0, + excludeMetadata: true, + includeHasMetadataFlag: false, + }); + + if (scores.length === 0) { + throw new LangfuseNotFoundError( + `No manual rating found for trace ${input.traceId} in project ${input.projectId}`, + ); + } + + const score = scores[0]; + + await auditLog({ + session: ctx.session, + resourceType: "score", + resourceId: score.id, + action: "delete", + before: score, + }); + + await deleteScores(input.projectId, [score.id]); + + return { success: true }; + }), }); From 4ebdc94522cca60e0f11726c03d6312fdb9ed5fc Mon Sep 17 00:00:00 2001 From: "rabi.prasad" Date: Fri, 14 Nov 2025 18:42:11 +0530 Subject: [PATCH 13/21] BZ-46386: fix: linting issues in juspay/langfuse repo - Fixed linting issue in langfuse repo --- .../project/[projectId]/juspay-dashboard.tsx | 1853 ++++++++++------- 1 file changed, 1129 insertions(+), 724 deletions(-) diff --git a/web/src/pages/project/[projectId]/juspay-dashboard.tsx b/web/src/pages/project/[projectId]/juspay-dashboard.tsx index b2e31462e943..c5f330892398 100644 --- a/web/src/pages/project/[projectId]/juspay-dashboard.tsx +++ b/web/src/pages/project/[projectId]/juspay-dashboard.tsx @@ -84,9 +84,9 @@ export default function JuspayDashboard() { React.useEffect(() => { if (router.isReady && typeof window !== "undefined") { const params = new URLSearchParams(window.location.search); - + // If no dateRange parameter exists in URL, ensure it gets set - if (!params.has('dateRange')) { + if (!params.has("dateRange")) { // The hook should handle this, but let's ensure it happens // by triggering a setTimeRange with the current timeRange if (timeRange) { @@ -109,8 +109,24 @@ export default function JuspayDashboard() { // Create fallback date range const today = new Date(); return { - from: new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0, 0), - to: new Date(today.getFullYear(), today.getMonth(), today.getDate(), 23, 59, 59, 999), + from: new Date( + today.getFullYear(), + today.getMonth(), + today.getDate(), + 0, + 0, + 0, + 0, + ), + to: new Date( + today.getFullYear(), + today.getMonth(), + today.getDate(), + 23, + 59, + 59, + 999, + ), }; }, [tableDateRange]); @@ -121,7 +137,9 @@ export default function JuspayDashboard() { const sessionIdFromUrl = router.query.sessionId as string | undefined; const merchantFilterUrl = router.query.merchantOnly as string | undefined; const teamFilterUrl = router.query.teamOnly as string | undefined; - const juspayOthersFilterUrl = router.query.juspayOthersOnly as string | undefined; + const juspayOthersFilterUrl = router.query.juspayOthersOnly as + | string + | undefined; const tagFilterUrl = router.query.tag as string | undefined; const correctFilterUrl = router.query.correct as string | undefined; const incorrectFilterUrl = router.query.incorrect as string | undefined; @@ -215,7 +233,10 @@ export default function JuspayDashboard() { // Add team emails to URL for sharing if (filters.teamEmails && filters.teamEmails.length > 0) { - params.set("teamEmails", encodeURIComponent(JSON.stringify(filters.teamEmails))); + params.set( + "teamEmails", + encodeURIComponent(JSON.stringify(filters.teamEmails)), + ); } else { params.delete("teamEmails"); } @@ -383,7 +404,7 @@ export default function JuspayDashboard() { const manualRatingsQuery = api.scores.getManualRatings.useQuery( { projectId, - traceIds: allSessionsTracesData.traces.map(t => t.id), + traceIds: allSessionsTracesData.traces.map((t) => t.id), }, { enabled: !!projectId && allSessionsTracesData.traces.length > 0, @@ -418,7 +439,7 @@ export default function JuspayDashboard() { const manualRatings = React.useMemo(() => { const ratingsMap = new Map(); if (manualRatingsQuery.data) { - manualRatingsQuery.data.forEach(rating => { + manualRatingsQuery.data.forEach((rating) => { ratingsMap.set(rating.traceId, rating.rating); }); } @@ -448,10 +469,10 @@ export default function JuspayDashboard() { const [showDatePicker, setShowDatePicker] = useState(false); const [sessionPage, setSessionPage] = useState(0); - + // Resizable panels state const [rightPanelWidth, setRightPanelWidth] = useState(450); - const [isResizing, setIsResizing] = useState<'right' | null>(null); + const [isResizing, setIsResizing] = useState<"right" | null>(null); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [isMobileRightPanelOpen, setIsMobileRightPanelOpen] = useState(false); const [showStatsModal, setShowStatsModal] = useState(false); @@ -464,15 +485,15 @@ export default function JuspayDashboard() { from: newDateRange.from.toISOString(), to: newDateRange.to.toISOString(), }); - + // Cancel previous loading and start new one immediately setIsLoadingData(true); - + // Clear existing data immediately to show loading state setAllSessions([]); setAllTraces([]); setAllScores([]); - + // Reset pagination setSessionPage(0); setCurrentPage(0); @@ -480,7 +501,7 @@ export default function JuspayDashboard() { setHasMoreSessions(true); setHasMoreTraces(true); setHasMoreScores(true); - + // Set new date range (this will trigger new API calls) setTimeRange({ from: newDateRange.from, to: newDateRange.to }); }, @@ -632,12 +653,12 @@ export default function JuspayDashboard() { setAllSessions([]); setSessionPage(0); setHasMoreSessions(true); - + // Clear loading state after a short delay to prevent race conditions const timer = setTimeout(() => { setIsLoadingData(false); }, 100); - + return () => clearTimeout(timer); } }, [projectId, dateRange?.from, dateRange?.to]); @@ -901,45 +922,46 @@ export default function JuspayDashboard() { if (!userIds || userIds.length === 0 || userIds[0] === "Unknown User") { return "unknown"; } - + const userId = userIds[0]; - + // Check if user is in team whitelist - more flexible matching - if (teamEmails.some(email => { - const emailLower = email.toLowerCase().trim(); - const userIdLower = userId.toLowerCase().trim(); - - // Try exact match first - if (userIdLower === emailLower) return true; - - // Try contains match (user ID contains the email) - if (userIdLower.includes(emailLower)) return true; - - // Try email contains user ID (for partial email matches) - if (emailLower.includes(userIdLower)) return true; - - // Try domain matching if email has @ symbol - if (emailLower.includes('@')) { - const emailDomain = emailLower.split('@')[1]; - const emailUsername = emailLower.split('@')[0]; - - // Check if user ID matches username part - if (userIdLower === emailUsername) return true; - - // Check if user ID contains username - if (userIdLower.includes(emailUsername)) return true; - } - - return false; - })) { + if ( + teamEmails.some((email) => { + const emailLower = email.toLowerCase().trim(); + const userIdLower = userId.toLowerCase().trim(); + + // Try exact match first + if (userIdLower === emailLower) return true; + + // Try contains match (user ID contains the email) + if (userIdLower.includes(emailLower)) return true; + + // Try email contains user ID (for partial email matches) + if (emailLower.includes(userIdLower)) return true; + + // Try domain matching if email has @ symbol + if (emailLower.includes("@")) { + const emailUsername = emailLower.split("@")[0]; + + // Check if user ID matches username part + if (userIdLower === emailUsername) return true; + + // Check if user ID contains username + if (userIdLower.includes(emailUsername)) return true; + } + + return false; + }) + ) { return "team"; } - + // Check if user is juspay internal (contains @juspay) if (userId.toLowerCase().includes("@juspay")) { return "juspay-genius-merchant"; } - + // Otherwise it's a merchant return "merchant"; }; @@ -948,11 +970,11 @@ export default function JuspayDashboard() { // Category filters - if any are checked, show only those categories if (showOnlyMerchant || showOnlyTeam || showOnlyJuspayOthers) { - const matchesSelectedCategories = + const matchesSelectedCategories = (showOnlyMerchant && userCategory === "merchant") || (showOnlyTeam && userCategory === "team") || (showOnlyJuspayOthers && userCategory === "juspay-genius-merchant"); - + if (!matchesSelectedCategories) { return false; } @@ -1029,45 +1051,46 @@ export default function JuspayDashboard() { if (!userIds || userIds.length === 0 || userIds[0] === "Unknown User") { return "unknown"; } - + const userId = userIds[0]; - + // Check if user is in team whitelist - more flexible matching - if (teamEmails.some(email => { - const emailLower = email.toLowerCase().trim(); - const userIdLower = userId.toLowerCase().trim(); - - // Try exact match first - if (userIdLower === emailLower) return true; - - // Try contains match (user ID contains the email) - if (userIdLower.includes(emailLower)) return true; - - // Try email contains user ID (for partial email matches) - if (emailLower.includes(userIdLower)) return true; - - // Try domain matching if email has @ symbol - if (emailLower.includes('@')) { - const emailDomain = emailLower.split('@')[1]; - const emailUsername = emailLower.split('@')[0]; - - // Check if user ID matches username part - if (userIdLower === emailUsername) return true; - - // Check if user ID contains username - if (userIdLower.includes(emailUsername)) return true; - } - - return false; - })) { + if ( + teamEmails.some((email) => { + const emailLower = email.toLowerCase().trim(); + const userIdLower = userId.toLowerCase().trim(); + + // Try exact match first + if (userIdLower === emailLower) return true; + + // Try contains match (user ID contains the email) + if (userIdLower.includes(emailLower)) return true; + + // Try email contains user ID (for partial email matches) + if (emailLower.includes(userIdLower)) return true; + + // Try domain matching if email has @ symbol + if (emailLower.includes("@")) { + const emailUsername = emailLower.split("@")[0]; + + // Check if user ID matches username part + if (userIdLower === emailUsername) return true; + + // Check if user ID contains username + if (userIdLower.includes(emailUsername)) return true; + } + + return false; + }) + ) { return "team"; } - + // Check if user is juspay internal (contains @juspay) if (userId.toLowerCase().includes("@juspay")) { return "juspay-genius-merchant"; } - + // Otherwise it's a merchant return "merchant"; }; @@ -1088,11 +1111,11 @@ export default function JuspayDashboard() { // Category filters - if any are checked, show only those categories if (showOnlyMerchant || showOnlyTeam || showOnlyJuspayOthers) { - const matchesSelectedCategories = + const matchesSelectedCategories = (showOnlyMerchant && userCategory === "merchant") || (showOnlyTeam && userCategory === "team") || (showOnlyJuspayOthers && userCategory === "juspay-genius-merchant"); - + if (!matchesSelectedCategories) { return false; } @@ -1117,7 +1140,9 @@ export default function JuspayDashboard() { }); // Get session IDs from sessions for statistics - const sessionIdsForStats = new Set(sessionsForStats.map(session => session.id)); + const sessionIdsForStats = new Set( + sessionsForStats.map((session) => session.id), + ); // Filter traces to only include those from sessions for statistics const tracesForStats = allSessionsTracesData.traces.filter((trace) => { @@ -1202,45 +1227,46 @@ export default function JuspayDashboard() { if (!userIds || userIds.length === 0 || userIds[0] === "Unknown User") { return "unknown"; } - + const userId = userIds[0]; - + // Check if user is in team whitelist - more flexible matching - if (teamEmails.some(email => { - const emailLower = email.toLowerCase().trim(); - const userIdLower = userId.toLowerCase().trim(); - - // Try exact match first - if (userIdLower === emailLower) return true; - - // Try contains match (user ID contains the email) - if (userIdLower.includes(emailLower)) return true; - - // Try email contains user ID (for partial email matches) - if (emailLower.includes(userIdLower)) return true; - - // Try domain matching if email has @ symbol - if (emailLower.includes('@')) { - const emailDomain = emailLower.split('@')[1]; - const emailUsername = emailLower.split('@')[0]; - - // Check if user ID matches username part - if (userIdLower === emailUsername) return true; - - // Check if user ID contains username - if (userIdLower.includes(emailUsername)) return true; - } - - return false; - })) { + if ( + teamEmails.some((email) => { + const emailLower = email.toLowerCase().trim(); + const userIdLower = userId.toLowerCase().trim(); + + // Try exact match first + if (userIdLower === emailLower) return true; + + // Try contains match (user ID contains the email) + if (userIdLower.includes(emailLower)) return true; + + // Try email contains user ID (for partial email matches) + if (emailLower.includes(userIdLower)) return true; + + // Try domain matching if email has @ symbol + if (emailLower.includes("@")) { + const emailUsername = emailLower.split("@")[0]; + + // Check if user ID matches username part + if (userIdLower === emailUsername) return true; + + // Check if user ID contains username + if (userIdLower.includes(emailUsername)) return true; + } + + return false; + }) + ) { return "team"; } - + // Check if user is juspay internal (contains @juspay) if (userId.toLowerCase().includes("@juspay")) { return "juspay-genius-merchant"; } - + // Otherwise it's a merchant return "merchant"; }; @@ -1278,7 +1304,9 @@ export default function JuspayDashboard() { }); // Get session IDs from sessions for card statistics - const sessionIdsForCardStats = new Set(sessionsForCardStats.map(session => session.id)); + const sessionIdsForCardStats = new Set( + sessionsForCardStats.map((session) => session.id), + ); // Filter traces to only include those from sessions for card statistics const tracesForCardStats = allSessionsTracesData.traces.filter((trace) => { @@ -1300,7 +1328,9 @@ export default function JuspayDashboard() { let juspayGeniusMerchantQueries = 0; tracesForCardStats.forEach((trace) => { - const session = allSessionsData.sessions.find(s => s.id === trace.sessionId); + const session = allSessionsData.sessions.find( + (s) => s.id === trace.sessionId, + ); if (session) { const userCategory = categorizeUser(session.userIds); switch (userCategory) { @@ -1348,21 +1378,29 @@ export default function JuspayDashboard() { // Auto-scroll to selected session only when needed (page refresh or URL navigation) const [hasAutoScrolled, setHasAutoScrolled] = React.useState(false); - + React.useEffect(() => { - if (selectedSessionId && filteredSessions.length > 0 && !sessions.isLoading && !hasAutoScrolled && sessionIdFromUrl) { + if ( + selectedSessionId && + filteredSessions.length > 0 && + !sessions.isLoading && + !hasAutoScrolled && + sessionIdFromUrl + ) { const timer = setTimeout(() => { - const selectedElement = document.querySelector(`[data-session-id="${selectedSessionId}"]`); + const selectedElement = document.querySelector( + `[data-session-id="${selectedSessionId}"]`, + ); if (selectedElement) { // Check if element is already visible const rect = selectedElement.getBoundingClientRect(); const isVisible = rect.top >= 0 && rect.bottom <= window.innerHeight; - + // Only scroll if not visible if (!isVisible) { selectedElement.scrollIntoView({ - behavior: 'smooth', - block: 'center', + behavior: "smooth", + block: "center", }); } setHasAutoScrolled(true); @@ -1371,7 +1409,13 @@ export default function JuspayDashboard() { return () => clearTimeout(timer); } - }, [selectedSessionId, filteredSessions.length, sessions.isLoading, hasAutoScrolled, sessionIdFromUrl]); + }, [ + selectedSessionId, + filteredSessions.length, + sessions.isLoading, + hasAutoScrolled, + sessionIdFromUrl, + ]); // Reset auto-scroll flag when session changes manually (not from URL) React.useEffect(() => { @@ -1384,22 +1428,28 @@ export default function JuspayDashboard() { const [dragStartX, setDragStartX] = React.useState(0); const [dragStartWidth, setDragStartWidth] = React.useState(0); - const handleMouseDown = React.useCallback((e: React.MouseEvent) => { - e.preventDefault(); - setIsResizing('right'); - setDragStartX(e.clientX); - setDragStartWidth(rightPanelWidth); - }, [rightPanelWidth]); + const handleMouseDown = React.useCallback( + (e: React.MouseEvent) => { + e.preventDefault(); + setIsResizing("right"); + setDragStartX(e.clientX); + setDragStartWidth(rightPanelWidth); + }, + [rightPanelWidth], + ); - const handleMouseMove = React.useCallback((e: MouseEvent) => { - if (!isResizing) return; + const handleMouseMove = React.useCallback( + (e: MouseEvent) => { + if (!isResizing) return; - const deltaX = e.clientX - dragStartX; + const deltaX = e.clientX - dragStartX; - // For right panel, subtract the delta from the starting width - const newWidth = Math.max(300, Math.min(800, dragStartWidth - deltaX)); - setRightPanelWidth(newWidth); - }, [isResizing, dragStartX, dragStartWidth]); + // For right panel, subtract the delta from the starting width + const newWidth = Math.max(300, Math.min(800, dragStartWidth - deltaX)); + setRightPanelWidth(newWidth); + }, + [isResizing, dragStartX, dragStartWidth], + ); const handleMouseUp = React.useCallback(() => { setIsResizing(null); @@ -1408,16 +1458,16 @@ export default function JuspayDashboard() { // Add mouse event listeners React.useEffect(() => { if (isResizing) { - document.addEventListener('mousemove', handleMouseMove); - document.addEventListener('mouseup', handleMouseUp); - document.body.style.cursor = 'col-resize'; - document.body.style.userSelect = 'none'; + document.addEventListener("mousemove", handleMouseMove); + document.addEventListener("mouseup", handleMouseUp); + document.body.style.cursor = "col-resize"; + document.body.style.userSelect = "none"; return () => { - document.removeEventListener('mousemove', handleMouseMove); - document.removeEventListener('mouseup', handleMouseUp); - document.body.style.cursor = ''; - document.body.style.userSelect = ''; + document.removeEventListener("mousemove", handleMouseMove); + document.removeEventListener("mouseup", handleMouseUp); + document.body.style.cursor = ""; + document.body.style.userSelect = ""; }; } }, [isResizing, handleMouseMove, handleMouseUp]); @@ -1430,10 +1480,10 @@ export default function JuspayDashboard() { setWindowWidth(window.innerWidth); }; - if (typeof window !== 'undefined') { + if (typeof window !== "undefined") { setWindowWidth(window.innerWidth); - window.addEventListener('resize', handleResize); - return () => window.removeEventListener('resize', handleResize); + window.addEventListener("resize", handleResize); + return () => window.removeEventListener("resize", handleResize); } }, []); @@ -1445,9 +1495,24 @@ export default function JuspayDashboard() { const detailedStatistics = React.useMemo(() => { if (!allSessionsTracesData.traces.length) { return { - merchant: { totalSessions: 0, totalQueries: 0, incorrectQueries: 0, accuracy: 0 }, - team: { totalSessions: 0, totalQueries: 0, incorrectQueries: 0, accuracy: 0 }, - other: { totalSessions: 0, totalQueries: 0, incorrectQueries: 0, accuracy: 0 }, + merchant: { + totalSessions: 0, + totalQueries: 0, + incorrectQueries: 0, + accuracy: 0, + }, + team: { + totalSessions: 0, + totalQueries: 0, + incorrectQueries: 0, + accuracy: 0, + }, + other: { + totalSessions: 0, + totalQueries: 0, + incorrectQueries: 0, + accuracy: 0, + }, }; } @@ -1456,27 +1521,32 @@ export default function JuspayDashboard() { if (!userIds || userIds.length === 0 || userIds[0] === "Unknown User") { return "unknown"; } - + const userId = userIds[0]; - + // Check if user is in team whitelist - if (teamEmails.some(email => { - const emailLower = email.toLowerCase().trim(); - const userIdLower = userId.toLowerCase().trim(); - - return userIdLower === emailLower || - userIdLower.includes(emailLower) || - emailLower.includes(userIdLower) || - (emailLower.includes('@') && userIdLower === emailLower.split('@')[0]); - })) { + if ( + teamEmails.some((email) => { + const emailLower = email.toLowerCase().trim(); + const userIdLower = userId.toLowerCase().trim(); + + return ( + userIdLower === emailLower || + userIdLower.includes(emailLower) || + emailLower.includes(userIdLower) || + (emailLower.includes("@") && + userIdLower === emailLower.split("@")[0]) + ); + }) + ) { return "team"; } - + // Check if user is juspay internal if (userId.toLowerCase().includes("@juspay")) { return "juspay-genius-merchant"; } - + return "merchant"; }; @@ -1494,11 +1564,11 @@ export default function JuspayDashboard() { const userCategory = categorizeUser(session.userIds); if (showOnlyMerchant || showOnlyTeam || showOnlyJuspayOthers) { - const matchesSelectedCategories = + const matchesSelectedCategories = (showOnlyMerchant && userCategory === "merchant") || (showOnlyTeam && userCategory === "team") || (showOnlyJuspayOthers && userCategory === "juspay-genius-merchant"); - + if (!matchesSelectedCategories) return false; } @@ -1514,29 +1584,42 @@ export default function JuspayDashboard() { // Group sessions by category const sessionsByCategory = { - merchant: sessionsForStats.filter(s => categorizeUser(s.userIds) === "merchant"), - team: sessionsForStats.filter(s => categorizeUser(s.userIds) === "team"), - other: sessionsForStats.filter(s => categorizeUser(s.userIds) === "juspay-genius-merchant"), + merchant: sessionsForStats.filter( + (s) => categorizeUser(s.userIds) === "merchant", + ), + team: sessionsForStats.filter( + (s) => categorizeUser(s.userIds) === "team", + ), + other: sessionsForStats.filter( + (s) => categorizeUser(s.userIds) === "juspay-genius-merchant", + ), }; // Calculate stats for each category - const calculateCategoryStats = (sessions: any[], category: string) => { - const sessionIds = new Set(sessions.map(s => s.id)); - + const calculateCategoryStats = (sessions: any[]) => { + const sessionIds = new Set(sessions.map((s) => s.id)); + // Get traces for these sessions - const categoryTraces = allSessionsTracesData.traces.filter(trace => - trace.sessionId && sessionIds.has(trace.sessionId) + const categoryTraces = allSessionsTracesData.traces.filter( + (trace) => trace.sessionId && sessionIds.has(trace.sessionId), ); // Get scores for these traces - const categoryScores = allScoresData.scores.filter(score => - categoryTraces.some(trace => trace.id === score.traceId) + const categoryScores = allScoresData.scores.filter((score) => + categoryTraces.some((trace) => trace.id === score.traceId), ); - const correctQueries = categoryScores.filter(score => score.value === 1).length; - const incorrectQueries = categoryScores.filter(score => score.value === 0).length; + const correctQueries = categoryScores.filter( + (score) => score.value === 1, + ).length; + const incorrectQueries = categoryScores.filter( + (score) => score.value === 0, + ).length; const totalEvaluated = correctQueries + incorrectQueries; - const accuracy = totalEvaluated > 0 ? Math.round((correctQueries / totalEvaluated) * 100) : 0; + const accuracy = + totalEvaluated > 0 + ? Math.round((correctQueries / totalEvaluated) * 100) + : 0; return { totalSessions: sessions.length, @@ -1547,9 +1630,9 @@ export default function JuspayDashboard() { }; return { - merchant: calculateCategoryStats(sessionsByCategory.merchant, "merchant"), - team: calculateCategoryStats(sessionsByCategory.team, "team"), - other: calculateCategoryStats(sessionsByCategory.other, "other"), + merchant: calculateCategoryStats(sessionsByCategory.merchant), + team: calculateCategoryStats(sessionsByCategory.team), + other: calculateCategoryStats(sessionsByCategory.other), }; }, [ allSessionsTracesData.traces, @@ -1578,7 +1661,7 @@ export default function JuspayDashboard() {
{/* Mobile Menu Button - Only show when sidebar is closed */} {isMobile && !isMobileMenuOpen && ( -
+
- -
+ +
{/* Team Email Selection with Dropdown */}
{/* Email Dropdown with Search */} @@ -2093,26 +2347,32 @@ export default function JuspayDashboard() { size="sm" > - {teamEmails.length > 0 + {teamEmails.length > 0 ? `${teamEmails.length} email(s) selected` - : "Select team emails..." - } + : "Select team emails..."} - +
-
Select Team Members
- +
+ Select Team Members +
+ {/* Search Input */}
setNewEmailInput(e.target.value)} - className="text-xs pl-7" + onChange={(e) => + setNewEmailInput(e.target.value) + } + className="pl-7 text-xs" />
@@ -2122,52 +2382,77 @@ export default function JuspayDashboard() { {(() => { // Get unique user emails from current date range const uniqueEmails = new Set(); - allSessionsData.sessions.forEach(session => { - if (session.userIds && session.userIds.length > 0) { - const userId = session.userIds[0]; - if (userId && - userId !== "Unknown User" && - (userId.includes("@") || userId.includes("."))) { - uniqueEmails.add(userId); + allSessionsData.sessions.forEach( + (session) => { + if ( + session.userIds && + session.userIds.length > 0 + ) { + const userId = session.userIds[0]; + if ( + userId && + userId !== "Unknown User" && + (userId.includes("@") || + userId.includes(".")) + ) { + uniqueEmails.add(userId); + } } - } - }); + }, + ); // Filter emails based on search - const filteredEmails = Array.from(uniqueEmails) - .filter(email => - newEmailInput === "" || - email.toLowerCase().includes(newEmailInput.toLowerCase()) + const filteredEmails = Array.from( + uniqueEmails, + ) + .filter( + (email) => + newEmailInput === "" || + email + .toLowerCase() + .includes( + newEmailInput.toLowerCase(), + ), ) .sort(); return filteredEmails.map((email) => ( - )); })()}
- {/* Quick Actions */} -
+
- + Total Statistics Overview - +
- -
- {/* Summary Cards */} -
- -
-
- {statistics.totalSessions} +
+ {/* Summary Cards */} +
+ +
+
+ {statistics.totalSessions} +
+
+ Total Sessions +
-
Total Sessions
-
- - - -
-
- {statistics.totalQueries} + + + +
+
+ {statistics.totalQueries} +
+
+ Total Queries +
-
Total Queries
+
+ + +
+
+ {statistics.correctPercentage}% +
+
+ Overall Accuracy +
+
+
+
+ + {/* Detailed Statistics Table */} + +
+

+ Detailed Breakdown by User Category +

+

+ Statistics filtered by current date range and applied + filters +

+ + + + + + Category + + + Total Sessions + + + Total Queries + + + Incorrect Queries + + + Accuracy + + + + + + +
+
+ Merchant +
+
+ + {detailedStatistics.merchant.totalSessions} + + + {detailedStatistics.merchant.totalQueries} + + + + {detailedStatistics.merchant.incorrectQueries} + + + + = 80 + ? "default" + : "destructive" + } + className={cn( + "font-semibold", + detailedStatistics.merchant.accuracy >= 80 + ? "bg-green-600 hover:bg-green-700" + : "", + )} + > + {detailedStatistics.merchant.accuracy}% + + +
+ + + +
+
+ Team +
+
+ + {detailedStatistics.team.totalSessions} + + + {detailedStatistics.team.totalQueries} + + + + {detailedStatistics.team.incorrectQueries} + + + + = 80 + ? "default" + : "destructive" + } + className={cn( + "font-semibold", + detailedStatistics.team.accuracy >= 80 + ? "bg-green-600 hover:bg-green-700" + : "", + )} + > + {detailedStatistics.team.accuracy}% + + +
+ + + +
+
+ Other +
+
+ + {detailedStatistics.other.totalSessions} + + + {detailedStatistics.other.totalQueries} + + + + {detailedStatistics.other.incorrectQueries} + + + + = 80 + ? "default" + : "destructive" + } + className={cn( + "font-semibold", + detailedStatistics.other.accuracy >= 80 + ? "bg-green-600 hover:bg-green-700" + : "", + )} + > + {detailedStatistics.other.accuracy}% + + +
+
+
- - -
-
- {statistics.correctPercentage}% -
-
Overall Accuracy
+ + {/* Additional Insights */} + +

+ Current Filters Applied: +

+
+ + Date: {dateRange.from.toLocaleDateString()} -{" "} + {dateRange.to.toLocaleDateString()} + + {selectedTag !== "all" && ( + Agent: {selectedTag} + )} + {showOnlyMerchant && ( + Merchant Only + )} + {showOnlyTeam && ( + Team Only + )} + {showOnlyJuspayOthers && ( + Other Only + )} + {filterCorrect && ( + Correct Only + )} + {filterIncorrect && ( + Incorrect Only + )} + {hideUnknownUser && ( + Hide Unknown + )} + {teamEmails.length > 0 && ( + + Team Emails: {teamEmails.length} + + )}
- - {/* Detailed Statistics Table */} - -
-

Detailed Breakdown by User Category

-

- Statistics filtered by current date range and applied filters -

-
- - - - - Category - Total Sessions - Total Queries - Incorrect Queries - Accuracy - - - - - -
-
- Merchant -
-
- - {detailedStatistics.merchant.totalSessions} - - - {detailedStatistics.merchant.totalQueries} - - - - {detailedStatistics.merchant.incorrectQueries} - - - - = 80 ? "default" : "destructive"} - className={cn( - "font-semibold", - detailedStatistics.merchant.accuracy >= 80 - ? "bg-green-600 hover:bg-green-700" - : "" - )} - > - {detailedStatistics.merchant.accuracy}% - - -
- - - -
-
- Team -
-
- - {detailedStatistics.team.totalSessions} - - - {detailedStatistics.team.totalQueries} - - - - {detailedStatistics.team.incorrectQueries} - - - - = 80 ? "default" : "destructive"} - className={cn( - "font-semibold", - detailedStatistics.team.accuracy >= 80 - ? "bg-green-600 hover:bg-green-700" - : "" - )} - > - {detailedStatistics.team.accuracy}% - - -
- - - -
-
- Other -
-
- - {detailedStatistics.other.totalSessions} - - - {detailedStatistics.other.totalQueries} - - - - {detailedStatistics.other.incorrectQueries} - - - - = 80 ? "default" : "destructive"} - className={cn( - "font-semibold", - detailedStatistics.other.accuracy >= 80 - ? "bg-green-600 hover:bg-green-700" - : "" - )} - > - {detailedStatistics.other.accuracy}% - - -
-
-
-
- - {/* Additional Insights */} - -

Current Filters Applied:

-
- - Date: {dateRange.from.toLocaleDateString()} - {dateRange.to.toLocaleDateString()} - - {selectedTag !== "all" && ( - Agent: {selectedTag} - )} - {showOnlyMerchant && Merchant Only} - {showOnlyTeam && Team Only} - {showOnlyJuspayOthers && Other Only} - {filterCorrect && Correct Only} - {filterIncorrect && Incorrect Only} - {hideUnknownUser && Hide Unknown} - {teamEmails.length > 0 && ( - Team Emails: {teamEmails.length} - )} -
-
-
@@ -2687,7 +3049,7 @@ export default function JuspayDashboard() { {/* Right Resizer Handle */} {isDesktop && !isMobile && (
@@ -2698,7 +3060,7 @@ export default function JuspayDashboard() { {/* Mobile Right Panel Overlay */} {isMobile && isMobileRightPanelOpen && ( -
setIsMobileRightPanelOpen(false)} /> @@ -2706,112 +3068,115 @@ export default function JuspayDashboard() { {/* Right Sidebar - Tool Call Details */} {(!isMobile || isMobileRightPanelOpen) && ( -
-
-
-
-

- {selectedToolCall ? "Tool Call Details" : "Response Details"} -

- {isMobile && ( - - )} +
+
+
+

+ {selectedToolCall + ? "Tool Call Details" + : "Response Details"} +

+ {isMobile && ( + + )} +
-
- - {selectedToolCall ? ( -
- {/* Show all tool calls/observations */} - {traceDetails.isLoading ? ( -
- Loading tool calls... -
- ) : ( - <> - {observations && observations.length > 0 ? ( - observations.map((obs: any, index: number) => ( - - - -
-
-
- {index + 1} + + {selectedToolCall ? ( +
+ {/* Show all tool calls/observations */} + {traceDetails.isLoading ? ( +
+ Loading tool calls... +
+ ) : ( + <> + {observations && observations.length > 0 ? ( + observations.map((obs: any, index: number) => ( + + + +
+
+
+ {index + 1} +
+ + Tool call {index + 1} + + + {obs.name || obs.type} +
- - Tool call {index + 1} - - - {obs.name || obs.type} -
-
- - -
- -
-
- - - )) - ) : ( -
- No tool calls found for this trace -
- )} + + +
+ +
+
+ + + )) + ) : ( +
+ No tool calls found for this trace +
+ )} - {/* Final Response Section - Green Highlighted */} - {traceDetails.data && ( - - )} - - )} -
- ) : ( -
- Click on a message to view details -
- )} - + {/* Final Response Section - Green Highlighted */} + {traceDetails.data && ( + + )} + + )} +
+ ) : ( +
+ Click on a message to view details +
+ )} + +
-
)} -
); @@ -2835,35 +3200,46 @@ function ManualRatingsContent({ // Get all rated traces with their details const ratedTraces = React.useMemo(() => { - const traces = Array.from(manualRatings.entries()).map(([traceId, rating]) => { - const trace = allTraces.find(t => t.id === traceId); - if (!trace) return null; + const traces = Array.from(manualRatings.entries()) + .map(([traceId, rating]) => { + const trace = allTraces.find((t) => t.id === traceId); + if (!trace) return null; - const session = allSessions.find(s => s.id === trace.sessionId); - return { - traceId, - rating, - trace, - session, - timestamp: trace.timestamp, - }; - }).filter((item): item is NonNullable => item !== null); + const session = allSessions.find((s) => s.id === trace.sessionId); + return { + traceId, + rating, + trace, + session, + timestamp: trace.timestamp, + }; + }) + .filter((item): item is NonNullable => item !== null); // Filter by rating type if (filterRating !== "all") { - return traces.filter(item => item.rating === filterRating); + return traces.filter((item) => item.rating === filterRating); } // Sort by timestamp (newest first) - return traces.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()); + return traces.sort( + (a, b) => + new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(), + ); }, [manualRatings, allTraces, allSessions, filterRating]); // Statistics const stats = React.useMemo(() => { const total = manualRatings.size; - const correct = Array.from(manualRatings.values()).filter(r => r === "correct").length; - const needsWork = Array.from(manualRatings.values()).filter(r => r === "needs-work").length; - const wrong = Array.from(manualRatings.values()).filter(r => r === "wrong").length; + const correct = Array.from(manualRatings.values()).filter( + (r) => r === "correct", + ).length; + const needsWork = Array.from(manualRatings.values()).filter( + (r) => r === "needs-work", + ).length; + const wrong = Array.from(manualRatings.values()).filter( + (r) => r === "wrong", + ).length; return { total, correct, needsWork, wrong }; }, [manualRatings]); @@ -2896,11 +3272,15 @@ function ManualRatingsContent({ if (manualRatings.size === 0) { return ( -
- -

No Manual Ratings Yet

+
+ +

+ No Manual Ratings Yet +

- Start rating responses by clicking the "Correct", "Needs Work", or "Wrong" buttons on any assistant response. + Start rating responses by clicking the "Correct", + "Needs Work", or "Wrong" buttons on any assistant + response.

); @@ -2909,17 +3289,21 @@ function ManualRatingsContent({ return (
{/* Statistics Cards */} -
+
{stats.total}
Total Rated
-
{stats.correct}
+
+ {stats.correct} +
Correct
-
{stats.needsWork}
+
+ {stats.needsWork} +
Needs Work
@@ -2938,7 +3322,9 @@ function ManualRatingsContent({ All Ratings ({stats.total}) Correct ({stats.correct}) - Needs Work ({stats.needsWork}) + + Needs Work ({stats.needsWork}) + Wrong ({stats.wrong}) @@ -2946,8 +3332,12 @@ function ManualRatingsContent({ variant="outline" size="sm" onClick={() => { - if (confirm("Are you sure you want to clear all manual ratings? This action cannot be undone.")) { - Array.from(manualRatings.keys()).forEach(traceId => { + if ( + confirm( + "Are you sure you want to clear all manual ratings? This action cannot be undone.", + ) + ) { + Array.from(manualRatings.keys()).forEach((traceId) => { onUpdateRating(traceId, null); }); toast.success("All manual ratings cleared"); @@ -2974,13 +3364,17 @@ function ManualRatingsContent({ {ratedTraces.map((item) => ( -
+
{getRatingIcon(item.rating)} - {item.rating === "needs-work" ? "Needs Work" : - item.rating.charAt(0).toUpperCase() + item.rating.slice(1)} + {item.rating === "needs-work" + ? "Needs Work" + : item.rating.charAt(0).toUpperCase() + + item.rating.slice(1)}
@@ -3031,9 +3425,11 @@ function ManualRatingsContent({ {ratedTraces.length === 0 && filterRating !== "all" && ( -
+

- No ratings found for "{filterRating === "needs-work" ? "Needs Work" : filterRating}" filter. + No ratings found for " + {filterRating === "needs-work" ? "Needs Work" : filterRating}" + filter.

)} @@ -3505,11 +3901,14 @@ function TraceMessage({ className={cn( "h-7 text-xs", selectedRating === "correct" && - "bg-green-600 text-white hover:bg-green-700 dark:bg-green-500 dark:hover:bg-green-600 border-green-600 dark:border-green-500", + "border-green-600 bg-green-600 text-white hover:bg-green-700 dark:border-green-500 dark:bg-green-500 dark:hover:bg-green-600", )} onClick={(e) => { e.stopPropagation(); - onManualRatingChange(trace.id, selectedRating === "correct" ? null : "correct"); + onManualRatingChange( + trace.id, + selectedRating === "correct" ? null : "correct", + ); toast.success("Response marked as correct"); }} > @@ -3524,11 +3923,14 @@ function TraceMessage({ className={cn( "h-7 text-xs", selectedRating === "needs-work" && - "bg-orange-600 text-white hover:bg-orange-700 dark:bg-orange-600 dark:hover:bg-orange-600 border-orange-600 dark:border-orange-500", + "border-orange-600 bg-orange-600 text-white hover:bg-orange-700 dark:border-orange-500 dark:bg-orange-600 dark:hover:bg-orange-600", )} onClick={(e) => { e.stopPropagation(); - onManualRatingChange(trace.id, selectedRating === "needs-work" ? null : "needs-work"); + onManualRatingChange( + trace.id, + selectedRating === "needs-work" ? null : "needs-work", + ); toast.success("Response marked as needs improvement"); }} > @@ -3541,11 +3943,14 @@ function TraceMessage({ className={cn( "h-7 text-xs", selectedRating === "wrong" && - "bg-red-600 text-white hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600 border-red-600 dark:border-red-500", + "border-red-600 bg-red-600 text-white hover:bg-red-700 dark:border-red-500 dark:bg-red-500 dark:hover:bg-red-600", )} onClick={(e) => { e.stopPropagation(); - onManualRatingChange(trace.id, selectedRating === "wrong" ? null : "wrong"); + onManualRatingChange( + trace.id, + selectedRating === "wrong" ? null : "wrong", + ); toast.success("Response marked as wrong"); }} > @@ -3563,65 +3968,65 @@ function TraceMessage({ toast.info("Rating cleared"); }} > - Clear - - )} -
- - {/* LLM Eval Section - Shows when genius-feedback score is available */} - {geniusFeedbackScore && ( -
-
-
- âš¡ -
- - LLM Eval - -
+ Clear + + )} +
-
- {/* Judge Response */} -
-
- Judge Response: -
-
- - {geniusFeedbackScore.value === 1 - ? "CORRECT" - : "INCORRECT"} - + {/* LLM Eval Section - Shows when genius-feedback score is available */} + {geniusFeedbackScore && ( +
+
+
+ âš¡
+ + LLM Eval +
- {/* Judgement Reason */} - {geniusFeedbackScore.comment && ( +
+ {/* Judge Response */}
- Judgement Reason: + Judge Response:
-
-
- {geniusFeedbackScore.comment} -
+
+ + {geniusFeedbackScore.value === 1 + ? "CORRECT" + : "INCORRECT"} +
- )} + + {/* Judgement Reason */} + {geniusFeedbackScore.comment && ( +
+
+ Judgement Reason: +
+
+
+ {geniusFeedbackScore.comment} +
+
+
+ )} +
-
- )} + )} -
- Click to view tool calls → -
+
+ Click to view tool calls → +
From fec763315382b164baed7184e724e55c79460935 Mon Sep 17 00:00:00 2001 From: "rabi.prasad" Date: Mon, 17 Nov 2025 15:00:15 +0530 Subject: [PATCH 14/21] BZ-46426: fix: build failure juspay/langfuse repo - After merging recent changes of langfuse, we found that some object definitions are changed due to which were are facing build failure issue. - Fixed build related issue. --- web/src/pages/project/[projectId]/juspay-dashboard.tsx | 6 +++--- web/src/server/api/routers/scores.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/web/src/pages/project/[projectId]/juspay-dashboard.tsx b/web/src/pages/project/[projectId]/juspay-dashboard.tsx index c5f330892398..df96c6bcd161 100644 --- a/web/src/pages/project/[projectId]/juspay-dashboard.tsx +++ b/web/src/pages/project/[projectId]/juspay-dashboard.tsx @@ -3457,7 +3457,7 @@ function ObservationDetails({ traceId, projectId, startTime, - truncated: false, + verbosity: "full", }, { enabled: !!observationId && !!projectId, @@ -3577,7 +3577,7 @@ function FinalResponseSection({ traceId: trace.id, projectId, timestamp: trace.timestamp, - truncated: false, + verbosity: "full", }, { enabled: !!trace.id && !!projectId, @@ -3698,7 +3698,7 @@ function TraceMessage({ traceId: trace.id, projectId, timestamp: trace.timestamp, - truncated: false, // Get full output, not truncated + verbosity: "full", // Get full output, not truncated }, { enabled: !!trace.id && !!projectId, diff --git a/web/src/server/api/routers/scores.ts b/web/src/server/api/routers/scores.ts index abb656fd680a..9d30e5674da7 100644 --- a/web/src/server/api/routers/scores.ts +++ b/web/src/server/api/routers/scores.ts @@ -841,7 +841,7 @@ export const scoresRouter = createTRPCRouter({ session_id: null, name: "manual-rating", value: undefined, - source: ScoreSource.ANNOTATION, + source: ScoreSourceEnum.ANNOTATION, comment: input.comment || `Manual rating: ${input.rating}`, author_user_id: ctx.session.user.id, config_id: null, @@ -863,7 +863,7 @@ export const scoresRouter = createTRPCRouter({ stringValue: input.rating, comment: input.comment || `Manual rating: ${input.rating}`, authorUserId: ctx.session.user.id, - source: ScoreSource.ANNOTATION, + source: ScoreSourceEnum.ANNOTATION, dataType: "CATEGORICAL", timestamp: now, }, From 7ac2aa21e79646ba1f4eda4dad837c30510be55c Mon Sep 17 00:00:00 2001 From: Aman Srivastava Date: Tue, 18 Nov 2025 15:24:22 +0530 Subject: [PATCH 15/21] Fixed TRPC issue --- .../pages/project/[projectId]/juspay-dashboard.tsx | 3 --- web/src/server/api/routers/scores.ts | 11 +++++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/web/src/pages/project/[projectId]/juspay-dashboard.tsx b/web/src/pages/project/[projectId]/juspay-dashboard.tsx index df96c6bcd161..6680d7480ed4 100644 --- a/web/src/pages/project/[projectId]/juspay-dashboard.tsx +++ b/web/src/pages/project/[projectId]/juspay-dashboard.tsx @@ -3457,7 +3457,6 @@ function ObservationDetails({ traceId, projectId, startTime, - verbosity: "full", }, { enabled: !!observationId && !!projectId, @@ -3577,7 +3576,6 @@ function FinalResponseSection({ traceId: trace.id, projectId, timestamp: trace.timestamp, - verbosity: "full", }, { enabled: !!trace.id && !!projectId, @@ -3698,7 +3696,6 @@ function TraceMessage({ traceId: trace.id, projectId, timestamp: trace.timestamp, - verbosity: "full", // Get full output, not truncated }, { enabled: !!trace.id && !!projectId, diff --git a/web/src/server/api/routers/scores.ts b/web/src/server/api/routers/scores.ts index 9d30e5674da7..a528fb5603f8 100644 --- a/web/src/server/api/routers/scores.ts +++ b/web/src/server/api/routers/scores.ts @@ -361,7 +361,7 @@ export const scoresRouter = createTRPCRouter({ const score = !!clickhouseScore ? { ...clickhouseScore, - value: input.value, + value: input.value ?? null, stringValue: input.stringValue ?? null, comment: input.comment ?? null, metadata: {}, @@ -376,7 +376,7 @@ export const scoresRouter = createTRPCRouter({ ...inflatedParams, // only trace and session scores are supported for annotation datasetRunId: null, - value: input.value, + value: input.value ?? null, stringValue: input.stringValue ?? null, dataType: input.dataType ?? null, configId: input.configId ?? null, @@ -547,7 +547,7 @@ export const scoresRouter = createTRPCRouter({ sessionId: inflatedParams.sessionId, datasetRunId: null, name: input.name, - value: input.value, + value: input.value ?? null, dataType: input.dataType, configId: input.configId ?? null, metadata: {}, @@ -642,7 +642,7 @@ export const scoresRouter = createTRPCRouter({ const baseScore = { ...score, - value: input.value, + value: input.value ?? null, comment: input.comment ?? null, authorUserId: ctx.session.user.id, queueId: input.queueId ?? null, @@ -848,6 +848,9 @@ export const scoresRouter = createTRPCRouter({ data_type: "CATEGORICAL", string_value: input.rating, queue_id: null, + created_at: convertDateToClickhouseDateTime(now), + updated_at: convertDateToClickhouseDateTime(now), + metadata: {}, }); await auditLog({ From b49a8d77d5a49ba81ec88e196e6d2164bc0b69b6 Mon Sep 17 00:00:00 2001 From: Aman Srivastava Date: Tue, 18 Nov 2025 18:46:01 +0530 Subject: [PATCH 16/21] Fixed url too long issue --- .../project/[projectId]/juspay-dashboard.tsx | 39 ++++++++++++------- web/src/server/api/routers/scores.ts | 3 +- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/web/src/pages/project/[projectId]/juspay-dashboard.tsx b/web/src/pages/project/[projectId]/juspay-dashboard.tsx index 6680d7480ed4..33faab4fd788 100644 --- a/web/src/pages/project/[projectId]/juspay-dashboard.tsx +++ b/web/src/pages/project/[projectId]/juspay-dashboard.tsx @@ -401,21 +401,29 @@ export default function JuspayDashboard() { ); // Fetch manual ratings from database - const manualRatingsQuery = api.scores.getManualRatings.useQuery( - { - projectId, - traceIds: allSessionsTracesData.traces.map((t) => t.id), - }, - { - enabled: !!projectId && allSessionsTracesData.traces.length > 0, - }, - ); + const manualRatingsQuery = api.scores.getManualRatings.useMutation(); + + // Fetch ratings when traces are available + React.useEffect(() => { + if (projectId && allSessionsTracesData.traces.length > 0) { + manualRatingsQuery.mutate({ + projectId, + traceIds: allSessionsTracesData.traces.map((t) => t.id), + }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [projectId, allSessionsTracesData.traces.length]); // Create manual ratings mutation const createManualRatingMutation = api.scores.createManualRating.useMutation({ onSuccess: () => { - // Refetch manual ratings after successful creation - manualRatingsQuery.refetch(); + // Re-fetch manual ratings after successful creation + if (projectId && allSessionsTracesData.traces.length > 0) { + manualRatingsQuery.mutate({ + projectId, + traceIds: allSessionsTracesData.traces.map((t) => t.id), + }); + } }, onError: (error) => { console.error("Failed to create manual rating:", error); @@ -426,8 +434,13 @@ export default function JuspayDashboard() { // Delete manual rating mutation const deleteManualRatingMutation = api.scores.deleteManualRating.useMutation({ onSuccess: () => { - // Refetch manual ratings after successful deletion - manualRatingsQuery.refetch(); + // Re-fetch manual ratings after successful deletion + if (projectId && allSessionsTracesData.traces.length > 0) { + manualRatingsQuery.mutate({ + projectId, + traceIds: allSessionsTracesData.traces.map((t) => t.id), + }); + } }, onError: (error) => { console.error("Failed to delete manual rating:", error); diff --git a/web/src/server/api/routers/scores.ts b/web/src/server/api/routers/scores.ts index a528fb5603f8..b558163d67b0 100644 --- a/web/src/server/api/routers/scores.ts +++ b/web/src/server/api/routers/scores.ts @@ -840,7 +840,6 @@ export const scoresRouter = createTRPCRouter({ observation_id: null, session_id: null, name: "manual-rating", - value: undefined, source: ScoreSourceEnum.ANNOTATION, comment: input.comment || `Manual rating: ${input.rating}`, author_user_id: ctx.session.user.id, @@ -882,7 +881,7 @@ export const scoresRouter = createTRPCRouter({ traceIds: z.array(z.string()).optional(), }), ) - .query(async ({ input }) => { + .mutation(async ({ input }) => { const filters: any[] = [ { column: "name", From 4048e5e8e0d3930c7a5e5b9dd53a2ff06175d512 Mon Sep 17 00:00:00 2001 From: Aman Srivastava Date: Wed, 19 Nov 2025 15:49:25 +0530 Subject: [PATCH 17/21] Fixed internal server error --- .../project/[projectId]/juspay-dashboard.tsx | 31 ++++--- web/src/server/api/routers/scores.ts | 86 +++++++++++-------- 2 files changed, 71 insertions(+), 46 deletions(-) diff --git a/web/src/pages/project/[projectId]/juspay-dashboard.tsx b/web/src/pages/project/[projectId]/juspay-dashboard.tsx index 33faab4fd788..b23c751d771a 100644 --- a/web/src/pages/project/[projectId]/juspay-dashboard.tsx +++ b/web/src/pages/project/[projectId]/juspay-dashboard.tsx @@ -403,25 +403,27 @@ export default function JuspayDashboard() { // Fetch manual ratings from database const manualRatingsQuery = api.scores.getManualRatings.useMutation(); - // Fetch ratings when traces are available + // Fetch ratings React.useEffect(() => { - if (projectId && allSessionsTracesData.traces.length > 0) { + if (projectId && dateRange?.from && dateRange?.to) { manualRatingsQuery.mutate({ projectId, - traceIds: allSessionsTracesData.traces.map((t) => t.id), + fromDate: dateRange.from, + toDate: dateRange.to, }); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [projectId, allSessionsTracesData.traces.length]); + }, [projectId, dateRange?.from, dateRange?.to]); // Create manual ratings mutation const createManualRatingMutation = api.scores.createManualRating.useMutation({ onSuccess: () => { // Re-fetch manual ratings after successful creation - if (projectId && allSessionsTracesData.traces.length > 0) { + if (projectId && dateRange?.from && dateRange?.to) { manualRatingsQuery.mutate({ projectId, - traceIds: allSessionsTracesData.traces.map((t) => t.id), + fromDate: dateRange.from, + toDate: dateRange.to, }); } }, @@ -435,10 +437,11 @@ export default function JuspayDashboard() { const deleteManualRatingMutation = api.scores.deleteManualRating.useMutation({ onSuccess: () => { // Re-fetch manual ratings after successful deletion - if (projectId && allSessionsTracesData.traces.length > 0) { + if (projectId && dateRange?.from && dateRange?.to) { manualRatingsQuery.mutate({ projectId, - traceIds: allSessionsTracesData.traces.map((t) => t.id), + fromDate: dateRange.from, + toDate: dateRange.to, }); } }, @@ -451,13 +454,19 @@ export default function JuspayDashboard() { // Convert manual ratings data to Map for easier access const manualRatings = React.useMemo(() => { const ratingsMap = new Map(); - if (manualRatingsQuery.data) { + if (manualRatingsQuery.data && allTraces.length > 0) { + // Create a Set of trace IDs for fast lookup + const traceIds = new Set(allTraces.map(t => t.id)); + manualRatingsQuery.data.forEach((rating) => { - ratingsMap.set(rating.traceId, rating.rating); + // Only include rating if the trace exists in current date range + if (traceIds.has(rating.traceId)) { + ratingsMap.set(rating.traceId, rating.rating); + } }); } return ratingsMap; - }, [manualRatingsQuery.data]); + }, [manualRatingsQuery.data, allTraces]); // Function to update manual rating for a trace const updateManualRating = React.useCallback( diff --git a/web/src/server/api/routers/scores.ts b/web/src/server/api/routers/scores.ts index b558163d67b0..ca7bfbf73967 100644 --- a/web/src/server/api/routers/scores.ts +++ b/web/src/server/api/routers/scores.ts @@ -878,46 +878,62 @@ export const scoresRouter = createTRPCRouter({ .input( z.object({ projectId: z.string(), - traceIds: z.array(z.string()).optional(), + fromDate: z.date().optional(), + toDate: z.date().optional(), }), ) .mutation(async ({ input }) => { - const filters: any[] = [ - { - column: "name", - type: "string", - operator: "=", - value: "manual-rating", - }, - ]; - - if (input.traceIds && input.traceIds.length > 0) { - filters.push({ - column: "traceId", - type: "stringOptions", - operator: "any of", - value: input.traceIds, - }); - } + try { + const filters: any[] = [ + { + column: "name", + type: "string", + operator: "=", + value: "manual-rating", + }, + ]; + + // Add date range filters if provided + if (input.fromDate) { + filters.push({ + column: "timestamp", + type: "datetime", + operator: ">=", + value: input.fromDate, + }); + } + if (input.toDate) { + filters.push({ + column: "timestamp", + type: "datetime", + operator: "<=", + value: input.toDate, + }); + } - const scores = await getScoresUiTable({ - projectId: input.projectId, - filter: filters, - orderBy: { column: "timestamp", order: "DESC" as const }, - limit: 1000, - offset: 0, - excludeMetadata: true, - includeHasMetadataFlag: false, - }); + const scores = await getScoresUiTable({ + projectId: input.projectId, + filter: filters, + orderBy: { column: "timestamp", order: "DESC" as const }, + limit: 1000, + offset: 0, + excludeMetadata: true, + includeHasMetadataFlag: false, + }); - return scores.map((score) => ({ - traceId: score.traceId!, - rating: score.stringValue!, - comment: score.comment, - authorUserId: score.authorUserId, - timestamp: score.timestamp, - scoreId: score.id, - })); + return scores.map((score) => ({ + traceId: score.traceId!, + rating: score.stringValue!, + comment: score.comment, + authorUserId: score.authorUserId, + timestamp: score.timestamp, + scoreId: score.id, + })); + } catch (error) { + logger.error("Error fetching manual ratings:", error); + // Return empty array instead of throwing to prevent UI breakage + return []; + } }), deleteManualRating: protectedProjectProcedure From 082e7a6d412e5021c84161a45bc008101db051c5 Mon Sep 17 00:00:00 2001 From: Aman Srivastava Date: Wed, 19 Nov 2025 15:51:46 +0530 Subject: [PATCH 18/21] reduce the limit size --- web/src/server/api/routers/scores.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/server/api/routers/scores.ts b/web/src/server/api/routers/scores.ts index ca7bfbf73967..56e6d8dcf449 100644 --- a/web/src/server/api/routers/scores.ts +++ b/web/src/server/api/routers/scores.ts @@ -915,7 +915,7 @@ export const scoresRouter = createTRPCRouter({ projectId: input.projectId, filter: filters, orderBy: { column: "timestamp", order: "DESC" as const }, - limit: 1000, + limit: 100, offset: 0, excludeMetadata: true, includeHasMetadataFlag: false, From 73e5393360159af08ad4bcae5ce89e843ef7fb8d Mon Sep 17 00:00:00 2001 From: "rabi.prasad" Date: Mon, 8 Dec 2025 13:53:43 +0530 Subject: [PATCH 19/21] BZ-47112: fix: patch CVE-2025-55182 (React2Shell) vulnerability - Upgrade to patched versions: Next.js 15.5.7, React 19.2.1, React-DOM 19.2.1. - Addresses critical unauthenticated remote code execution vulnerability in react Server Components (React2Shell) actively exploited in the wild. --- ee/package.json | 2 +- packages/shared/package.json | 2 +- pnpm-lock.yaml | 2719 +++++++---------- web/package.json | 10 +- .../project/[projectId]/juspay-dashboard.tsx | 4 +- 5 files changed, 1045 insertions(+), 1692 deletions(-) diff --git a/ee/package.json b/ee/package.json index 3636403f4cd2..c894751439c2 100644 --- a/ee/package.json +++ b/ee/package.json @@ -27,7 +27,7 @@ "@langfuse/shared": "workspace:*", "@opentelemetry/api": ">=1.0.0 <1.10.0", "https-proxy-agent": "^7.0.6", - "next": "15.5.4", + "next": "15.5.7", "next-auth": "^4.24.12", "zod": "^3.25.62" }, diff --git a/packages/shared/package.json b/packages/shared/package.json index 75671f6c2edc..31bf96f5395b 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -127,6 +127,6 @@ }, "peerDependencies": { "@types/react": "~19.2.2", - "react": "~19.2.0" + "react": "~19.2.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ede1dadfdea..7e2383e7a283 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -54,11 +54,11 @@ importers: specifier: ^7.0.6 version: 7.0.6 next: - specifier: 15.5.4 - version: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: 15.5.7 + version: 15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-auth: specifier: ^4.24.12 - version: 4.24.12(patch_hash=x447yy4qrylml2g7vrfko5ivki)(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(nodemailer@7.0.10)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 4.24.12(patch_hash=x447yy4qrylml2g7vrfko5ivki)(next@15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(nodemailer@7.0.10)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) zod: specifier: ^3.25.62 version: 3.25.62 @@ -181,10 +181,10 @@ importers: version: 6.17.1(prisma@6.17.1(typescript@5.9.2))(typescript@5.9.2) '@react-email/components': specifier: ^0.5.1 - version: 0.5.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 0.5.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-email/render': specifier: ^1.2.1 - version: 1.2.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.2.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@slack/oauth': specifier: ^3.0.4 version: 3.0.4 @@ -247,7 +247,7 @@ importers: version: 4.1.1 next-auth: specifier: ^4.24.12 - version: 4.24.12(patch_hash=x447yy4qrylml2g7vrfko5ivki)(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(nodemailer@7.0.10)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 4.24.12(patch_hash=x447yy4qrylml2g7vrfko5ivki)(next@15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(nodemailer@7.0.10)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) nodemailer: specifier: ^7.0.10 version: 7.0.10 @@ -255,8 +255,8 @@ importers: specifier: ^3.0.0 version: 3.0.0(@prisma/client@6.17.1(prisma@6.17.1(typescript@5.9.2))(typescript@5.9.2)) react: - specifier: ~19.2.0 - version: 19.2.0 + specifier: ~19.2.1 + version: 19.2.1 uuid: specifier: ^9.0.1 version: 9.0.1 @@ -356,31 +356,31 @@ importers: version: 6.8.5 '@dnd-kit/core': specifier: ^6.1.0 - version: 6.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 6.1.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@dnd-kit/modifiers': specifier: ^7.0.0 - version: 7.0.0(@dnd-kit/core@6.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) + version: 7.0.0(@dnd-kit/core@6.1.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) '@dnd-kit/sortable': specifier: ^8.0.0 - version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) + version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) '@dnd-kit/utilities': specifier: ^3.2.2 - version: 3.2.2(react@19.2.0) + version: 3.2.2(react@19.2.1) '@ferrucc-io/emoji-picker': specifier: ^0.0.47 - version: 0.0.47(@babel/core@7.28.4)(@babel/template@7.27.2)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2))) + version: 0.0.47(@babel/core@7.28.4)(@babel/template@7.27.2)(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2))) '@headlessui/react': specifier: 2.2.7 - version: 2.2.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@headlessui/tailwindcss': specifier: 0.2.1 version: 0.2.1(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2))) '@heroicons/react': specifier: ^2.1.5 - version: 2.1.5(react@19.2.0) + version: 2.1.5(react@19.2.1) '@hookform/resolvers': specifier: ^5.1.1 - version: 5.1.1(react-hook-form@7.62.0(react@19.2.0)) + version: 5.1.1(react-hook-form@7.62.0(react@19.2.1)) '@langchain/core': specifier: ^0.3.58 version: 0.3.58(openai@4.104.0(zod@3.25.62)) @@ -395,16 +395,16 @@ importers: version: 1.2.1 '@marsidev/react-turnstile': specifier: ^0.5.4 - version: 0.5.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 0.5.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@mui/material': specifier: ^7.3.1 - version: 7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@mui/x-tree-view': specifier: ^8.17.0 - version: 8.17.0(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(@mui/material@7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@mui/system@7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 8.17.0(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(@mui/material@7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@mui/system@7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@next-auth/prisma-adapter': specifier: ^1.0.7 - version: 1.0.7(@prisma/client@6.17.1(prisma@6.17.1(typescript@5.9.2))(typescript@5.9.2))(next-auth@4.24.12(patch_hash=x447yy4qrylml2g7vrfko5ivki)(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(nodemailer@7.0.10)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) + version: 1.0.7(@prisma/client@6.17.1(prisma@6.17.1(typescript@5.9.2))(typescript@5.9.2))(next-auth@4.24.12(patch_hash=x447yy4qrylml2g7vrfko5ivki)(next@15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(nodemailer@7.0.10)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) '@opentelemetry/api': specifier: ^1.9.0 version: 1.9.0 @@ -455,79 +455,79 @@ importers: version: 6.17.1(@opentelemetry/api@1.9.0) '@radix-ui/react-accordion': specifier: ^1.2.12 - version: 1.2.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.2.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-alert-dialog': specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-avatar': specifier: ^1.1.10 - version: 1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-checkbox': specifier: ^1.3.3 - version: 1.3.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.3.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-collapsible': specifier: ^1.1.12 - version: 1.1.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-dialog': specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-dropdown-menu': specifier: ^2.1.16 - version: 2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-hover-card': specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-icons': specifier: ^1.3.2 - version: 1.3.2(react@19.2.0) + version: 1.3.2(react@19.2.1) '@radix-ui/react-label': specifier: ^2.1.7 - version: 2.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-popover': specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-progress': specifier: ^1.1.7 - version: 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-radio-group': specifier: ^1.3.8 - version: 1.3.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.3.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-scroll-area': specifier: ^1.2.10 - version: 1.2.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.2.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-select': specifier: ^2.2.6 - version: 2.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-separator': specifier: ^1.1.7 - version: 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-slider': specifier: ^1.3.6 - version: 1.3.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.3.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-slot': specifier: ^1.2.3 - version: 1.2.3(@types/react@19.2.2)(react@19.2.0) + version: 1.2.3(@types/react@19.2.2)(react@19.2.1) '@radix-ui/react-switch': specifier: ^1.2.6 - version: 1.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-tabs': specifier: ^1.1.13 - version: 1.1.13(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.13(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-toggle': specifier: ^1.1.10 - version: 1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-toggle-group': specifier: ^1.1.11 - version: 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-tooltip': specifier: ^1.2.8 - version: 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@remixicon/react': specifier: ^4.2.0 - version: 4.2.0(react@19.2.0) + version: 4.2.0(react@19.2.1) '@sentry/nextjs': specifier: ^10.18.0 - version: 10.18.0(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(webpack@5.97.1) + version: 10.18.0(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(next@15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(webpack@5.97.1) '@t3-oss/env-nextjs': specifier: ^0.11.1 version: 0.11.1(typescript@5.9.2)(zod@3.25.62) @@ -536,25 +536,25 @@ importers: version: 0.1.1(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2))) '@tanstack/react-query': specifier: ^5.85.1 - version: 5.85.1(react@19.2.0) + version: 5.85.1(react@19.2.1) '@tanstack/react-table': specifier: ^8.20.5 - version: 8.20.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 8.20.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@team-plain/typescript-sdk': specifier: ^5.10.3 version: 5.10.3 '@tremor/react': specifier: 4.0.0-beta-tremor-v4.4 - version: 4.0.0-beta-tremor-v4.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2))) + version: 4.0.0-beta-tremor-v4.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2))) '@trpc/client': specifier: ^11.4.4 version: 11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2) '@trpc/next': specifier: ^11.4.4 - version: 11.4.4(@tanstack/react-query@5.85.1(react@19.2.0))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/react-query@11.4.4(@tanstack/react-query@5.85.1(react@19.2.0))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + version: 11.4.4(@tanstack/react-query@5.85.1(react@19.2.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/react-query@11.4.4(@tanstack/react-query@5.85.1(react@19.2.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(next@15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(typescript@5.9.2) '@trpc/react-query': specifier: ^11.4.4 - version: 11.4.4(@tanstack/react-query@5.85.1(react@19.2.0))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + version: 11.4.4(@tanstack/react-query@5.85.1(react@19.2.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(typescript@5.9.2) '@trpc/server': specifier: ^11.4.4 version: 11.4.4(typescript@5.9.2) @@ -563,10 +563,10 @@ importers: version: 4.23.7(@codemirror/language@6.11.2)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1) '@uiw/react-codemirror': specifier: ^4.24.1 - version: 4.24.1(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.17.0(@codemirror/language@6.11.2)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/common@1.3.0))(@codemirror/language@6.11.2)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.6)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.38.1)(codemirror@6.0.1(@lezer/common@1.3.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 4.24.1(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.17.0(@codemirror/language@6.11.2)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/common@1.3.0))(@codemirror/language@6.11.2)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.6)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.38.1)(codemirror@6.0.1(@lezer/common@1.3.0))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) ai: specifier: ^3.4.9 - version: 3.4.9(openai@4.104.0(zod@3.25.62))(react@19.2.0)(solid-js@1.8.18)(sswr@2.1.0(svelte@4.2.19))(svelte@4.2.19)(vue@3.4.27(typescript@5.9.2))(zod@3.25.62) + version: 3.4.9(openai@4.104.0(zod@3.25.62))(react@19.2.1)(solid-js@1.8.18)(sswr@2.1.0(svelte@4.2.19))(svelte@4.2.19)(vue@3.4.27(typescript@5.9.2))(zod@3.25.62) bcryptjs: specifier: ^2.4.3 version: 2.4.3 @@ -584,7 +584,7 @@ importers: version: 2.1.1 cmdk: specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.0.4(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) core-js: specifier: ^3.38.1 version: 3.38.1 @@ -641,22 +641,22 @@ importers: version: 4.17.21 lucide-react: specifier: ^0.552.0 - version: 0.552.0(react@19.2.0) + version: 0.552.0(react@19.2.1) nanoid: specifier: ^3.3.8 version: 3.3.11 next: - specifier: 15.5.4 - version: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: 15.5.7 + version: 15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-auth: specifier: ^4.24.12 - version: 4.24.12(patch_hash=x447yy4qrylml2g7vrfko5ivki)(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(nodemailer@7.0.10)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 4.24.12(patch_hash=x447yy4qrylml2g7vrfko5ivki)(next@15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(nodemailer@7.0.10)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-query-params: specifier: ^5.1.0 - version: 5.1.0(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(use-query-params@2.2.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) + version: 5.1.0(next@15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(use-query-params@2.2.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) next-themes: specifier: ^0.4.6 - version: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 0.4.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) posthog-js: specifier: ^1.273.1 version: 1.273.1 @@ -668,7 +668,7 @@ importers: version: 2.2.0 prism-react-renderer: specifier: ^2.4.1 - version: 2.4.1(react@19.2.0) + version: 2.4.1(react@19.2.1) prisma: specifier: ^6.17.1 version: 6.17.1(typescript@5.9.2) @@ -679,41 +679,41 @@ importers: specifier: ^5.0.3 version: 5.0.3 react: - specifier: 19.2.0 - version: 19.2.0 + specifier: 19.2.1 + version: 19.2.1 react-day-picker: specifier: ^9.9.0 - version: 9.9.0(react@19.2.0) + version: 9.9.0(react@19.2.1) react-dom: - specifier: 19.2.0 - version: 19.2.0(react@19.2.0) + specifier: 19.2.1 + version: 19.2.1(react@19.2.1) react-dropzone: specifier: ^14.3.8 - version: 14.3.8(react@19.2.0) + version: 14.3.8(react@19.2.1) react-grid-layout: specifier: ^1.5.2 - version: 1.5.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.5.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react-hook-form: specifier: ^7.62.0 - version: 7.62.0(react@19.2.0) + version: 7.62.0(react@19.2.1) react-icons: specifier: ^5.5.0 - version: 5.5.0(react@19.2.0) + version: 5.5.0(react@19.2.1) react-markdown: specifier: ^10.1.0 - version: 10.1.0(@types/react@19.2.2)(react@19.2.0) + version: 10.1.0(@types/react@19.2.2)(react@19.2.1) react-resizable-panels: specifier: ^3.0.6 - version: 3.0.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 3.0.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react-responsive: specifier: ^10.0.1 - version: 10.0.1(react@19.2.0) + version: 10.0.1(react@19.2.1) react18-json-view: specifier: ^0.2.8-canary.6 - version: 0.2.8-canary.6(react@19.2.0) + version: 0.2.8-canary.6(react@19.2.1) recharts: specifier: ^2.15.2 - version: 2.15.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.15.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) remark-gfm: specifier: ^4.0.0 version: 4.0.0 @@ -731,7 +731,7 @@ importers: version: 11.0.0 sonner: specifier: ^2.0.7 - version: 2.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1) stripe: specifier: ^18.5.0 version: 18.5.0(@types/node@24.3.0) @@ -749,13 +749,13 @@ importers: version: 11.0.5 use-query-params: specifier: ^2.2.1 - version: 2.2.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) uuid: specifier: ^9.0.1 version: 9.0.1 vaul: specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) vis-network: specifier: ^9.1.9 version: 9.1.9(@egjs/hammerjs@2.0.17)(component-emitter@1.3.1)(keycharm@0.4.0)(uuid@9.0.1)(vis-data@7.1.9(uuid@9.0.1)(vis-util@5.0.7(@egjs/hammerjs@2.0.17)(component-emitter@1.3.1)))(vis-util@5.0.7(@egjs/hammerjs@2.0.17)(component-emitter@1.3.1)) @@ -770,8 +770,8 @@ importers: specifier: ^11.2.0 version: 11.2.0(puppeteer@19.11.1(typescript@5.9.2)) '@next/bundle-analyzer': - specifier: 15.5.4 - version: 15.5.4 + specifier: 15.5.7 + version: 15.5.7 '@playwright/test': specifier: ^1.47.2 version: 1.47.2 @@ -789,7 +789,7 @@ importers: version: 6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@24.3.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)))(vitest@3.2.4(@types/node@24.3.0)) '@testing-library/react': specifier: ^15.0.7 - version: 15.0.7(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 15.0.7(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@types/bcryptjs': specifier: ^2.4.6 version: 2.4.6 @@ -848,8 +848,8 @@ importers: specifier: ^8.56.0 version: 8.57.0 eslint-config-next: - specifier: 15.5.4 - version: 15.5.4(eslint@8.57.0)(typescript@5.9.2) + specifier: 15.5.7 + version: 15.5.7(eslint@8.57.0)(typescript@5.9.2) jest: specifier: ^29.7.0 version: 29.7.0(@types/node@24.3.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)) @@ -3341,62 +3341,62 @@ packages: '@prisma/client': '>=2.26.0 || >=3' next-auth: ^4 - '@next/bundle-analyzer@15.5.4': - resolution: {integrity: sha512-wMtpIjEHi+B/wC34ZbEcacGIPgQTwTFjjp0+F742s9TxC6QwT0MwB/O0QEgalMe8s3SH/K09DO0gmTvUSJrLRA==} + '@next/bundle-analyzer@15.5.7': + resolution: {integrity: sha512-bKCGI9onUYyLaAQKvJOTeSv1vt3CYtF4Or+CRlCP/1Yu8NR9W4A2kd4qBs2OYFbT+/38fKg8BIPNt7IcMLKZCA==} - '@next/env@15.5.4': - resolution: {integrity: sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A==} + '@next/env@15.5.7': + resolution: {integrity: sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==} '@next/eslint-plugin-next@14.2.15': resolution: {integrity: sha512-pKU0iqKRBlFB/ocOI1Ip2CkKePZpYpnw5bEItEkuZ/Nr9FQP1+p7VDWr4VfOdff4i9bFmrOaeaU1bFEyAcxiMQ==} - '@next/eslint-plugin-next@15.5.4': - resolution: {integrity: sha512-SR1vhXNNg16T4zffhJ4TS7Xn7eq4NfKfcOsRwea7RIAHrjRpI9ALYbamqIJqkAhowLlERffiwk0FMvTLNdnVtw==} + '@next/eslint-plugin-next@15.5.7': + resolution: {integrity: sha512-DtRU2N7BkGr8r+pExfuWHwMEPX5SD57FeA6pxdgCHODo+b/UgIgjE+rgWKtJAbEbGhVZ2jtHn4g3wNhWFoNBQQ==} - '@next/swc-darwin-arm64@15.5.4': - resolution: {integrity: sha512-nopqz+Ov6uvorej8ndRX6HlxCYWCO3AHLfKK2TYvxoSB2scETOcfm/HSS3piPqc3A+MUgyHoqE6je4wnkjfrOA==} + '@next/swc-darwin-arm64@15.5.7': + resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.4': - resolution: {integrity: sha512-QOTCFq8b09ghfjRJKfb68kU9k2K+2wsC4A67psOiMn849K9ZXgCSRQr0oVHfmKnoqCbEmQWG1f2h1T2vtJJ9mA==} + '@next/swc-darwin-x64@15.5.7': + resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.4': - resolution: {integrity: sha512-eRD5zkts6jS3VfE/J0Kt1VxdFqTnMc3QgO5lFE5GKN3KDI/uUpSyK3CjQHmfEkYR4wCOl0R0XrsjpxfWEA++XA==} + '@next/swc-linux-arm64-gnu@15.5.7': + resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.4': - resolution: {integrity: sha512-TOK7iTxmXFc45UrtKqWdZ1shfxuL4tnVAOuuJK4S88rX3oyVV4ZkLjtMT85wQkfBrOOvU55aLty+MV8xmcJR8A==} + '@next/swc-linux-arm64-musl@15.5.7': + resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.4': - resolution: {integrity: sha512-7HKolaj+481FSW/5lL0BcTkA4Ueam9SPYWyN/ib/WGAFZf0DGAN8frNpNZYFHtM4ZstrHZS3LY3vrwlIQfsiMA==} + '@next/swc-linux-x64-gnu@15.5.7': + resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.4': - resolution: {integrity: sha512-nlQQ6nfgN0nCO/KuyEUwwOdwQIGjOs4WNMjEUtpIQJPR2NUfmGpW2wkJln1d4nJ7oUzd1g4GivH5GoEPBgfsdw==} + '@next/swc-linux-x64-musl@15.5.7': + resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.5.4': - resolution: {integrity: sha512-PcR2bN7FlM32XM6eumklmyWLLbu2vs+D7nJX8OAIoWy69Kef8mfiN4e8TUv2KohprwifdpFKPzIP1njuCjD0YA==} + '@next/swc-win32-arm64-msvc@15.5.7': + resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.4': - resolution: {integrity: sha512-1ur2tSHZj8Px/KMAthmuI9FMp/YFusMMGoRNJaRZMOlSkgvLjzosSdQI0cJAKogdHl3qXUQKL9MGaYvKwA7DXg==} + '@next/swc-win32-x64-msvc@15.5.7': + resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -6710,18 +6710,10 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} - engines: {node: '>= 0.4'} - array-includes@3.1.9: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} @@ -6730,34 +6722,18 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.findlast@1.2.4: - resolution: {integrity: sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==} - engines: {node: '>= 0.4'} - array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} - array.prototype.findlastindex@1.2.4: - resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} - engines: {node: '>= 0.4'} - array.prototype.findlastindex@1.2.6: resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} engines: {node: '>= 0.4'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - array.prototype.flat@1.3.3: resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.3: resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} @@ -6765,17 +6741,10 @@ packages: array.prototype.toreversed@1.1.2: resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} - array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} - array.prototype.tosorted@1.1.4: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.4: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} @@ -7052,12 +7021,6 @@ packages: caniuse-lite@1.0.30001599: resolution: {integrity: sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==} - caniuse-lite@1.0.30001723: - resolution: {integrity: sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==} - - caniuse-lite@1.0.30001749: - resolution: {integrity: sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==} - caniuse-lite@1.0.30001754: resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} @@ -7660,26 +7623,14 @@ packages: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - data-view-byte-length@1.0.2: resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.1: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} @@ -8082,10 +8033,6 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - es-abstract@1.24.0: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} @@ -8102,10 +8049,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.0.18: - resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} - engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.1: resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} @@ -8113,10 +8056,6 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -8125,17 +8064,10 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - es-shim-unscopables@1.1.0: resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} engines: {node: '>= 0.4'} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} @@ -8188,8 +8120,8 @@ packages: typescript: optional: true - eslint-config-next@15.5.4: - resolution: {integrity: sha512-BzgVVuT3kfJes8i2GHenC1SRJ+W3BTML11lAOYFOOPzrk2xp66jBOAGEFRw+3LkYCln5UzvFsLhojrshb5Zfaw==} + eslint-config-next@15.5.7: + resolution: {integrity: sha512-nU/TRGHHeG81NeLW5DeQT5t6BDUqbpsNQTvef1ld/tqHT+/zTx60/TIhKnmPISTTe++DVo+DLxDmk4rnwHaZVw==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -8255,27 +8187,6 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - eslint-plugin-es-x@7.8.0: resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -8723,9 +8634,6 @@ packages: debug: optional: true - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -8806,10 +8714,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - function.prototype.name@1.1.8: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} @@ -8873,10 +8777,6 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -8977,9 +8877,6 @@ packages: resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} engines: {node: '>=14'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -9236,10 +9133,6 @@ packages: '@types/node': optional: true - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -9281,10 +9174,6 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -9299,9 +9188,6 @@ packages: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - is-bigint@1.1.0: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} @@ -9310,10 +9196,6 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} @@ -9334,18 +9216,10 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - is-data-view@1.0.2: resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - is-date-object@1.1.0: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} @@ -9370,9 +9244,6 @@ 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.1: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} @@ -9416,10 +9287,6 @@ packages: is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -9456,10 +9323,6 @@ packages: is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -9468,10 +9331,6 @@ packages: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.4: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} @@ -9487,26 +9346,14 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - is-symbol@1.1.1: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -9523,9 +9370,6 @@ packages: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakref@1.1.1: resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} engines: {node: '>= 0.4'} @@ -9587,9 +9431,6 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - iterator.prototype@1.1.5: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} @@ -10776,8 +10617,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.5.4: - resolution: {integrity: sha512-xH4Yjhb82sFYQfY3vbkJfgSDgXvBB6a8xPs9i35k6oZJRoQRihZH+4s9Yo2qsWpzBmZ3lPXaJ2KPXLfkvW4LnA==} + next@15.5.7: + resolution: {integrity: sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -10953,18 +10794,10 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - object.assign@4.1.7: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} - object.entries@1.1.9: resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} engines: {node: '>= 0.4'} @@ -10980,10 +10813,6 @@ packages: object.hasown@1.1.3: resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} - object.values@1.2.1: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} @@ -11772,10 +11601,10 @@ packages: peerDependencies: react: '>=16.8.0' - react-dom@19.2.0: - resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} + react-dom@19.2.1: + resolution: {integrity: sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg==} peerDependencies: - react: ^19.2.0 + react: ^19.2.1 react-draggable@4.5.0: resolution: {integrity: sha512-VC+HBLEZ0XJxnOxVAZsdRi8rD04Iz3SiiKOoYzamjylUcju/hP9np/aZdLHf/7WOD268WMoNJMvYfB5yAK45cw==} @@ -11897,8 +11726,8 @@ packages: peerDependencies: react: '>=16.8.0' - react@19.2.0: - resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + react@19.2.1: + resolution: {integrity: sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -11968,10 +11797,6 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} - regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -11982,10 +11807,6 @@ packages: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -12065,11 +11886,6 @@ packages: resolve@1.19.0: resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - resolve@1.22.11: resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} @@ -12143,10 +11959,6 @@ packages: rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -12161,10 +11973,6 @@ packages: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} @@ -12530,9 +12338,6 @@ packages: resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} engines: {node: '>= 0.4'} - string.prototype.matchall@4.0.10: - resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} - string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} @@ -12544,13 +12349,6 @@ packages: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - string.prototype.trimend@1.0.9: resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} engines: {node: '>= 0.4'} @@ -13060,34 +12858,18 @@ packages: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.3: resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.4: resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - typed-array-length@1.0.7: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} @@ -13108,9 +12890,6 @@ packages: engines: {node: '>=0.8.0'} hasBin: true - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -13525,17 +13304,10 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} - which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} - which-builtin-type@1.2.1: resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} engines: {node: '>= 0.4'} @@ -13544,10 +13316,6 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - which-typed-array@1.1.19: resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} @@ -13745,13 +13513,13 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/react@0.0.62(react@19.2.0)(zod@3.25.62)': + '@ai-sdk/react@0.0.62(react@19.2.1)(zod@3.25.62)': dependencies: '@ai-sdk/provider-utils': 1.0.20(zod@3.25.62) '@ai-sdk/ui-utils': 0.0.46(zod@3.25.62) - swr: 2.2.5(react@19.2.0) + swr: 2.2.5(react@19.2.1) optionalDependencies: - react: 19.2.0 + react: 19.2.1 zod: 3.25.62 '@ai-sdk/solid@0.0.49(solid-js@1.8.18)(zod@3.25.62)': @@ -14238,7 +14006,7 @@ snapshots: '@smithy/util-middleware': 3.0.7 '@smithy/util-retry': 3.0.7 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.3 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -14498,7 +14266,7 @@ snapshots: '@smithy/util-middleware': 3.0.7 '@smithy/util-retry': 3.0.7 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.3 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -14514,7 +14282,7 @@ snapshots: '@smithy/types': 3.5.0 '@smithy/util-middleware': 3.0.7 fast-xml-parser: 4.4.1 - tslib: 2.6.3 + tslib: 2.8.1 '@aws-sdk/core@3.679.0': dependencies: @@ -14768,7 +14536,7 @@ snapshots: '@smithy/property-provider': 3.1.7 '@smithy/shared-ini-file-loader': 3.1.8 '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - '@aws-sdk/client-sts' @@ -15061,7 +14829,7 @@ snapshots: '@aws-sdk/types': 3.667.0 '@smithy/protocol-http': 4.1.4 '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@aws-sdk/middleware-host-header@3.821.0': dependencies: @@ -15094,7 +14862,7 @@ snapshots: dependencies: '@aws-sdk/types': 3.667.0 '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@aws-sdk/middleware-logger@3.821.0': dependencies: @@ -15119,7 +14887,7 @@ snapshots: '@aws-sdk/types': 3.667.0 '@smithy/protocol-http': 4.1.4 '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@aws-sdk/middleware-recursion-detection@3.821.0': dependencies: @@ -15217,7 +14985,7 @@ snapshots: '@smithy/core': 2.4.8 '@smithy/protocol-http': 4.1.4 '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@aws-sdk/middleware-user-agent@3.825.0': dependencies: @@ -15441,7 +15209,7 @@ snapshots: '@smithy/types': 3.5.0 '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.7 - tslib: 2.6.3 + tslib: 2.8.1 '@aws-sdk/region-config-resolver@3.821.0': dependencies: @@ -15566,7 +15334,7 @@ snapshots: '@aws-sdk/types@3.667.0': dependencies: '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@aws-sdk/types@3.679.0': dependencies: @@ -15605,7 +15373,7 @@ snapshots: '@aws-sdk/types': 3.667.0 '@smithy/types': 3.5.0 '@smithy/util-endpoints': 2.1.3 - tslib: 2.6.3 + tslib: 2.8.1 '@aws-sdk/util-endpoints@3.821.0': dependencies: @@ -15653,7 +15421,7 @@ snapshots: '@aws-sdk/types': 3.667.0 '@smithy/types': 3.5.0 bowser: 2.11.0 - tslib: 2.6.3 + tslib: 2.8.1 '@aws-sdk/util-user-agent-browser@3.821.0': dependencies: @@ -15682,7 +15450,7 @@ snapshots: '@aws-sdk/types': 3.667.0 '@smithy/node-config-provider': 3.1.8 '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@aws-sdk/util-user-agent-node@3.825.0': dependencies: @@ -15736,13 +15504,13 @@ snapshots: '@azure/abort-controller@2.1.2': dependencies: - tslib: 2.6.3 + tslib: 2.8.1 '@azure/core-auth@1.9.0': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-util': 1.11.0 - tslib: 2.6.3 + tslib: 2.8.1 '@azure/core-client@1.9.2': dependencies: @@ -15752,7 +15520,7 @@ snapshots: '@azure/core-tracing': 1.2.0 '@azure/core-util': 1.11.0 '@azure/logger': 1.1.4 - tslib: 2.6.3 + tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -15769,11 +15537,11 @@ snapshots: '@azure/abort-controller': 2.1.2 '@azure/core-util': 1.11.0 '@azure/logger': 1.1.4 - tslib: 2.6.3 + tslib: 2.8.1 '@azure/core-paging@1.6.2': dependencies: - tslib: 2.6.3 + tslib: 2.8.1 '@azure/core-rest-pipeline@1.18.0': dependencies: @@ -15784,27 +15552,27 @@ snapshots: '@azure/logger': 1.1.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 - tslib: 2.6.3 + tslib: 2.8.1 transitivePeerDependencies: - supports-color '@azure/core-tracing@1.2.0': dependencies: - tslib: 2.6.3 + tslib: 2.8.1 '@azure/core-util@1.11.0': dependencies: '@azure/abort-controller': 2.1.2 - tslib: 2.6.3 + tslib: 2.8.1 '@azure/core-xml@1.4.4': dependencies: fast-xml-parser: 4.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@azure/logger@1.1.4': dependencies: - tslib: 2.6.3 + tslib: 2.8.1 '@azure/storage-blob@12.26.0': dependencies: @@ -15858,7 +15626,7 @@ snapshots: '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 convert-source-map: 2.0.0 - debug: 4.4.1 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -16128,7 +15896,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.24.1 '@babel/types': 7.24.0 - debug: 4.4.1 + debug: 4.4.3 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -16161,14 +15929,14 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@base-ui-components/utils@0.1.2(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@base-ui-components/utils@0.1.2(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@babel/runtime': 7.28.4 '@floating-ui/utils': 0.2.10 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) reselect: 5.1.1 - use-sync-external-store: 1.6.0(react@19.2.0) + use-sync-external-store: 1.6.0(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 @@ -16372,36 +16140,36 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} - '@dnd-kit/accessibility@3.1.0(react@19.2.0)': + '@dnd-kit/accessibility@3.1.0(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 tslib: 2.6.3 - '@dnd-kit/core@6.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@dnd-kit/core@6.1.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@dnd-kit/accessibility': 3.1.0(react@19.2.0) - '@dnd-kit/utilities': 3.2.2(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@dnd-kit/accessibility': 3.1.0(react@19.2.1) + '@dnd-kit/utilities': 3.2.2(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) tslib: 2.6.3 - '@dnd-kit/modifiers@7.0.0(@dnd-kit/core@6.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)': + '@dnd-kit/modifiers@7.0.0(@dnd-kit/core@6.1.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@dnd-kit/utilities': 3.2.2(react@19.2.0) - react: 19.2.0 + '@dnd-kit/core': 6.1.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@dnd-kit/utilities': 3.2.2(react@19.2.1) + react: 19.2.1 tslib: 2.6.3 - '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)': + '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@dnd-kit/utilities': 3.2.2(react@19.2.0) - react: 19.2.0 + '@dnd-kit/core': 6.1.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@dnd-kit/utilities': 3.2.2(react@19.2.1) + react: 19.2.1 tslib: 2.6.3 - '@dnd-kit/utilities@3.2.2(react@19.2.0)': + '@dnd-kit/utilities@3.2.2(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 tslib: 2.6.3 '@egjs/hammerjs@2.0.17': @@ -16447,17 +16215,17 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0)': + '@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1)': dependencies: '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.0) + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.1) '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.3.1 hoist-non-react-statics: 3.3.2 - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 transitivePeerDependencies: @@ -16474,16 +16242,16 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0)': + '@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1)': dependencies: '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.11.4(@types/react@19.2.2)(react@19.2.0) + '@emotion/react': 11.11.4(@types/react@19.2.2)(react@19.2.1) '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.0) + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.1) '@emotion/utils': 1.4.2 - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 transitivePeerDependencies: @@ -16492,9 +16260,9 @@ snapshots: '@emotion/unitless@0.10.0': {} - '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.2.0)': + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 optional: true '@emotion/utils@1.4.2': {} @@ -16617,14 +16385,14 @@ snapshots: '@eslint/js@8.57.0': {} - '@ferrucc-io/emoji-picker@0.0.47(@babel/core@7.28.4)(@babel/template@7.27.2)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)))': + '@ferrucc-io/emoji-picker@0.0.47(@babel/core@7.28.4)(@babel/template@7.27.2)(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)))': dependencies: - '@tanstack/react-virtual': 3.13.12(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/react-virtual': 3.13.12(react-dom@19.2.1(react@19.2.1))(react@19.2.1) clsx: 2.1.1 - jotai: 2.15.0(@babel/core@7.28.4)(@babel/template@7.27.2)(@types/react@19.2.2)(react@19.2.0) + jotai: 2.15.0(@babel/core@7.28.4)(@babel/template@7.27.2)(@types/react@19.2.2)(react@19.2.1) node-emoji: 2.2.0 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) tailwind-merge: 2.6.0 tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)) unicode-emoji-json: 0.8.0 @@ -16642,48 +16410,48 @@ snapshots: '@floating-ui/core': 1.7.3 '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@1.3.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@floating-ui/react-dom@1.3.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@floating-ui/dom': 1.7.4 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@floating-ui/react-dom@2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@floating-ui/react-dom@2.1.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@floating-ui/dom': 1.7.4 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@floating-ui/react@0.19.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@floating-ui/react@0.19.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@floating-ui/react-dom': 1.3.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@floating-ui/react-dom': 1.3.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) aria-hidden: 1.2.6 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) tabbable: 6.2.0 - '@floating-ui/react@0.26.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@floating-ui/react@0.26.24(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@floating-ui/utils': 0.2.10 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) tabbable: 6.2.0 - '@floating-ui/react@0.26.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@floating-ui/react@0.26.28(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@floating-ui/utils': 0.2.10 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) tabbable: 6.2.0 - '@floating-ui/react@0.27.16(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@floating-ui/react@0.27.16(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@floating-ui/utils': 0.2.10 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) tabbable: 6.2.0 '@floating-ui/utils@0.2.10': {} @@ -16736,34 +16504,34 @@ snapshots: protobufjs: 7.4.0 yargs: 17.7.2 - '@headlessui/react@2.2.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@headlessui/react@2.2.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@floating-ui/react': 0.26.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/focus': 3.18.3(react@19.2.0) - '@react-aria/interactions': 3.22.3(react@19.2.0) - '@tanstack/react-virtual': 3.10.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@floating-ui/react': 0.26.24(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/focus': 3.18.3(react@19.2.1) + '@react-aria/interactions': 3.22.3(react@19.2.1) + '@tanstack/react-virtual': 3.10.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@headlessui/react@2.2.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@headlessui/react@2.2.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@floating-ui/react': 0.26.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/focus': 3.21.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/react-virtual': 3.13.12(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - use-sync-external-store: 1.5.0(react@19.2.0) + '@floating-ui/react': 0.26.24(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/focus': 3.21.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-virtual': 3.13.12(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + use-sync-external-store: 1.5.0(react@19.2.1) - '@headlessui/react@2.2.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@headlessui/react@2.2.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@floating-ui/react': 0.26.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/react-virtual': 3.13.12(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - use-sync-external-store: 1.6.0(react@19.2.0) + '@floating-ui/react': 0.26.28(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-virtual': 3.13.12(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + use-sync-external-store: 1.6.0(react@19.2.1) '@headlessui/tailwindcss@0.2.1(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)))': dependencies: @@ -16773,14 +16541,14 @@ snapshots: dependencies: tailwindcss: 3.4.18(tsx@4.20.5)(yaml@2.8.1) - '@heroicons/react@2.1.5(react@19.2.0)': + '@heroicons/react@2.1.5(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@hookform/resolvers@5.1.1(react-hook-form@7.62.0(react@19.2.0))': + '@hookform/resolvers@5.1.1(react-hook-form@7.62.0(react@19.2.1))': dependencies: '@standard-schema/utils': 0.3.0 - react-hook-form: 7.62.0(react@19.2.0) + react-hook-form: 7.62.0(react@19.2.1) '@humanwhocodes/config-array@0.11.14': dependencies: @@ -16803,7 +16571,7 @@ snapshots: '@antfu/install-pkg': 0.4.1 '@antfu/utils': 0.7.10 '@iconify/types': 2.0.0 - debug: 4.4.1 + debug: 4.4.3 kolorist: 1.8.0 local-pkg: 0.5.0 mlly: 1.7.1 @@ -17499,10 +17267,10 @@ snapshots: '@marijn/find-cluster-break@1.0.2': {} - '@marsidev/react-turnstile@0.5.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@marsidev/react-turnstile@0.5.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) '@mermaid-js/mermaid-cli@11.12.0(@babel/core@7.28.4)(@babel/template@7.27.2)(@types/react@19.2.2)(puppeteer@19.11.1(typescript@5.9.2))(tsx@4.20.5)(yaml@2.8.1)': dependencies: @@ -17591,37 +17359,37 @@ snapshots: '@mui/core-downloads-tracker@7.3.1': {} - '@mui/material@7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@mui/material@7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@babel/runtime': 7.28.3 '@mui/core-downloads-tracker': 7.3.1 - '@mui/system': 7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0) + '@mui/system': 7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1) '@mui/types': 7.4.5(@types/react@19.2.2) - '@mui/utils': 7.3.1(@types/react@19.2.2)(react@19.2.0) + '@mui/utils': 7.3.1(@types/react@19.2.2)(react@19.2.1) '@popperjs/core': 2.11.8 '@types/react-transition-group': 4.4.12(@types/react@19.2.2) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) react-is: 19.1.1 - react-transition-group: 4.4.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react-transition-group: 4.4.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1) optionalDependencies: - '@emotion/react': 11.11.4(@types/react@19.2.2)(react@19.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0) + '@emotion/react': 11.11.4(@types/react@19.2.2)(react@19.2.1) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1) '@types/react': 19.2.2 - '@mui/private-theming@7.3.1(@types/react@19.2.2)(react@19.2.0)': + '@mui/private-theming@7.3.1(@types/react@19.2.2)(react@19.2.1)': dependencies: '@babel/runtime': 7.28.3 - '@mui/utils': 7.3.1(@types/react@19.2.2)(react@19.2.0) + '@mui/utils': 7.3.1(@types/react@19.2.2)(react@19.2.1) prop-types: 15.8.1 - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@mui/styled-engine@7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)': + '@mui/styled-engine@7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(react@19.2.1)': dependencies: '@babel/runtime': 7.28.3 '@emotion/cache': 11.14.0 @@ -17629,25 +17397,25 @@ snapshots: '@emotion/sheet': 1.4.0 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.2.0 + react: 19.2.1 optionalDependencies: - '@emotion/react': 11.11.4(@types/react@19.2.2)(react@19.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0) + '@emotion/react': 11.11.4(@types/react@19.2.2)(react@19.2.1) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1) - '@mui/system@7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0)': + '@mui/system@7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1)': dependencies: '@babel/runtime': 7.28.3 - '@mui/private-theming': 7.3.1(@types/react@19.2.2)(react@19.2.0) - '@mui/styled-engine': 7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(react@19.2.0) + '@mui/private-theming': 7.3.1(@types/react@19.2.2)(react@19.2.1) + '@mui/styled-engine': 7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(react@19.2.1) '@mui/types': 7.4.5(@types/react@19.2.2) - '@mui/utils': 7.3.1(@types/react@19.2.2)(react@19.2.0) + '@mui/utils': 7.3.1(@types/react@19.2.2)(react@19.2.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.2.0 + react: 19.2.1 optionalDependencies: - '@emotion/react': 11.11.4(@types/react@19.2.2)(react@19.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0) + '@emotion/react': 11.11.4(@types/react@19.2.2)(react@19.2.1) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1) '@types/react': 19.2.2 '@mui/types@7.4.5(@types/react@19.2.2)': @@ -17662,104 +17430,104 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 - '@mui/utils@7.3.1(@types/react@19.2.2)(react@19.2.0)': + '@mui/utils@7.3.1(@types/react@19.2.2)(react@19.2.1)': dependencies: '@babel/runtime': 7.28.3 '@mui/types': 7.4.5(@types/react@19.2.2) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.2.0 + react: 19.2.1 react-is: 19.1.1 optionalDependencies: '@types/react': 19.2.2 - '@mui/utils@7.3.5(@types/react@19.2.2)(react@19.2.0)': + '@mui/utils@7.3.5(@types/react@19.2.2)(react@19.2.1)': dependencies: '@babel/runtime': 7.28.4 '@mui/types': 7.4.8(@types/react@19.2.2) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.2.0 + react: 19.2.1 react-is: 19.2.0 optionalDependencies: '@types/react': 19.2.2 - '@mui/x-internals@8.17.0(@types/react@19.2.2)(react@19.2.0)': + '@mui/x-internals@8.17.0(@types/react@19.2.2)(react@19.2.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.5(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 + '@mui/utils': 7.3.5(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 reselect: 5.1.1 - use-sync-external-store: 1.6.0(react@19.2.0) + use-sync-external-store: 1.6.0(react@19.2.1) transitivePeerDependencies: - '@types/react' - '@mui/x-tree-view@8.17.0(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(@mui/material@7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@mui/system@7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@mui/x-tree-view@8.17.0(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(@mui/material@7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@mui/system@7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@babel/runtime': 7.28.4 - '@base-ui-components/utils': 0.1.2(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@mui/material': 7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@mui/system': 7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0) - '@mui/utils': 7.3.5(@types/react@19.2.2)(react@19.2.0) - '@mui/x-internals': 8.17.0(@types/react@19.2.2)(react@19.2.0) + '@base-ui-components/utils': 0.1.2(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@mui/material': 7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@mui/system': 7.3.1(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1) + '@mui/utils': 7.3.5(@types/react@19.2.2)(react@19.2.1) + '@mui/x-internals': 8.17.0(@types/react@19.2.2)(react@19.2.1) '@types/react-transition-group': 4.4.12(@types/react@19.2.2) clsx: 2.1.1 prop-types: 15.8.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - react-transition-group: 4.4.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + react-transition-group: 4.4.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1) optionalDependencies: - '@emotion/react': 11.11.4(@types/react@19.2.2)(react@19.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0) + '@emotion/react': 11.11.4(@types/react@19.2.2)(react@19.2.1) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@19.2.2)(react@19.2.1))(@types/react@19.2.2)(react@19.2.1) transitivePeerDependencies: - '@types/react' - '@next-auth/prisma-adapter@1.0.7(@prisma/client@6.17.1(prisma@6.17.1(typescript@5.9.2))(typescript@5.9.2))(next-auth@4.24.12(patch_hash=x447yy4qrylml2g7vrfko5ivki)(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(nodemailer@7.0.10)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))': + '@next-auth/prisma-adapter@1.0.7(@prisma/client@6.17.1(prisma@6.17.1(typescript@5.9.2))(typescript@5.9.2))(next-auth@4.24.12(patch_hash=x447yy4qrylml2g7vrfko5ivki)(next@15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(nodemailer@7.0.10)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': dependencies: '@prisma/client': 6.17.1(prisma@6.17.1(typescript@5.9.2))(typescript@5.9.2) - next-auth: 4.24.12(patch_hash=x447yy4qrylml2g7vrfko5ivki)(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(nodemailer@7.0.10)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next-auth: 4.24.12(patch_hash=x447yy4qrylml2g7vrfko5ivki)(next@15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(nodemailer@7.0.10)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@next/bundle-analyzer@15.5.4': + '@next/bundle-analyzer@15.5.7': dependencies: webpack-bundle-analyzer: 4.10.1 transitivePeerDependencies: - bufferutil - utf-8-validate - '@next/env@15.5.4': {} + '@next/env@15.5.7': {} '@next/eslint-plugin-next@14.2.15': dependencies: glob: 10.3.10 - '@next/eslint-plugin-next@15.5.4': + '@next/eslint-plugin-next@15.5.7': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.5.4': + '@next/swc-darwin-arm64@15.5.7': optional: true - '@next/swc-darwin-x64@15.5.4': + '@next/swc-darwin-x64@15.5.7': optional: true - '@next/swc-linux-arm64-gnu@15.5.4': + '@next/swc-linux-arm64-gnu@15.5.7': optional: true - '@next/swc-linux-arm64-musl@15.5.4': + '@next/swc-linux-arm64-musl@15.5.7': optional: true - '@next/swc-linux-x64-gnu@15.5.4': + '@next/swc-linux-x64-gnu@15.5.7': optional: true - '@next/swc-linux-x64-musl@15.5.4': + '@next/swc-linux-x64-musl@15.5.7': optional: true - '@next/swc-win32-arm64-msvc@15.5.4': + '@next/swc-win32-arm64-msvc@15.5.7': optional: true - '@next/swc-win32-x64-msvc@15.5.4': + '@next/swc-win32-x64-msvc@15.5.7': optional: true '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': @@ -18607,866 +18375,866 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-compose-refs@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-compose-refs@1.1.1(@types/react@19.2.2)(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.2)(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-context@1.1.2(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-context@1.1.2(@types/react@19.2.2)(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) aria-hidden: 1.2.6 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-direction@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-direction@1.1.1(@types/react@19.2.2)(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.2)(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-icons@1.3.2(react@19.2.0)': + '@radix-ui/react-icons@1.3.2(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@radix-ui/react-id@1.1.0(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-id@1.1.0(@types/react@19.2.2)(react@19.2.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-id@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-id@1.1.1(@types/react@19.2.2)(react@19.2.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) aria-hidden: 1.2.6 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) aria-hidden: 1.2.6 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': - dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.1) '@radix-ui/rect': 1.1.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-primitive@2.0.1(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-primitive@2.0.1(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-slot': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-progress@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-progress@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) aria-hidden: 1.2.6 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-separator@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-separator@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-slot@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-slot@1.1.1(@types/react@19.2.2)(react@19.2.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-slot@1.2.3(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.2)(react@19.2.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.2)(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.2)(react@19.2.1)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.2)(react@19.2.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.2)(react@19.2.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.2)(react@19.2.1)': dependencies: - react: 19.2.0 - use-sync-external-store: 1.5.0(react@19.2.0) + react: 19.2.1 + use-sync-external-store: 1.5.0(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.2.2)(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.2)(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.2)(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.2)(react@19.2.1)': dependencies: '@radix-ui/rect': 1.1.1 - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.2)(react@19.2.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - react: 19.2.0 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) '@radix-ui/rect@1.1.1': {} - '@react-aria/focus@3.18.3(react@19.2.0)': + '@react-aria/focus@3.18.3(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.22.3(react@19.2.0) - '@react-aria/utils': 3.25.3(react@19.2.0) - '@react-types/shared': 3.25.0(react@19.2.0) + '@react-aria/interactions': 3.22.3(react@19.2.1) + '@react-aria/utils': 3.25.3(react@19.2.1) + '@react-types/shared': 3.25.0(react@19.2.1) '@swc/helpers': 0.5.17 clsx: 2.1.1 - react: 19.2.0 + react: 19.2.1 - '@react-aria/focus@3.21.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/focus@3.21.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.30.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.0(react@19.2.0) + '@react-aria/interactions': 3.25.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.30.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.0(react@19.2.1) '@swc/helpers': 0.5.17 clsx: 2.1.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/focus@3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/focus@3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 clsx: 2.1.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/interactions@3.22.3(react@19.2.0)': + '@react-aria/interactions@3.22.3(react@19.2.1)': dependencies: - '@react-aria/ssr': 3.9.6(react@19.2.0) - '@react-aria/utils': 3.25.3(react@19.2.0) - '@react-types/shared': 3.25.0(react@19.2.0) + '@react-aria/ssr': 3.9.6(react@19.2.1) + '@react-aria/utils': 3.25.3(react@19.2.1) + '@react-types/shared': 3.25.0(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-aria/interactions@3.25.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/interactions@3.25.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/utils': 3.30.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/utils': 3.30.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-stately/flags': 3.1.2 - '@react-types/shared': 3.32.0(react@19.2.0) + '@react-types/shared': 3.32.0(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/interactions@3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/interactions@3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-stately/flags': 3.1.2 - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/ssr@3.9.10(react@19.2.0)': + '@react-aria/ssr@3.9.10(react@19.2.1)': dependencies: '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-aria/ssr@3.9.6(react@19.2.0)': + '@react-aria/ssr@3.9.6(react@19.2.1)': dependencies: '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-aria/utils@3.25.3(react@19.2.0)': + '@react-aria/utils@3.25.3(react@19.2.1)': dependencies: - '@react-aria/ssr': 3.9.6(react@19.2.0) - '@react-stately/utils': 3.10.4(react@19.2.0) - '@react-types/shared': 3.25.0(react@19.2.0) + '@react-aria/ssr': 3.9.6(react@19.2.1) + '@react-stately/utils': 3.10.4(react@19.2.1) + '@react-types/shared': 3.25.0(react@19.2.1) '@swc/helpers': 0.5.17 clsx: 2.1.1 - react: 19.2.0 + react: 19.2.1 - '@react-aria/utils@3.30.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/utils@3.30.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.0) + '@react-aria/ssr': 3.9.10(react@19.2.1) '@react-stately/flags': 3.1.2 - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.0(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.0(react@19.2.1) '@swc/helpers': 0.5.17 clsx: 2.1.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/utils@3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/utils@3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.0) + '@react-aria/ssr': 3.9.10(react@19.2.1) '@react-stately/flags': 3.1.2 - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 clsx: 2.1.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-email/body@0.1.0(react@19.2.0)': + '@react-email/body@0.1.0(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-email/button@0.2.0(react@19.2.0)': + '@react-email/button@0.2.0(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-email/code-block@0.1.0(react@19.2.0)': + '@react-email/code-block@0.1.0(react@19.2.1)': dependencies: prismjs: 1.30.0 - react: 19.2.0 - - '@react-email/code-inline@0.0.5(react@19.2.0)': - dependencies: - react: 19.2.0 - - '@react-email/column@0.0.13(react@19.2.0)': - dependencies: - react: 19.2.0 - - '@react-email/components@0.5.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': - dependencies: - '@react-email/body': 0.1.0(react@19.2.0) - '@react-email/button': 0.2.0(react@19.2.0) - '@react-email/code-block': 0.1.0(react@19.2.0) - '@react-email/code-inline': 0.0.5(react@19.2.0) - '@react-email/column': 0.0.13(react@19.2.0) - '@react-email/container': 0.0.15(react@19.2.0) - '@react-email/font': 0.0.9(react@19.2.0) - '@react-email/head': 0.0.12(react@19.2.0) - '@react-email/heading': 0.0.15(react@19.2.0) - '@react-email/hr': 0.0.11(react@19.2.0) - '@react-email/html': 0.0.11(react@19.2.0) - '@react-email/img': 0.0.11(react@19.2.0) - '@react-email/link': 0.0.12(react@19.2.0) - '@react-email/markdown': 0.0.15(react@19.2.0) - '@react-email/preview': 0.0.13(react@19.2.0) - '@react-email/render': 1.2.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-email/row': 0.0.12(react@19.2.0) - '@react-email/section': 0.0.16(react@19.2.0) - '@react-email/tailwind': 1.2.2(react@19.2.0) - '@react-email/text': 0.1.5(react@19.2.0) - react: 19.2.0 + react: 19.2.1 + + '@react-email/code-inline@0.0.5(react@19.2.1)': + dependencies: + react: 19.2.1 + + '@react-email/column@0.0.13(react@19.2.1)': + dependencies: + react: 19.2.1 + + '@react-email/components@0.5.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@react-email/body': 0.1.0(react@19.2.1) + '@react-email/button': 0.2.0(react@19.2.1) + '@react-email/code-block': 0.1.0(react@19.2.1) + '@react-email/code-inline': 0.0.5(react@19.2.1) + '@react-email/column': 0.0.13(react@19.2.1) + '@react-email/container': 0.0.15(react@19.2.1) + '@react-email/font': 0.0.9(react@19.2.1) + '@react-email/head': 0.0.12(react@19.2.1) + '@react-email/heading': 0.0.15(react@19.2.1) + '@react-email/hr': 0.0.11(react@19.2.1) + '@react-email/html': 0.0.11(react@19.2.1) + '@react-email/img': 0.0.11(react@19.2.1) + '@react-email/link': 0.0.12(react@19.2.1) + '@react-email/markdown': 0.0.15(react@19.2.1) + '@react-email/preview': 0.0.13(react@19.2.1) + '@react-email/render': 1.2.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-email/row': 0.0.12(react@19.2.1) + '@react-email/section': 0.0.16(react@19.2.1) + '@react-email/tailwind': 1.2.2(react@19.2.1) + '@react-email/text': 0.1.5(react@19.2.1) + react: 19.2.1 transitivePeerDependencies: - react-dom - '@react-email/container@0.0.15(react@19.2.0)': + '@react-email/container@0.0.15(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-email/font@0.0.9(react@19.2.0)': + '@react-email/font@0.0.9(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-email/head@0.0.12(react@19.2.0)': + '@react-email/head@0.0.12(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-email/heading@0.0.15(react@19.2.0)': + '@react-email/heading@0.0.15(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-email/hr@0.0.11(react@19.2.0)': + '@react-email/hr@0.0.11(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-email/html@0.0.11(react@19.2.0)': + '@react-email/html@0.0.11(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-email/img@0.0.11(react@19.2.0)': + '@react-email/img@0.0.11(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-email/link@0.0.12(react@19.2.0)': + '@react-email/link@0.0.12(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-email/markdown@0.0.15(react@19.2.0)': + '@react-email/markdown@0.0.15(react@19.2.1)': dependencies: - md-to-react-email: 5.0.5(react@19.2.0) - react: 19.2.0 + md-to-react-email: 5.0.5(react@19.2.1) + react: 19.2.1 - '@react-email/preview@0.0.13(react@19.2.0)': + '@react-email/preview@0.0.13(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-email/render@1.2.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-email/render@1.2.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: html-to-text: 9.0.5 prettier: 3.6.2 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) react-promise-suspense: 0.3.4 - '@react-email/row@0.0.12(react@19.2.0)': + '@react-email/row@0.0.12(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-email/section@0.0.16(react@19.2.0)': + '@react-email/section@0.0.16(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-email/tailwind@1.2.2(react@19.2.0)': + '@react-email/tailwind@1.2.2(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-email/text@0.1.5(react@19.2.0)': + '@react-email/text@0.1.5(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 '@react-stately/flags@3.1.2': dependencies: '@swc/helpers': 0.5.17 - '@react-stately/utils@3.10.4(react@19.2.0)': + '@react-stately/utils@3.10.4(react@19.2.1)': dependencies: '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/utils@3.10.8(react@19.2.0)': + '@react-stately/utils@3.10.8(react@19.2.1)': dependencies: '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-types/shared@3.25.0(react@19.2.0)': + '@react-types/shared@3.25.0(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-types/shared@3.32.0(react@19.2.0)': + '@react-types/shared@3.32.0(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-types/shared@3.32.1(react@19.2.0)': + '@react-types/shared@3.32.1(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 '@release-it/bumper@7.0.5(release-it@19.0.4(@types/node@24.10.0))': dependencies: @@ -19480,9 +19248,9 @@ snapshots: release-it: 19.0.4(@types/node@24.10.0) semver: 7.7.2 - '@remixicon/react@4.2.0(react@19.2.0)': + '@remixicon/react@4.2.0(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 '@rollup/plugin-commonjs@28.0.1(rollup@4.52.4)': dependencies: @@ -19669,7 +19437,7 @@ snapshots: '@sentry/core@10.18.0': {} - '@sentry/nextjs@10.18.0(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(webpack@5.97.1)': + '@sentry/nextjs@10.18.0(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(next@15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(webpack@5.97.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.37.0 @@ -19679,11 +19447,11 @@ snapshots: '@sentry/core': 10.18.0 '@sentry/node': 10.18.0 '@sentry/opentelemetry': 10.18.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) - '@sentry/react': 10.18.0(react@19.2.0) + '@sentry/react': 10.18.0(react@19.2.1) '@sentry/vercel-edge': 10.18.0 '@sentry/webpack-plugin': 4.3.0(webpack@5.97.1) chalk: 3.0.0 - next: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) resolve: 1.22.8 rollup: 4.52.4 stacktrace-parser: 0.1.11 @@ -19770,12 +19538,12 @@ snapshots: '@opentelemetry/semantic-conventions': 1.37.0 '@sentry/core': 10.18.0 - '@sentry/react@10.18.0(react@19.2.0)': + '@sentry/react@10.18.0(react@19.2.1)': dependencies: '@sentry/browser': 10.18.0 '@sentry/core': 10.18.0 hoist-non-react-statics: 3.3.2 - react: 19.2.0 + react: 19.2.1 '@sentry/vercel-edge@10.18.0': dependencies: @@ -19863,7 +19631,7 @@ snapshots: '@smithy/types': 3.5.0 '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.7 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/config-resolver@4.3.3': dependencies: @@ -19893,7 +19661,7 @@ snapshots: '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-middleware': 3.0.7 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/core@3.17.0': dependencies: @@ -20033,7 +19801,7 @@ snapshots: '@smithy/querystring-builder': 3.0.7 '@smithy/types': 3.5.0 '@smithy/util-base64': 3.0.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/fetch-http-handler@5.3.4': dependencies: @@ -20055,7 +19823,7 @@ snapshots: '@smithy/types': 3.5.0 '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/hash-node@4.2.3': dependencies: @@ -20073,7 +19841,7 @@ snapshots: '@smithy/invalid-dependency@3.0.7': dependencies: '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/invalid-dependency@4.2.3': dependencies: @@ -20108,13 +19876,13 @@ snapshots: '@smithy/util-middleware': 3.0.7 '@smithy/util-utf8': 3.0.0 fflate: 0.8.1 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/middleware-content-length@3.0.9': dependencies: '@smithy/protocol-http': 4.1.4 '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/middleware-content-length@4.2.3': dependencies: @@ -20130,7 +19898,7 @@ snapshots: '@smithy/types': 3.5.0 '@smithy/url-parser': 3.0.7 '@smithy/util-middleware': 3.0.7 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/middleware-endpoint@4.3.4': dependencies: @@ -20163,7 +19931,7 @@ snapshots: '@smithy/types': 3.5.0 '@smithy/util-middleware': 3.0.7 '@smithy/util-retry': 3.0.7 - tslib: 2.6.3 + tslib: 2.8.1 uuid: 9.0.1 '@smithy/middleware-retry@4.4.4': @@ -20193,7 +19961,7 @@ snapshots: '@smithy/middleware-serde@3.0.7': dependencies: '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/middleware-serde@4.2.3': dependencies: @@ -20204,7 +19972,7 @@ snapshots: '@smithy/middleware-stack@3.0.7': dependencies: '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/middleware-stack@4.2.3': dependencies: @@ -20216,7 +19984,7 @@ snapshots: '@smithy/property-provider': 3.1.7 '@smithy/shared-ini-file-loader': 3.1.8 '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/node-config-provider@4.3.3': dependencies: @@ -20231,7 +19999,7 @@ snapshots: '@smithy/protocol-http': 4.1.4 '@smithy/querystring-builder': 3.0.7 '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/node-http-handler@4.4.2': dependencies: @@ -20262,7 +20030,7 @@ snapshots: '@smithy/protocol-http@4.1.4': dependencies: '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/protocol-http@5.3.3': dependencies: @@ -20338,7 +20106,7 @@ snapshots: '@smithy/protocol-http': 4.1.4 '@smithy/types': 3.5.0 '@smithy/util-stream': 3.1.9 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/smithy-client@4.9.0': dependencies: @@ -20362,7 +20130,7 @@ snapshots: '@smithy/types@3.5.0': dependencies: - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/types@4.3.1': dependencies: @@ -20376,7 +20144,7 @@ snapshots: dependencies: '@smithy/querystring-parser': 3.0.7 '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/url-parser@4.2.3': dependencies: @@ -20388,7 +20156,7 @@ snapshots: dependencies: '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/util-base64@4.3.0': dependencies: @@ -20398,7 +20166,7 @@ snapshots: '@smithy/util-body-length-browser@3.0.0': dependencies: - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/util-body-length-browser@4.2.0': dependencies: @@ -20406,7 +20174,7 @@ snapshots: '@smithy/util-body-length-node@3.0.0': dependencies: - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/util-body-length-node@4.2.1': dependencies: @@ -20441,7 +20209,7 @@ snapshots: '@smithy/smithy-client': 3.4.0 '@smithy/types': 3.5.0 bowser: 2.11.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/util-defaults-mode-browser@4.3.3': dependencies: @@ -20465,7 +20233,7 @@ snapshots: '@smithy/property-provider': 3.1.7 '@smithy/smithy-client': 3.4.0 '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/util-defaults-mode-node@4.2.4': dependencies: @@ -20491,7 +20259,7 @@ snapshots: dependencies: '@smithy/node-config-provider': 3.1.8 '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/util-endpoints@3.2.3': dependencies: @@ -20510,7 +20278,7 @@ snapshots: '@smithy/util-middleware@3.0.7': dependencies: '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/util-middleware@4.2.3': dependencies: @@ -20521,7 +20289,7 @@ snapshots: dependencies: '@smithy/service-error-classification': 3.0.7 '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/util-retry@4.2.3': dependencies: @@ -20578,7 +20346,7 @@ snapshots: '@smithy/util-utf8@3.0.0': dependencies: '@smithy/util-buffer-from': 3.0.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/util-utf8@4.2.0': dependencies: @@ -20589,7 +20357,7 @@ snapshots: dependencies: '@smithy/abort-controller': 3.1.5 '@smithy/types': 3.5.0 - tslib: 2.6.3 + tslib: 2.8.1 '@smithy/uuid@1.1.0': dependencies: @@ -20631,28 +20399,28 @@ snapshots: '@tanstack/query-core@5.85.1': {} - '@tanstack/react-query@5.85.1(react@19.2.0)': + '@tanstack/react-query@5.85.1(react@19.2.1)': dependencies: '@tanstack/query-core': 5.85.1 - react: 19.2.0 + react: 19.2.1 - '@tanstack/react-table@8.20.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-table@8.20.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@tanstack/table-core': 8.20.5 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@tanstack/react-virtual@3.10.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-virtual@3.10.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@tanstack/virtual-core': 3.10.8 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@tanstack/react-virtual@3.13.12(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-virtual@3.13.12(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@tanstack/virtual-core': 3.13.12 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) '@tanstack/table-core@8.20.5': {} @@ -20696,13 +20464,13 @@ snapshots: jest: 29.7.0(@types/node@24.3.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)) vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.6.1)(jsdom@20.0.3)(msw@2.6.5(@types/node@24.3.0)(typescript@5.9.2))(terser@5.44.1)(tsx@4.20.5)(yaml@2.8.1) - '@testing-library/react@15.0.7(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@testing-library/react@15.0.7(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@babel/runtime': 7.24.5 '@testing-library/dom': 10.0.0 '@types/react-dom': 18.2.25 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 @@ -20710,15 +20478,15 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} - '@tremor/react@4.0.0-beta-tremor-v4.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)))': + '@tremor/react@4.0.0-beta-tremor-v4.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)))': dependencies: - '@floating-ui/react': 0.19.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@headlessui/react': 2.2.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@floating-ui/react': 0.19.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@headlessui/react': 2.2.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) date-fns: 3.6.0 - react: 19.2.0 - react-day-picker: 8.10.1(date-fns@3.6.0)(react@19.2.0) - react-dom: 19.2.0(react@19.2.0) - recharts: 2.15.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.1 + react-day-picker: 8.10.1(date-fns@3.6.0)(react@19.2.1) + react-dom: 19.2.1(react@19.2.1) + recharts: 2.15.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) tailwind-merge: 2.6.0 tailwind-variants: 0.3.1(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2))) transitivePeerDependencies: @@ -20729,25 +20497,25 @@ snapshots: '@trpc/server': 11.4.4(typescript@5.9.2) typescript: 5.9.2 - '@trpc/next@11.4.4(@tanstack/react-query@5.85.1(react@19.2.0))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/react-query@11.4.4(@tanstack/react-query@5.85.1(react@19.2.0))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': + '@trpc/next@11.4.4(@tanstack/react-query@5.85.1(react@19.2.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/react-query@11.4.4(@tanstack/react-query@5.85.1(react@19.2.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(next@15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(typescript@5.9.2)': dependencies: '@trpc/client': 11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2) '@trpc/server': 11.4.4(typescript@5.9.2) - next: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + next: 15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) typescript: 5.9.2 optionalDependencies: - '@tanstack/react-query': 5.85.1(react@19.2.0) - '@trpc/react-query': 11.4.4(@tanstack/react-query@5.85.1(react@19.2.0))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@tanstack/react-query': 5.85.1(react@19.2.1) + '@trpc/react-query': 11.4.4(@tanstack/react-query@5.85.1(react@19.2.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(typescript@5.9.2) - '@trpc/react-query@11.4.4(@tanstack/react-query@5.85.1(react@19.2.0))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': + '@trpc/react-query@11.4.4(@tanstack/react-query@5.85.1(react@19.2.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(typescript@5.9.2)': dependencies: - '@tanstack/react-query': 5.85.1(react@19.2.0) + '@tanstack/react-query': 5.85.1(react@19.2.1) '@trpc/client': 11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2) '@trpc/server': 11.4.4(typescript@5.9.2) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) typescript: 5.9.2 '@trpc/server@11.4.4(typescript@5.9.2)': @@ -21398,7 +21166,7 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) eslint: 8.57.0 eslint-scope: 5.1.1 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color - typescript @@ -21467,7 +21235,7 @@ snapshots: '@codemirror/state': 6.5.2 '@codemirror/view': 6.38.1 - '@uiw/react-codemirror@4.24.1(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.17.0(@codemirror/language@6.11.2)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/common@1.3.0))(@codemirror/language@6.11.2)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.6)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.38.1)(codemirror@6.0.1(@lezer/common@1.3.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@uiw/react-codemirror@4.24.1(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.17.0(@codemirror/language@6.11.2)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/common@1.3.0))(@codemirror/language@6.11.2)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.6)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.38.1)(codemirror@6.0.1(@lezer/common@1.3.0))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@babel/runtime': 7.28.4 '@codemirror/commands': 6.8.1 @@ -21476,8 +21244,8 @@ snapshots: '@codemirror/view': 6.38.1 '@uiw/codemirror-extensions-basic-setup': 4.24.1(@codemirror/autocomplete@6.17.0(@codemirror/language@6.11.2)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/common@1.3.0))(@codemirror/commands@6.8.1)(@codemirror/language@6.11.2)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.6)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1) codemirror: 6.0.1(@lezer/common@1.3.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) transitivePeerDependencies: - '@codemirror/autocomplete' - '@codemirror/language' @@ -21709,8 +21477,8 @@ snapshots: '@zenuml/core@3.41.6(@babel/core@7.28.4)(@babel/template@7.27.2)(@types/react@19.2.2)(tsx@4.20.5)(yaml@2.8.1)': dependencies: - '@floating-ui/react': 0.27.16(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@headlessui/react': 2.2.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@floating-ui/react': 0.27.16(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@headlessui/react': 2.2.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@headlessui/tailwindcss': 0.2.2(tailwindcss@3.4.18(tsx@4.20.5)(yaml@2.8.1)) antlr4: 4.11.0 class-variance-authority: 0.7.1 @@ -21720,15 +21488,15 @@ snapshots: highlight.js: 10.7.3 html-to-image: 1.11.13 immer: 10.1.3 - jotai: 2.15.0(@babel/core@7.28.4)(@babel/template@7.27.2)(@types/react@19.2.2)(react@19.2.0) + jotai: 2.15.0(@babel/core@7.28.4)(@babel/template@7.27.2)(@types/react@19.2.2)(react@19.2.1) lodash: 4.17.21 marked: 4.3.0 pako: 2.1.0 pino: 8.21.0 radash: 12.1.1 ramda: 0.28.0 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) tailwind-merge: 3.3.1 tailwindcss: 3.4.18(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: @@ -21804,11 +21572,11 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ai@3.4.9(openai@4.104.0(zod@3.25.62))(react@19.2.0)(solid-js@1.8.18)(sswr@2.1.0(svelte@4.2.19))(svelte@4.2.19)(vue@3.4.27(typescript@5.9.2))(zod@3.25.62): + ai@3.4.9(openai@4.104.0(zod@3.25.62))(react@19.2.1)(solid-js@1.8.18)(sswr@2.1.0(svelte@4.2.19))(svelte@4.2.19)(vue@3.4.27(typescript@5.9.2))(zod@3.25.62): dependencies: '@ai-sdk/provider': 0.0.24 '@ai-sdk/provider-utils': 1.0.20(zod@3.25.62) - '@ai-sdk/react': 0.0.62(react@19.2.0)(zod@3.25.62) + '@ai-sdk/react': 0.0.62(react@19.2.1)(zod@3.25.62) '@ai-sdk/solid': 0.0.49(solid-js@1.8.18)(zod@3.25.62) '@ai-sdk/svelte': 0.0.51(svelte@4.2.19)(zod@3.25.62) '@ai-sdk/ui-utils': 0.0.46(zod@3.25.62) @@ -21822,7 +21590,7 @@ snapshots: zod-to-json-schema: 3.23.2(zod@3.25.62) optionalDependencies: openai: 4.104.0(zod@3.25.62) - react: 19.2.0 + react: 19.2.1 sswr: 2.1.0(svelte@4.2.19) svelte: 4.2.19 zod: 3.25.62 @@ -21946,24 +21714,11 @@ snapshots: aria-query@5.3.2: {} - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-includes@3.1.7: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - array-includes@3.1.9: dependencies: call-bind: 1.0.8 @@ -21977,14 +21732,6 @@ snapshots: array-union@2.1.0: {} - array.prototype.findlast@1.2.4: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 - array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.8 @@ -21994,14 +21741,6 @@ snapshots: es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 - array.prototype.findlastindex@1.2.4: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 - array.prototype.findlastindex@1.2.6: dependencies: call-bind: 1.0.8 @@ -22012,13 +21751,6 @@ snapshots: es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 @@ -22026,13 +21758,6 @@ snapshots: es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 - array.prototype.flatmap@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 @@ -22042,18 +21767,10 @@ snapshots: array.prototype.toreversed@1.1.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - array.prototype.tosorted@1.1.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: @@ -22063,17 +21780,6 @@ snapshots: es-errors: 1.3.0 es-shim-unscopables: 1.1.0 - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 @@ -22266,21 +21972,21 @@ snapshots: browserslist@4.23.0: dependencies: - caniuse-lite: 1.0.30001723 + caniuse-lite: 1.0.30001754 electron-to-chromium: 1.4.710 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) browserslist@4.24.0: dependencies: - caniuse-lite: 1.0.30001749 + caniuse-lite: 1.0.30001754 electron-to-chromium: 1.5.33 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.0) browserslist@4.25.0: dependencies: - caniuse-lite: 1.0.30001749 + caniuse-lite: 1.0.30001754 electron-to-chromium: 1.5.167 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.0) @@ -22288,7 +21994,7 @@ snapshots: browserslist@4.26.3: dependencies: baseline-browser-mapping: 2.8.14 - caniuse-lite: 1.0.30001749 + caniuse-lite: 1.0.30001754 electron-to-chromium: 1.5.233 node-releases: 2.0.23 update-browserslist-db: 1.1.3(browserslist@4.26.3) @@ -22404,10 +22110,6 @@ snapshots: caniuse-lite@1.0.30001599: {} - caniuse-lite@1.0.30001723: {} - - caniuse-lite@1.0.30001749: {} - caniuse-lite@1.0.30001754: {} ccount@2.0.1: {} @@ -22597,14 +22299,14 @@ snapshots: cluster-key-slot@1.1.2: {} - cmdk@1.0.4(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + cmdk@1.0.4(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - use-sync-external-store: 1.4.0(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-id': 1.1.0(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + use-sync-external-store: 1.4.0(react@19.2.1) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -23093,36 +22795,18 @@ snapshots: whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - data-view-byte-length@1.0.2: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - data-view-byte-offset@1.0.1: dependencies: call-bound: 1.0.4 @@ -23481,55 +23165,6 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.3.0 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 @@ -23595,23 +23230,6 @@ snapshots: es-errors@1.3.0: {} - es-iterator-helpers@1.0.18: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-set-tostringtag: 2.1.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - iterator.prototype: 1.1.2 - safe-array-concat: 1.1.2 - es-iterator-helpers@1.2.1: dependencies: call-bind: 1.0.8 @@ -23633,10 +23251,6 @@ snapshots: es-module-lexer@1.7.0: {} - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -23648,20 +23262,10 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 @@ -23741,9 +23345,9 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-config-next@15.5.4(eslint@8.57.0)(typescript@5.9.2): + eslint-config-next@15.5.7(eslint@8.57.0)(typescript@5.9.2): dependencies: - '@next/eslint-plugin-next': 15.5.4 + '@next/eslint-plugin-next': 15.5.7 '@rushstack/eslint-patch': 1.12.0 '@typescript-eslint/eslint-plugin': 7.3.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2) '@typescript-eslint/parser': 7.12.0(eslint@8.57.0)(typescript@5.9.2) @@ -23791,14 +23395,14 @@ snapshots: eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: - debug: 4.4.1 + debug: 4.4.3 enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.3 get-tsconfig: 4.10.1 - is-core-module: 2.15.1 + is-core-module: 2.16.1 is-glob: 4.0.3 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -23808,14 +23412,14 @@ snapshots: eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.0): dependencies: - debug: 4.4.1 + debug: 4.4.3 enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.3 get-tsconfig: 4.10.1 - is-core-module: 2.15.1 + is-core-module: 2.16.1 is-glob: 4.0.3 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -23825,14 +23429,14 @@ snapshots: eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: - debug: 4.4.1 + debug: 4.4.3 enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.3 get-tsconfig: 4.10.1 - is-core-module: 2.15.1 + is-core-module: 2.16.1 is-glob: 4.0.3 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -23840,18 +23444,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.0))(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 7.12.0(eslint@8.57.0)(typescript@5.9.2) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -23862,7 +23455,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -23873,7 +23466,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -23899,22 +23492,22 @@ snapshots: eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.4 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.9.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 - is-core-module: 2.15.1 + is-core-module: 2.16.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 + object.values: 1.2.1 semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: @@ -23987,20 +23580,20 @@ snapshots: dependencies: '@babel/runtime': 7.28.3 aria-query: 5.3.2 - array-includes: 3.1.7 - array.prototype.flatmap: 1.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 axe-core: 4.7.0 axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.18 + es-iterator-helpers: 1.2.1 eslint: 8.57.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 - object.entries: 1.1.8 + object.entries: 1.1.9 object.fromentries: 2.0.8 eslint-plugin-n@16.6.2(eslint@8.57.0): @@ -24051,25 +23644,25 @@ snapshots: eslint-plugin-react@7.34.1(eslint@8.57.0): dependencies: - array-includes: 3.1.7 - array.prototype.findlast: 1.2.4 - array.prototype.flatmap: 1.3.2 + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 array.prototype.toreversed: 1.1.2 - array.prototype.tosorted: 1.1.3 + array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.0.18 + es-iterator-helpers: 1.2.1 eslint: 8.57.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.8 + object.entries: 1.1.9 object.fromentries: 2.0.8 object.hasown: 1.1.3 - object.values: 1.2.0 + object.values: 1.2.1 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.10 + string.prototype.matchall: 4.0.12 eslint-plugin-react@7.37.5(eslint@8.57.0): dependencies: @@ -24129,7 +23722,7 @@ snapshots: read-pkg-up: 7.0.1 regexp-tree: 0.1.27 regjsparser: 0.10.0 - semver: 7.7.2 + semver: 7.7.3 strip-indent: 3.0.0 transitivePeerDependencies: - supports-color @@ -24492,10 +24085,6 @@ snapshots: follow-redirects@1.15.11: {} - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -24574,13 +24163,6 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 @@ -24658,12 +24240,6 @@ snapshots: get-stream@8.0.1: {} - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -24682,7 +24258,7 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -24780,7 +24356,7 @@ snapshots: globalthis@1.0.4: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 + gopd: 1.2.0 globby@11.1.0: dependencies: @@ -24813,10 +24389,6 @@ snapshots: google-logging-utils@0.0.2: {} - gopd@1.0.1: - dependencies: - get-intrinsic: 1.3.0 - gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -24977,7 +24549,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -25106,12 +24678,6 @@ snapshots: optionalDependencies: '@types/node': 24.10.0 - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -25156,11 +24722,6 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.3.0 - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -25175,10 +24736,6 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - is-bigint@1.1.0: dependencies: has-bigints: 1.0.2 @@ -25187,11 +24744,6 @@ snapshots: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 @@ -25211,20 +24763,12 @@ snapshots: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - is-data-view@1.0.2: dependencies: call-bound: 1.0.4 get-intrinsic: 1.3.0 is-typed-array: 1.1.15 - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - is-date-object@1.1.0: dependencies: call-bound: 1.0.4 @@ -25240,10 +24784,6 @@ snapshots: is-extglob@2.1.1: {} - is-finalizationregistry@1.0.2: - dependencies: - call-bind: 1.0.7 - is-finalizationregistry@1.1.1: dependencies: call-bound: 1.0.4 @@ -25274,10 +24814,6 @@ snapshots: is-node-process@1.2.0: {} - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -25305,11 +24841,6 @@ snapshots: dependencies: '@types/estree': 1.0.8 - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -25319,10 +24850,6 @@ snapshots: is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 - is-shared-array-buffer@1.0.4: dependencies: call-bound: 1.0.4 @@ -25335,29 +24862,17 @@ snapshots: is-stream@3.0.0: {} - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-string@1.1.1: dependencies: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-symbol@1.0.4: - dependencies: - has-symbols: 1.1.0 - is-symbol@1.1.1: dependencies: call-bound: 1.0.4 has-symbols: 1.1.0 safe-regex-test: 1.1.0 - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.19 @@ -25368,17 +24883,13 @@ snapshots: is-weakmap@2.0.2: {} - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - is-weakref@1.1.1: dependencies: call-bound: 1.0.4 is-weakset@2.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 get-intrinsic: 1.3.0 is-what@4.1.16: {} @@ -25437,7 +24948,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.4.1 + debug: 4.4.3 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -25448,14 +24959,6 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - iterator.prototype@1.1.2: - dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.3.0 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.6 - set-function-name: 2.0.2 - iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 @@ -25722,7 +25225,7 @@ snapshots: jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) jest-util: 29.7.0 jest-validate: 29.7.0 - resolve: 1.22.10 + resolve: 1.22.11 resolve.exports: 2.0.2 slash: 3.0.0 @@ -25800,7 +25303,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -25879,12 +25382,12 @@ snapshots: jose@4.15.9: {} - jotai@2.15.0(@babel/core@7.28.4)(@babel/template@7.27.2)(@types/react@19.2.2)(react@19.2.0): + jotai@2.15.0(@babel/core@7.28.4)(@babel/template@7.27.2)(@types/react@19.2.2)(react@19.2.1): optionalDependencies: '@babel/core': 7.28.4 '@babel/template': 7.27.2 '@types/react': 19.2.2 - react: 19.2.0 + react: 19.2.1 js-tiktoken@1.0.15: dependencies: @@ -26023,10 +25526,10 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.7 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.2.0 + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 jwa@1.4.2: dependencies: @@ -26379,9 +25882,9 @@ snapshots: lru-cache@7.18.3: {} - lucide-react@0.552.0(react@19.2.0): + lucide-react@0.552.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 luxon@3.4.4: {} @@ -26437,10 +25940,10 @@ snapshots: math-intrinsics@1.1.0: {} - md-to-react-email@5.0.5(react@19.2.0): + md-to-react-email@5.0.5(react@19.2.1): dependencies: marked: 7.0.4 - react: 19.2.0 + react: 19.2.1 mdast-util-find-and-replace@3.0.1: dependencies: @@ -27186,53 +26689,53 @@ snapshots: dependencies: type-fest: 2.19.0 - next-auth@4.24.12(patch_hash=x447yy4qrylml2g7vrfko5ivki)(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(nodemailer@7.0.10)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next-auth@4.24.12(patch_hash=x447yy4qrylml2g7vrfko5ivki)(next@15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(nodemailer@7.0.10)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@babel/runtime': 7.28.4 '@panva/hkdf': 1.2.1 cookie: 0.7.2 jose: 4.15.9 - next: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) oauth: 0.9.15 openid-client: 5.7.1 preact: 10.27.2 preact-render-to-string: 5.2.6(preact@10.27.2) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) uuid: 8.3.2 optionalDependencies: nodemailer: 7.0.10 - next-query-params@5.1.0(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(use-query-params@2.2.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)): + next-query-params@5.1.0(next@15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(use-query-params@2.2.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)): dependencies: - next: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 + next: 15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 tslib: 2.8.1 - use-query-params: 2.2.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + use-query-params: 2.2.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - next-themes@0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next-themes@0.4.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@15.5.7(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - '@next/env': 15.5.4 + '@next/env': 15.5.7 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001749 + caniuse-lite: 1.0.30001754 postcss: 8.4.31 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - styled-jsx: 5.1.6(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + styled-jsx: 5.1.6(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react@19.2.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.4 - '@next/swc-darwin-x64': 15.5.4 - '@next/swc-linux-arm64-gnu': 15.5.4 - '@next/swc-linux-arm64-musl': 15.5.4 - '@next/swc-linux-x64-gnu': 15.5.4 - '@next/swc-linux-x64-musl': 15.5.4 - '@next/swc-win32-arm64-msvc': 15.5.4 - '@next/swc-win32-x64-msvc': 15.5.4 + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.47.2 sharp: 0.34.3 @@ -27310,7 +26813,7 @@ snapshots: normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.10 + resolve: 1.22.11 semver: 5.7.2 validate-npm-package-license: 3.0.4 @@ -27367,13 +26870,6 @@ snapshots: object-keys@1.1.1: {} - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - object.assign@4.1.7: dependencies: call-bind: 1.0.8 @@ -27383,12 +26879,6 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - object.entries@1.1.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - object.entries@1.1.9: dependencies: call-bind: 1.0.8 @@ -27398,27 +26888,21 @@ snapshots: object.fromentries@2.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 object.hasown@1.1.3: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.3 - - object.values@1.2.0: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-abstract: 1.24.0 object.values@1.2.1: dependencies: @@ -27604,7 +27088,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 get-uri: 6.0.5 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -28000,11 +27484,11 @@ snapshots: prexit@2.2.0: {} - prism-react-renderer@2.4.1(react@19.2.0): + prism-react-renderer@2.4.1(react@19.2.1): dependencies: '@types/prismjs': 1.26.5 clsx: 2.1.1 - react: 19.2.0 + react: 19.2.1 prisma-erd-generator@2.1.0(@babel/core@7.28.4)(@babel/template@7.27.2)(@prisma/client@6.17.1(prisma@6.17.1(typescript@5.9.2))(typescript@5.9.2))(@types/react@19.2.2)(puppeteer@19.11.1(typescript@5.9.2))(tsx@4.20.5)(yaml@2.8.1): dependencies: @@ -28108,7 +27592,7 @@ snapshots: proxy-agent@6.5.0: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -28213,55 +27697,55 @@ snapshots: defu: 6.1.4 destr: 2.0.5 - react-day-picker@8.10.1(date-fns@3.6.0)(react@19.2.0): + react-day-picker@8.10.1(date-fns@3.6.0)(react@19.2.1): dependencies: date-fns: 3.6.0 - react: 19.2.0 + react: 19.2.1 - react-day-picker@9.9.0(react@19.2.0): + react-day-picker@9.9.0(react@19.2.1): dependencies: '@date-fns/tz': 1.4.1 date-fns: 4.1.0 date-fns-jalali: 4.1.0-0 - react: 19.2.0 + react: 19.2.1 - react-dom@19.2.0(react@19.2.0): + react-dom@19.2.1(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 scheduler: 0.27.0 - react-draggable@4.5.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-draggable@4.5.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: clsx: 2.1.1 prop-types: 15.8.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - react-dropzone@14.3.8(react@19.2.0): + react-dropzone@14.3.8(react@19.2.1): dependencies: attr-accept: 2.2.5 file-selector: 2.1.2 prop-types: 15.8.1 - react: 19.2.0 + react: 19.2.1 - react-grid-layout@1.5.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-grid-layout@1.5.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: clsx: 2.1.1 fast-equals: 4.0.3 prop-types: 15.8.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - react-draggable: 4.5.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react-resizable: 3.0.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + react-draggable: 4.5.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react-resizable: 3.0.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1) resize-observer-polyfill: 1.5.1 - react-hook-form@7.62.0(react@19.2.0): + react-hook-form@7.62.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 - react-icons@5.5.0(react@19.2.0): + react-icons@5.5.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 react-is@16.13.1: {} @@ -28275,7 +27759,7 @@ snapshots: react-is@19.2.0: {} - react-markdown@10.1.0(@types/react@19.2.2)(react@19.2.0): + react-markdown@10.1.0(@types/react@19.2.2)(react@19.2.1): dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -28284,7 +27768,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.6 html-url-attributes: 3.0.1 mdast-util-to-hast: 13.2.0 - react: 19.2.0 + react: 19.2.1 remark-parse: 11.0.0 remark-rehype: 11.1.1 unified: 11.0.5 @@ -28297,76 +27781,76 @@ snapshots: dependencies: fast-deep-equal: 2.0.1 - react-remove-scroll-bar@2.3.8(@types/react@19.2.2)(react@19.2.0): + react-remove-scroll-bar@2.3.8(@types/react@19.2.2)(react@19.2.1): dependencies: - react: 19.2.0 - react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.0) + react: 19.2.1 + react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.1) tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.2 - react-remove-scroll@2.7.1(@types/react@19.2.2)(react@19.2.0): + react-remove-scroll@2.7.1(@types/react@19.2.2)(react@19.2.1): dependencies: - react: 19.2.0 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.2)(react@19.2.0) - react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.0) + react: 19.2.1 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.2)(react@19.2.1) + react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.1) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.2)(react@19.2.0) - use-sidecar: 1.1.3(@types/react@19.2.2)(react@19.2.0) + use-callback-ref: 1.3.3(@types/react@19.2.2)(react@19.2.1) + use-sidecar: 1.1.3(@types/react@19.2.2)(react@19.2.1) optionalDependencies: '@types/react': 19.2.2 - react-resizable-panels@3.0.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-resizable-panels@3.0.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - react-resizable@3.0.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-resizable@3.0.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: prop-types: 15.8.1 - react: 19.2.0 - react-draggable: 4.5.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.1 + react-draggable: 4.5.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) transitivePeerDependencies: - react-dom - react-responsive@10.0.1(react@19.2.0): + react-responsive@10.0.1(react@19.2.1): dependencies: hyphenate-style-name: 1.1.0 matchmediaquery: 0.4.2 prop-types: 15.8.1 - react: 19.2.0 + react: 19.2.1 shallow-equal: 3.1.0 - react-smooth@4.0.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-smooth@4.0.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: fast-equals: 5.2.2 prop-types: 15.8.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - react-transition-group: 4.4.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + react-transition-group: 4.4.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - react-style-singleton@2.2.3(@types/react@19.2.2)(react@19.2.0): + react-style-singleton@2.2.3(@types/react@19.2.2)(react@19.2.1): dependencies: get-nonce: 1.0.1 - react: 19.2.0 + react: 19.2.1 tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.2 - react-transition-group@4.4.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-transition-group@4.4.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@babel/runtime': 7.28.4 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - react18-json-view@0.2.8-canary.6(react@19.2.0): + react18-json-view@0.2.8-canary.6(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 - react@19.2.0: {} + react@19.2.1: {} read-cache@1.0.0: dependencies: @@ -28425,22 +27909,22 @@ snapshots: dependencies: decimal.js-light: 2.5.1 - recharts@2.15.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + recharts@2.15.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: clsx: 2.1.1 eventemitter3: 4.0.7 lodash: 4.17.21 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) react-is: 18.3.1 - react-smooth: 4.0.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react-smooth: 4.0.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1) recharts-scale: 0.4.5 tiny-invariant: 1.3.3 victory-vendor: 36.9.2 rechoir@0.6.2: dependencies: - resolve: 1.22.10 + resolve: 1.22.11 redent@3.0.0: dependencies: @@ -28464,29 +27948,12 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - reflect.getprototypeof@1.0.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - globalthis: 1.0.4 - which-builtin-type: 1.1.3 - regenerator-runtime@0.14.1: {} regexp-to-ast@0.5.0: {} regexp-tree@0.1.27: {} - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -28591,7 +28058,7 @@ snapshots: dependencies: debug: 4.4.3 module-details-from-path: 1.0.4 - resolve: 1.22.8 + resolve: 1.22.11 transitivePeerDependencies: - supports-color @@ -28618,12 +28085,6 @@ snapshots: is-core-module: 2.16.1 path-parse: 1.0.7 - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - resolve@1.22.11: dependencies: is-core-module: 2.16.1 @@ -28644,7 +28105,7 @@ snapshots: resolve@2.0.0-next.5: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -28733,13 +28194,6 @@ snapshots: dependencies: tslib: 2.8.1 - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.3.0 - has-symbols: 1.0.3 - isarray: 2.0.5 - safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -28757,12 +28211,6 @@ snapshots: es-errors: 1.3.0 isarray: 2.0.5 - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - safe-regex-test@1.1.0: dependencies: call-bound: 1.0.4 @@ -29007,7 +28455,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 socks: 2.8.7 transitivePeerDependencies: - supports-color @@ -29028,10 +28476,10 @@ snapshots: dependencies: atomic-sleep: 1.0.0 - sonner@2.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + sonner@2.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) sort-object-keys@1.1.3: {} @@ -29170,18 +28618,6 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.0 - string.prototype.matchall@4.0.10: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 - set-function-name: 2.0.2 - side-channel: 1.1.0 - string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 @@ -29213,19 +28649,6 @@ snapshots: es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.1.1 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 @@ -29235,7 +28658,7 @@ snapshots: string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -29307,10 +28730,10 @@ snapshots: dependencies: inline-style-parser: 0.2.4 - styled-jsx@5.1.6(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react@19.2.0): + styled-jsx@5.1.6(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react@19.2.1): dependencies: client-only: 0.0.1 - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@babel/core': 7.28.4 babel-plugin-macros: 3.1.0 @@ -29371,11 +28794,11 @@ snapshots: magic-string: 0.30.21 periscopic: 3.1.0 - swr@2.2.5(react@19.2.0): + swr@2.2.5(react@19.2.1): dependencies: client-only: 0.0.1 - react: 19.2.0 - use-sync-external-store: 1.5.0(react@19.2.0) + react: 19.2.1 + use-sync-external-store: 1.5.0(react@19.2.1) swrev@4.0.0: {} @@ -29463,7 +28886,7 @@ snapshots: postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.5)(yaml@2.8.1) postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 - resolve: 1.22.10 + resolve: 1.22.11 sucrase: 3.35.0 transitivePeerDependencies: - tsx @@ -29747,26 +29170,12 @@ snapshots: media-typer: 1.1.0 mime-types: 3.0.1 - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.2.0 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 @@ -29775,15 +29184,6 @@ snapshots: has-proto: 1.2.0 is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.2.0 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 @@ -29794,15 +29194,6 @@ snapshots: is-typed-array: 1.1.15 reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.2.0 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 @@ -29821,13 +29212,6 @@ snapshots: uglify-js@3.18.0: optional: true - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.1.0 - which-boxed-primitive: 1.0.2 - unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -29953,38 +29337,38 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - use-callback-ref@1.3.3(@types/react@19.2.2)(react@19.2.0): + use-callback-ref@1.3.3(@types/react@19.2.2)(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.2 - use-query-params@2.2.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + use-query-params@2.2.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) serialize-query-params: 2.0.2 - use-sidecar@1.1.3(@types/react@19.2.2)(react@19.2.0): + use-sidecar@1.1.3(@types/react@19.2.2)(react@19.2.1): dependencies: detect-node-es: 1.1.0 - react: 19.2.0 + react: 19.2.1 tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.2 - use-sync-external-store@1.4.0(react@19.2.0): + use-sync-external-store@1.4.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 - use-sync-external-store@1.5.0(react@19.2.0): + use-sync-external-store@1.5.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 - use-sync-external-store@1.6.0(react@19.2.0): + use-sync-external-store@1.6.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 util-deprecate@1.0.2: {} @@ -30013,11 +29397,11 @@ snapshots: vary@1.1.2: {} - vaul@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + vaul@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -30082,7 +29466,7 @@ snapshots: vite-node@3.2.4(@types/node@24.10.0): dependencies: cac: 6.7.14 - debug: 4.4.1 + debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 7.0.5(@types/node@24.10.0) @@ -30104,7 +29488,7 @@ snapshots: vite-node@3.2.4(@types/node@24.3.0)(jiti@2.6.1)(terser@5.44.1)(tsx@4.20.5)(yaml@2.8.1): dependencies: cac: 6.7.14 - debug: 4.4.1 + debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 7.0.5(@types/node@24.3.0)(jiti@2.6.1)(terser@5.44.1)(tsx@4.20.5)(yaml@2.8.1) @@ -30363,14 +29747,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -30379,21 +29755,6 @@ snapshots: is-string: 1.1.1 is-symbol: 1.1.1 - which-builtin-type@1.1.3: - dependencies: - 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-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - which-builtin-type@1.2.1: dependencies: call-bound: 1.0.4 @@ -30417,14 +29778,6 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.3 - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 diff --git a/web/package.json b/web/package.json index ace188627fe1..c8ecfb3b88a5 100644 --- a/web/package.json +++ b/web/package.json @@ -126,7 +126,7 @@ "lodash": "^4.17.21", "lucide-react": "^0.552.0", "nanoid": "^3.3.8", - "next": "15.5.4", + "next": "15.5.7", "next-auth": "^4.24.12", "next-query-params": "^5.1.0", "next-themes": "^0.4.6", @@ -137,9 +137,9 @@ "prisma": "^6.17.1", "protobufjs": "^7.4.0", "rate-limiter-flexible": "^5.0.3", - "react": "19.2.0", + "react": "19.2.1", "react-day-picker": "^9.9.0", - "react-dom": "19.2.0", + "react-dom": "19.2.1", "react-dropzone": "^14.3.8", "react-grid-layout": "^1.5.2", "react-hook-form": "^7.62.0", @@ -169,7 +169,7 @@ "devDependencies": { "@jedmao/location": "^3.0.0", "@mermaid-js/mermaid-cli": "^11.2.0", - "@next/bundle-analyzer": "15.5.4", + "@next/bundle-analyzer": "15.5.7", "@playwright/test": "^1.47.2", "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", @@ -195,7 +195,7 @@ "cross-env": "^7.0.3", "dotenv-cli": "^7.4.2", "eslint": "^8.56.0", - "eslint-config-next": "15.5.4", + "eslint-config-next": "15.5.7", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "node-mocks-http": "^1.14.1", diff --git a/web/src/pages/project/[projectId]/juspay-dashboard.tsx b/web/src/pages/project/[projectId]/juspay-dashboard.tsx index b23c751d771a..684d68639285 100644 --- a/web/src/pages/project/[projectId]/juspay-dashboard.tsx +++ b/web/src/pages/project/[projectId]/juspay-dashboard.tsx @@ -456,8 +456,8 @@ export default function JuspayDashboard() { const ratingsMap = new Map(); if (manualRatingsQuery.data && allTraces.length > 0) { // Create a Set of trace IDs for fast lookup - const traceIds = new Set(allTraces.map(t => t.id)); - + const traceIds = new Set(allTraces.map((t) => t.id)); + manualRatingsQuery.data.forEach((rating) => { // Only include rating if the trace exists in current date range if (traceIds.has(rating.traceId)) { From 29e3e33ad8199de7bb726d65d2ed54ce9ba1ea68 Mon Sep 17 00:00:00 2001 From: Aman Srivastava Date: Fri, 19 Dec 2025 16:25:34 +0530 Subject: [PATCH 20/21] fix parsing issue (Bad escaped character in JSON) --- .../project/[projectId]/juspay-dashboard.tsx | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/web/src/pages/project/[projectId]/juspay-dashboard.tsx b/web/src/pages/project/[projectId]/juspay-dashboard.tsx index 684d68639285..a21fd034d629 100644 --- a/web/src/pages/project/[projectId]/juspay-dashboard.tsx +++ b/web/src/pages/project/[projectId]/juspay-dashboard.tsx @@ -3790,6 +3790,34 @@ function TraceMessage({ // Parse if it's a string if (typeof parsed === "string") { parsed = JSON.parse(parsed); + // Check if it's still a string (double-stringified) + if (typeof parsed === "string") { + parsed = JSON.parse(parsed); + } + } + + // IMPORTANT: Parse outcome.output if it's a string (double-stringified at nested level) + if (parsed.outcome?.output && typeof parsed.outcome.output === "string") { + // Check if it starts with { or [ (likely JSON) + const trimmed = parsed.outcome.output.trim(); + if (trimmed.startsWith("{") || trimmed.startsWith("[")) { + try { + // Try to parse as JSON - but handle malformed escape sequences first + // Some strings may have invalid escape sequences like \_ which are not valid JSON + let sanitizedOutput = parsed.outcome.output; + sanitizedOutput = sanitizedOutput.replace( + /\\([^"\\\/bfnrtu])/g, + "$1", + ); + parsed.outcome.output = JSON.parse(sanitizedOutput); + } catch (e) { + // If parsing fails, treat the string itself as the text content + parsed.outcome.output = { text: parsed.outcome.output }; + } + } else { + // It's plain text (markdown), not JSON - wrap it directly + parsed.outcome.output = { text: parsed.outcome.output }; + } } // Try 1: Extract outcome.output.text with replacements FIRST @@ -3819,7 +3847,11 @@ function TraceMessage({ if (typeof parsed.outcome.output === "string") { return { text: parsed.outcome.output, isJson: false }; } - // If outcome.output is an object, return as JSON + // If outcome.output is an object with text field, extract it + else if (parsed.outcome.output.text) { + return { text: parsed.outcome.output.text, isJson: false }; + } + // If outcome.output is an object without text, return as JSON else { return { json: parsed.outcome.output, isJson: true }; } From 577ac637ff073189103081bb26c652207c317d97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 31 Jan 2026 07:02:19 +0000 Subject: [PATCH 21/21] chore(deps): bump next from 15.5.7 to 16.1.5 in /web Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 16.1.5. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v16.1.5) --- updated-dependencies: - dependency-name: next dependency-version: 16.1.5 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- web/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/package.json b/web/package.json index c8ecfb3b88a5..520e1064ef6f 100644 --- a/web/package.json +++ b/web/package.json @@ -126,7 +126,7 @@ "lodash": "^4.17.21", "lucide-react": "^0.552.0", "nanoid": "^3.3.8", - "next": "15.5.7", + "next": "16.1.5", "next-auth": "^4.24.12", "next-query-params": "^5.1.0", "next-themes": "^0.4.6",