From b4980135f8a7dce6f5d648c2308a85e9e650c71c Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sun, 31 Aug 2025 13:10:32 -0400 Subject: [PATCH 01/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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'