From b4980135f8a7dce6f5d648c2308a85e9e650c71c Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sun, 31 Aug 2025 13:10:32 -0400 Subject: [PATCH 01/48] update grove yml and .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 0835549af..33b165249 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,6 @@ hail-*.log # Reads metadata databases reads/*.db + +.grove +.grove-worktrees From 71daf62a76b2fc66b857169aaa798c31e50243ea Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sun, 31 Aug 2025 13:14:43 -0400 Subject: [PATCH 02/48] feat: Add gnomAD Assistant powered by CopilotKit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is the first implementation of gnomAD Assistant, an AI-powered chat interface that helps users navigate and explore the gnomAD database. Key changes: - Created separate CopilotKit server to avoid GraphQL conflicts - Added CopilotKit React dependencies to browser - Integrated CopilotSidebar component with variant navigation action - Added Copilot button to navigation bar - Connected to gmd MCP tool server for gnomAD-specific functionality - Updated pnpm-lock.yaml with new dependencies The assistant can currently: - Navigate to variant pages based on variant IDs or rsIDs - Use the gmd tool server for additional gnomAD queries 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- browser/package.json | 3 + browser/src/App.tsx | 98 ++++++++++++------- browser/src/CopilotSidebar.tsx | 73 ++++++++++++++ browser/src/NavBar.tsx | 13 ++- copilotkit-server/package.json | 15 +++ copilotkit-server/src/mcp-client.ts | 87 ++++++++++++++++ copilotkit-server/src/server.ts | 71 ++++++++++++++ copilotkit-server/start.sh | 9 ++ .../src/queries/clinvar-variant-queries.ts | 2 +- pnpm-workspace.yaml | 1 + 10 files changed, 334 insertions(+), 38 deletions(-) create mode 100644 browser/src/CopilotSidebar.tsx create mode 100644 copilotkit-server/package.json create mode 100644 copilotkit-server/src/mcp-client.ts create mode 100644 copilotkit-server/src/server.ts create mode 100755 copilotkit-server/start.sh diff --git a/browser/package.json b/browser/package.json index baadd8fa7..ca0a0215e 100644 --- a/browser/package.json +++ b/browser/package.json @@ -21,6 +21,9 @@ "@gnomad/track-transcripts": "4.0.0", "@gnomad/track-variants": "3.0.0", "@gnomad/ui": "^3.0.0", + "@copilotkit/react-core": "^1.0.0", + "@copilotkit/react-ui": "^1.0.0", + "@copilotkit/react-textarea": "^1.0.0", "@visx/axis": "^3.0.0", "@visx/group": "^3.0.0", "@visx/legend": "^3.12.0", diff --git a/browser/src/App.tsx b/browser/src/App.tsx index 3edcd1a6f..7c8423014 100644 --- a/browser/src/App.tsx +++ b/browser/src/App.tsx @@ -1,6 +1,8 @@ import React, { Suspense, lazy, useEffect, useState } from 'react' import { BrowserRouter as Router, Route, useLocation } from 'react-router-dom' import styled from 'styled-components' +import { CopilotKit } from '@copilotkit/react-core' +import '@copilotkit/react-ui/styles.css' import Delayed from './Delayed' import ErrorBoundary from './ErrorBoundary' @@ -8,6 +10,7 @@ import ErrorBoundary from './ErrorBoundary' import Notifications, { showNotification } from './Notifications' import StatusMessage from './StatusMessage' import userPreferences from './userPreferences' +import GnomadCopilotSidebar from './CopilotSidebar' const NavBar = lazy(() => import('./NavBar')) const Routes = lazy(() => import('./Routes')) @@ -69,10 +72,23 @@ const Banner = styled.div` } ` +const MainContentWrapper = styled.div` + display: flex; + height: calc(100vh - 64px); // Assuming navbar height + overflow: hidden; +` + +const ContentArea = styled.div` + flex: 1; + overflow-y: auto; +` + const BANNER_CONTENT = null const App = () => { const [isLoading, setIsLoading] = useState(true) + const [isChatOpen, setIsChatOpen] = useState(false) + useEffect(() => { userPreferences.loadPreferences().then( () => { @@ -90,43 +106,53 @@ const App = () => { }, []) return ( - - {/* On any navigation, send event to Google Analytics. */} - - - {/** - * On any navigation, scroll to the anchor specified by location fragment (if any) or to the top of the page. - * If the page's module is already loaded, scrolling is handled by this router's render function. If the page's - * module is loaded by Suspense, scrolling is handled by the useEffect hook in the PageLoading component. - */} - { - scrollToAnchorOrStartOfPage(location) - return null - }} - /> - - - {isLoading ? ( - - Loading - - ) : ( - - - - {BANNER_CONTENT && {BANNER_CONTENT}} - - - - }> - + + + {/* On any navigation, send event to Google Analytics. */} + + + {/** + * On any navigation, scroll to the anchor specified by location fragment (if any) or to the top of the page. + * If the page's module is already loaded, scrolling is handled by this router's render function. If the page's + * module is loaded by Suspense, scrolling is handled by the useEffect hook in the PageLoading component. + */} + { + scrollToAnchorOrStartOfPage(location) + return null + }} + /> + + + {isLoading ? ( + + Loading + + ) : ( + + + setIsChatOpen(true)} /> + {BANNER_CONTENT && {BANNER_CONTENT}} + + + + + + }> + + + + setIsChatOpen(false)} + /> + - - )} - - + )} + + + ) } diff --git a/browser/src/CopilotSidebar.tsx b/browser/src/CopilotSidebar.tsx new file mode 100644 index 000000000..e4e4d311b --- /dev/null +++ b/browser/src/CopilotSidebar.tsx @@ -0,0 +1,73 @@ +import React, { useEffect, useRef } from 'react' +import { useCopilotAction } from '@copilotkit/react-core' +import { CopilotSidebar } from '@copilotkit/react-ui' +import { useHistory } from 'react-router-dom' + +interface CopilotSidebarProps { + isOpen: boolean + onClose: () => void +} + +const GnomadCopilotSidebar: React.FC = ({ isOpen, onClose }) => { + const history = useHistory() + const prevIsOpen = useRef(isOpen) + + useCopilotAction({ + name: 'navigateToVariantPage', + description: 'Navigate to the gnomAD variant page for a given variant ID.', + parameters: [ + { + name: 'variantId', + type: 'string', + description: "The variant ID, such as '1-55516888-G-GA' or an rsID like 'rs527413419'.", + required: true, + }, + { + name: 'datasetId', + type: 'string', + description: `The dataset ID to use, for example 'gnomad_r4'. If not provided, the current dataset will be used.`, + required: false, + }, + ], + handler: async ({ variantId, datasetId }) => { + // Get the current dataset from the URL if not provided + const currentUrl = new URL(window.location.href) + const currentDatasetId = currentUrl.searchParams.get('dataset') || 'gnomad_r4' + const targetDatasetId = datasetId || currentDatasetId + + const url = `/variant/${variantId}?dataset=${targetDatasetId}` + console.log(`Navigating to: ${url}`) + history.push(url) + + return { + message: `Navigating to the variant page for ${variantId}.`, + } + }, + }) + + // Handle the open/close logic manually + useEffect(() => { + if (prevIsOpen.current && !isOpen) { + // Sidebar was closed + onClose() + } + prevIsOpen.current = isOpen + }, [isOpen, onClose]) + + return ( + { + if (!open) { + onClose() + } + }} + labels={{ + title: "gnomAD Assistant", + initial: "Hello! How can I help you explore gnomAD's data?", + }} + /> + ) +} + +export default GnomadCopilotSidebar \ No newline at end of file diff --git a/browser/src/NavBar.tsx b/browser/src/NavBar.tsx index 52a5fafde..0e520fd53 100644 --- a/browser/src/NavBar.tsx +++ b/browser/src/NavBar.tsx @@ -79,7 +79,11 @@ const Menu = styled.ul` } ` -const NavBar = () => { +interface NavBarProps { + onOpenChat?: () => void +} + +const NavBar = ({ onOpenChat }: NavBarProps) => { const [isMenuExpanded, setIsMenuExpanded] = useState(false) const toggleMenu = useCallback(() => { setIsMenuExpanded((previousValue) => !previousValue) @@ -160,6 +164,13 @@ const NavBar = () => { Help/FAQ + {onOpenChat && ( +
  • + { e.preventDefault(); closeMenu(); onOpenChat(); }}> + Copilot + +
  • + )} ) diff --git a/copilotkit-server/package.json b/copilotkit-server/package.json new file mode 100644 index 000000000..66775f66f --- /dev/null +++ b/copilotkit-server/package.json @@ -0,0 +1,15 @@ +{ + "name": "@gnomad/copilotkit-server", + "version": "1.0.0", + "private": true, + "dependencies": { + "@copilotkit/runtime": "^1.10.3", + "@google/generative-ai": "^0.21.0", + "@modelcontextprotocol/sdk": "^1.17.4", + "@types/cors": "^2.8.13", + "@types/express": "^4.17.17", + "cors": "^2.8.5", + "express": "^4.20.0", + "typescript": "^5.0.4" + } +} \ No newline at end of file diff --git a/copilotkit-server/src/mcp-client.ts b/copilotkit-server/src/mcp-client.ts new file mode 100644 index 000000000..bcac34c46 --- /dev/null +++ b/copilotkit-server/src/mcp-client.ts @@ -0,0 +1,87 @@ +import { Client } from "@modelcontextprotocol/sdk/client/index.js"; +import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"; +import { MCPClient, MCPTool } from "@copilotkit/runtime"; + +export class LocalMCPClient implements MCPClient { + private client!: Client; + private connected = false; + + constructor(private config: { command: string; args: string[]; env?: Record }) {} + + async connect(): Promise { + // Build environment variables, filtering out undefined values + const env: Record = {}; + + // Add process.env values, filtering undefined + for (const [key, value] of Object.entries(process.env)) { + if (value !== undefined) { + env[key] = value; + } + } + + // Add config env values, overriding process.env + if (this.config.env) { + Object.assign(env, this.config.env); + } + + const transport = new StdioClientTransport({ + command: this.config.command, + args: this.config.args, + env, + }); + + this.client = new Client( + { + name: "copilotkit-client", + version: "1.0.0", + }, + { + capabilities: {}, + } + ); + + await this.client.connect(transport); + this.connected = true; + } + + async tools(): Promise> { + if (!this.connected) { + await this.connect(); + } + + const response = await this.client.listTools(); + const toolsMap: Record = {}; + + for (const tool of response.tools) { + // Convert MCP tool schema to CopilotKit MCPTool schema format + const schema = tool.inputSchema ? { + parameters: { + properties: (tool.inputSchema as any).properties || {}, + required: (tool.inputSchema as any).required || [], + jsonSchema: tool.inputSchema + } + } : undefined; + + toolsMap[tool.name] = { + description: tool.description, + schema, + execute: async (args: any) => { + const result = await this.client.callTool({ + name: tool.name, + arguments: args, + }); + return result.content; + }, + }; + } + + return toolsMap; + } + + async close(): Promise { + if (this.connected) { + await this.client.close(); + this.connected = false; + } + } +} \ No newline at end of file diff --git a/copilotkit-server/src/server.ts b/copilotkit-server/src/server.ts new file mode 100644 index 000000000..2634c9257 --- /dev/null +++ b/copilotkit-server/src/server.ts @@ -0,0 +1,71 @@ +import express from 'express'; +import cors from 'cors'; +import { + CopilotRuntime, + GoogleGenerativeAIAdapter, + copilotRuntimeNodeHttpEndpoint, +} from '@copilotkit/runtime'; +import { LocalMCPClient } from './mcp-client'; + +const app = express(); + +// Enable CORS for the browser +app.use(cors({ + origin: ['http://localhost:8008', 'http://localhost:8010'], + credentials: true +})); + +const serviceAdapter = new GoogleGenerativeAIAdapter({ + model: "gemini-1.5-flash-latest", + apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY || "", +}); + +// Configure the MCP server command. +// Assumes the 'gmd' binary is installed in PATH +const mcpConfig = { + command: "gmd", + args: ["mcp", "serve"], + env: { + GNOMAD_API_URL: process.env.GNOMAD_API_URL || "https://gnomad.broadinstitute.org/api" + } +}; + +// Create runtime with MCP support +const runtime = new CopilotRuntime({ + // Function to create MCP clients based on configuration + createMCPClient: async (config) => { + // For local MCP servers, use the stdio client + if (config.endpoint === "local://gnomad") { + const client = new LocalMCPClient(mcpConfig); + await client.connect(); + return client; + } + throw new Error(`Unsupported MCP endpoint: ${config.endpoint}`); + }, + + // Configure which MCP servers are available + mcpServers: [ + { + endpoint: "local://gnomad", + apiKey: undefined, // Not needed for local servers + } + ] +}); + +app.use('/api/copilotkit', (req, res, next) => { + (async () => { + const handler = copilotRuntimeNodeHttpEndpoint({ + endpoint: '/api/copilotkit', + runtime, + serviceAdapter, + }); + + return handler(req, res); + })().catch(next); +}); + +const PORT = process.env.COPILOTKIT_PORT || 4001; + +app.listen(PORT, () => { + console.log(`CopilotKit server listening on http://localhost:${PORT}/api/copilotkit`); +}); diff --git a/copilotkit-server/start.sh b/copilotkit-server/start.sh new file mode 100755 index 000000000..010208c1a --- /dev/null +++ b/copilotkit-server/start.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +export NODE_ENV=${NODE_ENV:-development} + +if [[ $NODE_ENV == "development" ]]; then + npx ts-node src/server.ts +else + node dist/server.js +fi \ No newline at end of file diff --git a/graphql-api/src/queries/clinvar-variant-queries.ts b/graphql-api/src/queries/clinvar-variant-queries.ts index 97922efc4..d79bfba3c 100644 --- a/graphql-api/src/queries/clinvar-variant-queries.ts +++ b/graphql-api/src/queries/clinvar-variant-queries.ts @@ -25,7 +25,7 @@ const _fetchClinvarReleaseDate = async (esClient: any) => { fetchIndexMetadata(esClient, CLINVAR_VARIANT_INDICES.GRCh38), ]) - const releaseDates = metadata.map((m) => m.table_globals.clinvar_release_date) + const releaseDates = metadata.map((m: any) => m.table_globals.clinvar_release_date) if (releaseDates[0] !== releaseDates[1]) { logger.error({ diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0f93eb7d7..cefb9b2ac 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - 'browser' + - 'copilotkit-server' - 'dataset-metadata' - 'graphql-api' - 'reads' From 89e3499097361aa1c2cc3f9cc9b4ad82b120145d Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Tue, 2 Sep 2025 11:25:51 -0400 Subject: [PATCH 03/48] feat: Replace floating sidebar with resizable split-screen layout for gnomAD Assistant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Create new GnomadCopilot component with non-floating layout - Chat panel takes up 1/3 of screen by default (was 50%) - Add resizable functionality with drag handle - Remove Copilot menu item from navbar - Increase chat input font size to 14px - Update initial greeting message The assistant now integrates better with the page layout and provides a more intuitive user experience with adjustable panel width. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- browser/src/App.tsx | 40 ++----- browser/src/GnomadCopilot.tsx | 196 ++++++++++++++++++++++++++++++++++ browser/src/NavBar.tsx | 13 +-- 3 files changed, 208 insertions(+), 41 deletions(-) create mode 100644 browser/src/GnomadCopilot.tsx diff --git a/browser/src/App.tsx b/browser/src/App.tsx index 7c8423014..3e909e44f 100644 --- a/browser/src/App.tsx +++ b/browser/src/App.tsx @@ -10,7 +10,7 @@ import ErrorBoundary from './ErrorBoundary' import Notifications, { showNotification } from './Notifications' import StatusMessage from './StatusMessage' import userPreferences from './userPreferences' -import GnomadCopilotSidebar from './CopilotSidebar' +import { GnomadCopilot } from './GnomadCopilot' const NavBar = lazy(() => import('./NavBar')) const Routes = lazy(() => import('./Routes')) @@ -72,22 +72,11 @@ const Banner = styled.div` } ` -const MainContentWrapper = styled.div` - display: flex; - height: calc(100vh - 64px); // Assuming navbar height - overflow: hidden; -` - -const ContentArea = styled.div` - flex: 1; - overflow-y: auto; -` const BANNER_CONTENT = null const App = () => { const [isLoading, setIsLoading] = useState(true) - const [isChatOpen, setIsChatOpen] = useState(false) useEffect(() => { userPreferences.loadPreferences().then( @@ -131,23 +120,16 @@ const App = () => { ) : ( - - setIsChatOpen(true)} /> - {BANNER_CONTENT && {BANNER_CONTENT}} - - - - - - }> - - - - setIsChatOpen(false)} - /> - + + + + {BANNER_CONTENT && {BANNER_CONTENT}} + + + }> + + + )} diff --git a/browser/src/GnomadCopilot.tsx b/browser/src/GnomadCopilot.tsx new file mode 100644 index 000000000..4c5b0f26d --- /dev/null +++ b/browser/src/GnomadCopilot.tsx @@ -0,0 +1,196 @@ +import React, { useState, useRef, useCallback } from 'react' +import styled from 'styled-components' +import { CopilotChat } from '@copilotkit/react-ui' +import { useCopilotAction } from '@copilotkit/react-core' +import { useHistory } from 'react-router-dom' +import { useGnomadCopilotActions } from './hooks/useGnomadCopilotActions' +import '@copilotkit/react-ui/styles.css' + +const PageContainer = styled.div` + display: flex; + height: 100vh; + width: 100%; + overflow: hidden; + position: relative; +` + +const MainContent = styled.div` + flex: 1; + overflow: auto; + display: flex; + flex-direction: column; + min-width: 300px; +` + +const ChatPanel = styled.div<{ width: number }>` + width: ${(props) => props.width}px; + overflow: hidden; + display: flex; + flex-direction: column; + background: white; + min-width: 300px; + max-width: 80%; +` + +const ResizeHandle = styled.div` + width: 4px; + background-color: #e0e0e0; + cursor: col-resize; + flex-shrink: 0; + transition: background-color 0.2s; + + &:hover { + background-color: #0d79d0; + } + + &:active { + background-color: #0d79d0; + } +` + +const ToggleButton = styled.button` + position: fixed; + bottom: 24px; + right: 24px; + z-index: 1000; + padding: 12px 24px; + border-radius: 8px; + border: 1px solid #ddd; + background-color: #fff; + color: #333; + font-size: 16px; + font-weight: 500; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + cursor: pointer; + transition: all 0.2s ease-in-out; + + &:hover { + background-color: #f7f7f7; + box-shadow: 0 6px 16px rgba(0, 0, 0, 0.12); + } +` + +const StyledCopilotChat = styled(CopilotChat)` + height: 100%; + --copilot-kit-primary-color: #0d79d0; + --copilot-kit-background-color: white; + --copilot-kit-header-background: #f7f7f7; + + /* Increase font size in the chat input textarea */ + textarea { + font-size: 14px !important; + } + + /* Also apply to any input fields */ + input[type="text"] { + font-size: 14px !important; + } +` + +export function GnomadCopilot({ children }: { children: React.ReactNode }) { + const [isChatOpen, setIsChatOpen] = useState(false) + const [chatWidth, setChatWidth] = useState(window.innerWidth / 3) // Default to 1/3 of screen + const isResizing = useRef(false) + const containerRef = useRef(null) + const history = useHistory() + + // Initialize gnomAD-specific copilot actions + useGnomadCopilotActions() + + useCopilotAction({ + name: 'navigateToVariantPage', + description: 'Navigate to the gnomAD variant page for a given variant ID.', + parameters: [ + { + name: 'variantId', + type: 'string', + description: "The variant ID, such as '1-55516888-G-GA' or an rsID like 'rs527413419'.", + required: true, + }, + { + name: 'datasetId', + type: 'string', + description: `The dataset ID to use, for example 'gnomad_r4'. If not provided, the current dataset will be used.`, + required: false, + }, + ], + handler: async ({ variantId, datasetId }) => { + // Get the current dataset from the URL if not provided + const currentUrl = new URL(window.location.href) + const currentDatasetId = currentUrl.searchParams.get('dataset') || 'gnomad_r4' + const targetDatasetId = datasetId || currentDatasetId + + const url = `/variant/${variantId}?dataset=${targetDatasetId}` + console.log(`Navigating to: ${url}`) + history.push(url) + + return { + message: `Navigating to the variant page for ${variantId}.`, + } + }, + }) + + const handleMouseDown = useCallback((e: React.MouseEvent) => { + isResizing.current = true + document.body.style.cursor = 'col-resize' + document.body.style.userSelect = 'none' + }, []) + + const handleMouseMove = useCallback((e: MouseEvent) => { + if (!isResizing.current || !containerRef.current) return + + const containerRect = containerRef.current.getBoundingClientRect() + const newWidth = containerRect.right - e.clientX + + // Ensure width stays within bounds + const minWidth = 300 + const maxWidth = containerRect.width * 0.8 + + if (newWidth >= minWidth && newWidth <= maxWidth) { + setChatWidth(newWidth) + } + }, []) + + const handleMouseUp = useCallback(() => { + isResizing.current = false + document.body.style.cursor = '' + document.body.style.userSelect = '' + }, []) + + React.useEffect(() => { + if (isChatOpen) { + document.addEventListener('mousemove', handleMouseMove) + document.addEventListener('mouseup', handleMouseUp) + + return () => { + document.removeEventListener('mousemove', handleMouseMove) + document.removeEventListener('mouseup', handleMouseUp) + } + } + }, [isChatOpen, handleMouseMove, handleMouseUp]) + + return ( + <> + + {children} + {isChatOpen && ( + <> + + + + + + )} + + + setIsChatOpen(!isChatOpen)}> + {isChatOpen ? 'Close Assistant' : 'Ask gnomAD Assistant'} + + + ) +} \ No newline at end of file diff --git a/browser/src/NavBar.tsx b/browser/src/NavBar.tsx index 0e520fd53..52a5fafde 100644 --- a/browser/src/NavBar.tsx +++ b/browser/src/NavBar.tsx @@ -79,11 +79,7 @@ const Menu = styled.ul` } ` -interface NavBarProps { - onOpenChat?: () => void -} - -const NavBar = ({ onOpenChat }: NavBarProps) => { +const NavBar = () => { const [isMenuExpanded, setIsMenuExpanded] = useState(false) const toggleMenu = useCallback(() => { setIsMenuExpanded((previousValue) => !previousValue) @@ -164,13 +160,6 @@ const NavBar = ({ onOpenChat }: NavBarProps) => { Help/FAQ - {onOpenChat && ( -
  • - { e.preventDefault(); closeMenu(); onOpenChat(); }}> - Copilot - -
  • - )} ) From 101d419b12fbeae104ceb4f1d97e0b26d6db9b98 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Tue, 2 Sep 2025 11:30:26 -0400 Subject: [PATCH 04/48] feat: Add CopilotKit context awareness and variant display support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add page context tracking to DocumentTitle using useCopilotReadable - Pass gene/variant context from GenePage and VariantPage to assistant - Add useGnomadCopilotActions hook for displaying variant data in chat - Add styles for chat components to properly display tables and data This enables the assistant to understand what the user is viewing and display rich data components directly in the chat interface. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- browser/src/DocumentTitle.ts | 39 +++- browser/src/GenePage/GenePage.tsx | 2 +- browser/src/VariantPage/VariantPage.tsx | 9 +- browser/src/hooks/useGnomadCopilotActions.tsx | 202 ++++++++++++++++++ browser/src/styles/chatComponents.css | 57 +++++ 5 files changed, 306 insertions(+), 3 deletions(-) create mode 100644 browser/src/hooks/useGnomadCopilotActions.tsx create mode 100644 browser/src/styles/chatComponents.css diff --git a/browser/src/DocumentTitle.ts b/browser/src/DocumentTitle.ts index 651d8ed60..cad700ee9 100644 --- a/browser/src/DocumentTitle.ts +++ b/browser/src/DocumentTitle.ts @@ -1,20 +1,57 @@ import PropTypes from 'prop-types' import { useEffect } from 'react' +import { useCopilotReadable } from '@copilotkit/react-core' -const DocumentTitle = ({ title }: any) => { +const DocumentTitle = ({ title, pageContext }: any) => { useEffect(() => { const fullTitle = title ? `${title} | gnomAD` : 'gnomAD' document.title = fullTitle }, [title]) + + let contextDescription = 'The current page context' + let contextValue = 'No context is available for the current page.' + + if (pageContext) { + if (pageContext.gene_id && pageContext.symbol) { + contextDescription = 'The currently viewed gene' + const geneContext = { + gene_id: pageContext.gene_id, + symbol: pageContext.symbol, + name: pageContext.name, + reference_genome: pageContext.reference_genome, + } + contextValue = JSON.stringify(geneContext, null, 2) + } else if (pageContext.variant_id) { + contextDescription = 'The currently viewed variant' + const variantContext = { + variant_id: pageContext.variant_id, + reference_genome: pageContext.reference_genome, + caid: pageContext.caid, + rsids: pageContext.rsids, + } + contextValue = JSON.stringify(variantContext, null, 2) + } else { + // Fallback for other contexts that might be passed + contextValue = JSON.stringify(pageContext, null, 2) + } + } + + useCopilotReadable({ + description: contextDescription, + value: contextValue, + }) + return null } DocumentTitle.propTypes = { title: PropTypes.string, + pageContext: PropTypes.object, } DocumentTitle.defaultProps = { title: null, + pageContext: null, } export default DocumentTitle diff --git a/browser/src/GenePage/GenePage.tsx b/browser/src/GenePage/GenePage.tsx index f8acc4a15..5e0ff0acf 100644 --- a/browser/src/GenePage/GenePage.tsx +++ b/browser/src/GenePage/GenePage.tsx @@ -362,7 +362,7 @@ const GenePage = ({ datasetId, gene, geneId }: Props) => { return ( - + { const gene = { ensembleId: '' } + const [variantData, setVariantData] = React.useState(null) + return ( // @ts-expect-error TS(2746) FIXME: This JSX tag's 'children' prop expects a single ch... Remove this comment to see the full error message - + { gene.ensembleId = geneData.ensembleId } + // Update variant data for CopilotKit context + if (variantData?.variant_id !== variant.variant_id) { + setVariantData(variant) + } + pageContent = } diff --git a/browser/src/hooks/useGnomadCopilotActions.tsx b/browser/src/hooks/useGnomadCopilotActions.tsx new file mode 100644 index 000000000..d0da55a16 --- /dev/null +++ b/browser/src/hooks/useGnomadCopilotActions.tsx @@ -0,0 +1,202 @@ +import React from 'react' +import { useCopilotAction } from '@copilotkit/react-core' +import { GnomadVariantOccurrenceTable } from '../VariantPage/VariantOccurrenceTable' +import { Variant } from '../VariantPage/VariantPage' +import { DatasetId } from '@gnomad/dataset-metadata/metadata' + +// Function to transform snake_case API data to camelCase props expected by VariantOccurrenceTable +const adaptApiDataToComponentProps = (apiData: any): Variant => { + // Transform the top-level variant data + const variant: Variant = { + variant_id: apiData.variant_id || apiData.variantId, + reference_genome: apiData.reference_genome || apiData.referenceGenome || 'GRCh38', + colocated_variants: apiData.colocated_variants || apiData.colocatedVariants || null, + faf95_joint: apiData.faf95_joint || apiData.faf95Joint || { popmax: null, popmax_population: null }, + chrom: apiData.chrom || apiData.chromosome, + pos: apiData.pos || apiData.position, + ref: apiData.ref || apiData.reference, + alt: apiData.alt || apiData.alternate, + flags: apiData.flags || null, + clinvar: apiData.clinvar || null, + exome: apiData.exome ? { + ac: apiData.exome.ac || 0, + an: apiData.exome.an || 0, + homozygote_count: apiData.exome.homozygote_count || apiData.exome.nhomalt || 0, + hemizygote_count: apiData.exome.hemizygote_count || 0, + ac_hom: apiData.exome.ac_hom || apiData.exome.nhomalt || 0, + ac_hemi: apiData.exome.ac_hemi || 0, + faf95: apiData.exome.faf95 || { popmax: null, popmax_population: null }, + filters: apiData.exome.filters || [], + populations: apiData.exome.populations || [], + age_distribution: apiData.exome.age_distribution || null, + flags: apiData.exome.flags || null, + quality_metrics: { + allele_balance: { + alt: apiData.exome.quality_metrics?.allele_balance?.alt || { + bin_edges: [], + bin_freq: [], + n_smaller: 0, + n_larger: 0 + } + }, + genotype_depth: { + all: apiData.exome.quality_metrics?.genotype_depth?.all || { + bin_edges: [], + bin_freq: [], + n_smaller: 0, + n_larger: 0 + }, + alt: apiData.exome.quality_metrics?.genotype_depth?.alt || { + bin_edges: [], + bin_freq: [], + n_smaller: 0, + n_larger: 0 + } + }, + genotype_quality: { + all: apiData.exome.quality_metrics?.genotype_quality?.all || { + bin_edges: [], + bin_freq: [], + n_smaller: 0, + n_larger: 0 + }, + alt: apiData.exome.quality_metrics?.genotype_quality?.alt || { + bin_edges: [], + bin_freq: [], + n_smaller: 0, + n_larger: 0 + } + }, + site_quality_metrics: apiData.exome.quality_metrics?.site_quality_metrics || [] + }, + local_ancestry_populations: apiData.exome.local_ancestry_populations || [] + } : null, + genome: apiData.genome ? { + ac: apiData.genome.ac || 0, + an: apiData.genome.an || 0, + homozygote_count: apiData.genome.homozygote_count || apiData.genome.nhomalt || 0, + hemizygote_count: apiData.genome.hemizygote_count || 0, + ac_hom: apiData.genome.ac_hom || apiData.genome.nhomalt || 0, + ac_hemi: apiData.genome.ac_hemi || 0, + faf95: apiData.genome.faf95 || { popmax: null, popmax_population: null }, + filters: apiData.genome.filters || [], + populations: apiData.genome.populations || [], + age_distribution: apiData.genome.age_distribution || null, + flags: apiData.genome.flags || null, + quality_metrics: { + allele_balance: { + alt: apiData.genome.quality_metrics?.allele_balance?.alt || { + bin_edges: [], + bin_freq: [], + n_smaller: 0, + n_larger: 0 + } + }, + genotype_depth: { + all: apiData.genome.quality_metrics?.genotype_depth?.all || { + bin_edges: [], + bin_freq: [], + n_smaller: 0, + n_larger: 0 + }, + alt: apiData.genome.quality_metrics?.genotype_depth?.alt || { + bin_edges: [], + bin_freq: [], + n_smaller: 0, + n_larger: 0 + } + }, + genotype_quality: { + all: apiData.genome.quality_metrics?.genotype_quality?.all || { + bin_edges: [], + bin_freq: [], + n_smaller: 0, + n_larger: 0 + }, + alt: apiData.genome.quality_metrics?.genotype_quality?.alt || { + bin_edges: [], + bin_freq: [], + n_smaller: 0, + n_larger: 0 + } + }, + site_quality_metrics: apiData.genome.quality_metrics?.site_quality_metrics || [] + }, + local_ancestry_populations: apiData.genome.local_ancestry_populations || [] + } : null, + joint: apiData.joint || null, + lof_curations: apiData.lof_curations || null, + in_silico_predictors: apiData.in_silico_predictors || null, + transcript_consequences: apiData.transcript_consequences || null, + liftover: apiData.liftover || null, + liftover_sources: apiData.liftover_sources || null, + multi_nucleotide_variants: apiData.multi_nucleotide_variants, + caid: apiData.caid || null, + rsids: apiData.rsids || null, + coverage: { + exome: apiData.coverage?.exome || null, + genome: apiData.coverage?.genome || null + }, + non_coding_constraint: apiData.non_coding_constraint || null + } + + return variant +} + +export function useGnomadCopilotActions() { + useCopilotAction({ + name: 'showVariantInfo', + description: 'Fetches and displays a summary of population frequencies for a specific gnomAD variant.', + parameters: [ + { + name: 'variantId', + type: 'string', + description: 'The variant ID, e.g., 1-55051215-G-GA or an rsID.', + required: true, + }, + ], + handler: async ({ variantId }) => { + // In a real implementation, you would get the current dataset from your app's state management + const currentUrl = new URL(window.location.href) + const datasetId = currentUrl.searchParams.get('dataset') || 'gnomad_r4' + + // The handler's return value is sent to the backend, which will execute the corresponding MCP tool. + return { variantId, dataset: datasetId } + }, + render: ({ status, result }) => { + if (status === 'inProgress') { + return ( +
    +
    +
    Fetching variant data...
    +
    Loading population frequencies
    +
    +
    + ) + } + + if (status === 'complete' && result) { + const variantData = adaptApiDataToComponentProps(result) + // Get the current dataset from URL for display purposes + const currentUrl = new URL(window.location.href) + const datasetId = (currentUrl.searchParams.get('dataset') || 'gnomad_r4') as DatasetId + + return ( +
    +

    + Occurrence Data for {result.variant_id || result.variantId} +

    + +
    + ) + } + + return <> // Return empty React fragment instead of null + }, + }) +} \ No newline at end of file diff --git a/browser/src/styles/chatComponents.css b/browser/src/styles/chatComponents.css new file mode 100644 index 000000000..f9ff16ab4 --- /dev/null +++ b/browser/src/styles/chatComponents.css @@ -0,0 +1,57 @@ +/* Styles for components rendered in the chat sidebar */ +.chat-component-container { + max-width: 100%; + padding: 0.5rem; + background-color: white; + border-radius: 0.5rem; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1); + margin-bottom: 1rem; + border: 1px solid #e5e7eb; +} + +/* Make tables scrollable horizontally in the narrow chat pane */ +.chat-component-container table { + display: block; + overflow-x: auto; + white-space: nowrap; + font-size: 0.875rem; + max-width: 100%; +} + +/* Adjust table styling for better readability in compact space */ +.chat-component-container th, +.chat-component-container td { + padding: 0.25rem 0.5rem; + font-size: 0.8125rem; +} + +.chat-component-container th[scope='col'] { + padding-left: 1rem; +} + +.chat-component-container td { + padding-left: 1rem; +} + +/* Ensure badges and other inline elements don't break layout */ +.chat-component-container span { + white-space: nowrap; +} + +/* Adjust heading sizes */ +.chat-component-container h4 { + font-size: 1rem; + font-weight: 600; + color: #1f2937; +} + +/* Warning and info boxes */ +.chat-component-container p { + font-size: 0.875rem; + margin: 0.5rem 0; +} + +/* Ensure tooltips work properly in the chat context */ +.chat-component-container [role="tooltip"] { + z-index: 9999; +} \ No newline at end of file From 27d8efdbbc6b8f0a91e6ec8d2b7f7d342bb21e29 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Tue, 2 Sep 2025 11:45:32 -0400 Subject: [PATCH 05/48] fix: Update CopilotKit action to match MCP tool name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Change action name from 'showVariantInfo' to 'get_variant_summary' - Update parameter names to match MCP tool (variantId -> variant_id) - Add optional dataset parameter with fallback to current dataset This fixes the variant table display in the chat interface by ensuring the frontend action properly invokes the backend MCP tool. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- browser/src/hooks/useGnomadCopilotActions.tsx | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/browser/src/hooks/useGnomadCopilotActions.tsx b/browser/src/hooks/useGnomadCopilotActions.tsx index d0da55a16..2e165a98c 100644 --- a/browser/src/hooks/useGnomadCopilotActions.tsx +++ b/browser/src/hooks/useGnomadCopilotActions.tsx @@ -145,23 +145,29 @@ const adaptApiDataToComponentProps = (apiData: any): Variant => { export function useGnomadCopilotActions() { useCopilotAction({ - name: 'showVariantInfo', + name: 'get_variant_summary', description: 'Fetches and displays a summary of population frequencies for a specific gnomAD variant.', parameters: [ { - name: 'variantId', + name: 'variant_id', type: 'string', description: 'The variant ID, e.g., 1-55051215-G-GA or an rsID.', required: true, }, + { + name: 'dataset', + type: 'string', + description: 'The gnomAD dataset to query (e.g., gnomad_r4, gnomad_r3).', + required: false, + }, ], - handler: async ({ variantId }) => { - // In a real implementation, you would get the current dataset from your app's state management + handler: async ({ variant_id, dataset }) => { + // Get the current dataset from URL if not provided const currentUrl = new URL(window.location.href) - const datasetId = currentUrl.searchParams.get('dataset') || 'gnomad_r4' + const datasetId = dataset || currentUrl.searchParams.get('dataset') || 'gnomad_r4' - // The handler's return value is sent to the backend, which will execute the corresponding MCP tool. - return { variantId, dataset: datasetId } + // Return parameters that match the MCP tool's expected format + return { variant_id, dataset: datasetId } }, render: ({ status, result }) => { if (status === 'inProgress') { From 95af8160cb88e0b50c0bfa617548ec63092eecf5 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 3 Sep 2025 12:26:25 -0400 Subject: [PATCH 06/48] update model --- browser/src/App.tsx | 1 + copilotkit-server/src/server.ts | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/browser/src/App.tsx b/browser/src/App.tsx index 3e909e44f..dbe31c567 100644 --- a/browser/src/App.tsx +++ b/browser/src/App.tsx @@ -3,6 +3,7 @@ import { BrowserRouter as Router, Route, useLocation } from 'react-router-dom' import styled from 'styled-components' import { CopilotKit } from '@copilotkit/react-core' import '@copilotkit/react-ui/styles.css' +import './styles/chatComponents.css' import Delayed from './Delayed' import ErrorBoundary from './ErrorBoundary' diff --git a/copilotkit-server/src/server.ts b/copilotkit-server/src/server.ts index 2634c9257..f9292378e 100644 --- a/copilotkit-server/src/server.ts +++ b/copilotkit-server/src/server.ts @@ -16,14 +16,14 @@ app.use(cors({ })); const serviceAdapter = new GoogleGenerativeAIAdapter({ - model: "gemini-1.5-flash-latest", + model: "gemini-2.5-pro", apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY || "", }); // Configure the MCP server command. -// Assumes the 'gmd' binary is installed in PATH +// Use the full path to gmd binary const mcpConfig = { - command: "gmd", + command: `${process.env.HOME}/.grove/bin/gmd`, args: ["mcp", "serve"], env: { GNOMAD_API_URL: process.env.GNOMAD_API_URL || "https://gnomad.broadinstitute.org/api" From 0825abab9b552c8c63dceb332046fbe6c2d82348 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 3 Sep 2025 12:28:04 -0400 Subject: [PATCH 07/48] Remove get_variant_summary copilot action MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removed the get_variant_summary action and its associated useGnomadCopilotActions hook. This action is no longer needed in the CopilotKit integration. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- browser/src/GnomadCopilot.tsx | 3 - browser/src/hooks/useGnomadCopilotActions.tsx | 208 ------------------ 2 files changed, 211 deletions(-) delete mode 100644 browser/src/hooks/useGnomadCopilotActions.tsx diff --git a/browser/src/GnomadCopilot.tsx b/browser/src/GnomadCopilot.tsx index 4c5b0f26d..aefa197a0 100644 --- a/browser/src/GnomadCopilot.tsx +++ b/browser/src/GnomadCopilot.tsx @@ -3,7 +3,6 @@ import styled from 'styled-components' import { CopilotChat } from '@copilotkit/react-ui' import { useCopilotAction } from '@copilotkit/react-core' import { useHistory } from 'react-router-dom' -import { useGnomadCopilotActions } from './hooks/useGnomadCopilotActions' import '@copilotkit/react-ui/styles.css' const PageContainer = styled.div` @@ -94,8 +93,6 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { const containerRef = useRef(null) const history = useHistory() - // Initialize gnomAD-specific copilot actions - useGnomadCopilotActions() useCopilotAction({ name: 'navigateToVariantPage', diff --git a/browser/src/hooks/useGnomadCopilotActions.tsx b/browser/src/hooks/useGnomadCopilotActions.tsx deleted file mode 100644 index 2e165a98c..000000000 --- a/browser/src/hooks/useGnomadCopilotActions.tsx +++ /dev/null @@ -1,208 +0,0 @@ -import React from 'react' -import { useCopilotAction } from '@copilotkit/react-core' -import { GnomadVariantOccurrenceTable } from '../VariantPage/VariantOccurrenceTable' -import { Variant } from '../VariantPage/VariantPage' -import { DatasetId } from '@gnomad/dataset-metadata/metadata' - -// Function to transform snake_case API data to camelCase props expected by VariantOccurrenceTable -const adaptApiDataToComponentProps = (apiData: any): Variant => { - // Transform the top-level variant data - const variant: Variant = { - variant_id: apiData.variant_id || apiData.variantId, - reference_genome: apiData.reference_genome || apiData.referenceGenome || 'GRCh38', - colocated_variants: apiData.colocated_variants || apiData.colocatedVariants || null, - faf95_joint: apiData.faf95_joint || apiData.faf95Joint || { popmax: null, popmax_population: null }, - chrom: apiData.chrom || apiData.chromosome, - pos: apiData.pos || apiData.position, - ref: apiData.ref || apiData.reference, - alt: apiData.alt || apiData.alternate, - flags: apiData.flags || null, - clinvar: apiData.clinvar || null, - exome: apiData.exome ? { - ac: apiData.exome.ac || 0, - an: apiData.exome.an || 0, - homozygote_count: apiData.exome.homozygote_count || apiData.exome.nhomalt || 0, - hemizygote_count: apiData.exome.hemizygote_count || 0, - ac_hom: apiData.exome.ac_hom || apiData.exome.nhomalt || 0, - ac_hemi: apiData.exome.ac_hemi || 0, - faf95: apiData.exome.faf95 || { popmax: null, popmax_population: null }, - filters: apiData.exome.filters || [], - populations: apiData.exome.populations || [], - age_distribution: apiData.exome.age_distribution || null, - flags: apiData.exome.flags || null, - quality_metrics: { - allele_balance: { - alt: apiData.exome.quality_metrics?.allele_balance?.alt || { - bin_edges: [], - bin_freq: [], - n_smaller: 0, - n_larger: 0 - } - }, - genotype_depth: { - all: apiData.exome.quality_metrics?.genotype_depth?.all || { - bin_edges: [], - bin_freq: [], - n_smaller: 0, - n_larger: 0 - }, - alt: apiData.exome.quality_metrics?.genotype_depth?.alt || { - bin_edges: [], - bin_freq: [], - n_smaller: 0, - n_larger: 0 - } - }, - genotype_quality: { - all: apiData.exome.quality_metrics?.genotype_quality?.all || { - bin_edges: [], - bin_freq: [], - n_smaller: 0, - n_larger: 0 - }, - alt: apiData.exome.quality_metrics?.genotype_quality?.alt || { - bin_edges: [], - bin_freq: [], - n_smaller: 0, - n_larger: 0 - } - }, - site_quality_metrics: apiData.exome.quality_metrics?.site_quality_metrics || [] - }, - local_ancestry_populations: apiData.exome.local_ancestry_populations || [] - } : null, - genome: apiData.genome ? { - ac: apiData.genome.ac || 0, - an: apiData.genome.an || 0, - homozygote_count: apiData.genome.homozygote_count || apiData.genome.nhomalt || 0, - hemizygote_count: apiData.genome.hemizygote_count || 0, - ac_hom: apiData.genome.ac_hom || apiData.genome.nhomalt || 0, - ac_hemi: apiData.genome.ac_hemi || 0, - faf95: apiData.genome.faf95 || { popmax: null, popmax_population: null }, - filters: apiData.genome.filters || [], - populations: apiData.genome.populations || [], - age_distribution: apiData.genome.age_distribution || null, - flags: apiData.genome.flags || null, - quality_metrics: { - allele_balance: { - alt: apiData.genome.quality_metrics?.allele_balance?.alt || { - bin_edges: [], - bin_freq: [], - n_smaller: 0, - n_larger: 0 - } - }, - genotype_depth: { - all: apiData.genome.quality_metrics?.genotype_depth?.all || { - bin_edges: [], - bin_freq: [], - n_smaller: 0, - n_larger: 0 - }, - alt: apiData.genome.quality_metrics?.genotype_depth?.alt || { - bin_edges: [], - bin_freq: [], - n_smaller: 0, - n_larger: 0 - } - }, - genotype_quality: { - all: apiData.genome.quality_metrics?.genotype_quality?.all || { - bin_edges: [], - bin_freq: [], - n_smaller: 0, - n_larger: 0 - }, - alt: apiData.genome.quality_metrics?.genotype_quality?.alt || { - bin_edges: [], - bin_freq: [], - n_smaller: 0, - n_larger: 0 - } - }, - site_quality_metrics: apiData.genome.quality_metrics?.site_quality_metrics || [] - }, - local_ancestry_populations: apiData.genome.local_ancestry_populations || [] - } : null, - joint: apiData.joint || null, - lof_curations: apiData.lof_curations || null, - in_silico_predictors: apiData.in_silico_predictors || null, - transcript_consequences: apiData.transcript_consequences || null, - liftover: apiData.liftover || null, - liftover_sources: apiData.liftover_sources || null, - multi_nucleotide_variants: apiData.multi_nucleotide_variants, - caid: apiData.caid || null, - rsids: apiData.rsids || null, - coverage: { - exome: apiData.coverage?.exome || null, - genome: apiData.coverage?.genome || null - }, - non_coding_constraint: apiData.non_coding_constraint || null - } - - return variant -} - -export function useGnomadCopilotActions() { - useCopilotAction({ - name: 'get_variant_summary', - description: 'Fetches and displays a summary of population frequencies for a specific gnomAD variant.', - parameters: [ - { - name: 'variant_id', - type: 'string', - description: 'The variant ID, e.g., 1-55051215-G-GA or an rsID.', - required: true, - }, - { - name: 'dataset', - type: 'string', - description: 'The gnomAD dataset to query (e.g., gnomad_r4, gnomad_r3).', - required: false, - }, - ], - handler: async ({ variant_id, dataset }) => { - // Get the current dataset from URL if not provided - const currentUrl = new URL(window.location.href) - const datasetId = dataset || currentUrl.searchParams.get('dataset') || 'gnomad_r4' - - // Return parameters that match the MCP tool's expected format - return { variant_id, dataset: datasetId } - }, - render: ({ status, result }) => { - if (status === 'inProgress') { - return ( -
    -
    -
    Fetching variant data...
    -
    Loading population frequencies
    -
    -
    - ) - } - - if (status === 'complete' && result) { - const variantData = adaptApiDataToComponentProps(result) - // Get the current dataset from URL for display purposes - const currentUrl = new URL(window.location.href) - const datasetId = (currentUrl.searchParams.get('dataset') || 'gnomad_r4') as DatasetId - - return ( -
    -

    - Occurrence Data for {result.variant_id || result.variantId} -

    - -
    - ) - } - - return <> // Return empty React fragment instead of null - }, - }) -} \ No newline at end of file From a88053b6321404fe51d47391e297c5686662117c Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 3 Sep 2025 12:31:43 -0400 Subject: [PATCH 08/48] make dataset version copilot readable from document title --- browser/src/DocumentTitle.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/browser/src/DocumentTitle.ts b/browser/src/DocumentTitle.ts index cad700ee9..f57b923c3 100644 --- a/browser/src/DocumentTitle.ts +++ b/browser/src/DocumentTitle.ts @@ -23,8 +23,10 @@ const DocumentTitle = ({ title, pageContext }: any) => { contextValue = JSON.stringify(geneContext, null, 2) } else if (pageContext.variant_id) { contextDescription = 'The currently viewed variant' + const datasetId = new URL(window.location.href).searchParams.get('dataset') const variantContext = { variant_id: pageContext.variant_id, + dataset: datasetId, reference_genome: pageContext.reference_genome, caid: pageContext.caid, rsids: pageContext.rsids, From 1f50090a9c395f2de1ac26aacaf88fb0f094fe25 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 3 Sep 2025 13:30:21 -0400 Subject: [PATCH 09/48] feat: Add context-aware chat suggestions and default open state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add "Interpret this variant" suggestion on variant pages - Set assistant chat window to be open by default - Style suggestion chips with 14px font size to match chat UI - Use conditional rendering to show suggestions only on relevant pages 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- browser/src/GnomadCopilot.tsx | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/browser/src/GnomadCopilot.tsx b/browser/src/GnomadCopilot.tsx index aefa197a0..706aa2e68 100644 --- a/browser/src/GnomadCopilot.tsx +++ b/browser/src/GnomadCopilot.tsx @@ -1,8 +1,8 @@ -import React, { useState, useRef, useCallback } from 'react' +import React, { useState, useRef, useCallback, useMemo } from 'react' import styled from 'styled-components' import { CopilotChat } from '@copilotkit/react-ui' import { useCopilotAction } from '@copilotkit/react-core' -import { useHistory } from 'react-router-dom' +import { useHistory, useLocation } from 'react-router-dom' import '@copilotkit/react-ui/styles.css' const PageContainer = styled.div` @@ -84,15 +84,36 @@ const StyledCopilotChat = styled(CopilotChat)` input[type="text"] { font-size: 14px !important; } + + /* Style suggestion chips */ + button[data-suggestion] { + font-size: 14px !important; + } ` export function GnomadCopilot({ children }: { children: React.ReactNode }) { - const [isChatOpen, setIsChatOpen] = useState(false) + const [isChatOpen, setIsChatOpen] = useState(true) const [chatWidth, setChatWidth] = useState(window.innerWidth / 3) // Default to 1/3 of screen const isResizing = useRef(false) const containerRef = useRef(null) const history = useHistory() + const location = useLocation() + // Show "interpret this variant" suggestion only on variant pages + const isVariantPage = location.pathname.startsWith('/variant/') + + // Define suggestions based on the current page + const suggestions = useMemo(() => { + if (isVariantPage) { + return [ + { + title: "Interpret this variant", + message: "Can you help me interpret the clinical significance and population frequency of this variant?", + }, + ] + } + return [] + }, [isVariantPage]) useCopilotAction({ name: 'navigateToVariantPage', @@ -179,6 +200,7 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { title: 'gnomAD Assistant', initial: 'Hello! I can help you understand gnomAD data, navigate the browser, or answer questions about what you\'re viewing.', }} + suggestions={suggestions} /> From cab4b2239f7876a0bce807fea9ade441283a4ba2 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 3 Sep 2025 14:08:44 -0400 Subject: [PATCH 10/48] fix: Remove unused CopilotSidebar component to prevent duplicate action registration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The CopilotSidebar component was registering a duplicate navigateToVariantPage action which caused "Action argument unparsable" errors due to receiving malformed JSON. Since this component is not imported anywhere and GnomadCopilot provides the same functionality with a better split-screen layout, it's safe to remove. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- browser/src/CopilotSidebar.tsx | 73 ---------------------------------- 1 file changed, 73 deletions(-) delete mode 100644 browser/src/CopilotSidebar.tsx diff --git a/browser/src/CopilotSidebar.tsx b/browser/src/CopilotSidebar.tsx deleted file mode 100644 index e4e4d311b..000000000 --- a/browser/src/CopilotSidebar.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import React, { useEffect, useRef } from 'react' -import { useCopilotAction } from '@copilotkit/react-core' -import { CopilotSidebar } from '@copilotkit/react-ui' -import { useHistory } from 'react-router-dom' - -interface CopilotSidebarProps { - isOpen: boolean - onClose: () => void -} - -const GnomadCopilotSidebar: React.FC = ({ isOpen, onClose }) => { - const history = useHistory() - const prevIsOpen = useRef(isOpen) - - useCopilotAction({ - name: 'navigateToVariantPage', - description: 'Navigate to the gnomAD variant page for a given variant ID.', - parameters: [ - { - name: 'variantId', - type: 'string', - description: "The variant ID, such as '1-55516888-G-GA' or an rsID like 'rs527413419'.", - required: true, - }, - { - name: 'datasetId', - type: 'string', - description: `The dataset ID to use, for example 'gnomad_r4'. If not provided, the current dataset will be used.`, - required: false, - }, - ], - handler: async ({ variantId, datasetId }) => { - // Get the current dataset from the URL if not provided - const currentUrl = new URL(window.location.href) - const currentDatasetId = currentUrl.searchParams.get('dataset') || 'gnomad_r4' - const targetDatasetId = datasetId || currentDatasetId - - const url = `/variant/${variantId}?dataset=${targetDatasetId}` - console.log(`Navigating to: ${url}`) - history.push(url) - - return { - message: `Navigating to the variant page for ${variantId}.`, - } - }, - }) - - // Handle the open/close logic manually - useEffect(() => { - if (prevIsOpen.current && !isOpen) { - // Sidebar was closed - onClose() - } - prevIsOpen.current = isOpen - }, [isOpen, onClose]) - - return ( - { - if (!open) { - onClose() - } - }} - labels={{ - title: "gnomAD Assistant", - initial: "Hello! How can I help you explore gnomAD's data?", - }} - /> - ) -} - -export default GnomadCopilotSidebar \ No newline at end of file From 457c19cb1f53413c01ac4b723a5a8e8cb6da6fea Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 3 Sep 2025 15:57:17 -0400 Subject: [PATCH 11/48] feat: add mendelian table env --- copilotkit-server/start.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/copilotkit-server/start.sh b/copilotkit-server/start.sh index 010208c1a..9ec02b072 100755 --- a/copilotkit-server/start.sh +++ b/copilotkit-server/start.sh @@ -1,9 +1,11 @@ #!/bin/bash +export MENDELIAN_TSV_PATH=/Users/msolomon/code/random/mono2/gmd-api/data/gene-disease-table_8_13_2025.tsv + export NODE_ENV=${NODE_ENV:-development} if [[ $NODE_ENV == "development" ]]; then npx ts-node src/server.ts else node dist/server.js -fi \ No newline at end of file +fi From 3009bfe65f311fdffa21bac4aba6224a082726c0 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 3 Sep 2025 17:01:41 -0400 Subject: [PATCH 12/48] feat: Add agent state messages with inline tool execution display MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add Progress component for displaying MCP tool activity logs - Implement useMCPStateRender hook for inline tool state visualization - Integrate agent state rendering into GnomadCopilot - Remove old ActionMessage/CustomRenderMessage code in favor of new system - Add collapsible parameter display and status indicators 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- browser/src/GnomadCopilot.tsx | 40 +++- browser/src/components/Progress.tsx | 97 ++++++++++ browser/src/hooks/useMCPStateRender.tsx | 231 ++++++++++++++++++++++++ 3 files changed, 367 insertions(+), 1 deletion(-) create mode 100644 browser/src/components/Progress.tsx create mode 100644 browser/src/hooks/useMCPStateRender.tsx diff --git a/browser/src/GnomadCopilot.tsx b/browser/src/GnomadCopilot.tsx index 706aa2e68..d41751b5a 100644 --- a/browser/src/GnomadCopilot.tsx +++ b/browser/src/GnomadCopilot.tsx @@ -3,6 +3,7 @@ import styled from 'styled-components' import { CopilotChat } from '@copilotkit/react-ui' import { useCopilotAction } from '@copilotkit/react-core' import { useHistory, useLocation } from 'react-router-dom' +import { useMCPStateRender } from './hooks/useMCPStateRender' import '@copilotkit/react-ui/styles.css' const PageContainer = styled.div` @@ -91,6 +92,7 @@ const StyledCopilotChat = styled(CopilotChat)` } ` + export function GnomadCopilot({ children }: { children: React.ReactNode }) { const [isChatOpen, setIsChatOpen] = useState(true) const [chatWidth, setChatWidth] = useState(window.innerWidth / 3) // Default to 1/3 of screen @@ -99,8 +101,12 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { const history = useHistory() const location = useLocation() + // Initialize MCP state rendering (renders inline in chat) + useMCPStateRender() + // Show "interpret this variant" suggestion only on variant pages const isVariantPage = location.pathname.startsWith('/variant/') + const isGenePage = location.pathname.startsWith('/gene/') // Define suggestions based on the current page const suggestions = useMemo(() => { @@ -110,10 +116,42 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { title: "Interpret this variant", message: "Can you help me interpret the clinical significance and population frequency of this variant?", }, + { + title: "Is this variant too common?", + message: "Is this variant's allele frequency too high for it to cause a rare Mendelian disease?", + }, + { + title: "Analyze expression at this location (Pext)", + message: "Analyze the Pext score for this variant's location. Is it in a functionally important region that is expressed across many tissues?", + }, + { + title: "Check in silico predictors", + message: "What do in silico predictors like REVEL and CADD say about this variant?", + }, + ] + } + if (isGenePage) { + return [ + { + title: "Summarize gene constraint", + message: "Summarize this gene's constraint scores, like pLI and missense o/e.", + }, + { + title: "Check tissue expression", + message: "In which tissues is this gene most highly expressed?", + }, + { + title: "Look up Mendelian disease", + message: "Is this gene associated with any Mendelian diseases?", + }, + { + title: "Analyze expression regions (Pext)", + message: "Provide a Pext analysis for this gene to identify functionally important regions.", + }, ] } return [] - }, [isVariantPage]) + }, [isVariantPage, isGenePage]) useCopilotAction({ name: 'navigateToVariantPage', diff --git a/browser/src/components/Progress.tsx b/browser/src/components/Progress.tsx new file mode 100644 index 000000000..dfa2862dd --- /dev/null +++ b/browser/src/components/Progress.tsx @@ -0,0 +1,97 @@ +"use client"; + +import React from "react"; +import styled from 'styled-components'; + +interface ProgressProps { + logs: string[]; +} + +const ProgressContainer = styled.div` + background: #f8f9fa; + border: 1px solid #e9ecef; + border-radius: 8px; + padding: 16px; + margin-bottom: 16px; +`; + +const ProgressHeader = styled.div` + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 12px; +`; + +const StatusIndicator = styled.div` + width: 8px; + height: 8px; + background: #28a745; + border-radius: 50%; + animation: pulse 1.5s ease-in-out infinite; + + @keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } + } +`; + +const ProgressTitle = styled.h3` + font-size: 14px; + font-weight: 600; + color: #495057; + margin: 0; +`; + +const LogsContainer = styled.div` + max-height: 256px; + overflow-y: auto; + display: flex; + flex-direction: column; + gap: 8px; +`; + +const LogEntry = styled.div` + font-size: 12px; + color: #6c757d; + font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace; + background: white; + padding: 8px; + border-radius: 4px; + border: 1px solid #e9ecef; +`; + +const LogIndex = styled.span` + color: #adb5bd; + margin-right: 8px; +`; + +const EmptyState = styled.p` + font-size: 12px; + color: #6c757d; + font-style: italic; + margin: 0; +`; + +export function Progress({ logs }: ProgressProps) { + return ( + + + + MCP Tool Activity + + + + {logs.map((log, index) => ( + + [{index + 1}] + {log} + + ))} + + + {logs.length === 0 && ( + No tool activity yet... + )} + + ); +} \ No newline at end of file diff --git a/browser/src/hooks/useMCPStateRender.tsx b/browser/src/hooks/useMCPStateRender.tsx new file mode 100644 index 000000000..9f4fc2b25 --- /dev/null +++ b/browser/src/hooks/useMCPStateRender.tsx @@ -0,0 +1,231 @@ +import React, { useState } from "react"; +import { useCopilotAction } from "@copilotkit/react-core"; +import styled from 'styled-components'; + +const ToolStateContainer = styled.div<{ isExecuting: boolean }>` + border: 1px solid ${props => props.isExecuting ? '#007bff' : '#28a745'}; + border-radius: 8px; + padding: 16px; + margin: 8px 0; + background: ${props => props.isExecuting ? '#f0f8ff' : '#f8fff8'}; + transition: all 0.3s ease; +`; + +const ToolHeader = styled.div` + display: flex; + align-items: flex-start; + gap: 12px; +`; + +const StatusIcon = styled.div<{ isExecuting: boolean }>` + width: 32px; + height: 32px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + background: ${props => props.isExecuting ? '#e3f2fd' : '#e8f5e8'}; + margin-top: 4px; +`; + +const StatusIndicator = styled.div` + width: 12px; + height: 12px; + background: #007bff; + border-radius: 50%; + animation: pulse 1.5s ease-in-out infinite; + + @keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.3; } + } +`; + +const CheckIcon = styled.svg` + width: 16px; + height: 16px; + color: #28a745; +`; + +const ToolContent = styled.div` + flex: 1; +`; + +const ToolTitle = styled.h4<{ isExecuting: boolean }>` + font-size: 14px; + font-weight: 600; + margin: 0 0 8px 0; + color: ${props => props.isExecuting ? '#0056b3' : '#155724'}; +`; + +const StatusLine = styled.div` + display: flex; + align-items: center; + gap: 8px; + font-size: 12px; + color: #6c757d; + margin-bottom: 4px; +`; + +const StatusArrow = styled.span` + color: #adb5bd; +`; + +const StatusText = styled.span` + font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace; +`; + +const ParametersToggle = styled.button` + display: flex; + align-items: center; + gap: 8px; + background: none; + border: none; + font-size: 12px; + color: #6c757d; + cursor: pointer; + padding: 4px 0; + font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace; + + &:hover { + color: #495057; + } +`; + +const ChevronIcon = styled.svg<{ expanded: boolean }>` + width: 12px; + height: 12px; + transition: transform 0.2s ease; + transform: ${props => props.expanded ? 'rotate(90deg)' : 'rotate(0deg)'}; +`; + +const ParametersContent = styled.pre` + margin: 8px 0 0 24px; + padding: 8px; + background: #f8f9fa; + border-radius: 4px; + font-size: 11px; + overflow-x: auto; + border: 1px solid #e9ecef; +`; + +const ProcessingLine = styled.div` + display: flex; + align-items: center; + gap: 8px; + font-size: 12px; + color: #6c757d; + animation: pulse 1.5s ease-in-out infinite; +`; + +const SuccessLine = styled.div` + display: flex; + align-items: center; + gap: 8px; + font-size: 12px; + color: #28a745; +`; + +const SuccessIcon = styled.span` + color: #28a745; +`; + +interface ToolStateDisplayProps { + name: string; + status: string; + args: any; +} + +function ToolStateDisplay({ name, status, args }: ToolStateDisplayProps) { + const [isExpanded, setIsExpanded] = useState(false); + const isExecuting = status === "executing"; + const isComplete = status === "complete"; + + return ( + + + + {isExecuting ? ( + + ) : ( + + + + )} + + + + Tool: {name} + + + {isExecuting && ( + <> + + + Calling MCP server... + + + setIsExpanded(!isExpanded)}> + + Parameters + + + + + + {isExpanded && ( + + {args ? JSON.stringify(args, null, 2) : "No parameters"} + + )} + + + Processing request... + + + )} + + {isComplete && ( + <> + + + Tool completed successfully + + + setIsExpanded(!isExpanded)}> + + Parameters + + + + + + {isExpanded && ( + + {args ? JSON.stringify(args, null, 2) : "No parameters"} + + )} + + )} + + + + ); +} + +export function useMCPStateRender() { + // Catch all tool calls including MCP tools + useCopilotAction({ + name: "*", + description: "Monitor all tool calls", + render: ({ name, status, args }) => { + // Show for both executing and complete status + if (status === "idle") { + return null; + } + + // Render inline tool state + return ; + }, + }); +} \ No newline at end of file From 7c3ecd457be52eaae64140a060764d7316a84f8b Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Thu, 4 Sep 2025 11:59:09 -0400 Subject: [PATCH 13/48] feat: add variant card display in chat assistant --- browser/src/GnomadCopilot.tsx | 28 +- browser/src/gmd/components/VariantCard.tsx | 337 ++++++++++++++++++ browser/src/gmd/components/VariantDisplay.tsx | 156 ++++++++ browser/src/gmd/components/VariantLoading.tsx | 125 +++++++ .../src/gmd/hooks/useGnomadVariantActions.tsx | 117 ++++++ browser/src/styles/chatComponents.css | 44 +++ 6 files changed, 797 insertions(+), 10 deletions(-) create mode 100644 browser/src/gmd/components/VariantCard.tsx create mode 100644 browser/src/gmd/components/VariantDisplay.tsx create mode 100644 browser/src/gmd/components/VariantLoading.tsx create mode 100644 browser/src/gmd/hooks/useGnomadVariantActions.tsx diff --git a/browser/src/GnomadCopilot.tsx b/browser/src/GnomadCopilot.tsx index d41751b5a..19f69f9f6 100644 --- a/browser/src/GnomadCopilot.tsx +++ b/browser/src/GnomadCopilot.tsx @@ -4,6 +4,7 @@ import { CopilotChat } from '@copilotkit/react-ui' import { useCopilotAction } from '@copilotkit/react-core' import { useHistory, useLocation } from 'react-router-dom' import { useMCPStateRender } from './hooks/useMCPStateRender' +import { useGnomadVariantActions } from './gmd/hooks/useGnomadVariantActions' import '@copilotkit/react-ui/styles.css' const PageContainer = styled.div` @@ -100,18 +101,25 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { const containerRef = useRef(null) const history = useHistory() const location = useLocation() - + // Initialize MCP state rendering (renders inline in chat) useMCPStateRender() - + + // Initialize gnomAD variant actions + useGnomadVariantActions() + // Show "interpret this variant" suggestion only on variant pages const isVariantPage = location.pathname.startsWith('/variant/') const isGenePage = location.pathname.startsWith('/gene/') - + // Define suggestions based on the current page const suggestions = useMemo(() => { if (isVariantPage) { return [ + { + title: "Display the variant summary", + message: "Please display the variant summary", + }, { title: "Interpret this variant", message: "Can you help me interpret the clinical significance and population frequency of this variant?", @@ -175,11 +183,11 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { const currentUrl = new URL(window.location.href) const currentDatasetId = currentUrl.searchParams.get('dataset') || 'gnomad_r4' const targetDatasetId = datasetId || currentDatasetId - + const url = `/variant/${variantId}?dataset=${targetDatasetId}` console.log(`Navigating to: ${url}`) history.push(url) - + return { message: `Navigating to the variant page for ${variantId}.`, } @@ -194,14 +202,14 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { const handleMouseMove = useCallback((e: MouseEvent) => { if (!isResizing.current || !containerRef.current) return - + const containerRect = containerRef.current.getBoundingClientRect() const newWidth = containerRect.right - e.clientX - + // Ensure width stays within bounds const minWidth = 300 const maxWidth = containerRect.width * 0.8 - + if (newWidth >= minWidth && newWidth <= maxWidth) { setChatWidth(newWidth) } @@ -217,7 +225,7 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { if (isChatOpen) { document.addEventListener('mousemove', handleMouseMove) document.addEventListener('mouseup', handleMouseUp) - + return () => { document.removeEventListener('mousemove', handleMouseMove) document.removeEventListener('mouseup', handleMouseUp) @@ -250,4 +258,4 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { ) -} \ No newline at end of file +} diff --git a/browser/src/gmd/components/VariantCard.tsx b/browser/src/gmd/components/VariantCard.tsx new file mode 100644 index 000000000..5812b62f6 --- /dev/null +++ b/browser/src/gmd/components/VariantCard.tsx @@ -0,0 +1,337 @@ +import React from 'react' +import styled from 'styled-components' +import { Badge, Button, ExternalLink } from '@gnomad/ui' +import AttributeList, { AttributeListItem } from '../../AttributeList' + +const CardWrapper = styled.div` + background: #ffffff; + border: 1px solid #e0e0e0; + border-radius: 8px; + padding: 20px; + margin: 10px 0; + width: 100%; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12); +` + +const CardHeader = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 15px; +` + +const VariantTitle = styled.h3` + margin: 0; + font-size: 1.1em; + font-weight: 600; + color: #333; +` + +const VariantSubtitle = styled.div` + color: #666; + font-size: 0.9em; + margin-top: 5px; +` + +const Section = styled.div` + margin-top: 15px; +` + +const SectionTitle = styled.h4` + margin: 0 0 10px 0; + font-size: 0.9em; + font-weight: 600; + color: #666; + text-transform: uppercase; + letter-spacing: 0.05em; +` + +const FrequencyGrid = styled.div` + display: grid; + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: 10px; + margin-top: 10px; +` + +const FrequencyItem = styled.div` + background: #f8f8f8; + padding: 10px; + border-radius: 4px; +` + +const FrequencyLabel = styled.div` + font-size: 0.8em; + color: #666; + margin-bottom: 2px; +` + +const FrequencyValue = styled.div` + font-size: 1.1em; + font-weight: 600; + color: #333; +` + +const ActionBar = styled.div` + display: flex; + gap: 10px; + margin-top: 20px; + padding-top: 15px; + border-top: 1px solid #e0e0e0; +` + +interface VariantData { + variant_id: string + reference_genome?: string + chrom?: string + pos?: number + ref?: string + alt?: string + rsids?: string[] + flags?: string[] + exome?: { + ac: number + an: number + af?: number + homozygote_count: number + hemizygote_count?: number + faf95?: { + popmax: number + popmax_population: string + } + populations?: Array<{ + id: string + ac: number + an: number + homozygote_count: number + }> + } + genome?: { + ac: number + an: number + af?: number + homozygote_count: number + hemizygote_count?: number + faf95?: { + popmax: number + popmax_population: string + } + populations?: Array<{ + id: string + ac: number + an: number + homozygote_count: number + }> + } + transcript_consequences?: Array<{ + gene_id: string + gene_symbol: string + transcript_id: string + consequence_terms: string[] + major_consequence: string + is_canonical: boolean + hgvs?: string + hgvsc?: string + hgvsp?: string + lof?: string + lof_flags?: string + lof_filter?: string + }> + in_silico_predictors?: Array<{ + id: string + value: string + flags?: string[] + }> +} + +interface VariantCardProps { + variant: VariantData + onViewDetails?: () => void + onNavigateToVariant?: () => void +} + +const formatFrequency = (frequency: number): string => { + if (frequency === 0) return '0' + if (frequency < 0.00001) return frequency.toExponential(2) + return frequency.toFixed(5) +} + +const calculateAF = (ac: number, an: number): number => { + return an > 0 ? ac / an : 0 +} + +const VariantCard: React.FC = ({ + variant, + onViewDetails, + onNavigateToVariant +}) => { + console.log('VariantCard received variant:', variant) + console.log('variant.transcript_consequences:', variant.transcript_consequences) + console.log('variant.variant_id:', variant.variant_id) + console.log('variant.variantId:', variant.variantId) + + // Get the first canonical transcript or the first transcript + const canonicalTranscript = variant.transcript_consequences?.find(t => t.is_canonical) || variant.transcript_consequences?.[0] + + // Calculate allele frequencies + const exomeAF = variant.exome ? calculateAF(variant.exome.ac, variant.exome.an) : undefined + const genomeAF = variant.genome ? calculateAF(variant.genome.ac, variant.genome.an) : undefined + + // Determine which frequency data to display + const hasExomeData = variant.exome && variant.exome.an > 0 + const hasGenomeData = variant.genome && variant.genome.an > 0 + + return ( + + +
    + {variant.variant_id} + + {canonicalTranscript?.gene_symbol && ( + <> + {canonicalTranscript.gene_symbol} + {canonicalTranscript.major_consequence && ` • ${canonicalTranscript.major_consequence.replace(/_/g, ' ')}`} + + )} + +
    + {variant.flags && variant.flags.length > 0 && ( +
    + {variant.flags.map((flag) => ( + + {flag} + + ))} +
    + )} +
    + + + {canonicalTranscript?.hgvsp && ( + + {canonicalTranscript.hgvsp} + + )} + {canonicalTranscript?.hgvsc && ( + + {canonicalTranscript.hgvsc} + + )} + {variant.rsids && variant.rsids.length > 0 && ( + + {variant.rsids.map((rsid, index) => ( + + {index > 0 && ', '} + + {rsid} + + + ))} + + )} + + + {(hasExomeData || hasGenomeData) && ( +
    + Allele Frequency + + {hasExomeData && ( + <> + + Exome AF + {formatFrequency(exomeAF!)} + + + Exome AC/AN + + {variant.exome!.ac} / {variant.exome!.an} + + + {variant.exome!.homozygote_count !== undefined && ( + + Exome Homozygotes + {variant.exome!.homozygote_count} + + )} + + )} + {hasGenomeData && ( + <> + + Genome AF + {formatFrequency(genomeAF!)} + + + Genome AC/AN + + {variant.genome!.ac} / {variant.genome!.an} + + + {variant.genome!.homozygote_count !== undefined && ( + + Genome Homozygotes + {variant.genome!.homozygote_count} + + )} + + )} + + + {/* Display FAF if available */} + {(variant.exome?.faf95 || variant.genome?.faf95) && ( + + {variant.exome?.faf95 && ( + + Exome FAF95 ({variant.exome.faf95.popmax_population}) + {formatFrequency(variant.exome.faf95.popmax)} + + )} + {variant.genome?.faf95 && ( + + Genome FAF95 ({variant.genome.faf95.popmax_population}) + {formatFrequency(variant.genome.faf95.popmax)} + + )} + + )} +
    + )} + + {variant.in_silico_predictors && variant.in_silico_predictors.length > 0 && ( +
    + In Silico Predictors + + {variant.in_silico_predictors.map((predictor) => ( + + {predictor.value} + {predictor.flags && predictor.flags.length > 0 && ( + + {predictor.flags.map((flag) => ( + + {flag} + + ))} + + )} + + ))} + +
    + )} + + + {onNavigateToVariant && ( + + )} + {onViewDetails && ( + + )} + +
    + ) +} + +export default VariantCard \ No newline at end of file diff --git a/browser/src/gmd/components/VariantDisplay.tsx b/browser/src/gmd/components/VariantDisplay.tsx new file mode 100644 index 000000000..387c6ab70 --- /dev/null +++ b/browser/src/gmd/components/VariantDisplay.tsx @@ -0,0 +1,156 @@ +import React from 'react' +import styled from 'styled-components' +import { useHistory } from 'react-router-dom' +import VariantCard from './VariantCard' + +const DisplayWrapper = styled.div` + width: 100%; + max-width: 600px; +` + +const ErrorMessage = styled.div` + padding: 20px; + background-color: #ffebee; + border: 1px solid #ffcdd2; + border-radius: 4px; + color: #c62828; +` + +const NoResultsMessage = styled.div` + padding: 20px; + background-color: #f5f5f5; + border: 1px solid #e0e0e0; + border-radius: 4px; + color: #666; + text-align: center; +` + +const VariantListHeader = styled.div` + margin-bottom: 10px; + padding: 10px 0; + border-bottom: 1px solid #e0e0e0; +` + +const ResultCount = styled.div` + font-size: 0.9em; + color: #666; + font-weight: 600; +` + +interface VariantDisplayProps { + data: any +} + +const VariantDisplay: React.FC = ({ data }) => { + const history = useHistory() + + console.log('VariantDisplay received data:', data) + console.log('Data type:', typeof data) + console.log('Data keys:', data ? Object.keys(data) : 'no data') + if (data && typeof data === 'object') { + console.log('Data stringified:', JSON.stringify(data, null, 2)) + } + + // Handle error cases + if (!data) { + return ( + + + No data available + + + ) + } + + if (data.error) { + return ( + + + Error: {data.error} + + + ) + } + + // Handle CopilotKit's wrapped response format + let processedData = data + + // If data is an array with text objects (CopilotKit format) + if (Array.isArray(data) && data.length > 0 && data[0].type === 'text' && data[0].text) { + try { + // Extract and parse the JSON from the text + const jsonText = data[0].text + processedData = JSON.parse(jsonText) + console.log('Parsed variant data:', processedData) + } catch (error) { + console.error('Failed to parse variant data:', error) + return ( + + + Error parsing variant data + + + ) + } + } + + // Determine if we have a single variant or multiple variants + const variants = Array.isArray(processedData) ? processedData : (processedData.variants || [processedData]) + console.log('Processed variants:', variants) + + if (variants.length === 0) { + return ( + + + No variants found + + + ) + } + + const handleNavigateToVariant = (variantId: string, referenceGenome?: string) => { + // Navigate to the variant page + // The route structure is typically /variant/{variantId}?dataset={datasetId} + // Map reference genome to dataset ID + let dataset = 'gnomad_r4' + if (referenceGenome === 'GRCh37') { + dataset = 'gnomad_r2_1_1' + } else if (referenceGenome === 'GRCh38') { + dataset = 'gnomad_r4' + } + history.push(`/variant/${variantId}?dataset=${dataset}`) + } + + // Single variant display + if (variants.length === 1) { + const variant = variants[0] + return ( + + handleNavigateToVariant(variant.variant_id || variant.variantId, variant.reference_genome)} + /> + + ) + } + + // Multiple variants display + return ( + + + + Found {variants.length} variant{variants.length !== 1 ? 's' : ''} + + + {variants.map((variant: any, index: number) => ( + handleNavigateToVariant(variant.variant_id || variant.variantId, variant.reference_genome)} + /> + ))} + + ) +} + +export default VariantDisplay \ No newline at end of file diff --git a/browser/src/gmd/components/VariantLoading.tsx b/browser/src/gmd/components/VariantLoading.tsx new file mode 100644 index 000000000..7a107a1d3 --- /dev/null +++ b/browser/src/gmd/components/VariantLoading.tsx @@ -0,0 +1,125 @@ +import React from 'react' +import styled, { keyframes } from 'styled-components' + +const pulse = keyframes` + 0% { + opacity: 1; + } + 50% { + opacity: 0.5; + } + 100% { + opacity: 1; + } +` + +const LoadingWrapper = styled.div` + background: #ffffff; + border: 1px solid #e0e0e0; + border-radius: 8px; + padding: 20px; + margin: 10px 0; + width: 100%; + max-width: 600px; +` + +const SkeletonHeader = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 15px; +` + +const SkeletonTitle = styled.div` + height: 24px; + width: 200px; + background-color: #e0e0e0; + border-radius: 4px; + animation: ${pulse} 1.5s ease-in-out infinite; +` + +const SkeletonSubtitle = styled.div` + height: 18px; + width: 150px; + background-color: #e0e0e0; + border-radius: 4px; + margin-top: 8px; + animation: ${pulse} 1.5s ease-in-out infinite; +` + +const SkeletonBadge = styled.div` + height: 24px; + width: 60px; + background-color: #e0e0e0; + border-radius: 4px; + animation: ${pulse} 1.5s ease-in-out infinite; +` + +const SkeletonContent = styled.div` + margin-top: 20px; +` + +const SkeletonLine = styled.div<{ width?: string }>` + height: 16px; + width: ${props => props.width || '100%'}; + background-color: #e0e0e0; + border-radius: 4px; + margin-bottom: 12px; + animation: ${pulse} 1.5s ease-in-out infinite; +` + +const SkeletonGrid = styled.div` + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 10px; + margin-top: 15px; +` + +const SkeletonBox = styled.div` + height: 60px; + background-color: #f5f5f5; + border-radius: 4px; + padding: 10px; + animation: ${pulse} 1.5s ease-in-out infinite; +` + +const LoadingMessage = styled.div` + text-align: center; + color: #666; + font-size: 0.9em; + margin-top: 15px; +` + +interface VariantLoadingProps { + message?: string +} + +const VariantLoading: React.FC = ({ message = 'Loading variant data...' }) => { + return ( + + +
    + + +
    + +
    + + + + + + + + + + + + + + {message} +
    + ) +} + +export default VariantLoading \ No newline at end of file diff --git a/browser/src/gmd/hooks/useGnomadVariantActions.tsx b/browser/src/gmd/hooks/useGnomadVariantActions.tsx new file mode 100644 index 000000000..fc17caefc --- /dev/null +++ b/browser/src/gmd/hooks/useGnomadVariantActions.tsx @@ -0,0 +1,117 @@ +import React from 'react' +import { useCopilotAction } from '@copilotkit/react-core' +import VariantLoading from '../components/VariantLoading' +import VariantDisplay from '../components/VariantDisplay' + +export function useGnomadVariantActions() { + // Action for getting variant summary + useCopilotAction({ + name: 'get_variant_summary', + description: 'Fetch summary information for a genetic variant', + parameters: [ + { + name: 'variant_id', + type: 'string', + description: 'The variant identifier (e.g., "1-55516888-G-A")', + required: true, + }, + { + name: 'dataset', + type: 'string', + description: 'The dataset to query (e.g., "gnomad_r4")', + required: false, + }, + ], + handler: async ({ variant_id, dataset }) => { + // The handler returns the parameters that will be sent to the backend + return { variant_id, dataset } + }, + render: (props) => { + const { status, result } = props + console.log('get_variant_summary render props:', { status, result }) + + if (status === 'executing') { + return + } + + if (status === 'complete' && result) { + console.log('Rendering VariantDisplay with data:', result) + return + } + + return null + }, + }) + + // Action for getting variant details with population frequencies + useCopilotAction({ + name: 'get_variant_details', + description: 'Fetch detailed information for a variant including population frequencies', + parameters: [ + { + name: 'variant_id', + type: 'string', + description: 'The variant identifier', + required: true, + }, + { + name: 'dataset', + type: 'string', + description: 'The dataset to query', + required: false, + }, + ], + handler: async ({ variant_id, dataset }) => { + return { variant_id, dataset } + }, + render: (props) => { + const { status, result } = props + + if (status === 'executing') { + return + } + + if (status === 'complete' && result) { + return + } + + return null + }, + }) + + // Action for getting variant frequencies + useCopilotAction({ + name: 'get_variant_frequencies', + description: 'Fetch allele frequency information for a variant', + parameters: [ + { + name: 'variant_id', + type: 'string', + description: 'The variant identifier', + required: true, + }, + { + name: 'dataset', + type: 'string', + description: 'The dataset to query', + required: false, + }, + ], + handler: async ({ variant_id, dataset }) => { + return { variant_id, dataset } + }, + render: (props) => { + const { status, result } = props + + if (status === 'executing') { + return + } + + if (status === 'complete' && result) { + return + } + + return null + }, + }) +} \ No newline at end of file diff --git a/browser/src/styles/chatComponents.css b/browser/src/styles/chatComponents.css index f9ff16ab4..652876218 100644 --- a/browser/src/styles/chatComponents.css +++ b/browser/src/styles/chatComponents.css @@ -54,4 +54,48 @@ /* Ensure tooltips work properly in the chat context */ .chat-component-container [role="tooltip"] { z-index: 9999; +} + +/* Variant Card specific styles for chat context */ +.chat-component-container .variant-card { + width: 100%; + box-sizing: border-box; +} + +/* Ensure variant cards don't have excessive margins in chat */ +.chat-component-container > div > div { + margin: 0; +} + +/* Adjust button spacing in variant cards */ +.chat-component-container button { + font-size: 0.875rem; + padding: 0.375rem 0.75rem; +} + +/* Ensure AttributeList renders properly in narrow space */ +.chat-component-container dl { + font-size: 0.875rem; +} + +.chat-component-container dt { + font-weight: 600; + margin-bottom: 0.125rem; +} + +.chat-component-container dd { + margin-left: 0; + margin-bottom: 0.5rem; +} + +/* Grid layout adjustments for frequency data */ +.chat-component-container .frequency-grid { + grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); +} + +/* Ensure external links are identifiable */ +.chat-component-container a[href^="http"] { + color: #0d79d0; + text-decoration: underline; + word-break: break-word; } \ No newline at end of file From a234693b2baa82c60d6efdde0f6a8756a4f9b554 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Thu, 4 Sep 2025 11:59:27 -0400 Subject: [PATCH 14/48] feat: use 2.5 flash --- copilotkit-server/src/server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/copilotkit-server/src/server.ts b/copilotkit-server/src/server.ts index f9292378e..aec8c007f 100644 --- a/copilotkit-server/src/server.ts +++ b/copilotkit-server/src/server.ts @@ -16,7 +16,7 @@ app.use(cors({ })); const serviceAdapter = new GoogleGenerativeAIAdapter({ - model: "gemini-2.5-pro", + model: "gemini-2.5-flash", apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY || "", }); From 491222ea6ddefffc2a7640cf05f942906a2bc929 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Tue, 18 Nov 2025 10:38:31 -0500 Subject: [PATCH 15/48] update pnpm lock --- pnpm-lock.yaml | 6491 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 6338 insertions(+), 153 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0237e55e4..50a67d942 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -147,6 +147,15 @@ importers: browser: dependencies: + '@copilotkit/react-core': + specifier: ^1.0.0 + version: 1.10.6(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@copilotkit/react-textarea': + specifier: ^1.0.0 + version: 1.10.6(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@copilotkit/react-ui': + specifier: ^1.0.0 + version: 1.10.6(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) '@fortawesome/fontawesome-free': specifier: ^5.8.1 version: 5.15.4 @@ -362,6 +371,33 @@ importers: specifier: ^5.2.1 version: 5.2.1(webpack-cli@5.1.4)(webpack@5.94.0) + copilotkit-server: + dependencies: + '@copilotkit/runtime': + specifier: ^1.10.3 + version: 1.10.6(@ag-ui/client@0.0.41)(@ag-ui/core@0.0.41)(@ag-ui/encoder@0.0.41)(@ag-ui/langgraph@0.0.18)(@ag-ui/proto@0.0.41)(@browserbasehq/stagehand@1.14.0)(@ibm-cloud/watsonx-ai@1.7.3)(axios@1.13.2)(ibm-cloud-sdk-core@5.4.4) + '@google/generative-ai': + specifier: ^0.21.0 + version: 0.21.0 + '@modelcontextprotocol/sdk': + specifier: ^1.17.4 + version: 1.22.0 + '@types/cors': + specifier: ^2.8.13 + version: 2.8.14 + '@types/express': + specifier: ^4.17.17 + version: 4.17.23 + cors: + specifier: ^2.8.5 + version: 2.8.5 + express: + specifier: ^4.20.0 + version: 4.21.2 + typescript: + specifier: ^5.0.4 + version: 5.2.2 + dataset-metadata: {} graphql-api: @@ -484,6 +520,15 @@ importers: packages: + /@0no-co/graphql.web@1.2.0: + resolution: {integrity: sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + dev: false + /@aashutoshrathi/word-wrap@1.2.6: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} @@ -492,6 +537,71 @@ packages: resolution: {integrity: sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==} dev: true + /@ag-ui/client@0.0.41: + resolution: {integrity: sha512-aCTuGHm62hjWE0caWhxGAZFSiK42LnORMlYtRhkdIj1Te4eg8LkmpzU6FepQksIk6uBtHNbn82rp0rxpqog7OA==} + dependencies: + '@ag-ui/core': 0.0.41 + '@ag-ui/encoder': 0.0.41 + '@ag-ui/proto': 0.0.41 + '@types/uuid': 10.0.0 + compare-versions: 6.1.1 + fast-json-patch: 3.1.1 + rxjs: 7.8.1 + untruncate-json: 0.0.1 + uuid: 11.1.0 + zod: 3.25.76 + dev: false + + /@ag-ui/core@0.0.37: + resolution: {integrity: sha512-7bmjPn1Ol0Zo00F+MrPr0eOwH4AFZbhmq/ZMhCsrMILtVYBiBLcLU9QFBpBL3Zm9MCHha8b79N7JE2FzwcMaVA==} + dependencies: + rxjs: 7.8.1 + zod: 3.25.76 + dev: false + + /@ag-ui/core@0.0.41: + resolution: {integrity: sha512-yRSh7fweajRGAJxm2IBpC+hfkXleqq0mQOXntMk/UMEgPKWfSRMt7qHL+3mtrGEaeL4fA/rcE41cVSjFDnYSoQ==} + dependencies: + rxjs: 7.8.1 + zod: 3.25.76 + dev: false + + /@ag-ui/encoder@0.0.41: + resolution: {integrity: sha512-eg+NUppqC/VQVIEDGD1slNEaRZ7YNVWAhfamntwyPYQnAugcY+Q14XIbROWsZ7YNipfX0cO5yb1WxFrgv1YZrw==} + dependencies: + '@ag-ui/core': 0.0.41 + '@ag-ui/proto': 0.0.41 + dev: false + + /@ag-ui/langgraph@0.0.18(@ag-ui/client@0.0.41)(@ag-ui/core@0.0.41)(openai@4.104.0): + resolution: {integrity: sha512-soWSV8+xR91jMArZUJoRv85UCgTi3Zt3u3gTMZhvs1t6fGFpAi6+hEQ4AqP13Rgvg90IlmIU8MTWo2k0OZDnoA==} + peerDependencies: + '@ag-ui/client': '>=0.0.38' + '@ag-ui/core': '>=0.0.38' + dependencies: + '@ag-ui/client': 0.0.41 + '@ag-ui/core': 0.0.41 + '@langchain/core': 0.3.79(openai@4.104.0) + '@langchain/langgraph-sdk': 0.1.10(@langchain/core@0.3.79) + partial-json: 0.1.7 + rxjs: 7.8.1 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + - react + - react-dom + dev: false + + /@ag-ui/proto@0.0.41: + resolution: {integrity: sha512-YlVmS8e53EZuMG68WvjNqzxoa/8NYCy3a8yoWsogPf1iZXa1RZ2WbQTi80xGzUnzluwxGSULlg7m7a1/8eXkkA==} + dependencies: + '@ag-ui/core': 0.0.41 + '@bufbuild/protobuf': 2.10.1 + '@protobuf-ts/protoc': 2.11.1 + dev: false + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -506,6 +616,25 @@ packages: '@jridgewell/gen-mapping': 0.3.12 '@jridgewell/trace-mapping': 0.3.29 + /@anthropic-ai/sdk@0.27.3: + resolution: {integrity: sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw==} + dependencies: + '@types/node': 18.19.130 + '@types/node-fetch': 2.6.13 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /@anthropic-ai/sdk@0.57.0: + resolution: {integrity: sha512-z5LMy0MWu0+w2hflUgj4RlJr1R+0BxKXL7ldXTO8FasU8fu599STghO+QKwId2dAD0d464aHtU+ChWuRHw4FNw==} + hasBin: true + dev: false + /@ardatan/aggregate-error@0.0.6: resolution: {integrity: sha512-vyrkEHG1jrukmzTPtyWB4NLPauUw5bQeg4uhn8f+1SSynmrOcyvlb1GKQjjgoBzElLdfXCRYX8UnBlhklOHYRQ==} engines: {node: '>=8'} @@ -513,6 +642,604 @@ packages: tslib: 2.0.3 dev: false + /@aws-crypto/crc32@5.2.0: + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.930.0 + tslib: 2.8.1 + dev: false + + /@aws-crypto/sha256-browser@5.2.0: + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.930.0 + '@aws-sdk/util-locate-window': 3.893.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + dev: false + + /@aws-crypto/sha256-js@5.2.0: + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.930.0 + tslib: 2.8.1 + dev: false + + /@aws-crypto/supports-web-crypto@5.2.0: + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + dependencies: + tslib: 2.8.1 + dev: false + + /@aws-crypto/util@5.2.0: + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + dependencies: + '@aws-sdk/types': 3.930.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/client-bedrock-agent-runtime@3.933.0: + resolution: {integrity: sha512-4v9jE6moxj3FO4PZgL8WjmVeEzu3oHntbw7PxWFutbezfdwQVANhDKV4nYuySbGGO7U0zUxUHk2P1JSTh8viDg==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.932.0 + '@aws-sdk/credential-provider-node': 3.933.0 + '@aws-sdk/middleware-host-header': 3.930.0 + '@aws-sdk/middleware-logger': 3.930.0 + '@aws-sdk/middleware-recursion-detection': 3.933.0 + '@aws-sdk/middleware-user-agent': 3.932.0 + '@aws-sdk/region-config-resolver': 3.930.0 + '@aws-sdk/types': 3.930.0 + '@aws-sdk/util-endpoints': 3.930.0 + '@aws-sdk/util-user-agent-browser': 3.930.0 + '@aws-sdk/util-user-agent-node': 3.932.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.4 + '@smithy/eventstream-serde-browser': 4.2.5 + '@smithy/eventstream-serde-config-resolver': 4.3.5 + '@smithy/eventstream-serde-node': 4.2.5 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.11 + '@smithy/middleware-retry': 4.4.11 + '@smithy/middleware-serde': 4.2.6 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.7 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.10 + '@smithy/util-defaults-mode-node': 4.2.13 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-bedrock-runtime@3.933.0: + resolution: {integrity: sha512-pgf6/p+q3zwzOHrsCxCbwej/MFMnIPwUYmnCg0wFa5A8PfHh2uBDqwXHD5ZQZwH85JMkOQOMXmCjSTRKvf1x0Q==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.932.0 + '@aws-sdk/credential-provider-node': 3.933.0 + '@aws-sdk/eventstream-handler-node': 3.930.0 + '@aws-sdk/middleware-eventstream': 3.930.0 + '@aws-sdk/middleware-host-header': 3.930.0 + '@aws-sdk/middleware-logger': 3.930.0 + '@aws-sdk/middleware-recursion-detection': 3.933.0 + '@aws-sdk/middleware-user-agent': 3.932.0 + '@aws-sdk/middleware-websocket': 3.930.0 + '@aws-sdk/region-config-resolver': 3.930.0 + '@aws-sdk/token-providers': 3.933.0 + '@aws-sdk/types': 3.930.0 + '@aws-sdk/util-endpoints': 3.930.0 + '@aws-sdk/util-user-agent-browser': 3.930.0 + '@aws-sdk/util-user-agent-node': 3.932.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.4 + '@smithy/eventstream-serde-browser': 4.2.5 + '@smithy/eventstream-serde-config-resolver': 4.3.5 + '@smithy/eventstream-serde-node': 4.2.5 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.11 + '@smithy/middleware-retry': 4.4.11 + '@smithy/middleware-serde': 4.2.6 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.7 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.10 + '@smithy/util-defaults-mode-node': 4.2.13 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-stream': 4.5.6 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-kendra@3.933.0: + resolution: {integrity: sha512-+7DXWQfMmuokel18E7m12ev5US9Bk7rHFk3AjW8iIYm8ACxgewA4Rj0RaQTpNsD6m43NIcwjALUK/RPiYZFm6Q==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.932.0 + '@aws-sdk/credential-provider-node': 3.933.0 + '@aws-sdk/middleware-host-header': 3.930.0 + '@aws-sdk/middleware-logger': 3.930.0 + '@aws-sdk/middleware-recursion-detection': 3.933.0 + '@aws-sdk/middleware-user-agent': 3.932.0 + '@aws-sdk/region-config-resolver': 3.930.0 + '@aws-sdk/types': 3.930.0 + '@aws-sdk/util-endpoints': 3.930.0 + '@aws-sdk/util-user-agent-browser': 3.930.0 + '@aws-sdk/util-user-agent-node': 3.932.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.4 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.11 + '@smithy/middleware-retry': 4.4.11 + '@smithy/middleware-serde': 4.2.6 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.7 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.10 + '@smithy/util-defaults-mode-node': 4.2.13 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sso@3.933.0: + resolution: {integrity: sha512-zwGLSiK48z3PzKpQiDMKP85+fpIrPMF1qQOQW9OW7BGj5AuBZIisT2O4VzIgYJeh+t47MLU7VgBQL7muc+MJDg==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.932.0 + '@aws-sdk/middleware-host-header': 3.930.0 + '@aws-sdk/middleware-logger': 3.930.0 + '@aws-sdk/middleware-recursion-detection': 3.933.0 + '@aws-sdk/middleware-user-agent': 3.932.0 + '@aws-sdk/region-config-resolver': 3.930.0 + '@aws-sdk/types': 3.930.0 + '@aws-sdk/util-endpoints': 3.930.0 + '@aws-sdk/util-user-agent-browser': 3.930.0 + '@aws-sdk/util-user-agent-node': 3.932.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.4 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.11 + '@smithy/middleware-retry': 4.4.11 + '@smithy/middleware-serde': 4.2.6 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.7 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.10 + '@smithy/util-defaults-mode-node': 4.2.13 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/core@3.932.0: + resolution: {integrity: sha512-AS8gypYQCbNojwgjvZGkJocC2CoEICDx9ZJ15ILsv+MlcCVLtUJSRSx3VzJOUY2EEIaGLRrPNlIqyn/9/fySvA==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.930.0 + '@aws-sdk/xml-builder': 3.930.0 + '@smithy/core': 3.18.4 + '@smithy/node-config-provider': 4.3.5 + '@smithy/property-provider': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/signature-v4': 5.3.5 + '@smithy/smithy-client': 4.9.7 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/credential-provider-env@3.932.0: + resolution: {integrity: sha512-ozge/c7NdHUDyHqro6+P5oHt8wfKSUBN+olttiVfBe9Mw3wBMpPa3gQ0pZnG+gwBkKskBuip2bMR16tqYvUSEA==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.932.0 + '@aws-sdk/types': 3.930.0 + '@smithy/property-provider': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/credential-provider-http@3.932.0: + resolution: {integrity: sha512-b6N9Nnlg8JInQwzBkUq5spNaXssM3h3zLxGzpPrnw0nHSIWPJPTbZzA5Ca285fcDUFuKP+qf3qkuqlAjGOdWhg==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.932.0 + '@aws-sdk/types': 3.930.0 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/node-http-handler': 4.4.5 + '@smithy/property-provider': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.7 + '@smithy/types': 4.9.0 + '@smithy/util-stream': 4.5.6 + tslib: 2.8.1 + dev: false + + /@aws-sdk/credential-provider-ini@3.933.0: + resolution: {integrity: sha512-HygGyKuMG5AaGXsmM0d81miWDon55xwalRHB3UmDg3QBhtunbNIoIaWUbNTKuBZXcIN6emeeEZw/YgSMqLc0YA==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.932.0 + '@aws-sdk/credential-provider-env': 3.932.0 + '@aws-sdk/credential-provider-http': 3.932.0 + '@aws-sdk/credential-provider-process': 3.932.0 + '@aws-sdk/credential-provider-sso': 3.933.0 + '@aws-sdk/credential-provider-web-identity': 3.933.0 + '@aws-sdk/nested-clients': 3.933.0 + '@aws-sdk/types': 3.930.0 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-node@3.933.0: + resolution: {integrity: sha512-L2dE0Y7iMLammQewPKNeEh1z/fdJyYEU+/QsLBD9VEh+SXcN/FIyTi21Isw8wPZN6lMB9PDVtISzBnF8HuSFrw==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.932.0 + '@aws-sdk/credential-provider-http': 3.932.0 + '@aws-sdk/credential-provider-ini': 3.933.0 + '@aws-sdk/credential-provider-process': 3.932.0 + '@aws-sdk/credential-provider-sso': 3.933.0 + '@aws-sdk/credential-provider-web-identity': 3.933.0 + '@aws-sdk/types': 3.930.0 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-process@3.932.0: + resolution: {integrity: sha512-BodZYKvT4p/Dkm28Ql/FhDdS1+p51bcZeMMu2TRtU8PoMDHnVDhHz27zASEKSZwmhvquxHrZHB0IGuVqjZUtSQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.932.0 + '@aws-sdk/types': 3.930.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/credential-provider-sso@3.933.0: + resolution: {integrity: sha512-/R1DBR7xNcuZIhS2RirU+P2o8E8/fOk+iLAhbqeSTq+g09fP/F6W7ouFpS5eVE2NIfWG7YBFoVddOhvuqpn51g==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/client-sso': 3.933.0 + '@aws-sdk/core': 3.932.0 + '@aws-sdk/token-providers': 3.933.0 + '@aws-sdk/types': 3.930.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-web-identity@3.933.0: + resolution: {integrity: sha512-c7Eccw2lhFx2/+qJn3g+uIDWRuWi2A6Sz3PVvckFUEzPsP0dPUo19hlvtarwP5GzrsXn0yEPRVhpewsIaSCGaQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.932.0 + '@aws-sdk/nested-clients': 3.933.0 + '@aws-sdk/types': 3.930.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/eventstream-handler-node@3.930.0: + resolution: {integrity: sha512-0busYTWsruRoUvs4Q4oSPkEQLR+eX80AtmLrW20SycC/OXdHFGj+bP3vhVWJyjDjXjjLwdLPJJhrqfHHrbrXQw==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.930.0 + '@smithy/eventstream-codec': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/middleware-eventstream@3.930.0: + resolution: {integrity: sha512-9s9oJ/c+xavDyirkRmPBGQJ3jhRvyAXWvXwttZvUjbpR95Lepaj6Xtqxen3PLOHG1Z+Ma56KKqMdnFxg/Jhf6A==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.930.0 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/middleware-host-header@3.930.0: + resolution: {integrity: sha512-x30jmm3TLu7b/b+67nMyoV0NlbnCVT5DI57yDrhXAPCtdgM1KtdLWt45UcHpKOm1JsaIkmYRh2WYu7Anx4MG0g==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.930.0 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/middleware-logger@3.930.0: + resolution: {integrity: sha512-vh4JBWzMCBW8wREvAwoSqB2geKsZwSHTa0nSt0OMOLp2PdTYIZDi0ZiVMmpfnjcx9XbS6aSluLv9sKx4RrG46A==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.930.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/middleware-recursion-detection@3.933.0: + resolution: {integrity: sha512-qgrMlkVKzTCAdNw2A05DC2sPBo0KRQ7wk+lbYSRJnWVzcrceJhnmhoZVV5PFv7JtchK7sHVcfm9lcpiyd+XaCA==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.930.0 + '@aws/lambda-invoke-store': 0.2.0 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/middleware-user-agent@3.932.0: + resolution: {integrity: sha512-9BGTbJyA/4PTdwQWE9hAFIJGpsYkyEW20WON3i15aDqo5oRZwZmqaVageOD57YYqG8JDJjvcwKyDdR4cc38dvg==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.932.0 + '@aws-sdk/types': 3.930.0 + '@aws-sdk/util-endpoints': 3.930.0 + '@smithy/core': 3.18.4 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/middleware-websocket@3.930.0: + resolution: {integrity: sha512-dqMbapt2KH99HG+2+CrIq04HGLOGMiX89lqgu5RxZMBUTxEZlRoAvmpjSYKlB0Co033PwMmWqIRsJVw0KOLMjA==} + engines: {node: '>= 14.0.0'} + dependencies: + '@aws-sdk/types': 3.930.0 + '@aws-sdk/util-format-url': 3.930.0 + '@smithy/eventstream-codec': 4.2.5 + '@smithy/eventstream-serde-browser': 4.2.5 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/protocol-http': 5.3.5 + '@smithy/signature-v4': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-hex-encoding': 4.2.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/nested-clients@3.933.0: + resolution: {integrity: sha512-o1GX0+IPlFi/D8ei9y/jj3yucJWNfPnbB5appVBWevAyUdZA5KzQ2nK/hDxiu9olTZlFEFpf1m1Rn3FaGxHqsw==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.932.0 + '@aws-sdk/middleware-host-header': 3.930.0 + '@aws-sdk/middleware-logger': 3.930.0 + '@aws-sdk/middleware-recursion-detection': 3.933.0 + '@aws-sdk/middleware-user-agent': 3.932.0 + '@aws-sdk/region-config-resolver': 3.930.0 + '@aws-sdk/types': 3.930.0 + '@aws-sdk/util-endpoints': 3.930.0 + '@aws-sdk/util-user-agent-browser': 3.930.0 + '@aws-sdk/util-user-agent-node': 3.932.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.4 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.11 + '@smithy/middleware-retry': 4.4.11 + '@smithy/middleware-serde': 4.2.6 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.7 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.10 + '@smithy/util-defaults-mode-node': 4.2.13 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/region-config-resolver@3.930.0: + resolution: {integrity: sha512-KL2JZqH6aYeQssu1g1KuWsReupdfOoxD6f1as2VC+rdwYFUu4LfzMsFfXnBvvQWWqQ7rZHWOw1T+o5gJmg7Dzw==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.930.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/token-providers@3.933.0: + resolution: {integrity: sha512-Qzq7zj9yXUgAAJEbbmqRhm0jmUndl8nHG0AbxFEfCfQRVZWL96Qzx0mf8lYwT9hIMrXncLwy31HOthmbXwFRwQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.932.0 + '@aws-sdk/nested-clients': 3.933.0 + '@aws-sdk/types': 3.930.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/types@3.930.0: + resolution: {integrity: sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/util-endpoints@3.930.0: + resolution: {integrity: sha512-M2oEKBzzNAYr136RRc6uqw3aWlwCxqTP1Lawps9E1d2abRPvl1p1ztQmmXp1Ak4rv8eByIZ+yQyKQ3zPdRG5dw==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.930.0 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-endpoints': 3.2.5 + tslib: 2.8.1 + dev: false + + /@aws-sdk/util-format-url@3.930.0: + resolution: {integrity: sha512-FW6Im17Zc7F5WT39XUgDOjtJO95Yu8rsmeRHf7z+Y3FamtTSzH4f713BD/qMyJBrZIlFACWlok/Uuvdl5/qtMg==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.930.0 + '@smithy/querystring-builder': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/util-locate-window@3.893.0: + resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + + /@aws-sdk/util-user-agent-browser@3.930.0: + resolution: {integrity: sha512-q6lCRm6UAe+e1LguM5E4EqM9brQlDem4XDcQ87NzEvlTW6GzmNCO0w1jS0XgCFXQHjDxjdlNFX+5sRbHijwklg==} + dependencies: + '@aws-sdk/types': 3.930.0 + '@smithy/types': 4.9.0 + bowser: 2.12.1 + tslib: 2.8.1 + dev: false + + /@aws-sdk/util-user-agent-node@3.932.0: + resolution: {integrity: sha512-/kC6cscHrZL74TrZtgiIL5jJNbVsw9duGGPurmaVgoCbP7NnxyaSWEurbNV3VPNPhNE3bV3g4Ci+odq+AlsYQg==} + engines: {node: '>=18.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + dependencies: + '@aws-sdk/middleware-user-agent': 3.932.0 + '@aws-sdk/types': 3.930.0 + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/xml-builder@3.930.0: + resolution: {integrity: sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + fast-xml-parser: 5.2.5 + tslib: 2.8.1 + dev: false + + /@aws/lambda-invoke-store@0.2.0: + resolution: {integrity: sha512-D1jAmAZQYMoPiacfgNf7AWhg3DFN3Wq/vQv3WINt9znwjzHp2x+WzdJFxxj7xZL7V1U79As6G8f7PorMYWBKsQ==} + engines: {node: '>=18.0.0'} + dev: false + /@babel/code-frame@7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: @@ -2708,6 +3435,11 @@ packages: dependencies: regenerator-runtime: 0.14.0 + /@babel/runtime@7.28.4: + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + dev: false + /@babel/template@7.22.15: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} @@ -2774,6 +3506,351 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true + /@browserbasehq/sdk@2.6.0: + resolution: {integrity: sha512-83iXP5D7xMm8Wyn66TUaUrgoByCmAJuoMoZQI3sGg3JAiMlTfnCIMqyVBoNSaItaPIkaCnrsj6LiusmXV2X9YA==} + dependencies: + '@types/node': 18.19.130 + '@types/node-fetch': 2.6.13 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /@browserbasehq/stagehand@1.14.0(@playwright/test@1.43.0)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@4.104.0)(zod@3.25.76): + resolution: {integrity: sha512-Hi/EzgMFWz+FKyepxHTrqfTPjpsuBS4zRy3e9sbMpBgLPv+9c0R+YZEvS7Bw4mTS66QtvvURRT6zgDGFotthVQ==} + peerDependencies: + '@playwright/test': ^1.42.1 + deepmerge: ^4.3.1 + dotenv: ^16.4.5 + openai: ^4.62.1 + zod: ^3.23.8 + dependencies: + '@anthropic-ai/sdk': 0.27.3 + '@browserbasehq/sdk': 2.6.0 + '@playwright/test': 1.43.0 + deepmerge: 4.3.1 + dotenv: 16.6.1 + openai: 4.104.0(zod@3.25.76) + ws: 8.18.3 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@bufbuild/protobuf@2.10.1: + resolution: {integrity: sha512-ckS3+vyJb5qGpEYv/s1OebUHDi/xSNtfgw1wqKZo7MR9F2z+qXr0q5XagafAG/9O0QPVIUfST0smluYSTpYFkg==} + dev: false + + /@cfworker/json-schema@4.1.1: + resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} + dev: false + + /@copilotkit/react-core@1.10.6(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-sdojpntwgOxP8lWRzaFEiWr0g2wDefjQHtve5GPPie+otseFonV88FZjSqIq5LN+q5BIwDOEhCmDjALsGjXvuQ==} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + dependencies: + '@copilotkit/runtime-client-gql': 1.10.6(react@18.3.1) + '@copilotkit/shared': 1.10.6 + '@scarf/scarf': 1.4.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-markdown: 8.0.7(@types/react@18.3.21)(react@18.3.1) + untruncate-json: 0.0.1 + transitivePeerDependencies: + - '@types/react' + - encoding + - graphql + - supports-color + dev: false + + /@copilotkit/react-textarea@1.10.6(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-04totNGPtBkfVdYy5rCBqn47HDbdd9cqHk49At0CD9DFmGOaL7kwMbywHj4Dqq6UpDKuJqnS9aYyLI073vuZwA==} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + dependencies: + '@copilotkit/react-core': 1.10.6(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@copilotkit/runtime-client-gql': 1.10.6(react@18.3.1) + '@copilotkit/shared': 1.10.6 + '@emotion/css': 11.13.5 + '@emotion/react': 11.14.0(@types/react@18.3.21)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0)(@types/react@18.3.21)(react@18.3.1) + '@mui/material': 5.18.0(@emotion/react@11.14.0)(@emotion/styled@11.14.1)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-label': 2.1.8(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-separator': 1.1.8(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.2.4(@types/react@18.3.21)(react@18.3.1) + class-variance-authority: 0.6.1 + clsx: 1.2.1 + cmdk: 0.2.1(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + lodash.merge: 4.6.2 + lucide-react: 0.274.0(react@18.3.1) + material-icons: 1.13.14 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + slate: 0.94.1 + slate-history: 0.93.0(slate@0.94.1) + slate-react: 0.98.4(react-dom@18.3.1)(react@18.3.1)(slate@0.94.1) + tailwind-merge: 1.14.0 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - encoding + - graphql + - supports-color + dev: false + + /@copilotkit/react-ui@1.10.6(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-eNIbZKMvBVZqlAR4fqkmZRIYIt8WhwZOxfVJVwMD9nfmWdtatmxrOLecyDiPk/hkq2o/8s2/rubaZSMK6m+GHQ==} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + dependencies: + '@copilotkit/react-core': 1.10.6(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@copilotkit/runtime-client-gql': 1.10.6(react@18.3.1) + '@copilotkit/shared': 1.10.6 + '@headlessui/react': 2.2.9(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-markdown: 10.1.0(@types/react@18.3.21)(react@18.3.1) + react-syntax-highlighter: 15.6.6(react@18.3.1) + rehype-raw: 7.0.0 + remark-gfm: 4.0.1 + remark-math: 6.0.0 + transitivePeerDependencies: + - '@types/react' + - encoding + - graphql + - react-dom + - supports-color + dev: false + + /@copilotkit/runtime-client-gql@1.10.6(react@18.3.1): + resolution: {integrity: sha512-oLX8mjppVvQCWfquW9A0500hYVNxM4X/mtt76SEvfGUb2KsNQ4j2HOCzpmtm85MeLproC+f9738wLwRueLliZg==} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + dependencies: + '@copilotkit/shared': 1.10.6 + '@urql/core': 5.2.0 + react: 18.3.1 + untruncate-json: 0.0.1 + urql: 4.2.2(@urql/core@5.2.0)(react@18.3.1) + transitivePeerDependencies: + - encoding + - graphql + dev: false + + /@copilotkit/runtime@1.10.6(@ag-ui/client@0.0.41)(@ag-ui/core@0.0.41)(@ag-ui/encoder@0.0.41)(@ag-ui/langgraph@0.0.18)(@ag-ui/proto@0.0.41)(@browserbasehq/stagehand@1.14.0)(@ibm-cloud/watsonx-ai@1.7.3)(axios@1.13.2)(ibm-cloud-sdk-core@5.4.4): + resolution: {integrity: sha512-35MdJ6nutC+spgHRJURbanLxBoQCNvVBYD0CBIk4Rv3/Ck8XgZA4lcc+5aGteuERXOPBsYEQjGD4xEPy3QXmGg==} + peerDependencies: + '@ag-ui/client': '>=0.0.39' + '@ag-ui/core': '>=0.0.39' + '@ag-ui/encoder': '>=0.0.39' + '@ag-ui/langgraph': '>=0.0.18' + '@ag-ui/proto': '>=0.0.39' + dependencies: + '@ag-ui/client': 0.0.41 + '@ag-ui/core': 0.0.41 + '@ag-ui/encoder': 0.0.41 + '@ag-ui/langgraph': 0.0.18(@ag-ui/client@0.0.41)(@ag-ui/core@0.0.41)(openai@4.104.0) + '@ag-ui/proto': 0.0.41 + '@anthropic-ai/sdk': 0.57.0 + '@copilotkit/shared': 1.10.6 + '@graphql-yoga/plugin-defer-stream': 3.16.2(graphql-yoga@5.16.2)(graphql@16.12.0) + '@langchain/aws': 0.1.15(@langchain/core@0.3.79) + '@langchain/community': 0.3.58(@browserbasehq/stagehand@1.14.0)(@ibm-cloud/watsonx-ai@1.7.3)(@langchain/aws@0.1.15)(@langchain/core@0.3.79)(axios@1.13.2)(ibm-cloud-sdk-core@5.4.4)(openai@4.104.0) + '@langchain/core': 0.3.79(openai@4.104.0) + '@langchain/google-gauth': 0.1.8(@langchain/core@0.3.79)(zod@3.25.76) + '@langchain/langgraph-sdk': 0.0.70(@langchain/core@0.3.79) + '@langchain/openai': 0.4.9(@langchain/core@0.3.79) + '@scarf/scarf': 1.4.0 + class-transformer: 0.5.1 + class-validator: 0.14.2 + express: 4.21.2 + graphql: 16.12.0 + graphql-scalars: 1.25.0(graphql@16.12.0) + graphql-yoga: 5.16.2(graphql@16.12.0) + groq-sdk: 0.5.0 + langchain: 0.3.36(@langchain/aws@0.1.15)(@langchain/core@0.3.79)(axios@1.13.2)(openai@4.104.0) + openai: 4.104.0(zod@3.25.76) + partial-json: 0.1.7 + pino: 9.14.0 + pino-pretty: 11.3.0 + reflect-metadata: 0.2.2 + rxjs: 7.8.1 + type-graphql: 2.0.0-rc.1(class-validator@0.14.2)(graphql-scalars@1.25.0)(graphql@16.12.0) + zod: 3.25.76 + transitivePeerDependencies: + - '@arcjet/redact' + - '@aws-crypto/sha256-js' + - '@aws-sdk/client-bedrock-agent-runtime' + - '@aws-sdk/client-bedrock-runtime' + - '@aws-sdk/client-dynamodb' + - '@aws-sdk/client-kendra' + - '@aws-sdk/client-lambda' + - '@aws-sdk/client-s3' + - '@aws-sdk/client-sagemaker-runtime' + - '@aws-sdk/client-sfn' + - '@aws-sdk/credential-provider-node' + - '@aws-sdk/dsql-signer' + - '@azure/search-documents' + - '@azure/storage-blob' + - '@browserbasehq/sdk' + - '@browserbasehq/stagehand' + - '@clickhouse/client' + - '@cloudflare/ai' + - '@datastax/astra-db-ts' + - '@elastic/elasticsearch' + - '@getmetal/metal-sdk' + - '@getzep/zep-cloud' + - '@getzep/zep-js' + - '@gomomento/sdk' + - '@gomomento/sdk-core' + - '@google-ai/generativelanguage' + - '@google-cloud/storage' + - '@gradientai/nodejs-sdk' + - '@huggingface/inference' + - '@huggingface/transformers' + - '@ibm-cloud/watsonx-ai' + - '@lancedb/lancedb' + - '@langchain/anthropic' + - '@langchain/cerebras' + - '@langchain/cohere' + - '@langchain/deepseek' + - '@langchain/google-genai' + - '@langchain/google-vertexai' + - '@langchain/google-vertexai-web' + - '@langchain/groq' + - '@langchain/mistralai' + - '@langchain/ollama' + - '@langchain/xai' + - '@layerup/layerup-security' + - '@libsql/client' + - '@mendable/firecrawl-js' + - '@mlc-ai/web-llm' + - '@mozilla/readability' + - '@neondatabase/serverless' + - '@notionhq/client' + - '@opensearch-project/opensearch' + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - '@pinecone-database/pinecone' + - '@planetscale/database' + - '@premai/prem-sdk' + - '@qdrant/js-client-rest' + - '@raycast/api' + - '@rockset/client' + - '@smithy/eventstream-codec' + - '@smithy/protocol-http' + - '@smithy/signature-v4' + - '@smithy/util-utf8' + - '@spider-cloud/spider-client' + - '@supabase/supabase-js' + - '@tensorflow-models/universal-sentence-encoder' + - '@tensorflow/tfjs-converter' + - '@tensorflow/tfjs-core' + - '@upstash/ratelimit' + - '@upstash/redis' + - '@upstash/vector' + - '@vercel/kv' + - '@vercel/postgres' + - '@writerai/writer-sdk' + - '@xata.io/client' + - '@zilliz/milvus2-sdk-node' + - apify-client + - assemblyai + - aws-crt + - axios + - azion + - better-sqlite3 + - cassandra-driver + - cborg + - cheerio + - chromadb + - closevector-common + - closevector-node + - closevector-web + - cohere-ai + - convex + - crypto-js + - d3-dsv + - discord.js + - duck-duck-scrape + - encoding + - epub2 + - fast-xml-parser + - firebase-admin + - google-auth-library + - googleapis + - handlebars + - hnswlib-node + - html-to-text + - ibm-cloud-sdk-core + - ignore + - interface-datastore + - ioredis + - it-all + - jsdom + - jsonwebtoken + - llmonitor + - lodash + - lunary + - mammoth + - mariadb + - mem0ai + - mongodb + - mysql2 + - neo4j-driver + - notion-to-md + - officeparser + - pdf-parse + - peggy + - pg + - pg-copy-streams + - pickleparser + - playwright + - portkey-ai + - puppeteer + - pyodide + - react + - redis + - replicate + - sonix-speech-recognition + - srt-parser-2 + - supports-color + - typeorm + - typesense + - usearch + - voy-search + - weaviate-client + - web-auth-library + - word-extractor + - ws + - youtubei.js + dev: false + + /@copilotkit/shared@1.10.6: + resolution: {integrity: sha512-56Rltf4fDBqCpl1ZXARypt5NdE4LTg3tGPPLurZpgPmm31Lv5EAHpfjC7I55vt9A0mXWlTCHtCrpiaAlTyzGJw==} + dependencies: + '@ag-ui/core': 0.0.37 + '@segment/analytics-node': 2.3.0 + chalk: 4.1.2 + graphql: 16.12.0 + uuid: 10.0.0 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - encoding + dev: false + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -2800,17 +3877,177 @@ packages: - supports-color dev: false - /@emotion/is-prop-valid@0.8.8: - resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + /@emotion/babel-plugin@11.13.5: + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} dependencies: - '@emotion/memoize': 0.7.4 - + '@babel/helper-module-imports': 7.27.1 + '@babel/runtime': 7.23.1 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@emotion/cache@11.14.0: + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + dev: false + + /@emotion/css@11.13.5: + resolution: {integrity: sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==} + dependencies: + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@emotion/hash@0.9.2: + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + dev: false + + /@emotion/is-prop-valid@0.8.8: + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + dependencies: + '@emotion/memoize': 0.7.4 + + /@emotion/is-prop-valid@1.4.0: + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + dependencies: + '@emotion/memoize': 0.9.0 + dev: false + /@emotion/memoize@0.7.4: resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + /@emotion/memoize@0.9.0: + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + dev: false + + /@emotion/react@11.14.0(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.1 + '@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@18.3.1) + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + '@types/react': 18.3.21 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@emotion/serialize@1.3.3: + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.2 + csstype: 3.1.2 + dev: false + + /@emotion/sheet@1.4.0: + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + dev: false + + /@emotion/styled@11.14.1(@emotion/react@11.14.0)(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.1 + '@emotion/babel-plugin': 11.13.5 + '@emotion/is-prop-valid': 1.4.0 + '@emotion/react': 11.14.0(@types/react@18.3.21)(react@18.3.1) + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) + '@emotion/utils': 1.4.2 + '@types/react': 18.3.21 + react: 18.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@emotion/unitless@0.10.0: + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + dev: false + /@emotion/unitless@0.7.5: resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + /@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@18.3.1): + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.3.1 + dev: false + + /@emotion/utils@1.4.2: + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + dev: false + + /@emotion/weak-memoize@0.4.0: + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + dev: false + + /@envelop/core@5.4.0: + resolution: {integrity: sha512-/1fat63pySE8rw/dZZArEVytLD90JApY85deDJ0/34gm+yhQ3k70CloSUevxoOE4YCGveG3s9SJJfQeeB4NAtQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@envelop/instrumentation': 1.0.0 + '@envelop/types': 5.2.1 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + dev: false + + /@envelop/instrumentation@1.0.0: + resolution: {integrity: sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==} + engines: {node: '>=18.0.0'} + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + dev: false + + /@envelop/types@5.2.1: + resolution: {integrity: sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==} + engines: {node: '>=18.0.0'} + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + dev: false + /@esbuild/android-arm64@0.16.17: resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} engines: {node: '>=12'} @@ -3062,6 +4299,51 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@fastify/busboy@3.2.0: + resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} + dev: false + + /@floating-ui/core@1.7.3: + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + dependencies: + '@floating-ui/utils': 0.2.10 + dev: false + + /@floating-ui/dom@1.7.4: + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + dev: false + + /@floating-ui/react-dom@2.1.6(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.7.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@floating-ui/react@0.26.28(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@18.3.1)(react@18.3.1) + '@floating-ui/utils': 0.2.10 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tabbable: 6.2.0 + dev: false + + /@floating-ui/utils@0.2.10: + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + dev: false + /@fortawesome/fontawesome-free@5.15.4: resolution: {integrity: sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==} engines: {node: '>=6'} @@ -3234,6 +4516,26 @@ packages: - supports-color dev: false + /@google/generative-ai@0.21.0: + resolution: {integrity: sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==} + engines: {node: '>=18.0.0'} + dev: false + + /@graphql-tools/executor@1.4.13(graphql@16.12.0): + resolution: {integrity: sha512-2hTSRfH2kb4ua0ANOV/K6xUoCZsHAE6igE1bimtWUK7v0bowPIxGRKRPpF8JLbImpsJuTCC4HGOCMy7otg3FIQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 10.10.3(graphql@16.12.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.12.0) + '@repeaterjs/repeater': 3.0.6 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + graphql: 16.12.0 + tslib: 2.8.1 + dev: false + /@graphql-tools/load-files@6.6.1(graphql@15.8.0): resolution: {integrity: sha512-nd4GOjdD68bdJkHfRepILb0gGwF63mJI7uD4oJuuf2Kzeq8LorKa6WfyxUhdMuLmZhnx10zdAlWPfwv1NOAL4Q==} peerDependencies: @@ -3266,6 +4568,29 @@ packages: tslib: 2.8.1 dev: false + /@graphql-tools/merge@9.1.5(graphql@16.12.0): + resolution: {integrity: sha512-eVcir6nCcOC/Wzv7ZAng3xec3dj6FehE8+h9TvgvUyrDEKVMdFfrO6etRFZ2hucWVcY8S6drx7zQx04N4lPM8Q==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 10.10.3(graphql@16.12.0) + graphql: 16.12.0 + tslib: 2.8.1 + dev: false + + /@graphql-tools/schema@10.0.29(graphql@16.12.0): + resolution: {integrity: sha512-+Htiupnq6U/AWOEAJerIOGT1pAf4u43Q3n2JmFpqFfYJchz6sKWZ7L9Lpe/NusaaUQty/IOF+eQlNFypEaWxhg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/merge': 9.1.5(graphql@16.12.0) + '@graphql-tools/utils': 10.10.3(graphql@16.12.0) + graphql: 16.12.0 + tslib: 2.8.1 + dev: false + /@graphql-tools/schema@6.2.4(graphql@15.8.0): resolution: {integrity: sha512-rh+14lSY1q8IPbEv2J9x8UBFJ5NrDX9W5asXEUlPp+7vraLp/Tiox4GXdgyA92JhwpYco3nTf5Bo2JDMt1KnAQ==} peerDependencies: @@ -3288,6 +4613,19 @@ packages: value-or-promise: 1.0.11 dev: false + /@graphql-tools/utils@10.10.3(graphql@16.12.0): + resolution: {integrity: sha512-2EdYiefeLLxsoeZTukSNZJ0E/Z5NnWBUGK2VJa0DQj1scDhVd93HeT1eW9TszJOYmIh3eWAKLv58ri/1XUmdsQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.12.0) + '@whatwg-node/promise-helpers': 1.3.2 + cross-inspect: 1.0.1 + graphql: 16.12.0 + tslib: 2.8.1 + dev: false + /@graphql-tools/utils@6.2.4(graphql@15.8.0): resolution: {integrity: sha512-ybgZ9EIJE3JMOtTrTd2VcIpTXtDrn2q6eiYkeYMKRVh3K41+LZa6YnR2zKERTXqTWqhobROwLt4BZbw2O3Aeeg==} peerDependencies: @@ -3317,6 +4655,86 @@ packages: tslib: 2.8.1 dev: false + /@graphql-typed-document-node/core@3.2.0(graphql@16.12.0): + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + graphql: 16.12.0 + dev: false + + /@graphql-yoga/logger@2.0.1: + resolution: {integrity: sha512-Nv0BoDGLMg9QBKy9cIswQ3/6aKaKjlTh87x3GiBg2Z4RrjyrM48DvOOK0pJh1C1At+b0mUIM67cwZcFTDLN4sA==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + + /@graphql-yoga/plugin-defer-stream@3.16.2(graphql-yoga@5.16.2)(graphql@16.12.0): + resolution: {integrity: sha512-yeyww8E1jfm7Cx16CshEC/Uj2LqGqGqlCyhXWqt18InFiVcI28OiavFhW45qFxLPcc7QYBigRJhODLqGlfkxhQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^15.2.0 || ^16.0.0 + graphql-yoga: ^5.16.2 + dependencies: + '@graphql-tools/utils': 10.10.3(graphql@16.12.0) + graphql: 16.12.0 + graphql-yoga: 5.16.2(graphql@16.12.0) + dev: false + + /@graphql-yoga/subscription@5.0.5: + resolution: {integrity: sha512-oCMWOqFs6QV96/NZRt/ZhTQvzjkGB4YohBOpKM4jH/lDT4qb7Lex/aGCxpi/JD9njw3zBBtMqxbaC22+tFHVvw==} + engines: {node: '>=18.0.0'} + dependencies: + '@graphql-yoga/typed-event-target': 3.0.2 + '@repeaterjs/repeater': 3.0.6 + '@whatwg-node/events': 0.1.2 + tslib: 2.8.1 + dev: false + + /@graphql-yoga/typed-event-target@3.0.2: + resolution: {integrity: sha512-ZpJxMqB+Qfe3rp6uszCQoag4nSw42icURnBRfFYSOmTgEeOe4rD0vYlbA8spvCu2TlCesNTlEN9BLWtQqLxabA==} + engines: {node: '>=18.0.0'} + dependencies: + '@repeaterjs/repeater': 3.0.6 + tslib: 2.8.1 + dev: false + + /@grpc/grpc-js@1.14.1: + resolution: {integrity: sha512-sPxgEWtPUR3EnRJCEtbGZG2iX8LQDUls2wUS3o27jg07KqJFMq6YDeWvMo1wfpmy3rqRdS0rivpLwhqQtEyCuQ==} + engines: {node: '>=12.10.0'} + dependencies: + '@grpc/proto-loader': 0.8.0 + '@js-sdsl/ordered-map': 4.4.2 + dev: false + + /@grpc/proto-loader@0.8.0: + resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.4 + yargs: 17.7.2 + dev: false + + /@headlessui/react@2.2.9(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + dependencies: + '@floating-ui/react': 0.26.28(react-dom@18.3.1)(react@18.3.1) + '@react-aria/focus': 3.21.2(react-dom@18.3.1)(react@18.3.1) + '@react-aria/interactions': 3.25.6(react-dom@18.3.1)(react@18.3.1) + '@tanstack/react-virtual': 3.13.12(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.6.0(react@18.3.1) + dev: false + /@humanwhocodes/config-array@0.11.11: resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} engines: {node: '>=10.10.0'} @@ -3346,6 +4764,18 @@ packages: /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@ibm-cloud/watsonx-ai@1.7.3: + resolution: {integrity: sha512-059l3Rs+FLZTfxIPVUiKLasEC0lkXyTo5HJBwzI1eFZUNjBdJW9BevPB7I5+6msSLoLy7Zbin4W9YarqOydvWg==} + engines: {node: '>=18.0.0'} + dependencies: + '@types/node': 18.19.130 + extend: 3.0.2 + form-data: 4.0.5 + ibm-cloud-sdk-core: 5.4.4 + transitivePeerDependencies: + - supports-color + dev: false + /@ioredis/commands@1.2.0: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} @@ -3637,6 +5067,10 @@ packages: '@jridgewell/sourcemap-codec': 1.5.3 dev: true + /@js-sdsl/ordered-map@4.4.2: + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + dev: false + /@jsonjoy.com/base64@1.1.2(tslib@2.8.1): resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} engines: {node: '>=10.0'} @@ -3665,92 +5099,1993 @@ packages: dependencies: tslib: 2.8.1 - /@leichtgewicht/ip-codec@2.0.5: - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - - /@mapbox/node-pre-gyp@1.0.11: - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true - dependencies: - detect-libc: 2.0.2 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.7.0 - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.5.4 - tar: 6.2.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@npmcli/fs@1.1.1: - resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} - requiresBuild: true - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.5.4 - dev: false - optional: true - - /@npmcli/move-file@1.1.2: - resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} - engines: {node: '>=10'} - deprecated: This functionality has been moved to @npmcli/fs - requiresBuild: true - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 + /@juggle/resize-observer@3.4.0: + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} dev: false - optional: true - /@playwright/test@1.43.0: - resolution: {integrity: sha512-Ebw0+MCqoYflop7wVKj711ccbNlrwTBCtjY5rlbiY9kHL2bCYxq+qltK6uPsVBGGAOb033H2VO0YobcQVxoW7Q==} - engines: {node: '>=16'} - hasBin: true + /@langchain/aws@0.1.15(@langchain/core@0.3.79): + resolution: {integrity: sha512-oyOMhTHP0rxdSCVI/g5KXYCOs9Kq/FpXMZbOk1JSIUoaIzUg4p6d98lsHu7erW//8NSaT+SX09QRbVDAgt7pNA==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.3.58 <0.4.0' dependencies: - playwright: 1.43.0 - dev: true - - /@popperjs/core@2.11.8: - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + '@aws-sdk/client-bedrock-agent-runtime': 3.933.0 + '@aws-sdk/client-bedrock-runtime': 3.933.0 + '@aws-sdk/client-kendra': 3.933.0 + '@aws-sdk/credential-provider-node': 3.933.0 + '@langchain/core': 0.3.79(openai@4.104.0) + transitivePeerDependencies: + - aws-crt dev: false - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - - /@sinonjs/commons@3.0.0: - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} - dependencies: - type-detect: 4.0.8 - dev: true - + /@langchain/community@0.3.58(@browserbasehq/stagehand@1.14.0)(@ibm-cloud/watsonx-ai@1.7.3)(@langchain/aws@0.1.15)(@langchain/core@0.3.79)(axios@1.13.2)(ibm-cloud-sdk-core@5.4.4)(openai@4.104.0): + resolution: {integrity: sha512-jrMbv1Xz2yqcWtlj+wnMmbagIK6J/fbQdP6R+Az+e+er5CeWy2eZHKBGFL5XYbAzYJdYhAbA4gt8kwVT6oaZfw==} + engines: {node: '>=18'} + peerDependencies: + '@arcjet/redact': ^v1.0.0-alpha.23 + '@aws-crypto/sha256-js': ^5.0.0 + '@aws-sdk/client-bedrock-agent-runtime': ^3.749.0 + '@aws-sdk/client-bedrock-runtime': ^3.749.0 + '@aws-sdk/client-dynamodb': ^3.749.0 + '@aws-sdk/client-kendra': ^3.749.0 + '@aws-sdk/client-lambda': ^3.749.0 + '@aws-sdk/client-s3': ^3.749.0 + '@aws-sdk/client-sagemaker-runtime': ^3.749.0 + '@aws-sdk/client-sfn': ^3.749.0 + '@aws-sdk/credential-provider-node': ^3.388.0 + '@aws-sdk/dsql-signer': '*' + '@azure/search-documents': ^12.0.0 + '@azure/storage-blob': ^12.15.0 + '@browserbasehq/sdk': '*' + '@browserbasehq/stagehand': ^1.0.0 + '@clickhouse/client': ^0.2.5 + '@cloudflare/ai': '*' + '@datastax/astra-db-ts': ^1.0.0 + '@elastic/elasticsearch': ^8.4.0 + '@getmetal/metal-sdk': '*' + '@getzep/zep-cloud': ^1.0.6 + '@getzep/zep-js': ^0.9.0 + '@gomomento/sdk': ^1.51.1 + '@gomomento/sdk-core': ^1.51.1 + '@google-ai/generativelanguage': '*' + '@google-cloud/storage': ^6.10.1 || ^7.7.0 + '@gradientai/nodejs-sdk': ^1.2.0 + '@huggingface/inference': ^4.0.5 + '@huggingface/transformers': ^3.5.2 + '@ibm-cloud/watsonx-ai': '*' + '@lancedb/lancedb': ^0.19.1 + '@langchain/core': '>=0.3.58 <0.4.0' + '@layerup/layerup-security': ^1.5.12 + '@libsql/client': ^0.14.0 + '@mendable/firecrawl-js': ^1.4.3 + '@mlc-ai/web-llm': '*' + '@mozilla/readability': '*' + '@neondatabase/serverless': '*' + '@notionhq/client': ^2.2.10 + '@opensearch-project/opensearch': '*' + '@pinecone-database/pinecone': '*' + '@planetscale/database': ^1.8.0 + '@premai/prem-sdk': ^0.3.25 + '@qdrant/js-client-rest': ^1.15.0 + '@raycast/api': ^1.55.2 + '@rockset/client': ^0.9.1 + '@smithy/eventstream-codec': ^2.0.5 + '@smithy/protocol-http': ^3.0.6 + '@smithy/signature-v4': ^2.0.10 + '@smithy/util-utf8': ^2.0.0 + '@spider-cloud/spider-client': ^0.0.21 + '@supabase/supabase-js': ^2.45.0 + '@tensorflow-models/universal-sentence-encoder': '*' + '@tensorflow/tfjs-converter': '*' + '@tensorflow/tfjs-core': '*' + '@upstash/ratelimit': ^1.1.3 || ^2.0.3 + '@upstash/redis': ^1.20.6 + '@upstash/vector': ^1.1.1 + '@vercel/kv': '*' + '@vercel/postgres': '*' + '@writerai/writer-sdk': ^0.40.2 + '@xata.io/client': ^0.28.0 + '@zilliz/milvus2-sdk-node': '>=2.3.5' + apify-client: ^2.7.1 + assemblyai: ^4.6.0 + azion: ^1.11.1 + better-sqlite3: '>=9.4.0 <12.0.0' + cassandra-driver: ^4.7.2 + cborg: ^4.1.1 + cheerio: ^1.0.0-rc.12 + chromadb: '*' + closevector-common: 0.1.3 + closevector-node: 0.1.6 + closevector-web: 0.1.6 + cohere-ai: '*' + convex: ^1.3.1 + crypto-js: ^4.2.0 + d3-dsv: ^2.0.0 + discord.js: ^14.14.1 + duck-duck-scrape: ^2.2.5 + epub2: ^3.0.1 + fast-xml-parser: '*' + firebase-admin: ^11.9.0 || ^12.0.0 || ^13.0.0 + google-auth-library: '*' + googleapis: '*' + hnswlib-node: ^3.0.0 + html-to-text: ^9.0.5 + ibm-cloud-sdk-core: '*' + ignore: ^5.2.0 + interface-datastore: ^8.2.11 + ioredis: ^5.3.2 + it-all: ^3.0.4 + jsdom: '*' + jsonwebtoken: ^9.0.2 + llmonitor: ^0.5.9 + lodash: ^4.17.21 + lunary: ^0.7.10 + mammoth: ^1.6.0 + mariadb: ^3.4.0 + mem0ai: ^2.1.8 + mongodb: ^6.17.0 + mysql2: ^3.9.8 + neo4j-driver: '*' + notion-to-md: ^3.1.0 + officeparser: ^4.0.4 + openai: '*' + pdf-parse: 1.1.1 + pg: ^8.11.0 + pg-copy-streams: ^6.0.5 + pickleparser: ^0.2.1 + playwright: ^1.32.1 + portkey-ai: ^0.1.11 + puppeteer: '*' + pyodide: '>=0.24.1 <0.27.0' + redis: '*' + replicate: '*' + sonix-speech-recognition: ^2.1.1 + srt-parser-2: ^1.2.3 + typeorm: ^0.3.20 + typesense: ^1.5.3 + usearch: ^1.1.1 + voy-search: 0.6.2 + weaviate-client: ^3.5.2 + web-auth-library: ^1.0.3 + word-extractor: '*' + ws: ^8.14.2 + youtubei.js: '*' + peerDependenciesMeta: + '@arcjet/redact': + optional: true + '@aws-crypto/sha256-js': + optional: true + '@aws-sdk/client-bedrock-agent-runtime': + optional: true + '@aws-sdk/client-bedrock-runtime': + optional: true + '@aws-sdk/client-dynamodb': + optional: true + '@aws-sdk/client-kendra': + optional: true + '@aws-sdk/client-lambda': + optional: true + '@aws-sdk/client-s3': + optional: true + '@aws-sdk/client-sagemaker-runtime': + optional: true + '@aws-sdk/client-sfn': + optional: true + '@aws-sdk/credential-provider-node': + optional: true + '@aws-sdk/dsql-signer': + optional: true + '@azure/search-documents': + optional: true + '@azure/storage-blob': + optional: true + '@browserbasehq/sdk': + optional: true + '@clickhouse/client': + optional: true + '@cloudflare/ai': + optional: true + '@datastax/astra-db-ts': + optional: true + '@elastic/elasticsearch': + optional: true + '@getmetal/metal-sdk': + optional: true + '@getzep/zep-cloud': + optional: true + '@getzep/zep-js': + optional: true + '@gomomento/sdk': + optional: true + '@gomomento/sdk-core': + optional: true + '@google-ai/generativelanguage': + optional: true + '@google-cloud/storage': + optional: true + '@gradientai/nodejs-sdk': + optional: true + '@huggingface/inference': + optional: true + '@huggingface/transformers': + optional: true + '@lancedb/lancedb': + optional: true + '@layerup/layerup-security': + optional: true + '@libsql/client': + optional: true + '@mendable/firecrawl-js': + optional: true + '@mlc-ai/web-llm': + optional: true + '@mozilla/readability': + optional: true + '@neondatabase/serverless': + optional: true + '@notionhq/client': + optional: true + '@opensearch-project/opensearch': + optional: true + '@pinecone-database/pinecone': + optional: true + '@planetscale/database': + optional: true + '@premai/prem-sdk': + optional: true + '@qdrant/js-client-rest': + optional: true + '@raycast/api': + optional: true + '@rockset/client': + optional: true + '@smithy/eventstream-codec': + optional: true + '@smithy/protocol-http': + optional: true + '@smithy/signature-v4': + optional: true + '@smithy/util-utf8': + optional: true + '@spider-cloud/spider-client': + optional: true + '@supabase/supabase-js': + optional: true + '@tensorflow-models/universal-sentence-encoder': + optional: true + '@tensorflow/tfjs-converter': + optional: true + '@tensorflow/tfjs-core': + optional: true + '@upstash/ratelimit': + optional: true + '@upstash/redis': + optional: true + '@upstash/vector': + optional: true + '@vercel/kv': + optional: true + '@vercel/postgres': + optional: true + '@writerai/writer-sdk': + optional: true + '@xata.io/client': + optional: true + '@zilliz/milvus2-sdk-node': + optional: true + apify-client: + optional: true + assemblyai: + optional: true + azion: + optional: true + better-sqlite3: + optional: true + cassandra-driver: + optional: true + cborg: + optional: true + cheerio: + optional: true + chromadb: + optional: true + closevector-common: + optional: true + closevector-node: + optional: true + closevector-web: + optional: true + cohere-ai: + optional: true + convex: + optional: true + crypto-js: + optional: true + d3-dsv: + optional: true + discord.js: + optional: true + duck-duck-scrape: + optional: true + epub2: + optional: true + fast-xml-parser: + optional: true + firebase-admin: + optional: true + google-auth-library: + optional: true + googleapis: + optional: true + hnswlib-node: + optional: true + html-to-text: + optional: true + ignore: + optional: true + interface-datastore: + optional: true + ioredis: + optional: true + it-all: + optional: true + jsdom: + optional: true + jsonwebtoken: + optional: true + llmonitor: + optional: true + lodash: + optional: true + lunary: + optional: true + mammoth: + optional: true + mariadb: + optional: true + mem0ai: + optional: true + mongodb: + optional: true + mysql2: + optional: true + neo4j-driver: + optional: true + notion-to-md: + optional: true + officeparser: + optional: true + pdf-parse: + optional: true + pg: + optional: true + pg-copy-streams: + optional: true + pickleparser: + optional: true + playwright: + optional: true + portkey-ai: + optional: true + puppeteer: + optional: true + pyodide: + optional: true + redis: + optional: true + replicate: + optional: true + sonix-speech-recognition: + optional: true + srt-parser-2: + optional: true + typeorm: + optional: true + typesense: + optional: true + usearch: + optional: true + voy-search: + optional: true + weaviate-client: + optional: true + web-auth-library: + optional: true + word-extractor: + optional: true + ws: + optional: true + youtubei.js: + optional: true + dependencies: + '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.43.0)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@4.104.0)(zod@3.25.76) + '@ibm-cloud/watsonx-ai': 1.7.3 + '@langchain/core': 0.3.79(openai@4.104.0) + '@langchain/openai': 0.4.9(@langchain/core@0.3.79) + '@langchain/weaviate': 0.2.3(@langchain/core@0.3.79) + binary-extensions: 2.3.0 + flat: 5.0.2 + ibm-cloud-sdk-core: 5.4.4 + js-yaml: 4.1.0 + langchain: 0.3.36(@langchain/aws@0.1.15)(@langchain/core@0.3.79)(axios@1.13.2)(openai@4.104.0) + langsmith: 0.3.79(openai@4.104.0) + math-expression-evaluator: 2.0.7 + openai: 4.104.0(zod@3.25.76) + uuid: 10.0.0 + zod: 3.25.76 + transitivePeerDependencies: + - '@langchain/anthropic' + - '@langchain/aws' + - '@langchain/cerebras' + - '@langchain/cohere' + - '@langchain/deepseek' + - '@langchain/google-genai' + - '@langchain/google-vertexai' + - '@langchain/google-vertexai-web' + - '@langchain/groq' + - '@langchain/mistralai' + - '@langchain/ollama' + - '@langchain/xai' + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - axios + - encoding + - handlebars + - peggy + dev: false + + /@langchain/core@0.3.79(openai@4.104.0): + resolution: {integrity: sha512-ZLAs5YMM5N2UXN3kExMglltJrKKoW7hs3KMZFlXUnD7a5DFKBYxPFMeXA4rT+uvTxuJRZPCYX0JKI5BhyAWx4A==} + engines: {node: '>=18'} + dependencies: + '@cfworker/json-schema': 4.1.1 + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.21 + langsmith: 0.3.79(openai@4.104.0) + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + dev: false + + /@langchain/google-common@0.1.8(@langchain/core@0.3.79)(zod@3.25.76): + resolution: {integrity: sha512-8auqWw2PMPhcHQHS+nMN3tVZrUPgSLckUaFeOHDOeSBiDvBd4KCybPwyl2oCwMDGvmyIxvOOckkMdeGaJ92vpQ==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.2.21 <0.4.0' + dependencies: + '@langchain/core': 0.3.79(openai@4.104.0) + uuid: 10.0.0 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - zod + dev: false + + /@langchain/google-gauth@0.1.8(@langchain/core@0.3.79)(zod@3.25.76): + resolution: {integrity: sha512-2QK7d5SQMrnSv7X4j05BGfO74hiA8FJuNwSsQKZvzlGoVnNXil3x2aqD5V+zsYOPpxhkDCpNlmh2Pue2Wzy1rQ==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.2.21 <0.4.0' + dependencies: + '@langchain/core': 0.3.79(openai@4.104.0) + '@langchain/google-common': 0.1.8(@langchain/core@0.3.79)(zod@3.25.76) + google-auth-library: 8.9.0 + transitivePeerDependencies: + - encoding + - supports-color + - zod + dev: false + + /@langchain/langgraph-sdk@0.0.70(@langchain/core@0.3.79): + resolution: {integrity: sha512-O8I12bfeMVz5fOrXnIcK4IdRf50IqyJTO458V56wAIHLNoi4H8/JHM+2M+Y4H2PtslXIGnvomWqlBd0eY5z/Og==} + peerDependencies: + '@langchain/core': '>=0.2.31 <0.4.0' + react: ^18 || ^19 + peerDependenciesMeta: + '@langchain/core': + optional: true + react: + optional: true + dependencies: + '@langchain/core': 0.3.79(openai@4.104.0) + '@types/json-schema': 7.0.15 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + dev: false + + /@langchain/langgraph-sdk@0.1.10(@langchain/core@0.3.79): + resolution: {integrity: sha512-9srSCb2bSvcvehMgjA2sMMwX0o1VUgPN6ghwm5Fwc9JGAKsQa6n1S4eCwy1h4abuYxwajH5n3spBw+4I2WYbgw==} + peerDependencies: + '@langchain/core': '>=0.2.31 <0.4.0 || ^1.0.0-alpha' + react: ^18 || ^19 + react-dom: ^18 || ^19 + peerDependenciesMeta: + '@langchain/core': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + '@langchain/core': 0.3.79(openai@4.104.0) + '@types/json-schema': 7.0.15 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + dev: false + + /@langchain/openai@0.4.9(@langchain/core@0.3.79): + resolution: {integrity: sha512-NAsaionRHNdqaMjVLPkFCyjUDze+OqRHghA1Cn4fPoAafz+FXcl9c7LlEl9Xo0FH6/8yiCl7Rw2t780C/SBVxQ==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.3.39 <0.4.0' + dependencies: + '@langchain/core': 0.3.79(openai@4.104.0) + js-tiktoken: 1.0.21 + openai: 4.104.0(zod@3.25.76) + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - encoding + - ws + dev: false + + /@langchain/textsplitters@0.1.0(@langchain/core@0.3.79): + resolution: {integrity: sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.2.21 <0.4.0' + dependencies: + '@langchain/core': 0.3.79(openai@4.104.0) + js-tiktoken: 1.0.21 + dev: false + + /@langchain/weaviate@0.2.3(@langchain/core@0.3.79): + resolution: {integrity: sha512-WqNGn1eSrI+ZigJd7kZjCj3fvHBYicKr054qts2nNJ+IyO5dWmY3oFTaVHFq1OLFVZJJxrFeDnxSEOC3JnfP0w==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.2.21 <0.4.0' + dependencies: + '@langchain/core': 0.3.79(openai@4.104.0) + uuid: 10.0.0 + weaviate-client: 3.9.0 + transitivePeerDependencies: + - encoding + dev: false + + /@leichtgewicht/ip-codec@2.0.5: + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + /@lukeed/csprng@1.1.0: + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + dev: false + + /@lukeed/uuid@2.0.1: + resolution: {integrity: sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==} + engines: {node: '>=8'} + dependencies: + '@lukeed/csprng': 1.1.0 + dev: false + + /@mapbox/node-pre-gyp@1.0.11: + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + dependencies: + detect-libc: 2.0.2 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.5.4 + tar: 6.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@modelcontextprotocol/sdk@1.22.0: + resolution: {integrity: sha512-VUpl106XVTCpDmTBil2ehgJZjhyLY2QZikzF8NvTXtLRF1CvO5iEE2UNZdVIUer35vFOwMKYeUGbjJtvPWan3g==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.1.0 + express-rate-limit: 7.5.1(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.1 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - supports-color + dev: false + + /@mui/core-downloads-tracker@5.18.0: + resolution: {integrity: sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==} + dev: false + + /@mui/material@5.18.0(@emotion/react@11.14.0)(@emotion/styled@11.14.1)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.28.4 + '@emotion/react': 11.14.0(@types/react@18.3.21)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0)(@types/react@18.3.21)(react@18.3.1) + '@mui/core-downloads-tracker': 5.18.0 + '@mui/system': 5.18.0(@emotion/react@11.14.0)(@emotion/styled@11.14.1)(@types/react@18.3.21)(react@18.3.1) + '@mui/types': 7.2.24(@types/react@18.3.21) + '@mui/utils': 5.17.1(@types/react@18.3.21)(react@18.3.1) + '@popperjs/core': 2.11.8 + '@types/react': 18.3.21 + '@types/react-transition-group': 4.4.12(@types/react@18.3.21) + clsx: 2.1.1 + csstype: 3.2.3 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 19.2.0 + react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) + dev: false + + /@mui/private-theming@5.17.1(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.28.4 + '@mui/utils': 5.17.1(@types/react@18.3.21)(react@18.3.1) + '@types/react': 18.3.21 + prop-types: 15.8.1 + react: 18.3.1 + dev: false + + /@mui/styled-engine@5.18.0(@emotion/react@11.14.0)(@emotion/styled@11.14.1)(react@18.3.1): + resolution: {integrity: sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + dependencies: + '@babel/runtime': 7.28.4 + '@emotion/cache': 11.14.0 + '@emotion/react': 11.14.0(@types/react@18.3.21)(react@18.3.1) + '@emotion/serialize': 1.3.3 + '@emotion/styled': 11.14.1(@emotion/react@11.14.0)(@types/react@18.3.21)(react@18.3.1) + csstype: 3.2.3 + prop-types: 15.8.1 + react: 18.3.1 + dev: false + + /@mui/system@5.18.0(@emotion/react@11.14.0)(@emotion/styled@11.14.1)(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.28.4 + '@emotion/react': 11.14.0(@types/react@18.3.21)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0)(@types/react@18.3.21)(react@18.3.1) + '@mui/private-theming': 5.17.1(@types/react@18.3.21)(react@18.3.1) + '@mui/styled-engine': 5.18.0(@emotion/react@11.14.0)(@emotion/styled@11.14.1)(react@18.3.1) + '@mui/types': 7.2.24(@types/react@18.3.21) + '@mui/utils': 5.17.1(@types/react@18.3.21)(react@18.3.1) + '@types/react': 18.3.21 + clsx: 2.1.1 + csstype: 3.2.3 + prop-types: 15.8.1 + react: 18.3.1 + dev: false + + /@mui/types@7.2.24(@types/react@18.3.21): + resolution: {integrity: sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.21 + dev: false + + /@mui/utils@5.17.1(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.28.4 + '@mui/types': 7.2.24(@types/react@18.3.21) + '@types/prop-types': 15.7.15 + '@types/react': 18.3.21 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-is: 19.2.0 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@npmcli/fs@1.1.1: + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + requiresBuild: true + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.5.4 + dev: false + optional: true + + /@npmcli/move-file@1.1.2: + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + requiresBuild: true + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: false + optional: true + + /@pinojs/redact@0.4.0: + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + dev: false + + /@playwright/test@1.43.0: + resolution: {integrity: sha512-Ebw0+MCqoYflop7wVKj711ccbNlrwTBCtjY5rlbiY9kHL2bCYxq+qltK6uPsVBGGAOb033H2VO0YobcQVxoW7Q==} + engines: {node: '>=16'} + hasBin: true + dependencies: + playwright: 1.43.0 + + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false + + /@protobuf-ts/protoc@2.11.1: + resolution: {integrity: sha512-mUZJaV0daGO6HUX90o/atzQ6A7bbN2RSuHtdwo8SSF2Qoe3zHwa4IHyCN1evftTeHfLmdz+45qo47sL+5P8nyg==} + hasBin: true + dev: false + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: false + + /@radix-ui/primitive@1.0.0: + resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} + dependencies: + '@babel/runtime': 7.23.1 + dev: false + + /@radix-ui/primitive@1.1.3: + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + dev: false + + /@radix-ui/react-compose-refs@1.0.0(react@18.3.1): + resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.21 + react: 18.3.1 + dev: false + + /@radix-ui/react-context@1.0.0(react@18.3.1): + resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-context@1.1.2(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.21 + react: 18.3.1 + dev: false + + /@radix-ui/react-dialog@1.0.0(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) + '@radix-ui/react-context': 1.0.0(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.0(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.0(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.0(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.0(react@18.3.1) + '@radix-ui/react-portal': 1.0.0(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.0.0(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.0.0(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.0(react@18.3.1) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.4(@types/react@18.3.21)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + dev: false + + /@radix-ui/react-dialog@1.1.15(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.21)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.21)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.21)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.21)(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.21)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.21)(react@18.3.1) + '@types/react': 18.3.21 + '@types/react-dom': 18.3.7(@types/react@18.3.21) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.1(@types/react@18.3.21)(react@18.3.1) + dev: false + + /@radix-ui/react-dismissable-layer@1.0.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.0.0(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.21)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.21)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.21)(react@18.3.1) + '@types/react': 18.3.21 + '@types/react-dom': 18.3.7(@types/react@18.3.21) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-focus-guards@1.0.0(react@18.3.1): + resolution: {integrity: sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-focus-guards@1.1.3(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.21 + react: 18.3.1 + dev: false + + /@radix-ui/react-focus-scope@1.0.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-focus-scope@1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.21)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.21)(react@18.3.1) + '@types/react': 18.3.21 + '@types/react-dom': 18.3.7(@types/react@18.3.21) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-id@1.0.0(react@18.3.1): + resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.3.1) + react: 18.3.1 + dev: false + + /@radix-ui/react-id@1.1.1(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.21)(react@18.3.1) + '@types/react': 18.3.21 + react: 18.3.1 + dev: false + + /@radix-ui/react-label@2.1.8(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.21 + '@types/react-dom': 18.3.7(@types/react@18.3.21) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-portal@1.0.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.21)(react@18.3.1) + '@types/react': 18.3.21 + '@types/react-dom': 18.3.7(@types/react@18.3.21) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-presence@1.0.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-presence@1.1.5(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.21)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.21)(react@18.3.1) + '@types/react': 18.3.21 + '@types/react-dom': 18.3.7(@types/react@18.3.21) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-primitive@1.0.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/react-slot': 1.0.0(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.21)(react@18.3.1) + '@types/react': 18.3.21 + '@types/react-dom': 18.3.7(@types/react@18.3.21) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-primitive@2.1.4(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-slot': 1.2.4(@types/react@18.3.21)(react@18.3.1) + '@types/react': 18.3.21 + '@types/react-dom': 18.3.7(@types/react@18.3.21) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-separator@1.1.8(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.21 + '@types/react-dom': 18.3.7(@types/react@18.3.21) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-slot@1.0.0(react@18.3.1): + resolution: {integrity: sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) + react: 18.3.1 + dev: false + + /@radix-ui/react-slot@1.2.3(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.21)(react@18.3.1) + '@types/react': 18.3.21 + react: 18.3.1 + dev: false + + /@radix-ui/react-slot@1.2.4(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.21)(react@18.3.1) + '@types/react': 18.3.21 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-callback-ref@1.0.0(react@18.3.1): + resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.21 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-controllable-state@1.0.0(react@18.3.1): + resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) + react: 18.3.1 + dev: false + + /@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.21)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.21)(react@18.3.1) + '@types/react': 18.3.21 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.21)(react@18.3.1) + '@types/react': 18.3.21 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-escape-keydown@1.0.0(react@18.3.1): + resolution: {integrity: sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) + react: 18.3.1 + dev: false + + /@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.21)(react@18.3.1) + '@types/react': 18.3.21 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-layout-effect@1.0.0(react@18.3.1): + resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.21 + react: 18.3.1 + dev: false + + /@react-aria/focus@3.21.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-JWaCR7wJVggj+ldmM/cb/DXFg47CXR55lznJhZBh4XVqJjMKwaOOqpT5vNN7kpC1wUpXicGNuDnJDN1S/+6dhQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + dependencies: + '@react-aria/interactions': 3.25.6(react-dom@18.3.1)(react@18.3.1) + '@react-aria/utils': 3.31.0(react-dom@18.3.1)(react@18.3.1) + '@react-types/shared': 3.32.1(react@18.3.1) + '@swc/helpers': 0.5.17 + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@react-aria/interactions@3.25.6(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-5UgwZmohpixwNMVkMvn9K1ceJe6TzlRlAfuYoQDUuOkk62/JVJNDLAPKIf5YMRc7d2B0rmfgaZLMtbREb0Zvkw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + dependencies: + '@react-aria/ssr': 3.9.10(react@18.3.1) + '@react-aria/utils': 3.31.0(react-dom@18.3.1)(react@18.3.1) + '@react-stately/flags': 3.1.2 + '@react-types/shared': 3.32.1(react@18.3.1) + '@swc/helpers': 0.5.17 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@react-aria/ssr@3.9.10(react@18.3.1): + resolution: {integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + dependencies: + '@swc/helpers': 0.5.17 + react: 18.3.1 + dev: false + + /@react-aria/utils@3.31.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ABOzCsZrWzf78ysswmguJbx3McQUja7yeGj6/vZo4JVsZNlxAN+E9rs381ExBRI0KzVo6iBTeX5De8eMZPJXig==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + dependencies: + '@react-aria/ssr': 3.9.10(react@18.3.1) + '@react-stately/flags': 3.1.2 + '@react-stately/utils': 3.10.8(react@18.3.1) + '@react-types/shared': 3.32.1(react@18.3.1) + '@swc/helpers': 0.5.17 + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@react-stately/flags@3.1.2: + resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} + dependencies: + '@swc/helpers': 0.5.17 + dev: false + + /@react-stately/utils@3.10.8(react@18.3.1): + resolution: {integrity: sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + dependencies: + '@swc/helpers': 0.5.17 + react: 18.3.1 + dev: false + + /@react-types/shared@3.32.1(react@18.3.1): + resolution: {integrity: sha512-famxyD5emrGGpFuUlgOP6fVW2h/ZaF405G5KDi3zPHzyjAWys/8W6NAVJtNbkCkhedmvL0xOhvt8feGXyXaw5w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + dependencies: + react: 18.3.1 + dev: false + + /@repeaterjs/repeater@3.0.6: + resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} + dev: false + + /@scarf/scarf@1.4.0: + resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} + requiresBuild: true + dev: false + + /@segment/analytics-core@1.8.2: + resolution: {integrity: sha512-5FDy6l8chpzUfJcNlIcyqYQq4+JTUynlVoCeCUuVz+l+6W0PXg+ljKp34R4yLVCcY5VVZohuW+HH0VLWdwYVAg==} + dependencies: + '@lukeed/uuid': 2.0.1 + '@segment/analytics-generic-utils': 1.2.0 + dset: 3.1.4 + tslib: 2.8.1 + dev: false + + /@segment/analytics-generic-utils@1.2.0: + resolution: {integrity: sha512-DfnW6mW3YQOLlDQQdR89k4EqfHb0g/3XvBXkovH1FstUN93eL1kfW9CsDcVQyH3bAC5ZsFyjA/o/1Q2j0QeoWw==} + dependencies: + tslib: 2.8.1 + dev: false + + /@segment/analytics-node@2.3.0: + resolution: {integrity: sha512-fOXLL8uY0uAWw/sTLmezze80hj8YGgXXlAfvSS6TUmivk4D/SP0C0sxnbpFdkUzWg2zT64qWIZj26afEtSnxUA==} + engines: {node: '>=20'} + dependencies: + '@lukeed/uuid': 2.0.1 + '@segment/analytics-core': 1.8.2 + '@segment/analytics-generic-utils': 1.2.0 + buffer: 6.0.3 + jose: 5.10.0 + node-fetch: 2.7.0 + tslib: 2.8.1 + transitivePeerDependencies: + - encoding + dev: false + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@sinonjs/commons@3.0.0: + resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + dependencies: + type-detect: 4.0.8 + dev: true + /@sinonjs/fake-timers@10.3.0: resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} dependencies: - '@sinonjs/commons': 3.0.0 - dev: true + '@sinonjs/commons': 3.0.0 + dev: true + + /@smithy/abort-controller@4.2.5: + resolution: {integrity: sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/config-resolver@4.4.3: + resolution: {integrity: sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + tslib: 2.8.1 + dev: false + + /@smithy/core@3.18.4: + resolution: {integrity: sha512-o5tMqPZILBvvROfC8vC+dSVnWJl9a0u9ax1i1+Bq8515eYjUJqqk5XjjEsDLoeL5dSqGSh6WGdVx1eJ1E/Nwhw==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/middleware-serde': 4.2.6 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-stream': 4.5.6 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + dev: false + + /@smithy/credential-provider-imds@4.2.5: + resolution: {integrity: sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/node-config-provider': 4.3.5 + '@smithy/property-provider': 4.2.5 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + tslib: 2.8.1 + dev: false + + /@smithy/eventstream-codec@4.2.5: + resolution: {integrity: sha512-Ogt4Zi9hEbIP17oQMd68qYOHUzmH47UkK7q7Gl55iIm9oKt27MUGrC5JfpMroeHjdkOliOA4Qt3NQ1xMq/nrlA==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.9.0 + '@smithy/util-hex-encoding': 4.2.0 + tslib: 2.8.1 + dev: false + + /@smithy/eventstream-serde-browser@4.2.5: + resolution: {integrity: sha512-HohfmCQZjppVnKX2PnXlf47CW3j92Ki6T/vkAT2DhBR47e89pen3s4fIa7otGTtrVxmj7q+IhH0RnC5kpR8wtw==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/eventstream-serde-universal': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/eventstream-serde-config-resolver@4.3.5: + resolution: {integrity: sha512-ibjQjM7wEXtECiT6my1xfiMH9IcEczMOS6xiCQXoUIYSj5b1CpBbJ3VYbdwDy8Vcg5JHN7eFpOCGk8nyZAltNQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/eventstream-serde-node@4.2.5: + resolution: {integrity: sha512-+elOuaYx6F2H6x1/5BQP5ugv12nfJl66GhxON8+dWVUEDJ9jah/A0tayVdkLRP0AeSac0inYkDz5qBFKfVp2Gg==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/eventstream-serde-universal': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/eventstream-serde-universal@4.2.5: + resolution: {integrity: sha512-G9WSqbST45bmIFaeNuP/EnC19Rhp54CcVdX9PDL1zyEB514WsDVXhlyihKlGXnRycmHNmVv88Bvvt4EYxWef/Q==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/eventstream-codec': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/fetch-http-handler@5.3.6: + resolution: {integrity: sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/protocol-http': 5.3.5 + '@smithy/querystring-builder': 4.2.5 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + dev: false + + /@smithy/hash-node@4.2.5: + resolution: {integrity: sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + dev: false + + /@smithy/invalid-dependency@4.2.5: + resolution: {integrity: sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/is-array-buffer@2.2.0: + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + + /@smithy/is-array-buffer@4.2.0: + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + + /@smithy/middleware-content-length@4.2.5: + resolution: {integrity: sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/middleware-endpoint@4.3.11: + resolution: {integrity: sha512-eJXq9VJzEer1W7EQh3HY2PDJdEcEUnv6sKuNt4eVjyeNWcQFS4KmnY+CKkYOIR6tSqarn6bjjCqg1UB+8UJiPQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/core': 3.18.4 + '@smithy/middleware-serde': 4.2.6 + '@smithy/node-config-provider': 4.3.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-middleware': 4.2.5 + tslib: 2.8.1 + dev: false + + /@smithy/middleware-retry@4.4.11: + resolution: {integrity: sha512-EL5OQHvFOKneJVRgzRW4lU7yidSwp/vRJOe542bHgExN3KNThr1rlg0iE4k4SnA+ohC+qlUxoK+smKeAYPzfAQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/node-config-provider': 4.3.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/service-error-classification': 4.2.5 + '@smithy/smithy-client': 4.9.7 + '@smithy/types': 4.9.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + dev: false + + /@smithy/middleware-serde@4.2.6: + resolution: {integrity: sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/middleware-stack@4.2.5: + resolution: {integrity: sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/node-config-provider@4.3.5: + resolution: {integrity: sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/node-http-handler@4.4.5: + resolution: {integrity: sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/abort-controller': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/querystring-builder': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/property-provider@4.2.5: + resolution: {integrity: sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/protocol-http@5.3.5: + resolution: {integrity: sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/querystring-builder@4.2.5: + resolution: {integrity: sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + '@smithy/util-uri-escape': 4.2.0 + tslib: 2.8.1 + dev: false + + /@smithy/querystring-parser@4.2.5: + resolution: {integrity: sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/service-error-classification@4.2.5: + resolution: {integrity: sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + dev: false + + /@smithy/shared-ini-file-loader@4.4.0: + resolution: {integrity: sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/signature-v4@5.3.5: + resolution: {integrity: sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + dev: false + + /@smithy/smithy-client@4.9.7: + resolution: {integrity: sha512-pskaE4kg0P9xNQWihfqlTMyxyFR3CH6Sr6keHYghgyqqDXzjl2QJg5lAzuVe/LzZiOzcbcVtxKYi1/fZPt/3DA==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/core': 3.18.4 + '@smithy/middleware-endpoint': 4.3.11 + '@smithy/middleware-stack': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-stream': 4.5.6 + tslib: 2.8.1 + dev: false + + /@smithy/types@4.9.0: + resolution: {integrity: sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + + /@smithy/url-parser@4.2.5: + resolution: {integrity: sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/querystring-parser': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/util-base64@4.3.0: + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + dev: false + + /@smithy/util-body-length-browser@4.2.0: + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + + /@smithy/util-body-length-node@4.2.1: + resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + + /@smithy/util-buffer-from@2.2.0: + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 + dev: false + + /@smithy/util-buffer-from@4.2.0: + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/is-array-buffer': 4.2.0 + tslib: 2.8.1 + dev: false + + /@smithy/util-config-provider@4.2.0: + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + + /@smithy/util-defaults-mode-browser@4.3.10: + resolution: {integrity: sha512-3iA3JVO1VLrP21FsZZpMCeF93aqP3uIOMvymAT3qHIJz2YlgDeRvNUspFwCNqd/j3qqILQJGtsVQnJZICh/9YA==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/property-provider': 4.2.5 + '@smithy/smithy-client': 4.9.7 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/util-defaults-mode-node@4.2.13: + resolution: {integrity: sha512-PTc6IpnpSGASuzZAgyUtaVfOFpU0jBD2mcGwrgDuHf7PlFgt5TIPxCYBDbFQs06jxgeV3kd/d/sok1pzV0nJRg==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/config-resolver': 4.4.3 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/property-provider': 4.2.5 + '@smithy/smithy-client': 4.9.7 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/util-endpoints@3.2.5: + resolution: {integrity: sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/util-hex-encoding@4.2.0: + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + + /@smithy/util-middleware@4.2.5: + resolution: {integrity: sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/util-retry@4.2.5: + resolution: {integrity: sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/service-error-classification': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/util-stream@4.5.6: + resolution: {integrity: sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/node-http-handler': 4.4.5 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + dev: false + + /@smithy/util-uri-escape@4.2.0: + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + + /@smithy/util-utf8@2.3.0: + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 + dev: false + + /@smithy/util-utf8@4.2.0: + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/util-buffer-from': 4.2.0 + tslib: 2.8.1 + dev: false + + /@smithy/uuid@1.1.0: + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.8.1 + dev: false /@stylelint/postcss-css-in-js@0.37.3(postcss-syntax@0.36.2)(postcss@7.0.39): resolution: {integrity: sha512-scLk3cSH1H9KggSniseb2KNAU5D9FWc3H7BxCSAIdtU9OWIyw0zkEZ9qEKHryRM+SExYXRKNb7tOOVNAsQ3iwg==} @@ -3781,6 +7116,27 @@ packages: - supports-color dev: true + /@swc/helpers@0.5.17: + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + dependencies: + tslib: 2.8.1 + dev: false + + /@tanstack/react-virtual@3.13.12(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + '@tanstack/virtual-core': 3.13.12 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@tanstack/virtual-core@3.13.12: + resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} + dev: false + /@testing-library/dom@7.31.2: resolution: {integrity: sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==} engines: {node: '>=10'} @@ -3846,6 +7202,10 @@ packages: '@testing-library/dom': 9.3.3 dev: true + /@tokenizer/token@0.3.0: + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + dev: false + /@tootallnate/once@1.1.2: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} @@ -3948,7 +7308,7 @@ packages: /@types/compression@1.7.3: resolution: {integrity: sha512-rKquEGjebqizyHNMOpaE/4FdYR5VQiWFeesqYfvJU0seSEyB4625UGhNOO/qIkH10S3wftiV7oefc8WdLZ/gCQ==} dependencies: - '@types/express': 4.17.18 + '@types/express': 4.17.23 dev: false /@types/connect-history-api-fallback@1.5.4: @@ -4049,6 +7409,18 @@ packages: /@types/d3-time@3.0.1: resolution: {integrity: sha512-5j/AnefKAhCw4HpITmLDTPlf4vhi8o/dES+zbegfPb7LaGfNyqkLxBR6E+4yvTAgnJLmhe80EXFMzUs38fw4oA==} + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 2.1.0 + dev: false + + /@types/estree-jsx@1.0.5: + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + dependencies: + '@types/estree': 1.0.8 + dev: false + /@types/estree@1.0.8: resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -4096,6 +7468,18 @@ packages: '@types/node': 20.7.0 dev: true + /@types/hast@2.3.10: + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + dependencies: + '@types/unist': 3.0.0 + dev: false + /@types/history@4.7.11: resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} dev: true @@ -4130,6 +7514,10 @@ packages: - supports-color dev: true + /@types/is-hotkey@0.1.10: + resolution: {integrity: sha512-RvC8KMw5BCac1NvRRyaHgMMEtBaZ6wh0pyPTBu7izn4Sj/AX9Y4aXU5c7rX8PnM/knsuUpC1IeoBkANtxBypsQ==} + dev: false + /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true @@ -4172,6 +7560,10 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true + /@types/katex@0.16.7: + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + dev: false + /@types/lodash-es@4.17.9: resolution: {integrity: sha512-ZTcmhiI3NNU7dEvWLZJkzG6ao49zOIjEgIE0RgV7wbPxU0f2xT3VSAHw2gmst8swH6V0YkLRGp4qPlX/6I90MQ==} dependencies: @@ -4185,7 +7577,12 @@ packages: resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} dependencies: '@types/unist': 2.0.8 - dev: true + + /@types/mdast@4.0.4: + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + dependencies: + '@types/unist': 3.0.0 + dev: false /@types/mime@1.3.5: resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -4198,11 +7595,28 @@ packages: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true + /@types/ms@2.1.0: + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + dev: false + + /@types/node-fetch@2.6.13: + resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} + dependencies: + '@types/node': 20.7.0 + form-data: 4.0.5 + dev: false + /@types/node-forge@1.3.11: resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} dependencies: '@types/node': 20.7.0 + /@types/node@18.19.130: + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} + dependencies: + undici-types: 5.26.5 + dev: false + /@types/node@20.7.0: resolution: {integrity: sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==} @@ -4224,7 +7638,10 @@ packages: /@types/parse-json@4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - dev: true + + /@types/prop-types@15.7.15: + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + dev: false /@types/prop-types@15.7.7: resolution: {integrity: sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==} @@ -4249,7 +7666,6 @@ packages: '@types/react': ^18.0.0 dependencies: '@types/react': 18.3.21 - dev: true /@types/react-highlight-words@0.16.4: resolution: {integrity: sha512-KITBX3xzheQLu2s3bUgLmRE7ekmhc52zRjRTwkKayQARh30L4fjEGzGm7ULK9TuX2LgxWWavZqyQGDGjAHbL3w==} @@ -4293,6 +7709,14 @@ packages: '@types/react': 18.3.21 dev: true + /@types/react-transition-group@4.4.12(@types/react@18.3.21): + resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} + peerDependencies: + '@types/react': '*' + dependencies: + '@types/react': 18.3.21 + dev: false + /@types/react-window@1.8.5: resolution: {integrity: sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==} dependencies: @@ -4321,6 +7745,10 @@ packages: form-data: 2.5.1 dev: false + /@types/retry@0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + dev: false + /@types/retry@0.12.2: resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} @@ -4328,6 +7756,10 @@ packages: resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} dev: true + /@types/semver@7.7.1: + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + dev: false + /@types/send@0.17.5: resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} dependencies: @@ -4387,6 +7819,14 @@ packages: resolution: {integrity: sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==} dev: false + /@types/uuid@10.0.0: + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + dev: false + + /@types/validator@13.15.10: + resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==} + dev: false + /@types/vfile-message@2.0.0: resolution: {integrity: sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==} deprecated: This is a stub types definition. vfile-message provides its own type definitions, so you do not need this installed. @@ -4553,6 +7993,19 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@ungap/structured-clone@1.3.0: + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + dev: false + + /@urql/core@5.2.0: + resolution: {integrity: sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==} + dependencies: + '@0no-co/graphql.web': 1.2.0 + wonka: 6.3.5 + transitivePeerDependencies: + - graphql + dev: false + /@visx/axis@3.5.0(react@18.3.1): resolution: {integrity: sha512-vaY/CGk9+iQL1BFlHd5muIAuAjpPKLwtt6HwpITErW+cImjQJlNgYdgbwDCyuJMmJqXOlC9byWlmF+iI1dOPYg==} peerDependencies: @@ -4862,6 +8315,57 @@ packages: webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.94.0) webpack-dev-server: 5.2.1(webpack-cli@5.1.4)(webpack@5.94.0) + /@whatwg-node/disposablestack@0.0.6: + resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} + engines: {node: '>=18.0.0'} + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + dev: false + + /@whatwg-node/events@0.1.2: + resolution: {integrity: sha512-ApcWxkrs1WmEMS2CaLLFUEem/49erT3sxIVjpzU5f6zmVcnijtDSrhoK2zVobOIikZJdH63jdAXOrvjf6eOUNQ==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + + /@whatwg-node/fetch@0.10.13: + resolution: {integrity: sha512-b4PhJ+zYj4357zwk4TTuF2nEe0vVtOrwdsrNo5hL+u1ojXNhh1FgJ6pg1jzDlwlT4oBdzfSwaBwMCtFCsIWg8Q==} + engines: {node: '>=18.0.0'} + dependencies: + '@whatwg-node/node-fetch': 0.8.4 + urlpattern-polyfill: 10.1.0 + dev: false + + /@whatwg-node/node-fetch@0.8.4: + resolution: {integrity: sha512-AlKLc57loGoyYlrzDbejB9EeR+pfdJdGzbYnkEuZaGekFboBwzfVYVMsy88PMriqPI1ORpiGYGgSSWpx7a2sDA==} + engines: {node: '>=18.0.0'} + dependencies: + '@fastify/busboy': 3.2.0 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + dev: false + + /@whatwg-node/promise-helpers@1.3.2: + resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + + /@whatwg-node/server@0.10.17: + resolution: {integrity: sha512-QxI+HQfJeI/UscFNCTcSri6nrHP25mtyAMbhEri7W2ctdb3EsorPuJz7IovSgNjvKVs73dg9Fmayewx1O2xOxA==} + engines: {node: '>=18.0.0'} + dependencies: + '@envelop/instrumentation': 1.0.0 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/fetch': 0.10.13 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + dev: false + /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -4875,6 +8379,10 @@ packages: /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + /abort-controller-x@0.4.3: + resolution: {integrity: sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA==} + dev: false + /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -4889,6 +8397,14 @@ packages: mime-types: 2.1.35 negotiator: 0.6.3 + /accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + dev: false + /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: @@ -4963,7 +8479,6 @@ packages: dependencies: humanize-ms: 1.2.1 dev: false - optional: true /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} @@ -4985,6 +8500,17 @@ packages: dependencies: ajv: 8.17.1 + /ajv-formats@3.0.1(ajv@8.17.1): + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.17.1 + dev: false + /ajv-keywords@3.5.2(ajv@6.12.6): resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: @@ -5059,7 +8585,6 @@ packages: /ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - dev: true /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} @@ -5101,7 +8626,13 @@ packages: /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + + /aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + dependencies: + tslib: 2.8.1 + dev: false /aria-query@4.2.2: resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} @@ -5270,6 +8801,11 @@ packages: engines: {node: '>= 4.5.0'} hasBin: true + /atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + dev: false + /author-regex@1.0.0: resolution: {integrity: sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==} engines: {node: '>=0.8'} @@ -5298,6 +8834,16 @@ packages: engines: {node: '>=4'} dev: true + /axios@1.13.2(debug@4.4.1): + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + dependencies: + follow-redirects: 1.15.9(debug@4.4.1) + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} dependencies: @@ -5389,6 +8935,15 @@ packages: '@types/babel__traverse': 7.20.2 dev: true + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.23.1 + cosmiconfig: 7.1.0 + resolve: 1.22.10 + dev: false + /babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.0): resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} peerDependencies: @@ -5503,6 +9058,10 @@ packages: /bail@1.0.5: resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + /balanced-match@0.4.2: resolution: {integrity: sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg==} dev: false @@ -5579,6 +9138,23 @@ packages: transitivePeerDependencies: - supports-color + /body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.1(supports-color@5.5.0) + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.1 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + /bonjour-service@1.3.0: resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} dependencies: @@ -5593,6 +9169,10 @@ packages: resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} dev: false + /bowser@2.12.1: + resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} + dev: false + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -5670,6 +9250,13 @@ packages: ieee754: 1.2.1 dev: true + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + /bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} @@ -5782,7 +9369,6 @@ packages: /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - dev: true /camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} @@ -5794,6 +9380,10 @@ packages: resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} dev: false + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -5826,15 +9416,31 @@ packages: resolution: {integrity: sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==} dev: false + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false + /character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + /character-entities@1.2.4: resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false + /character-reference-invalid@1.1.4: resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -5886,6 +9492,10 @@ packages: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} dev: true + /class-transformer@0.5.1: + resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} + dev: false + /class-utils@0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} @@ -5895,6 +9505,20 @@ packages: isobject: 3.0.1 static-extend: 0.1.2 + /class-validator@0.14.2: + resolution: {integrity: sha512-3kMVRF2io8N8pY1IFIXlho9r8IPUUIfHe2hYVtiebvAzU2XeQFXTv+XI4WX+TnXmtwXMDcjngcpkiPM0O9PvLw==} + dependencies: + '@types/validator': 13.15.10 + libphonenumber-js: 1.12.26 + validator: 13.15.23 + dev: false + + /class-variance-authority@0.6.1: + resolution: {integrity: sha512-eurOEGc7YVx3majOrOb099PNKgO3KnKSApOprXI4BTq6bcfbqbQXPN2u+rPPmIJ2di23bMwhk0SxCCthBmszEQ==} + dependencies: + clsx: 1.2.1 + dev: false + /classnames@2.3.2: resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} dev: false @@ -5933,7 +9557,6 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true /clone-deep@4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} @@ -5950,6 +9573,11 @@ packages: is-regexp: 2.1.0 dev: true + /clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + dev: false + /clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -5959,6 +9587,19 @@ packages: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} + /cmdk@0.2.1(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@radix-ui/react-dialog': 1.0.0(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + dev: false + /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -6033,6 +9674,10 @@ packages: resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} dev: false + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -6043,11 +9688,14 @@ packages: /commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - dev: true /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + /compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + dev: false + /component-emitter@1.3.0: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} @@ -6086,6 +9734,10 @@ packages: transitivePeerDependencies: - supports-color + /compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + dev: false + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -6101,19 +9753,29 @@ packages: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: false + /console-table-printer@2.15.0: + resolution: {integrity: sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw==} + dependencies: + simple-wcswidth: 1.1.2 + dev: false + /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 + /content-disposition@1.0.1: + resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} + engines: {node: '>=18'} + dev: false + /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -6121,6 +9783,11 @@ packages: /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + /cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + dev: false + /cookie@0.7.1: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} @@ -6186,7 +9853,6 @@ packages: parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - dev: true /create-jest-runner@0.5.3: resolution: {integrity: sha512-a9VY2doMBmzRollJB3Ft3/Y5fBceSWJ4gdyVsg4/d7nP1S4715VG939s2VnITDj79YBmRgKhjGjNRv1c+Kre1g==} @@ -6215,9 +9881,24 @@ packages: - ts-node dev: true - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /cross-inspect@1.0.1: + resolution: {integrity: sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.8.1 + dev: false /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -6227,6 +9908,15 @@ packages: shebang-command: 2.0.0 which: 2.0.2 + /cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + /css-box-model@1.2.1: resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==} dependencies: @@ -6318,6 +10008,10 @@ packages: /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + /csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + dev: false + /d3-array@1.2.4: resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} dev: false @@ -6447,6 +10141,10 @@ packages: whatwg-url: 11.0.0 dev: true + /dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dev: false + /debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -6508,6 +10206,12 @@ packages: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: true + /decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + dependencies: + character-entities: 2.0.2 + dev: false + /decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} @@ -6569,7 +10273,6 @@ packages: /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - dev: true /default-browser-id@5.0.0: resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} @@ -6657,7 +10360,6 @@ packages: /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - dev: true /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} @@ -6678,9 +10380,19 @@ packages: engines: {node: '>=8'} dev: true + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + /detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: false + /diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6691,12 +10403,22 @@ packages: engines: {node: '>=0.3.1'} dev: true + /diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + dev: false + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 + /direction@1.0.4: + resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==} + hasBin: true + dev: false + /dns-packet@5.6.1: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} @@ -6726,6 +10448,13 @@ packages: utila: 0.4.0 dev: true + /dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dependencies: + '@babel/runtime': 7.28.4 + csstype: 3.2.3 + dev: false + /dom-scroll-into-view@1.0.1: resolution: {integrity: sha512-1Dmy6uH1vRcm2+Lvggyrlc04cMh+mr+VA+qcgs085hAEZp+v+6NT/xhRjfc6vRc7965sCSDdQcw063VkG+eNmQ==} dev: false @@ -6795,6 +10524,16 @@ packages: tslib: 2.8.1 dev: true + /dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dev: false + + /dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + dev: false + /dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -6907,7 +10646,6 @@ packages: /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - dev: true /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} @@ -6931,7 +10669,6 @@ packages: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - dev: true /es-abstract@1.22.2: resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==} @@ -7037,6 +10774,16 @@ packages: has-tostringtag: 1.0.0 dev: true + /es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: false + /es-shim-unscopables@1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: @@ -7116,6 +10863,11 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + /escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} @@ -7493,6 +11245,10 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + dev: false + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -7513,6 +11269,18 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + /eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + dev: false + + /eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + dependencies: + eventsource-parser: 3.0.6 + dev: false + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -7584,6 +11352,15 @@ packages: raw-body: 2.5.2 dev: false + /express-rate-limit@7.5.1(express@5.1.0): + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + dependencies: + express: 5.1.0 + dev: false + /express@4.21.2: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} @@ -7622,6 +11399,41 @@ packages: transitivePeerDependencies: - supports-color + /express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.1 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.2.2 + debug: 4.4.1(supports-color@5.5.0) + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.1 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + /extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -7653,6 +11465,10 @@ packages: transitivePeerDependencies: - supports-color + /fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + dev: false + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -7674,12 +11490,24 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 + /fast-json-patch@3.1.1: + resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} + dev: false + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + dev: false + + /fast-text-encoding@1.0.6: + resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} + dev: false + /fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} @@ -7690,6 +11518,13 @@ packages: strnum: 1.0.5 dev: false + /fast-xml-parser@5.2.5: + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + hasBin: true + dependencies: + strnum: 2.1.1 + dev: false + /fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -7765,6 +11600,15 @@ packages: webpack: 5.94.0(webpack-cli@5.1.4) dev: true + /file-type@16.5.4: + resolution: {integrity: sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==} + engines: {node: '>=10'} + dependencies: + readable-web-to-node-stream: 3.0.4 + strtok3: 6.3.0 + token-types: 4.2.1 + dev: false + /fill-range@4.0.0: resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} @@ -7794,6 +11638,20 @@ packages: transitivePeerDependencies: - supports-color + /finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + dependencies: + debug: 4.4.1(supports-color@5.5.0) + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + /find-cache-dir@2.1.0: resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} engines: {node: '>=6'} @@ -7813,7 +11671,6 @@ packages: /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: true /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} @@ -7850,6 +11707,11 @@ packages: keyv: 4.5.3 rimraf: 3.0.2 + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + dev: false + /flatted@3.2.9: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} @@ -7883,7 +11745,7 @@ packages: tabbable: 6.2.0 dev: false - /follow-redirects@1.15.9: + /follow-redirects@1.15.9(debug@4.4.1): resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: @@ -7891,6 +11753,8 @@ packages: peerDependenciesMeta: debug: optional: true + dependencies: + debug: 4.4.1(supports-color@5.5.0) /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -7902,6 +11766,10 @@ packages: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} + /form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + dev: false + /form-data@2.5.1: resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} engines: {node: '>= 0.12'} @@ -7920,11 +11788,30 @@ packages: mime-types: 2.1.35 dev: true + /form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + dev: false + /format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} dev: false + /formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + dev: false + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -7939,6 +11826,11 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + /fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + dev: false + /from2@2.3.0: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} dependencies: @@ -7965,7 +11857,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true - dev: true optional: true /fsevents@2.3.3: @@ -8026,6 +11917,19 @@ packages: dev: false optional: true + /gaxios@5.1.3: + resolution: {integrity: sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==} + engines: {node: '>=12'} + dependencies: + extend: 3.0.2 + https-proxy-agent: 5.0.1 + is-stream: 2.0.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /gaxios@6.1.1: resolution: {integrity: sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==} engines: {node: '>=14'} @@ -8039,6 +11943,17 @@ packages: - supports-color dev: false + /gcp-metadata@5.3.0: + resolution: {integrity: sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==} + engines: {node: '>=12'} + dependencies: + gaxios: 5.1.3 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /gcp-metadata@6.1.0: resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} engines: {node: '>=14'} @@ -8073,6 +11988,11 @@ packages: hasown: 2.0.2 math-intrinsics: 1.1.0 + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} @@ -8198,6 +12118,24 @@ packages: minimist: 1.2.8 dev: true + /google-auth-library@8.9.0: + resolution: {integrity: sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==} + engines: {node: '>=12'} + dependencies: + arrify: 2.0.1 + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + fast-text-encoding: 1.0.6 + gaxios: 5.1.3 + gcp-metadata: 5.3.0 + gtoken: 6.1.2 + jws: 4.0.0 + lru-cache: 6.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /google-auth-library@9.4.1: resolution: {integrity: sha512-Chs7cuzDuav8W/BXOoRgSXw4u0zxYtuqAHETDR5Q6dG1RwNwz7NUKjsDDHAsBV3KkiiJBtJqjbzy1XU1L41w1g==} engines: {node: '>=14'} @@ -8213,6 +12151,15 @@ packages: - supports-color dev: false + /google-p12-pem@4.0.1: + resolution: {integrity: sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==} + engines: {node: '>=12.0.0'} + deprecated: Package is no longer maintained + hasBin: true + dependencies: + node-forge: 1.3.1 + dev: false + /gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -8224,6 +12171,15 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true + /graphql-query-complexity@0.12.0(graphql@16.12.0): + resolution: {integrity: sha512-fWEyuSL6g/+nSiIRgIipfI6UXTI7bAxrpPlCY1c0+V3pAEUo1ybaKmSBgNr1ed2r+agm1plJww8Loig9y6s2dw==} + peerDependencies: + graphql: ^14.6.0 || ^15.0.0 || ^16.0.0 + dependencies: + graphql: 16.12.0 + lodash.get: 4.4.2 + dev: false + /graphql-query-complexity@0.7.2(graphql@15.8.0): resolution: {integrity: sha512-+VgmrfxGEjHI3zuojWOR8bsz7Ycz/BZjNjxnlUieTz5DsB92WoIrYCSZdWG7UWZ3rfcA1Gb2Nf+wB80GsaZWuQ==} peerDependencies: @@ -8233,11 +12189,86 @@ packages: lodash.get: 4.4.2 dev: false + /graphql-request@6.1.0(graphql@16.12.0): + resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==} + peerDependencies: + graphql: 14 - 16 + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.12.0) + cross-fetch: 3.2.0 + graphql: 16.12.0 + transitivePeerDependencies: + - encoding + dev: false + + /graphql-scalars@1.25.0(graphql@16.12.0): + resolution: {integrity: sha512-b0xyXZeRFkne4Eq7NAnL400gStGqG/Sx9VqX0A05nHyEbv57UJnWKsjNnrpVqv5e/8N1MUxkt0wwcRXbiyKcFg==} + engines: {node: '>=10'} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + graphql: 16.12.0 + tslib: 2.8.1 + dev: false + + /graphql-yoga@5.16.2(graphql@16.12.0): + resolution: {integrity: sha512-heaD8ejapeEZ8+8CxB6DbYzkvMfC4gHEXr1Gc2CQCXEb5PVaDcEnQfiThBNic1KLPpuZixqQdJJ0pjcEVc9H7g==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^15.2.0 || ^16.0.0 + dependencies: + '@envelop/core': 5.4.0 + '@envelop/instrumentation': 1.0.0 + '@graphql-tools/executor': 1.4.13(graphql@16.12.0) + '@graphql-tools/schema': 10.0.29(graphql@16.12.0) + '@graphql-tools/utils': 10.10.3(graphql@16.12.0) + '@graphql-yoga/logger': 2.0.1 + '@graphql-yoga/subscription': 5.0.5 + '@whatwg-node/fetch': 0.10.13 + '@whatwg-node/promise-helpers': 1.3.2 + '@whatwg-node/server': 0.10.17 + graphql: 16.12.0 + lru-cache: 10.4.3 + tslib: 2.8.1 + dev: false + /graphql@15.8.0: resolution: {integrity: sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==} engines: {node: '>= 10.x'} dev: false + /graphql@16.12.0: + resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + dev: false + + /groq-sdk@0.5.0: + resolution: {integrity: sha512-RVmhW7qZ+XZoy5fIuSdx/LGQJONpL8MHgZEW7dFwTdgkzStub2XQx6OKv28CHogijdwH41J+Npj/z2jBPu3vmw==} + dependencies: + '@types/node': 18.19.130 + '@types/node-fetch': 2.6.13 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + web-streams-polyfill: 3.3.3 + transitivePeerDependencies: + - encoding + dev: false + + /gtoken@6.1.2: + resolution: {integrity: sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==} + engines: {node: '>=12.0.0'} + dependencies: + gaxios: 5.1.3 + google-p12-pem: 4.0.1 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /gtoken@7.0.1: resolution: {integrity: sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==} engines: {node: '>=14.0.0'} @@ -8291,6 +12322,13 @@ packages: has-symbols: 1.1.0 dev: true + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.1.0 + dev: false + /has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} dev: false @@ -8334,10 +12372,51 @@ packages: dependencies: function-bind: 1.1.2 + /hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.0 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + dev: false + /hast-util-is-element@1.1.0: resolution: {integrity: sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==} dev: false + /hast-util-parse-selector@2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + dev: false + + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + dependencies: + '@types/hast': 3.0.4 + dev: false + + /hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.0 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + /hast-util-sanitize@1.3.1: resolution: {integrity: sha512-AIeKHuHx0Wk45nSkGVa2/ujQYTksnDl8gmmKo/mwQi7ag7IBZ8cM3nJ2G86SajbjGP/HRpud6kMkPtcM2i0Tlw==} dependencies: @@ -8359,19 +12438,95 @@ packages: xtend: 4.0.2 dev: false + /hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.0 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + /hast-util-whitespace@1.0.4: resolution: {integrity: sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==} dev: false + /hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + dev: false + + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.4 + dev: false + + /hastscript@6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 1.0.8 + hast-util-parse-selector: 2.2.5 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + dev: false + + /hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + dev: false + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true dev: true + /help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + dev: false + /highlight-words-core@1.2.2: resolution: {integrity: sha512-BXUKIkUuh6cmmxzi5OIbUJxrG8OAk2MqoL1DtO3Wo9D2faJg2ph5ntyuQeLqaHJmzER6H5tllCDA9ZnNe9BVGg==} dev: false + /highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + dev: false + + /highlightjs-vue@1.0.0: + resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} + dev: false + /history@4.10.1: resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} dependencies: @@ -8437,10 +12592,18 @@ packages: engines: {node: '>=8'} dev: true + /html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + dev: false + /html-void-elements@1.0.5: resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==} dev: false + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + dev: false + /html-webpack-plugin@5.5.3(webpack@5.94.0): resolution: {integrity: sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==} engines: {node: '>=10.13.0'} @@ -8571,7 +12734,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.9 + follow-redirects: 1.15.9(debug@4.4.1) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -8606,12 +12769,34 @@ packages: dependencies: ms: 2.1.3 dev: false - optional: true /hyperdyperid@1.2.0: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} + /ibm-cloud-sdk-core@5.4.4: + resolution: {integrity: sha512-2zqgHp3W2meNJtommmgnZdouj2dPK4AbNQ4QN7BjNpfsQhWNO4eZbUYo2iD2V3I2k9mAsCjzsM87YuE+mu8gfA==} + engines: {node: '>=18'} + dependencies: + '@types/debug': 4.1.12 + '@types/node': 18.19.130 + '@types/tough-cookie': 4.0.3 + axios: 1.13.2(debug@4.4.1) + camelcase: 6.3.0 + debug: 4.4.1(supports-color@5.5.0) + dotenv: 16.6.1 + extend: 3.0.2 + file-type: 16.5.4 + form-data: 4.0.5 + isstream: 0.1.2 + jsonwebtoken: 9.0.2 + mime-types: 2.1.35 + retry-axios: 2.6.0(axios@1.13.2) + tough-cookie: 4.1.3 + transitivePeerDependencies: + - supports-color + dev: false + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -8624,6 +12809,13 @@ packages: dependencies: safer-buffer: 2.1.2 + /iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + /icss-utils@5.1.0(postcss@8.4.30): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} @@ -8635,7 +12827,6 @@ packages: /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true /ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} @@ -8653,6 +12844,10 @@ packages: resolution: {integrity: sha512-oJs6z4ogv1GefIWaMdG5s4jFRuFQ/PjUgrGBMn12SbeeIC/VgHkHr56K5yIaC8ZSyameq/7IFDQaXu0qIu6cpA==} dev: false + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + dev: false + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -8703,6 +12898,14 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: true + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false + + /inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + dev: false + /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} @@ -8780,6 +12983,10 @@ packages: /is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false + /is-alphanumeric@1.0.0: resolution: {integrity: sha512-ZmRL7++ZkcMOfDuWZuMJyIVLr2keE1o/DeNWh1EmgqGhUcV+9BIVsx0BcSBOHTZqzjs4+dISzr2KAeBEWGgXeA==} engines: {node: '>=0.10.0'} @@ -8791,6 +12998,13 @@ packages: is-alphabetical: 1.0.4 is-decimal: 1.0.4 + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: false + /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -8809,7 +13023,6 @@ packages: /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true /is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} @@ -8892,6 +13105,10 @@ packages: /is-decimal@1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false + /is-descriptor@0.1.6: resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} engines: {node: '>=0.10.0'} @@ -8962,6 +13179,14 @@ packages: /is-hexadecimal@1.0.4: resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false + + /is-hotkey@0.1.8: + resolution: {integrity: sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ==} + dev: false + /is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -9023,16 +13248,30 @@ packages: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + /is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: false + /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true + /is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + dev: false + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -9152,6 +13391,10 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + /isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + dev: false + /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} @@ -9679,10 +13922,19 @@ packages: - ts-node dev: true + /jose@5.10.0: + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + dev: false + /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - dev: true + + /js-tiktoken@1.0.21: + resolution: {integrity: sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==} + dependencies: + base64-js: 1.5.1 + dev: false /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -9706,7 +13958,6 @@ packages: hasBin: true dependencies: argparse: 2.0.1 - dev: true /jscodeshift@0.13.1(@babel/preset-env@7.28.0): resolution: {integrity: sha512-lGyiEbGOvmMRKgWk4vf+lUrCWO/8YR8sUR3FKF1Cq5fovjZDlIcw3Hu5ppLHAnEXshVffvaM0eyuY/AbOeYpnQ==} @@ -9865,6 +14116,27 @@ packages: engines: {node: '>=6'} hasBin: true + /jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + dev: false + + /jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.5.4 + dev: false + /jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -9875,6 +14147,14 @@ packages: object.values: 1.1.7 dev: true + /jwa@1.4.2: + resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + /jwa@2.0.0: resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} dependencies: @@ -9883,6 +14163,13 @@ packages: safe-buffer: 5.2.1 dev: false + /jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.2 + safe-buffer: 5.2.1 + dev: false + /jws@4.0.0: resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} dependencies: @@ -9890,6 +14177,13 @@ packages: safe-buffer: 5.2.1 dev: false + /katex@0.16.25: + resolution: {integrity: sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==} + hasBin: true + dependencies: + commander: 8.3.0 + dev: false + /keyv@4.5.3: resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} dependencies: @@ -9920,10 +14214,123 @@ packages: engines: {node: '>=6'} dev: true + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: false + /known-css-properties@0.21.0: resolution: {integrity: sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==} dev: true + /langchain@0.3.36(@langchain/aws@0.1.15)(@langchain/core@0.3.79)(axios@1.13.2)(openai@4.104.0): + resolution: {integrity: sha512-PqC19KChFF0QlTtYDFgfEbIg+SCnCXox29G8tY62QWfj9bOW7ew2kgWmPw5qoHLOTKOdQPvXET20/1Pdq8vAtQ==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/anthropic': '*' + '@langchain/aws': '*' + '@langchain/cerebras': '*' + '@langchain/cohere': '*' + '@langchain/core': '>=0.3.58 <0.4.0' + '@langchain/deepseek': '*' + '@langchain/google-genai': '*' + '@langchain/google-vertexai': '*' + '@langchain/google-vertexai-web': '*' + '@langchain/groq': '*' + '@langchain/mistralai': '*' + '@langchain/ollama': '*' + '@langchain/xai': '*' + axios: '*' + cheerio: '*' + handlebars: ^4.7.8 + peggy: ^3.0.2 + typeorm: '*' + peerDependenciesMeta: + '@langchain/anthropic': + optional: true + '@langchain/aws': + optional: true + '@langchain/cerebras': + optional: true + '@langchain/cohere': + optional: true + '@langchain/deepseek': + optional: true + '@langchain/google-genai': + optional: true + '@langchain/google-vertexai': + optional: true + '@langchain/google-vertexai-web': + optional: true + '@langchain/groq': + optional: true + '@langchain/mistralai': + optional: true + '@langchain/ollama': + optional: true + '@langchain/xai': + optional: true + axios: + optional: true + cheerio: + optional: true + handlebars: + optional: true + peggy: + optional: true + typeorm: + optional: true + dependencies: + '@langchain/aws': 0.1.15(@langchain/core@0.3.79) + '@langchain/core': 0.3.79(openai@4.104.0) + '@langchain/openai': 0.4.9(@langchain/core@0.3.79) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.79) + axios: 1.13.2(debug@4.4.1) + js-tiktoken: 1.0.21 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langsmith: 0.3.79(openai@4.104.0) + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 10.0.0 + yaml: 2.3.4 + zod: 3.25.76 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - encoding + - openai + - ws + dev: false + + /langsmith@0.3.79(openai@4.104.0): + resolution: {integrity: sha512-j5uiAsyy90zxlxaMuGjb7EdcL51Yx61SpKfDOI1nMPBbemGju+lf47he4e59Hp5K63CY8XWgFP42WeZ+zuIU4Q==} + peerDependencies: + '@opentelemetry/api': '*' + '@opentelemetry/exporter-trace-otlp-proto': '*' + '@opentelemetry/sdk-trace-base': '*' + openai: '*' + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@opentelemetry/exporter-trace-otlp-proto': + optional: true + '@opentelemetry/sdk-trace-base': + optional: true + openai: + optional: true + dependencies: + '@types/uuid': 10.0.0 + chalk: 4.1.2 + console-table-printer: 2.15.0 + openai: 4.104.0(zod@3.25.76) + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.7.3 + uuid: 10.0.0 + dev: false + /language-subtag-registry@0.3.22: resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} dev: true @@ -9952,9 +14359,12 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 + /libphonenumber-js@1.12.26: + resolution: {integrity: sha512-MagMOuqEXB2Pa90cWE+BoCmcKJx+de5uBIicaUkQ+uiEslZ0OBMNOkSZT/36syXNHu68UeayTxPm3DYM2IHoLQ==} + dev: false + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} @@ -9991,6 +14401,10 @@ packages: /lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -10001,9 +14415,33 @@ packages: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} dev: false + /lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + dev: false + /lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + /lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + dev: false + + /lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + dev: false + + /lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + dev: false + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: false + + /lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + dev: false + /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true @@ -10015,6 +14453,10 @@ packages: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} dev: true + /lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: false + /lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} @@ -10037,9 +14479,17 @@ packages: cli-cursor: 2.1.0 wrap-ansi: 5.1.0 + /long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + dev: false + /longest-streak@2.0.4: resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -10051,6 +14501,17 @@ packages: dependencies: tslib: 2.8.1 + /lowlight@1.20.0: + resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + dependencies: + fault: 1.0.4 + highlight.js: 10.7.3 + dev: false + + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + dev: false + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -10062,6 +14523,14 @@ packages: dependencies: yallist: 4.0.0 + /lucide-react@0.274.0(react@18.3.1): + resolution: {integrity: sha512-qiWcojRXEwDiSimMX1+arnxha+ROJzZjJaVvCC0rsG6a9pUPjZePXSq7em4ZKMp0NDm1hyzPNkM7UaWC3LU2AA==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.3.1 + dev: false + /lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -10148,45 +14617,274 @@ packages: resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} dev: false - /markdown-table@1.1.3: - resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} + /markdown-table@1.1.3: + resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} + dev: false + + /markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + dev: false + + /material-icons@1.13.14: + resolution: {integrity: sha512-kZOfc7xCC0rAT8Q3DQixYAeT+tBqZnxkseQtp2bxBxz7q5pMAC+wmit7vJn1g/l7wRU+HEPq23gER4iPjGs5Cg==} + dev: false + + /math-expression-evaluator@1.4.0: + resolution: {integrity: sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==} + dev: false + + /math-expression-evaluator@2.0.7: + resolution: {integrity: sha512-uwliJZ6BPHRq4eiqNWxZBDzKUiS5RIynFFcgchqhBOloVLVBpZpNG8jRYkedLcBvhph8TnRyWEuxPqiQcwIdog==} + dev: false + + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + /mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + dev: true + + /mdast-util-compact@1.0.4: + resolution: {integrity: sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==} + dependencies: + unist-util-visit: 1.4.1 + dev: false + + /mdast-util-definitions@1.2.5: + resolution: {integrity: sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==} + dependencies: + unist-util-visit: 1.4.1 + dev: false + + /mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.8 + unist-util-visit: 4.1.2 + dev: false + + /mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + dev: false + + /mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-string: 2.0.0 + micromark: 2.11.4 + parse-entities: 2.0.0 + unist-util-stringify-position: 2.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.8 + decode-named-character-reference: 1.2.0 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.0 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + dev: false + + /mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color dev: false - /math-expression-evaluator@1.4.0: - resolution: {integrity: sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==} + /mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color dev: false - /math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + /mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + dev: false - /mathml-tag-names@2.1.3: - resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} - dev: true + /mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.0 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false - /mdast-util-compact@1.0.4: - resolution: {integrity: sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==} + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} dependencies: - unist-util-visit: 1.4.1 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color dev: false - /mdast-util-definitions@1.2.5: - resolution: {integrity: sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==} + /mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} dependencies: - unist-util-visit: 1.4.1 + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 dev: false - /mdast-util-from-markdown@0.8.5: - resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + /mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} dependencies: + '@types/hast': 2.3.10 '@types/mdast': 3.0.12 - mdast-util-to-string: 2.0.0 - micromark: 2.11.4 - parse-entities: 2.0.0 - unist-util-stringify-position: 2.0.3 - transitivePeerDependencies: - - supports-color - dev: true + mdast-util-definitions: 5.1.2 + micromark-util-sanitize-uri: 1.2.0 + trim-lines: 3.0.1 + unist-util-generated: 2.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + dev: false + + /mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + dev: false /mdast-util-to-hast@4.0.0: resolution: {integrity: sha512-yOTZSxR1aPvWRUxVeLaLZ1sCYrK87x2Wusp1bDM/Ao2jETBhYUKITI3nHvgy+HkZW54HuCAhHnS0mTcbECD5Ig==} @@ -10215,10 +14913,36 @@ packages: zwitch: 1.0.5 dev: true + /mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.0 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + dev: false + /mdast-util-to-string@2.0.0: resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} dev: true + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + dependencies: + '@types/mdast': 3.0.12 + dev: false + + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.4 + dev: false + /mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} dev: false @@ -10227,6 +14951,11 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + /media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + dev: false + /memfs@4.17.2: resolution: {integrity: sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==} engines: {node: '>= 4.0.0'} @@ -10269,6 +14998,11 @@ packages: /merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + /merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + dev: false + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -10280,6 +15014,392 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + dependencies: + decode-named-character-reference: 1.2.0 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + dependencies: + micromark-util-types: 2.0.2 + dev: false + + /micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + dependencies: + '@types/katex': 0.16.7 + devlop: 1.1.0 + katex: 0.16.25 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + dependencies: + micromark-util-symbol: 2.0.1 + dev: false + + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + dependencies: + micromark-util-symbol: 2.0.1 + dev: false + + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + dev: false + + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + dev: false + + /micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + dev: false + + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + dev: false + + /micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + dev: false + + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + dependencies: + micromark-util-symbol: 2.0.1 + dev: false + + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + dependencies: + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + dependencies: + micromark-util-types: 2.0.2 + dev: false + + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + dev: false + + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + dev: false + + /micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + dev: false + + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + dev: false + + /micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + dev: false + /micromark@2.11.4: resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} dependencies: @@ -10289,6 +15409,54 @@ packages: - supports-color dev: true + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1(supports-color@5.5.0) + decode-named-character-reference: 1.2.0 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1(supports-color@5.5.0) + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /micromatch@3.1.10: resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} engines: {node: '>=0.10.0'} @@ -10337,6 +15505,13 @@ packages: dependencies: mime-db: 1.52.0 + /mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.54.0 + dev: false + /mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} @@ -10397,7 +15572,6 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true /minipass-collect@1.0.2: resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} @@ -10488,6 +15662,11 @@ packages: resolution: {integrity: sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==} dev: false + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: false + /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -10504,6 +15683,11 @@ packages: dns-packet: 5.6.1 thunky: 1.1.0 + /mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + dev: false + /nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -10547,9 +15731,35 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} + /negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + dev: false + /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + /nice-grpc-client-middleware-retry@3.1.13: + resolution: {integrity: sha512-Q9I/wm5lYkDTveKFirrTHBkBY137yavXZ4xQDXTPIycUp7aLXD8xPTHFhqtAFWUw05aS91uffZZRgdv3HS0y/g==} + dependencies: + abort-controller-x: 0.4.3 + nice-grpc-common: 2.0.2 + dev: false + + /nice-grpc-common@2.0.2: + resolution: {integrity: sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ==} + dependencies: + ts-error: 1.0.6 + dev: false + + /nice-grpc@2.1.14: + resolution: {integrity: sha512-GK9pKNxlvnU5FAdaw7i2FFuR9CqBspcE+if2tqnKXBcE0R8525wj4BZvfcwj7FjvqbssqKxRHt2nwedalbJlww==} + dependencies: + '@grpc/grpc-js': 1.14.1 + abort-controller-x: 0.4.3 + nice-grpc-common: 2.0.2 + dev: false + /no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: @@ -10581,6 +15791,12 @@ packages: dependencies: minimatch: 3.1.2 + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + dev: false + /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -10836,6 +16052,11 @@ packages: /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + /on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + dev: false + /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -10878,6 +16099,34 @@ packages: is-inside-container: 1.0.0 is-wsl: 3.1.0 + /openai@4.104.0(zod@3.25.76): + resolution: {integrity: sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + dependencies: + '@types/node': 18.19.130 + '@types/node-fetch': 2.6.13 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + zod: 3.25.76 + transitivePeerDependencies: + - encoding + dev: false + + /openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + dev: false + /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -10889,6 +16138,11 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: false + /p-is-promise@3.0.0: resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} engines: {node: '>=8'} @@ -10934,6 +16188,22 @@ packages: dev: false optional: true + /p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + dev: false + + /p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + dev: false + /p-retry@6.2.1: resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} engines: {node: '>=16.17'} @@ -10942,6 +16212,13 @@ packages: is-network-error: 1.1.0 retry: 0.13.1 + /p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + dependencies: + p-finally: 1.0.0 + dev: false + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -10986,7 +16263,18 @@ packages: is-alphanumerical: 1.0.4 is-decimal: 1.0.4 is-hexadecimal: 1.0.4 - dev: true + + /parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + dependencies: + '@types/unist': 2.0.8 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: false /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} @@ -10996,7 +16284,6 @@ packages: error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true /parse-ms@2.1.0: resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} @@ -11006,12 +16293,15 @@ packages: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: entities: 4.5.0 - dev: true /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + /partial-json@0.1.7: + resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==} + dev: false + /pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: @@ -11053,10 +16343,19 @@ packages: isarray: 0.0.1 dev: false + /path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + dev: false + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + /peek-readable@4.1.0: + resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} + engines: {node: '>=8'} + dev: false + /picocolors@0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} dev: true @@ -11072,10 +16371,62 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + /pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + dependencies: + split2: 4.2.0 + dev: false + + /pino-pretty@11.3.0: + resolution: {integrity: sha512-oXwn7ICywaZPHmu3epHGU2oJX4nPmKvHvB/bwrJHlGcbEWaVcotkpyVHMKLKmiVryWYByNp0jpgAcXpFJDXJzA==} + hasBin: true + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pump: 3.0.0 + readable-stream: 4.7.0 + secure-json-parse: 2.7.0 + sonic-boom: 4.2.0 + strip-json-comments: 3.1.1 + dev: false + + /pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + dev: false + + /pino@9.14.0: + resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==} + hasBin: true + dependencies: + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + dev: false + /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + /pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + engines: {node: '>=16.20.0'} + dev: false + /pkg-dir@3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} @@ -11092,7 +16443,6 @@ packages: resolution: {integrity: sha512-iWFjyBUH97+pUFiyTqSLd8cDMMOS0r2ZYz2qEsPjH8/bX++sbIJT35MSwKnp1r/OQBAqC5XO99xFbJ9XClhf4w==} engines: {node: '>=16'} hasBin: true - dev: true /playwright@1.43.0: resolution: {integrity: sha512-SiOKHbVjTSf6wHuGCbqrEyzlm6qvXcv7mENP+OZon1I07brfZLGdfWV0l/efAzVx7TF3Z45ov1gPEkku9q25YQ==} @@ -11102,7 +16452,6 @@ packages: playwright-core: 1.43.0 optionalDependencies: fsevents: 2.3.2 - dev: true /polished@3.7.2: resolution: {integrity: sha512-pQKtpZGmsZrW8UUpQMAnR7s3ppHeMQVNyMDKtUyKwuvDmklzcEyM5Kllb3JyE/sE/x7arDmyd35i+4vp99H6sQ==} @@ -11345,6 +16694,16 @@ packages: dependencies: parse-ms: 2.1.0 + /prismjs@1.27.0: + resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} + engines: {node: '>=6'} + dev: false + + /prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + dev: false + /private@0.1.8: resolution: {integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==} engines: {node: '>= 0.6'} @@ -11352,6 +16711,15 @@ packages: /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + /process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + dev: false + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -11398,6 +16766,33 @@ packages: xtend: 4.0.2 dev: false + /property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + dev: false + + /property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + dev: false + + /protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.7.0 + long: 5.3.2 + dev: false + /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -11405,9 +16800,12 @@ packages: forwarded: 0.2.0 ipaddr.js: 1.9.1 + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + /psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true /pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} @@ -11433,6 +16831,13 @@ packages: dependencies: side-channel: 1.1.0 + /qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.1.0 + dev: false + /query-string@5.1.1: resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} engines: {node: '>=0.10.0'} @@ -11444,7 +16849,6 @@ packages: /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -11453,6 +16857,10 @@ packages: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} dev: true + /quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + dev: false + /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} @@ -11480,6 +16888,16 @@ packages: iconv-lite: 0.4.24 unpipe: 1.0.0 + /raw-body@3.0.1: + resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + engines: {node: '>= 0.10'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.7.0 + unpipe: 1.0.0 + dev: false + /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -11571,7 +16989,60 @@ packages: /react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - dev: true + + /react-is@19.2.0: + resolution: {integrity: sha512-x3Ax3kNSMIIkyVYhWPyO09bu0uttcAIoecO/um/rKGQ4EltYWVYtyiGkS/3xMynrbVQdS69Jhlv8FXUEZehlzA==} + dev: false + + /react-markdown@10.1.0(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 18.3.21 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.0 + react: 18.3.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + dev: false + + /react-markdown@8.0.7(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + dependencies: + '@types/hast': 2.3.10 + '@types/prop-types': 15.7.7 + '@types/react': 18.3.21 + '@types/unist': 2.0.8 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 2.0.1 + prop-types: 15.8.1 + property-information: 6.5.0 + react: 18.3.1 + react-is: 18.3.1 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unified: 10.1.2 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: false /react-popper@2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==} @@ -11609,6 +17080,60 @@ packages: react-is: 17.0.2 dev: false + /react-remove-scroll-bar@2.3.8(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.21 + react: 18.3.1 + react-style-singleton: 2.2.3(@types/react@18.3.21)(react@18.3.1) + tslib: 2.8.1 + dev: false + + /react-remove-scroll@2.5.4(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.21 + react: 18.3.1 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.21)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.21)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.21)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.21)(react@18.3.1) + dev: false + + /react-remove-scroll@2.7.1(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.21 + react: 18.3.1 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.21)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.21)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.21)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.21)(react@18.3.1) + dev: false + /react-router-dom@5.3.4(react@18.3.1): resolution: {integrity: sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==} peerDependencies: @@ -11670,6 +17195,36 @@ packages: react: 18.3.1 dev: false + /react-style-singleton@2.2.3(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.21 + get-nonce: 1.0.1 + react: 18.3.1 + tslib: 2.8.1 + dev: false + + /react-syntax-highlighter@15.6.6(react@18.3.1): + resolution: {integrity: sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==} + peerDependencies: + react: '>= 0.14.0' + dependencies: + '@babel/runtime': 7.23.1 + highlight.js: 10.7.3 + highlightjs-vue: 1.0.0 + lowlight: 1.20.0 + prismjs: 1.30.0 + react: 18.3.1 + refractor: 3.6.0 + dev: false + /react-tabs@6.1.0(react@18.3.1): resolution: {integrity: sha512-6QtbTRDKM+jA/MZTTefvigNxo0zz+gnBTVFw2CFVvq+f2BuH0nF0vDLNClL045nuTAdOoK/IL1vTP0ZLX0DAyQ==} peerDependencies: @@ -11691,6 +17246,20 @@ packages: scheduler: 0.23.2 dev: true + /react-transition-group@4.4.5(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + dependencies: + '@babel/runtime': 7.28.4 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /react-window@1.8.9(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==} engines: {node: '>8.0.0'} @@ -11748,12 +17317,35 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 + /readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + dev: false + + /readable-web-to-node-stream@3.0.4: + resolution: {integrity: sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==} + engines: {node: '>=8'} + dependencies: + readable-stream: 4.7.0 + dev: false + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 + /real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + dev: false + /recast@0.16.2: resolution: {integrity: sha512-O/7qXi51DPjRVdbrpNzoBQH5dnAPQNbfoOFyRiUwreTMJfIHYOEBzwuH+c0+/BTSJ3CQyKs6ILSWXhESH6Op3A==} engines: {node: '>= 4'} @@ -11830,6 +17422,10 @@ packages: '@babel/runtime': 7.23.1 dev: false + /reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + dev: false + /reflect.getprototypeof@1.0.4: resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} engines: {node: '>= 0.4'} @@ -11842,6 +17438,14 @@ packages: which-builtin-type: 1.1.3 dev: true + /refractor@3.6.0: + resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} + dependencies: + hastscript: 6.0.0 + parse-entities: 2.0.0 + prismjs: 1.27.0 + dev: false + /regenerate-unicode-properties@10.1.1: resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} @@ -11922,6 +17526,14 @@ packages: dependencies: jsesc: 0.5.0 + /rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + dev: false + /relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} @@ -11940,6 +17552,19 @@ packages: xtend: 4.0.2 dev: false + /remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + dev: false + /remark-html@9.0.1: resolution: {integrity: sha512-1Kbk5nb3RCdVxWATOu+ZW66muXoe0NjVgIxFmCb5eOB9Vezgd7gqkOhkKjKks9Jgorwiv5l81av64UWAwuYD/Q==} dependencies: @@ -11949,6 +17574,38 @@ packages: xtend: 4.0.2 dev: false + /remark-math@6.0.0: + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} + dependencies: + '@types/mdast': 4.0.4 + mdast-util-math: 3.0.0 + micromark-extension-math: 3.1.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + dev: false + /remark-parse@6.0.3: resolution: {integrity: sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==} dependencies: @@ -11977,6 +17634,33 @@ packages: - supports-color dev: true + /remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + dependencies: + '@types/hast': 2.3.10 + '@types/mdast': 3.0.12 + mdast-util-to-hast: 12.3.0 + unified: 10.1.2 + dev: false + + /remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + dev: false + + /remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + dev: false + /remark-stringify@6.0.4: resolution: {integrity: sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==} dependencies: @@ -12133,6 +17817,15 @@ packages: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} + /retry-axios@2.6.0(axios@1.13.2): + resolution: {integrity: sha512-pOLi+Gdll3JekwuFjXO3fTq+L9lzMQGcSq7M5gIjExcl3Gu1hd4XXuf5o3+LuSBsaULQH7DiNbsqPd1chVpQGQ==} + engines: {node: '>=10.7.0'} + peerDependencies: + axios: '*' + dependencies: + axios: 1.13.2(debug@4.4.1) + dev: false + /retry-request@7.0.1: resolution: {integrity: sha512-ZI6vJp9rfB71mrZpw+n9p/B6HCsd7QJlSEQftZ+xfJzr3cQ9EPGKw1FF0BnViJ0fYREX6FhymBD2CARpmsFciQ==} engines: {node: '>=14'} @@ -12177,6 +17870,19 @@ packages: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} dev: false + /router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + dependencies: + debug: 4.4.1(supports-color@5.5.0) + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.3.0 + transitivePeerDependencies: + - supports-color + dev: false + /run-applescript@7.0.0: resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} engines: {node: '>=18'} @@ -12186,6 +17892,19 @@ packages: dependencies: queue-microtask: 1.2.3 + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.8.1 + dev: false + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: false + /safe-array-concat@1.0.1: resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} engines: {node: '>=0.4'} @@ -12215,6 +17934,11 @@ packages: dependencies: ret: 0.1.15 + /safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + dev: false + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -12260,6 +17984,12 @@ packages: ajv-formats: 2.1.1(ajv@8.17.1) ajv-keywords: 5.1.0(ajv@8.17.1) + /scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + dependencies: + compute-scroll-into-view: 1.0.20 + dev: false + /secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} dev: false @@ -12294,6 +18024,12 @@ packages: dependencies: lru-cache: 6.0.0 + /semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + dev: false + /send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} @@ -12314,6 +18050,25 @@ packages: transitivePeerDependencies: - supports-color + /send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + dependencies: + debug: 4.4.1(supports-color@5.5.0) + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + /serialize-javascript@5.0.1: resolution: {integrity: sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==} dependencies: @@ -12350,6 +18105,18 @@ packages: transitivePeerDependencies: - supports-color + /serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + dev: false + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -12480,6 +18247,10 @@ packages: semver: 7.0.0 dev: true + /simple-wcswidth@1.1.2: + resolution: {integrity: sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==} + dev: false + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true @@ -12488,6 +18259,44 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + /slate-history@0.93.0(slate@0.94.1): + resolution: {integrity: sha512-Gr1GMGPipRuxIz41jD2/rbvzPj8eyar56TVMyJBvBeIpQSSjNISssvGNDYfJlSWM8eaRqf6DAcxMKzsLCYeX6g==} + peerDependencies: + slate: '>=0.65.3' + dependencies: + is-plain-object: 5.0.0 + slate: 0.94.1 + dev: false + + /slate-react@0.98.4(react-dom@18.3.1)(react@18.3.1)(slate@0.94.1): + resolution: {integrity: sha512-8Of3v9hFuX8rIRc86LuuBhU9t8ps+9ARKL4yyhCrKQYZ93Ep/LFA3GvPGvtf3zYuVadZ8tkhRH8tbHOGNAndLw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + slate: '>=0.65.3' + dependencies: + '@juggle/resize-observer': 3.4.0 + '@types/is-hotkey': 0.1.10 + '@types/lodash': 4.14.199 + direction: 1.0.4 + is-hotkey: 0.1.8 + is-plain-object: 5.0.0 + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + scroll-into-view-if-needed: 2.2.31 + slate: 0.94.1 + tiny-invariant: 1.0.6 + dev: false + + /slate@0.94.1: + resolution: {integrity: sha512-GH/yizXr1ceBoZ9P9uebIaHe3dC/g6Plpf9nlUwnvoyf6V1UOYrRwkabtOCd3ZfIGxomY4P7lfgLr7FPH8/BKA==} + dependencies: + immer: 9.0.21 + is-plain-object: 5.0.0 + tiny-warning: 1.0.3 + dev: false + /slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} @@ -12562,6 +18371,12 @@ packages: dev: false optional: true + /sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + dependencies: + atomic-sleep: 1.0.0 + dev: false + /source-list-map@2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} dev: true @@ -12610,6 +18425,10 @@ packages: resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} dev: false + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: @@ -12667,6 +18486,11 @@ packages: dependencies: extend-shallow: 3.0.2 + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: false + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -12841,6 +18665,13 @@ packages: is-hexadecimal: 1.0.4 dev: false + /stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + /strip-ansi@5.2.0: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} @@ -12888,6 +18719,18 @@ packages: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} dev: false + /strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + dev: false + + /strtok3@6.3.0: + resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} + engines: {node: '>=10'} + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 4.1.0 + dev: false + /stubs@3.0.0: resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} dev: false @@ -12905,6 +18748,24 @@ packages: resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} dev: true + /style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + dependencies: + style-to-object: 1.0.14 + dev: false + + /style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + + /style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + dependencies: + inline-style-parser: 0.2.7 + dev: false + /styled-components@4.4.1(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-RNqj14kYzw++6Sr38n7197xG33ipEOktGElty4I70IKzQF1jzaD1U4xQ+Ny/i03UUhHlC5NWEO+d8olRCDji6g==} requiresBuild: true @@ -13040,6 +18901,10 @@ packages: /stylis@3.5.4: resolution: {integrity: sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==} + /stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + dev: false + /sugarss@2.0.0: resolution: {integrity: sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==} dependencies: @@ -13096,6 +18961,10 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 + /tailwind-merge@1.14.0: + resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} + dev: false + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -13243,6 +19112,12 @@ packages: dependencies: tslib: 2.8.1 + /thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + dependencies: + real-require: 0.2.0 + dev: false + /throat@4.1.0: resolution: {integrity: sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==} @@ -13254,6 +19129,10 @@ packages: /thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + /tiny-invariant@1.0.6: + resolution: {integrity: sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==} + dev: false + /tiny-invariant@1.3.1: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} dev: false @@ -13307,6 +19186,14 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + /token-types@4.2.1: + resolution: {integrity: sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==} + engines: {node: '>=10'} + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + dev: false + /touch@3.1.0: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true @@ -13322,7 +19209,6 @@ packages: punycode: 2.3.0 universalify: 0.2.0 url-parse: 1.5.10 - dev: true /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -13347,6 +19233,10 @@ packages: resolution: {integrity: sha512-E0ZosSWYK2mkSu+KEtQ9/KqarVjA9HztOSX+9FDdNacRAq29RRV6ZQNgob3iuW8Htar9vAfEa6yyt5qBAHZDBA==} dev: false + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} @@ -13364,6 +19254,14 @@ packages: /trough@1.0.5: resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + /trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + dev: false + + /ts-error@1.0.6: + resolution: {integrity: sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==} + dev: false + /ts-jest@29.1.1(@babel/core@7.23.0)(babel-jest@29.7.0)(jest@29.7.0)(typescript@5.2.2): resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13565,6 +19463,28 @@ packages: engines: {node: '>=8'} dev: true + /type-graphql@2.0.0-rc.1(class-validator@0.14.2)(graphql-scalars@1.25.0)(graphql@16.12.0): + resolution: {integrity: sha512-HCu4j3jR0tZvAAoO7DMBT3MRmah0DFRe5APymm9lXUghXA0sbhiMf6SLRafRYfk0R0KiUQYRduuGP3ap1RnF1Q==} + engines: {node: '>= 18.12.0'} + peerDependencies: + class-validator: '>=0.14.0' + graphql: ^16.8.1 + graphql-scalars: ^1.22.4 + peerDependenciesMeta: + class-validator: + optional: true + dependencies: + '@graphql-yoga/subscription': 5.0.5 + '@types/node': 20.7.0 + '@types/semver': 7.7.1 + class-validator: 0.14.2 + graphql: 16.12.0 + graphql-query-complexity: 0.12.0(graphql@16.12.0) + graphql-scalars: 1.25.0(graphql@16.12.0) + semver: 7.5.4 + tslib: 2.8.1 + dev: false + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -13572,6 +19492,15 @@ packages: media-typer: 0.3.0 mime-types: 2.1.35 + /type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + dev: false + /typed-array-buffer@1.0.0: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} @@ -13634,6 +19563,10 @@ packages: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: false + /unherit@1.1.3: resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==} dependencies: @@ -13664,6 +19597,30 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.8 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 5.3.7 + dev: false + + /unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + dependencies: + '@types/unist': 3.0.0 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + dev: false + /unified@7.1.0: resolution: {integrity: sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==} dependencies: @@ -13730,6 +19687,10 @@ packages: resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==} dev: false + /unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + dev: false + /unist-util-is@2.1.3: resolution: {integrity: sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==} dev: false @@ -13742,16 +19703,47 @@ packages: resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} dev: true + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + dependencies: + '@types/unist': 3.0.0 + dev: false + /unist-util-position@3.1.0: resolution: {integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==} dev: false + /unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.0 + dev: false + /unist-util-remove-position@1.1.4: resolution: {integrity: sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==} dependencies: unist-util-visit: 1.4.1 dev: false + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + dependencies: + '@types/unist': 3.0.0 + unist-util-visit: 5.0.0 + dev: false + /unist-util-stringify-position@1.1.2: resolution: {integrity: sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==} dev: false @@ -13762,6 +19754,12 @@ packages: '@types/unist': 2.0.8 dev: true + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.8 + dev: false + /unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} dependencies: @@ -13774,16 +19772,45 @@ packages: unist-util-is: 3.0.0 dev: false + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.8 + unist-util-is: 5.2.1 + dev: false + + /unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + dependencies: + '@types/unist': 3.0.0 + unist-util-is: 6.0.1 + dev: false + /unist-util-visit@1.4.1: resolution: {integrity: sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==} dependencies: unist-util-visit-parents: 2.1.2 dev: false + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.8 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + dev: false + /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} - dev: true /unixify@1.0.0: resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} @@ -13803,6 +19830,10 @@ packages: has-value: 0.3.1 isobject: 3.0.1 + /untruncate-json@0.0.1: + resolution: {integrity: sha512-4W9enDK4X1y1s2S/Rz7ysw6kDuMS3VmRjMFg7GZrNO+98OSe+x5Lh7PKYoVjy3lW/1wmhs6HW0lusnQRHgMarA==} + dev: false + /updatable-log@0.2.0: resolution: {integrity: sha512-gR48/mTR6YFB+B1sNoap3nx8HFbEvDl0ej9KhlQTFZdmP8yL5fzFiCUfeHCUf1QvNnXowY1pM9iiGkPKrd0XyQ==} dependencies: @@ -13834,7 +19865,36 @@ packages: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - dev: true + + /urlpattern-polyfill@10.1.0: + resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + dev: false + + /urql@4.2.2(@urql/core@5.2.0)(react@18.3.1): + resolution: {integrity: sha512-3GgqNa6iF7bC4hY/ImJKN4REQILcSU9VKcKL8gfELZM8mM5BnLH1BsCc8kBdnVGD1LIFOs4W3O2idNHhON1r0w==} + peerDependencies: + '@urql/core': ^5.0.0 + react: '>= 16.8.0' + dependencies: + '@urql/core': 5.2.0 + react: 18.3.1 + wonka: 6.3.5 + dev: false + + /use-callback-ref@1.3.3(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.21 + react: 18.3.1 + tslib: 2.8.1 + dev: false /use-memo-one@1.1.3(react@18.3.1): resolution: {integrity: sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==} @@ -13844,6 +19904,30 @@ packages: react: 18.3.1 dev: false + /use-sidecar@1.1.3(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.21 + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.8.1 + dev: false + + /use-sync-external-store@1.6.0(react@18.3.1): + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + react: 18.3.1 + dev: false + /use@3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} @@ -13865,6 +19949,16 @@ packages: base64-arraybuffer: 1.0.2 dev: false + /uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + dev: false + + /uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + dev: false + /uuid@2.0.3: resolution: {integrity: sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. @@ -13879,6 +19973,17 @@ packages: hasBin: true dev: false + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.3 + diff: 5.2.0 + kleur: 4.1.5 + sade: 1.8.1 + dev: false + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true @@ -13902,6 +20007,11 @@ packages: spdx-expression-parse: 3.0.1 dev: true + /validator@13.15.23: + resolution: {integrity: sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw==} + engines: {node: '>= 0.10'} + dev: false + /value-equal@1.0.1: resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} dev: false @@ -13919,6 +20029,13 @@ packages: resolution: {integrity: sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==} dev: false + /vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + dependencies: + '@types/unist': 3.0.0 + vfile: 6.0.3 + dev: false + /vfile-message@1.1.1: resolution: {integrity: sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==} dependencies: @@ -13932,6 +20049,13 @@ packages: unist-util-stringify-position: 2.0.3 dev: true + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + dependencies: + '@types/unist': 2.0.8 + unist-util-stringify-position: 3.0.3 + dev: false + /vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} dependencies: @@ -13957,6 +20081,22 @@ packages: vfile-message: 2.0.4 dev: true + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + dependencies: + '@types/unist': 2.0.8 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: false + + /vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + dependencies: + '@types/unist': 3.0.0 + vfile-message: 4.0.2 + dev: false + /w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} @@ -13988,6 +20128,36 @@ packages: dependencies: minimalistic-assert: 1.0.1 + /weaviate-client@3.9.0: + resolution: {integrity: sha512-7qwg7YONAaT4zWnohLrFdzky+rZegVe76J+Tky/+7tuyvjFpdKgSrdqI/wPDh8aji0ZGZrL4DdGwGfFnZ+uV4w==} + engines: {node: '>=18.0.0'} + dependencies: + abort-controller-x: 0.4.3 + graphql: 16.12.0 + graphql-request: 6.1.0(graphql@16.12.0) + long: 5.3.2 + nice-grpc: 2.1.14 + nice-grpc-client-middleware-retry: 3.1.13 + nice-grpc-common: 2.0.2 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + dev: false + + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false + + /web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + dev: false + + /web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + dev: false + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: false @@ -14270,6 +20440,10 @@ packages: /wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + /wonka@6.3.5: + resolution: {integrity: sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==} + dev: false + /wrap-ansi@5.1.0: resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} engines: {node: '>=6'} @@ -14293,7 +20467,6 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -14371,7 +20544,6 @@ packages: /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: true /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -14382,7 +20554,6 @@ packages: /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - dev: true /yaml@2.3.4: resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} @@ -14404,7 +20575,6 @@ packages: /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - dev: true /yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} @@ -14433,7 +20603,6 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} @@ -14444,6 +20613,22 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + /zod-to-json-schema@3.24.6(zod@3.25.76): + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} + peerDependencies: + zod: ^3.24.1 + dependencies: + zod: 3.25.76 + dev: false + + /zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + dev: false + /zwitch@1.0.5: resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} dev: true + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false From 11b43f717b990b8d1e53a1aabe90761d0fa87548 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 19 Nov 2025 09:34:47 -0500 Subject: [PATCH 16/48] update tsv ref --- copilotkit-server/start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/copilotkit-server/start.sh b/copilotkit-server/start.sh index 9ec02b072..33b78550e 100755 --- a/copilotkit-server/start.sh +++ b/copilotkit-server/start.sh @@ -1,6 +1,6 @@ #!/bin/bash -export MENDELIAN_TSV_PATH=/Users/msolomon/code/random/mono2/gmd-api/data/gene-disease-table_8_13_2025.tsv +export MENDELIAN_TSV_PATH=/Users/msolomon/code/browser-ecosystem/gmd-api/data/gene-disease-table_8_13_2025.tsv export NODE_ENV=${NODE_ENV:-development} From f1121b9a6109a17b166304428204690132a30b83 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 19 Nov 2025 11:59:03 -0500 Subject: [PATCH 17/48] feat: add region context support and Juha API query suggestions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add region context to MCP tools by passing region data to DocumentTitle component and handling it in the context detection logic. This enables the assistant to access genomic region information (chrom, start, stop). Add example pill questions for Juha Genetics API queries across variant, gene, and region pages. Users can now easily query for credible sets, colocalizations, QTL data, and gene-disease associations. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- browser/src/DocumentTitle.ts | 9 ++++++++ browser/src/GnomadCopilot.tsx | 31 ++++++++++++++++++++++++++- browser/src/RegionPage/RegionPage.tsx | 1 + 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/browser/src/DocumentTitle.ts b/browser/src/DocumentTitle.ts index f57b923c3..9d783fc8b 100644 --- a/browser/src/DocumentTitle.ts +++ b/browser/src/DocumentTitle.ts @@ -32,6 +32,15 @@ const DocumentTitle = ({ title, pageContext }: any) => { rsids: pageContext.rsids, } contextValue = JSON.stringify(variantContext, null, 2) + } else if (pageContext.chrom && pageContext.start && pageContext.stop) { + contextDescription = 'The currently viewed genomic region' + const regionContext = { + chrom: pageContext.chrom, + start: pageContext.start, + stop: pageContext.stop, + reference_genome: pageContext.reference_genome, + } + contextValue = JSON.stringify(regionContext, null, 2) } else { // Fallback for other contexts that might be passed contextValue = JSON.stringify(pageContext, null, 2) diff --git a/browser/src/GnomadCopilot.tsx b/browser/src/GnomadCopilot.tsx index 19f69f9f6..a1b1bd676 100644 --- a/browser/src/GnomadCopilot.tsx +++ b/browser/src/GnomadCopilot.tsx @@ -111,6 +111,7 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { // Show "interpret this variant" suggestion only on variant pages const isVariantPage = location.pathname.startsWith('/variant/') const isGenePage = location.pathname.startsWith('/gene/') + const isRegionPage = location.pathname.startsWith('/region/') // Define suggestions based on the current page const suggestions = useMemo(() => { @@ -136,6 +137,14 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { title: "Check in silico predictors", message: "What do in silico predictors like REVEL and CADD say about this variant?", }, + { + title: "Find credible sets for variant", + message: "Using the Juha API, find credible sets from GWAS, eQTL, and pQTL studies for this variant.", + }, + { + title: "Check variant for colocalization", + message: "Using the Juha API, find traits that colocalize at this variant's locus.", + }, ] } if (isGenePage) { @@ -156,10 +165,30 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { title: "Analyze expression regions (Pext)", message: "Provide a Pext analysis for this gene to identify functionally important regions.", }, + { + title: "Find associations in gene region", + message: "Using the Juha API, find GWAS, eQTL, and pQTL credible sets in this gene's region.", + }, + { + title: "Find QTLs for this gene", + message: "Using the Juha API, find QTLs (eQTLs, pQTLs) where this gene is the target.", + }, + { + title: "Find curated disease associations", + message: "Using the Juha API, what diseases are associated with this gene from curated sources like ClinGen and GenCC?", + }, + ] + } + if (isRegionPage) { + return [ + { + title: "Find associations in region", + message: "Using the Juha API, find GWAS, eQTL, and pQTL credible sets that overlap with this genomic region.", + }, ] } return [] - }, [isVariantPage, isGenePage]) + }, [isVariantPage, isGenePage, isRegionPage]) useCopilotAction({ name: 'navigateToVariantPage', diff --git a/browser/src/RegionPage/RegionPage.tsx b/browser/src/RegionPage/RegionPage.tsx index ff7e91016..d828edcd0 100644 --- a/browser/src/RegionPage/RegionPage.tsx +++ b/browser/src/RegionPage/RegionPage.tsx @@ -119,6 +119,7 @@ const RegionPage = ({ datasetId, region }: RegionPageProps) => { } From 68d23703cfa52cbe2f5cc3c3424fde03ef7660c3 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 19 Nov 2025 13:29:38 -0500 Subject: [PATCH 18/48] feat: add Juha API presentation components with virtualized tables MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Create table column definitions for credible sets, colocalizations, and gene-disease data - Implement JuhaToolsDisplay component with virtualized Grid tables for large datasets - Add useJuhaActions hook defining 6 frontend MCP actions for Juha API tools - Integrate Juha actions into GnomadCopilot - Support proper sorting state management for each table type - Fix React key uniqueness and variant link generation - Add proper spacing to prevent visual overlap with LLM summaries 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- browser/src/GnomadCopilot.tsx | 4 + .../src/gmd/components/JuhaToolsDisplay.tsx | 222 ++++++++++++++++++ .../components/colocalizationTableColumns.tsx | 36 +++ .../components/credibleSetTableColumns.tsx | 84 +++++++ .../components/geneDiseaseTableColumns.tsx | 45 ++++ browser/src/gmd/hooks/useJuhaActions.tsx | 125 ++++++++++ 6 files changed, 516 insertions(+) create mode 100644 browser/src/gmd/components/JuhaToolsDisplay.tsx create mode 100644 browser/src/gmd/components/colocalizationTableColumns.tsx create mode 100644 browser/src/gmd/components/credibleSetTableColumns.tsx create mode 100644 browser/src/gmd/components/geneDiseaseTableColumns.tsx create mode 100644 browser/src/gmd/hooks/useJuhaActions.tsx diff --git a/browser/src/GnomadCopilot.tsx b/browser/src/GnomadCopilot.tsx index a1b1bd676..11fe91151 100644 --- a/browser/src/GnomadCopilot.tsx +++ b/browser/src/GnomadCopilot.tsx @@ -5,6 +5,7 @@ import { useCopilotAction } from '@copilotkit/react-core' import { useHistory, useLocation } from 'react-router-dom' import { useMCPStateRender } from './hooks/useMCPStateRender' import { useGnomadVariantActions } from './gmd/hooks/useGnomadVariantActions' +import { useJuhaActions } from './gmd/hooks/useJuhaActions' import '@copilotkit/react-ui/styles.css' const PageContainer = styled.div` @@ -108,6 +109,9 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { // Initialize gnomAD variant actions useGnomadVariantActions() + // Initialize Juha API actions + useJuhaActions() + // Show "interpret this variant" suggestion only on variant pages const isVariantPage = location.pathname.startsWith('/variant/') const isGenePage = location.pathname.startsWith('/gene/') diff --git a/browser/src/gmd/components/JuhaToolsDisplay.tsx b/browser/src/gmd/components/JuhaToolsDisplay.tsx new file mode 100644 index 000000000..7db90cf5a --- /dev/null +++ b/browser/src/gmd/components/JuhaToolsDisplay.tsx @@ -0,0 +1,222 @@ +import React, { forwardRef, memo, useState } from 'react' +import styled from 'styled-components' +import { Grid } from '@gnomad/ui' +import credibleSetTableColumns from './credibleSetTableColumns' +import colocalizationTableColumns from './colocalizationTableColumns' +import geneDiseaseTableColumns from './geneDiseaseTableColumns' +import VariantLoading from './VariantLoading' // Re-using for now, can be specialized + +const DisplayWrapper = styled.div` + width: 100%; + max-width: 100%; + margin: 10px 0; + margin-bottom: 20px; +` + +const ErrorMessage = styled.div` + padding: 20px; + background-color: #ffebee; + border: 1px solid #ffcdd2; + border-radius: 4px; + color: #c62828; +` + +const NoResultsMessage = styled.div` + padding: 20px; + background-color: #f5f5f5; + border: 1px solid #e0e0e0; + border-radius: 4px; + color: #666; + text-align: center; +` + +const TableContainer = styled.div` + height: 500px; + min-height: 500px; + margin-bottom: 40px; + position: relative; +` + +// CredibleSetTable Component +const CredibleSetTable = memo( + forwardRef((props: any, ref) => { + const { columns, variants, sortKey, sortOrder, onRequestSort, ...rest } = props + return ( + `${variant.cs_id}-${variant.chr}-${variant.pos}-${variant.ref}-${variant.alt}-${variant.resource}-${variant.data_type}`} + /> + ) + }) +) + +CredibleSetTable.displayName = 'CredibleSetTable' + +// ColocalizationTable Component +const ColocalizationTable = memo( + forwardRef((props: any, ref) => { + const { columns, variants, sortKey, sortOrder, onRequestSort, ...rest } = props + return ( + `${variant.cs1_id}-${variant.cs2_id}-${variant.chr}`} + /> + ) + }) +) + +ColocalizationTable.displayName = 'ColocalizationTable' + +// GeneDiseaseTable Component +const GeneDiseaseTable = memo( + forwardRef((props: any, ref) => { + const { columns, data, sortKey, sortOrder, onRequestSort, ...rest } = props + return ( + // @ts-expect-error TS(2769) FIXME: No overload matches this call. + `${row.uuid}-${row.gene_symbol}-${row.disease_curie}-${row.submitter}`} + /> + ) + }) +) +GeneDiseaseTable.displayName = 'GeneDiseaseTable' + +// Main Display Component +const JuhaToolsDisplay = ({ data, toolName }: { data: any, toolName: string }) => { + // Debug logging + console.log('[JuhaToolsDisplay] Received data:', data) + console.log('[JuhaToolsDisplay] Data type:', typeof data) + console.log('[JuhaToolsDisplay] Data keys:', data ? Object.keys(data) : 'null') + console.log('[JuhaToolsDisplay] Is array?:', Array.isArray(data)) + + if (data.error) { + return ( + + Error: {data.error} + + ) + } + + const processedData = Array.isArray(data) ? data : data.results || [] + console.log('[JuhaToolsDisplay] Processed data length:', processedData.length) + console.log('[JuhaToolsDisplay] First item:', processedData[0]) + + if (processedData.length === 0) { + return ( + + No results found for {toolName}. + + ) + } + + // Determine which table to render based on data shape + const firstItem = processedData[0] + + // State for sorting + const [sortKey, setSortKey] = useState('') + const [sortOrder, setSortOrder] = useState<'ascending' | 'descending'>('descending') + + const handleRequestSort = (newSortKey: string) => { + if (newSortKey === sortKey) { + setSortOrder(sortOrder === 'ascending' ? 'descending' : 'ascending') + } else { + setSortKey(newSortKey) + setSortOrder('descending') + } + } + + if (firstItem.cs_id) { // Credible Set data + const defaultSortKey = sortKey || 'mlog10p' + return ( + + + + + + ) + } else if (firstItem['PP.H4.abf'] !== undefined || firstItem.cs1_id !== undefined) { // Colocalization data + const defaultSortKey = sortKey || 'PP.H4.abf' + return ( + + + + + + ) + } else if (firstItem.disease_curie) { // Gene-Disease data + const defaultSortKey = sortKey || 'disease_title' + return ( + + + + + + ) + } + + return ( + + + Unknown data format received from tool. + {process.env.NODE_ENV === 'development' && ( +
    + Sample data keys: {firstItem ? JSON.stringify(Object.keys(firstItem)) : 'no data'} +
    + )} +
    +
    + ) +} + +export default JuhaToolsDisplay + +// Loading Component +export const JuhaToolsLoading: React.FC<{ message: string }> = ({ message }) => { + // We can reuse VariantLoading for simplicity for now. + return +} diff --git a/browser/src/gmd/components/colocalizationTableColumns.tsx b/browser/src/gmd/components/colocalizationTableColumns.tsx new file mode 100644 index 000000000..725b043c6 --- /dev/null +++ b/browser/src/gmd/components/colocalizationTableColumns.tsx @@ -0,0 +1,36 @@ +import React from 'react' +import { Cell, NumericCell } from '../../tableCells' +import { makeNumericCompareFunction, makeStringCompareFunction } from '../../VariantList/sortUtilities' + +const colocalizationTableColumns = [ + { + key: 'trait1_original', + heading: 'Trait 1', + minWidth: 200, + compareFunction: makeStringCompareFunction('trait1_original'), + render: (row: any) => {row.trait1_original}, + }, + { + key: 'trait2_original', + heading: 'Trait 2', + minWidth: 200, + compareFunction: makeStringCompareFunction('trait2_original'), + render: (row: any) => {row.trait2_original}, + }, + { + key: 'PP.H4.abf', + heading: 'P(H4)', + minWidth: 80, + compareFunction: makeNumericCompareFunction('PP.H4.abf'), + render: (row: any) => {row['PP.H4.abf'].toFixed(3)}, + }, + { + key: 'clpp', + heading: 'CLPP', + minWidth: 80, + compareFunction: makeNumericCompareFunction('clpp'), + render: (row: any) => {row.clpp.toFixed(3)}, + }, +] + +export default colocalizationTableColumns diff --git a/browser/src/gmd/components/credibleSetTableColumns.tsx b/browser/src/gmd/components/credibleSetTableColumns.tsx new file mode 100644 index 000000000..316f935e5 --- /dev/null +++ b/browser/src/gmd/components/credibleSetTableColumns.tsx @@ -0,0 +1,84 @@ +import React from 'react' +import { Cell, NumericCell } from '../../tableCells' +import Link from '../../Link' +import { makeNumericCompareFunction, makeStringCompareFunction } from '../../VariantList/sortUtilities' +import { TooltipAnchor, TooltipHint } from '@gnomad/ui' + +const credibleSetTableColumns = [ + { + key: 'resource', + heading: 'Resource', + minWidth: 100, + compareFunction: makeStringCompareFunction('resource'), + render: (row: any) => {row.resource}, + }, + { + key: 'data_type', + heading: 'Data Type', + minWidth: 80, + compareFunction: makeStringCompareFunction('data_type'), + render: (row: any) => {row.data_type}, + }, + { + key: 'trait', + heading: 'Trait', + minWidth: 200, + compareFunction: makeStringCompareFunction('trait_original'), + render: (row: any) => {row.trait_original}, + }, + { + key: 'variant_id', + heading: 'Variant', + minWidth: 150, + compareFunction: makeNumericCompareFunction('pos'), + render: (row: any) => { + const variantId = `${row.chr}-${row.pos}-${row.ref}-${row.alt}` + return ( + + {variantId} + + ) + }, + }, + { + key: 'mlog10p', + heading: '-log10(p)', + minWidth: 80, + compareFunction: makeNumericCompareFunction('mlog10p'), + render: (row: any) => {row.mlog10p.toFixed(2)}, + }, + { + key: 'beta', + heading: 'Beta', + minWidth: 80, + compareFunction: makeNumericCompareFunction('beta'), + render: (row: any) => {row.beta ? row.beta.toExponential(2) : 'N/A'}, + }, + { + key: 'pip', + heading: ( + + {/* @ts-expect-error TS(2745) FIXME: This JSX tag's 'children' prop expects type 'never... Remove this comment to see the full error message */} + PIP + + ), + minWidth: 80, + compareFunction: makeNumericCompareFunction('pip'), + render: (row: any) => {row.pip ? row.pip.toFixed(3) : 'N/A'}, + }, + { + key: 'gene_most_severe', + heading: 'Gene', + minWidth: 100, + compareFunction: makeStringCompareFunction('gene_most_severe'), + render: (row: any) => ( + + {row.gene_most_severe && ( + {row.gene_most_severe} + )} + + ), + }, +] + +export default credibleSetTableColumns diff --git a/browser/src/gmd/components/geneDiseaseTableColumns.tsx b/browser/src/gmd/components/geneDiseaseTableColumns.tsx new file mode 100644 index 000000000..081c9d1ca --- /dev/null +++ b/browser/src/gmd/components/geneDiseaseTableColumns.tsx @@ -0,0 +1,45 @@ +import React from 'react' +import { Cell } from '../../tableCells' +import { makeStringCompareFunction } from '../../VariantList/sortUtilities' +import { ExternalLink } from '@gnomad/ui' + +const getMondoId = (curie: string) => curie.replace('MONDO:', '') + +const geneDiseaseTableColumns = [ + { + key: 'disease_title', + heading: 'Disease', + minWidth: 250, + compareFunction: makeStringCompareFunction('disease_title'), + render: (row: any) => ( + + + {row.disease_title} + + + ), + }, + { + key: 'classification', + heading: 'Classification', + minWidth: 120, + compareFunction: makeStringCompareFunction('classification'), + render: (row: any) => {row.classification}, + }, + { + key: 'mode_of_inheritance', + heading: 'Inheritance', + minWidth: 120, + compareFunction: makeStringCompareFunction('mode_of_inheritance'), + render: (row: any) => {row.mode_of_inheritance || 'N/A'}, + }, + { + key: 'submitter', + heading: 'Source', + minWidth: 100, + compareFunction: makeStringCompareFunction('submitter'), + render: (row: any) => {row.submitter}, + }, +] + +export default geneDiseaseTableColumns diff --git a/browser/src/gmd/hooks/useJuhaActions.tsx b/browser/src/gmd/hooks/useJuhaActions.tsx new file mode 100644 index 000000000..4fa5995d8 --- /dev/null +++ b/browser/src/gmd/hooks/useJuhaActions.tsx @@ -0,0 +1,125 @@ +import React from 'react' +import { useCopilotAction } from '@copilotkit/react-core' +import JuhaToolsDisplay, { JuhaToolsLoading } from '../components/JuhaToolsDisplay' + +export function useJuhaActions() { + useCopilotAction({ + name: "get_juha_credible_sets_by_variant", + description: "Fetches GWAS, eQTL, and pQTL credible sets for a specific variant from the Juha API.", + parameters: [ + { name: 'variant_id', type: 'string', required: true, description: "The ID of the variant (e.g., '1-55516888-G-GA')." }, + ], + handler: async (args) => args, + render: (props) => { + const { status, result } = props + if (status === 'executing') return + if (status === 'complete') { + // Debug logging + console.log('[Juha] Credible sets by variant - Full result:', result) + console.log('[Juha] Credible sets by variant - structuredContent:', result?.structuredContent) + console.log('[Juha] Credible sets by variant - result type:', typeof result) + console.log('[Juha] Credible sets by variant - result keys:', result ? Object.keys(result) : 'null') + + // Extract structured content from MCP response + const data = result?.structuredContent || result + return + } + return null + }, + }) + + useCopilotAction({ + name: "get_juha_credible_sets_by_gene", + description: "Fetches credible sets within the genomic region of a given gene from the Juha API.", + parameters: [ + { name: 'gene_symbol', type: 'string', required: true, description: "The official symbol of the gene (e.g., 'PCSK9')." }, + ], + handler: async (args) => args, + render: (props) => { + const { status, result } = props + if (status === 'executing') return + if (status === 'complete') { + // Extract structured content from MCP response + const data = result?.structuredContent || result + return + } + return null + }, + }) + + useCopilotAction({ + name: "get_juha_credible_sets_by_region", + description: "Fetches credible sets within a specified genomic region (e.g., 'chr1:1000-2000') from the Juha API.", + parameters: [ + { name: 'region', type: 'string', required: true, description: "The genomic region in the format 'chr:start-end'." }, + ], + handler: async (args) => args, + render: (props) => { + const { status, result } = props + if (status === 'executing') return + if (status === 'complete') { + // Extract structured content from MCP response + const data = result?.structuredContent || result + return + } + return null + }, + }) + + useCopilotAction({ + name: "get_juha_qtls_by_gene", + description: "Fetches genome-wide QTL credible sets where the specified gene is the target from the Juha API.", + parameters: [ + { name: 'gene_symbol', type: 'string', required: true, description: "The official symbol of the gene (e.g., 'APOE')." }, + ], + handler: async (args) => args, + render: (props) => { + const { status, result } = props; + if (status === 'executing') return ; + if (status === 'complete') { + // Extract structured content from MCP response + const data = result?.structuredContent || result + return ; + } + return null; + }, + }); + + useCopilotAction({ + name: "get_juha_colocalization_by_variant", + description: "Fetches colocalization data to see which traits share a causal variant at a variant's locus from the Juha API.", + parameters: [ + { name: 'variant_id', type: 'string', required: true, description: "The ID of the variant (e.g., '1-55516888-G-GA')." }, + ], + handler: async (args) => args, + render: (props) => { + const { status, result } = props; + if (status === 'executing') return ; + if (status === 'complete') { + // Extract structured content from MCP response + const data = result?.structuredContent || result + return ; + } + return null; + }, + }); + + useCopilotAction({ + name: "get_juha_gene_disease_associations", + description: "Fetches curated gene-to-disease associations from the Juha API.", + parameters: [ + { name: 'gene_symbol', type: 'string', required: true, description: "The official symbol of the gene (e.g., 'CFTR')." }, + ], + handler: async (args) => args, + render: (props) => { + const { status, result } = props; + if (status === 'executing') return ; + if (status === 'complete') { + // Extract structured content from MCP response + const data = result?.structuredContent || result + return ; + } + return null; + }, + }); +} From c4d5b2b3e7a54b447113760f2f161bd4b9d64a1d Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 19 Nov 2025 16:39:32 -0500 Subject: [PATCH 19/48] feat: integrate CopilotKit with MCP server and fix production deployment issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Major changes: - Integrate CopilotKit server into GraphQL API as colocalized service - Upgrade CopilotKit packages from v1.0.0 to v1.10.6 (fixes duplicate request bug) - Add MCP client with singleton pattern to support multi-turn conversations - Configure nginx to disable caching for /api/copilotkit endpoint - Add deployment scripts and documentation for CopilotKit artifacts - Update Docker configuration to include gmd binary (linux/amd64) and Mendelian TSV - Add comprehensive logging for CopilotKit requests and MCP tool executions - Remove copilotkit-server from pnpm workspace (code moved to graphql-api) Technical details: - CopilotKit now runs as part of the GraphQL API server (not standalone) - MCP client reuses single instance per pod to maintain conversation state - GraphQL upgraded from v15 to v16 for CopilotKit compatibility - Nginx proxy cache explicitly bypassed for chat endpoint - Build artifacts prepared via deploy/scripts/prepare-copilotkit-artifacts.sh Fixes: - Fix duplicate HTTP requests caused by frontend/backend version mismatch - Fix cached responses in production by disabling nginx caching for chat - Fix missing Juha tools by using gmd binary from juha-api worktree - Fix architecture mismatch by building linux/amd64 gmd binary for Docker 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .gitignore | 8 + browser/package.json | 6 +- browser/src/App.tsx | 8 +- copilotkit-server/README.md | 32 ++++ copilotkit-server/src/mcp-client.ts | 19 ++- copilotkit-server/src/server.ts | 121 +++++++------ copilotkit-server/start.sh | 12 +- deploy/dockerfiles/browser/api.dockerfile | 12 +- .../browser/api.dockerfile.dockerignore | 4 + deploy/dockerfiles/browser/browser.nginx.conf | 8 + deploy/docs/Deployment.md | 54 ++++++ .../browser/base/api.deployment.yaml | 15 ++ .../scripts/prepare-copilotkit-artifacts.sh | 116 +++++++++++++ graphql-api/package.json | 5 +- graphql-api/src/app.ts | 12 ++ graphql-api/src/copilotkit/mcp-client.ts | 144 ++++++++++++++++ graphql-api/src/copilotkit/server.ts | 137 +++++++++++++++ pnpm-lock.yaml | 159 ++++++++++-------- pnpm-workspace.yaml | 1 - 19 files changed, 736 insertions(+), 137 deletions(-) create mode 100644 copilotkit-server/README.md create mode 100755 deploy/scripts/prepare-copilotkit-artifacts.sh create mode 100644 graphql-api/src/copilotkit/mcp-client.ts create mode 100644 graphql-api/src/copilotkit/server.ts diff --git a/.gitignore b/.gitignore index 33b165249..1fc2d8ec1 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,10 @@ deploy_config.json browser/build.env +# Environment configuration (contains local paths and secrets) +.env +.env.fish + # Build outputs browser/dist @@ -39,3 +43,7 @@ reads/*.db .grove .grove-worktrees + +# Binary artifacts for Docker builds +bin/ +resources/ diff --git a/browser/package.json b/browser/package.json index ca0a0215e..a25028452 100644 --- a/browser/package.json +++ b/browser/package.json @@ -21,9 +21,9 @@ "@gnomad/track-transcripts": "4.0.0", "@gnomad/track-variants": "3.0.0", "@gnomad/ui": "^3.0.0", - "@copilotkit/react-core": "^1.0.0", - "@copilotkit/react-ui": "^1.0.0", - "@copilotkit/react-textarea": "^1.0.0", + "@copilotkit/react-core": "^1.10.6", + "@copilotkit/react-ui": "^1.10.6", + "@copilotkit/react-textarea": "^1.10.6", "@visx/axis": "^3.0.0", "@visx/group": "^3.0.0", "@visx/legend": "^3.12.0", diff --git a/browser/src/App.tsx b/browser/src/App.tsx index dbe31c567..f2d55f996 100644 --- a/browser/src/App.tsx +++ b/browser/src/App.tsx @@ -45,7 +45,7 @@ const GoogleAnalytics = () => { const location = useLocation() useEffect(() => { if ((window as any).gtag) { - ;(window as any).gtag('config', (window as any).gaTrackingId, { + ; (window as any).gtag('config', (window as any).gaTrackingId, { page_path: location.pathname, }) } @@ -78,7 +78,7 @@ const BANNER_CONTENT = null const App = () => { const [isLoading, setIsLoading] = useState(true) - + useEffect(() => { userPreferences.loadPreferences().then( () => { @@ -95,8 +95,10 @@ const App = () => { ) }, []) + const copilotKitUrl = '/api/copilotkit' + return ( - + {/* On any navigation, send event to Google Analytics. */} diff --git a/copilotkit-server/README.md b/copilotkit-server/README.md new file mode 100644 index 000000000..af2a8f5c5 --- /dev/null +++ b/copilotkit-server/README.md @@ -0,0 +1,32 @@ +# CopilotKit Server + +**Note:** The CopilotKit server code has been moved into the GraphQL API codebase. + +## Location + +The CopilotKit server is now integrated into the GraphQL API at: +- **Source code:** `graphql-api/src/copilotkit/` +- **Mounted in:** `graphql-api/src/app.ts` + +## Architecture + +The CopilotKit server now runs as part of the same Node.js process as the GraphQL API, mounted at `/api/copilotkit`. This colocation provides several benefits: + +- **Better performance:** MCP server calls GraphQL API via localhost +- **Simplified deployment:** Single container for both services +- **Easier development:** Shared dependencies and TypeScript configuration + +## Local Development + +For local standalone testing of the CopilotKit functionality, you can still run it separately: + +```bash +cd copilotkit-server +./start.sh +``` + +This will use the standalone server script that imports from the GraphQL API codebase. + +## Production + +In production, the CopilotKit endpoint is automatically available at `/api/copilotkit` as part of the GraphQL API deployment. No separate deployment is needed. diff --git a/copilotkit-server/src/mcp-client.ts b/copilotkit-server/src/mcp-client.ts index bcac34c46..48adaeef5 100644 --- a/copilotkit-server/src/mcp-client.ts +++ b/copilotkit-server/src/mcp-client.ts @@ -6,19 +6,19 @@ export class LocalMCPClient implements MCPClient { private client!: Client; private connected = false; - constructor(private config: { command: string; args: string[]; env?: Record }) {} + constructor(private config: { command: string; args: string[]; env?: Record }) { } async connect(): Promise { // Build environment variables, filtering out undefined values const env: Record = {}; - + // Add process.env values, filtering undefined for (const [key, value] of Object.entries(process.env)) { if (value !== undefined) { env[key] = value; } } - + // Add config env values, overriding process.env if (this.config.env) { Object.assign(env, this.config.env); @@ -70,6 +70,17 @@ export class LocalMCPClient implements MCPClient { name: tool.name, arguments: args, }); + + // Return the full result including structuredContent if present + // Check both result.structuredContent and result._meta.structuredContent + const structuredContent = (result as any).structuredContent || result._meta?.structuredContent; + + if (structuredContent) { + return { + content: result.content, + structuredContent + }; + } return result.content; }, }; @@ -84,4 +95,4 @@ export class LocalMCPClient implements MCPClient { this.connected = false; } } -} \ No newline at end of file +} diff --git a/copilotkit-server/src/server.ts b/copilotkit-server/src/server.ts index aec8c007f..0ffd73bc7 100644 --- a/copilotkit-server/src/server.ts +++ b/copilotkit-server/src/server.ts @@ -1,4 +1,4 @@ -import express from 'express'; +import express, { Application } from 'express'; import cors from 'cors'; import { CopilotRuntime, @@ -7,65 +7,78 @@ import { } from '@copilotkit/runtime'; import { LocalMCPClient } from './mcp-client'; -const app = express(); +// This function will be imported by the main graphql-api server +export function mountCopilotKit(app: Application) { + const serviceAdapter = new GoogleGenerativeAIAdapter({ + model: 'gemini-2.5-flash', + apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY || '', + }); -// Enable CORS for the browser -app.use(cors({ - origin: ['http://localhost:8008', 'http://localhost:8010'], - credentials: true -})); + // Use an environment variable for the gmd command path, defaulting to 'gmd' for production. + const gmdCommand = process.env.GMD_COMMAND_PATH || 'gmd'; + // Configure the MCP server command. + // Since the MCP server is colocalized with the GraphQL API, it can call it locally + const mcpConfig = { + command: gmdCommand, + args: ['mcp', 'serve'], + env: { + GNOMAD_API_URL: process.env.GNOMAD_API_URL || 'http://localhost:8000/api', + }, + }; -const serviceAdapter = new GoogleGenerativeAIAdapter({ - model: "gemini-2.5-flash", - apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY || "", -}); + // Create runtime with MCP support + const runtime = new CopilotRuntime({ + // Function to create MCP clients based on configuration + createMCPClient: async (config) => { + // For local MCP servers, use the stdio client + if (config.endpoint === 'local://gnomad') { + const client = new LocalMCPClient(mcpConfig); + await client.connect(); + return client; + } + throw new Error(`Unsupported MCP endpoint: ${config.endpoint}`); + }, -// Configure the MCP server command. -// Use the full path to gmd binary -const mcpConfig = { - command: `${process.env.HOME}/.grove/bin/gmd`, - args: ["mcp", "serve"], - env: { - GNOMAD_API_URL: process.env.GNOMAD_API_URL || "https://gnomad.broadinstitute.org/api" - } -}; + // Configure which MCP servers are available + mcpServers: [ + { + endpoint: 'local://gnomad', + apiKey: undefined, // Not needed for local servers + }, + ], + }); -// Create runtime with MCP support -const runtime = new CopilotRuntime({ - // Function to create MCP clients based on configuration - createMCPClient: async (config) => { - // For local MCP servers, use the stdio client - if (config.endpoint === "local://gnomad") { - const client = new LocalMCPClient(mcpConfig); - await client.connect(); - return client; - } - throw new Error(`Unsupported MCP endpoint: ${config.endpoint}`); - }, + const handler = copilotRuntimeNodeHttpEndpoint({ + endpoint: '/api/copilotkit', + runtime, + serviceAdapter, + }); - // Configure which MCP servers are available - mcpServers: [ - { - endpoint: "local://gnomad", - apiKey: undefined, // Not needed for local servers - } - ] -}); + // Define CORS options for the CopilotKit endpoint + const corsOptions = { + origin: [ + 'http://localhost:8008', // local browser dev + 'http://localhost:8010', // local api dev + 'https://gnomad.broadinstitute.org', // production + ], + credentials: true, + }; -app.use('/api/copilotkit', (req, res, next) => { - (async () => { - const handler = copilotRuntimeNodeHttpEndpoint({ - endpoint: '/api/copilotkit', - runtime, - serviceAdapter, - }); + // Mount the handler on the provided Express app with its own CORS middleware + app.use('/api/copilotkit', cors(corsOptions), (req, res, next) => { + (async () => handler(req, res))().catch(next); + }); - return handler(req, res); - })().catch(next); -}); + console.log('CopilotKit server mounted on /api/copilotkit'); +} -const PORT = process.env.COPILOTKIT_PORT || 4001; +// For local development, allow running as a standalone server +if (require.main === module) { + const app = express(); + mountCopilotKit(app); -app.listen(PORT, () => { - console.log(`CopilotKit server listening on http://localhost:${PORT}/api/copilotkit`); -}); + const PORT = process.env.COPILOTKIT_PORT || 4001; + app.listen(PORT, () => { + console.log(`CopilotKit server listening on http://localhost:${PORT}/api/copilotkit`); + }); +} diff --git a/copilotkit-server/start.sh b/copilotkit-server/start.sh index 33b78550e..b890f5238 100755 --- a/copilotkit-server/start.sh +++ b/copilotkit-server/start.sh @@ -1,11 +1,19 @@ #!/bin/bash +# This script runs the CopilotKit server standalone for local development/testing +# Note: The CopilotKit server code has been moved to graphql-api/src/copilotkit/ + +export GMD_COMMAND_PATH=${HOME}/.grove/bin/gmd export MENDELIAN_TSV_PATH=/Users/msolomon/code/browser-ecosystem/gmd-api/data/gene-disease-table_8_13_2025.tsv +export GNOMAD_API_URL=${GNOMAD_API_URL:-http://localhost:8010/api} export NODE_ENV=${NODE_ENV:-development} if [[ $NODE_ENV == "development" ]]; then - npx ts-node src/server.ts + npx ts-node ../graphql-api/src/copilotkit/server.ts else - node dist/server.js + echo "ERROR: Production mode not supported for standalone copilotkit-server" + echo "The CopilotKit server is now integrated into the GraphQL API." + echo "For production, deploy the graphql-api which includes CopilotKit." + exit 1 fi diff --git a/deploy/dockerfiles/browser/api.dockerfile b/deploy/dockerfiles/browser/api.dockerfile index 5a0ee2d8e..6d877c947 100644 --- a/deploy/dockerfiles/browser/api.dockerfile +++ b/deploy/dockerfiles/browser/api.dockerfile @@ -19,11 +19,17 @@ RUN pnpm install --production --frozen-lockfile # Copy source COPY --chown=node:node dataset-metadata /app/dataset-metadata COPY --chown=node:node graphql-api/src /app/graphql-api/src -COPY --chown=node:node tsconfig.json /app/graphql-api/tsconfig.json -COPY --chown=node:node tsconfig.build.json /app/graphql-api/tsconfig.build.json +COPY --chown=node:node browser/src/missingContent.ts /app/browser/src/missingContent.ts +COPY --chown=node:node tsconfig.json /app/tsconfig.json +COPY --chown=node:node tsconfig.build.json /app/tsconfig.build.json # Build JS from TS source -RUN pnpm tsc -p /app/graphql-api/tsconfig.build.json +RUN pnpm tsc -p /app/tsconfig.build.json + +# Copy external artifacts and set permissions +COPY --chown=node:node bin/gmd /usr/local/bin/gmd +RUN chmod +x /usr/local/bin/gmd +COPY --chown=node:node resources/gene-disease-table.tsv /app/resources/gene-disease-table.tsv # Copy static data into place COPY --chown=node:node graphql-api/static_data /app/static_data diff --git a/deploy/dockerfiles/browser/api.dockerfile.dockerignore b/deploy/dockerfiles/browser/api.dockerfile.dockerignore index 779200d8f..205756af2 100644 --- a/deploy/dockerfiles/browser/api.dockerfile.dockerignore +++ b/deploy/dockerfiles/browser/api.dockerfile.dockerignore @@ -1,10 +1,14 @@ * !dataset-metadata +dataset-metadata/**/*.js !graphql-api/package.json !graphql-api/src +!browser/src/missingContent.ts !tsconfig.json !tsconfig.build.json !pnpm-lock.yaml !pnpm-workspace-api-docker.yaml !package.json !graphql-api/static_data +!bin +!resources diff --git a/deploy/dockerfiles/browser/browser.nginx.conf b/deploy/dockerfiles/browser/browser.nginx.conf index ef6ee880f..845c488fe 100644 --- a/deploy/dockerfiles/browser/browser.nginx.conf +++ b/deploy/dockerfiles/browser/browser.nginx.conf @@ -47,6 +47,14 @@ server { # GraphQL API # ############### + # CopilotKit endpoint - no caching for AI chat + location /api/copilotkit { + proxy_pass $API_URL; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_no_cache 1; + proxy_cache_bypass 1; + } + location /api/ { # Proxy requests to api container # $API_URL is replaced at runtime with the API_URL environment variable. diff --git a/deploy/docs/Deployment.md b/deploy/docs/Deployment.md index ca39575b2..64e39e02e 100644 --- a/deploy/docs/Deployment.md +++ b/deploy/docs/Deployment.md @@ -136,6 +136,60 @@ Before deploying a new version of the browser, either a demo, or to production: - `kubectl config get-contexts` to see your configs cluster - `kubectl config use-context ` to set your configs cluster +7. **Configure and prepare CopilotKit build artifacts** (required for API image builds) + + The gnomAD API now includes the CopilotKit assistant server, which requires two external artifacts to be included in the Docker image: + + - The `gmd` binary + - The Mendelian disease TSV file + + **First-time setup:** + + Create a `.env` file in the repository root with your local paths: + + ``` + cp .env.example .env + ``` + + Edit `.env` and set the following variables: + + ```bash + GMD_BINARY_PATH=/path/to/your/gmd/binary + MENDELIAN_TSV_PATH=/path/to/gene-disease-table.tsv + ``` + + For example: + ```bash + GMD_BINARY_PATH=/Users/yourname/.grove/bin/gmd + MENDELIAN_TSV_PATH=/Users/yourname/data/gene-disease-table.tsv + ``` + + **Before each Docker build:** + + Run the preparation script to copy artifacts into the build context: + + ``` + ./deploy/scripts/prepare-copilotkit-artifacts.sh + ``` + + This will create `bin/gmd` and `resources/gene-disease-table.tsv` from the paths configured in your `.env` file. + + Note: The `.env`, `bin/`, and `resources/` files are in `.gitignore` and should not be committed to the repository. + +8. **Ensure Google AI API Key secret exists in Kubernetes** (one-time setup) + + The CopilotKit server requires a Google Generative AI API key. Create the secret if it doesn't exist: + + ``` + kubectl create secret generic google-generative-ai-api-key \ + --from-literal=api_key=YOUR_GOOGLE_AI_API_KEY + ``` + + To verify the secret exists: + ``` + kubectl get secret google-generative-ai-api-key + ``` + ## Create Demo Browser Deployment Demo deployments are staging environments independently that let stakeholders preview and approve features before the features go to production. diff --git a/deploy/manifests/browser/base/api.deployment.yaml b/deploy/manifests/browser/base/api.deployment.yaml index 95866fc67..42e96fe06 100644 --- a/deploy/manifests/browser/base/api.deployment.yaml +++ b/deploy/manifests/browser/base/api.deployment.yaml @@ -61,6 +61,21 @@ spec: value: 'true' - name: NODE_OPTIONS value: '--max-old-space-size=10240' + - name: MENDELIAN_TSV_PATH + value: '/app/resources/gene-disease-table.tsv' + # HOME is required for gmd to initialize correctly if it needs to write to a home directory. + - name: HOME + value: '/app' + # The Google AI API key must be provided via a Kubernetes secret. + - name: GOOGLE_GENERATIVE_AI_API_KEY + valueFrom: + secretKeyRef: + # This secret must be created in the cluster manually. + name: google-generative-ai-api-key + key: api_key + # MCP server calls the GraphQL API locally since they're colocalized + - name: GNOMAD_API_URL + value: 'http://localhost:8000/api' ports: - name: http containerPort: 8000 diff --git a/deploy/scripts/prepare-copilotkit-artifacts.sh b/deploy/scripts/prepare-copilotkit-artifacts.sh new file mode 100755 index 000000000..9fe62ea2b --- /dev/null +++ b/deploy/scripts/prepare-copilotkit-artifacts.sh @@ -0,0 +1,116 @@ +#!/bin/bash + +# Prepare CopilotKit artifacts for Docker build +# This script copies the required gmd binary and Mendelian TSV file +# into the repository structure for inclusion in the API Docker image +# +# Configuration is read from a .env file in the repository root. +# See .env.example for required variables. + +set -e + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$REPO_ROOT" + +# Load environment variables from .env file +if [ ! -f ".env" ] && [ ! -f ".env.fish" ]; then + echo "ERROR: .env or .env.fish file not found" + echo + echo "Please create an environment file in the repository root with the required configuration." + echo "You can copy .env.example as a starting point:" + echo + echo " For bash/zsh: cp .env.example .env" + echo " For fish shell: cp .env.example .env.fish (and convert to fish syntax)" + echo + echo "Then edit your env file and set the following variables:" + echo " - GMD_BINARY_PATH: Path to the gmd binary on your build machine" + echo " - MENDELIAN_TSV_PATH: Path to the Mendelian disease TSV file" + echo + exit 1 +fi + +if [ -f ".env" ]; then + echo "Loading configuration from .env..." + # Export variables from .env, ignoring comments and empty lines + set -a + source .env + set +a + echo +else + echo "NOTE: Using .env.fish - ensure variables are exported before running this script" + echo " Run: source .env.fish" + echo +fi + +# Validate required variables +MISSING_VARS=() + +if [ -z "$GMD_BINARY_PATH" ]; then + MISSING_VARS+=("GMD_BINARY_PATH") +fi + +if [ -z "$MENDELIAN_TSV_PATH" ]; then + MISSING_VARS+=("MENDELIAN_TSV_PATH") +fi + +if [ ${#MISSING_VARS[@]} -gt 0 ]; then + echo "ERROR: Required environment variables are not set in .env:" + for var in "${MISSING_VARS[@]}"; do + echo " - $var" + done + echo + echo "Please edit your .env file and set these variables." + echo "See .env.example for reference." + exit 1 +fi + +echo "Preparing CopilotKit build artifacts..." +echo + +# Create directories +echo "Creating bin/ and resources/ directories..." +mkdir -p bin resources + +# Build gmd binary for Linux AMD64 +echo "Building gmd binary for Linux AMD64..." +GMD_SOURCE_DIR="$(dirname "$GMD_BINARY_PATH")/../.." +if [ ! -d "$GMD_SOURCE_DIR" ]; then + echo "ERROR: Cannot find gmd source directory at: $GMD_SOURCE_DIR" + echo + echo "Please check the GMD_BINARY_PATH in your .env file." + exit 1 +fi + +(cd "$GMD_SOURCE_DIR" && GOOS=linux GOARCH=amd64 go build -o "$REPO_ROOT/bin/gmd" .) +if [ $? -ne 0 ]; then + echo "ERROR: Failed to build gmd binary" + exit 1 +fi + +chmod +x bin/gmd +echo "✓ gmd binary built for linux/amd64 at bin/gmd" +echo + +# Copy Mendelian TSV file +if [ ! -f "$MENDELIAN_TSV_PATH" ]; then + echo "ERROR: Mendelian TSV file not found at: $MENDELIAN_TSV_PATH" + echo + echo "Please check the MENDELIAN_TSV_PATH in your .env file." + exit 1 +fi + +echo "Copying Mendelian TSV from $MENDELIAN_TSV_PATH..." +cp "$MENDELIAN_TSV_PATH" resources/gene-disease-table.tsv +echo "✓ Mendelian TSV copied to resources/gene-disease-table.tsv" +echo + +# Verify artifacts +echo "Verification:" +echo " gmd binary: $(ls -lh bin/gmd | awk '{print $5}')" +echo " Mendelian TSV: $(ls -lh resources/gene-disease-table.tsv | awk '{print $5}')" +echo + +echo "✓ CopilotKit artifacts are ready for Docker build" +echo +echo "You can now build the API Docker image with:" +echo " ./deployctl images build --push" diff --git a/graphql-api/package.json b/graphql-api/package.json index 525d8e2f0..01973ba86 100644 --- a/graphql-api/package.json +++ b/graphql-api/package.json @@ -3,13 +3,16 @@ "version": "2.0.0", "private": true, "dependencies": { + "@copilotkit/runtime": "^1.10.6", "@elastic/elasticsearch": "6", "@gnomad/dataset-metadata": "*", "@gnomad/identifiers": "3.0.0", "@google-cloud/storage": "^7.7.0", + "@google/generative-ai": "^0.21.0", "@graphql-tools/load-files": "^6.0.12", "@graphql-tools/merge": "^6.0.12", "@graphql-tools/schema": "^6.0.12", + "@modelcontextprotocol/sdk": "^1.17.4", "@types/compression": "^1.7.2", "@types/cors": "^2.8.13", "@types/express": "^4.17.17", @@ -22,7 +25,7 @@ "cors": "^2.8.5", "express": "^4.20.0", "express-graphql": "^0.12.0", - "graphql": "^15.3.0", + "graphql": "^16.8.1", "graphql-query-complexity": "^0.7.2", "http-errors": "1.8.0", "ioredis": "^5.3.2", diff --git a/graphql-api/src/app.ts b/graphql-api/src/app.ts index f48a45f41..92be99710 100644 --- a/graphql-api/src/app.ts +++ b/graphql-api/src/app.ts @@ -81,6 +81,18 @@ loadWhitelist() const context = { esClient } +// Import and mount the CopilotKit endpoint (if API key is available) +import { mountCopilotKit } from './copilotkit/server' +if (process.env.GOOGLE_GENERATIVE_AI_API_KEY) { + try { + mountCopilotKit(app) + } catch (error) { + logger.error(error) + } +} else { + logger.info('CopilotKit endpoint not mounted (GOOGLE_GENERATIVE_AI_API_KEY not set)') +} + app.use('/api/', graphQLApi({ context })) app.listen(config.PORT) diff --git a/graphql-api/src/copilotkit/mcp-client.ts b/graphql-api/src/copilotkit/mcp-client.ts new file mode 100644 index 000000000..9166bc02c --- /dev/null +++ b/graphql-api/src/copilotkit/mcp-client.ts @@ -0,0 +1,144 @@ +import { Client } from "@modelcontextprotocol/sdk/client/index.js"; +import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"; +import { MCPClient, MCPTool } from "@copilotkit/runtime"; +import logger from '../logger'; + +export class LocalMCPClient implements MCPClient { + private client!: Client; + private connected = false; + + constructor(private config: { command: string; args: string[]; env?: Record }) {} + + async connect(): Promise { + logger.info({ + message: 'MCP client connecting', + command: this.config.command, + args: this.config.args, + }); + + // Build environment variables, filtering out undefined values + const env: Record = {}; + + // Add process.env values, filtering undefined + for (const [key, value] of Object.entries(process.env)) { + if (value !== undefined) { + env[key] = value; + } + } + + // Add config env values, overriding process.env + if (this.config.env) { + Object.assign(env, this.config.env); + } + + const transport = new StdioClientTransport({ + command: this.config.command, + args: this.config.args, + env, + }); + + this.client = new Client( + { + name: "copilotkit-client", + version: "1.0.0", + }, + { + capabilities: {}, + } + ); + + await this.client.connect(transport); + this.connected = true; + logger.info('MCP client connected successfully'); + } + + async tools(): Promise> { + if (!this.connected) { + await this.connect(); + } + + const response = await this.client.listTools(); + const toolsMap: Record = {}; + + logger.info({ + message: 'MCP tools loaded', + toolCount: response.tools.length, + tools: response.tools.map(t => t.name), + }); + + for (const tool of response.tools) { + // Convert MCP tool schema to CopilotKit MCPTool schema format + const schema = tool.inputSchema ? { + parameters: { + properties: (tool.inputSchema as any).properties || {}, + required: (tool.inputSchema as any).required || [], + jsonSchema: tool.inputSchema + } + } : undefined; + + toolsMap[tool.name] = { + description: tool.description, + schema, + execute: async (args: any) => { + const startTime = Date.now(); + logger.info({ + message: 'MCP tool execution started', + tool: tool.name, + args, + }); + + try { + const result = await this.client.callTool({ + name: tool.name, + arguments: args, + }); + const duration = Date.now() - startTime; + + logger.info({ + message: 'MCP tool execution completed', + tool: tool.name, + duration: `${duration}ms`, + hasStructuredContent: !!(result as any).structuredContent, + }); + + // Return structured content if available + const structuredContent = (result as any).structuredContent; + if (structuredContent) { + logger.info({ + message: 'MCP tool returned structured content', + tool: tool.name, + structuredContentKeys: Object.keys(structuredContent), + }); + return { + content: result.content, + structuredContent, + }; + } + + return result.content; + } catch (error: any) { + const duration = Date.now() - startTime; + logger.error({ + message: 'MCP tool execution failed', + tool: tool.name, + duration: `${duration}ms`, + error: error.message, + }); + throw error; + } + }, + }; + } + + return toolsMap; + } + + async close(): Promise { + if (this.connected) { + logger.info('MCP client closing'); + await this.client.close(); + this.connected = false; + logger.info('MCP client closed'); + } + } +} \ No newline at end of file diff --git a/graphql-api/src/copilotkit/server.ts b/graphql-api/src/copilotkit/server.ts new file mode 100644 index 000000000..9092d56c7 --- /dev/null +++ b/graphql-api/src/copilotkit/server.ts @@ -0,0 +1,137 @@ +import express, { Application } from 'express'; +import cors from 'cors'; +import { + CopilotRuntime, + GoogleGenerativeAIAdapter, + copilotRuntimeNodeHttpEndpoint, +} from '@copilotkit/runtime'; +import { LocalMCPClient } from './mcp-client'; +import logger from '../logger'; + +// This function will be imported by the main graphql-api server +export function mountCopilotKit(app: Application) { + const serviceAdapter = new GoogleGenerativeAIAdapter({ + model: 'gemini-2.5-flash', + apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY || '', + }); + + // Use an environment variable for the gmd command path, defaulting to 'gmd' for production. + const gmdCommand = process.env.GMD_COMMAND_PATH || 'gmd'; + // Configure the MCP server command. + // Since the MCP server is colocalized with the GraphQL API, it can call it locally + const mcpConfig = { + command: gmdCommand, + args: ['mcp', 'serve'], + env: { + GNOMAD_API_URL: process.env.GNOMAD_API_URL || 'http://localhost:8000/api', + }, + }; + + // Create a single shared MCP client instance + let sharedMCPClient: LocalMCPClient | null = null; + + // Create runtime with MCP support + const runtime = new CopilotRuntime({ + // Function to create MCP clients based on configuration + createMCPClient: async (config) => { + // For local MCP servers, use the stdio client + if (config.endpoint === 'local://gnomad') { + // Reuse the same client instance across all requests + if (!sharedMCPClient) { + sharedMCPClient = new LocalMCPClient(mcpConfig); + await sharedMCPClient.connect(); + } + return sharedMCPClient; + } + throw new Error(`Unsupported MCP endpoint: ${config.endpoint}`); + }, + + // Configure which MCP servers are available + mcpServers: [ + { + endpoint: 'local://gnomad', + apiKey: undefined, // Not needed for local servers + }, + ], + }); + + const handler = copilotRuntimeNodeHttpEndpoint({ + endpoint: '/api/copilotkit', + runtime, + serviceAdapter, + }); + + // Define CORS options for the CopilotKit endpoint + const corsOptions = { + origin: [ + 'http://localhost:8008', // local browser dev + 'http://localhost:8010', // local api dev + 'https://gnomad.broadinstitute.org', // production + ], + credentials: true, + }; + + // Mount the handler on the provided Express app with its own CORS middleware + app.use('/api/copilotkit', cors(corsOptions), (req, res, next) => { + const startTime = Date.now(); + const requestId = Math.random().toString(36).substring(7); + + // Log the request with more detail about the conversation + let threadId, messageCount; + try { + const body = req.body || {}; + threadId = body.threadId; + messageCount = body.messages?.length || 0; + } catch (e) { + // ignore parsing errors + } + + logger.info({ + message: 'CopilotKit request', + requestId, + threadId, + messageCount, + method: req.method, + path: req.path, + userAgent: req.headers['user-agent'], + }); + + // Wrap the response to log completion + const originalSend = res.send; + res.send = function(data) { + const duration = Date.now() - startTime; + logger.info({ + message: 'CopilotKit response', + method: req.method, + path: req.path, + statusCode: res.statusCode, + duration: `${duration}ms`, + }); + return originalSend.call(this, data); + }; + + (async () => handler(req, res))().catch((error) => { + logger.error({ + message: 'CopilotKit error', + error: error.message, + stack: error.stack, + method: req.method, + path: req.path, + }); + next(error); + }); + }); + + logger.info('CopilotKit server mounted on /api/copilotkit'); +} + +// For local development, allow running as a standalone server +if (require.main === module) { + const app = express(); + mountCopilotKit(app); + + const PORT = process.env.COPILOTKIT_PORT || 4001; + app.listen(PORT, () => { + console.log(`CopilotKit server listening on http://localhost:${PORT}/api/copilotkit`); + }); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 50a67d942..6c3ed3351 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -148,13 +148,13 @@ importers: browser: dependencies: '@copilotkit/react-core': - specifier: ^1.0.0 + specifier: ^1.10.6 version: 1.10.6(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) '@copilotkit/react-textarea': - specifier: ^1.0.0 + specifier: ^1.10.6 version: 1.10.6(@types/react-dom@18.3.7)(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) '@copilotkit/react-ui': - specifier: ^1.0.0 + specifier: ^1.10.6 version: 1.10.6(@types/react@18.3.21)(react-dom@18.3.1)(react@18.3.1) '@fortawesome/fontawesome-free': specifier: ^5.8.1 @@ -375,7 +375,7 @@ importers: dependencies: '@copilotkit/runtime': specifier: ^1.10.3 - version: 1.10.6(@ag-ui/client@0.0.41)(@ag-ui/core@0.0.41)(@ag-ui/encoder@0.0.41)(@ag-ui/langgraph@0.0.18)(@ag-ui/proto@0.0.41)(@browserbasehq/stagehand@1.14.0)(@ibm-cloud/watsonx-ai@1.7.3)(axios@1.13.2)(ibm-cloud-sdk-core@5.4.4) + version: 1.10.6(@ag-ui/client@0.0.41)(@ag-ui/core@0.0.41)(@ag-ui/encoder@0.0.41)(@ag-ui/langgraph@0.0.18)(@ag-ui/proto@0.0.41)(@browserbasehq/stagehand@1.14.0)(@elastic/elasticsearch@6.8.8)(@google-cloud/storage@7.7.0)(@ibm-cloud/watsonx-ai@1.7.3)(axios@1.13.2)(ibm-cloud-sdk-core@5.4.4)(ioredis@5.3.2)(lodash@4.17.21)(redis@3.1.2) '@google/generative-ai': specifier: ^0.21.0 version: 0.21.0 @@ -402,6 +402,9 @@ importers: graphql-api: dependencies: + '@copilotkit/runtime': + specifier: ^1.10.6 + version: 1.10.6(@ag-ui/client@0.0.41)(@ag-ui/core@0.0.41)(@ag-ui/encoder@0.0.41)(@ag-ui/langgraph@0.0.18)(@ag-ui/proto@0.0.41)(@browserbasehq/stagehand@1.14.0)(@elastic/elasticsearch@6.8.8)(@google-cloud/storage@7.7.0)(@ibm-cloud/watsonx-ai@1.7.3)(axios@1.13.2)(ibm-cloud-sdk-core@5.4.4)(ioredis@5.3.2)(lodash@4.17.21)(redis@3.1.2) '@elastic/elasticsearch': specifier: '6' version: 6.8.8 @@ -414,15 +417,21 @@ importers: '@google-cloud/storage': specifier: ^7.7.0 version: 7.7.0 + '@google/generative-ai': + specifier: ^0.21.0 + version: 0.21.0 '@graphql-tools/load-files': specifier: ^6.0.12 - version: 6.6.1(graphql@15.8.0) + version: 6.6.1(graphql@16.12.0) '@graphql-tools/merge': specifier: ^6.0.12 - version: 6.2.17(graphql@15.8.0) + version: 6.2.17(graphql@16.12.0) '@graphql-tools/schema': specifier: ^6.0.12 - version: 6.2.4(graphql@15.8.0) + version: 6.2.4(graphql@16.12.0) + '@modelcontextprotocol/sdk': + specifier: ^1.17.4 + version: 1.22.0 '@types/compression': specifier: ^1.7.2 version: 1.7.3 @@ -458,13 +467,13 @@ importers: version: 4.21.2 express-graphql: specifier: ^0.12.0 - version: 0.12.0(graphql@15.8.0) + version: 0.12.0(graphql@16.12.0) graphql: - specifier: ^15.3.0 - version: 15.8.0 + specifier: ^16.8.1 + version: 16.12.0 graphql-query-complexity: specifier: ^0.7.2 - version: 0.7.2(graphql@15.8.0) + version: 0.7.2(graphql@16.12.0) http-errors: specifier: 1.8.0 version: 1.8.0 @@ -3647,7 +3656,7 @@ packages: - graphql dev: false - /@copilotkit/runtime@1.10.6(@ag-ui/client@0.0.41)(@ag-ui/core@0.0.41)(@ag-ui/encoder@0.0.41)(@ag-ui/langgraph@0.0.18)(@ag-ui/proto@0.0.41)(@browserbasehq/stagehand@1.14.0)(@ibm-cloud/watsonx-ai@1.7.3)(axios@1.13.2)(ibm-cloud-sdk-core@5.4.4): + /@copilotkit/runtime@1.10.6(@ag-ui/client@0.0.41)(@ag-ui/core@0.0.41)(@ag-ui/encoder@0.0.41)(@ag-ui/langgraph@0.0.18)(@ag-ui/proto@0.0.41)(@browserbasehq/stagehand@1.14.0)(@elastic/elasticsearch@6.8.8)(@google-cloud/storage@7.7.0)(@ibm-cloud/watsonx-ai@1.7.3)(axios@1.13.2)(ibm-cloud-sdk-core@5.4.4)(ioredis@5.3.2)(lodash@4.17.21)(redis@3.1.2): resolution: {integrity: sha512-35MdJ6nutC+spgHRJURbanLxBoQCNvVBYD0CBIk4Rv3/Ck8XgZA4lcc+5aGteuERXOPBsYEQjGD4xEPy3QXmGg==} peerDependencies: '@ag-ui/client': '>=0.0.39' @@ -3665,7 +3674,7 @@ packages: '@copilotkit/shared': 1.10.6 '@graphql-yoga/plugin-defer-stream': 3.16.2(graphql-yoga@5.16.2)(graphql@16.12.0) '@langchain/aws': 0.1.15(@langchain/core@0.3.79) - '@langchain/community': 0.3.58(@browserbasehq/stagehand@1.14.0)(@ibm-cloud/watsonx-ai@1.7.3)(@langchain/aws@0.1.15)(@langchain/core@0.3.79)(axios@1.13.2)(ibm-cloud-sdk-core@5.4.4)(openai@4.104.0) + '@langchain/community': 0.3.58(@browserbasehq/stagehand@1.14.0)(@elastic/elasticsearch@6.8.8)(@google-cloud/storage@7.7.0)(@ibm-cloud/watsonx-ai@1.7.3)(@langchain/aws@0.1.15)(@langchain/core@0.3.79)(axios@1.13.2)(ibm-cloud-sdk-core@5.4.4)(ioredis@5.3.2)(lodash@4.17.21)(openai@4.104.0)(redis@3.1.2) '@langchain/core': 0.3.79(openai@4.104.0) '@langchain/google-gauth': 0.1.8(@langchain/core@0.3.79)(zod@3.25.76) '@langchain/langgraph-sdk': 0.0.70(@langchain/core@0.3.79) @@ -3881,7 +3890,7 @@ packages: resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} dependencies: '@babel/helper-module-imports': 7.27.1 - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -3948,7 +3957,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -3969,7 +3978,7 @@ packages: '@emotion/memoize': 0.9.0 '@emotion/unitless': 0.10.0 '@emotion/utils': 1.4.2 - csstype: 3.1.2 + csstype: 3.2.3 dev: false /@emotion/sheet@1.4.0: @@ -3986,7 +3995,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 '@emotion/react': 11.14.0(@types/react@18.3.21)(react@18.3.1) @@ -4536,35 +4545,35 @@ packages: tslib: 2.8.1 dev: false - /@graphql-tools/load-files@6.6.1(graphql@15.8.0): + /@graphql-tools/load-files@6.6.1(graphql@16.12.0): resolution: {integrity: sha512-nd4GOjdD68bdJkHfRepILb0gGwF63mJI7uD4oJuuf2Kzeq8LorKa6WfyxUhdMuLmZhnx10zdAlWPfwv1NOAL4Q==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: globby: 11.1.0 - graphql: 15.8.0 + graphql: 16.12.0 tslib: 2.6.2 unixify: 1.0.0 dev: false - /@graphql-tools/merge@6.2.17(graphql@15.8.0): + /@graphql-tools/merge@6.2.17(graphql@16.12.0): resolution: {integrity: sha512-G5YrOew39fZf16VIrc49q3c8dBqQDD0ax5LYPiNja00xsXDi0T9zsEWVt06ApjtSdSF6HDddlu5S12QjeN8Tow==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 dependencies: - '@graphql-tools/schema': 8.5.1(graphql@15.8.0) - '@graphql-tools/utils': 8.0.2(graphql@15.8.0) - graphql: 15.8.0 + '@graphql-tools/schema': 8.5.1(graphql@16.12.0) + '@graphql-tools/utils': 8.0.2(graphql@16.12.0) + graphql: 16.12.0 tslib: 2.3.1 dev: false - /@graphql-tools/merge@8.3.1(graphql@15.8.0): + /@graphql-tools/merge@8.3.1(graphql@16.12.0): resolution: {integrity: sha512-BMm99mqdNZbEYeTPK3it9r9S6rsZsQKtlqJsSBknAclXq2pGEfOxjcIZi+kBSkHZKPKCRrYDd5vY0+rUmIHVLg==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 8.9.0(graphql@15.8.0) - graphql: 15.8.0 + '@graphql-tools/utils': 8.9.0(graphql@16.12.0) + graphql: 16.12.0 tslib: 2.8.1 dev: false @@ -4591,24 +4600,24 @@ packages: tslib: 2.8.1 dev: false - /@graphql-tools/schema@6.2.4(graphql@15.8.0): + /@graphql-tools/schema@6.2.4(graphql@16.12.0): resolution: {integrity: sha512-rh+14lSY1q8IPbEv2J9x8UBFJ5NrDX9W5asXEUlPp+7vraLp/Tiox4GXdgyA92JhwpYco3nTf5Bo2JDMt1KnAQ==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 dependencies: - '@graphql-tools/utils': 6.2.4(graphql@15.8.0) - graphql: 15.8.0 + '@graphql-tools/utils': 6.2.4(graphql@16.12.0) + graphql: 16.12.0 tslib: 2.0.3 dev: false - /@graphql-tools/schema@8.5.1(graphql@15.8.0): + /@graphql-tools/schema@8.5.1(graphql@16.12.0): resolution: {integrity: sha512-0Esilsh0P/qYcB5DKQpiKeQs/jevzIadNTaT0jeWklPMwNbT7yMX4EqZany7mbeRRlSRwMzNzL5olyFdffHBZg==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/merge': 8.3.1(graphql@15.8.0) - '@graphql-tools/utils': 8.9.0(graphql@15.8.0) - graphql: 15.8.0 + '@graphql-tools/merge': 8.3.1(graphql@16.12.0) + '@graphql-tools/utils': 8.9.0(graphql@16.12.0) + graphql: 16.12.0 tslib: 2.6.2 value-or-promise: 1.0.11 dev: false @@ -4626,32 +4635,32 @@ packages: tslib: 2.8.1 dev: false - /@graphql-tools/utils@6.2.4(graphql@15.8.0): + /@graphql-tools/utils@6.2.4(graphql@16.12.0): resolution: {integrity: sha512-ybgZ9EIJE3JMOtTrTd2VcIpTXtDrn2q6eiYkeYMKRVh3K41+LZa6YnR2zKERTXqTWqhobROwLt4BZbw2O3Aeeg==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 dependencies: '@ardatan/aggregate-error': 0.0.6 camel-case: 4.1.1 - graphql: 15.8.0 + graphql: 16.12.0 tslib: 2.0.3 dev: false - /@graphql-tools/utils@8.0.2(graphql@15.8.0): + /@graphql-tools/utils@8.0.2(graphql@16.12.0): resolution: {integrity: sha512-gzkavMOgbhnwkHJYg32Adv6f+LxjbQmmbdD5Hty0+CWxvaiuJq+nU6tzb/7VSU4cwhbNLx/lGu2jbCPEW1McZQ==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 dependencies: - graphql: 15.8.0 + graphql: 16.12.0 tslib: 2.3.1 dev: false - /@graphql-tools/utils@8.9.0(graphql@15.8.0): + /@graphql-tools/utils@8.9.0(graphql@16.12.0): resolution: {integrity: sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - graphql: 15.8.0 + graphql: 16.12.0 tslib: 2.8.1 dev: false @@ -5118,7 +5127,7 @@ packages: - aws-crt dev: false - /@langchain/community@0.3.58(@browserbasehq/stagehand@1.14.0)(@ibm-cloud/watsonx-ai@1.7.3)(@langchain/aws@0.1.15)(@langchain/core@0.3.79)(axios@1.13.2)(ibm-cloud-sdk-core@5.4.4)(openai@4.104.0): + /@langchain/community@0.3.58(@browserbasehq/stagehand@1.14.0)(@elastic/elasticsearch@6.8.8)(@google-cloud/storage@7.7.0)(@ibm-cloud/watsonx-ai@1.7.3)(@langchain/aws@0.1.15)(@langchain/core@0.3.79)(axios@1.13.2)(ibm-cloud-sdk-core@5.4.4)(ioredis@5.3.2)(lodash@4.17.21)(openai@4.104.0)(redis@3.1.2): resolution: {integrity: sha512-jrMbv1Xz2yqcWtlj+wnMmbagIK6J/fbQdP6R+Az+e+er5CeWy2eZHKBGFL5XYbAzYJdYhAbA4gt8kwVT6oaZfw==} engines: {node: '>=18'} peerDependencies: @@ -5499,6 +5508,8 @@ packages: optional: true dependencies: '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.43.0)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@4.104.0)(zod@3.25.76) + '@elastic/elasticsearch': 6.8.8 + '@google-cloud/storage': 7.7.0 '@ibm-cloud/watsonx-ai': 1.7.3 '@langchain/core': 0.3.79(openai@4.104.0) '@langchain/openai': 0.4.9(@langchain/core@0.3.79) @@ -5506,11 +5517,14 @@ packages: binary-extensions: 2.3.0 flat: 5.0.2 ibm-cloud-sdk-core: 5.4.4 + ioredis: 5.3.2 js-yaml: 4.1.0 langchain: 0.3.36(@langchain/aws@0.1.15)(@langchain/core@0.3.79)(axios@1.13.2)(openai@4.104.0) langsmith: 0.3.79(openai@4.104.0) + lodash: 4.17.21 math-expression-evaluator: 2.0.7 openai: 4.104.0(zod@3.25.76) + redis: 3.1.2 uuid: 10.0.0 zod: 3.25.76 transitivePeerDependencies: @@ -5968,7 +5982,7 @@ packages: /@radix-ui/primitive@1.0.0: resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 dev: false /@radix-ui/primitive@1.1.3: @@ -5980,7 +5994,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 react: 18.3.1 dev: false @@ -6002,7 +6016,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 react: 18.3.1 dev: false @@ -6025,7 +6039,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) '@radix-ui/react-context': 1.0.0(react@18.3.1) @@ -6085,7 +6099,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1)(react@18.3.1) @@ -6124,7 +6138,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 react: 18.3.1 dev: false @@ -6147,7 +6161,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) @@ -6182,7 +6196,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 '@radix-ui/react-use-layout-effect': 1.0.0(react@18.3.1) react: 18.3.1 dev: false @@ -6227,7 +6241,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -6260,7 +6274,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.0.0(react@18.3.1) react: 18.3.1 @@ -6294,7 +6308,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 '@radix-ui/react-slot': 1.0.0(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -6365,7 +6379,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) react: 18.3.1 dev: false @@ -6403,7 +6417,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 react: 18.3.1 dev: false @@ -6425,7 +6439,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) react: 18.3.1 dev: false @@ -6464,7 +6478,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) react: 18.3.1 dev: false @@ -6488,7 +6502,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 react: 18.3.1 dev: false @@ -8939,7 +8953,7 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 cosmiconfig: 7.1.0 resolve: 1.22.10 dev: false @@ -9915,7 +9929,6 @@ packages: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: false /css-box-model@1.2.1: resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==} @@ -11119,7 +11132,7 @@ packages: '@humanwhocodes/config-array': 0.5.0 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 debug: 4.4.1(supports-color@5.5.0) doctrine: 3.0.0 enquirer: 2.4.1 @@ -11285,7 +11298,7 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -11352,6 +11365,20 @@ packages: raw-body: 2.5.2 dev: false + /express-graphql@0.12.0(graphql@16.12.0): + resolution: {integrity: sha512-DwYaJQy0amdy3pgNtiTDuGGM2BLdj+YO2SgbKoLliCfuHv3VVTt7vNG/ZqK2hRYjtYHE2t2KB705EU94mE64zg==} + engines: {node: '>= 10.x'} + deprecated: This package is no longer maintained. We recommend using `graphql-http` instead. Please consult the migration document https://github.com/graphql/graphql-http#migrating-express-grpahql. + peerDependencies: + graphql: ^14.7.0 || ^15.3.0 + dependencies: + accepts: 1.3.8 + content-type: 1.0.5 + graphql: 16.12.0 + http-errors: 1.8.0 + raw-body: 2.5.2 + dev: false + /express-rate-limit@7.5.1(express@5.1.0): resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} engines: {node: '>= 16'} @@ -12180,12 +12207,12 @@ packages: lodash.get: 4.4.2 dev: false - /graphql-query-complexity@0.7.2(graphql@15.8.0): + /graphql-query-complexity@0.7.2(graphql@16.12.0): resolution: {integrity: sha512-+VgmrfxGEjHI3zuojWOR8bsz7Ycz/BZjNjxnlUieTz5DsB92WoIrYCSZdWG7UWZ3rfcA1Gb2Nf+wB80GsaZWuQ==} peerDependencies: graphql: ^0.13.0 || ^14.0.0 || ^15.0.0 dependencies: - graphql: 15.8.0 + graphql: 16.12.0 lodash.get: 4.4.2 dev: false @@ -14134,7 +14161,7 @@ packages: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.5.4 + semver: 7.7.3 dev: false /jsx-ast-utils@3.3.5: @@ -17024,7 +17051,7 @@ packages: react: '>=16' dependencies: '@types/hast': 2.3.10 - '@types/prop-types': 15.7.7 + '@types/prop-types': 15.7.15 '@types/react': 18.3.21 '@types/unist': 2.0.8 comma-separated-tokens: 2.0.3 @@ -17216,7 +17243,7 @@ packages: peerDependencies: react: '>= 0.14.0' dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.28.4 highlight.js: 10.7.3 highlightjs-vue: 1.0.0 lowlight: 1.20.0 @@ -19481,7 +19508,7 @@ packages: graphql: 16.12.0 graphql-query-complexity: 0.12.0(graphql@16.12.0) graphql-scalars: 1.25.0(graphql@16.12.0) - semver: 7.5.4 + semver: 7.7.3 tslib: 2.8.1 dev: false diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index cefb9b2ac..0f93eb7d7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,5 @@ packages: - 'browser' - - 'copilotkit-server' - 'dataset-metadata' - 'graphql-api' - 'reads' From e7356d43761a4067acdfd1705d339904b496e235 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Thu, 20 Nov 2025 12:16:12 -0500 Subject: [PATCH 20/48] feat: add fullscreen mode to gnomAD chat assistant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add fullscreen toggle button to chat panel with expand/compress icons - Implement three display modes: closed, side panel, and fullscreen - Hide main toggle button when in fullscreen mode - Only show resize handle in side panel mode - Disable HTML element scrolling to prevent page-level scrollbars 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- browser/src/GnomadCopilot.tsx | 105 ++++++++++++++++++++++++++++------ browser/src/index.html | 7 ++- 2 files changed, 93 insertions(+), 19 deletions(-) diff --git a/browser/src/GnomadCopilot.tsx b/browser/src/GnomadCopilot.tsx index 11fe91151..6c4256536 100644 --- a/browser/src/GnomadCopilot.tsx +++ b/browser/src/GnomadCopilot.tsx @@ -1,11 +1,15 @@ import React, { useState, useRef, useCallback, useMemo } from 'react' -import styled from 'styled-components' +import styled, { css } from 'styled-components' import { CopilotChat } from '@copilotkit/react-ui' import { useCopilotAction } from '@copilotkit/react-core' import { useHistory, useLocation } from 'react-router-dom' import { useMCPStateRender } from './hooks/useMCPStateRender' import { useGnomadVariantActions } from './gmd/hooks/useGnomadVariantActions' import { useJuhaActions } from './gmd/hooks/useJuhaActions' +// @ts-expect-error TS(2307) FIXME: Cannot find module '@fortawesome/fontawesome-free/... Remove this comment to see the full error message +import ExpandIcon from '@fortawesome/fontawesome-free/svgs/solid/expand.svg' +// @ts-expect-error TS(2307) FIXME: Cannot find module '@fortawesome/fontawesome-free/... Remove this comment to see the full error message +import CompressIcon from '@fortawesome/fontawesome-free/svgs/solid/compress.svg' import '@copilotkit/react-ui/styles.css' const PageContainer = styled.div` @@ -24,14 +28,33 @@ const MainContent = styled.div` min-width: 300px; ` -const ChatPanel = styled.div<{ width: number }>` - width: ${(props) => props.width}px; - overflow: hidden; +const ChatPanel = styled.div<{ width: number; mode: 'side' | 'fullscreen' }>` display: flex; flex-direction: column; background: white; min-width: 300px; - max-width: 80%; + position: relative; + + ${(props) => + props.mode === 'side' && + css` + width: ${props.width}px; + max-width: 80%; + overflow: hidden; + `} + + ${(props) => + props.mode === 'fullscreen' && + css` + position: fixed; + top: 0; + right: 0; + width: 100vw; + height: 100vh; + z-index: 1000; + max-width: 100%; + overflow: hidden; + `} ` const ResizeHandle = styled.div` @@ -40,16 +63,46 @@ const ResizeHandle = styled.div` cursor: col-resize; flex-shrink: 0; transition: background-color 0.2s; - + &:hover { background-color: #0d79d0; } - + &:active { background-color: #0d79d0; } ` +const FullscreenButton = styled.button` + position: absolute; + top: 10px; + right: 10px; + z-index: 9999; + padding: 8px; + background: white; + border: 1px solid #e0e0e0; + border-radius: 4px; + cursor: pointer; + transition: all 0.2s; + pointer-events: auto; + + img { + width: 16px; + height: 16px; + opacity: 0.6; + display: block; + } + + &:hover { + background: #f7f7f7; + border-color: #0d79d0; + } + + &:hover img { + opacity: 1; + } +` + const ToggleButton = styled.button` position: fixed; bottom: 24px; @@ -77,17 +130,17 @@ const StyledCopilotChat = styled(CopilotChat)` --copilot-kit-primary-color: #0d79d0; --copilot-kit-background-color: white; --copilot-kit-header-background: #f7f7f7; - + /* Increase font size in the chat input textarea */ textarea { font-size: 14px !important; } - + /* Also apply to any input fields */ input[type="text"] { font-size: 14px !important; } - + /* Style suggestion chips */ button[data-suggestion] { font-size: 14px !important; @@ -96,7 +149,8 @@ const StyledCopilotChat = styled(CopilotChat)` export function GnomadCopilot({ children }: { children: React.ReactNode }) { - const [isChatOpen, setIsChatOpen] = useState(true) + const [chatDisplayMode, setChatDisplayMode] = useState<'closed' | 'side' | 'fullscreen'>('side') + const isChatOpen = chatDisplayMode !== 'closed' const [chatWidth, setChatWidth] = useState(window.innerWidth / 3) // Default to 1/3 of screen const isResizing = useRef(false) const containerRef = useRef(null) @@ -255,7 +309,7 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { }, []) React.useEffect(() => { - if (isChatOpen) { + if (chatDisplayMode === 'side') { document.addEventListener('mousemove', handleMouseMove) document.addEventListener('mouseup', handleMouseUp) @@ -264,7 +318,7 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { document.removeEventListener('mouseup', handleMouseUp) } } - }, [isChatOpen, handleMouseMove, handleMouseUp]) + }, [chatDisplayMode, handleMouseMove, handleMouseUp]) return ( <> @@ -272,8 +326,8 @@ export function GnomadCopilot({ children }: { children: React.ReactNode }) { {children} {isChatOpen && ( <> - - + {chatDisplayMode === 'side' && } + + + setChatDisplayMode(chatDisplayMode === 'fullscreen' ? 'side' : 'fullscreen') + } + title={chatDisplayMode === 'fullscreen' ? 'Exit fullscreen' : 'Enter fullscreen'} + > + {chatDisplayMode + )} - setIsChatOpen(!isChatOpen)}> - {isChatOpen ? 'Close Assistant' : 'Ask gnomAD Assistant'} - + {chatDisplayMode !== 'fullscreen' && ( + setChatDisplayMode(chatDisplayMode === 'closed' ? 'side' : 'closed')} + > + {isChatOpen ? 'Close Assistant' : 'Ask gnomAD Assistant'} + + )} ) } diff --git a/browser/src/index.html b/browser/src/index.html index 706c6b212..ce3e96747 100644 --- a/browser/src/index.html +++ b/browser/src/index.html @@ -22,7 +22,12 @@ />